Skip to content
This repository was archived by the owner on Aug 10, 2026. It is now read-only.

feat: providers model - #118

Merged
pedronauck merged 6 commits into
mainfrom
provider-models
May 7, 2026
Merged

pedronauck merged 6 commits into
mainfrom
provider-models

Conversation

@pedronauck

@pedronauck pedronauck commented May 7, 2026 •

Copy link
Copy Markdown
Member

Summary by CodeRabbit

  • New Features

    • Added model catalog with provider model discovery, listing, and refresh capabilities.
    • Added reasoning effort configuration option for sessions.
    • Added OpenAI-compatible /api/openai/v1/models endpoint.
    • Extended provider model configuration with curated models and discovery support.
  • Chores

    • Updated ACP SDK dependency to v0.12.2.

@vercel

vercel Bot commented May 7, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
agh-site Error Error May 7, 2026 7:42pm

Request Review

@coderabbitai

coderabbitai Bot commented May 7, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (62)
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_001.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_002.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_003.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_004.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_005.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_006.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_007.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_008.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_009.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_010.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_011.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_012.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_013.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_014.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_015.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_016.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_017.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_018.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_019.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_020.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_021.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_022.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_023.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_024.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_025.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_026.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_027.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_028.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_029.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-001/issue_030.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_001.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_002.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_003.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_004.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_005.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_006.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_007.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_008.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_009.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_010.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_011.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_012.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_013.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_014.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_015.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_016.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_017.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_018.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_019.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_020.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_021.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_022.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_023.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_024.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_025.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_026.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_027.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_028.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_029.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_030.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_031.md is excluded by !**/*.md
  • .compozy/tasks/provider-model-catalog/reviews-002/issue_032.md is excluded by !**/*.md

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 39540881-2ff5-4d4d-b10f-a180e81a89a9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

Adds a full model catalog (service, sources, persistence, APIs, CLI), introduces reasoning-effort session overrides via ACP config options, updates settings/provider schema to “models.*”, and upgrades ACP SDK with capability snapshots and new types.

Changes

Model Catalog and Reasoning-Effort Integration

Layer / File(s) Summary
Data contracts & schemas
internal/modelcatalog/types.go, internal/api/contract/*, internal/store/globaldb/schema_model_catalog.go
Define model catalog types/DTOs and DB schema; add session config options and OpenAI payloads.
Core services & storage
internal/modelcatalog/service.go, internal/store/globaldb/*, internal/daemon/model_catalog.go
Implement catalog service, persistence, runtime, refresh, redaction, and shutdown.
Sources (builtin/config/dev/live/extension)
internal/modelcatalog/sources.go, modelsdev.go, live_sources.go, internal/extension/model_source.go
Add multiple model sources and normalization/validation.
HTTP/UDS/OpenAI/Host APIs
internal/api/core/model_catalog*.go, httpapi/*, udsapi/*, internal/extension/host_api*_models*.go
Expose list/refresh/status endpoints; OpenAI models; host API methods.
CLI
internal/cli/provider_models*.go, client_provider_models.go
Add provider models list/refresh/status commands and client plumbing.
ACP client/session
internal/acp/*, internal/session/*
Add reasoning-effort negotiation via config options; caps snapshots; prompt build refactor.
Settings/config
internal/config/*, internal/settings/*
Migrate provider schema to models block; overlay/validation; tool-surface updates.
Specs/tests/migrations
internal/api/spec/*, internal/store/globaldb/*_test.go, many *_test.go`
Add coverage, OpenAPI ops/tags, migration order guards, and parity tests.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant CLI
  participant HTTP API
  participant Core Handlers
  participant Catalog Service
  participant Store
  participant Sources

  CLI->>HTTP API: GET /api/providers/{id}/models?refresh=1
  HTTP API->>Core Handlers: listProviderModels
  Core Handlers->>Catalog Service: ListModels(refresh, includeStale, now)
  Catalog Service->>Catalog Service: Refresh if needed (flight dedupe)
  Catalog Service->>Sources: ListModels (builtin/config/dev/live/ext)
  Sources-->>Catalog Service: Rows (per provider/model)
  Catalog Service->>Store: ReplaceSourceRows (atomic)
  Catalog Service->>Store: ListRows (merged if needed)
  Store-->>Catalog Service: Rows/Status
  Catalog Service-->>Core Handlers: Models
  Core Handlers-->>HTTP API: ProviderModelListResponse
  HTTP API-->>CLI: JSON payload
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~150 minutes

Possibly related PRs

  • compozy/agh#13 — Also touches ACP client and introduces/expands catalog and host API surfaces.
  • compozy/agh#66 — Adjusts internal/acp/client.go prompt flow and capability handling.
  • compozy/agh#60 — Adds Provider plumbing to session creation, adjacent to these runtime overrides.

@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: 19

Caution

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

⚠️ Outside diff range comments (1)
internal/acp/client.go (1)

892-933: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Close cancellationDone on the prompt-build error path.

If buildWirePromptRequest fails, runPrompt returns before cancellationDone is closed, so the watcher goroutine stays blocked until ctx.Done(). A deferred close right after the goroutine starts fixes the leak.

Suggested fix
 	cancellationDone := make(chan struct{})
+	defer close(cancellationDone)
 	go func() {
 		select {
 		case <-ctx.Done():
 			if strings.TrimSpace(proc.SessionID) != "" {
@@
 	response, err := acpsdk.SendRequest[wirePromptResponse](
 		proc.conn,
 		ctx,
 		acpsdk.AgentMethodSessionPrompt,
 		promptRequest,
 	)
-	close(cancellationDone)
 
 	if err != nil {
🤖 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/acp/client.go` around lines 892 - 933, The watcher goroutine uses
the cancellationDone channel but if buildWirePromptRequest returns early the
channel is never closed; after starting the goroutine (immediately after
creating cancellationDone and launching the goroutine) add a deferred, safe
close to ensure cancellationDone is closed on all return paths (e.g., defer
func() { select { case <-cancellationDone: default: close(cancellationDone) }
}()), referencing the existing cancellationDone channel and the
buildWirePromptRequest/SendRequest flow so you still allow the explicit
close(cancellationDone) after acpsdk.SendRequest to succeed without causing a
double-close panic.
🧹 Nitpick comments (11)
internal/api/core/session_workspace_internal_test.go (1)

43-43: ⚡ Quick win

Use t.Run("Should ...") naming for the new subtest.

Line 43 should follow the repo’s test-case naming convention for consistency.

Proposed tweak
-	t.Run("validate create session runtime overrides", func(t *testing.T) {
+	t.Run("Should validate create session runtime overrides", func(t *testing.T) {

As per coding guidelines: "Use t.Run('Should ...') pattern for Go test subtests instead of flat test structures".

🤖 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_workspace_internal_test.go` at line 43, Update the
subtest name to follow the repo convention by changing the t.Run invocation
string in the subtest for session workspace validation; locate the t.Run call
(the subtest inside session_workspace_internal_test.go) currently using
"validate create session runtime overrides" and prefix it with "Should " so the
test reads "Should validate create session runtime overrides" to conform with
the t.Run("Should ...") pattern.
internal/acp/types_test.go (1)

47-75: ⚡ Quick win

TestAgentProcessCapsSnapshotClonesConfigOptions should use t.Run("Should ...") subtests.

The test covers two distinct behaviors — snapshot isolation from mutation, and setConfigOptions update correctness — but they are merged into a flat function body. Per the coding guidelines, each scenario should be a named subtest with its own t.Parallel().

♻️ Proposed refactor
-func TestAgentProcessCapsSnapshotClonesConfigOptions(t *testing.T) {
-	t.Parallel()
-
-	proc := &AgentProcess{}
-	proc.setCaps(Caps{
-		ConfigOptions: []SessionConfigOption{
-			{
-				ID:      "model",
-				Kind:    SessionConfigOptionKindSelect,
-				Current: "model-a",
-				Values:  []SessionConfigOptionValue{{Value: "model-a"}},
-			},
-		},
-	})
-
-	first := proc.CapsSnapshot()
-	first.ConfigOptions[0].Current = "mutated"
-	first.ConfigOptions[0].Values[0].Value = "mutated"
-
-	second := proc.CapsSnapshot()
-	if second.ConfigOptions[0].Current != "model-a" || second.ConfigOptions[0].Values[0].Value != "model-a" {
-		t.Fatalf("CapsSnapshot() leaked mutable config options: %#v", second.ConfigOptions)
-	}
-	proc.setConfigOptions([]SessionConfigOption{{ID: "reasoning_effort", Kind: SessionConfigOptionKindSelect}})
-	updated := proc.CapsSnapshot()
-	if len(updated.ConfigOptions) != 1 || updated.ConfigOptions[0].ID != "reasoning_effort" {
-		t.Fatalf("setConfigOptions() = %#v", updated.ConfigOptions)
-	}
-}
+func TestAgentProcessCapsSnapshotClonesConfigOptions(t *testing.T) {
+	t.Parallel()
+
+	t.Run("Should deep-clone config options to prevent mutation leakage", func(t *testing.T) {
+		t.Parallel()
+
+		proc := &AgentProcess{}
+		proc.setCaps(Caps{
+			ConfigOptions: []SessionConfigOption{
+				{
+					ID:      "model",
+					Kind:    SessionConfigOptionKindSelect,
+					Current: "model-a",
+					Values:  []SessionConfigOptionValue{{Value: "model-a"}},
+				},
+			},
+		})
+
+		first := proc.CapsSnapshot()
+		first.ConfigOptions[0].Current = "mutated"
+		first.ConfigOptions[0].Values[0].Value = "mutated"
+
+		second := proc.CapsSnapshot()
+		if second.ConfigOptions[0].Current != "model-a" || second.ConfigOptions[0].Values[0].Value != "model-a" {
+			t.Fatalf("CapsSnapshot() leaked mutable config options: %#v", second.ConfigOptions)
+		}
+	})
+
+	t.Run("Should reflect updated config options after setConfigOptions", func(t *testing.T) {
+		t.Parallel()
+
+		proc := &AgentProcess{}
+		proc.setCaps(Caps{
+			ConfigOptions: []SessionConfigOption{
+				{ID: "model", Kind: SessionConfigOptionKindSelect, Current: "model-a"},
+			},
+		})
+		proc.setConfigOptions([]SessionConfigOption{{ID: "reasoning_effort", Kind: SessionConfigOptionKindSelect}})
+		updated := proc.CapsSnapshot()
+		if len(updated.ConfigOptions) != 1 || updated.ConfigOptions[0].ID != "reasoning_effort" {
+			t.Fatalf("setConfigOptions() = %#v", updated.ConfigOptions)
+		}
+	})
+}

As per coding guidelines: Use t.Run("Should ...") subtests with t.Parallel as default.

🤖 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/acp/types_test.go` around lines 47 - 75, Split
TestAgentProcessCapsSnapshotClonesConfigOptions into two named subtests using
t.Run and call t.Parallel inside each subtest: one subtest (e.g., "Should clone
config options to prevent mutation") should set up proc with setCaps, call
CapsSnapshot(), mutate the first snapshot and assert the second snapshot remains
unchanged; the other subtest (e.g., "Should update config options via
setConfigOptions") should call proc.setConfigOptions, then CapsSnapshot() and
assert the updated ConfigOptions contains the expected ID; keep the existing
assertions and use the same symbols
(TestAgentProcessCapsSnapshotClonesConfigOptions, proc.setCaps,
proc.CapsSnapshot, proc.setConfigOptions) so each scenario runs in isolation and
parallel.
internal/modelcatalog/redact.go (1)

8-17: 💤 Low value

Pattern coverage looks correct for its purpose; consider noting the github_pat_ gap.

Modern GitHub fine-grained PATs use the github_pat_ prefix (not covered by gh[pousr]_). For a best-effort catalog-error redactor this is acceptable, but worth a comment explaining the intended scope so future contributors know to extend the list as new token formats appear.

🤖 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/modelcatalog/redact.go` around lines 8 - 17, The secretPatterns list
currently omits modern GitHub fine-grained PATs (e.g., "github_pat_...") because
the gh[pousr]_* regex only matches legacy prefixes; update
internal/modelcatalog/redact.go by adding a clarifying comment above the
secretPatterns variable (and optionally next to the gh[pousr]_[A-Za-z0-9_]{8,}
entry) that documents the intended scope and known gaps (specifically noting
`github_pat_` tokens) so future contributors know to extend secretPatterns or
add a new regexp to cover fine-grained PATs; reference the secretPatterns
variable and the gh[pousr]_ regex when making this comment.
internal/api/core/session_workspace.go (1)

53-55: ⚡ Quick win

Make runtime-override errors always carry session.ErrInvalidRuntimeOverride

statusForSessionError now maps session.ErrInvalidRuntimeOverride to 400, but prefixedRuntimeOverrideErr does not guarantee that sentinel is attached. Wrapping it there makes status mapping robust and deterministic.

💡 Proposed fix
 func prefixedRuntimeOverrideErr(prefix string, err error) error {
+	if err == nil {
+		return nil
+	}
+	wrapped := fmt.Errorf("%w: %w", session.ErrInvalidRuntimeOverride, err)
 	label := strings.TrimSpace(prefix)
 	if label == "" {
-		return err
+		return wrapped
 	}
-	return fmt.Errorf("%s: %w", label, err)
+	return fmt.Errorf("%s: %w", label, wrapped)
 }

Also applies to: 156-157, 184-190

🤖 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_workspace.go` around lines 53 - 55, The
prefixedRuntimeOverrideErr call should always wrap the underlying validation
error with the sentinel session.ErrInvalidRuntimeOverride so
statusForSessionError can deterministically map it to 400; update each place
that returns prefixedRuntimeOverrideErr (e.g., where
session.ValidateReasoningEffort is used) to wrap the returned err with
session.ErrInvalidRuntimeOverride (using error wrapping like fmt.Errorf("%w:
%v", session.ErrInvalidRuntimeOverride, err) or errors.Join) before passing it
into prefixedRuntimeOverrideErr, and apply the same change to the other
prefixedRuntimeOverrideErr call sites in this file.
internal/api/spec/spec_test.go (1)

108-120: ⚡ Quick win

Assert error response schemas for declared non-2xx statuses

This case currently verifies that 403/503 responses exist, but not their JSON schema shape. Add schema assertions for those statuses (for example, required error envelope fields) so spec regressions are caught earlier.

As per coding guidelines "Always assert both HTTP status code AND response body in tests; status-code-only assertions are insufficient".

🤖 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/spec/spec_test.go` around lines 108 - 120, The tests only assert
403/503 response presence via assertResponseStatus but not their JSON shapes;
update the spec tests to fetch the response schemas for those non-2xx cases (use
jsonResponseSchema with the same operation variables like openAI and status for
the 403 and 503 codes) and assert the expected error envelope fields via
assertRequired (e.g. require the canonical error fields such as "error" and
"message" or whichever envelope keys your project uses) so the 403/503 responses
are validated for both status and body.
internal/acp/types.go (1)

486-486: ⚖️ Poor tradeoff

Public Caps field may still allow unsynchronized access.

While CapsSnapshot(), setCaps(), and setConfigOptions() properly synchronize via capsMu, the Caps field on AgentProcess remains public. Direct access to p.Caps bypasses the mutex, potentially causing data races. Consider making Caps unexported to enforce access through the synchronized methods.

Also applies to: 598-624

🤖 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/acp/types.go` at line 486, The public Caps field on AgentProcess
allows unsynchronized access and should be made unexported (rename Caps to caps)
so all reads/writes go through the existing synchronized methods; update the
AgentProcess struct field name and any direct references to p.Caps across the
codebase to use the new unexported caps field or to call the synchronized
accessors (CapsSnapshot(), setCaps(), setConfigOptions()), and ensure capsMu
continues to protect all mutations and snapshots.
internal/session/manager_start.go (1)

387-404: 💤 Low value

Unused parameter in validateRuntimeOverrides.

The aghconfig.ResolvedAgent parameter is accepted but explicitly ignored (named _). If it's not needed for validation, consider removing it entirely to simplify the signature. If it's reserved for future validation logic, a brief comment would clarify intent.

🤖 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/session/manager_start.go` around lines 387 - 404, The
validateRuntimeOverrides function currently accepts an unused
aghconfig.ResolvedAgent parameter; either remove that parameter from the
signature of validateRuntimeOverrides and update any callers to match, or keep
it if planned for future use but stop using the blank identifier: rename the
parameter to something like resolvedAgent or add a short comment above the
function explaining it’s reserved for future validation so it’s not confusing to
reviewers; ensure you update all call sites of validateRuntimeOverrides (or
their invocations) to match the new signature if you remove the parameter.
internal/cli/provider_models.go (1)

118-140: 💤 Low value

Consider extracting duplicate row builder.

The text row builder (lines 118-128) and JSON row builder (lines 129-139) are identical. If they're always the same, a single function could be passed to listBundle twice, reducing duplication.

♻️ Proposed simplification
 func providerModelListBundle(record ProviderModelListRecord) outputBundle {
+	rowBuilder := func(model ProviderModelRecord) []string {
+		return []string{
+			model.ProviderID,
+			model.ModelID,
+			providerModelNullableBoolString(model.Available),
+			model.AvailabilityState,
+			providerModelBoolString(model.Stale),
+			providerModelSourceSummary(model.Sources),
+			model.RefreshedAt,
+		}
+	}
 	return listBundle(
 		record,
 		record.Models,
 		"Provider Models",
 		[]string{"Provider", "Model", "Available", "State", "Stale", "Sources", "Refreshed"},
 		"provider_models",
 		[]string{"provider_id", "model_id", "available", "availability_state", "stale", "sources", "refreshed_at"},
-		func(model ProviderModelRecord) []string {
-			return []string{
-				model.ProviderID,
-				model.ModelID,
-				providerModelNullableBoolString(model.Available),
-				model.AvailabilityState,
-				providerModelBoolString(model.Stale),
-				providerModelSourceSummary(model.Sources),
-				model.RefreshedAt,
-			}
-		},
-		func(model ProviderModelRecord) []string {
-			return []string{
-				model.ProviderID,
-				model.ModelID,
-				providerModelNullableBoolString(model.Available),
-				model.AvailabilityState,
-				providerModelBoolString(model.Stale),
-				providerModelSourceSummary(model.Sources),
-				model.RefreshedAt,
-			}
-		},
+		rowBuilder,
+		rowBuilder,
 	)
 }
🤖 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/provider_models.go` around lines 118 - 140, The two identical
anonymous row-builder functions for ProviderModelRecord (used as the text and
JSON row builders) should be consolidated into a single reusable function:
extract a named function (e.g., buildProviderModelRow) that returns []string and
calls providerModelNullableBoolString, providerModelBoolString,
providerModelSourceSummary and accesses ProviderID, ModelID, AvailabilityState,
RefreshedAt on ProviderModelRecord; then pass that single buildProviderModelRow
function to listBundle twice instead of the duplicated lambdas.
internal/settings/service_test.go (1)

846-864: ⚡ Quick win

Assert that the empty providers.custom.models table is removed too.

This only proves the nested keys disappeared. If the writer still leaves [providers.custom.models] behind, the clear-path regression still passes while an empty overlay remains in the file. Add a negative check for the table header itself.

As per coding guidelines, "Check tests can fail when 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/settings/service_test.go` around lines 846 - 864, After clearing
provider models in the test that calls service.PutCollectionItem
(CollectionItemPutRequest with ProviderSettings), add an assertion that the raw
config payload (configPayload read from homePaths.ConfigFile) does not contain
the empty table header for providers.custom.models; e.g. check that neither
`[[providers.custom.models]]` nor `[providers.custom.models]` appears and fail
the test if either is found so we ensure the writer removes the empty table
itself in addition to nested keys.
internal/extension/model_source_test.go (1)

250-345: ⚡ Quick win

Assert the specific validation failure for each row case.

Every case here passes on any non-nil error, so the table will miss regressions that reject a row for the wrong reason. Add an expected sentinel or substring per case and assert with errors.Is/ErrorContains.

As per coding guidelines, "MUST have specific error assertions (ErrorContains, ErrorAs)".

🤖 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/extension/model_source_test.go` around lines 250 - 345, The
table-driven tests currently only check for any non-nil error from
source.ListModels, which masks wrong rejection reasons; add an expected error
sentinel or substring field to the test cases (e.g., expectedErr error or
expectedErrSubstring string) and replace the generic nil check with a specific
assertion using errors.Is or testutil.ErrorContains/ErrorContains(t, err,
"<substring>") against that field; update the tests slice entries to specify the
correct expected error for each ModelSourceRow case so each branch (e.g.,
provider filter, negative ContextWindow, negative cost, duplicate reasoning
efforts, default effort not in list) is asserted explicitly when calling
ListModels.
internal/config/provider.go (1)

1028-1031: 💤 Low value

Misleading error message for whitespace-only default.

The condition strings.TrimSpace(m.Default) == "" && m.Default != "" correctly catches whitespace-only defaults, but the error message "is required" is confusing—it implies the field is missing rather than malformed.

Suggested clarification
 func (m ProviderModelsConfig) Validate(path string) error {
 	if strings.TrimSpace(m.Default) == "" && m.Default != "" {
-		return fmt.Errorf("%s.default is required", path)
+		return fmt.Errorf("%s.default cannot be whitespace-only", path)
 	}
🤖 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/provider.go` around lines 1028 - 1031, The Validate method on
ProviderModelsConfig currently detects whitespace-only m.Default but returns a
misleading "is required" message; update the error returned in
ProviderModelsConfig.Validate (when strings.TrimSpace(m.Default) == "" &&
m.Default != "") to a clearer message such as "%s.default must not be empty or
whitespace" (or similar) so it accurately reflects that the value is present but
invalid (whitespace-only).
🤖 Prompt for all review comments with 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.

Inline comments:
In `@internal/acp/client.go`:
- Around line 544-569: The code currently treats any non-empty
caps.ConfigOptions as authoritative and returns an error when
findModelConfigOption fails; instead, only take the config-option branch when
findModelConfigOption actually finds a matching option. Change the logic in the
block around CapsSnapshot/ConfigOptions so that you call
findModelConfigOption(caps.ConfigOptions) and if it returns ok == true then
enforce configOptionAllowsValue(...) and call applySessionConfigOption(...); if
ok == false, do NOT return an error but continue to the legacy path
(legacyModelStateAllows and SendRequest) so SupportedModels/PreferredModel can
still be used. Reference symbols: CapsSnapshot, caps.ConfigOptions,
findModelConfigOption, configOptionAllowsValue, applySessionConfigOption,
legacyModelStateAllows, acpsdk.UnstableSetSessionModelRequest, modelID.

In `@internal/api/core/conversions_parsers_test.go`:
- Around line 145-151: The test currently only checks ConfigOptions[0].Values
length; tighten it by asserting the actual allowed values (e.g., that
payload.ACPCaps.ConfigOptions[0].Values contains "low" and "high" or equals
[]string{"low","high"} depending on expected order) in addition to existing
checks for ID == "reasoning_effort", Current == "high", and Kind == "select";
update the assertion around payload.ACPCaps.ConfigOptions[0] to explicitly
verify the concrete value strings rather than just the length so the contract
fails if the allowed values change.

In `@internal/api/httpapi/model_catalog_test.go`:
- Around line 21-31: The test only asserts handlers.ModelCatalog but not that
the same service was injected into the embedded BaseHandlers; update the test
for newHandlers (using handlerConfig and httpModelCatalogServiceStub) to also
assert BaseHandlers is non-nil and that handlers.BaseHandlers.ModelCatalog
equals the same service instance (handlers.ModelCatalog or service) to ensure
the injection into BaseHandlers was performed.

In `@internal/api/udsapi/model_catalog_test.go`:
- Line 15: The subtest name in the t.Run call inside model_catalog_test.go uses
camelCase ("ShouldPassModelCatalogServiceToBaseHandlers"); change it to the
spaced convention used elsewhere, e.g. "Should pass ModelCatalogService to base
handlers", by updating the string literal in the t.Run invocation so it follows
the "Should ..." space-separated pattern (locate the t.Run call for the subtest
surrounding the test function name).

In `@internal/cli/install_test.go`:
- Around line 178-179: The test currently asserts
cfg.Providers["blackbox"].Models.Default without first ensuring the "blackbox"
provider exists, which can hide missing-provider bugs; update the test in
install_test.go to first check that cfg.Providers contains the "blackbox" key
(e.g., assert presence or use a lookup like val, ok := cfg.Providers["blackbox"]
and fail if !ok), then use that retrieved provider value to assert
val.Models.Default is empty; reference cfg, Providers, the "blackbox" key, and
Models.Default when making the changes.

In `@internal/daemon/model_catalog_test.go`:
- Around line 154-166: The test is hanging because
manuallyReleasedModelCatalogService.Refresh blocks until service.release is
closed; close service.release before waiting on refreshErrCh. Move the
close(service.release) call to precede the call to waitForCatalogTestError(t,
refreshErrCh, ...) so that Refresh can return and refreshErrCh can be read; keep
the shutdown context/abort checks (shutdownCtx, cancelShutdown,
runtime.Shutdown) as-is but reorder so close(service.release) happens before
waiting for refreshErrCh and before waitForCatalogTestSignal on
service.released.

In `@internal/daemon/model_catalog.go`:
- Line 18: The code currently uses sourceTimeout (parsed from
state.cfg.ModelCatalog.Sources.ModelsDev) and the hardcoded constant
defaultModelCatalogRefreshTimeout when setting timeouts for both the models.dev
HTTP client, provider-live discovery, and the modelCatalogRuntime refresh
deadline; decouple these by adding a new configurable catalog-wide timeout
(e.g., cfg.ModelCatalog.RefreshTimeout or env var) and use that for
modelCatalogRuntime while keeping sourceTimeout only for ModelsDev-related HTTP
client and provider-live discovery; remove reliance on the hardcoded
defaultModelCatalogRefreshTimeout in model_catalog.go and ensure
modelCatalogRuntime uses the new catalog-wide setting (leave sourceTimeout
scoped to ModelsDev and referenced only in the code paths that create the
models.dev client and provider-live discovery).

In `@internal/extension/manager_model_source_test.go`:
- Around line 67-74: The test currently only checks err != nil for
manager.ListModelSourceRows and can be satisfied by unrelated failures; update
the assertion to validate the specific denied-service error shape/message (use
testing helpers like require.ErrorContains/Assert or errors.As to match the
denial error type) so the test only passes when the call fails due to missing
model-source capability; locate the call to ListModelSourceRows (using
extensioncontract.ModelSourceListParams{ProviderID: "codex"}) and replace the
generic nil check with an assertion that the error contains the expected denial
string or can be cast to the denied error type.

In `@internal/extension/tool_runtime.go`:
- Around line 108-123: The current code unconditionally replaces provides with
ext.manifest.Capabilities.Provides whenever ext.manifest != nil, which can drop
runtime-advertised service methods; change the logic so you only overwrite
provides when the manifest actually advertises service methods: compute
manifestProvides := ext.manifest.Capabilities.Provides and if
slices.ContainsAny(extensionprotocol.CapabilityServiceMethods(manifestProvides),
methodName) or manifestProvides contains any service-capability entries then set
provides = manifestProvides, otherwise keep the original
ext.info.Capabilities.Provides; update the check that calls
extensionprotocol.CapabilityServiceMethods(provides) and preserve the existing
error return using methodName and toolspkg.ErrToolUnavailable.

In `@internal/modelcatalog/errors.go`:
- Around line 23-31: StaleFallbackError.Error() must not embed the underlying
e.Err (which can leak secrets); change the implementation of
StaleFallbackError.Error() so it never includes e.Err’s text — always return the
stable stale-fallback context (e.g. "model catalog: stale fallback" or "model
catalog: source %q returned stale fallback" using SourceID) and remove any fmt
usage that formats e.Err; leave any redacted rendering of e.Err to helper call
sites such as sourceErrorText.

In `@internal/modelcatalog/live_sources_test.go`:
- Around line 449-474: The test's coalescing assertions use time.Sleep and short
waits which are flaky; update the blockingProviderSource (created by
newBlockingProviderSource) to expose an explicit synchronization channel/ack
(e.g., a "joined" or "ready" channel) that signals when a goroutine has reached
the blocking point, then change the test to wait on that channel(s) instead of
sleeping: in the first subtest wait for both refresh goroutines to signal
they've entered the provider's block before calling source.release(), and in the
second subtest wait for the second source's "joined" signal
(secondSource.joined) or a timeout before releasing the first; use these
explicit acknowledgements to deterministically assert the
coalescing/serialization behavior rather than relying on time.Sleep.

In `@internal/modelcatalog/redact_test.go`:
- Around line 27-30: The test case "Should redact secret shaped environment
values" only asserts one secret; update the assertions in redact_test.go to
verify both secrets in the input string (e.g., "env-secret-value" and
"client-secret-value") are redacted — either by expanding the expected secrets
slice to include both values or by asserting the output does not contain each
secret and that both occurrences are replaced with the redaction token; make the
same change for the other similar case (the test case around the second
multi-secret input) and ensure the test invokes the same redaction function
(e.g., Redact or redactString) for both checks.

In `@internal/modelcatalog/service_integration_test.go`:
- Around line 1-21: This integration test file is missing the Go build
constraint; add a top-of-file build tag line "//go:build integration" (followed
by a blank line) before the "package modelcatalog_test" declaration so the file
only compiles with the integration build tag; ensure you use the modern
"//go:build integration" form (optionally also add the old-style "+build
integration" comment if your repo requires legacy tags) to match the project's
build/tagging conventions.

In `@internal/modelcatalog/service.go`:
- Around line 125-127: The current refresh-flight flow doesn't respect context
cancellation and removes the flight entry before closing its done channel,
causing waiters to block and a race that can start a duplicate refresh; update
the call site to pass ctx into withRefreshFlight (replace
s.withRefreshFlight(providerKey, scopeKey, ...) with s.withRefreshFlight(ctx,
providerKey, scopeKey, ...)), change withRefreshFlight and its waiter logic to
wait using select on ctx.Done() and flight.done so waiters are cancelable, and
ensure the owner closes flight.done before deleting the flight map entry (close
done then delete) so the flight stays alive until all waiters are released.

In `@internal/modelcatalog/sources.go`:
- Around line 160-166: The current cloneConfigProviders function uses maps.Copy
which only shallow-copies the map header and leaves nested state in
aghconfig.ProviderConfig (e.g., model metadata slices) aliased; change
cloneConfigProviders to produce a deep snapshot by iterating over src and for
each entry (key, cfg) copy the ProviderConfig value into a new variable,
deep-copy any slice or map fields (notably the model metadata slices) into new
slices/maps and assign the copied struct to cloned[key], ensuring no shared
references remain so subsequent mutations to the original configs cannot affect
the cloned snapshot used by ListModels.

In `@internal/settings/collections.go`:
- Around line 1141-1194: The code currently omits fields when slices are empty,
preventing explicit empty overrides; update providerModelsSettingsMap to add
"curated" when models.Curated is non-nil (not only when len>0) by assigning
providerModelConfigMaps(models.Curated) so an explicit [] is preserved, and
update providerModelConfigMaps to emit "reasoning_efforts" when
model.ReasoningEfforts is non-nil (even if len==0) by calling
cloneStringSlicePreserveNil(model.ReasoningEfforts) when model.ReasoningEfforts
!= nil; similarly ensure any other slice fields (e.g., discovery) use nil-checks
instead of len()>0 so explicit empty slices are serialized.

In `@internal/store/globaldb/global_db_model_catalog.go`:
- Around line 113-142: The two reads (the initial rows query using
g.db.QueryContext and the subsequent listModelCatalogReasoningEfforts call) must
be executed on the same DB connection/transaction to avoid observing mixed
revisions; wrap both reads in a single read-only transaction or use the same
connection/Tx for both operations (e.g., begin a Tx via g.db.BeginTx and run the
query that calls scanModelCatalogRow and then call
listModelCatalogReasoningEfforts using that Tx/connection), then iterate
catalogRows, compute keys with modelCatalogKey and assign ReasoningEfforts, and
ensure rows are closed and the Tx is committed/rolled back properly so both
reads are consistent.

In `@internal/store/globaldb/global_db_test.go`:
- Around line 384-426: The test uses expectedGlobalMigrationPrefix() which only
lists migrations through version 20 and relies on a len(records) >= len(want)
check, leaving newer migrations unpinned; update expectedGlobalMigrationPrefix()
to include the complete, current shipped migration tail (all versions/checksums
up to the latest) and change the test assertion to require exact sequence
equality (not just prefix length) so identities cannot be
renamed/reordered/changed; apply the same fix to the other helper/test block
referenced in the comment (the second expected-migration helper around lines
429-503) so both migration registries are pinned end-to-end.

In `@internal/store/globaldb/global_db.go`:
- Line 687: The migration v1 payload is being mutated by appending
modelCatalogSchemaStatements() into globalSchemaStatements (Version: 1); revert
that change so globalSchemaStatements remains exactly as originally defined, and
instead introduce the model-catalog DDL as a new, appended migration (create a
new migration entry that references modelCatalogSchemaStatements() or include it
in the tail migration list) so the schema is added via a new migration identity
rather than modifying Version: 1.

---

Outside diff comments:
In `@internal/acp/client.go`:
- Around line 892-933: The watcher goroutine uses the cancellationDone channel
but if buildWirePromptRequest returns early the channel is never closed; after
starting the goroutine (immediately after creating cancellationDone and
launching the goroutine) add a deferred, safe close to ensure cancellationDone
is closed on all return paths (e.g., defer func() { select { case
<-cancellationDone: default: close(cancellationDone) } }()), referencing the
existing cancellationDone channel and the buildWirePromptRequest/SendRequest
flow so you still allow the explicit close(cancellationDone) after
acpsdk.SendRequest to succeed without causing a double-close panic.

---

Nitpick comments:
In `@internal/acp/types_test.go`:
- Around line 47-75: Split TestAgentProcessCapsSnapshotClonesConfigOptions into
two named subtests using t.Run and call t.Parallel inside each subtest: one
subtest (e.g., "Should clone config options to prevent mutation") should set up
proc with setCaps, call CapsSnapshot(), mutate the first snapshot and assert the
second snapshot remains unchanged; the other subtest (e.g., "Should update
config options via setConfigOptions") should call proc.setConfigOptions, then
CapsSnapshot() and assert the updated ConfigOptions contains the expected ID;
keep the existing assertions and use the same symbols
(TestAgentProcessCapsSnapshotClonesConfigOptions, proc.setCaps,
proc.CapsSnapshot, proc.setConfigOptions) so each scenario runs in isolation and
parallel.

In `@internal/acp/types.go`:
- Line 486: The public Caps field on AgentProcess allows unsynchronized access
and should be made unexported (rename Caps to caps) so all reads/writes go
through the existing synchronized methods; update the AgentProcess struct field
name and any direct references to p.Caps across the codebase to use the new
unexported caps field or to call the synchronized accessors (CapsSnapshot(),
setCaps(), setConfigOptions()), and ensure capsMu continues to protect all
mutations and snapshots.

In `@internal/api/core/session_workspace_internal_test.go`:
- Line 43: Update the subtest name to follow the repo convention by changing the
t.Run invocation string in the subtest for session workspace validation; locate
the t.Run call (the subtest inside session_workspace_internal_test.go) currently
using "validate create session runtime overrides" and prefix it with "Should "
so the test reads "Should validate create session runtime overrides" to conform
with the t.Run("Should ...") pattern.

In `@internal/api/core/session_workspace.go`:
- Around line 53-55: The prefixedRuntimeOverrideErr call should always wrap the
underlying validation error with the sentinel session.ErrInvalidRuntimeOverride
so statusForSessionError can deterministically map it to 400; update each place
that returns prefixedRuntimeOverrideErr (e.g., where
session.ValidateReasoningEffort is used) to wrap the returned err with
session.ErrInvalidRuntimeOverride (using error wrapping like fmt.Errorf("%w:
%v", session.ErrInvalidRuntimeOverride, err) or errors.Join) before passing it
into prefixedRuntimeOverrideErr, and apply the same change to the other
prefixedRuntimeOverrideErr call sites in this file.

In `@internal/api/spec/spec_test.go`:
- Around line 108-120: The tests only assert 403/503 response presence via
assertResponseStatus but not their JSON shapes; update the spec tests to fetch
the response schemas for those non-2xx cases (use jsonResponseSchema with the
same operation variables like openAI and status for the 403 and 503 codes) and
assert the expected error envelope fields via assertRequired (e.g. require the
canonical error fields such as "error" and "message" or whichever envelope keys
your project uses) so the 403/503 responses are validated for both status and
body.

In `@internal/cli/provider_models.go`:
- Around line 118-140: The two identical anonymous row-builder functions for
ProviderModelRecord (used as the text and JSON row builders) should be
consolidated into a single reusable function: extract a named function (e.g.,
buildProviderModelRow) that returns []string and calls
providerModelNullableBoolString, providerModelBoolString,
providerModelSourceSummary and accesses ProviderID, ModelID, AvailabilityState,
RefreshedAt on ProviderModelRecord; then pass that single buildProviderModelRow
function to listBundle twice instead of the duplicated lambdas.

In `@internal/config/provider.go`:
- Around line 1028-1031: The Validate method on ProviderModelsConfig currently
detects whitespace-only m.Default but returns a misleading "is required"
message; update the error returned in ProviderModelsConfig.Validate (when
strings.TrimSpace(m.Default) == "" && m.Default != "") to a clearer message such
as "%s.default must not be empty or whitespace" (or similar) so it accurately
reflects that the value is present but invalid (whitespace-only).

In `@internal/extension/model_source_test.go`:
- Around line 250-345: The table-driven tests currently only check for any
non-nil error from source.ListModels, which masks wrong rejection reasons; add
an expected error sentinel or substring field to the test cases (e.g.,
expectedErr error or expectedErrSubstring string) and replace the generic nil
check with a specific assertion using errors.Is or
testutil.ErrorContains/ErrorContains(t, err, "<substring>") against that field;
update the tests slice entries to specify the correct expected error for each
ModelSourceRow case so each branch (e.g., provider filter, negative
ContextWindow, negative cost, duplicate reasoning efforts, default effort not in
list) is asserted explicitly when calling ListModels.

In `@internal/modelcatalog/redact.go`:
- Around line 8-17: The secretPatterns list currently omits modern GitHub
fine-grained PATs (e.g., "github_pat_...") because the gh[pousr]_* regex only
matches legacy prefixes; update internal/modelcatalog/redact.go by adding a
clarifying comment above the secretPatterns variable (and optionally next to the
gh[pousr]_[A-Za-z0-9_]{8,} entry) that documents the intended scope and known
gaps (specifically noting `github_pat_` tokens) so future contributors know to
extend secretPatterns or add a new regexp to cover fine-grained PATs; reference
the secretPatterns variable and the gh[pousr]_ regex when making this comment.

In `@internal/session/manager_start.go`:
- Around line 387-404: The validateRuntimeOverrides function currently accepts
an unused aghconfig.ResolvedAgent parameter; either remove that parameter from
the signature of validateRuntimeOverrides and update any callers to match, or
keep it if planned for future use but stop using the blank identifier: rename
the parameter to something like resolvedAgent or add a short comment above the
function explaining it’s reserved for future validation so it’s not confusing to
reviewers; ensure you update all call sites of validateRuntimeOverrides (or
their invocations) to match the new signature if you remove the parameter.

In `@internal/settings/service_test.go`:
- Around line 846-864: After clearing provider models in the test that calls
service.PutCollectionItem (CollectionItemPutRequest with ProviderSettings), add
an assertion that the raw config payload (configPayload read from
homePaths.ConfigFile) does not contain the empty table header for
providers.custom.models; e.g. check that neither `[[providers.custom.models]]`
nor `[providers.custom.models]` appears and fail the test if either is found so
we ensure the writer removes the empty table itself in addition to nested keys.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 75e1e4ff-1175-4ed3-b06d-4ab6776caf92

📥 Commits

Reviewing files that changed from the base of the PR and between d7b2f66 and 7966bfb.

⛔ Files ignored due to path filters (27)
  • config.toml is excluded by !**/*.toml
  • go.sum is excluded by !**/*.sum, !**/*.sum
  • internal/AGENTS.md is excluded by !**/*.md
  • internal/CLAUDE.md is excluded by !**/*.md
  • internal/testutil/acpmock/testdata/browser_session_lifecycle_fixture.json is excluded by !**/*.json
  • openapi/agh.json is excluded by !**/*.json
  • packages/site/content/runtime/api-reference/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/memory/extractor/replay.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/reset.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/provider/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/provider/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/provider/models/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/provider/models/list.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/provider/models/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/provider/models/refresh.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/provider/models/status.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/session/new.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/agents/definitions.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/agents/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/core/agents/model-catalog.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/agents/providers.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/configuration/agent-md.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/configuration/config-toml.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/extensions/develop.mdx is excluded by !**/*.mdx
  • sdk/typescript/src/generated/contracts.ts is excluded by !**/generated/**
  • web/e2e/fixtures/__tests__/runtime-seed.test.ts is excluded by !**/fixtures/**
  • web/src/generated/agh-openapi.d.ts is excluded by !**/generated/**
📒 Files selected for processing (184)
  • go.mod
  • internal/acp/client.go
  • internal/acp/client_test.go
  • internal/acp/config_options.go
  • internal/acp/config_options_test.go
  • internal/acp/handlers.go
  • internal/acp/handlers_test.go
  • internal/acp/permission.go
  • internal/acp/process_tree_test.go
  • internal/acp/types.go
  • internal/acp/types_test.go
  • internal/api/contract/contract.go
  • internal/api/contract/contract_test.go
  • internal/api/contract/settings.go
  • internal/api/core/conversions.go
  • internal/api/core/conversions_parsers_test.go
  • internal/api/core/errors.go
  • internal/api/core/handlers.go
  • internal/api/core/interfaces.go
  • internal/api/core/memory_workspace_test.go
  • internal/api/core/model_catalog.go
  • internal/api/core/model_catalog_conversions.go
  • internal/api/core/model_catalog_test.go
  • internal/api/core/session_workspace.go
  • internal/api/core/session_workspace_internal_test.go
  • internal/api/core/settings.go
  • internal/api/core/settings_internal_test.go
  • internal/api/core/settings_test.go
  • internal/api/core/workspaces.go
  • internal/api/httpapi/handlers.go
  • internal/api/httpapi/handlers_test.go
  • internal/api/httpapi/middleware.go
  • internal/api/httpapi/model_catalog_test.go
  • internal/api/httpapi/routes.go
  • internal/api/httpapi/server.go
  • internal/api/httpapi/transport_parity_integration_test.go
  • internal/api/spec/model_catalog.go
  • internal/api/spec/spec.go
  • internal/api/spec/spec_test.go
  • internal/api/testutil/model_catalog_parity_test.go
  • internal/api/udsapi/handlers_test.go
  • internal/api/udsapi/model_catalog_test.go
  • internal/api/udsapi/routes.go
  • internal/api/udsapi/server.go
  • internal/api/udsapi/transport_parity_integration_test.go
  • internal/cli/client.go
  • internal/cli/client_provider_models.go
  • internal/cli/config.go
  • internal/cli/config_test.go
  • internal/cli/helpers_test.go
  • internal/cli/install.go
  • internal/cli/install_test.go
  • internal/cli/provider.go
  • internal/cli/provider_models.go
  • internal/cli/provider_models_test.go
  • internal/cli/session.go
  • internal/config/autonomy.go
  • internal/config/autonomy_test.go
  • internal/config/bootstrap.go
  • internal/config/bootstrap_test.go
  • internal/config/config.go
  • internal/config/config_test.go
  • internal/config/merge.go
  • internal/config/perf_bench_test.go
  • internal/config/persistence_test.go
  • internal/config/provider.go
  • internal/config/provider_test.go
  • internal/config/tool_surface.go
  • internal/daemon/boot.go
  • internal/daemon/daemon.go
  • internal/daemon/daemon_integration_test.go
  • internal/daemon/daemon_nightly_combined_integration_test.go
  • internal/daemon/daemon_sandbox_integration_test.go
  • internal/daemon/model_catalog.go
  • internal/daemon/model_catalog_test.go
  • internal/daemon/tool_approval_bridge.go
  • internal/extension/capability.go
  • internal/extension/capability_models_test.go
  • internal/extension/contract/host_api.go
  • internal/extension/contract/sdk.go
  • internal/extension/host_api.go
  • internal/extension/host_api_models.go
  • internal/extension/host_api_models_test.go
  • internal/extension/manager_model_source_test.go
  • internal/extension/manager_test.go
  • internal/extension/manifest.go
  • internal/extension/manifest_model_source_test.go
  • internal/extension/model_source.go
  • internal/extension/model_source_test.go
  • internal/extension/protocol/host_api.go
  • internal/extension/protocol/host_api_test.go
  • internal/extension/tool_runtime.go
  • internal/modelcatalog/errors.go
  • internal/modelcatalog/hardcut_residue_test.go
  • internal/modelcatalog/live_sources.go
  • internal/modelcatalog/live_sources_test.go
  • internal/modelcatalog/merge.go
  • internal/modelcatalog/modelsdev.go
  • internal/modelcatalog/modelsdev_test.go
  • internal/modelcatalog/redact.go
  • internal/modelcatalog/redact_test.go
  • internal/modelcatalog/service.go
  • internal/modelcatalog/service_integration_test.go
  • internal/modelcatalog/service_test.go
  • internal/modelcatalog/source_id.go
  • internal/modelcatalog/sources.go
  • internal/modelcatalog/sources_test.go
  • internal/modelcatalog/types.go
  • internal/sandbox/daytona/provider_test.go
  • internal/session/interfaces.go
  • internal/session/manager.go
  • internal/session/manager_start.go
  • internal/session/manager_test.go
  • internal/session/query.go
  • internal/session/query_test.go
  • internal/session/runtime_overrides.go
  • internal/session/session.go
  • internal/settings/collections.go
  • internal/settings/models.go
  • internal/settings/service_test.go
  • internal/situation/service.go
  • internal/store/globaldb/global_db.go
  • internal/store/globaldb/global_db_heartbeat_test.go
  • internal/store/globaldb/global_db_model_catalog.go
  • internal/store/globaldb/global_db_model_catalog_test.go
  • internal/store/globaldb/global_db_network_conversations_test.go
  • internal/store/globaldb/global_db_soul_test.go
  • internal/store/globaldb/global_db_test.go
  • internal/store/globaldb/migrate_model_catalog.go
  • internal/store/globaldb/schema_model_catalog.go
  • internal/store/types.go
  • internal/testutil/acpmock/cmd/acpmock-driver/main.go
  • internal/testutil/acpmock/cmd/acpmock-driver/main_test.go
  • internal/testutil/acpmock/fixture.go
  • internal/testutil/e2e/config_seed_test.go
  • internal/testutil/e2e/runtime_harness_integration_test.go
  • internal/workspace/clone.go
  • internal/workspace/resolver_test.go
  • magefile.go
  • packages/site/lib/__tests__/provider-model-catalog-docs.test.ts
  • packages/site/lib/__tests__/runtime-manual-api-routes.test.ts
  • packages/site/lib/runtime-navigation.ts
  • packages/site/scripts/generate-openapi.ts
  • packages/ui/src/components/metric.tsx
  • web/e2e/__tests__/session-provider-override.spec.ts
  • web/src/hooks/routes/__tests__/use-app-layout.test.tsx
  • web/src/hooks/routes/__tests__/use-settings-providers-page.test.tsx
  • web/src/hooks/routes/use-settings-providers-page.ts
  • web/src/routes/_app.tsx
  • web/src/routes/_app/settings/__tests__/-providers.test.tsx
  • web/src/routes/_app/settings/providers.tsx
  • web/src/systems/agent/components/agent-sessions-list.tsx
  • web/src/systems/automation/components/automation-run-history.tsx
  • web/src/systems/knowledge/components/knowledge-delete-dialog.tsx
  • web/src/systems/knowledge/components/knowledge-edit-dialog.tsx
  • web/src/systems/model-catalog/__tests__/derive-active-session-options.test.ts
  • web/src/systems/model-catalog/adapters/model-catalog-api.ts
  • web/src/systems/model-catalog/hooks/use-provider-models.ts
  • web/src/systems/model-catalog/hooks/use-refresh-provider-models.ts
  • web/src/systems/model-catalog/index.ts
  • web/src/systems/model-catalog/lib/derive-active-session-options.ts
  • web/src/systems/model-catalog/lib/query-keys.ts
  • web/src/systems/model-catalog/lib/query-options.ts
  • web/src/systems/model-catalog/types.ts
  • web/src/systems/network/components/shell/inspector-activity-feed.tsx
  • web/src/systems/network/components/shell/inspector-members-list.tsx
  • web/src/systems/network/components/work/work-inspector.tsx
  • web/src/systems/session/components/__tests__/session-create-dialog.test.tsx
  • web/src/systems/session/components/model-command-select.tsx
  • web/src/systems/session/components/reasoning-command-select.tsx
  • web/src/systems/session/components/session-create-dialog.tsx
  • web/src/systems/session/hooks/__tests__/use-session-create-dialog.test.tsx
  • web/src/systems/session/hooks/use-session-create-dialog.ts
  • web/src/systems/settings/adapters/__tests__/settings-api.test.ts
  • web/src/systems/settings/components/index.ts
  • web/src/systems/settings/components/provider-card.tsx
  • web/src/systems/settings/components/provider-model-catalog-status.tsx
  • web/src/systems/settings/components/settings-page-shell.tsx
  • web/src/systems/settings/mocks/fixtures.ts
  • web/src/systems/skill/components/skill-detail-panel.tsx
  • web/src/systems/workspace/components/provider-command-list.tsx
  • web/src/systems/workspace/components/provider-command-select.tsx
  • web/src/systems/workspace/index.ts
  • web/src/systems/workspace/mocks/fixtures.ts

Comment thread internal/acp/client.go
Comment thread internal/api/core/conversions_parsers_test.go
Comment thread internal/api/httpapi/model_catalog_test.go
Comment thread internal/api/udsapi/model_catalog_test.go Outdated
Comment thread internal/cli/install_test.go
Comment thread internal/modelcatalog/sources.go
Comment thread internal/settings/collections.go
Comment thread internal/store/globaldb/global_db_model_catalog.go Outdated
Comment thread internal/store/globaldb/global_db_test.go
Comment thread internal/store/globaldb/global_db.go Outdated

@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: 15

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/acp/client.go (1)

892-925: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Close cancellationDone on prompt-build failures.

If buildWirePromptRequest fails, this function returns before cancellationDone is closed, so the cancellation goroutine stays blocked until the parent context is canceled. Repeated prompt-build failures will leak goroutines on long-lived session contexts.

Suggested fix
 	cancellationDone := make(chan struct{})
 	go func() {
 		select {
 		case <-ctx.Done():
 			if strings.TrimSpace(proc.SessionID) != "" {
@@
 		case <-cancellationDone:
 		}
 	}()
+	defer close(cancellationDone)
 
 	promptRequest, err := buildWirePromptRequest(proc, req)
 	if err != nil {
 		emitPromptBuildError(proc, req, err)
 		return
 	}
@@
 	response, err := acpsdk.SendRequest[wirePromptResponse](
 		proc.conn,
 		ctx,
 		acpsdk.AgentMethodSessionPrompt,
 		promptRequest,
 	)
-	close(cancellationDone)
 
 	if err != nil {
🤖 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/acp/client.go` around lines 892 - 925, The goroutine waiting on
cancellationDone can leak because buildWirePromptRequest returns early without
closing cancellationDone; ensure cancellationDone is closed before every early
return path: after buildWirePromptRequest returns an error (in the block that
calls emitPromptBuildError and returns) close the cancellationDone channel (or
signal the goroutine) so the anonymous goroutine waiting on cancellationDone
exits; locate cancellationDone, the anonymous goroutine that sends the session
cancel notification, buildWirePromptRequest, and emitPromptBuildError to
implement the close/signal prior to returning on error.
🟡 Minor comments (8)
internal/store/globaldb/global_db_network_conversations_test.go-221-230 (1)

221-230: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add explicit length check before comparison loop.

The sibling subtest at lines 267-269 guards the comparison loop with an explicit length check, but this new subtest does not. If secondRecords is shorter than firstRecords due to a regression, the test would panic on index out of bounds instead of producing a clear assertion failure.

🛡️ Proposed fix
 			}
+			if got, want := len(secondRecords), len(firstRecords); got != want {
+				t.Fatalf("len(secondRecords) = %d, want %d", got, want)
+			}
 			for index, firstRecord := range firstRecords {
🤖 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_network_conversations_test.go` around lines
221 - 230, Add an explicit length assertion before iterating over firstRecords
to compare AppliedAt; check len(secondRecords) == len(firstRecords) and call
t.Fatalf with both lengths if they differ, then proceed with the existing loop
that compares firstRecords[index].AppliedAt to secondRecords[index].AppliedAt
(symbols: firstRecords, secondRecords, AppliedAt).
internal/modelcatalog/types.go-156-156 (1)

156-156: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use the declared enum types for state fields instead of raw strings.

Model.AvailabilityState and SourceStatus.RefreshState are currently string, which bypasses the type guarantees provided by AvailabilityState and RefreshState.

Suggested fix
 type Model struct {
@@
-	AvailabilityState      string
+	AvailabilityState      AvailabilityState
@@
 }

 type SourceStatus struct {
@@
-	RefreshState string
+	RefreshState RefreshState
@@
 }

Also applies to: 181-181

🤖 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/modelcatalog/types.go` at line 156, The fields currently declared as
raw strings should use the declared enum types: change the Model struct's
AvailabilityState field from string to the AvailabilityState type and change
SourceStatus.RefreshState from string to the RefreshState type (preserving
existing JSON tags and zero-value handling); update any constructors,
unmarshalling or assignments that treat these fields as plain strings to use or
convert to the enum types (e.g., use AvailabilityState("...") or a helper parse
function where needed) so the compiler enforces valid enum values for
Model.AvailabilityState and SourceStatus.RefreshState.
internal/modelcatalog/source_id.go-12-23 (1)

12-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Reject whitespace-padded source IDs.

ValidateSourceID trims before validating, so values like " builtin " or "extension:demo " pass even though callers still retain the padded string. Since source IDs are used as exact identities, that lets a non-canonical value validate and then miss equality/map lookups later. Reject surrounding whitespace here, or expose a normalize-and-validate helper instead. Based on learnings "User-visible runtime capabilities in Go backend must expose stable machine-readable control surfaces."

Suggested fix
 func ValidateSourceID(sourceID string) error {
 	trimmed := strings.TrimSpace(sourceID)
+	if trimmed != sourceID {
+		return fmt.Errorf("model catalog source id %q must not contain surrounding whitespace", sourceID)
+	}
 	if trimmed == "" {
 		return fmt.Errorf("model catalog source id is required")
 	}
🤖 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/modelcatalog/source_id.go` around lines 12 - 23, ValidateSourceID
currently trims input which allows whitespace-padded IDs to validate; change it
to reject surrounding whitespace instead: in ValidateSourceID compare the
original sourceID to strings.TrimSpace(sourceID) and if they differ return an
error like "model catalog source id must not contain leading or trailing
whitespace"; then continue validation using the trimmed value (and keep the
existing staticSourceKind(trimmed) and strings.Cut(trimmed, ":") checks). This
preserves exact identity semantics while still validating normalized content.
internal/api/core/conversions_parsers_test.go-34-35 (1)

34-35: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Exercise normalization, not just pass-through.

The new assertions use already-trimmed "gpt-test" / "high" values, so they won't fail if SessionPayloadFromInfo stops trimming these fields. Seed whitespace here and keep the current expected assertions to cover the conversion behavior end-to-end.

Suggested test tweak
-		Model:           "gpt-test",
-		ReasoningEffort: "high",
+		Model:           " gpt-test ",
+		ReasoningEffort: " high ",
🤖 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/conversions_parsers_test.go` around lines 34 - 35, The test
currently uses already-trimmed values for Model and ReasoningEffort so it
doesn't verify normalization; update the test vector passed into
SessionPayloadFromInfo to include leading/trailing whitespace for the Model and
ReasoningEffort fields (e.g. " gpt-test " and " high ") while keeping the
expected assertions as the trimmed values ("gpt-test", "high") so the test
exercises trimming/normalization behavior of SessionPayloadFromInfo.
internal/api/contract/contract_test.go-107-117 (1)

107-117: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Assert the serialized config option values too.

The new JSON-shape check only verifies id, kind, and current. If config_options[0].values is dropped or mis-encoded, this test still passes even though the selector becomes unusable to clients.

Suggested assertion
 		if configOption["id"] != "model" || configOption["kind"] != "select" || configOption["current"] != "gpt-test" {
 			t.Fatalf("config option JSON = %#v", configOption)
 		}
+		values, ok := configOption["values"].([]any)
+		if !ok || len(values) != 1 {
+			t.Fatalf("config option values = %#v", configOption["values"])
+		}
🤖 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/contract/contract_test.go` around lines 107 - 117, The test
currently checks acpCaps -> config_options -> configOption for id/kind/current
but doesn't assert configOption["values"]; update the test (around
configOptions/configOption) to assert that configOption["values"] exists, is a
[]any, has at least one element, and that at least one element (each element
cast to map[string]any) contains the expected option fields (e.g., "id" and
"name") and that one element's "id" equals "gpt-test" so the selector values are
present and correctly serialized.
internal/api/udsapi/model_catalog_test.go-64-67 (1)

64-67: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Assert 404 response body, not only status code.

Line 64-Line 67 validates only the code; add a body assertion to make the route contract explicit.

Proposed test hardening
 		recorder := performRequest(t, engine, http.MethodGet, "/api/openai/v1/models", nil)
 		if recorder.Code != http.StatusNotFound {
 			t.Fatalf("status = %d, want 404; body=%s", recorder.Code, recorder.Body.String())
 		}
+		if body := recorder.Body.String(); body == "" {
+			t.Fatal("body = empty, want 404 response body")
+		}
 	})
 }
As per coding guidelines: "`**/*_test.go`: Always assert both HTTP status code AND response body in tests; status-code-only assertions are insufficient."
🤖 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/udsapi/model_catalog_test.go` around lines 64 - 67, The test
only checks the status code from performRequest(t, engine, http.MethodGet,
"/api/openai/v1/models")—add an assertion on recorder.Body to verify the
response body content as well (for example check JSON error shape or exact error
message expected by the route) so the route contract is explicit; update the
test after the existing StatusNotFound check to decode/inspect
recorder.Body.String() (or unmarshal if JSON) and assert it matches the expected
error payload/message.
internal/modelcatalog/modelsdev_test.go-173-195 (1)

173-195: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Assert the timeout failure itself, not just “some fast error.”

Any early failure would pass this test today, including validation or parsing bugs before the request is even made. Please verify that the returned error is actually a timeout.

Suggested change
 		if err == nil {
 			t.Fatal("ListModels(timeout) error = nil, want timeout error")
 		}
+		var timeoutErr interface{ Timeout() bool }
+		if !errors.As(err, &timeoutErr) || !timeoutErr.Timeout() {
+			t.Fatalf("ListModels(timeout) error = %v, want timeout error", err)
+		}
 		if elapsed >= 150*time.Millisecond {
 			t.Fatalf("elapsed = %s, want timeout before server sleep completes", elapsed)
 		}

As per coding guidelines: MUST have specific error assertions (ErrorContains, ErrorAs).

🤖 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/modelcatalog/modelsdev_test.go` around lines 173 - 195, The test
currently only checks that an error occurred; instead assert it's a timeout by
inspecting the returned error from source.ListModels: replace the generic
nil-check with a targeted assertion that the error is a timeout (e.g. use
errors.Is(err, context.DeadlineExceeded) or testutil.ErrorContains(t, err,
"Client.Timeout") / testutil.ErrorAs(t, &context.DeadlineExceeded, err)
depending on available helpers). Keep the rest of the timing assertion but
ensure the error check explicitly verifies a timeout came from the HTTP request
made by ListModels (reference the test's call to source.ListModels, the
ListOptions passed, and the surrounding test "Should apply explicit HTTP
timeout").
internal/cli/client_provider_models.go-55-77 (1)

55-77: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Reject blank provider IDs on provider-scoped model endpoints.

RefreshProviderModels and ProviderModelStatus currently turn an empty providerID into /api/providers/models/refresh or /api/providers/models/status. That converts a caller bug into a misleading route failure instead of returning a clear client-side error.

Suggested fix
 package cli
 
 import (
 	"context"
+	"errors"
 	"net/http"
 	"net/url"
 	"strings"
@@
 func (c *unixSocketClient) RefreshProviderModels(
 	ctx context.Context,
 	providerID string,
 	request ProviderModelRefreshRequest,
 ) (ProviderModelRefreshRecord, error) {
+	if strings.TrimSpace(providerID) == "" {
+		return ProviderModelRefreshRecord{}, errors.New("cli: provider id is required")
+	}
 	path := providerModelsPath(providerID, "refresh")
 	var response ProviderModelRefreshRecord
 	if err := c.doJSON(ctx, http.MethodPost, path, nil, request, &response); err != nil {
 		return ProviderModelRefreshRecord{}, err
 	}
@@
 func (c *unixSocketClient) ProviderModelStatus(
 	ctx context.Context,
 	providerID string,
 ) (ProviderModelStatusRecord, error) {
+	if strings.TrimSpace(providerID) == "" {
+		return ProviderModelStatusRecord{}, errors.New("cli: provider id is required")
+	}
 	path := providerModelsPath(providerID, "status")
 	var response ProviderModelStatusRecord
 	if err := c.doJSON(ctx, http.MethodGet, path, nil, nil, &response); err != nil {
 		return ProviderModelStatusRecord{}, 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/cli/client_provider_models.go` around lines 55 - 77, Validate that
providerID is non-empty in RefreshProviderModels and ProviderModelStatus before
calling providerModelsPath or c.doJSON; if providerID is empty or only
whitespace return a clear client-side error (e.g., fmt.Errorf("providerID
required")) so the method fails fast and does not construct routes like
"/api/providers/models/refresh"/"status"; update both
unixSocketClient.RefreshProviderModels and unixSocketClient.ProviderModelStatus
to perform this check (use strings.TrimSpace(providerID) to catch
whitespace-only values) and return the error instead of proceeding to
providerModelsPath/doJSON.
🧹 Nitpick comments (9)
internal/api/core/session_workspace_internal_test.go (1)

43-44: ⚡ Quick win

Rename subtest to the required Should ... form.

Line 43 currently uses "validate create session runtime overrides"; please rename to Should ... to match enforced test naming conventions.

Proposed change
-	t.Run("validate create session runtime overrides", func(t *testing.T) {
+	t.Run("Should validate create session runtime overrides", func(t *testing.T) {

As per coding guidelines **/*_test.go: Use t.Run('Should ...') pattern for Go test subtests instead of flat test structures.

🤖 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_workspace_internal_test.go` around lines 43 - 44,
Rename the subtest name passed to t.Run from "validate create session runtime
overrides" to follow the required "Should ..." pattern (for example "Should
validate create session runtime overrides") so update the t.Run(...) string in
the test (the subtest created in the Test function that calls t.Run and
t.Parallel) accordingly to match the enforced naming convention.
internal/extension/manager_model_source_test.go (1)

72-74: ⚡ Quick win

Assert the denied error explicitly.

err == nil is too broad and can hide wrong failure paths. Assert the expected denied error text/sentinel.

Proposed test tightening
 import (
+	"strings"
 	"testing"
@@
 		_, err := manager.ListModelSourceRows(
 			testutil.Context(t),
 			"ext-no-models",
 			extensioncontract.ModelSourceListParams{ProviderID: "codex"},
 		)
-		if err == nil {
-			t.Fatal("ListModelSourceRows() error = nil, want denied service method")
+		if err == nil || !strings.Contains(err.Error(), "denied") {
+			t.Fatalf("ListModelSourceRows() error = %v, want denied service method", err)
 		}
 	})
 }

As per coding guidelines "MUST have specific error assertions (ErrorContains, ErrorAs)".

🤖 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/extension/manager_model_source_test.go` around lines 72 - 74, The
test currently only checks err == nil after calling ListModelSourceRows(), which
is too broad; replace that check with a specific assertion that the error is the
expected "denied" error: call ListModelSourceRows() and assert err is not nil
and either errors.Is(err, ErrDeniedServiceMethod) (if you have a sentinel
ErrDeniedServiceMethod) or assert that err.Error() contains "denied service
method" (or use require.ErrorContains/Assert.ErrorContains from your test
helper) so the test explicitly verifies the denied-service error path.
internal/extension/capability_models_test.go (1)

86-95: ⚡ Quick win

Split per-method denials into subtests for clearer failures.

Line 86-Line 95 currently checks three methods in one loop. Converting each iteration into a t.Run("Should ...") gives isolated failures and aligns with your test-case convention.

Proposed refactor
-		for _, method := range []string{"models/list", "models/refresh", "models/status"} {
-			err := checker.CheckHostAPI("ext", method)
-			if err == nil {
-				t.Fatalf("CheckHostAPI(%q) error = nil, want capability denied", method)
-			}
-			var denied *ErrCapabilityDenied
-			if !errors.As(err, &denied) {
-				t.Fatalf("CheckHostAPI(%q) error = %T, want *ErrCapabilityDenied", method, err)
-			}
-		}
+		for _, method := range []string{"models/list", "models/refresh", "models/status"} {
+			method := method
+			t.Run("Should deny "+method+" for marketplace tier", func(t *testing.T) {
+				t.Parallel()
+				err := checker.CheckHostAPI("ext", method)
+				if err == nil {
+					t.Fatalf("CheckHostAPI(%q) error = nil, want capability denied", method)
+				}
+				var denied *ErrCapabilityDenied
+				if !errors.As(err, &denied) {
+					t.Fatalf("CheckHostAPI(%q) error = %T, want *ErrCapabilityDenied", method, err)
+				}
+			})
+		}
As per coding guidelines: "`**/*_test.go`: Use `t.Run('Should ...')` pattern for Go test subtests instead of flat test structures."
🤖 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/extension/capability_models_test.go` around lines 86 - 95, Refactor
the loop that asserts denial for "models/list", "models/refresh",
"models/status" into individual subtests using t.Run so failures are isolated;
for each method call checker.CheckHostAPI("ext", method) create a
t.Run(fmt.Sprintf("Should deny %s", method), func(t *testing.T) { ... }) body
that asserts err is non-nil and that errors.As(err, &denied) yields a
*ErrCapabilityDenied (use the same checker.CheckHostAPI and ErrCapabilityDenied
symbols), keeping the existing assertion logic inside each subtest.
internal/session/manager_start.go (1)

387-404: 💤 Low value

Consider removing the unused resolved parameter.

The validateRuntimeOverrides method accepts resolved aghconfig.ResolvedAgent but uses _ to ignore it. The validation operates solely on sessionStartSpec fields. If this parameter isn't needed for future validation logic, removing it would simplify the signature.

Optional: Remove unused parameter
-func (s *sessionStartSpec) validateRuntimeOverrides(_ aghconfig.ResolvedAgent) error {
+func (s *sessionStartSpec) validateRuntimeOverrides() error {

And at the call site (line 371):

-	if err := spec.validateRuntimeOverrides(resolved); err != nil {
+	if err := spec.validateRuntimeOverrides(); err != nil {
🤖 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/session/manager_start.go` around lines 387 - 404, The function
validateRuntimeOverrides currently accepts an unused parameter resolved of type
aghconfig.ResolvedAgent; remove that parameter from the validateRuntimeOverrides
signature and from all call sites (e.g., where validateRuntimeOverrides is
invoked around the former line 371) so the method only uses s
(sessionStartSpec); update any tests or callers to stop passing the resolved
argument and ensure compilation by adjusting imports/signatures accordingly.
internal/acp/config_options_test.go (1)

85-139: ⚡ Quick win

Wrap these cases in t.Run("Should ...") subtests.

The file switches back to flat top-level assertions here, which makes failures coarser than the repo’s test convention. Breaking the matching and legacy-state checks into named subtests will keep failures targeted and consistent with the rest of the suite.

As per coding guidelines: MUST use t.Run("Should...") pattern for ALL test cases.

🤖 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/acp/config_options_test.go` around lines 85 - 139, Tests in
TestConfigOptionMatching and TestLegacyModelStateAllows use flat assertions;
wrap each logical assertion group into t.Run("Should ...") subtests to follow
the repo convention. For TestConfigOptionMatching, create named subtests around
the model/effort discovery checks (calling findModelConfigOption and
findReasoningConfigOption) and the configOptionAllowsValue assertions
(advertised model, unadvertised model, boolean-as-select rejection). For
TestLegacyModelStateAllows, wrap the legacyModelStateAllows positive/negative
checks and the CloneCaps equality check into separate t.Run("Should ...")
subtests. Move the existing assertions into those subtests and leave the test
helper calls and variables (options, caps) in the parent test as needed.
internal/modelcatalog/sources.go (1)

160-166: ⚡ Quick win

Deep-copy the curated model data here.

maps.Copy only duplicates the map header. ProviderConfig.Models.Curated still shares the caller's backing array, so post-construction config edits can bleed into ListModels() and make this source stop behaving like a stable snapshot.

Based on learnings: Keep execution paths deterministic and observable in Go backend.

🤖 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/modelcatalog/sources.go` around lines 160 - 166, The
cloneConfigProviders function currently uses maps.Copy which leaves slice
backing arrays shared; replace it with an explicit loop over src (in
cloneConfigProviders) that copies each aghconfig.ProviderConfig value into the
new map and, for each config, deep-copy the Models.Curated slice (e.g., allocate
a new slice and copy elements) so the cloned ProviderConfig.Models.Curated does
not share the caller's backing array; ensure you still handle nil src by
returning an empty map.
internal/config/provider.go (2)

1163-1174: 💤 Low value

Consider using explicit scheme constants for clarity.

Using string(MCPServerTransportHTTP) as the HTTP scheme works because the constant happens to equal "http", but this couples URL validation to MCP transport terminology. Consider using explicit "http" and "https" strings or defining separate URL scheme constants.

Suggested fix
+const (
+	urlSchemeHTTP  = "http"
+	urlSchemeHTTPS = "https"
+)
+
 func validateAbsoluteHTTPURL(path string, raw string) error {
 	parsed, err := url.Parse(strings.TrimSpace(raw))
 	if err != nil || parsed.Scheme == "" || parsed.Host == "" {
 		return fmt.Errorf("%s must be an absolute HTTP(S) URL", path)
 	}
 	switch parsed.Scheme {
-	case string(MCPServerTransportHTTP), urlSchemeHTTPS:
+	case urlSchemeHTTP, urlSchemeHTTPS:
 		return nil
 	default:
 		return fmt.Errorf("%s must be an absolute HTTP(S) URL", path)
 	}
 }
🤖 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/provider.go` around lines 1163 - 1174, The URL validation in
validateAbsoluteHTTPURL currently uses string(MCPServerTransportHTTP) which
couples URL schemes to MCP transport names; change the comparison to use
explicit HTTP scheme constants (either replace string(MCPServerTransportHTTP)
with the literal "http" or define a new constant like urlSchemeHTTP = "http")
and update the switch (which already references urlSchemeHTTPS) to use
urlSchemeHTTP and urlSchemeHTTPS so the function validates against standard URL
scheme strings rather than transport-specific symbols.

1152-1161: 💤 Low value

Consider including the parse error in the validation message for debugging.

When time.ParseDuration fails, the original error contains useful information about what was wrong with the input. Wrapping it with %w would help operators debug malformed duration strings.

Suggested fix
 func validatePositiveDuration(path string, raw string) error {
 	duration, err := time.ParseDuration(strings.TrimSpace(raw))
 	if err != nil {
-		return fmt.Errorf("%s must be a positive duration", path)
+		return fmt.Errorf("%s must be a positive duration: %w", path, err)
 	}
 	if duration <= 0 {
 		return fmt.Errorf("%s must be a positive duration", path)
 	}
 	return nil
 }
🤖 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/provider.go` around lines 1152 - 1161, The
validatePositiveDuration function returns a generic error when
time.ParseDuration fails; modify the error path in validatePositiveDuration to
wrap the original parse error (from time.ParseDuration) using fmt.Errorf with %w
so the returned error includes the underlying parse error details (retain the
existing "%s must be a positive duration" message while wrapping err), and
ensure other logic (duration <= 0) remains unchanged.
internal/extension/model_source.go (1)

220-222: 💤 Low value

Calling .UTC() on potentially zero ExpiresAt may produce misleading timestamps.

When row.ExpiresAt is zero (i.e., the extension didn't provide an expiration), calling .UTC() on it returns 0001-01-01 00:00:00 +0000 UTC rather than preserving zero-value semantics. Consider guarding this similar to the RefreshedAt handling at lines 208-211.

Suggested fix
 	refreshedAt := row.RefreshedAt
 	if refreshedAt.IsZero() {
 		refreshedAt = now
 	}
+	expiresAt := row.ExpiresAt
+	if !expiresAt.IsZero() {
+		expiresAt = expiresAt.UTC()
+	}
 	modelRow := modelcatalog.ModelRow{
 		...
-		ExpiresAt:              row.ExpiresAt.UTC(),
+		ExpiresAt:              expiresAt,
 		...
 	}
🤖 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/extension/model_source.go` around lines 220 - 222, The code
currently calls row.ExpiresAt.UTC() which converts a zero time to the 0001-01-01
UTC timestamp; instead, mirror the RefreshedAt handling and guard ExpiresAt: if
row.ExpiresAt.IsZero() set the ExpiresAt field to the zero time value, otherwise
set it to row.ExpiresAt.UTC(); update the struct assignment that sets ExpiresAt
(near Stale/RefreshedAt/ExpiresAt) to perform this conditional check so zero
semantics are preserved.
🤖 Prompt for all review comments with 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.

Inline comments:
In `@internal/acp/client.go`:
- Around line 544-553: The code currently treats any non-empty
caps.ConfigOptions as requiring config-option-based model selection which causes
valid preferredModel to error when no model option is present; change the logic
to call findModelConfigOption(caps.ConfigOptions) first and only take the
config-option path when it returns ok, then validate with
configOptionAllowsValue and call d.applySessionConfigOption; otherwise fall back
to the legacy session/setModel flow (i.e., do not return an error from this
branch if no model config option is found).

In `@internal/acp/types_test.go`:
- Around line 47-75: Wrap the existing test body inside a t.Run subtest named
using the "Should ..." pattern (e.g., t.Run("Should clone config options without
leaking mutations", func(t *testing.T) { ... })), move the current t.Parallel()
call into that subtest (call t.Parallel() as the first line of the subtest), and
keep the rest of the logic intact (creating proc, calling proc.setCaps, first :=
proc.CapsSnapshot(), mutating first, second := proc.CapsSnapshot(), assertions,
proc.setConfigOptions, updated := proc.CapsSnapshot(), final assertion). Ensure
the top-level TestAgentProcessCapsSnapshotClonesConfigOptions function now only
calls t.Run with the described subtest so the test follows the required "Should
..." subtest pattern.

In `@internal/api/testutil/model_catalog_parity_test.go`:
- Around line 62-85: Duplicate the existing OpenAI projection test that calls
performParityRequest against httpEngine for the
"/api/openai/v1/models?provider_id=codex" endpoint and run the identical
assertions against udsEngine: call performParityRequest(t, udsEngine,
http.MethodGet, "/api/openai/v1/models?provider_id=codex"), verify the response
code is http.StatusOK, unmarshal into contract.OpenAIModelListResponse, assert
len(Data) == 1, then compare the returned openAIModel (the Data[0]) to the same
nativeModel (cliRecord.Models[0]) using the same identity checks (ID == ModelID,
OwnedBy == ProviderID, AGH.ProviderID == ProviderID, AGH.ModelID == ModelID) so
the UDS routing/payload path is covered end-to-end.
- Around line 152-168: The helper newShortParityHomePaths hardcodes /tmp with
os.MkdirTemp which breaks on Windows; replace the os.MkdirTemp and manual
cleanup with t.TempDir() (e.g. root := t.TempDir()), remove the explicit
t.Cleanup RemoveAll block, then call aghconfig.ResolveHomePathsFrom(root) as
before and keep t.Fatalf on error so newShortParityHomePaths uses the portable
temp directory provided by the test framework.

In `@internal/modelcatalog/hardcut_residue_test.go`:
- Around line 101-119: The test iterates with bufio.NewScanner (scanner) over
files under packages/site/public/images/ and currently skipResidueGuardFile is
not excluding binary assets, which causes ErrTooLong on PNGs; update
skipResidueGuardFile (or add a new isBinaryOrLargeFile check invoked before
creating scanner) to skip common non-text files (e.g.,
.png/.jpg/.gif/.webp/.ico/.svg? if treated binary) and/or files larger than a
threshold, or else perform a quick binary-detection (read first N bytes and skip
if NULs or high non-printable ratio) before calling scanner; ensure the test
still runs allowedProviderModelResidue and fields checks only on text files and
append to residues unchanged for scanned files.

In `@internal/modelcatalog/modelsdev.go`:
- Around line 59-65: Reject injected http.Clients that lack an explicit timeout:
in WithModelsDevHTTPClient ensure you only assign client if client != nil &&
client.Timeout > 0 (do not accept zero-timeout clients), and in the
ModelsDevSource constructor (after applying all ModelsDevSourceOption funcs)
validate that source.client is non-nil and source.client.Timeout > 0 and return
an error if not; apply the same timeout>0 guard for the other option functions
noted around lines 91-96 so no option can remove the required outbound timeout.

In `@internal/modelcatalog/redact.go`:
- Around line 15-16: The current redaction regex in redact.go only matches
key=value pairs and misses key: value forms; update the pattern used (the regex
literal that currently contains api[_-]?key|auth[_-]?token|... followed by
=([^&\s]+)) to also accept colon separators and optional whitespace (e.g., match
`:` or `=` with possible spaces) so keyed secrets like `api_key: secret` are
redacted; apply the same change to the sibling regex entries in the same file
that handle keyed secrets (the other patterns around the listed token/secret
names) so all colon-delimited forms are covered.

In `@internal/modelcatalog/service.go`:
- Around line 81-85: The code currently forces listOpts.IncludeAll = true before
calling s.store.ListRows, which overrides the caller's stale filter and prevents
opts.IncludeStale from taking effect; change the logic in
CatalogService.ListModels so you only set listOpts.Now = defaultNow(opts.Now)
(preserve the copy of opts as listOpts) and do NOT overwrite IncludeAll, or
explicitly set listOpts.IncludeAll = opts.IncludeStale if you need clarity, then
call s.store.ListRows with that listOpts so the store's stale-row predicate
respects the caller's intent.
- Around line 119-127: The global-refresh path currently forces
providerKey="__all__" (via refreshFlightScopeKey) which bypasses per-provider
coalescing and the sourceHasFreshStatus checks, so global refreshes can run
concurrently with provider-scoped refreshes and re-fetch fresh data; change the
coalescing key and refresh logic so global refreshes still honor
per-provider/source flight keys and freshness checks: when handling a global
refresh in the code around providerKey/refreshFlightScopeKey/withRefreshFlight
(and inside refreshSources), generate per-source/provider-scoped flight keys (or
iterate providers and call withRefreshFlight per provider) instead of using a
single "__all__" key, and ensure sourceHasFreshStatus is consulted in
refreshSources for each source/provider path so global refreshes don't skip
freshness/coalescing (see functions refreshFlightScopeKey, withRefreshFlight,
refreshSources, and sourceHasFreshStatus).

In `@internal/settings/collections.go`:
- Around line 1141-1195: providerModelConfigMaps currently serializes every
element of settings.Models.Curated even when model.ID is blank; update
providerModelConfigMaps to skip any model whose strings.TrimSpace(model.ID) ==
"" (i.e., do not create/append entry for that item) so malformed/empty curated
entries are not written into providerModelsSettingsMap and persisted by
putProvider; ensure you still trim model.ID when used and preserve existing
population logic for valid models.

In `@internal/store/globaldb/global_db_model_catalog.go`:
- Around line 113-143: The two separate selects (the QueryContext call that
builds catalogRows and the call to listModelCatalogReasoningEfforts) must run on
the same snapshot; wrap both reads in one read-only transaction or single
connection so they see a consistent snapshot. Change the QueryContext usage to
use a sql.Tx (BeginTx with ReadOnly=true) or a single DB connection and then
call tx.QueryContext/tx.QueryRowContext for the catalog scan
(scanModelCatalogRow) and update listModelCatalogReasoningEfforts to accept the
same executor (tx or conn) instead of g.db so you can call
listModelCatalogReasoningEfforts(ctx, tx, opts); compute the modelCatalogKey and
assign ReasoningEfforts while still inside the transaction, then commit/close
before returning.

In `@internal/store/globaldb/global_db_test.go`:
- Around line 384-427: The helper expectedGlobalMigrationPrefix only asserts a
pinned prefix so tests using assertAppliedGlobalMigrationOrder miss validating
newer migrations; fix by either (A) extending expectedGlobalMigrationPrefix() to
include the current full tail of migration identities (add the missing
version/name/checksum entries) and update any callers to expect the full
sequence, or (B) rename/split the helper (e.g., expectedGlobalMigrationPrefix ->
expectedGlobalMigrationPrefixOnly and create expectedFullGlobalMigrationOrder())
and update assertAppliedGlobalMigrationOrder callers to use the new full-order
helper so tests validate the complete migration identity sequence (refer to
expectedGlobalMigrationPrefix and assertAppliedGlobalMigrationOrder to locate
the change).

In `@internal/store/globaldb/global_db.go`:
- Line 687: Remove the call to modelCatalogSchemaStatements() from the initial
globalSchemaStatements so Version 1's payload is not mutated; instead create a
new migration entry at the end of the registry that contains
modelCatalogSchemaStatements() and append it to whatever slice/registry holds
migrations (the same registry where globalSchemaStatements are registered),
keeping the existing globalSchemaStatements and Version 1 migration intact and
unmodified.

In `@internal/store/globaldb/schema_model_catalog.go`:
- Around line 19-40: Add a foreign key on model_catalog_rows to ensure
(source_id, provider_id) references the parent table model_catalog_sources and
avoid orphan rows: update the CREATE TABLE for model_catalog_rows to include a
FOREIGN KEY (source_id, provider_id) REFERENCES model_catalog_sources(source_id,
provider_id) clause (choose ON DELETE CASCADE if you want child rows removed
when a source is deleted, or ON DELETE RESTRICT to prevent parent deletion while
children exist), and ensure the referenced columns in model_catalog_sources
match types and NOT NULL constraints.

In `@internal/testutil/acpmock/cmd/acpmock-driver/main.go`:
- Around line 35-39: The code stores configOptions on mockAgent causing session
config to leak across sessions; create a per-session state (e.g., sessionState
struct with configOptions field) and a map on mockAgent keyed by sessionID to
hold these states, update NewSession, LoadSession and ResumeSession to allocate
or load the sessionState (populate configOptions from the session data), and
change SetSessionConfigOption to look up and mutate the configOptions inside the
correct sessionState using the provided session ID rather than mutating
mockAgent.configOptions so each session keeps its own config.

---

Outside diff comments:
In `@internal/acp/client.go`:
- Around line 892-925: The goroutine waiting on cancellationDone can leak
because buildWirePromptRequest returns early without closing cancellationDone;
ensure cancellationDone is closed before every early return path: after
buildWirePromptRequest returns an error (in the block that calls
emitPromptBuildError and returns) close the cancellationDone channel (or signal
the goroutine) so the anonymous goroutine waiting on cancellationDone exits;
locate cancellationDone, the anonymous goroutine that sends the session cancel
notification, buildWirePromptRequest, and emitPromptBuildError to implement the
close/signal prior to returning on error.

---

Minor comments:
In `@internal/api/contract/contract_test.go`:
- Around line 107-117: The test currently checks acpCaps -> config_options ->
configOption for id/kind/current but doesn't assert configOption["values"];
update the test (around configOptions/configOption) to assert that
configOption["values"] exists, is a []any, has at least one element, and that at
least one element (each element cast to map[string]any) contains the expected
option fields (e.g., "id" and "name") and that one element's "id" equals
"gpt-test" so the selector values are present and correctly serialized.

In `@internal/api/core/conversions_parsers_test.go`:
- Around line 34-35: The test currently uses already-trimmed values for Model
and ReasoningEffort so it doesn't verify normalization; update the test vector
passed into SessionPayloadFromInfo to include leading/trailing whitespace for
the Model and ReasoningEffort fields (e.g. " gpt-test " and " high ") while
keeping the expected assertions as the trimmed values ("gpt-test", "high") so
the test exercises trimming/normalization behavior of SessionPayloadFromInfo.

In `@internal/api/udsapi/model_catalog_test.go`:
- Around line 64-67: The test only checks the status code from performRequest(t,
engine, http.MethodGet, "/api/openai/v1/models")—add an assertion on
recorder.Body to verify the response body content as well (for example check
JSON error shape or exact error message expected by the route) so the route
contract is explicit; update the test after the existing StatusNotFound check to
decode/inspect recorder.Body.String() (or unmarshal if JSON) and assert it
matches the expected error payload/message.

In `@internal/cli/client_provider_models.go`:
- Around line 55-77: Validate that providerID is non-empty in
RefreshProviderModels and ProviderModelStatus before calling providerModelsPath
or c.doJSON; if providerID is empty or only whitespace return a clear
client-side error (e.g., fmt.Errorf("providerID required")) so the method fails
fast and does not construct routes like
"/api/providers/models/refresh"/"status"; update both
unixSocketClient.RefreshProviderModels and unixSocketClient.ProviderModelStatus
to perform this check (use strings.TrimSpace(providerID) to catch
whitespace-only values) and return the error instead of proceeding to
providerModelsPath/doJSON.

In `@internal/modelcatalog/modelsdev_test.go`:
- Around line 173-195: The test currently only checks that an error occurred;
instead assert it's a timeout by inspecting the returned error from
source.ListModels: replace the generic nil-check with a targeted assertion that
the error is a timeout (e.g. use errors.Is(err, context.DeadlineExceeded) or
testutil.ErrorContains(t, err, "Client.Timeout") / testutil.ErrorAs(t,
&context.DeadlineExceeded, err) depending on available helpers). Keep the rest
of the timing assertion but ensure the error check explicitly verifies a timeout
came from the HTTP request made by ListModels (reference the test's call to
source.ListModels, the ListOptions passed, and the surrounding test "Should
apply explicit HTTP timeout").

In `@internal/modelcatalog/source_id.go`:
- Around line 12-23: ValidateSourceID currently trims input which allows
whitespace-padded IDs to validate; change it to reject surrounding whitespace
instead: in ValidateSourceID compare the original sourceID to
strings.TrimSpace(sourceID) and if they differ return an error like "model
catalog source id must not contain leading or trailing whitespace"; then
continue validation using the trimmed value (and keep the existing
staticSourceKind(trimmed) and strings.Cut(trimmed, ":") checks). This preserves
exact identity semantics while still validating normalized content.

In `@internal/modelcatalog/types.go`:
- Line 156: The fields currently declared as raw strings should use the declared
enum types: change the Model struct's AvailabilityState field from string to the
AvailabilityState type and change SourceStatus.RefreshState from string to the
RefreshState type (preserving existing JSON tags and zero-value handling);
update any constructors, unmarshalling or assignments that treat these fields as
plain strings to use or convert to the enum types (e.g., use
AvailabilityState("...") or a helper parse function where needed) so the
compiler enforces valid enum values for Model.AvailabilityState and
SourceStatus.RefreshState.

In `@internal/store/globaldb/global_db_network_conversations_test.go`:
- Around line 221-230: Add an explicit length assertion before iterating over
firstRecords to compare AppliedAt; check len(secondRecords) == len(firstRecords)
and call t.Fatalf with both lengths if they differ, then proceed with the
existing loop that compares firstRecords[index].AppliedAt to
secondRecords[index].AppliedAt (symbols: firstRecords, secondRecords,
AppliedAt).

---

Nitpick comments:
In `@internal/acp/config_options_test.go`:
- Around line 85-139: Tests in TestConfigOptionMatching and
TestLegacyModelStateAllows use flat assertions; wrap each logical assertion
group into t.Run("Should ...") subtests to follow the repo convention. For
TestConfigOptionMatching, create named subtests around the model/effort
discovery checks (calling findModelConfigOption and findReasoningConfigOption)
and the configOptionAllowsValue assertions (advertised model, unadvertised
model, boolean-as-select rejection). For TestLegacyModelStateAllows, wrap the
legacyModelStateAllows positive/negative checks and the CloneCaps equality check
into separate t.Run("Should ...") subtests. Move the existing assertions into
those subtests and leave the test helper calls and variables (options, caps) in
the parent test as needed.

In `@internal/api/core/session_workspace_internal_test.go`:
- Around line 43-44: Rename the subtest name passed to t.Run from "validate
create session runtime overrides" to follow the required "Should ..." pattern
(for example "Should validate create session runtime overrides") so update the
t.Run(...) string in the test (the subtest created in the Test function that
calls t.Run and t.Parallel) accordingly to match the enforced naming convention.

In `@internal/config/provider.go`:
- Around line 1163-1174: The URL validation in validateAbsoluteHTTPURL currently
uses string(MCPServerTransportHTTP) which couples URL schemes to MCP transport
names; change the comparison to use explicit HTTP scheme constants (either
replace string(MCPServerTransportHTTP) with the literal "http" or define a new
constant like urlSchemeHTTP = "http") and update the switch (which already
references urlSchemeHTTPS) to use urlSchemeHTTP and urlSchemeHTTPS so the
function validates against standard URL scheme strings rather than
transport-specific symbols.
- Around line 1152-1161: The validatePositiveDuration function returns a generic
error when time.ParseDuration fails; modify the error path in
validatePositiveDuration to wrap the original parse error (from
time.ParseDuration) using fmt.Errorf with %w so the returned error includes the
underlying parse error details (retain the existing "%s must be a positive
duration" message while wrapping err), and ensure other logic (duration <= 0)
remains unchanged.

In `@internal/extension/capability_models_test.go`:
- Around line 86-95: Refactor the loop that asserts denial for "models/list",
"models/refresh", "models/status" into individual subtests using t.Run so
failures are isolated; for each method call checker.CheckHostAPI("ext", method)
create a t.Run(fmt.Sprintf("Should deny %s", method), func(t *testing.T) { ...
}) body that asserts err is non-nil and that errors.As(err, &denied) yields a
*ErrCapabilityDenied (use the same checker.CheckHostAPI and ErrCapabilityDenied
symbols), keeping the existing assertion logic inside each subtest.

In `@internal/extension/manager_model_source_test.go`:
- Around line 72-74: The test currently only checks err == nil after calling
ListModelSourceRows(), which is too broad; replace that check with a specific
assertion that the error is the expected "denied" error: call
ListModelSourceRows() and assert err is not nil and either errors.Is(err,
ErrDeniedServiceMethod) (if you have a sentinel ErrDeniedServiceMethod) or
assert that err.Error() contains "denied service method" (or use
require.ErrorContains/Assert.ErrorContains from your test helper) so the test
explicitly verifies the denied-service error path.

In `@internal/extension/model_source.go`:
- Around line 220-222: The code currently calls row.ExpiresAt.UTC() which
converts a zero time to the 0001-01-01 UTC timestamp; instead, mirror the
RefreshedAt handling and guard ExpiresAt: if row.ExpiresAt.IsZero() set the
ExpiresAt field to the zero time value, otherwise set it to row.ExpiresAt.UTC();
update the struct assignment that sets ExpiresAt (near
Stale/RefreshedAt/ExpiresAt) to perform this conditional check so zero semantics
are preserved.

In `@internal/modelcatalog/sources.go`:
- Around line 160-166: The cloneConfigProviders function currently uses
maps.Copy which leaves slice backing arrays shared; replace it with an explicit
loop over src (in cloneConfigProviders) that copies each
aghconfig.ProviderConfig value into the new map and, for each config, deep-copy
the Models.Curated slice (e.g., allocate a new slice and copy elements) so the
cloned ProviderConfig.Models.Curated does not share the caller's backing array;
ensure you still handle nil src by returning an empty map.

In `@internal/session/manager_start.go`:
- Around line 387-404: The function validateRuntimeOverrides currently accepts
an unused parameter resolved of type aghconfig.ResolvedAgent; remove that
parameter from the validateRuntimeOverrides signature and from all call sites
(e.g., where validateRuntimeOverrides is invoked around the former line 371) so
the method only uses s (sessionStartSpec); update any tests or callers to stop
passing the resolved argument and ensure compilation by adjusting
imports/signatures accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0f6d6e23-5904-4bcc-8bc0-1b37c3e8f7d3

📥 Commits

Reviewing files that changed from the base of the PR and between d7b2f66 and 7966bfb.

⛔ Files ignored due to path filters (27)
  • config.toml is excluded by !**/*.toml
  • go.sum is excluded by !**/*.sum, !**/*.sum
  • internal/AGENTS.md is excluded by !**/*.md
  • internal/CLAUDE.md is excluded by !**/*.md
  • internal/testutil/acpmock/testdata/browser_session_lifecycle_fixture.json is excluded by !**/*.json
  • openapi/agh.json is excluded by !**/*.json
  • packages/site/content/runtime/api-reference/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/memory/extractor/replay.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/reset.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/provider/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/provider/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/provider/models/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/provider/models/list.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/provider/models/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/provider/models/refresh.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/provider/models/status.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/session/new.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/agents/definitions.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/agents/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/core/agents/model-catalog.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/agents/providers.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/configuration/agent-md.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/configuration/config-toml.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/extensions/develop.mdx is excluded by !**/*.mdx
  • sdk/typescript/src/generated/contracts.ts is excluded by !**/generated/**
  • web/e2e/fixtures/__tests__/runtime-seed.test.ts is excluded by !**/fixtures/**
  • web/src/generated/agh-openapi.d.ts is excluded by !**/generated/**
📒 Files selected for processing (184)
  • go.mod
  • internal/acp/client.go
  • internal/acp/client_test.go
  • internal/acp/config_options.go
  • internal/acp/config_options_test.go
  • internal/acp/handlers.go
  • internal/acp/handlers_test.go
  • internal/acp/permission.go
  • internal/acp/process_tree_test.go
  • internal/acp/types.go
  • internal/acp/types_test.go
  • internal/api/contract/contract.go
  • internal/api/contract/contract_test.go
  • internal/api/contract/settings.go
  • internal/api/core/conversions.go
  • internal/api/core/conversions_parsers_test.go
  • internal/api/core/errors.go
  • internal/api/core/handlers.go
  • internal/api/core/interfaces.go
  • internal/api/core/memory_workspace_test.go
  • internal/api/core/model_catalog.go
  • internal/api/core/model_catalog_conversions.go
  • internal/api/core/model_catalog_test.go
  • internal/api/core/session_workspace.go
  • internal/api/core/session_workspace_internal_test.go
  • internal/api/core/settings.go
  • internal/api/core/settings_internal_test.go
  • internal/api/core/settings_test.go
  • internal/api/core/workspaces.go
  • internal/api/httpapi/handlers.go
  • internal/api/httpapi/handlers_test.go
  • internal/api/httpapi/middleware.go
  • internal/api/httpapi/model_catalog_test.go
  • internal/api/httpapi/routes.go
  • internal/api/httpapi/server.go
  • internal/api/httpapi/transport_parity_integration_test.go
  • internal/api/spec/model_catalog.go
  • internal/api/spec/spec.go
  • internal/api/spec/spec_test.go
  • internal/api/testutil/model_catalog_parity_test.go
  • internal/api/udsapi/handlers_test.go
  • internal/api/udsapi/model_catalog_test.go
  • internal/api/udsapi/routes.go
  • internal/api/udsapi/server.go
  • internal/api/udsapi/transport_parity_integration_test.go
  • internal/cli/client.go
  • internal/cli/client_provider_models.go
  • internal/cli/config.go
  • internal/cli/config_test.go
  • internal/cli/helpers_test.go
  • internal/cli/install.go
  • internal/cli/install_test.go
  • internal/cli/provider.go
  • internal/cli/provider_models.go
  • internal/cli/provider_models_test.go
  • internal/cli/session.go
  • internal/config/autonomy.go
  • internal/config/autonomy_test.go
  • internal/config/bootstrap.go
  • internal/config/bootstrap_test.go
  • internal/config/config.go
  • internal/config/config_test.go
  • internal/config/merge.go
  • internal/config/perf_bench_test.go
  • internal/config/persistence_test.go
  • internal/config/provider.go
  • internal/config/provider_test.go
  • internal/config/tool_surface.go
  • internal/daemon/boot.go
  • internal/daemon/daemon.go
  • internal/daemon/daemon_integration_test.go
  • internal/daemon/daemon_nightly_combined_integration_test.go
  • internal/daemon/daemon_sandbox_integration_test.go
  • internal/daemon/model_catalog.go
  • internal/daemon/model_catalog_test.go
  • internal/daemon/tool_approval_bridge.go
  • internal/extension/capability.go
  • internal/extension/capability_models_test.go
  • internal/extension/contract/host_api.go
  • internal/extension/contract/sdk.go
  • internal/extension/host_api.go
  • internal/extension/host_api_models.go
  • internal/extension/host_api_models_test.go
  • internal/extension/manager_model_source_test.go
  • internal/extension/manager_test.go
  • internal/extension/manifest.go
  • internal/extension/manifest_model_source_test.go
  • internal/extension/model_source.go
  • internal/extension/model_source_test.go
  • internal/extension/protocol/host_api.go
  • internal/extension/protocol/host_api_test.go
  • internal/extension/tool_runtime.go
  • internal/modelcatalog/errors.go
  • internal/modelcatalog/hardcut_residue_test.go
  • internal/modelcatalog/live_sources.go
  • internal/modelcatalog/live_sources_test.go
  • internal/modelcatalog/merge.go
  • internal/modelcatalog/modelsdev.go
  • internal/modelcatalog/modelsdev_test.go
  • internal/modelcatalog/redact.go
  • internal/modelcatalog/redact_test.go
  • internal/modelcatalog/service.go
  • internal/modelcatalog/service_integration_test.go
  • internal/modelcatalog/service_test.go
  • internal/modelcatalog/source_id.go
  • internal/modelcatalog/sources.go
  • internal/modelcatalog/sources_test.go
  • internal/modelcatalog/types.go
  • internal/sandbox/daytona/provider_test.go
  • internal/session/interfaces.go
  • internal/session/manager.go
  • internal/session/manager_start.go
  • internal/session/manager_test.go
  • internal/session/query.go
  • internal/session/query_test.go
  • internal/session/runtime_overrides.go
  • internal/session/session.go
  • internal/settings/collections.go
  • internal/settings/models.go
  • internal/settings/service_test.go
  • internal/situation/service.go
  • internal/store/globaldb/global_db.go
  • internal/store/globaldb/global_db_heartbeat_test.go
  • internal/store/globaldb/global_db_model_catalog.go
  • internal/store/globaldb/global_db_model_catalog_test.go
  • internal/store/globaldb/global_db_network_conversations_test.go
  • internal/store/globaldb/global_db_soul_test.go
  • internal/store/globaldb/global_db_test.go
  • internal/store/globaldb/migrate_model_catalog.go
  • internal/store/globaldb/schema_model_catalog.go
  • internal/store/types.go
  • internal/testutil/acpmock/cmd/acpmock-driver/main.go
  • internal/testutil/acpmock/cmd/acpmock-driver/main_test.go
  • internal/testutil/acpmock/fixture.go
  • internal/testutil/e2e/config_seed_test.go
  • internal/testutil/e2e/runtime_harness_integration_test.go
  • internal/workspace/clone.go
  • internal/workspace/resolver_test.go
  • magefile.go
  • packages/site/lib/__tests__/provider-model-catalog-docs.test.ts
  • packages/site/lib/__tests__/runtime-manual-api-routes.test.ts
  • packages/site/lib/runtime-navigation.ts
  • packages/site/scripts/generate-openapi.ts
  • packages/ui/src/components/metric.tsx
  • web/e2e/__tests__/session-provider-override.spec.ts
  • web/src/hooks/routes/__tests__/use-app-layout.test.tsx
  • web/src/hooks/routes/__tests__/use-settings-providers-page.test.tsx
  • web/src/hooks/routes/use-settings-providers-page.ts
  • web/src/routes/_app.tsx
  • web/src/routes/_app/settings/__tests__/-providers.test.tsx
  • web/src/routes/_app/settings/providers.tsx
  • web/src/systems/agent/components/agent-sessions-list.tsx
  • web/src/systems/automation/components/automation-run-history.tsx
  • web/src/systems/knowledge/components/knowledge-delete-dialog.tsx
  • web/src/systems/knowledge/components/knowledge-edit-dialog.tsx
  • web/src/systems/model-catalog/__tests__/derive-active-session-options.test.ts
  • web/src/systems/model-catalog/adapters/model-catalog-api.ts
  • web/src/systems/model-catalog/hooks/use-provider-models.ts
  • web/src/systems/model-catalog/hooks/use-refresh-provider-models.ts
  • web/src/systems/model-catalog/index.ts
  • web/src/systems/model-catalog/lib/derive-active-session-options.ts
  • web/src/systems/model-catalog/lib/query-keys.ts
  • web/src/systems/model-catalog/lib/query-options.ts
  • web/src/systems/model-catalog/types.ts
  • web/src/systems/network/components/shell/inspector-activity-feed.tsx
  • web/src/systems/network/components/shell/inspector-members-list.tsx
  • web/src/systems/network/components/work/work-inspector.tsx
  • web/src/systems/session/components/__tests__/session-create-dialog.test.tsx
  • web/src/systems/session/components/model-command-select.tsx
  • web/src/systems/session/components/reasoning-command-select.tsx
  • web/src/systems/session/components/session-create-dialog.tsx
  • web/src/systems/session/hooks/__tests__/use-session-create-dialog.test.tsx
  • web/src/systems/session/hooks/use-session-create-dialog.ts
  • web/src/systems/settings/adapters/__tests__/settings-api.test.ts
  • web/src/systems/settings/components/index.ts
  • web/src/systems/settings/components/provider-card.tsx
  • web/src/systems/settings/components/provider-model-catalog-status.tsx
  • web/src/systems/settings/components/settings-page-shell.tsx
  • web/src/systems/settings/mocks/fixtures.ts
  • web/src/systems/skill/components/skill-detail-panel.tsx
  • web/src/systems/workspace/components/provider-command-list.tsx
  • web/src/systems/workspace/components/provider-command-select.tsx
  • web/src/systems/workspace/index.ts
  • web/src/systems/workspace/mocks/fixtures.ts

Comment thread internal/acp/client.go
Comment thread internal/acp/types_test.go
Comment thread internal/api/testutil/model_catalog_parity_test.go
Comment thread internal/api/testutil/model_catalog_parity_test.go
Comment thread internal/modelcatalog/hardcut_residue_test.go
Comment thread internal/store/globaldb/global_db_model_catalog.go Outdated
Comment thread internal/store/globaldb/global_db_test.go
Comment thread internal/store/globaldb/global_db.go Outdated
Comment thread internal/store/globaldb/schema_model_catalog.go Outdated
Comment thread internal/testutil/acpmock/cmd/acpmock-driver/main.go
@pedronauck
pedronauck merged commit 0f93f2e into main May 7, 2026
6 of 8 checks passed
@pedronauck
pedronauck deleted the provider-models branch May 7, 2026 19:44
This was referenced May 7, 2026
pedronauck added a commit that referenced this pull request May 26, 2026
## Release v0.0.1

This PR prepares the release of version v0.0.1.

### Changelog

## 0.0.1 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

- Project structure (#7)
- Kb improvements (#12)
- Rename spaces to channels (#17)
- Add extensions gaps (#21)
- Improve tool calls ui (#22)
- Remove web app header
- Module improvements (#29)
- Memory improvements (#35)
- Storybook for web and ui (#38)
- Enable AGH network by default for new installs (#57)
- Hermes adjustments (#69)
- Badges design (#84)
- Storybook scenario and logos gallery
- Migrate typescript tests (#114)
- Internal go packages (#120)
- Ui patterns (#127)
- Improve e2e tests (#130)
- Ui redesign
- Workspace isolation across runtime surfaces (#145)
- Prod ready applies (#162)
- Tool card ui (#164)
- Alpha on logo
- Prod ready features (#167)
- Thread sheet (#202)



### 🎉 Features

- Implement config foundation packages
- Implement sqlite store package
- Add ACP client package
- Add session lifecycle manager
- Implement observe package
- Add daemon composition root
- Add uds api server
- Implement cli package
- Add http api server
- Add system design
- Add foundation types, schemas, and layout shell for web client
- Add daemon health polling and agent sidebar systems for web client
- Add session system CRUD, streaming core, and session store for web
client
- Add chat view, messages, and composer tests for web client
- Add tool cards and renderers for web client
- Add file-backed memory store core
- Scaffold memory session seams
- Add memory dream consolidation service
- Wire memory assembler into daemon
- Add memory api and cli
- New skills system (#1)
- Add workspace entity (#5)
- Add new skill capabilities (#8)
- Web ui v2 (#9)
- Improve hooks system (#10)
- Session resilience (#11)
- Add extensability (#13)
- Add automation (#16)
- Add channels (#14)
- Add network implementation (#15)
- Add network, bridges and automations web pages (#18)
- Ext registry (#20)
- Add core tasks (#19)
- Bridge adapters (#23)
- Add site (#26)
- Add ext refac and sandbox (#25)
- Settings ui (#37)
- Tasks ui (#36)
- Harness improvements (#44)
- Agent capabilities (#49)
- Redesign ui (#48)
- Unify capability (#53)
- Redesign network workspace (#59)
- Add task deletion and split session delete from stop (#58)
- Session provider selection (#60)
- Production grade adjustments (#66)
- Autonomous system (#75)
- Add agent session route (#80)
- Tools registry (#85)
- Agents soul (#88)
- Add network threads (#105)
- Orchestration improvements (#106)
- Memory v2 (#108)
- Agent categories (#113)
- Providers model (#118)
- Add canonical AGH bundled skill (#143)
- Onboarding and improvements (#198)
- Onboarding and improvements (#201)



### 🐛 Bug Fixes

- Review round
- Review rounds
- Resolve memory extensibility review batch
- Embed web into daemon
- Defaults agents
- Acp integration (#4)
- Lint errors
- Prd folder
- Remove orphan web actions and dead surfaces (#55)
- Qa testing and fixes (#73)
- New review rounds (#82)
- Security audit (#90)
- Release qa round (#95)
- Add missing tools (#141)
- New qa round (#147)
- Advanced qa round (#149)
- Homebrew tap
- Final review round (#151)
- Daemon healthy
- Reasoning models (#158)
- Lint errors (#160)
- Review round (#168)
- Release adjustments (#171)
- Stabilize release ci fixtures
- Stabilize release integration gate
- Stabilize release verify gates
- Stabilize release integration flows
- Stabilize release verify gates
- Stabilize main verify shutdown
- Ignore stale acpmock cancel
- Marketplace search focus and filtering (#193)
- Website video
- Workspace command select



### 📚 Documentation

- Update agents.md
- Update prd
- Update skills
- Update compozy tasks
- Update compozy
- Update compozy
- Add new skills
- Archive prd
- Update prds
- Update rfc
- Update prds
- Update prds
- Add automation prd
- Channels prd
- Update prd
- Update prd
- New prds
- Archive prds
- Bridges adapters prd
- Sandbox prd
- Update
- Archive prd
- Update
- Add new prd
- New design
- Update prd
- Archive prds
- Update prds
- Tasks-ui prd tasks
- Update prd
- Update design docs
- Agent capabilities prd
- Improve site docs
- Remove old design references
- Udpate
- Autonomous prd
- Update skills
- Blog design
- Agent sould prd
- Final qa plan
- Update
- Remove codex ledgers from gitignore
- Remove not needed files
- Udpate ledger
- Update cy-codex-loop skill
- Orchestration improves prd
- Update prds
- Orch improvs prd
- Memv2 prd
- Providers model prd
- Update refacs prd
- New design proposal
- Update rules
- Update skills
- New blog posts (#173)
- Format docs
- Remove old design files
- Remove old
- Skeeper update



### 📦 Build System

- Initial structure
- Commitlint
- Frontend base structure
- Update vscode settings
- Add subagents
- Coderabbit
- Prd and tooling
- Bun lock
- Lint tooling
- Copy.md and tooling adjusts
- Add repoclone rc
- Upgrade skeeper to v0.2.0
- Update go.mod
- Adopt task artifacts into skeeper
- Sync codex plans with skeeper
- Skeeper lock
- Skeeper lock
- New skills
- Skeeper lock
- Skeeper lock
- Skeeper lock
- Update deps and go
- Regenerate daytona sidecar assets for go 1.26.3
- Fix cliff
- Ignore docs on fmt
- Build web assets before goreleaser
- Extend release dry-run timeout



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser



### 🧪 Testing

- Add e2e tests (#27)
- Qa rounds (#78)
- Improve test suite (#138)
- Harden daemon-served restart reloads
- Harden daemon-served readiness waits
- Stabilize dashboard focus assertion
- Stabilize release integration gates
- Stabilize release e2e markers
- Stabilize release e2e flows

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This was referenced May 26, 2026
pedronauck added a commit that referenced this pull request May 26, 2026
## Release v0.0.1

This PR prepares the release of version v0.0.1.

### Changelog

## 0.0.1 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

- Project structure (#7)
- Kb improvements (#12)
- Rename spaces to channels (#17)
- Add extensions gaps (#21)
- Improve tool calls ui (#22)
- Remove web app header
- Module improvements (#29)
- Memory improvements (#35)
- Storybook for web and ui (#38)
- Enable AGH network by default for new installs (#57)
- Hermes adjustments (#69)
- Badges design (#84)
- Storybook scenario and logos gallery
- Migrate typescript tests (#114)
- Internal go packages (#120)
- Ui patterns (#127)
- Improve e2e tests (#130)
- Ui redesign
- Workspace isolation across runtime surfaces (#145)
- Prod ready applies (#162)
- Tool card ui (#164)
- Alpha on logo
- Prod ready features (#167)
- Thread sheet (#202)



### 🎉 Features

- Implement config foundation packages
- Implement sqlite store package
- Add ACP client package
- Add session lifecycle manager
- Implement observe package
- Add daemon composition root
- Add uds api server
- Implement cli package
- Add http api server
- Add system design
- Add foundation types, schemas, and layout shell for web client
- Add daemon health polling and agent sidebar systems for web client
- Add session system CRUD, streaming core, and session store for web
client
- Add chat view, messages, and composer tests for web client
- Add tool cards and renderers for web client
- Add file-backed memory store core
- Scaffold memory session seams
- Add memory dream consolidation service
- Wire memory assembler into daemon
- Add memory api and cli
- New skills system (#1)
- Add workspace entity (#5)
- Add new skill capabilities (#8)
- Web ui v2 (#9)
- Improve hooks system (#10)
- Session resilience (#11)
- Add extensability (#13)
- Add automation (#16)
- Add channels (#14)
- Add network implementation (#15)
- Add network, bridges and automations web pages (#18)
- Ext registry (#20)
- Add core tasks (#19)
- Bridge adapters (#23)
- Add site (#26)
- Add ext refac and sandbox (#25)
- Settings ui (#37)
- Tasks ui (#36)
- Harness improvements (#44)
- Agent capabilities (#49)
- Redesign ui (#48)
- Unify capability (#53)
- Redesign network workspace (#59)
- Add task deletion and split session delete from stop (#58)
- Session provider selection (#60)
- Production grade adjustments (#66)
- Autonomous system (#75)
- Add agent session route (#80)
- Tools registry (#85)
- Agents soul (#88)
- Add network threads (#105)
- Orchestration improvements (#106)
- Memory v2 (#108)
- Agent categories (#113)
- Providers model (#118)
- Add canonical AGH bundled skill (#143)
- Onboarding and improvements (#198)
- Onboarding and improvements (#201)



### 🐛 Bug Fixes

- Review round
- Review rounds
- Resolve memory extensibility review batch
- Embed web into daemon
- Defaults agents
- Acp integration (#4)
- Lint errors
- Prd folder
- Remove orphan web actions and dead surfaces (#55)
- Qa testing and fixes (#73)
- New review rounds (#82)
- Security audit (#90)
- Release qa round (#95)
- Add missing tools (#141)
- New qa round (#147)
- Advanced qa round (#149)
- Homebrew tap
- Final review round (#151)
- Daemon healthy
- Reasoning models (#158)
- Lint errors (#160)
- Review round (#168)
- Release adjustments (#171)
- Stabilize release ci fixtures
- Stabilize release integration gate
- Stabilize release verify gates
- Stabilize release integration flows
- Stabilize release verify gates
- Stabilize main verify shutdown
- Ignore stale acpmock cancel
- Marketplace search focus and filtering (#193)
- Website video
- Workspace command select



### 📚 Documentation

- Update agents.md
- Update prd
- Update skills
- Update compozy tasks
- Update compozy
- Update compozy
- Add new skills
- Archive prd
- Update prds
- Update rfc
- Update prds
- Update prds
- Add automation prd
- Channels prd
- Update prd
- Update prd
- New prds
- Archive prds
- Bridges adapters prd
- Sandbox prd
- Update
- Archive prd
- Update
- Add new prd
- New design
- Update prd
- Archive prds
- Update prds
- Tasks-ui prd tasks
- Update prd
- Update design docs
- Agent capabilities prd
- Improve site docs
- Remove old design references
- Udpate
- Autonomous prd
- Update skills
- Blog design
- Agent sould prd
- Final qa plan
- Update
- Remove codex ledgers from gitignore
- Remove not needed files
- Udpate ledger
- Update cy-codex-loop skill
- Orchestration improves prd
- Update prds
- Orch improvs prd
- Memv2 prd
- Providers model prd
- Update refacs prd
- New design proposal
- Update rules
- Update skills
- New blog posts (#173)
- Format docs
- Remove old design files
- Remove old
- Skeeper update



### 📦 Build System

- Initial structure
- Commitlint
- Frontend base structure
- Update vscode settings
- Add subagents
- Coderabbit
- Prd and tooling
- Bun lock
- Lint tooling
- Copy.md and tooling adjusts
- Add repoclone rc
- Upgrade skeeper to v0.2.0
- Update go.mod
- Adopt task artifacts into skeeper
- Sync codex plans with skeeper
- Skeeper lock
- Skeeper lock
- New skills
- Skeeper lock
- Skeeper lock
- Skeeper lock
- Update deps and go
- Regenerate daytona sidecar assets for go 1.26.3
- Fix cliff
- Ignore docs on fmt
- Build web assets before goreleaser
- Extend release dry-run timeout



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser
- Fix release



### 🧪 Testing

- Add e2e tests (#27)
- Qa rounds (#78)
- Improve test suite (#138)
- Harden daemon-served restart reloads
- Harden daemon-served readiness waits
- Stabilize dashboard focus assertion
- Stabilize release integration gates
- Stabilize release e2e markers
- Stabilize release e2e flows

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
pedronauck added a commit that referenced this pull request May 26, 2026
## Release v0.0.2

This PR prepares the release of version v0.0.2.

### Changelog

## 0.0.2 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

- Project structure (#7)
- Kb improvements (#12)
- Rename spaces to channels (#17)
- Add extensions gaps (#21)
- Improve tool calls ui (#22)
- Remove web app header
- Module improvements (#29)
- Memory improvements (#35)
- Storybook for web and ui (#38)
- Enable AGH network by default for new installs (#57)
- Hermes adjustments (#69)
- Badges design (#84)
- Storybook scenario and logos gallery
- Migrate typescript tests (#114)
- Internal go packages (#120)
- Ui patterns (#127)
- Improve e2e tests (#130)
- Ui redesign
- Workspace isolation across runtime surfaces (#145)
- Prod ready applies (#162)
- Tool card ui (#164)
- Alpha on logo
- Prod ready features (#167)
- Thread sheet (#202)



### 🎉 Features

- Implement config foundation packages
- Implement sqlite store package
- Add ACP client package
- Add session lifecycle manager
- Implement observe package
- Add daemon composition root
- Add uds api server
- Implement cli package
- Add http api server
- Add system design
- Add foundation types, schemas, and layout shell for web client
- Add daemon health polling and agent sidebar systems for web client
- Add session system CRUD, streaming core, and session store for web
client
- Add chat view, messages, and composer tests for web client
- Add tool cards and renderers for web client
- Add file-backed memory store core
- Scaffold memory session seams
- Add memory dream consolidation service
- Wire memory assembler into daemon
- Add memory api and cli
- New skills system (#1)
- Add workspace entity (#5)
- Add new skill capabilities (#8)
- Web ui v2 (#9)
- Improve hooks system (#10)
- Session resilience (#11)
- Add extensability (#13)
- Add automation (#16)
- Add channels (#14)
- Add network implementation (#15)
- Add network, bridges and automations web pages (#18)
- Ext registry (#20)
- Add core tasks (#19)
- Bridge adapters (#23)
- Add site (#26)
- Add ext refac and sandbox (#25)
- Settings ui (#37)
- Tasks ui (#36)
- Harness improvements (#44)
- Agent capabilities (#49)
- Redesign ui (#48)
- Unify capability (#53)
- Redesign network workspace (#59)
- Add task deletion and split session delete from stop (#58)
- Session provider selection (#60)
- Production grade adjustments (#66)
- Autonomous system (#75)
- Add agent session route (#80)
- Tools registry (#85)
- Agents soul (#88)
- Add network threads (#105)
- Orchestration improvements (#106)
- Memory v2 (#108)
- Agent categories (#113)
- Providers model (#118)
- Add canonical AGH bundled skill (#143)
- Onboarding and improvements (#198)
- Onboarding and improvements (#201)



### 🐛 Bug Fixes

- Review round
- Review rounds
- Resolve memory extensibility review batch
- Embed web into daemon
- Defaults agents
- Acp integration (#4)
- Lint errors
- Prd folder
- Remove orphan web actions and dead surfaces (#55)
- Qa testing and fixes (#73)
- New review rounds (#82)
- Security audit (#90)
- Release qa round (#95)
- Add missing tools (#141)
- New qa round (#147)
- Advanced qa round (#149)
- Homebrew tap
- Final review round (#151)
- Daemon healthy
- Reasoning models (#158)
- Lint errors (#160)
- Review round (#168)
- Release adjustments (#171)
- Stabilize release ci fixtures
- Stabilize release integration gate
- Stabilize release verify gates
- Stabilize release integration flows
- Stabilize release verify gates
- Stabilize main verify shutdown
- Ignore stale acpmock cancel
- Marketplace search focus and filtering (#193)
- Website video
- Workspace command select



### 📚 Documentation

- Update agents.md
- Update prd
- Update skills
- Update compozy tasks
- Update compozy
- Update compozy
- Add new skills
- Archive prd
- Update prds
- Update rfc
- Update prds
- Update prds
- Add automation prd
- Channels prd
- Update prd
- Update prd
- New prds
- Archive prds
- Bridges adapters prd
- Sandbox prd
- Update
- Archive prd
- Update
- Add new prd
- New design
- Update prd
- Archive prds
- Update prds
- Tasks-ui prd tasks
- Update prd
- Update design docs
- Agent capabilities prd
- Improve site docs
- Remove old design references
- Udpate
- Autonomous prd
- Update skills
- Blog design
- Agent sould prd
- Final qa plan
- Update
- Remove codex ledgers from gitignore
- Remove not needed files
- Udpate ledger
- Update cy-codex-loop skill
- Orchestration improves prd
- Update prds
- Orch improvs prd
- Memv2 prd
- Providers model prd
- Update refacs prd
- New design proposal
- Update rules
- Update skills
- New blog posts (#173)
- Format docs
- Remove old design files
- Remove old
- Skeeper update



### 📦 Build System

- Initial structure
- Commitlint
- Frontend base structure
- Update vscode settings
- Add subagents
- Coderabbit
- Prd and tooling
- Bun lock
- Lint tooling
- Copy.md and tooling adjusts
- Add repoclone rc
- Upgrade skeeper to v0.2.0
- Update go.mod
- Adopt task artifacts into skeeper
- Sync codex plans with skeeper
- Skeeper lock
- Skeeper lock
- New skills
- Skeeper lock
- Skeeper lock
- Skeeper lock
- Update deps and go
- Regenerate daytona sidecar assets for go 1.26.3
- Fix cliff
- Ignore docs on fmt
- Build web assets before goreleaser
- Extend release dry-run timeout



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser
- Fix release
- Fix release process



### 🧪 Testing

- Add e2e tests (#27)
- Qa rounds (#78)
- Improve test suite (#138)
- Harden daemon-served restart reloads
- Harden daemon-served readiness waits
- Stabilize dashboard focus assertion
- Stabilize release integration gates
- Stabilize release e2e markers
- Stabilize release e2e flows
- Improve suite speed

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
pedronauck added a commit that referenced this pull request May 27, 2026
## Release v0.0.2

This PR prepares the release of version v0.0.2.

### Changelog

## 0.0.2 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

- Project structure (#7)
- Kb improvements (#12)
- Rename spaces to channels (#17)
- Add extensions gaps (#21)
- Improve tool calls ui (#22)
- Remove web app header
- Module improvements (#29)
- Memory improvements (#35)
- Storybook for web and ui (#38)
- Enable AGH network by default for new installs (#57)
- Hermes adjustments (#69)
- Badges design (#84)
- Storybook scenario and logos gallery
- Migrate typescript tests (#114)
- Internal go packages (#120)
- Ui patterns (#127)
- Improve e2e tests (#130)
- Ui redesign
- Workspace isolation across runtime surfaces (#145)
- Prod ready applies (#162)
- Tool card ui (#164)
- Alpha on logo
- Prod ready features (#167)
- Thread sheet (#202)



### 🎉 Features

- Implement config foundation packages
- Implement sqlite store package
- Add ACP client package
- Add session lifecycle manager
- Implement observe package
- Add daemon composition root
- Add uds api server
- Implement cli package
- Add http api server
- Add system design
- Add foundation types, schemas, and layout shell for web client
- Add daemon health polling and agent sidebar systems for web client
- Add session system CRUD, streaming core, and session store for web
client
- Add chat view, messages, and composer tests for web client
- Add tool cards and renderers for web client
- Add file-backed memory store core
- Scaffold memory session seams
- Add memory dream consolidation service
- Wire memory assembler into daemon
- Add memory api and cli
- New skills system (#1)
- Add workspace entity (#5)
- Add new skill capabilities (#8)
- Web ui v2 (#9)
- Improve hooks system (#10)
- Session resilience (#11)
- Add extensability (#13)
- Add automation (#16)
- Add channels (#14)
- Add network implementation (#15)
- Add network, bridges and automations web pages (#18)
- Ext registry (#20)
- Add core tasks (#19)
- Bridge adapters (#23)
- Add site (#26)
- Add ext refac and sandbox (#25)
- Settings ui (#37)
- Tasks ui (#36)
- Harness improvements (#44)
- Agent capabilities (#49)
- Redesign ui (#48)
- Unify capability (#53)
- Redesign network workspace (#59)
- Add task deletion and split session delete from stop (#58)
- Session provider selection (#60)
- Production grade adjustments (#66)
- Autonomous system (#75)
- Add agent session route (#80)
- Tools registry (#85)
- Agents soul (#88)
- Add network threads (#105)
- Orchestration improvements (#106)
- Memory v2 (#108)
- Agent categories (#113)
- Providers model (#118)
- Add canonical AGH bundled skill (#143)
- Onboarding and improvements (#198)
- Onboarding and improvements (#201)



### 🐛 Bug Fixes

- Review round
- Review rounds
- Resolve memory extensibility review batch
- Embed web into daemon
- Defaults agents
- Acp integration (#4)
- Lint errors
- Prd folder
- Remove orphan web actions and dead surfaces (#55)
- Qa testing and fixes (#73)
- New review rounds (#82)
- Security audit (#90)
- Release qa round (#95)
- Add missing tools (#141)
- New qa round (#147)
- Advanced qa round (#149)
- Homebrew tap
- Final review round (#151)
- Daemon healthy
- Reasoning models (#158)
- Lint errors (#160)
- Review round (#168)
- Release adjustments (#171)
- Stabilize release ci fixtures
- Stabilize release integration gate
- Stabilize release verify gates
- Stabilize release integration flows
- Stabilize release verify gates
- Stabilize main verify shutdown
- Ignore stale acpmock cancel
- Marketplace search focus and filtering (#193)
- Website video
- Workspace command select



### 📚 Documentation

- Update agents.md
- Update prd
- Update skills
- Update compozy tasks
- Update compozy
- Update compozy
- Add new skills
- Archive prd
- Update prds
- Update rfc
- Update prds
- Update prds
- Add automation prd
- Channels prd
- Update prd
- Update prd
- New prds
- Archive prds
- Bridges adapters prd
- Sandbox prd
- Update
- Archive prd
- Update
- Add new prd
- New design
- Update prd
- Archive prds
- Update prds
- Tasks-ui prd tasks
- Update prd
- Update design docs
- Agent capabilities prd
- Improve site docs
- Remove old design references
- Udpate
- Autonomous prd
- Update skills
- Blog design
- Agent sould prd
- Final qa plan
- Update
- Remove codex ledgers from gitignore
- Remove not needed files
- Udpate ledger
- Update cy-codex-loop skill
- Orchestration improves prd
- Update prds
- Orch improvs prd
- Memv2 prd
- Providers model prd
- Update refacs prd
- New design proposal
- Update rules
- Update skills
- New blog posts (#173)
- Format docs
- Remove old design files
- Remove old
- Skeeper update



### 📦 Build System

- Initial structure
- Commitlint
- Frontend base structure
- Update vscode settings
- Add subagents
- Coderabbit
- Prd and tooling
- Bun lock
- Lint tooling
- Copy.md and tooling adjusts
- Add repoclone rc
- Upgrade skeeper to v0.2.0
- Update go.mod
- Adopt task artifacts into skeeper
- Sync codex plans with skeeper
- Skeeper lock
- Skeeper lock
- New skills
- Skeeper lock
- Skeeper lock
- Skeeper lock
- Update deps and go
- Regenerate daytona sidecar assets for go 1.26.3
- Fix cliff
- Ignore docs on fmt
- Build web assets before goreleaser
- Extend release dry-run timeout



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser
- Fix release
- Fix release process
- Fix release sync
- Decouple release dry-run npm auth
- Persist web assets git auth



### 🧪 Testing

- Add e2e tests (#27)
- Qa rounds (#78)
- Improve test suite (#138)
- Harden daemon-served restart reloads
- Harden daemon-served readiness waits
- Stabilize dashboard focus assertion
- Stabilize release integration gates
- Stabilize release e2e markers
- Stabilize release e2e flows
- Improve suite speed


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated web assets dependency to a newer version for improved
stability and performance.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/compozy/agh/pull/211?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
pedronauck added a commit that referenced this pull request May 27, 2026
## Release v0.0.2

This PR prepares the release of version v0.0.2.

### Changelog

## 0.0.2 - 2026-05-27



### Other Changes

- Lessons learned



### ♻️ Refactoring

- Project structure (#7)
- Kb improvements (#12)
- Rename spaces to channels (#17)
- Add extensions gaps (#21)
- Improve tool calls ui (#22)
- Remove web app header
- Module improvements (#29)
- Memory improvements (#35)
- Storybook for web and ui (#38)
- Enable AGH network by default for new installs (#57)
- Hermes adjustments (#69)
- Badges design (#84)
- Storybook scenario and logos gallery
- Migrate typescript tests (#114)
- Internal go packages (#120)
- Ui patterns (#127)
- Improve e2e tests (#130)
- Ui redesign
- Workspace isolation across runtime surfaces (#145)
- Prod ready applies (#162)
- Tool card ui (#164)
- Alpha on logo
- Prod ready features (#167)
- Thread sheet (#202)



### 🎉 Features

- Implement config foundation packages
- Implement sqlite store package
- Add ACP client package
- Add session lifecycle manager
- Implement observe package
- Add daemon composition root
- Add uds api server
- Implement cli package
- Add http api server
- Add system design
- Add foundation types, schemas, and layout shell for web client
- Add daemon health polling and agent sidebar systems for web client
- Add session system CRUD, streaming core, and session store for web
client
- Add chat view, messages, and composer tests for web client
- Add tool cards and renderers for web client
- Add file-backed memory store core
- Scaffold memory session seams
- Add memory dream consolidation service
- Wire memory assembler into daemon
- Add memory api and cli
- New skills system (#1)
- Add workspace entity (#5)
- Add new skill capabilities (#8)
- Web ui v2 (#9)
- Improve hooks system (#10)
- Session resilience (#11)
- Add extensability (#13)
- Add automation (#16)
- Add channels (#14)
- Add network implementation (#15)
- Add network, bridges and automations web pages (#18)
- Ext registry (#20)
- Add core tasks (#19)
- Bridge adapters (#23)
- Add site (#26)
- Add ext refac and sandbox (#25)
- Settings ui (#37)
- Tasks ui (#36)
- Harness improvements (#44)
- Agent capabilities (#49)
- Redesign ui (#48)
- Unify capability (#53)
- Redesign network workspace (#59)
- Add task deletion and split session delete from stop (#58)
- Session provider selection (#60)
- Production grade adjustments (#66)
- Autonomous system (#75)
- Add agent session route (#80)
- Tools registry (#85)
- Agents soul (#88)
- Add network threads (#105)
- Orchestration improvements (#106)
- Memory v2 (#108)
- Agent categories (#113)
- Providers model (#118)
- Add canonical AGH bundled skill (#143)
- Onboarding and improvements (#198)
- Onboarding and improvements (#201)



### 🐛 Bug Fixes

- Review round
- Review rounds
- Resolve memory extensibility review batch
- Embed web into daemon
- Defaults agents
- Acp integration (#4)
- Lint errors
- Prd folder
- Remove orphan web actions and dead surfaces (#55)
- Qa testing and fixes (#73)
- New review rounds (#82)
- Security audit (#90)
- Release qa round (#95)
- Add missing tools (#141)
- New qa round (#147)
- Advanced qa round (#149)
- Homebrew tap
- Final review round (#151)
- Daemon healthy
- Reasoning models (#158)
- Lint errors (#160)
- Review round (#168)
- Release adjustments (#171)
- Stabilize release ci fixtures
- Stabilize release integration gate
- Stabilize release verify gates
- Stabilize release integration flows
- Stabilize release verify gates
- Stabilize main verify shutdown
- Ignore stale acpmock cancel
- Marketplace search focus and filtering (#193)
- Website video
- Workspace command select



### 📚 Documentation

- Update agents.md
- Update prd
- Update skills
- Update compozy tasks
- Update compozy
- Update compozy
- Add new skills
- Archive prd
- Update prds
- Update rfc
- Update prds
- Update prds
- Add automation prd
- Channels prd
- Update prd
- Update prd
- New prds
- Archive prds
- Bridges adapters prd
- Sandbox prd
- Update
- Archive prd
- Update
- Add new prd
- New design
- Update prd
- Archive prds
- Update prds
- Tasks-ui prd tasks
- Update prd
- Update design docs
- Agent capabilities prd
- Improve site docs
- Remove old design references
- Udpate
- Autonomous prd
- Update skills
- Blog design
- Agent sould prd
- Final qa plan
- Update
- Remove codex ledgers from gitignore
- Remove not needed files
- Udpate ledger
- Update cy-codex-loop skill
- Orchestration improves prd
- Update prds
- Orch improvs prd
- Memv2 prd
- Providers model prd
- Update refacs prd
- New design proposal
- Update rules
- Update skills
- New blog posts (#173)
- Format docs
- Remove old design files
- Remove old
- Skeeper update



### 📦 Build System

- Initial structure
- Commitlint
- Frontend base structure
- Update vscode settings
- Add subagents
- Coderabbit
- Prd and tooling
- Bun lock
- Lint tooling
- Copy.md and tooling adjusts
- Add repoclone rc
- Upgrade skeeper to v0.2.0
- Update go.mod
- Adopt task artifacts into skeeper
- Sync codex plans with skeeper
- Skeeper lock
- Skeeper lock
- New skills
- Skeeper lock
- Skeeper lock
- Skeeper lock
- Update deps and go
- Regenerate daytona sidecar assets for go 1.26.3
- Fix cliff
- Ignore docs on fmt
- Build web assets before goreleaser
- Extend release dry-run timeout
- Fix release dry-run token contract



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser
- Fix release
- Fix release process
- Fix release sync
- Decouple release dry-run npm auth
- Persist web assets git auth
- Require npm auth before release merge



### 🧪 Testing

- Add e2e tests (#27)
- Qa rounds (#78)
- Improve test suite (#138)
- Harden daemon-served restart reloads
- Harden daemon-served readiness waits
- Stabilize dashboard focus assertion
- Stabilize release integration gates
- Stabilize release e2e markers
- Stabilize release e2e flows
- Improve suite speed


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
  * Updated dependencies to latest versions.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/compozy/agh/pull/214?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

This branch had an error being deployed

1 failed deployment
Preview — af6d532f Deployed May 7, 2026 by vercel[bot]
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant