feat: add ext refac and sandbox#25
Conversation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (49)
📒 Files selected for processing (75)
WalkthroughIntroduces a resource-driven desired-state system (resources, codecs, projection plans, stores, and projectors) across bundles, automation, bridges, agents/skills, and MCP servers; adds environment profiles and ACP launcher/tool-host abstractions; wires resource APIs, server routing, daemon boot/reconcile, and extensive tests. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant ReconcileDriver
participant ResourceKernel
participant Projector
participant ResourceStore
participant RuntimeStore
ReconcileDriver->>ResourceKernel: List records(kind)
ResourceKernel-->>ReconcileDriver: []records
ReconcileDriver->>Projector: Build(ctx, records)
Projector->>RuntimeStore: Read current runtime/store state
RuntimeStore-->>Projector: current instances
Projector->>Projector: compute ProjectionPlan (revision, ops, changed)
Projector-->>ReconcileDriver: plan
ReconcileDriver->>Projector: Apply(ctx, plan)
Projector->>ResourceStore: Replace/Apply desired instances
ResourceStore-->>Projector: ack
Projector-->>ReconcileDriver: Apply complete
sequenceDiagram
autonumber
participant Client
participant HTTPHandler
participant ResourceService
participant CodecRegistry
participant RawStore
participant ReconcileTrigger
Client->>HTTPHandler: PUT /api/resources/{kind}/{id}
HTTPHandler->>ResourceService: Put(ctx, draft)
ResourceService->>CodecRegistry: Resolve codec for kind
CodecRegistry-->>ResourceService: codec
ResourceService->>ResourceService: Validate & canonicalize spec
ResourceService->>RawStore: PutRaw(draft)
RawStore-->>ResourceService: record
ResourceService->>ReconcileTrigger: Trigger(kind, reason)
ReconcileTrigger-->>ResourceService: ack
ResourceService-->>HTTPHandler: record
HTTPHandler-->>Client: 200/201 ResourceResponse
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
|
There was a problem hiding this comment.
Actionable comments posted: 16
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 (2)
go.mod (1)
10-132:⚠️ Potential issue | 🟡 MinorAdd vulnerability scanning to the build process for the expanded dependency graph.
This PR significantly increases transitive dependencies (Daytona SDK v0.166.0, AWS SDK v2, OpenTelemetry, gRPC/protobuf, NATS, MongoDB v2). Vulnerability scanning is not currently configured—neither in CI (no workflows exist) nor in the local Mage build system. Consider adding a vulnerability scanning step (e.g.,
go run golang.org/x/vuln/cmd/govulncheck@latest ./...orosv-scanner) to the build/verification pipeline when CI is established, or to a new Mage target for local scanning.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@go.mod` around lines 10 - 132, The project added many transitive deps but has no vulnerability scanning in CI or Mage; add a vuln-scan step by creating a CI workflow (e.g., GitHub Actions) that runs "go run golang.org/x/vuln/cmd/govulncheck@latest ./..." against the module and/or add a Mage target (e.g., function ScanVulnerabilities or target "vuln:scan") that invokes govulncheck (or an alternative like osv-scanner) so maintainers can run local scans; ensure the workflow/target fails the build on findings and document invocation in README or Magefile comments.internal/api/core/memory_workspace_test.go (1)
338-457:⚠️ Potential issue | 🟡 MinorAssert
environment_refin the returned workspace payloads too.These cases verify that
EnvironmentRefreachesRegister/Update, but they never check the HTTP response body. A regression in the workspace-to-contract mapping would still pass even though this PR changes that API field.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/memory_workspace_test.go` around lines 338 - 457, Add assertions that the returned contract.WorkspacePayload includes the EnvironmentRef set in the request ("daytona-dev") wherever a workspace payload is decoded: specifically update the "Should create a workspace" test to assert payload.Workspace.EnvironmentRef == "daytona-dev", the "Should list workspaces" test to assert payload.Workspaces[0].EnvironmentRef == "daytona-dev", the "Should update a workspace via the service" test to assert payload.Workspace.EnvironmentRef == "daytona-dev", and the "Should resolve a workspace path via the service" test to assert payload.Workspace.EnvironmentRef == "daytona-dev" so regressions in workspace-to-contract mapping are caught (refer to contract.WorkspacePayload and the payload variables in each test).
🟡 Minor comments (11)
internal/api/httpapi/httpapi_integration_test.go-199-225 (1)
199-225:⚠️ Potential issue | 🟡 MinorClose the success-path response bodies.
putResp.BodyanddeleteResp.Bodyare only closed inside the failure branches. Because this integration runtime reuses a sharedhttp.Client, leaving them open can pin connections and make later requests or shutdown behavior flaky.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/httpapi/httpapi_integration_test.go` around lines 199 - 225, The test leaves HTTP response bodies open on the success path for putResp and deleteResp; after calling mustHTTPRequest (which returns *http.Response) immediately register a close (e.g., defer putResp.Body.Close() and defer deleteResp.Body.Close() or use t.Cleanup to close each body) so the response bodies are always closed regardless of the success/failure branch; update the block that creates putResp and deleteResp (references: putResp, deleteResp, mustHTTPRequest, runtime.client) to close their Body in all code paths.internal/bundles/resource_test.go-71-72 (1)
71-72:⚠️ Potential issue | 🟡 MinorMake the wrong-plan failure assertion specific.
err != nilwill pass for any unrelated failure insideApply, so this does not prove the type-check branch is exercised. Please assert the expected error type or at least an identifying substring.As per coding guidelines, "
**/*_test.go: MUST have specific error assertions (ErrorContains, ErrorAs)`."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/bundles/resource_test.go` around lines 71 - 72, The test currently only checks err != nil after calling service.Apply with a nonBundleActivationPlan; change the assertion to verify the specific failure by matching the expected error type or substring (e.g., use errors.As to assert a concrete error type or t.ErrorContains / assert.ErrorContains with the expected message). Update the assertion around the service.Apply(context.Background(), nonBundleActivationPlan{}) call to use ErrorAs or ErrorContains against the known activation-type error (or its identifying substring) so the test proves the wrong-plan branch is exercised.internal/config/mcp_resource.go-27-29 (1)
27-29:⚠️ Potential issue | 🟡 MinorWrap validation failures with operation context
Line 28 and Line 52 currently return raw errors; wrapping here would preserve call-site intent and align with project error rules.
Suggested error wrapping
import ( "context" + "fmt" "strings" @@ if err := normalizedScope.Validate("scope"); err != nil { - return MCPServer{}, err + return MCPServer{}, fmt.Errorf("validate mcp_server scope: %w", err) } @@ if err := normalized.Validate("mcp_server"); err != nil { - return MCPServer{}, err + return MCPServer{}, fmt.Errorf("validate mcp_server spec: %w", err) }As per coding guidelines:
Use explicit error returns with wrapped context: fmt.Errorf("context: %w", err).Also applies to: 51-53
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/config/mcp_resource.go` around lines 27 - 29, The validation errors returned from normalizedScope.Validate("scope") (and the other Validate call around lines 51-53) should be wrapped with contextual operation text instead of returning the raw error; replace direct returns like `return MCPServer{}, err` with wrapped errors using fmt.Errorf, e.g. `fmt.Errorf("validating scope: %w", err)`, so callers get both the original error and the operation context; ensure you import fmt if not already imported.internal/config/mcp_resource_test.go-90-92 (1)
90-92:⚠️ Potential issue | 🟡 MinorProtect
Args[0]assertion with a length checkLine 90 can panic if canonicalization or validation starts rejecting/emptying args in future changes.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/config/mcp_resource_test.go` around lines 90 - 92, Protect the test's access to record.Spec.Args[0] by first asserting the slice has at least one element: check len(record.Spec.Args) > 0 and fail the test with a clear message if not, then perform the existing comparison of record.Spec.Args[0] == "--stdio"; update the assertion in mcp_resource_test.go so the test cannot panic if canonicalization or validation makes Args empty or shorter.internal/api/core/handlers.go-403-406 (1)
403-406:⚠️ Potential issue | 🟡 MinorHandle
os.ErrNotExistin catalog-backedListAgents
GetAgentalready maps not-found correctly, butListAgentscurrently returns 500 for all catalog errors. Mapping not-found to200 {agents: []}would keep behavior consistent with the filesystem fallback.Suggested status mapping
agentDefs, err := h.AgentCatalog.ListAgents(c.Request.Context()) if err != nil { + if errors.Is(err, os.ErrNotExist) { + c.JSON(http.StatusOK, contract.AgentsResponse{Agents: []contract.AgentPayload{}}) + return + } h.respondError(c, http.StatusInternalServerError, err) return }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/handlers.go` around lines 403 - 406, ListAgents currently treats all catalog errors as 500; change the error handling after calling h.AgentCatalog.ListAgents(ctx) to detect os.ErrNotExist (use errors.Is(err, os.ErrNotExist)) and map that case to a 200 response with an empty agents array (consistent with GetAgent/filesystem fallback) instead of calling h.respondError; keep existing behavior for other errors and still call h.respondError for those.internal/config/agent_resource_test.go-115-117 (1)
115-117:⚠️ Potential issue | 🟡 MinorGuard slice access before asserting MCP server fields
Line 115 assumes at least one MCP server and can panic if normalization/filtering behavior changes, which makes failures less diagnosable.
Safer assertion pattern
+ if len(got.MCPServers) == 0 { + t.Fatalf("MCPServers = %#v, want at least one MCP server", got.MCPServers) + } if got.MCPServers[0].Name != "github" || got.MCPServers[0].Command != "npx" { t.Fatalf("MCPServers = %#v, want trimmed name/command", got.MCPServers) }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/config/agent_resource_test.go` around lines 115 - 117, The test code in the MCPServers assertion does not check if the MCPServers slice is non-empty before accessing its first element, risking a panic if the slice is empty. To fix this, add a guard condition before the existing assertion to verify that the MCPServers slice length is greater than zero. This should be done before the field checks in the test function where the current assertion uses got.MCPServers[0].Name and got.MCPServers[0].Command.internal/config/mcp_resource_test.go-27-29 (1)
27-29:⚠️ Potential issue | 🟡 MinorAssert the specific validation failure, not only non-nil error
This test currently passes on any decode/validate error, including unrelated regressions.
Suggested assertion tightening
import ( "path/filepath" + "strings" "testing" @@ if err == nil { t.Fatal("codec.DecodeAndValidate() error = nil, want missing command failure") } + if !strings.Contains(err.Error(), "mcp_server.command") { + t.Fatalf("codec.DecodeAndValidate() error = %v, want command validation error", err) + }As per coding guidelines:
MUST have specific error assertions (ErrorContains, ErrorAs).🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/config/mcp_resource_test.go` around lines 27 - 29, The test currently only checks err != nil after calling codec.DecodeAndValidate(), which allows any decode/validation error to pass; tighten the assertion to verify the specific validation failure by asserting the error contains the expected message or matches the expected validation error type (e.g., use ErrorContains(t, err, "missing command") or errors.As to check for the specific validation error) so that codec.DecodeAndValidate() is validated for the exact "missing command" failure rather than any error.internal/config/agent_resource.go-48-50 (1)
48-50:⚠️ Potential issue | 🟡 MinorUse
errors.Join()to preserve the validation error in the unwrap chain.Line 49 wraps
resources.ErrValidationwith%w, but formats the validation error using%v, which removes it from the error chain. This breakserrors.As()for the original validation failure. Useerrors.Join()instead to preserve both errors, consistent with the codebase's error handling pattern.Suggested fix
+import "errors" + if err := normalized.Validate(); err != nil { - return AgentDef{}, fmt.Errorf("%w: %v", resources.ErrValidation, err) + return AgentDef{}, errors.Join( + resources.ErrValidation, + fmt.Errorf("validate agent resource spec: %w", err), + ) }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/config/agent_resource.go` around lines 48 - 50, Replace the current wrapping of the validation error in the normalized.Validate() check so the original error stays in the unwrap chain: when normalized.Validate() returns err, return AgentDef{} and use errors.Join(resources.ErrValidation, err) instead of fmt.Errorf("%w: %v", resources.ErrValidation, err); also add a import for the "errors" package (and remove/adjust "fmt" if it becomes unused). This ensures resources.ErrValidation and the original validation error are both preserved for errors.As()/errors.Is().internal/automation/resource.go-43-56 (1)
43-56:⚠️ Potential issue | 🟡 MinorWrap validation errors with resource-specific context.
These paths currently return raw scope/binding/spec errors, which makes job-vs-trigger failures harder to diagnose once they bubble out of the codec. Wrap each failing step before returning it.
As per coding guidelines, "Use explicit error returns with wrapped context:
fmt.Errorf("context: %w", err)".Also applies to: 59-72
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/automation/resource.go` around lines 43 - 56, The validation pipeline in validateJobResourceSpec returns raw errors from scope.Validate, bindAutomationScope, and next.Validate, making it hard to tell which resource failed; update validateJobResourceSpec to wrap each returned error with resource-specific context using fmt.Errorf (e.g., return Job{}, fmt.Errorf("validateJobResourceSpec: scope validation: %w", err)) for the calls to normalizedScope.Validate("scope"), bindAutomationScope(&next.Scope, &next.WorkspaceID, normalizedScope, "job"), and next.Validate("job"); apply the same wrapped-error pattern to the analogous function handling lines 59-72 so all scope/bind/spec errors include explicit resource context.internal/bridges/resource_test.go-84-92 (1)
84-92:⚠️ Potential issue | 🟡 MinorStrengthen these negative-path assertions.
These cases mostly pass on “any non-nil error”, so the tests stay green even if the wrong validation branch fails. Please assert the expected error type/message per case so the suite actually pins the business rule being exercised.
As per coding guidelines, "MUST have specific error assertions (ErrorContains, ErrorAs)".
Also applies to: 187-193, 492-533
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/bridges/resource_test.go` around lines 84 - 92, The test loop currently only asserts that codec.DecodeAndValidate(testutil.Context(t), tt.scope, tt.raw) returns a non-nil error; change each negative-case assertion to assert the specific error using t.Fatalf or the testify/require helpers (e.g., require.ErrorContains or errors.As/require.ErrorAs) against the expected message/type in the table entry (tt.expectedErr / tt.wantErr or add such a field to each test case), so replace the generic nil-check in the t.Run closure with a targeted assertion that the returned error matches the expected error string or concrete error type for codec.DecodeAndValidate (and apply the same pattern to the other failing blocks mentioned).internal/bundles/resource_store.go-600-615 (1)
600-615:⚠️ Potential issue | 🟡 MinorPotential issue: scope comparison in
sameEncodedSpecis always true.The comparison
scope == scope.Normalize()on line 614 compares the scope to itself (normalized), which will always be true if the scope was already normalized. This seems like it should comparerecord.Scopeto the expected scope for the desired spec instead.🐛 Proposed fix for scope comparison
func sameEncodedSpec[T any]( codec resources.KindCodec[T], scope resources.ResourceScope, current T, desired T, ) bool { currentJSON, err := codec.Encode(current) if err != nil { return false } desiredJSON, err := codec.Encode(desired) if err != nil { return false } - return bytes.Equal(currentJSON, desiredJSON) && scope == scope.Normalize() + return bytes.Equal(currentJSON, desiredJSON) }The scope comparison is redundant here since callers already compare scopes before calling this function (e.g., lines 428, 461, 494).
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/bundles/resource_store.go` around lines 600 - 615, The scope equality check in sameEncodedSpec is incorrect/redundant: remove the comparison "scope == scope.Normalize()" from the return and simply return bytes.Equal(currentJSON, desiredJSON); keep the existing error handling around codec.Encode, and retain use of scope.Normalize() only if you later need to normalize/compare a different scope value (e.g., record.Scope) — for now delete the scope comparison in sameEncodedSpec to avoid the always-true self-comparison.
🧹 Nitpick comments (19)
extensions/bridges/github/provider_test.go (1)
1050-1054: Test name no longer matches behaviorThe test is still named
TestGitHubProviderReconcileRejectsSharedWebhookPaths, but it now asserts shared paths are accepted. Please rename it to reflect the new contract (e.g.,...AllowsSharedWebhookPaths) to avoid future misreads.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@extensions/bridges/github/provider_test.go` around lines 1050 - 1054, Rename the test function TestGitHubProviderReconcileRejectsSharedWebhookPaths to reflect the new behavior (for example TestGitHubProviderReconcileAllowsSharedWebhookPaths) and update any in-test description strings or t.Run subtest names that mention "RejectsSharedWebhookPaths" so they match the new contract; ensure references to the old name (function identifier and any string literals) are updated accordingly (e.g., in provider_test.go where TestGitHubProviderReconcileRejectsSharedWebhookPaths is defined and invoked).extensions/bridges/teams/provider_test.go (1)
1255-1262: Wait for ready state in the polling predicate to reduce flakiness.This currently waits for “any state” and asserts readiness afterward. If an intermediate non-ready state is written first, the test can fail intermittently.
Proposed tweak
states := waitForJSONLinesFile[stateMarker]( t, env.statePath, - func(items []stateMarker) bool { return len(items) >= 1 }, + func(items []stateMarker) bool { + return len(items) >= 1 && + items[len(items)-1].Status.Normalize() == bridgepkg.BridgeStatusReady + }, ) - if got, want := states[len(states)-1].Status.Normalize(), bridgepkg.BridgeStatusReady; got != want { - t.Fatalf("states[last].Status = %q, want %q", got, want) - } + if len(states) == 0 { + t.Fatal("states = empty, want at least one state marker") + }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@extensions/bridges/teams/provider_test.go` around lines 1255 - 1262, The test currently waits for any state then asserts readiness afterwards, which can race; update the polling predicate passed to waitForJSONLinesFile to wait until the latest state is Ready. Specifically, change the anonymous predicate in the call to waitForJSONLinesFile(stateMarker) so it returns true only when len(items) >= 1 AND items[len(items)-1].Status.Normalize() == bridgepkg.BridgeStatusReady (using symbols stateMarker, waitForJSONLinesFile, and bridgepkg.BridgeStatusReady), and then remove the separate readiness assertion that follows.go.mod (1)
77-77: Consider updating the daytona SDK if gorilla/websocket pseudo-version drift is a concern.The
gorilla/websocketpseudo-version is an indirect dependency pulled transitively throughgithub.com/daytonaio/daytona/libs/sdk-go/pkg/daytonawith no direct imports in this codebase. The version constraint is controlled by the daytona SDK, not by this project. If supply-chain risk from the pseudo-version is a concern, you would need to update the daytona SDK version or explicitly pingorilla/websocketat the expense of potentially conflicting with daytona's requirements.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@go.mod` at line 77, The indirect pseudo-version of github.com/gorilla/websocket is coming via the daytona SDK (github.com/daytonaio/daytona/libs/sdk-go/pkg/daytona); to address pseudo-version drift either update the daytona SDK dependency to a newer release that pins a stable websocket version or explicitly add/replace a direct requirement for github.com/gorilla/websocket in go.mod to a desired stable version (or use a replace directive) while verifying there are no conflicts with daytona; pick one approach, update go.mod accordingly, run go mod tidy, and ensure tests/build pass.internal/acp/client.go (1)
181-189: Wrap launcher failures with agent/process context.This returns the launcher error verbatim, which drops the agent and command that failed to start. Wrapping it here would make startup failures much easier to triage.
As per coding guidelines,
Use explicit error returns with wrapped context: fmt.Errorf("context: %w", err).🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/acp/client.go` around lines 181 - 189, The launcher.Launch call returns errors verbatim; wrap that error with agent/process context before returning so we don't lose which agent/command failed. After calling launcher.Launch(...) (using LaunchSpec fields like normalized.Command, normalized.Cwd, normalized.AdditionalDirs, normalized.Env), replace the bare "return nil, err" with a wrapped error using fmt.Errorf to include the agent/process id and the command (e.g., fmt.Errorf("failed to launch agent %s command %q: %w", agentIDOrName, normalized.Command, err)) so callers get actionable context.internal/api/core/conversions_parsers_test.go (1)
63-66: Strengthen environment assertions to cover all mapped fields.You set
Profile,State, andInstanceIDin the fixture but don’t assert them. Adding checks here would catch partial mapping regressions.Suggested test assertion enhancement
- if payload.Environment == nil || payload.Environment.EnvironmentID != "env-1" || - payload.Environment.Backend != "local" || payload.Environment.LastSyncError != "sync failed" { + if payload.Environment == nil || payload.Environment.EnvironmentID != "env-1" || + payload.Environment.Backend != "local" || payload.Environment.Profile != "local" || + payload.Environment.State != "prepared" || payload.Environment.InstanceID != "instance-1" || + payload.Environment.LastSyncError != "sync failed" { t.Fatalf("environment = %#v", payload.Environment) }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/conversions_parsers_test.go` around lines 63 - 66, The environment assertion block in conversions_parsers_test.go only checks EnvironmentID, Backend and LastSyncError; extend it to assert the remaining mapped fields set in the fixture by checking payload.Environment.Profile, payload.Environment.State and payload.Environment.InstanceID (verify they equal the fixture values, e.g. "profile-1", "active" and "inst-1" respectively) so the test fails on any partial mapping regressions.internal/api/core/handlers_test.go (1)
364-387: Add compile-time interface verification forstubAgentCatalog.This test double is standing in for the handler’s agent catalog abstraction; a compile-time assertion would make interface drift fail immediately instead of weakening the fixture silently.
As per coding guidelines, "Use compile-time interface verification:
var _ Interface = (*Type)(nil)."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/handlers_test.go` around lines 364 - 387, Add a compile-time interface assertion for the test double to catch interface drift: insert a statement of the form `var _ <AgentCatalogInterface> = (*stubAgentCatalog)(nil)` near the `stubAgentCatalog` type definition (replace <AgentCatalogInterface> with the actual handler agent catalog interface name used by the handlers), so the compiler will verify `stubAgentCatalog` implements that interface.internal/api/core/more_coverage_test.go (1)
254-491: Prefer a table-drivent.Run("Should...")matrix here.These branches differ mostly by fixture wiring and expected status, so the repetition makes the coverage harder to scan and extend than necessary. Folding them into a table-driven subtest matrix would keep the intent tighter and the failures more localized.
As per coding guidelines, "
**/*_test.go: Use table-driven tests with subtests (t.Run) as default" and "MUST uset.Run(\"Should...\")pattern for ALL test cases`."Also applies to: 493-544
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/more_coverage_test.go` around lines 254 - 491, The test TestBaseHandlersHealthAndDaemonStatusErrorBranches contains many repetitive t.Run subtests; refactor into a table-driven subtest matrix that uses the t.Run("Should ...") naming pattern. Create a slice of test cases describing the fixture setup (session manager ListAllFn, observer HealthFn, automation StatusFn, Network service and Config.Network.Enabled, DreamTrigger), the endpoint to call ("/observe/health" or "/daemon/status"), and the expected HTTP status; then iterate test cases and for each case build the fixture via newHandlerFixture or newHandlerFixtureWithAutomation, call performRequest, and assert resp.Code equals the expected status. Ensure each subtest uses t.Run("Should ...", func(t *testing.T){...}) and reference the same unique symbols used now (TestBaseHandlersHealthAndDaemonStatusErrorBranches, newHandlerFixture, newHandlerFixtureWithAutomation, performRequest, fixture.Handlers.Network, fixture.Handlers.Config.Network.Enabled) so the behavior and individual failure messages remain clear.internal/daemon/automation_resources.go (1)
26-27: Avoidany(...)for this type assertionYou can assert directly from
runtimewithout widening toany.Suggested simplification
- target, ok := any(runtime).(automationResourceProjectorTarget) + target, ok := runtime.(automationResourceProjectorTarget)As per coding guidelines:
Never use interface{}/any when a concrete type is known.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/automation_resources.go` around lines 26 - 27, The type assertion is widening `runtime` to any before asserting to automationResourceProjectorTarget; change the assertion to assert directly from runtime (e.g., target, ok := runtime.(automationResourceProjectorTarget)) so you avoid using any/interface{} when the concrete target type is known; update the branch that follows to continue using target and ok as before.internal/api/httpapi/helpers_test.go (1)
125-145: Consider extracting shared resource-handler test configBoth constructors duplicate nearly the full
handlerConfigsetup; a small internal helper would reduce maintenance drift.Also applies to: 157-177
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/httpapi/helpers_test.go` around lines 125 - 145, Tests duplicate nearly identical handlerConfig construction for newHandlers; extract a shared helper function (e.g., makeTestHandlerConfig or mustNewHandlers) that builds and returns the configured handlerConfig or directly returns newHandlers(...) used by tests, and update both call sites to use that helper. Ensure the helper sets fields shown in the diff (sessions, tasks, observer, resources, workspaces, staticFS, homePaths, config, logger, startedAt, now, pollInterval, agentLoader, httpPort) and keep test-specific overrides possible by accepting optional params or returning the config for modification before creating handlers.internal/config/agent_resource_test.go (1)
26-27: Uset.Run("Should...")style for subtest namesThe current case labels work, but they miss the enforced test naming convention used in this repo.
As per coding guidelines:
MUST use t.Run("Should...") pattern for ALL test cases.Also applies to: 33-34, 40-41, 49-50
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/config/agent_resource_test.go` around lines 26 - 27, The subtest labels in agent_resource_test.go use plain descriptions ("missing name", etc.) but must follow the repo convention of t.Run("Should..."); update each table-driven subtest invocation to call t.Run with a name that starts with "Should" (e.g., t.Run("Should return error for missing name")), specifically for the cases currently labeled at the shown snippets (the cases around the entries with name: "missing name" and the others at the mentioned locations), keeping the same test logic and only changing the subtest name strings to the "Should..." format so the test harness and conventions are satisfied.internal/api/udsapi/udsapi_integration_test.go (1)
1265-1394: Replace the polling sleeps in the new wait helpers.These helpers now gate several resource-projection assertions, but fixed
time.Sleep()polling still makes the suite flaky on slow CI and slower than necessary on fast runs. Expose a reconciliation/projector signal and wait on that instead of sleeping.As per coding guidelines,
Never use time.Sleep() in orchestration — use proper synchronization primitives.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/udsapi/udsapi_integration_test.go` around lines 1265 - 1394, The helpers use time.Sleep polling which causes flakiness; instead add a synchronization signal on integrationRuntime (e.g., a channel or wait method like integrationRuntime.waitForProjection()/waitForReconcile() that the projector/reconciler closes/sends to after each projection) and replace the time.Sleep loops in waitForAutomationJobPrompt, waitForAutomationJobMissing, waitForAutomationTriggerPrompt, waitForAutomationTriggerMissing and waitForProjectedToolRevision to select on that signal with a time.After deadline; keep the same overall timeout semantics and still re-query the API or snapshot only after receiving the projection/reconcile signal so tests no longer busy-wait.internal/daemon/bridge_resources.go (1)
68-87: Silentnilreturn may mask configuration issues.The function returns
nil, nilwhen eitherraworcodecsis nil. This silent behavior could mask misconfiguration during daemon boot, making debugging harder. Consider returning an explicit error or logging a warning when this occurs.♻️ Suggested improvement
func bridgeInstanceResourceStore( raw resources.RawStore, codecs *resources.CodecRegistry, ) (resources.Store[bridgepkg.BridgeInstanceSpec], error) { if raw == nil || codecs == nil { - return nil, nil + return nil, fmt.Errorf("daemon: bridge instance resource store requires raw store and codec registry") }Alternatively, if nil is intentional for optional initialization, add a comment explaining the design choice.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/bridge_resources.go` around lines 68 - 87, The function bridgeInstanceResourceStore currently returns nil, nil when its dependencies raw or codecs are nil which can hide misconfiguration; update it to return a descriptive error instead of silent nil (e.g., validate inputs at the top and return fmt.Errorf("daemon: missing raw store or codec registry") when raw==nil || codecs==nil), or if nil is intentional, add a clear comment above bridgeInstanceResourceStore explaining that behavior; reference the parameters raw and codecs and keep the later ResolveCodec (resources.ResolveCodec[bridgepkg.BridgeInstanceSpec]) and NewStore (resources.NewStore) logic unchanged.internal/bridges/managed_sync.go (1)
538-540: JSON equality check may produce false negatives for semantically equivalent JSON.The
managedSyncJSONEqualfunction compares JSON as trimmed strings. This works for identical serializations but will returnfalsefor semantically equivalent JSON with different formatting (e.g.,{"a":1}vs{"a": 1}). If provider configs or delivery defaults are serialized differently across sources, this could cause unnecessary updates.If this is intentional for detecting any serialization differences, consider adding a comment. Otherwise, consider canonical JSON comparison:
♻️ Suggested canonical JSON comparison
func managedSyncJSONEqual(left json.RawMessage, right json.RawMessage) bool { if len(left) == 0 && len(right) == 0 { return true } var leftVal, rightVal any if err := json.Unmarshal(left, &leftVal); err != nil { return false } if err := json.Unmarshal(right, &rightVal); err != nil { return false } leftCanonical, _ := json.Marshal(leftVal) rightCanonical, _ := json.Marshal(rightVal) return bytes.Equal(leftCanonical, rightCanonical) }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/bridges/managed_sync.go` around lines 538 - 540, The function managedSyncJSONEqual currently compares json.RawMessage by trimmed string which yields false negatives for semantically equivalent JSON; change managedSyncJSONEqual to perform a canonical JSON comparison by handling empty inputs, unmarshalling both left and right into interface{} (any), returning false on unmarshal errors, then re-marshalling each to canonical JSON and comparing the resulting bytes (use bytes.Equal) so formatting/spacing differences don't trigger diffs.internal/daemon/agent_skill_resources.go (1)
588-631: Silent encode errors in comparison methods may cause unnecessary updates.The
sameAgent,sameSkill, andsameMCPServermethods returnfalsewhen encoding fails, treating encode errors as "resource changed". While this is safe (it will trigger an update), it could mask codec issues and cause repeated unnecessary writes on every sync cycle if the codec consistently fails.Consider logging encode errors at debug level to aid troubleshooting:
♻️ Suggested improvement
func (s *agentSkillSourceSyncer) sameAgent( record resources.Record[aghconfig.AgentDef], scope resources.ResourceScope, encoded []byte, ) bool { if record.Scope != scope { return false } currentEncoded, err := s.agentCodec.Encode(record.Spec) if err != nil { + s.logger.Debug("agent encode comparison failed", "id", record.ID, "error", err) return false } return bytes.Equal(currentEncoded, encoded) }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/agent_skill_resources.go` around lines 588 - 631, Encode errors in sameAgent, sameSkill, and sameMCPServer are currently swallowed (they just return false), which can hide codec failures and cause repeated unnecessary updates; update each method to log the encoding error at debug level before returning false — use the existing codec fields (agentCodec, skillCodec, mcpCodec) and the syncer logger (e.g., s.logger or s.log) to emit a debug message that includes the method name (sameAgent/sameSkill/sameMCPServer), the error, and identifying info from the record (e.g., record.ID or record key) so failures are visible while preserving the existing false return.internal/bundles/service.go (1)
665-714: Preload bundle resources once per request/reconcile instead of listing them per activation.This lookup path does a fresh
ListBundleResources(ctx)for every activation resolution. On larger activation sets that turns reconcile into repeated full-store scans, and different activations can be resolved against different bundle snapshots inside the same operation.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/bundles/service.go` around lines 665 - 714, The resolveActivationDefinition currently calls findBundleResource which calls s.store.ListBundleResources for every activation; change this to preload the bundle resource list once per request/reconcile and reuse it for all activation resolutions. Add a request-scoped cache (or a preload step) that populates a slice/map of resources via ListBundleResources (e.g., preloadBundleResources or set s.bundleResourceCache) and modify findBundleResource and resolveActivationDefinition to consult that cache instead of calling ListBundleResources repeatedly; ensure the cache is populated before resolving activations and fall back to a single ListBundleResources call if the cache is empty.internal/daemon/agent_skill_resources_integration_test.go (1)
276-282: Consider usingtestutil.Context(t)in cleanup for consistency.The cleanup function uses
context.Background()directly. While this is acceptable for cleanup scenarios (to ensure cleanup runs even if the test context is canceled), consider whethertestutil.Context(t)with a separate timeout would be more consistent with the codebase patterns.t.Cleanup(func() { - if err := driver.Close(context.Background()); err != nil { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := driver.Close(ctx); err != nil { t.Fatalf("driver.Close() error = %v", err) } })🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/agent_skill_resources_integration_test.go` around lines 276 - 282, Cleanup uses context.Background() directly; replace it with a test-scoped context from testutil to keep patterns consistent. In the t.Cleanup closure, create a context via testutil.Context(t) (optionally with a short timeout if desired) and pass that context to driver.Close (...) instead of context.Background(); update the closure referencing driver.Close and testutil.Context(t) so the cleanup uses the test-scoped context.internal/daemon/boot.go (2)
1070-1092: Consider consolidating the repeated sync pattern.The
syncExtensionResourcePublishersfunction has a repetitive pattern of nil-check-then-sync. Consider extracting a helper to reduce duplication.♻️ Optional refactor to reduce repetition
func syncPublisher(ctx context.Context, publisher interface{ Sync(context.Context) error }) error { if publisher == nil { return nil } return publisher.Sync(ctx) } func syncExtensionResourcePublishers(ctx context.Context, state *bootState) error { for _, p := range []interface{ Sync(context.Context) error }{ state.agentSkillResources, state.hookBindings, state.toolMCPResources, state.bundleResources, } { if err := syncPublisher(ctx, p); err != nil { return err } } return nil }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/boot.go` around lines 1070 - 1092, The repeated nil-check-and-Sync pattern in syncExtensionResourcePublishers can be consolidated: add a small helper like syncPublisher that accepts the interface{ Sync(context.Context) error } and returns nil if the passed publisher is nil or forwards the call to publisher.Sync(ctx); then rewrite syncExtensionResourcePublishers to iterate over the slice of publishers (state.agentSkillResources, state.hookBindings, state.toolMCPResources, state.bundleResources) calling syncPublisher for each and returning any error immediately; reference the helper name syncPublisher and the existing function syncExtensionResourcePublishers and the fields state.agentSkillResources, state.hookBindings, state.toolMCPResources, state.bundleResources when making the change.
405-416: Potential nil dereference ifresourceReconcileis set after this callback is created.The trigger callback captures
state.resourceReconcileby reference, butresourceReconcileis set later inbootResourceReconcile. The nil check inside the callback handles this correctly, but it creates a subtle ordering dependency. Consider documenting this expectation or restructuring to make the dependency explicit.// The callback correctly handles nil but relies on resourceReconcile being set // later in the boot sequence (by bootResourceReconcile).🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/boot.go` around lines 405 - 416, The callback passed to state.bridges.setResourceDefinitions closes over state.resourceReconcile which may be set later by bootResourceReconcile, creating an ordering dependency; introduce a small stable accessor to avoid the capture problem: add a method on state (e.g., State.triggerResourceReconcile(ctx, kind, reason) or State.getResourceReconcile()) that safely reads state.resourceReconcile (with any needed sync/atomic) and invokes Trigger if non-nil, then replace the inline anonymous callback in setResourceDefinitions with a call to that method; alternatively move bootResourceReconcile to run before calling state.bridges.setResourceDefinitions, but prefer the accessor/wrapper approach for clarity and safety.internal/api/core/resources.go (1)
354-360: Consider whether masking internal errors as 400 is always appropriate.The
statusForResourceRequestErrorfunction maps500 Internal Server Errorto400 Bad Request. This could mask legitimate server-side issues during request parsing. Consider whether specific error types should preserve their original status.// If StatusForResourceError returns 500, it might indicate a real server error // rather than a client request error. Consider logging these cases.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/resources.go` around lines 354 - 360, The current statusForResourceRequestError function unconditionally remaps a StatusForResourceError result of http.StatusInternalServerError to http.StatusBadRequest; instead, change it to preserve the original 500 for genuine server-side errors and only remap when the error is a known client-parsing type—update statusForResourceRequestError to call StatusForResourceError(err), inspect the returned status and/or the underlying error type (from err) to decide whether to convert 500->400 (only for identified client parsing/validation errors), otherwise return the original 500, and add a process/log call when StatusForResourceError returns http.StatusInternalServerError so server errors are recorded for debugging.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: e7222471-8423-4796-88eb-95f6798a5602
⛔ Files ignored due to path filters (6)
extensions/bridges/gchat/extension.tomlis excluded by!**/*.tomlgo.sumis excluded by!**/*.suminternal/environment/daytona/VALIDATION.mdis excluded by!**/*.mdopenapi/agh.jsonis excluded by!**/*.jsonsdk/typescript/src/generated/contracts.tsis excluded by!**/generated/**web/src/generated/agh-openapi.d.tsis excluded by!**/generated/**
📒 Files selected for processing (270)
extensions/bridges/discord/provider.goextensions/bridges/gchat/provider.goextensions/bridges/gchat/provider_test.goextensions/bridges/github/provider.goextensions/bridges/github/provider_test.goextensions/bridges/linear/runtime_test.goextensions/bridges/slack/provider.goextensions/bridges/slack/provider_test.goextensions/bridges/teams/provider_test.goextensions/bridges/telegram/provider_test.goextensions/bridges/whatsapp/provider_test.gogo.modinternal/acp/client.gointernal/acp/client_integration_test.gointernal/acp/client_test.gointernal/acp/handlers.gointernal/acp/launcher.gointernal/acp/launcher_tool_host_test.gointernal/acp/permission.gointernal/acp/tool_host.gointernal/acp/types.gointernal/api/contract/contract.gointernal/api/contract/contract_test.gointernal/api/contract/resources.gointernal/api/contract/responses.gointernal/api/core/conversions.gointernal/api/core/conversions_parsers_test.gointernal/api/core/errors.gointernal/api/core/handlers.gointernal/api/core/handlers_test.gointernal/api/core/interfaces.gointernal/api/core/memory_workspace_test.gointernal/api/core/more_coverage_test.gointernal/api/core/resources.gointernal/api/core/resources_test.gointernal/api/core/workspaces.gointernal/api/httpapi/handlers.gointernal/api/httpapi/handlers_test.gointernal/api/httpapi/helpers_test.gointernal/api/httpapi/httpapi_integration_test.gointernal/api/httpapi/resources_test.gointernal/api/httpapi/routes.gointernal/api/httpapi/server.gointernal/api/spec/resources_test.gointernal/api/spec/spec.gointernal/api/testutil/apitest.gointernal/api/udsapi/handlers_test.gointernal/api/udsapi/helpers_test.gointernal/api/udsapi/resources_test.gointernal/api/udsapi/routes.gointernal/api/udsapi/server.gointernal/api/udsapi/udsapi_integration_test.gointernal/automation/manager.gointernal/automation/resource.gointernal/automation/resource_projection.gointernal/automation/resource_test.gointernal/bridges/managed_sync.gointernal/bridges/resource.gointernal/bridges/resource_projection.gointernal/bridges/resource_test.gointernal/bridgesdk/test_helpers_test.gointernal/bundles/resource.gointernal/bundles/resource_integration_test.gointernal/bundles/resource_projection.gointernal/bundles/resource_store.gointernal/bundles/resource_store_test.gointernal/bundles/resource_test.gointernal/bundles/service.gointernal/bundles/service_test.gointernal/cli/cli_integration_test.gointernal/cli/session.gointernal/cli/workspace.gointernal/cli/workspace_test.gointernal/config/agent_resource.gointernal/config/agent_resource_test.gointernal/config/bootstrap.gointernal/config/config.gointernal/config/config_test.gointernal/config/mcp_resource.gointernal/config/mcp_resource_test.gointernal/config/merge.gointernal/config/merge_test.gointernal/daemon/agent_skill_resources.gointernal/daemon/agent_skill_resources_integration_test.gointernal/daemon/agent_skill_resources_test.gointernal/daemon/automation_resources.gointernal/daemon/boot.gointernal/daemon/bridge_resources.gointernal/daemon/bridges.gointernal/daemon/bridges_test.gointernal/daemon/bundle_resources.gointernal/daemon/bundle_resources_test.gointernal/daemon/daemon.gointernal/daemon/daemon_integration_test.gointernal/daemon/daemon_test.gointernal/daemon/environment_reconcile.gointernal/daemon/environment_reconcile_integration_test.gointernal/daemon/environment_reconcile_test.gointernal/daemon/extensions.gointernal/daemon/hook_agent_events.gointernal/daemon/hook_binding_resources.gointernal/daemon/hook_binding_resources_integration_test.gointernal/daemon/hook_binding_resources_test.gointernal/daemon/hook_bindings.gointernal/daemon/hooks_bridge.gointernal/daemon/notifier_test.gointernal/daemon/task_runtime.gointernal/daemon/tool_mcp_resources.gointernal/daemon/tool_mcp_resources_integration_test.gointernal/environment/daytona/doc.gointernal/environment/daytona/env.gointernal/environment/daytona/launcher.gointernal/environment/daytona/provider.gointernal/environment/daytona/provider_integration_test.gointernal/environment/daytona/provider_test.gointernal/environment/daytona/sdk.gointernal/environment/daytona/sdk_test.gointernal/environment/daytona/shell.gointernal/environment/daytona/ssh.gointernal/environment/daytona/ssh_test.gointernal/environment/daytona/ssh_token_test.gointernal/environment/daytona/ssh_validation_test.gointernal/environment/daytona/state.gointernal/environment/daytona/sync.gointernal/environment/daytona/tar.gointernal/environment/daytona/tar_test.gointernal/environment/daytona/tool_host.gointernal/environment/daytona/transport.gointernal/environment/local/provider.gointernal/environment/local/provider_test.gointernal/environment/providertest/suite.gointernal/environment/providertest/suite_test.gointernal/environment/registry.gointernal/environment/registry_test.gointernal/environment/types.gointernal/environment/types_test.gointernal/extension/bridge_delivery_integration_test.gointernal/extension/bundle_additional_test.gointernal/extension/capability.gointernal/extension/capability_test.gointernal/extension/contract/host_api.gointernal/extension/contract/sdk.gointernal/extension/describe.gointernal/extension/gchat_provider_integration_test.gointernal/extension/host_api.gointernal/extension/host_api_bridges_render_test.gointernal/extension/host_api_integration_test.gointernal/extension/host_api_resources.gointernal/extension/host_api_test.gointernal/extension/linear_provider_integration_test.gointernal/extension/manager.gointernal/extension/manager_integration_test.gointernal/extension/manager_test.gointernal/extension/manifest.gointernal/extension/manifest_test.gointernal/extension/protocol/host_api.gointernal/extension/protocol/host_api_test.gointernal/extension/reference_integration_test.gointernal/extension/registry.gointernal/extension/registry_bundles_test.gointernal/extension/registry_test.gointernal/extension/resource_publication.gointernal/extension/resource_publication_test.gointernal/extension/surfaces/registry.gointernal/extension/surfaces/registry_test.gointernal/extension/telegram_reference_integration_test.gointernal/extensiontest/bridge_adapter_harness.gointernal/hooks/agent_event.gointernal/hooks/binding_state.gointernal/hooks/dispatch.gointernal/hooks/events.gointernal/hooks/events_test.gointernal/hooks/hooks.gointernal/hooks/hooks_test.gointernal/hooks/introspection.gointernal/hooks/introspection_test.gointernal/hooks/matcher.gointernal/hooks/matcher_test.gointernal/hooks/normalize.gointernal/hooks/payloads.gointernal/hooks/payloads_test.gointernal/hooks/types.gointernal/network/delivery_integration_test.gointernal/network/tasks.gointernal/observe/observer.gointernal/observe/reconcile.gointernal/resources/codec.gointernal/resources/doc.gointernal/resources/errors.gointernal/resources/kernel.gointernal/resources/kernel_integration_test.gointernal/resources/kernel_test.gointernal/resources/projector.gointernal/resources/reconcile.gointernal/resources/reconcile_integration_test.gointernal/resources/reconcile_test.gointernal/resources/schema.gointernal/resources/typed.gointernal/resources/typed_integration_test.gointernal/resources/typed_test.gointernal/resources/types.gointernal/resources/validate.gointernal/session/environment.gointernal/session/environment_exec.gointernal/session/hooks.gointernal/session/interfaces.gointernal/session/manager.gointernal/session/manager_environment_test.gointernal/session/manager_hooks_test.gointernal/session/manager_integration_test.gointernal/session/manager_lifecycle.gointernal/session/manager_prompt.gointernal/session/manager_start.gointernal/session/manager_stop_integration_test.gointernal/session/manager_test.gointernal/session/manager_workspace.gointernal/session/notifier.gointernal/session/query.gointernal/session/query_test.gointernal/session/resume_repair.gointernal/session/resume_repair_test.gointernal/session/session.gointernal/session/session_test.gointernal/skills/loader.gointernal/skills/registry.gointernal/skills/registry_external.gointernal/skills/registry_test.gointernal/skills/resource.gointernal/skills/resource_test.gointernal/store/globaldb/global_db.gointernal/store/globaldb/global_db_automation.gointernal/store/globaldb/global_db_automation_test.gointernal/store/globaldb/global_db_bridge.gointernal/store/globaldb/global_db_bridges_test.gointernal/store/globaldb/global_db_bundles.gointernal/store/globaldb/global_db_bundles_test.gointernal/store/globaldb/global_db_extra_test.gointernal/store/globaldb/global_db_resources_integration_test.gointernal/store/globaldb/global_db_resources_test.gointernal/store/globaldb/global_db_session.gointernal/store/globaldb/global_db_session_test.gointernal/store/globaldb/global_db_task_graph_audit_test.gointernal/store/globaldb/global_db_task_test.gointernal/store/globaldb/global_db_test.gointernal/store/globaldb/global_db_workspace.gointernal/store/globaldb/migrate_workspace.gointernal/store/meta_test.gointernal/store/store_helpers_test.gointernal/store/types.gointernal/subprocess/handshake.gointernal/subprocess/handshake_test.gointernal/subprocess/process_test.gointernal/tools/resource.gointernal/tools/resource_test.gointernal/workspace/clone.gointernal/workspace/resolver.gointernal/workspace/resolver_crud.gointernal/workspace/resolver_integration_test.gointernal/workspace/resolver_test.gointernal/workspace/workspace.gointernal/workspace/workspace_test.gosdk/examples/telegram-reference/main_test.gosdk/typescript/src/extension.test.tssdk/typescript/src/extension.tssdk/typescript/src/host-api.test.tssdk/typescript/src/host-api.tssdk/typescript/src/index.tssdk/typescript/src/integration.test.tssdk/typescript/src/testing/harness.tssdk/typescript/src/types.ts
💤 Files with no reviewable changes (2)
- internal/acp/permission.go
- extensions/bridges/github/provider.go
There was a problem hiding this comment.
Actionable comments posted: 11
🧹 Nitpick comments (7)
internal/bridges/managed_sync.go (1)
168-170: Wrap source validation errors with method context.Line 169 returns
normalizedSource.Validate()directly, which loses caller context in logs and error chains.Proposed fix
normalizedSource := source.Normalize() if err := normalizedSource.Validate(); err != nil { - return resources.MutationActor{}, "", err + return resources.MutationActor{}, "", fmt.Errorf("bridges: validate managed resource sync source: %w", err) }As per coding guidelines, "
**/*.go: Use explicit error returns with wrapped context:fmt.Errorf(\"context: %w\", err)".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/bridges/managed_sync.go` around lines 168 - 170, The call returning normalizedSource.Validate() should wrap the error with contextual method info instead of returning err directly; change the return that currently does `return resources.MutationActor{}, "", err` to return a wrapped error using fmt.Errorf("managed_sync <method>: validate normalizedSource: %w", err) (or use the actual surrounding function name) so the error chain contains caller context; locate the call to normalizedSource.Validate() and update the return to wrap the error with fmt.Errorf and %w.internal/automation/resource_projection.go (2)
474-476: Consider tolerating not-found errors when deleting webhook secrets.
DeleteTriggerWebhookSecretis called unconditionally, but non-webhook triggers won't have an associated secret. If the store returns an error for missing secrets, this will fail unnecessarily.Compare with line 700-703 where
ErrTriggerWebhookSecretNotFoundis explicitly tolerated during managed sync cleanup.♻️ Proposed fix to tolerate not-found errors
- if err := m.store.DeleteTriggerWebhookSecret(ctx, current.ID); err != nil { + if err := m.store.DeleteTriggerWebhookSecret(ctx, current.ID); err != nil && + !errors.Is(err, ErrTriggerWebhookSecretNotFound) { return err }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/automation/resource_projection.go` around lines 474 - 476, The unconditional call to m.store.DeleteTriggerWebhookSecret(ctx, current.ID) should tolerate the store's "not found" result; change the error handling so that if DeleteTriggerWebhookSecret returns ErrTriggerWebhookSecretNotFound you ignore it and continue, otherwise return the error. Locate the DeleteTriggerWebhookSecret invocation and replace the single-return-on-error with a conditional check against ErrTriggerWebhookSecretNotFound (same pattern used around ErrTriggerWebhookSecretNotFound handling near the managed sync cleanup) so non-webhook triggers do not cause failures.
669-672: Webhook secret synced before unchanged check.The webhook secret is synced before checking if the trigger definition is unchanged (lines 674-680). This ensures secrets are always consistent but performs potentially redundant work for unchanged triggers.
This appears intentional for consistency guarantees. Consider adding a brief comment explaining this design choice if it's intentional.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/automation/resource_projection.go` around lines 669 - 672, The call to syncManagedTriggerWebhookSecret(ctx, Trigger{}, next, secret) is intentionally performed before the "unchanged" check to guarantee webhook secrets in desiredSecrets are always reconciled even when trigger definitions are unchanged; add a brief comment immediately above this call referencing syncManagedTriggerWebhookSecret, the Trigger{} placeholder and next/desiredSecrets to state that this ordering is deliberate for secret consistency and idempotency (or, if you prefer, move the sync after the unchanged check and document the tradeoff). Ensure the comment explains the design choice and that redundant syncs are acceptable to keep secrets consistent.internal/automation/resource_test.go (1)
17-91: Consider usingt.Run("Should...")subtests for each validation case.The test validates multiple codec rejection scenarios inline. Per coding guidelines, tests should use
t.Run("Should...")pattern for all test cases. This improves failure isolation and test readability.As per coding guidelines: "MUST use t.Run("Should...") pattern for ALL test cases".
♻️ Example refactor for one subtest
+ t.Run("Should reject job with scope mismatch", func(t *testing.T) { + t.Parallel() jobWithScopeMismatch := validJob jobWithScopeMismatch.WorkspaceID = "ws-other" if _, err := jobCodec.DecodeAndValidate( ctx, workspaceScope, mustAutomationJSON(t, jobWithScopeMismatch), ); !errors.Is(err, resources.ErrInvalidScopeBinding) { t.Fatalf("job scope mismatch error = %v, want ErrInvalidScopeBinding", err) } else if !strings.Contains(err.Error(), "automation: bind job resource scope") { t.Fatalf("job scope mismatch error = %v, want bind job resource scope context", err) } + })🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/automation/resource_test.go` around lines 17 - 91, Refactor TestAutomationResourceCodecsRejectInvalidSpecs to split each validation scenario into its own t.Run subtest (e.g., "Should reject job scope mismatch", "Should reject malformed job schedule", "Should reject trigger with bad filter", "Should reject webhook without endpoint"); keep the existing setup (jobCodec, triggerCodec, ctx, workspaceScope, validJob/validTrigger) outside/above the subtests, call t.Parallel() at the top of the parent test (and optionally inside each subtest if desired), and move each DecodeAndValidate call and its subsequent error assertions into the corresponding t.Run body while preserving the exact error checks against resources.ErrInvalidScopeBinding and the strings.Contains checks on the error messages.internal/acp/handlers_test.go (2)
1233-1281: Test double implements ToolHost interface correctly.The
contextAwareToolHostprovides minimal stub implementations for all interface methods while allowing injection of customCreateTerminalbehavior. This is a clean approach for focused testing.Consider adding compile-time interface verification to ensure the test double stays in sync with the interface:
💡 Suggested enhancement
type contextAwareToolHost struct { createTerminalFn func(context.Context, acpsdk.CreateTerminalRequest) (acpsdk.CreateTerminalResponse, error) } + +var _ ToolHost = contextAwareToolHost{}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/acp/handlers_test.go` around lines 1233 - 1281, Add a compile-time interface assertion to ensure contextAwareToolHost implements the ToolHost interface: after the contextAwareToolHost type declaration, add a line that assigns a *contextAwareToolHost to a ToolHost typed nil (e.g., the common var _ ToolHost = (*contextAwareToolHost)(nil) pattern) so the compiler will fail if the test double falls out of sync with ToolHost.
691-692: Missingt.Parallel()in test function.
TestNetworkTurnTerminalOwnershipGuardsdoes not callt.Parallel(), unlike most other tests in this file. This may be intentional due to environment manipulation (t.Setenv), but if so, a comment explaining why would be helpful.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/acp/handlers_test.go` around lines 691 - 692, TestNetworkTurnTerminalOwnershipGuards is missing t.Parallel(); either add t.Parallel() at the top of the test to run it in parallel like the other tests, or if the test intentionally manipulates global environment (e.g., uses t.Setenv or mutates shared state) add a brief comment above the test explaining why it must be serial and keep t.Parallel() omitted; locate the TestNetworkTurnTerminalOwnershipGuards function and update it accordingly (add t.Parallel() as the first statement or add the explanatory comment).internal/acp/launcher_tool_host_test.go (1)
370-429: fakeHandle implementation is correct but missing interface verification.The
fakeHandleproperly implements theHandleinterface with pipe management andsync.Oncefor safe finish semantics. Consider adding compile-time interface verification.💡 Suggested enhancement
+var _ environment.Handle = (*fakeHandle)(nil) + type fakeHandle struct { cwd string🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/acp/launcher_tool_host_test.go` around lines 370 - 429, Add a compile-time interface assertion to ensure fakeHandle implements the Handle interface: add a var declaration like a nil assignment assertion referencing the Handle interface and the *fakeHandle type (e.g., var _ Handle = (*fakeHandle)(nil)) near the fakeHandle type definition so the compiler will catch any future signature drift for methods like PID, Cwd, Stdin, Stdout, Stderr, Done, Wait, and Stop.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@extensions/bridges/discord/provider_test.go`:
- Around line 1116-1121: The test assertion that isNotInitializedRPCError
rejects RPC code -32001 should be moved into a t.Run subtest; locate the failing
assertion in provider_test.go that directly calls
isNotInitializedRPCError(&subprocess.RPCError{Code: -32001, Message: "Not
initialized"}) and wrap it in t.Run with a descriptive name (e.g., "returns
false for -32001"), keeping the same call and the t.Fatal check inside the
subtest body so it follows the test-structure requirement for subtests.
In `@internal/api/httpapi/httpapi_integration_test.go`:
- Around line 196-226: Replace the top-level
TestHTTPResourceMutationRoutesRemainUnavailableWithoutOperatorAuth body with a
t.Run subtest: wrap the existing test logic (including the call to
newIntegrationRuntime and both HTTP PUT/DELETE requests and assertions) inside
t.Run("Should keep mutation routes unavailable without operator auth", func(t
*testing.T) { ... }), keeping all assertions and defer closes exactly as-is;
ensure the test function name remains
TestHTTPResourceMutationRoutesRemainUnavailableWithoutOperatorAuth and only the
internal execution is converted to the t.Run("Should...") pattern so it follows
the repository's subtest naming convention.
In `@internal/api/httpapi/server_test.go`:
- Around line 112-127: Wrap the test body in t.Run("Should reject resource auth
without resource service", func(t *testing.T) { ... }) and strengthen the
assertion: call New(...) as currently using
WithResourceOperatorAuth(func(*gin.Context) {}) but without providing a resource
service, then assert the returned err is non-nil and specifically matches the
expected failure using testing helpers (e.g. require.ErrorContains or t.Fatalf
with strings.Contains) to check the error message mentions the missing resource
service (reference TestNewRejectsResourceAuthWithoutResourceService, New,
WithResourceOperatorAuth, WithResourceService and use ErrorContains/ErrorAs
semantics).
In `@internal/api/spec/resources_test.go`:
- Around line 8-65: Wrap each logical assertion block in the two tests into
named subtests using t.Run("Should ...") and move the t.Parallel() into those
subtests (or call it both at top-level and inside subtests if desired);
specifically, in TestResourceOperationsSupportHTTPAndUDS create a t.Run("Should
expose expected resource operations over HTTP and UDS") that performs the
want/seen map building and the loop asserting OperationID and Transports; in
TestDocumentDescribesResourceCRUDSchemas create separate t.Run subtests (e.g.,
t.Run("Should describe listResources query parameters"), t.Run("Should validate
putResource request schema"), t.Run("Should validate deleteResource request
schema")) that call operationFor, jsonRequestSchema, and the assert* helpers so
each check becomes an independent subtest following the "Should..." naming
convention.
In `@internal/bridges/managed_sync_test.go`:
- Around line 113-186: The test body in
TestManagedSyncerIgnoresSemanticallyEquivalentJSON is a standalone test and must
be wrapped in a t.Run("Should ...") subtest; modify the function
TestManagedSyncerIgnoresSemanticallyEquivalentJSON to call t.Run with a
descriptive name (e.g., "Should ignore semantically equivalent JSON") and move
the existing test logic (including t.Parallel(), the stubRegistryStore setup,
insert/update/delete hooks, syncer creation and assertions) into the subtest
callback so the test follows the repository's t.Run("Should...") pattern while
keeping the same identifiers (stubRegistryStore, insertBridgeInstanceFn,
updateBridgeInstanceFn, deleteBridgeInstanceFn, syncer :=
bridgepkg.NewManagedSyncer, SyncManagedInstances, stats checks).
In `@internal/bridges/managed_sync.go`:
- Around line 145-149: The reconcile is being triggered for no-op runs because
the loop increments the synced counter even when records are unchanged; update
the logic in the ManagedSyncStats accounting so that synced is only incremented
when an actual create/update occurs (not on unchanged records) — adjust the
increments at the locations that currently modify synced (the block around where
synced is incremented at the former lines 211-215 and the block near 236-237) to
perform the comparison/check and only increment when a real change happened,
and/or add a new boolean/changed counter and change the reconcile trigger (the
s.triggerResourceReconcile(ctx) guard currently using synced > 0) to use that
real-change indicator (or removed > 0) so semantic no-ops do not cause
reconciliation.
- Around line 250-260: Trim and normalize next.ID into a local variable (e.g.,
trimmedID := strings.TrimSpace(next.ID)) before any validation or lookup, use
trimmedID for the empty check, duplicate detection against desiredByID, and when
calling BridgeInstanceSpecFromInstance/returning the ID so duplicates like
"brg-1" vs " brg-1 " are detected and the returned ID matches the checked key.
In `@internal/bundles/service.go`:
- Around line 826-836: The fallback for the same-extension branch leaves
platform empty when s.loadExtension returns nil provider or a nil Manifest;
instead of letting instance.Validate fail later, detect provider == nil or
provider.Manifest == nil after calling s.loadExtension(extensionName) and return
the same explicit unavailable-provider error used in the other branch (e.g.,
bridgepkg.ErrBridgeProviderUnavailable or the project's equivalent) with a clear
message referencing extensionName so callers see the root cause; update the code
around the activation.ExtensionName branch where platform,
bundleRecord.Spec.OwnerBridgePlatform, s.loadExtension, and
provider.Manifest.Bridge.Platform are used to perform this check and early
return.
- Around line 177-180: Wrap all raw error returns in internal/bundles/service.go
with contextual fmt.Errorf messages using the %w verb; e.g., replace bare
"return nil, err" or "return err" after calls like
s.store.ListBundleResources(ctx) with something like fmt.Errorf("listing bundle
resources: %w", err). Do the same for the other three occurrences noted in this
file—add descriptive operation context (including relevant identifiers such as
bundle ID or resource name where available), use %w to preserve the original
error, and add "fmt" to the imports if not already present.
In `@internal/config/agent_resource.go`:
- Around line 28-30: The code currently returns raw validation errors from
normalizedScope.Validate("scope") (and the similar call at the later return
around lines 48-50); update both return paths to wrap the underlying error with
contextual messages using fmt.Errorf("validating %s scope: %w", "scope", err)
(or similar), replacing the plain "return AgentDef{}, err" with a wrapped error;
ensure fmt is imported if not already.
---
Nitpick comments:
In `@internal/acp/handlers_test.go`:
- Around line 1233-1281: Add a compile-time interface assertion to ensure
contextAwareToolHost implements the ToolHost interface: after the
contextAwareToolHost type declaration, add a line that assigns a
*contextAwareToolHost to a ToolHost typed nil (e.g., the common var _ ToolHost =
(*contextAwareToolHost)(nil) pattern) so the compiler will fail if the test
double falls out of sync with ToolHost.
- Around line 691-692: TestNetworkTurnTerminalOwnershipGuards is missing
t.Parallel(); either add t.Parallel() at the top of the test to run it in
parallel like the other tests, or if the test intentionally manipulates global
environment (e.g., uses t.Setenv or mutates shared state) add a brief comment
above the test explaining why it must be serial and keep t.Parallel() omitted;
locate the TestNetworkTurnTerminalOwnershipGuards function and update it
accordingly (add t.Parallel() as the first statement or add the explanatory
comment).
In `@internal/acp/launcher_tool_host_test.go`:
- Around line 370-429: Add a compile-time interface assertion to ensure
fakeHandle implements the Handle interface: add a var declaration like a nil
assignment assertion referencing the Handle interface and the *fakeHandle type
(e.g., var _ Handle = (*fakeHandle)(nil)) near the fakeHandle type definition so
the compiler will catch any future signature drift for methods like PID, Cwd,
Stdin, Stdout, Stderr, Done, Wait, and Stop.
In `@internal/automation/resource_projection.go`:
- Around line 474-476: The unconditional call to
m.store.DeleteTriggerWebhookSecret(ctx, current.ID) should tolerate the store's
"not found" result; change the error handling so that if
DeleteTriggerWebhookSecret returns ErrTriggerWebhookSecretNotFound you ignore it
and continue, otherwise return the error. Locate the DeleteTriggerWebhookSecret
invocation and replace the single-return-on-error with a conditional check
against ErrTriggerWebhookSecretNotFound (same pattern used around
ErrTriggerWebhookSecretNotFound handling near the managed sync cleanup) so
non-webhook triggers do not cause failures.
- Around line 669-672: The call to syncManagedTriggerWebhookSecret(ctx,
Trigger{}, next, secret) is intentionally performed before the "unchanged" check
to guarantee webhook secrets in desiredSecrets are always reconciled even when
trigger definitions are unchanged; add a brief comment immediately above this
call referencing syncManagedTriggerWebhookSecret, the Trigger{} placeholder and
next/desiredSecrets to state that this ordering is deliberate for secret
consistency and idempotency (or, if you prefer, move the sync after the
unchanged check and document the tradeoff). Ensure the comment explains the
design choice and that redundant syncs are acceptable to keep secrets
consistent.
In `@internal/automation/resource_test.go`:
- Around line 17-91: Refactor TestAutomationResourceCodecsRejectInvalidSpecs to
split each validation scenario into its own t.Run subtest (e.g., "Should reject
job scope mismatch", "Should reject malformed job schedule", "Should reject
trigger with bad filter", "Should reject webhook without endpoint"); keep the
existing setup (jobCodec, triggerCodec, ctx, workspaceScope,
validJob/validTrigger) outside/above the subtests, call t.Parallel() at the top
of the parent test (and optionally inside each subtest if desired), and move
each DecodeAndValidate call and its subsequent error assertions into the
corresponding t.Run body while preserving the exact error checks against
resources.ErrInvalidScopeBinding and the strings.Contains checks on the error
messages.
In `@internal/bridges/managed_sync.go`:
- Around line 168-170: The call returning normalizedSource.Validate() should
wrap the error with contextual method info instead of returning err directly;
change the return that currently does `return resources.MutationActor{}, "",
err` to return a wrapped error using fmt.Errorf("managed_sync <method>: validate
normalizedSource: %w", err) (or use the actual surrounding function name) so the
error chain contains caller context; locate the call to
normalizedSource.Validate() and update the return to wrap the error with
fmt.Errorf and %w.
🪄 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: 7c0c9625-737d-466c-b833-d7586f42ef36
⛔ Files ignored due to path filters (47)
.compozy/tasks/ext-parity/reviews-001/_meta.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_001.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_002.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_003.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_004.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_005.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_006.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_007.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_008.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_009.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_010.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_011.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_012.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_013.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_014.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_015.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_016.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_017.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_018.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_019.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_020.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_021.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_022.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_023.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_024.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_025.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_026.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_027.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_028.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_029.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_030.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_031.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_032.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_033.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_034.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_035.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_036.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_037.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_038.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_039.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_040.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_041.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_042.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_043.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_044.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_045.mdis excluded by!**/*.md.compozy/tasks/ext-parity/reviews-001/issue_046.mdis excluded by!**/*.md
📒 Files selected for processing (40)
extensions/bridges/discord/provider.goextensions/bridges/discord/provider_test.goextensions/bridges/github/provider.goextensions/bridges/github/provider_test.goextensions/bridges/teams/provider_test.gointernal/acp/client.gointernal/acp/handlers.gointernal/acp/handlers_test.gointernal/acp/launcher.gointernal/acp/launcher_tool_host_test.gointernal/acp/types.gointernal/api/core/conversions.gointernal/api/core/conversions_parsers_test.gointernal/api/core/handlers.gointernal/api/core/handlers_test.gointernal/api/httpapi/httpapi_integration_test.gointernal/api/httpapi/server.gointernal/api/httpapi/server_test.gointernal/api/spec/resources_test.gointernal/api/spec/spec.gointernal/automation/manager.gointernal/automation/resource.gointernal/automation/resource_projection.gointernal/automation/resource_test.gointernal/bridges/managed_sync.gointernal/bridges/managed_sync_test.gointernal/bridges/resource_projection.gointernal/bridges/resource_test.gointernal/bundles/resource_projection.gointernal/bundles/resource_test.gointernal/bundles/service.gointernal/config/agent_resource.gointernal/config/agent_resource_test.gointernal/config/mcp_resource.gointernal/config/mcp_resource_test.gointernal/daemon/automation_resources.gointernal/daemon/automation_resources_test.gointernal/daemon/bridges.gointernal/daemon/bridges_test.gointernal/extension/host_api_test.go
✅ Files skipped from review due to trivial changes (2)
- internal/bridges/resource_test.go
- internal/automation/manager.go
🚧 Files skipped from review as they are similar to previous changes (17)
- internal/api/core/conversions.go
- extensions/bridges/discord/provider.go
- internal/api/core/conversions_parsers_test.go
- internal/config/mcp_resource.go
- internal/acp/types.go
- internal/config/mcp_resource_test.go
- internal/api/core/handlers_test.go
- internal/config/agent_resource_test.go
- internal/bundles/resource_test.go
- internal/api/core/handlers.go
- extensions/bridges/github/provider_test.go
- internal/api/spec/spec.go
- internal/automation/resource.go
- internal/bundles/resource_projection.go
- internal/acp/launcher.go
- internal/acp/handlers.go
- internal/bridges/resource_projection.go
Port the Daytona runtime and test changes from 3c663ce without the unrelated .compozy QA artifacts from ext-refac.
## 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>
## 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>
## 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>
## 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 --> [](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>
## 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 --> [](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>
Summary by CodeRabbit
New Features
Bug Fixes