Skip to content

feat: agent details#297

Merged
pedronauck merged 15 commits into
mainfrom
agent-details
Jul 12, 2026
Merged

feat: agent details#297
pedronauck merged 15 commits into
mainfrom
agent-details

Conversation

@pedronauck

@pedronauck pedronauck commented Jul 12, 2026

Copy link
Copy Markdown
Member

Summary by CodeRabbit

  • New Features
    • Added an Agents fleet view with search, category/status filters, facets, pagination, live-session indicators, and diagnostics.
    • Added agent creation, update (digest-guarded), deletion, and duplication across the web interface, API, and CLI.
    • Added an agent settings experience (runtime, permissions, tools/skills, prompts, MCP servers) plus Soul/Heartbeat editing with validation, history, rollback, and wake controls.
  • Bug Fixes
    • Improved digest conflict handling, unsaved-change protection, read-only controls, and session availability messaging.

pedronauck and others added 14 commits July 11, 2026 22:33
Checkpoint via cy-loop-tasks (iteration 2, phase B mode=tasks).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Checkpoint via cy-loop-tasks (iteration 3, phase B mode=tasks).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Checkpoint via cy-loop-tasks (iteration 4, phase B mode=tasks).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Checkpoint via cy-loop-tasks (iteration 5, phase B mode=tasks).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Checkpoint via cy-loop-tasks (iteration 6, phase B mode=tasks).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Checkpoint via cy-loop-tasks (iteration 8, phase B mode=tasks).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Checkpoint via cy-loop-tasks (iteration 9, phase B mode=tasks).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Checkpoint via cy-loop-tasks (iteration 10, phase B mode=tasks).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Checkpoint via cy-loop-tasks (iteration 13, phase D review round 1).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agh-site Ready Ready Preview, Comment Jul 12, 2026 5:23am

Request Review

@coderabbitai

coderabbitai Bot commented Jul 12, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2db7f74d-46f0-4188-a105-48c22a46a66a

📥 Commits

Reviewing files that changed from the base of the PR and between 2fa99ac and c40bbb6.

⛔ Files ignored due to path filters (549)
  • .agents/skills/agh/agh-qa-bootstrap/SKILL.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/agh/real-scenario-qa/SKILL.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-final-verify/SKILL.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-loop-tasks/SKILL.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-loop-tasks/assets/iteration-summary.template.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-loop-tasks/references/checklist.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-loop-tasks/references/goal-header-template.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-loop-tasks/references/herdr-delegation.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-loop-tasks/references/phase-transitions.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-loop-tasks/references/state-schema.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-spec-preflight/references/tasks-checks.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-tasks-tail-qa-pair/SKILL.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-tasks-tail-qa-pair/references/qa-pair-checklist.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-tasks-tail-qa-pair/references/qa-tail-template.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/compozy/cy-web-docs-impact/SKILL.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-execution/SKILL.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-execution/assets/report-template.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-execution/references/fix-loop.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-execution/references/session-protocol.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-execution/references/status-and-reporting.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/SKILL.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/assets/bug-template.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/assets/charter-template.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/assets/scenario-template.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/assets/state.csv is excluded by !**/*.csv, !.agents/**
  • .agents/skills/qa-report/references/automation-backlog.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/references/bug-registry.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/references/journeys-and-flows.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/references/qa-docs-layout.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/references/session-charters.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/references/state-schema.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/qa-report/scripts/explode_state.py is excluded by !.agents/**
  • .agents/skills/qa-report/scripts/materialize_state.py is excluded by !.agents/**
  • .agents/skills/ship-pr/SKILL.md is excluded by !**/*.md, !.agents/**
  • .agents/skills/ship-pr/references/qa-artifacts.md is excluded by !**/*.md, !.agents/**
  • CLAUDE.md is excluded by !**/*.md
  • DESIGN.md is excluded by !**/*.md
  • docs/qa/README.md is excluded by !**/*.md
  • docs/qa/automation-backlog.md is excluded by !**/*.md
  • docs/qa/automation-backlog/agent-surface-parity.md is excluded by !**/*.md
  • docs/qa/automation-backlog/all-run-status-seeds.md is excluded by !**/*.md
  • docs/qa/automation-backlog/converse-decide-seed.md is excluded by !**/*.md
  • docs/qa/automation-backlog/goal-browser-journey.md is excluded by !**/*.md
  • docs/qa/automation-backlog/goal-parity-crash-replay.md is excluded by !**/*.md
  • docs/qa/automation-backlog/goal-stop-budget-matrix.md is excluded by !**/*.md
  • docs/qa/automation-backlog/live-follow-reduced-motion.md is excluded by !**/*.md
  • docs/qa/automation-backlog/loop-web-e2e-seed.md is excluded by !**/*.md
  • docs/qa/automation-backlog/return-reconnect.md is excluded by !**/*.md
  • docs/qa/automation-backlog/session-latency-keepalive.md is excluded by !**/*.md
  • docs/qa/automation-backlog/tool-call-a11y.md is excluded by !**/*.md
  • docs/qa/automation-backlog/watch-events-browser-seed.md is excluded by !**/*.md
  • docs/qa/bugs/BUG-0035.md is excluded by !**/*.md
  • docs/qa/bugs/BUG-0036.md is excluded by !**/*.md
  • docs/qa/bugs/BUG-0037.md is excluded by !**/*.md
  • docs/qa/bugs/BUG-0038.md is excluded by !**/*.md
  • docs/qa/charters/CH-028.md is excluded by !**/*.md
  • docs/qa/charters/CH-029.md is excluded by !**/*.md
  • docs/qa/charters/CH-030.md is excluded by !**/*.md
  • docs/qa/charters/CH-031.md is excluded by !**/*.md
  • docs/qa/charters/CH-032.md is excluded by !**/*.md
  • docs/qa/charters/CH-033.md is excluded by !**/*.md
  • docs/qa/charters/CH-034.md is excluded by !**/*.md
  • docs/qa/charters/CH-035.md is excluded by !**/*.md
  • docs/qa/charters/CH-036.md is excluded by !**/*.md
  • docs/qa/charters/CH-049.md is excluded by !**/*.md
  • docs/qa/charters/CH-050.md is excluded by !**/*.md
  • docs/qa/charters/CH-051.md is excluded by !**/*.md
  • docs/qa/charters/CH-052.md is excluded by !**/*.md
  • docs/qa/charters/_coverage-matrix.md is excluded by !**/*.md
  • docs/qa/journeys/J-30-scan-agent-fleet.md is excluded by !**/*.md
  • docs/qa/journeys/J-31-steward-agent-definition.md is excluded by !**/*.md
  • docs/qa/journeys/J-32-manage-agent-lifecycle.md is excluded by !**/*.md
  • docs/qa/personas.md is excluded by !**/*.md
  • docs/qa/reports/2026-07-10-model-selector-plan.md is excluded by !**/*.md
  • docs/qa/reports/2026-07-11-agent-details-plan.md is excluded by !**/*.md
  • docs/qa/reports/2026-07-11-agent-details.md is excluded by !**/*.md
  • docs/qa/reports/2026-07-12-living-docs-migration.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-001.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-002.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-003.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-004.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-005.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-006.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-007.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-008.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-009.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-010.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-011.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-012.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-013.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-014.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-015.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-016.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-017.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-018.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-019.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-020.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-021.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-022.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-023.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-024.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-025.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-026.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-027.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-028.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-029.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-030.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-031.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-032.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-033.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-034.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-035.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-036.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-037.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-038.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-039.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-040.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-041.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-042.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-043.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-044.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-045.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-046.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-047.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-048.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-049.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-050.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-051.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-052.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-053.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-001.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-002.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-003.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-004.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-005.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-006.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-007.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-008.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-009.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-010.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-011.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-012.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-013.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-014.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-015.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-016.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-017.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-018.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-019.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-020.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-021.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-022.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-023.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-024.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-025.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-026.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-027.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-028.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-029.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-030.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-031.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-032.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-033.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-034.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-035.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-036.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-037.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-038.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-039.md is excluded by !**/*.md
  • docs/qa/scenarios/GL-040.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-001.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-002.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-003.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-004.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-005.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-006.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-007.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-008.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-009.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-010.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-011.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-012.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-013.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-014.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-015.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-016.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-017.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-018.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-019.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-020.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-021.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-022.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-023.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-024.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-025.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-026.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-027.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-028.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-029.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-030.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-031.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-032.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-033.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-034.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-035.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-036.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-037.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-038.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-039.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-040.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-041.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-042.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-043.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-044.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-045.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-046.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-047.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-048.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-049.md is excluded by !**/*.md
  • docs/qa/scenarios/LP-050.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-001.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-002.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-003.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-004.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-005.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-006.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-007.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-008.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-009.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-010.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-011.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-012.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-013.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-014.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-015.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-016.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-017.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-018.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-019.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-020.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-021.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-022.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-023.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-024.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-025.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-026.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-027.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-028.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-029.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-030.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-031.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-032.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-033.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-034.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-035.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-036.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-037.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-038.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-039.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-040.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-041.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-042.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-043.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-044.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-045.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-046.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-047.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-048.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-049.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-050.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-051.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-052.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-053.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-054.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-055.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-056.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-057.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-058.md is excluded by !**/*.md
  • docs/qa/scenarios/MS-059.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-001.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-002.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-003.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-004.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-005.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-006.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-007.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-008.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-009.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-010.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-011.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-012.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-013.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-014.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-015.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-016.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-017.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-018.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-019.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-020.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-021.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-022.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-023.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-024.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-025.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-026.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-027.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-028.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-029.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-030.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-031.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-032.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-033.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-034.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-035.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-036.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-037.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-038.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-039.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-040.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-041.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-042.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-043.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-044.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-045.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-046.md is excluded by !**/*.md
  • docs/qa/scenarios/NB-047.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-001.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-002.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-003.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-004.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-005.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-006.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-007.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-008.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-009.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-010.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-011.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-012.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-013.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-014.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-015.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-016.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-017.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-018.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-019.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-020.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-021.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-022.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-023.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-024.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-025.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-026.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-027.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-028.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-029.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-030.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-031.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-032.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-033.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-034.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-035.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-036.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-037.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-038.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-039.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-040.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-041.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-042.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-043.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-044.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-045.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-046.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-047.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-048.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-049.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-050.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-051.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-052.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-053.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-054.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-055.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-056.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-057.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-058.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-059.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-060.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-061.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-062.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-063.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-064.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-065.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-066.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-067.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-068.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-069.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-070.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-071.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-072.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-073.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-074.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-075.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-076.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-077.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-078.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-079.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-080.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-081.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-082.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-083.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-001.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-002.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-003.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-004.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-005.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-006.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-007.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-008.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-009.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-010.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-011.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-012.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-013.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-014.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-015.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-016.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-017.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-018.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-019.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-020.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-021.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-022.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-023.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-024.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-025.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-026.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-027.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-028.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-029.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-030.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-031.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-032.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-033.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-034.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-035.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-036.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-037.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-038.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-039.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-040.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-041.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-042.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-043.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-044.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-045.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-046.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-047.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-048.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-049.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-050.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-051.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-052.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-053.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-054.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-055.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-056.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-057.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-058.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-059.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-060.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-061.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-062.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-063.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-064.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-065.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-066.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-067.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-068.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-069.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-070.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-071.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-072.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-073.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-074.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-075.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-076.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-077.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-078.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-079.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-080.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-081.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-082.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-083.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-084.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-085.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-086.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-087.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-088.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-089.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-090.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-091.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-092.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-093.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-094.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-095.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-096.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-097.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-098.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-099.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-100.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-101.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-102.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-103.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-104.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-105.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-106.md is excluded by !**/*.md
  • docs/qa/scenarios/TA-107.md is excluded by !**/*.md
  • docs/qa/state.csv is excluded by !**/*.csv
  • docs/qa/templates/bug.md is excluded by !**/*.md
  • docs/qa/templates/charter.md is excluded by !**/*.md
  • docs/qa/templates/report.md is excluded by !**/*.md
  • docs/qa/templates/scenario.md is excluded by !**/*.md
  • openapi/agh.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/agent/create.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/agent/delete.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/agent/duplicate.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/agent/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/agent/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/agent/update.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/agents/definitions.mdx is excluded by !**/*.mdx
  • packages/ui/src/components/custom/stories/page-actions-topbar-slot.stories.tsx is excluded by !**/*.stories.tsx
  • skills-lock.json is excluded by !**/*.json
  • skills/agh/references/agent-definitions.md is excluded by !**/*.md
  • web/e2e/__tests__/agent-categories.spec.ts is excluded by !web/e2e/**
  • web/e2e/__tests__/agents.spec.ts is excluded by !web/e2e/**
  • web/e2e/__tests__/dashboard.spec.ts is excluded by !web/e2e/**
  • web/e2e/__tests__/session-onboarding.spec.ts is excluded by !web/e2e/**
  • web/e2e/__tests__/session-provider-override.spec.ts is excluded by !web/e2e/**
  • web/e2e/__tests__/tasks-coordinator-handoff.spec.ts is excluded by !web/e2e/**
  • web/e2e/fixtures/__tests__/selectors.test.ts is excluded by !**/fixtures/**, !web/e2e/**
  • web/e2e/fixtures/selectors.ts is excluded by !**/fixtures/**, !web/e2e/**
  • web/src/generated/agh-openapi.d.ts is excluded by !**/generated/**, !**/generated/**, !**/*.d.ts
  • web/src/systems/agent/components/stories/agent-category-tree.stories.tsx is excluded by !**/*.stories.tsx
  • web/src/systems/agent/components/stories/agent-info-inspector.stories.tsx is excluded by !**/*.stories.tsx
  • web/src/systems/agent/components/stories/agent-mcp-servers-panel.stories.tsx is excluded by !**/*.stories.tsx
  • web/src/systems/agent/components/stories/agent-page-header.stories.tsx is excluded by !**/*.stories.tsx
  • web/src/systems/agent/routes/agent-detail.stories.tsx is excluded by !**/*.stories.tsx
  • web/src/systems/agent/routes/agent-settings.stories.tsx is excluded by !**/*.stories.tsx
  • web/src/systems/agent/routes/agents-fleet.stories.tsx is excluded by !**/*.stories.tsx
  • web/src/systems/runtime/components/stories/app-sidebar.stories.tsx is excluded by !**/*.stories.tsx
📒 Files selected for processing (260)
  • .gitignore
  • internal/api/contract/agent_catalog.go
  • internal/api/contract/agent_definitions.go
  • internal/api/contract/contract.go
  • internal/api/core/agent_conversions.go
  • internal/api/core/agent_create.go
  • internal/api/core/agent_definition_resolution.go
  • internal/api/core/agent_definitions.go
  • internal/api/core/agent_fleet_catalog.go
  • internal/api/core/agent_handlers.go
  • internal/api/core/authored_context.go
  • internal/api/core/authored_context_test.go
  • internal/api/core/automation.go
  • internal/api/core/base_handlers.go
  • internal/api/core/conversions.go
  • internal/api/core/handler_edge_cases_test.go
  • internal/api/core/handlers.go
  • internal/api/core/handlers_test.go
  • internal/api/core/interfaces.go
  • internal/api/core/memory.go
  • internal/api/core/session_heartbeat_status.go
  • internal/api/core/test_helpers_test.go
  • internal/api/core/workspaces.go
  • internal/api/httpapi/agent_options.go
  • internal/api/httpapi/agent_routes.go
  • internal/api/httpapi/handler_defaults.go
  • internal/api/httpapi/handlers.go
  • internal/api/httpapi/handlers_test.go
  • internal/api/httpapi/routes.go
  • internal/api/httpapi/server.go
  • internal/api/spec/agent_catalog.go
  • internal/api/spec/agent_definitions.go
  • internal/api/spec/authored_context.go
  • internal/api/spec/authored_context_test.go
  • internal/api/spec/operations.go
  • internal/api/spec/schema_enum_registry.go
  • internal/api/spec/spec.go
  • internal/api/spec/spec_test.go
  • internal/api/testutil/session_stub.go
  • internal/api/udsapi/agent_options.go
  • internal/api/udsapi/agent_routes.go
  • internal/api/udsapi/handler_config.go
  • internal/api/udsapi/handlers_test.go
  • internal/api/udsapi/routes.go
  • internal/api/udsapi/server.go
  • internal/cli/agent.go
  • internal/cli/agent_commands_test.go
  • internal/cli/agent_identity.go
  • internal/cli/agent_kernel.go
  • internal/cli/agent_mutate.go
  • internal/cli/agent_mutate_requests.go
  • internal/cli/agent_mutate_values.go
  • internal/cli/bridge.go
  • internal/cli/client.go
  • internal/cli/client_agent.go
  • internal/cli/client_api_errors.go
  • internal/cli/client_test.go
  • internal/cli/command_paths_test.go
  • internal/cli/config.go
  • internal/cli/format_test.go
  • internal/cli/helpers_test.go
  • internal/cli/root.go
  • internal/cli/support.go
  • internal/config/agent_create.go
  • internal/config/agent_delete.go
  • internal/config/agent_duplicate.go
  • internal/config/agent_origin.go
  • internal/config/agent_test.go
  • internal/config/bootstrap_test.go
  • internal/config/file_io.go
  • internal/daemon/agent_probes.go
  • internal/daemon/agent_resource_catalog.go
  • internal/daemon/agent_skill_resources.go
  • internal/daemon/agent_skill_resources_integration_test.go
  • internal/daemon/agent_skill_resources_test.go
  • internal/daemon/agent_skill_runtime_wiring.go
  • internal/daemon/authored_context_runtime.go
  • internal/daemon/authoring_service_dependencies.go
  • internal/daemon/boot.go
  • internal/daemon/daemon.go
  • internal/daemon/daemon_agent_definition_e2e_integration_test.go
  • internal/daemon/native_agent_catalog.go
  • internal/daemon/native_create_tools.go
  • internal/daemon/native_create_tools_test.go
  • internal/daemon/native_tools.go
  • internal/daemon/perf_bench_test.go
  • internal/daemon/runtime_dependencies.go
  • internal/daemon/runtime_deps.go
  • internal/daemon/server_options.go
  • internal/heartbeat/authoring.go
  • internal/heartbeat/authoring_status_test.go
  • internal/heartbeat/authoring_store.go
  • internal/heartbeat/history_purge.go
  • internal/session/agent_counts.go
  • internal/session/query_test.go
  • internal/soul/authoring.go
  • internal/soul/authoring_store.go
  • internal/soul/authoring_test.go
  • internal/soul/history_purge.go
  • internal/store/globaldb/global_db_agent_history.go
  • internal/store/globaldb/global_db_session_agent_counts.go
  • internal/store/globaldb/global_db_session_index_test.go
  • internal/store/session_catalog_agent_counts.go
  • magefiles/e2e.go
  • packages/ui/src/components/custom/__tests__/page-actions-topbar-slot.test.tsx
  • packages/ui/src/components/custom/__tests__/topbar.test.tsx
  • packages/ui/src/components/custom/hooks/use-topbar-slot.ts
  • packages/ui/src/components/custom/lane-tabs.tsx
  • packages/ui/src/components/custom/page-actions-topbar-slot.tsx
  • packages/ui/src/components/custom/pill-variants.ts
  • packages/ui/src/components/custom/topbar.tsx
  • packages/ui/src/components/reui/__tests__/filters.test.tsx
  • packages/ui/src/index.ts
  • packages/ui/src/tokens.css
  • web/.storybook/preview.ts
  • web/src/components/__tests__/topbar-shell.test.tsx
  • web/src/components/topbar-shell.tsx
  • web/src/hooks/routes/__tests__/use-agent-detail-page.test.tsx
  • web/src/hooks/routes/__tests__/use-app-layout.test.tsx
  • web/src/hooks/routes/__tests__/use-home-page.test.tsx
  • web/src/hooks/routes/use-agent-detail-page.ts
  • web/src/hooks/routes/use-agents-fleet-page.ts
  • web/src/hooks/routes/use-app-layout.ts
  • web/src/lib/__tests__/agent-authored-context-no-ui.test.ts
  • web/src/routeTree.gen.ts
  • web/src/routes/__tests__/-_app.test.tsx
  • web/src/routes/_app.tsx
  • web/src/routes/_app/-agents-preload.ts
  • web/src/routes/_app/-app-preload.ts
  • web/src/routes/_app/__tests__/-agents.$name.settings.test.tsx
  • web/src/routes/_app/__tests__/-agents.$name.test.tsx
  • web/src/routes/_app/__tests__/-agents.test.tsx
  • web/src/routes/_app/__tests__/-route-preloading.integration.test.tsx
  • web/src/routes/_app/agents.$name.settings.tsx
  • web/src/routes/_app/agents.$name.tsx
  • web/src/routes/_app/agents.tsx
  • web/src/routes/_app/settings/__tests__/-skills.test.tsx
  • web/src/storybook/route-story-registry.ts
  • web/src/systems/agent/adapters/__tests__/agent-api.test.ts
  • web/src/systems/agent/adapters/__tests__/agent-heartbeat-api.test.ts
  • web/src/systems/agent/adapters/__tests__/agent-soul-api.test.ts
  • web/src/systems/agent/adapters/agent-api.ts
  • web/src/systems/agent/adapters/agent-heartbeat-api.ts
  • web/src/systems/agent/adapters/agent-soul-api.ts
  • web/src/systems/agent/components/__tests__/agent-authored-file-editor.test.tsx
  • web/src/systems/agent/components/__tests__/agent-category-tree.test.tsx
  • web/src/systems/agent/components/__tests__/agent-create-host.test.tsx
  • web/src/systems/agent/components/__tests__/agent-detail-panels.test.tsx
  • web/src/systems/agent/components/__tests__/agent-fleet-toolbar.test.tsx
  • web/src/systems/agent/components/__tests__/agent-heartbeat-ops.test.tsx
  • web/src/systems/agent/components/__tests__/agent-info-inspector.test.tsx
  • web/src/systems/agent/components/__tests__/agent-mcp-servers-panel.test.tsx
  • web/src/systems/agent/components/__tests__/agent-page-header.test.tsx
  • web/src/systems/agent/components/__tests__/agent-settings-panels.test.tsx
  • web/src/systems/agent/components/__tests__/token-list-field.test.tsx
  • web/src/systems/agent/components/agent-authored-file-editor.tsx
  • web/src/systems/agent/components/agent-category-tree.tsx
  • web/src/systems/agent/components/agent-configuration-tab.tsx
  • web/src/systems/agent/components/agent-create-access-step.tsx
  • web/src/systems/agent/components/agent-create-host.tsx
  • web/src/systems/agent/components/agent-diagnostics-banner.tsx
  • web/src/systems/agent/components/agent-fleet-card.tsx
  • web/src/systems/agent/components/agent-fleet-list.tsx
  • web/src/systems/agent/components/agent-fleet-new-session-button.tsx
  • web/src/systems/agent/components/agent-fleet-row.tsx
  • web/src/systems/agent/components/agent-fleet-toolbar.tsx
  • web/src/systems/agent/components/agent-heartbeat-ops.tsx
  • web/src/systems/agent/components/agent-info-inspector.tsx
  • web/src/systems/agent/components/agent-instructions-tab.tsx
  • web/src/systems/agent/components/agent-mcp-servers-panel.tsx
  • web/src/systems/agent/components/agent-overview-tab.tsx
  • web/src/systems/agent/components/agent-page-header.tsx
  • web/src/systems/agent/components/agent-sessions-tab.tsx
  • web/src/systems/agent/components/agent-settings-access-section.tsx
  • web/src/systems/agent/components/agent-settings-basics-section.tsx
  • web/src/systems/agent/components/agent-settings-danger-section.tsx
  • web/src/systems/agent/components/agent-settings-instructions-section.tsx
  • web/src/systems/agent/components/agent-settings-mcp-section.tsx
  • web/src/systems/agent/components/agent-settings-panels.tsx
  • web/src/systems/agent/components/agent-settings-runtime-section.tsx
  • web/src/systems/agent/components/agent-stats-grid.tsx
  • web/src/systems/agent/components/token-list-field.tsx
  • web/src/systems/agent/hooks/__tests__/use-agent-create-dialog.test.tsx
  • web/src/systems/agent/hooks/__tests__/use-agent-delete-flow.test.tsx
  • web/src/systems/agent/hooks/__tests__/use-agent-heartbeat.test.tsx
  • web/src/systems/agent/hooks/__tests__/use-agent-instructions-tab.test.tsx
  • web/src/systems/agent/hooks/__tests__/use-agent-mutations.test.tsx
  • web/src/systems/agent/hooks/__tests__/use-agent-settings-page.test.tsx
  • web/src/systems/agent/hooks/__tests__/use-agent-soul.test.tsx
  • web/src/systems/agent/hooks/__tests__/use-unsaved-guard.test.tsx
  • web/src/systems/agent/hooks/use-agent-authored-file-editor.ts
  • web/src/systems/agent/hooks/use-agent-category-tree-model.ts
  • web/src/systems/agent/hooks/use-agent-create-dialog.ts
  • web/src/systems/agent/hooks/use-agent-create-host.ts
  • web/src/systems/agent/hooks/use-agent-delete-flow.tsx
  • web/src/systems/agent/hooks/use-agent-heartbeat.ts
  • web/src/systems/agent/hooks/use-agent-instructions-tab.ts
  • web/src/systems/agent/hooks/use-agent-settings-page.ts
  • web/src/systems/agent/hooks/use-agent-soul.ts
  • web/src/systems/agent/hooks/use-agents.ts
  • web/src/systems/agent/hooks/use-latest-agent-settings-actions.ts
  • web/src/systems/agent/hooks/use-unsaved-guard.tsx
  • web/src/systems/agent/index.ts
  • web/src/systems/agent/lib/__tests__/agent-authored-file-source.test.ts
  • web/src/systems/agent/lib/__tests__/agent-create-draft.test.ts
  • web/src/systems/agent/lib/__tests__/agent-detail-settings-search.test.ts
  • web/src/systems/agent/lib/__tests__/agent-fleet-projection.test.ts
  • web/src/systems/agent/lib/__tests__/fleet-signals.test.ts
  • web/src/systems/agent/lib/__tests__/query-keys-options.test.ts
  • web/src/systems/agent/lib/agent-absent-value.ts
  • web/src/systems/agent/lib/agent-authored-file-source.ts
  • web/src/systems/agent/lib/agent-catalog-query.ts
  • web/src/systems/agent/lib/agent-create-draft.ts
  • web/src/systems/agent/lib/agent-create-host-context.ts
  • web/src/systems/agent/lib/agent-detail-search.ts
  • web/src/systems/agent/lib/agent-fleet-filters.ts
  • web/src/systems/agent/lib/agent-fleet-projection.ts
  • web/src/systems/agent/lib/agent-fleet-search.ts
  • web/src/systems/agent/lib/agent-settings-draft.ts
  • web/src/systems/agent/lib/agent-settings-search.ts
  • web/src/systems/agent/lib/fleet-signals.ts
  • web/src/systems/agent/lib/query-keys.ts
  • web/src/systems/agent/lib/query-options.ts
  • web/src/systems/agent/mocks/__tests__/handlers.test.ts
  • web/src/systems/agent/mocks/fixtures.ts
  • web/src/systems/agent/mocks/handlers.ts
  • web/src/systems/agent/mocks/index.ts
  • web/src/systems/agent/storybook.ts
  • web/src/systems/agent/types.ts
  • web/src/systems/bridges/components/bridge-list-filters.tsx
  • web/src/systems/bridges/lib/bridge-list-filters.ts
  • web/src/systems/loops/components/catalog/loop-catalog-filters.tsx
  • web/src/systems/loops/lib/__tests__/loop-list-filters.test.ts
  • web/src/systems/loops/lib/loop-list-filters.ts
  • web/src/systems/network/components/shell/channel-toolbar.tsx
  • web/src/systems/network/hooks/use-network-list-filters.ts
  • web/src/systems/runtime/components/__tests__/app-sidebar.test.tsx
  • web/src/systems/runtime/components/app-sidebar-counts.ts
  • web/src/systems/runtime/components/app-sidebar.tsx
  • web/src/systems/runtime/components/runtime-selector/__tests__/runtime-selector.test.tsx
  • web/src/systems/runtime/components/runtime-selector/runtime-selector.tsx
  • web/src/systems/runtime/components/runtime-selector/trigger.tsx
  • web/src/systems/runtime/index.ts
  • web/src/systems/session/components/__tests__/session-create-dialog.test.tsx
  • web/src/systems/session/hooks/__tests__/use-session-create-dialog.test.tsx
  • web/src/systems/session/mocks/__tests__/handlers.test.ts
  • web/src/systems/settings/components/providers-list-filters.tsx
  • web/src/systems/settings/lib/providers-list-filters.ts
  • web/src/systems/skill/components/skill-list-filters.tsx
  • web/src/systems/skill/lib/__tests__/skill-list-filters.test.ts
  • web/src/systems/skill/lib/skill-list-filters.ts
  • web/src/systems/tasks/components/tasks-inbox-view.tsx
  • web/src/systems/tasks/components/tasks-list-filters.tsx
  • web/src/systems/tasks/lib/inbox-filters.ts
  • web/src/systems/tasks/lib/tasks-list-filters.ts
  • web/src/systems/vault/components/vault-list-filters.tsx
  • web/src/systems/vault/lib/__tests__/vault-list-filters.test.ts
  • web/src/systems/vault/lib/vault-list-filters.ts
  • web/src/systems/workspace/hooks/__tests__/use-workspaces.test.tsx
  • web/src/systems/workspace/mocks/fixtures.ts

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.


Walkthrough

This PR adds workspace-aware agent contracts, catalog pagination and session facets, create/update/delete/duplicate APIs, CLI lifecycle commands, synchronization and history purging, and web fleet, detail, settings, authored-file, and runtime UI.

Changes

Agent platform and user interfaces

Layer / File(s) Summary
Contracts and definition lifecycle
internal/api/contract/*, internal/api/core/*, internal/config/*
Adds origin-aware payloads, catalog responses, digest-based updates, secure definition creation/deletion/duplication, workspace resolution, and authored-history purging.
Catalog, synchronization, and transport wiring
internal/daemon/*, internal/session/*, internal/store/*, internal/api/httpapi/*, internal/api/udsapi/*
Adds catalog projections, grouped session counts, serialized synchronization, runtime dependency wiring, API routes, and lifecycle integration tests.
CLI lifecycle operations
internal/cli/*
Adds agent update, delete, and duplicate commands, typed daemon errors, digest/conflict handling, confirmation gating, enriched list/info output, and request builders.
Web fleet and agent surfaces
web/src/routes/_app/agents*, web/src/hooks/routes/*, web/src/systems/agent/*
Adds fleet search/filtering, cursor loading, catalog-backed counts, tabbed agent details, settings editing, authored SOUL/HEARTBEAT editors, duplicate/delete flows, and runtime read-only behavior.
Shared UI and validation support
packages/ui/*, web/src/systems/runtime/*, web/src/systems/agent/mocks/*, tests and fixtures
Adds ownership-aware topbar slots, save-blocked controls, public filter exports, stateful agent mocks, route preloading, and broad API/UI/integration coverage.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related issues

  • compozy/agh#2 — The PR implements scoped agent definitions, catalogs, skills, and lifecycle APIs described by the issue.

Possibly related PRs

  • compozy/agh#7 — Directly overlaps the AgentPayload contract relocation.
  • compozy/agh#82 — Shares workspace-aware agent listing and lookup handler logic.
  • compozy/agh#282 — Provides listing primitives used by the agent fleet UI.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.37% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is broad but still accurately points to the agent-details-focused changeset.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch agent-details

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

React Doctor found no issues. 🎉

⚠️ Warning: .github/workflows/react-doctor.yml is configured incorrectly. See below to fix.

React Doctor compares against main to report only the issues this pull request introduces. This run couldn't complete that comparison (usually a shallow CI checkout with no merge base), so it listed every issue in the changed files, including ones that already existed on main.

Add fetch-depth: 0 to the actions/checkout step in .github/workflows/react-doctor.yml so the checkout includes the history React Doctor needs:

 jobs:
   react-doctor:
     steps:
       - uses: actions/checkout@v5
+        with:
+          fetch-depth: 0

       - uses: millionco/react-doctor@v2

To silence this warning, set silence-missing-baseline-warning: true on the React Doctor action.

Reviewed by React Doctor for commit c40bbb6.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 17

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
internal/cli/bridge.go (1)

677-747: 📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift

Split this production file below the 500-line limit.

internal/cli/bridge.go reaches Line 747. Extract cohesive output/rendering helpers before extending it further. As per coding guidelines, “Production source files must have one responsibility and stay at or below 500 lines; split contracts, registries, implementations, and helpers into separate files.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/cli/bridge.go` around lines 677 - 747, Split the output/rendering
responsibility from bridge.go into a separate production file, moving
bridgeBundle and its human/toon rendering helpers together while preserving
their existing behavior and symbols. Keep bridge.go at or below 500 lines and
update any references or package-level organization needed for the extracted
helpers to compile.

Source: Coding guidelines

🟡 Minor comments (29)
web/src/systems/agent/components/__tests__/token-list-field.test.tsx-26-28 (1)

26-28: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Rerender the controlled value before testing deduplication.

After the first add, the parent should provide ["agh__skill_view", "mcp__github__*"]. Keeping the initial props makes this assertion incorrectly expect the existing GitHub token to disappear. Rerender with the first callback value, then expect both tokens after the duplicate add.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/components/__tests__/token-list-field.test.tsx` around
lines 26 - 28, Update the test around the token-list field’s first onChange
assertion to rerender the controlled component value with the callback result,
including both "agh__skill_view" and "mcp__github__*". Then clear the mock,
submit the duplicate token, and assert the controlled value retains both tokens
rather than replacing the existing GitHub token.
web/src/systems/agent/adapters/agent-api.ts-68-79 (1)

68-79: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Align the type guards with their actual runtime check. isAgentDigestConflict and isAgentTargetExists accept any AgentApiError with matching kind/status, but their predicates claim the concrete subclasses. Narrow only with instanceof, or change the return type to the broader AgentApiError shape.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/adapters/agent-api.ts` around lines 68 - 79, Update the
return type predicates of isAgentDigestConflict and isAgentTargetExists to match
their runtime checks: either restrict matching to the corresponding concrete
error subclasses using instanceof, or broaden each predicate to AgentApiError.
Keep the existing kind/status checks only when the declared predicate type
accurately represents every accepted error.
internal/heartbeat/authoring_status_test.go-41-48 (1)

41-48: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Assert the expected validation error.

These checks accept any failure, including unrelated storage or I/O errors, so target-validation regressions can still pass. Assert the expected typed/code-specific error for each invalid case. As per path instructions, Go tests “MUST have specific error assertions (ErrorContains, ErrorAs).”

Also applies to: 128-136

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/heartbeat/authoring_status_test.go` around lines 41 - 48, Strengthen
the invalid-input assertions in the DeleteHeartbeatAgentHistory tests, including
the additional case around lines 128-136, by verifying the returned error is the
expected validation error using a specific ErrorContains or ErrorAs assertion.
Keep the existing t.Fatal behavior for nil errors, but reject unrelated storage
or I/O failures.

Source: Path instructions

internal/config/agent_test.go-167-168 (1)

167-168: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make invalid-input assertions specific.

These cases pass for any operational error, not only the intended validation rejection. Assert the expected error type or message for each scenario. As per path instructions, Go tests “MUST have specific error assertions (ErrorContains, ErrorAs).”

Also applies to: 194-195, 213-214, 225-295

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/config/agent_test.go` around lines 167 - 168, Update the
invalid-input tests around DeleteAgentDefinition and the additional cases to
assert the intended validation error specifically, using errors.As or
errors.ErrorContains rather than only checking err == nil. Preserve each test’s
existing scenario and failure message while verifying the expected error type or
identifying message.

Source: Path instructions

web/src/systems/agent/components/agent-overview-tab.tsx-204-212 (1)

204-212: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Avoid rounding into the next duration unit.

Math.round(59.5) produces 60, so a session under one minute displays as 1m; positive sub-second values can display as 0s. Floor the value before unit selection (with a deliberate sub-second fallback).

Proposed fix
-  const total = Math.round(totalSeconds);
+  const total = Math.max(1, Math.floor(totalSeconds));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/components/agent-overview-tab.tsx` around lines 204 -
212, Update formatElapsed to floor totalSeconds before selecting duration units,
preventing values below a unit boundary from rolling into the next unit.
Preserve empty output for non-finite or non-positive values, and add a
deliberate fallback so positive sub-second durations display appropriately
instead of “0s”.
packages/ui/src/index.ts-637-638 (1)

637-638: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add the required colocated story for the new public exports.

The stack includes the Filters test change, but no corresponding story change for these newly public exports. As per coding guidelines, “Every new export must have a colocated story and a test in the same change.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/ui/src/index.ts` around lines 637 - 638, Add a colocated story for
the newly exported Filters and createFilter symbols, following the existing
story conventions for the filters component. Ensure the story demonstrates the
public API and is located alongside the corresponding filters implementation,
while leaving the existing exports unchanged.

Source: Coding guidelines

internal/store/globaldb/global_db_session_agent_counts.go-24-25 (1)

24-25: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Wrap the expired-lock sweep error.

Returning this error directly loses the failing operation in higher-level logs.

Proposed fix
 if _, err := g.SweepExpiredSessionAttachLocks(ctx, g.now()); err != nil {
-	return nil, err
+	return nil, fmt.Errorf("store: sweep expired session attach locks: %w", err)
 }

As per coding guidelines, production Go code must “wrap errors with %w”.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/store/globaldb/global_db_session_agent_counts.go` around lines 24 -
25, Update the error return in the SweepExpiredSessionAttachLocks call to wrap
the original error with %w and add context identifying the expired-lock sweep
operation, while preserving the existing early-return behavior.

Source: Coding guidelines

packages/ui/src/components/custom/__tests__/topbar.test.tsx-303-330 (1)

303-330: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Assert the active owner, not just slot presence.

SlotInspector renders only title:yes, so this test also passes if the older slot remains active after unmount. Expose or assert the actual title (Active) before and after rerender.

As per coding guidelines, web tests must verify meaningful behavior outcomes.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/ui/src/components/custom/__tests__/topbar.test.tsx` around lines 303
- 330, The test around Harness and SlotInspector only verifies that a title
exists, not which slot owns it. Expose the rendered slot title through
SlotInspector or use an existing title assertion, then assert “Active” before
and after rerendering with showOlder={false} so the test verifies the active
owner remains unchanged.

Source: Coding guidelines

packages/ui/src/components/custom/hooks/use-topbar-slot.ts-42-55 (1)

42-55: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Include the back callback in the slot signature.
slotKey ignores function-valued fields, so a changed back handler can stay published until some other slot field changes. That leaves the topbar wired to a stale callback.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/ui/src/components/custom/hooks/use-topbar-slot.ts` around lines 42 -
55, Update slotKey to preserve the back callback when generating the slot
signature, while continuing to omit other function-valued fields. Ensure changes
to back produce a different key so the topbar republishes the current callback.

Source: Coding guidelines

web/src/systems/agent/hooks/__tests__/use-agent-delete-flow.test.tsx-77-80 (1)

77-80: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Use a contract-valid delete response in the mock.

DeleteAgentResponse requires name and origin and does not define deleted. Because mockMutate is untyped, this bypasses compile-time contract checks. As per coding guidelines, TypeScript should provide type safety instead of relying on runtime checks.

Proposed fix
-      opts.onSuccess({ deleted: true, unshadowed_origin: "global" });
+      opts.onSuccess({
+        name: primaryAgentFixture.name,
+        origin: "workspace",
+        unshadowed_origin: "global",
+      });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/hooks/__tests__/use-agent-delete-flow.test.tsx` around
lines 77 - 80, Update the success payload in the delete-flow test’s mockMutate
implementation to match DeleteAgentResponse: provide the required name and
origin fields and remove the unsupported deleted field. Type mockMutate or its
onSuccess callback so future invalid response shapes are caught by TypeScript.

Source: Coding guidelines

web/src/systems/agent/hooks/use-agent-instructions-tab.ts-60-70 (1)

60-70: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Clear wake selections when their session leaves the active set.

The derived wakeSessionId becomes null, but requestedWakeSessionId is retained. If that session later becomes active again, it is silently reselected without user input. Reset or version the selection when the active-session set changes so the UI does not revive stale state.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/hooks/use-agent-instructions-tab.ts` around lines 60 -
70, Update the wake-session selection state around requestedWakeSessionId and
wakeSessionId so requestedWakeSessionId is cleared when its selected session
leaves activeSessions. Ensure a session that later becomes active again is not
silently reselected, while preserving the existing single-active-session
behavior.
web/src/systems/agent/components/agent-configuration-tab.tsx-28-37 (1)

28-37: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use the same trimmed predicate for absent-value styling.

formatAbsentOverride treats whitespace-only values as absent, but muted and mono check raw truthiness. A value such as " " therefore renders as Default with foreground/monospace styling instead of the absent-value styling.

Suggested fix
           <ConfigField
             label="Model"
             value={formatAbsentOverride(agent.model)}
-            muted={!agent.model}
+            muted={!agent.model?.trim()}
           />
           <ConfigField
             label="Command"
             value={formatAbsentOverride(agent.command)}
-            muted={!agent.command}
-            mono={Boolean(agent.command)}
+            muted={!agent.command?.trim()}
+            mono={Boolean(agent.command?.trim())}
           />
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/components/agent-configuration-tab.tsx` around lines 28
- 37, Update the Model and Command ConfigField styling predicates to use the
same trimmed-value presence check as formatAbsentOverride. Ensure
whitespace-only agent.model and agent.command values are treated as absent for
muted and mono styling, while non-whitespace values retain the existing styling.
web/src/systems/agent/hooks/use-agent-heartbeat.ts-112-123 (1)

112-123: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Forward workspace_id on heartbeat wake. wakeAgentHeartbeat already supports workspace_id, but useWakeAgentHeartbeat drops the hook’s workspace argument and sends only session_id/source. That can mis-scope a workspace wake or trip a 403 while the cache key remains workspace-aware. Pass workspace_id through the mutation payload.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/hooks/use-agent-heartbeat.ts` around lines 112 - 123,
The useWakeAgentHeartbeat mutation currently ignores its workspace argument when
calling wakeAgentHeartbeat. Update the mutationFn to include workspace_id
derived from the hook’s workspace parameter in the payload, while preserving the
existing params and workspace-aware invalidation behavior.
web/src/systems/agent/hooks/use-agent-authored-file-editor.ts-172-184 (1)

172-184: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Persist the validation status returned by validation.

result.validation_status is ignored, so an invalid response updates diagnostics but leaves editor.status derived from the previous payload status. Update the local effective payload/status without changing the CAS baseline.

       const result = await onValidate(draft);
       setDiagnostics(result.diagnostics ?? []);
+      if (result.validation_status !== undefined) {
+        setEffectivePayload(current =>
+          current ? { ...current, validation_status: result.validation_status } : current
+        );
+      }

Also applies to: 255-257

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/hooks/use-agent-authored-file-editor.ts` around lines
172 - 184, Update handleValidate to persist result.validation_status in the
local effective payload/status alongside result.diagnostics, so the editor
reflects the latest validation outcome. Keep the existing CAS baseline unchanged
while applying this local status update, and preserve the current error and
validating-state handling.
web/src/systems/agent/components/agent-settings-panels.tsx-93-98 (1)

93-98: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Disable deletion in read-only and mutation-denied states.

fieldsReadOnly protects the editable sections, but the destructive action remains enabled when readOnly or mutationDenied is true. This is not a backend authorization bypass, but it still invokes an invalid destructive mutation from a UI that says editing is unavailable. Pass the effective disabled state to AgentSettingsDangerSection and cover it with a regression test.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/components/agent-settings-panels.tsx` around lines 93 -
98, Update the danger-section rendering in the agent settings component to pass
the effective disabled state, combining readOnly, mutationDenied, and any
existing deletion state, to AgentSettingsDangerSection. Ensure the delete action
is unavailable in both read-only and mutation-denied modes, and add a regression
test covering those states.
web/src/systems/agent/components/agent-fleet-list.tsx-31-31 (1)

31-31: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make the load-more handler required.

When hasMore is true and onLoadMore is omitted, this renders an enabled button whose click handler is undefined, so “Load more agents” silently does nothing. Make the handler required, or model the props so hasMore requires onLoadMore.

Proposed contract fix
-  onLoadMore?: () => void;
+  onLoadMore: () => void;

Also applies to: 192-200

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/components/agent-fleet-list.tsx` at line 31, Update the
agent fleet list props contract around onLoadMore so the load-more handler is
required whenever hasMore is true, preventing an enabled button from lacking a
click callback. Make onLoadMore non-optional or use a discriminated prop shape
tying hasMore=true to a required handler, and update affected call sites
accordingly.
web/src/routes/_app/__tests__/-agents.test.tsx-317-322 (1)

317-322: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Flush the mount before asserting that no request was made.

The request count is checked immediately after render, before effect/query scheduling has settled. A regression that starts the catalog request asynchronously could still pass while the count is temporarily zero. Await the no-workspace state and flush a tick before asserting the counter remains unchanged.

Proposed test adjustment
     mockActiveWorkspaceId = null;
     render(<AgentsPage />);
-    expect(screen.getByTestId("agents-no-workspace")).toHaveTextContent("No workspace selected");
+    expect(await screen.findByTestId("agents-no-workspace")).toHaveTextContent(
+      "No workspace selected"
+    );
+    await act(async () => {
+      await new Promise(resolve => setTimeout(resolve, 0));
+    });
     expect(agentsRequestCount).toBe(0);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/routes/_app/__tests__/-agents.test.tsx` around lines 317 - 322,
Update the “Should ask for a workspace before querying the fleet” test to await
the rendered no-workspace state and flush pending effect/query scheduling before
checking agentsRequestCount. Keep the expected “No workspace selected” content
and assert the request count remains zero after asynchronous work settles.
web/src/systems/agent/lib/agent-fleet-projection.ts-38-40 (1)

38-40: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep deep-category output within the ellipsis limit.

For paths with more than two segments, this returns the complete first and last segments. If either segment is long, the result can exceed CATEGORY_ELLIPSIS_LIMIT, causing metadata to overflow despite the helper’s truncation contract. Allocate the limit across truncated first and last segments.

Proposed bounded truncation
   const first = path[0] ?? "";
   const last = path[path.length - 1] ?? "";
-  return `${first}${AGENT_CATEGORY_LABEL_SEPARATOR}…${AGENT_CATEGORY_LABEL_SEPARATOR}${last}`;
+  const available =
+    CATEGORY_ELLIPSIS_LIMIT - AGENT_CATEGORY_LABEL_SEPARATOR.length * 2 - 1;
+  const headLength = Math.ceil(available / 2);
+  const tailLength = Math.floor(available / 2);
+  return `${first.slice(0, headLength)}${AGENT_CATEGORY_LABEL_SEPARATOR}…${AGENT_CATEGORY_LABEL_SEPARATOR}${last.slice(-tailLength)}`;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/lib/agent-fleet-projection.ts` around lines 38 - 40,
Update the deep-category formatting helper around the first/last path segment
handling to ensure its returned string never exceeds CATEGORY_ELLIPSIS_LIMIT.
For paths with more than two segments, truncate or allocate the available limit
across the first and last segments while preserving the separators and ellipsis;
keep existing behavior for shorter paths.
internal/api/testutil/session_stub.go-98-111 (1)

98-111: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Match production agent-name normalization.

This fallback counts blank names and treats " coder " separately from "coder", unlike session.Manager.CountSessionsByAgent. Normalize and skip empty names here so core/API tests do not validate behavior that production never returns.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/api/testutil/session_stub.go` around lines 98 - 111, Update the
counting logic in the fallback that builds counts from infos to normalize each
agent name using the same behavior as session.Manager.CountSessionsByAgent, trim
surrounding whitespace, and skip entries whose normalized name is empty. Use the
normalized name as the counts map key while preserving the existing workspace,
type, lineage, and state filters.
internal/daemon/daemon_agent_definition_e2e_integration_test.go-24-292 (1)

24-292: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Wrap the lifecycle scenario in a named subtest.

Create, update, duplicate, delete, and restart assertions execute directly in the top-level test. Put the ordered flow in a t.Run("Should …") block so every test case follows the required convention.

As per path instructions, all test cases must use the t.Run("Should...") pattern.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/daemon/daemon_agent_definition_e2e_integration_test.go` around lines
24 - 292, The ordered lifecycle flow in
TestDaemonE2EAgentDefinitionLifecycleParity currently runs at the top level
instead of under a named subtest. Wrap the create, update, duplicate, conflict,
delete, stop, restart, and not-found assertions in a single t.Run block whose
name starts exactly with "Should", while preserving their existing order and
shared test context.

Source: Path instructions

internal/store/globaldb/global_db_session_index_test.go-200-275 (1)

200-275: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Exercise the dream-session exclusion.

Add a persisted dream session to this fixture. The assertion currently verifies ID, workspace, and spawn-role filtering, but ExcludeSessionTypes: []string{"dream"} could regress without failing.

As per path instructions, tests must verify meaningful behavior and fail when the business logic changes.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/store/globaldb/global_db_session_index_test.go` around lines 200 -
275, Extend the “Should group exact visible counts while excluding the live
overlay” fixture with a persisted session whose SessionType is “dream” and whose
workspace and agent otherwise qualify for counting. Register it alongside the
existing sessions, then keep the expected coder total and active count unchanged
so CountSessionsByAgent verifies ExcludeSessionTypes removes that session.

Source: Path instructions

internal/daemon/native_agent_catalog.go-31-35 (1)

31-35: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Wrap the catalog error with operation context.

ListAgents failures are returned bare, losing the operation context required for daemon diagnostics. As per coding guidelines, production Go code must “wrap errors with %w”.

Proposed fix
+    "fmt"
+
     if n.deps.AgentCatalog != nil {
         catalogAgents, err := n.deps.AgentCatalog.ListAgents(ctx)
         if err != nil {
-            return nil, err
+            return nil, fmt.Errorf("list agent catalog: %w", err)
         }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/daemon/native_agent_catalog.go` around lines 31 - 35, Update the
ListAgents error handling in the native agent catalog flow to wrap the returned
error with descriptive operation context using Go’s %w semantics before
returning it. Preserve the existing nil result behavior and avoid changing
successful catalog processing.

Source: Coding guidelines

internal/soul/authoring_test.go-88-90 (1)

88-90: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Assert the expected validation errors.

These branches accept any failure, including an unrelated database or filesystem error. Assert the validation contract with ErrorContains or ErrorAs for each invalid target. As per path instructions, tests “MUST have specific error assertions (ErrorContains, ErrorAs).”

Also applies to: 174-176

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/soul/authoring_test.go` around lines 88 - 90, Strengthen the
invalid-target assertions in the DeleteSoulAgentHistory tests, including the
additional branch at lines 174-176, by checking the returned error with
ErrorContains or ErrorAs for the expected validation error. Keep the existing
nil-error failure check, but ensure unrelated database or filesystem failures
cannot satisfy these tests.

Source: Path instructions

internal/cli/agent_commands_test.go-291-292 (1)

291-292: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Connect the filesystem assertion to the command fixture.

workspaceRoot is never passed to deps and is unrelated to --workspace ws-alpha, so this always checks a fresh unrelated directory. Configure the fixture’s resolved workspace path, then assert the intended daemon-only authoring outcome there.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/cli/agent_commands_test.go` around lines 291 - 292, Update the
command fixture setup so the resolved workspace path for --workspace ws-alpha is
assigned to the dependency configuration used by the CLI, rather than relying on
the unrelated workspaceRoot variable. Then perform the filesystem assertion
against that configured workspace path, preserving the expectation that the
daemon-only command does not create the authoring directory.

Source: Path instructions

internal/cli/client_test.go-215-230 (1)

215-230: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Assert lifecycle request bodies.

The transport assertion only checks method, path, and query. Dropping or misserializing scope, workspace, expected_digest, or duplicate overrides would still pass. Decode req.Body per case and assert the relevant request payload.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/cli/client_test.go` around lines 215 - 230, Extend the
roundTripperFunc assertion in the unixSocketClient test to decode req.Body for
each test case and validate the expected payload fields, including scope,
workspace, expected_digest, and duplicate overrides. Keep the existing method,
path, and query assertions, and compare the decoded request body against each
case’s expected request data.

Source: Path instructions

internal/api/httpapi/handlers_test.go-250-250 (1)

250-250: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Wrap this route contract in a named subtest.

The expanded assertions remain in a top-level test body; use t.Run("Should …") for this route-contract case.

Proposed fix
 func TestRegisterRoutesCoversTechSpecEndpoints(t *testing.T) {
+	t.Run("Should register every expected HTTP API route", func(t *testing.T) {
 		// existing setup and assertions
+	})
 }

As per coding guidelines and path instructions, “Go tests must use t.Run("Should …")” for all test cases.

Also applies to: 369-369, 383-383

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/api/httpapi/handlers_test.go` at line 250, Wrap the “POST
/api/agents/:name/duplicate” route-contract assertions in a named subtest using
t.Run("Should …"), and apply the same structure to the related cases at the
other indicated locations. Keep each case’s existing assertions and behavior
unchanged.

Sources: Coding guidelines, Path instructions

internal/cli/client_agent.go-23-104 (1)

23-104: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Wrap client-operation errors with context.

Each new API method returns doJSON errors unchanged, so CLI failures lose the lifecycle operation that failed. Wrap them with %w while preserving errors.Is/As.

Proposed fix
 import (
 	"context"
+	"fmt"
 	"net/http"
 	"net/url"
 	"strings"
 )

-		return nil, err
+		return nil, fmt.Errorf("list agents: %w", err)

-		return AgentRecord{}, err
+		return AgentRecord{}, fmt.Errorf("get agent %q: %w", name, err)

-		return AgentRecord{}, err
+		return AgentRecord{}, fmt.Errorf("create agent: %w", err)

-		return AgentRecord{}, err
+		return AgentRecord{}, fmt.Errorf("update agent %q: %w", name, err)

-		return contract.DeleteAgentResponse{}, err
+		return contract.DeleteAgentResponse{}, fmt.Errorf("delete agent %q: %w", name, err)

-		return AgentRecord{}, err
+		return AgentRecord{}, fmt.Errorf("duplicate agent %q: %w", name, err)

As per coding guidelines, production Go code must “wrap errors with %w.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/cli/client_agent.go` around lines 23 - 104, Wrap each doJSON error
in ListAgents, GetAgent, CreateAgent, UpdateAgent, DeleteAgent, and
DuplicateAgent with an operation-specific context message using %w, while
preserving the existing zero-value return behavior and errors.Is/As
compatibility.

Source: Coding guidelines

web/src/systems/agent/hooks/use-agents.ts-62-64 (1)

62-64: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Do not discard settled errors with _error.

These callbacks intentionally invalidate caches on settlement, but the _error parameters still discard mutation failures. Handle or explicitly acknowledge the error while preserving invalidation; the repository guideline forbids silently discarding errors with _.

Also applies to: 86-89, 113-116, 139-142

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/hooks/use-agents.ts` around lines 62 - 64, Update the
onSettled callbacks in the agent mutation hooks to handle the settled error
parameter instead of naming it _error, while preserving both agentKeys.lists()
and agentKeys.catalogs() invalidations. Apply the same explicit error handling
or acknowledgment to all corresponding callbacks at the referenced mutation
locations.

Source: Coding guidelines

web/src/hooks/routes/use-agents-fleet-page.ts-67-77 (1)

67-77: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Do not capture / when the fleet search is not rendered.

Agent detail/settings routes render through this parent, so this handler prevents the browser default while searchInputRef has no input to focus. Re-register it when child-route state changes.

Proposed fix
   useEffect(() => {
+    if (hasChildMatch || workspaceId === "") return;
+
     const onKeyDown = (event: KeyboardEvent) => {
       if (event.key !== "/" || event.metaKey || event.ctrlKey || event.altKey) return;
       if (isEditableTarget(event.target)) return;
       if (event.target instanceof Element && event.target.closest('[role="dialog"]')) return;
       event.preventDefault();
       searchInputRef.current?.focus();
     };
     document.addEventListener("keydown", onKeyDown);
     return () => document.removeEventListener("keydown", onKeyDown);
-  }, []);
+  }, [hasChildMatch, workspaceId]);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/hooks/routes/use-agents-fleet-page.ts` around lines 67 - 77, Update
the useEffect keyboard handler to only intercept "/" while the fleet search
input is rendered, using the relevant child-route/search visibility state.
Include that state in the effect dependencies so the listener is removed or
re-registered when navigating between fleet list and detail/settings routes;
preserve the existing target and modifier checks.
🧹 Nitpick comments (11)
web/src/systems/agent/hooks/__tests__/use-unsaved-guard.test.tsx (1)

55-82: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Cover the returned confirmation dialog.

The test verifies proceed/reset directly but never renders result.current.confirmDialog, leaving the open, copy, confirm, and cancel behavior untested. Add a test that mounts the dialog and verifies confirm calls proceed while cancel/close calls reset.

As per coding guidelines, web tests should have high code coverage for critical paths.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/hooks/__tests__/use-unsaved-guard.test.tsx` around
lines 55 - 82, The useUnsavedGuard test should render
result.current.confirmDialog and verify the confirmation dialog’s open state and
copy, then trigger its confirm action to call mockProceed and its cancel/close
action to call mockReset. Extend the existing blocked-state test or add a
focused test while preserving the current proceed/reset assertions.

Source: Coding guidelines

web/src/systems/agent/components/__tests__/agent-heartbeat-ops.test.tsx (1)

72-119: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add regression coverage for stale heartbeat state.

The suite only tests statusError when status is undefined. Add cases for cached status plus statusError, and for a selected ID absent from activeSessions; assert the wake button is disabled, retry is available, and onWake is not called.

As per coding guidelines, web tests should maintain high coverage for critical paths.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/components/__tests__/agent-heartbeat-ops.test.tsx`
around lines 72 - 119, Add regression tests in the AgentHeartbeatOps suite for
stale heartbeat state: render with cached status plus statusError and with
selectedSessionId absent from activeSessions, then assert the wake button is
disabled, the Retry control is available and invokes onRetryStatus, and onWake
is never called. Reuse the existing direct AgentHeartbeatOps setup and mocks
while preserving current healthy and ineligible-session coverage.

Source: Coding guidelines

web/src/systems/agent/hooks/__tests__/use-agent-instructions-tab.test.tsx (1)

162-196: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert the heartbeat validation, restore, and retry calls.

The test invokes onValidate, onRestore, and both retry handlers, but only verifies the save path and a subset of refetches. The test can therefore pass while heartbeat validation, rollback, or retry wiring is broken.

As per coding guidelines, critical web paths should have comprehensive behavioral coverage.

Suggested assertions
+    expect(mocks.validateHeartbeat).toHaveBeenCalledWith({
+      body: "heartbeat-body",
+      workspace_id: "ws-test",
+    });
+    expect(mocks.rollbackHeartbeat).toHaveBeenCalledWith({
+      revision_id: "heartbeat-rev",
+      expected_digest: "heartbeat-digest",
+      workspace_id: "ws-test",
+    });
+    expect(mocks.soulHistoryRefetch).toHaveBeenCalled();
+    expect(mocks.heartbeatRefetch).toHaveBeenCalled();
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/hooks/__tests__/use-agent-instructions-tab.test.tsx`
around lines 162 - 196, Extend the behavioral assertions in the test around the
soul and heartbeat handlers to verify heartbeat validation via
mocks.validateHeartbeat with its body and workspace_id, heartbeat restore via
mocks.rollbackHeartbeat with revision_id, expected_digest, and workspace_id, and
both onRetry handlers invoking their expected retry behavior. Preserve the
existing save, wake, and refetch assertions while covering each invoked
callback.

Source: Coding guidelines

web/src/systems/agent/components/__tests__/agent-authored-file-editor.test.tsx (1)

68-99: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Assert the validation status as well as diagnostics.

The mock returns validation_status: "invalid", but this test only checks the diagnostic text. Add an assertion that the editor displays invalid; otherwise the test will not catch stale status-pill behavior.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@web/src/systems/agent/components/__tests__/agent-authored-file-editor.test.tsx`
around lines 68 - 99, Extend the test around the agent-soul validation flow
after clicking agent-soul-validate to assert that the editor displays the
returned validation status “invalid”, alongside the existing “Role is required”
diagnostic assertion. Use the rendered status text or the relevant status-pill
selector so stale validation-status rendering is detected.
web/src/systems/agent/lib/__tests__/agent-authored-file-source.test.ts (1)

25-48: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Add a regression test for lossless body serialization.

This exact-output test uses ordinary Markdown only, so it would pass despite finishSource removing trailing Markdown spaces/newlines. Include a body ending in something like "line \n\n" and assert that the serialized source preserves it.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/lib/__tests__/agent-authored-file-source.test.ts`
around lines 25 - 48, Add a regression case to the serializeAgentSoulSource test
using a body that ends with meaningful trailing Markdown spaces and newlines,
such as “line  \n\n”. Update the exact expected serialized output to retain
those characters, ensuring finishSource does not trim the body during
serialization.
web/src/systems/agent/components/agent-instructions-tab.tsx (1)

30-60: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use the prescribed eyebrow treatment for uppercase file labels.

AGENT.md, SOUL.md, and HEARTBEAT.md are rendered as plain labels. Apply <Eyebrow> or the eyebrow utility class to the filename text, while keeping the “missing” badge separate.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/components/agent-instructions-tab.tsx` around lines 30
- 60, Update the file labels in the fileItems useMemo to apply the prescribed
eyebrow treatment to the filename text for AGENT.md, SOUL.md, and HEARTBEAT.md,
using the existing Eyebrow component or eyebrow utility class. Keep each
“missing” badge outside the eyebrow-styled filename text.

Source: Coding guidelines

web/src/systems/agent/components/agent-fleet-list.tsx (1)

55-73: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use design-system breakpoints and sizing tokens.

The new min-[720px], min-[1100px], and size-[26px] values are ad hoc values. Replace them with existing exported design values, or add the values to the token source before using them here.

As per coding guidelines, web styling must use design values from packages/ui/src/tokens.css and DESIGN.md.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/components/agent-fleet-list.tsx` around lines 55 - 73,
Update the loading grid and action skeleton in the agent-fleet-list component to
use existing exported design-system breakpoint and sizing tokens instead of the
arbitrary 720px, 1100px, and 26px values. If suitable tokens do not exist, add
them to packages/ui/src/tokens.css and document them in DESIGN.md before
referencing them in the component.

Source: Coding guidelines

web/src/systems/agent/hooks/__tests__/use-agent-heartbeat.test.tsx (2)

130-159: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Make the put assertion prove a cache update.

The query has already cached heartbeat, and the put mock returns the same value, so Line 158 passes even if the mutation’s cache update is removed. Return a distinct post-put value and assert the adapter arguments plus the updated cache entry.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/hooks/__tests__/use-agent-heartbeat.test.tsx` around
lines 130 - 159, Update the “Should load heartbeat/status and cache put results”
test so the put mutation returns a value distinct from the initially cached
heartbeat, then assert the mutation adapter receives the expected arguments and
that queryClient.getQueryData for agentKeys.heartbeat reflects the distinct
post-put value. Keep the existing pre-put setup and hook coverage unchanged.

161-193: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Assert every mutation branch in this test.

Lines 168-184 only prove that validate, delete, and rollback resolve; only wake is verified at Line 192. A disconnected validate/delete/rollback hook could still pass. Assert each adapter call and its expected cache/state transition.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/hooks/__tests__/use-agent-heartbeat.test.tsx` around
lines 161 - 193, Strengthen the “Should validate, delete, rollback, and wake”
test by asserting each mutation’s adapter invocation and expected cache/state
transition, not just that mutateAsync resolves. Add assertions after the
validate, delete, and rollback calls, alongside the existing mockWake assertion,
using the corresponding hook and mock symbols already defined in the test.
web/src/systems/agent/hooks/__tests__/use-agent-soul.test.tsx (1)

97-106: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Make put and rollback cache checks non-tautological.

The initial query already stores soul, and both mutations return the same value. Therefore, Lines 106 and 138 pass even if the mutation success handlers do nothing. Use distinct returned payloads and assert exact adapter arguments and cache updates.

Also applies to: 129-138

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/hooks/__tests__/use-agent-soul.test.tsx` around lines
97 - 106, Update the usePutAgentSoul and rollback mutation tests so their mocked
mutation responses differ from the initial cached soul, then assert the adapter
receives the expected arguments and each success handler updates the
corresponding agentKeys.soul cache to the distinct returned payload. Ensure the
assertions would fail if the mutation handlers did nothing.
internal/daemon/agent_resource_catalog.go (1)

62-65: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low value

Remove the redundant pre-sort. records is rebuilt into a map and sorted by name later, so this only adds extra work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/daemon/agent_resource_catalog.go` around lines 62 - 65, Remove the
slices.SortFunc call and its agentRecordSortKey comparator from the records
snapshot in the catalog flow, leaving records unsorted before it is rebuilt into
the map and sorted by name later.

Comment on lines +125 to +145
if err := aghconfig.DeleteAgentDefinition(agentsRoot, resolved.Entry.Def.SourcePath); err != nil {
h.respondError(c, statusForAgentDefinitionError(err), err)
return
}
mutationErr := h.purgeAgentDefinitionHistory(c.Request.Context(), resolved)
syncStartedAt := time.Now()
if syncErr := h.AgentDefinitionSync.Sync(c.Request.Context()); syncErr != nil {
mutationErr = errors.Join(mutationErr, fmt.Errorf("api: sync deleted agent definition: %w", syncErr))
}
syncDuration := time.Since(syncStartedAt)
if mutationErr != nil {
h.logAgentMutationFailure(
"delete",
resolved.Entry.Def.SourcePath,
startedAt,
syncDuration,
mutationErr,
)
h.respondError(c, http.StatusInternalServerError, mutationErr)
return
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

git ls-files internal/api/core/agent_definitions.go internal/api/core | sed 's#^`#FILE` #'
echo '--- outline ---'
ast-grep outline internal/api/core/agent_definitions.go --view expanded || true
echo '--- relevant ranges ---'
nl -ba internal/api/core/agent_definitions.go | sed -n '1,260p'
echo '--- purge helper search ---'
rg -n "purgeAgentDefinitionHistory|DeleteAgentDefinition|resolveAgentDefinition|soul|heartbeat|revision history" internal/api/core -n

Repository: compozy/agh

Length of output: 8172


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '1,260p' internal/api/core/agent_definitions.go | nl -ba | sed -n '1,260p'

Repository: compozy/agh

Length of output: 189


🏁 Script executed:

#!/bin/bash
set -euo pipefail
nl -ba internal/api/core/agent_definitions.go | sed -n '1,220p'

Repository: compozy/agh

Length of output: 189


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- delete handler ---'
sed -n '98,155p' internal/api/core/agent_definitions.go

echo '--- purge helper ---'
sed -n '293,340p' internal/api/core/agent_definitions.go

echo '--- resolve/delete error handling references ---'
rg -n "resolveAgentDefinition|DeleteAgentDefinition|purgeAgentDefinitionHistory|statusForAgentDefinitionError|NotFound" internal/api/core/agent_definitions.go internal/api/core/agent_definition_resolution.go

Repository: compozy/agh

Length of output: 5869


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- resolver ---'
sed -n '1,140p' internal/api/core/agent_definition_resolution.go

echo '--- purger implementations/references ---'
rg -n "type .*HistoryPurger|PurgeAgentHistory\\(|SoulHistoryPurger|HeartbeatHistoryPurger|agent definition history purgers" internal -g '*.go'

echo '--- delete agent definition semantics ---'
rg -n "func DeleteAgentDefinition|DeleteAgentDefinition\\(" -g '*.go' .

Repository: compozy/agh

Length of output: 12298


Delete history before removing the definition.

For workspace-scoped agents, deleting the definition first makes a purge failure unretryable: a later request resolves as 404, so the soul/heartbeat history can be left behind permanently. Purge first here (it only needs workspaceID, name, and sourcePath), or add a compensating cleanup path if delete must stay first.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/api/core/agent_definitions.go` around lines 125 - 145, Update the
agent deletion flow around aghconfig.DeleteAgentDefinition and
purgeAgentDefinitionHistory to purge workspace-scoped soul/heartbeat history
before removing the definition, using the resolved workspaceID, name, and
sourcePath. Preserve the existing sync, mutation-error logging, and response
behavior, ensuring a purge failure leaves the definition available for retry.

Comment on lines +122 to +132
agent, err := aghconfig.CreateAgentDefFile(path, draft, false)
if err != nil {
h.respondError(c, statusForCreateAgentError(err), err)
return
}
syncStartedAt := time.Now()
if err := h.AgentDefinitionSync.Sync(c.Request.Context()); err != nil {
syncErr := fmt.Errorf("api: sync created agent definition: %w", err)
h.logAgentMutationFailure("create", agent.SourcePath, startedAt, time.Since(syncStartedAt), syncErr)
h.respondError(c, http.StatusInternalServerError, syncErr)
return

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Do not report creation as failed after persisting the definition.

Line 122 writes the agent file before sync; Lines 128-132 return a failure when sync fails, leaving a durable agent behind. Clients receive a 500 and may retry into a conflict while the catalog remains stale. Make this a compensating operation (including reconciliation) or return an explicit persisted-but-unsynced result.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/api/core/agent_handlers.go` around lines 122 - 132, Update the
create-agent flow around CreateAgentDefFile and AgentDefinitionSync.Sync so a
sync failure after persistence is handled as a compensating operation, including
catalog reconciliation, or returned as an explicit persisted-but-unsynced
outcome. Do not report the operation as a generic creation failure or return a
retry-inducing 500 while the agent definition remains durable; preserve failure
logging through logAgentMutationFailure as appropriate.

Comment on lines +31 to +41
target, err := h.resolveAuthoredAgentTarget(ctx, health.WorkspaceID, health.AgentName)
if err != nil {
return contract.HeartbeatStatusResponse{}, err
}
result, err := h.HeartbeatStatus.Status(ctx, heartbeat.StatusRequest{
Target: target.heartbeatAuthoringTarget(),
SessionID: health.SessionID,
IncludeSessionHealth: includeHealth,
})
if err != nil {
return contract.HeartbeatStatusResponse{}, err

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Add context when propagating resolver and status errors.

Preserve the sentinel chain with %w, but identify whether target resolution or the heartbeat status call failed.

Proposed fix
 import (
   "context"
   "errors"
+  "fmt"
 
   "github.com/compozy/agh/internal/api/contract"
   "github.com/compozy/agh/internal/heartbeat"
 )
 
 target, err := h.resolveAuthoredAgentTarget(ctx, health.WorkspaceID, health.AgentName)
 if err != nil {
-  return contract.HeartbeatStatusResponse{}, err
+  return contract.HeartbeatStatusResponse{}, fmt.Errorf("resolve authored agent target: %w", err)
 }
 ...
 if err != nil {
-  return contract.HeartbeatStatusResponse{}, err
+  return contract.HeartbeatStatusResponse{}, fmt.Errorf("read heartbeat status: %w", err)
 }

As per coding guidelines, production Go code must follow agh-code-guidelines: wrap errors with %w.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
target, err := h.resolveAuthoredAgentTarget(ctx, health.WorkspaceID, health.AgentName)
if err != nil {
return contract.HeartbeatStatusResponse{}, err
}
result, err := h.HeartbeatStatus.Status(ctx, heartbeat.StatusRequest{
Target: target.heartbeatAuthoringTarget(),
SessionID: health.SessionID,
IncludeSessionHealth: includeHealth,
})
if err != nil {
return contract.HeartbeatStatusResponse{}, err
target, err := h.resolveAuthoredAgentTarget(ctx, health.WorkspaceID, health.AgentName)
if err != nil {
return contract.HeartbeatStatusResponse{}, fmt.Errorf("resolve authored agent target: %w", err)
}
result, err := h.HeartbeatStatus.Status(ctx, heartbeat.StatusRequest{
Target: target.heartbeatAuthoringTarget(),
SessionID: health.SessionID,
IncludeSessionHealth: includeHealth,
})
if err != nil {
return contract.HeartbeatStatusResponse{}, fmt.Errorf("read heartbeat status: %w", err)
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/api/core/session_heartbeat_status.go` around lines 31 - 41, Wrap
both errors in the heartbeat status flow with contextual messages using %w:
identify the failure from resolveAuthoredAgentTarget as target resolution and
the failure from HeartbeatStatus.Status as the heartbeat status call. Preserve
the existing error returns and sentinel-error chain.

Source: Coding guidelines

Comment on lines +30 to +43
RunE: func(cmd *cobra.Command, args []string) error {
client, err := clientFromDeps(deps)
if err != nil {
return err
}
request, err := createAgentRequestFromFlags(cmd, args[0], flags)
if err != nil {
return err
}
agent, err := client.CreateAgent(cmd.Context(), request)
if err != nil {
return err
}
return writeCommandOutput(cmd, agentBundle(agent))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Wrap command-boundary errors with operation context.

The raw return err paths make CLI failures ambiguous. Wrap each underlying error with the command step while preserving errors.Is/As via %w.

Proposed fix
 client, err := clientFromDeps(deps)
 if err != nil {
-  return err
+  return fmt.Errorf("cli: initialize agent client: %w", err)
 }
 request, err := createAgentRequestFromFlags(cmd, args[0], flags)
 if err != nil {
-  return err
+  return fmt.Errorf("cli: build create-agent request: %w", err)
 }
 agent, err := client.CreateAgent(cmd.Context(), request)
 if err != nil {
-  return err
+  return fmt.Errorf("cli: create agent: %w", err)
 }

As per coding guidelines, production Go code must follow agh-code-guidelines: wrap errors with %w.

Also applies to: 58-82, 97-113, 128-141, 159-175

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/cli/agent_mutate.go` around lines 30 - 43, Update the RunE handlers
in the affected command sections to wrap each error from clientFromDeps,
createAgentRequestFromFlags, client.CreateAgent, and writeCommandOutput with
operation-specific context using %w, preserving errors.Is/As behavior. Apply the
same treatment to all indicated ranges while keeping successful command flow
unchanged.

Source: Coding guidelines

Comment on lines +564 to +568
if agentChanged {
if err := s.projectAgents(ctx); err != nil {
return err
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Retry a failed agent projection on later syncs.

Agent writes are already durable when projectAgents fails. The next Sync then gets agentChanged == false and permanently skips projection, leaving the agent catalog stale until a later config mutation. Project every sync, or retain pending projection state.

Proposed fix
-	if agentChanged {
-		if err := s.projectAgents(ctx); err != nil {
-			return err
-		}
+	if err := s.projectAgents(ctx); err != nil {
+		return err
 	}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if agentChanged {
if err := s.projectAgents(ctx); err != nil {
return err
}
}
if err := s.projectAgents(ctx); err != nil {
return err
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/daemon/agent_skill_resources.go` around lines 564 - 568, Update the
Sync flow around projectAgents so agent projection is attempted on every sync,
rather than only when agentChanged is true. Preserve the existing error
propagation from projectAgents and ensure failed projections are retried during
subsequent syncs until they succeed.

Comment on lines +29 to +31
function finishSource(lines: string[], body: string): string {
lines.push("---", body.trimEnd());
return `${lines.join("\n")}\n`;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Preserve trailing body whitespace during serialization.

trimEnd() removes meaningful Markdown trailing spaces (for example, hard line breaks) and blank lines on every save, contradicting the “lossless” contract and potentially changing authored content.

Proposed fix
 function finishSource(lines: string[], body: string): string {
-  lines.push("---", body.trimEnd());
+  const normalizedBody = body.endsWith("\n") ? body : `${body}\n`;
+  lines.push("---", normalizedBody);
   return `${lines.join("\n")}\n`;
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/lib/agent-authored-file-source.ts` around lines 29 -
31, Update finishSource to preserve the body exactly during serialization:
remove the body.trimEnd() call while retaining the existing separator and final
newline behavior. Ensure authored trailing spaces and blank lines remain
unchanged across saves.

Comment on lines +22 to +31
export function agentCatalogRequest(
workspace: string,
filters: AgentCatalogStableFilter,
cursor?: string
) {
return {
workspace: workspace.trim(),
...filters,
...(cursor ? { cursor } : {}),
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Normalize filters before building the request.

agentKeys.catalog uses normalizeAgentCatalogFilter, but this request builder spreads raw filters. For example, { q: " " } hashes like an omitted query while still being sent to the API, allowing responses to be reused under the wrong cache key.

 export function agentCatalogRequest(
   workspace: string,
   filters: AgentCatalogStableFilter,
   cursor?: string
 ) {
   return {
     workspace: workspace.trim(),
-    ...filters,
+    ...normalizeAgentCatalogFilter(filters),
     ...(cursor ? { cursor } : {}),
   };
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export function agentCatalogRequest(
workspace: string,
filters: AgentCatalogStableFilter,
cursor?: string
) {
return {
workspace: workspace.trim(),
...filters,
...(cursor ? { cursor } : {}),
};
export function agentCatalogRequest(
workspace: string,
filters: AgentCatalogStableFilter,
cursor?: string
) {
return {
workspace: workspace.trim(),
...normalizeAgentCatalogFilter(filters),
...(cursor ? { cursor } : {}),
};
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/systems/agent/lib/agent-catalog-query.ts` around lines 22 - 31,
Update agentCatalogRequest to normalize filters with normalizeAgentCatalogFilter
before spreading them into the returned request. Ensure the normalized filters
are used consistently for both the API payload and the cache-key behavior, while
preserving workspace trimming and conditional cursor handling.

Comment thread web/src/systems/agent/lib/agent-settings-draft.ts
Comment thread web/src/systems/agent/mocks/handlers.ts
Comment thread web/src/systems/agent/mocks/handlers.ts
@pedronauck
pedronauck merged commit 64b269f into main Jul 12, 2026
1 of 2 checks passed
@pedronauck
pedronauck deleted the agent-details branch July 12, 2026 05:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant