refactor: rename spaces to channels#17
Conversation
|
Important Review skippedReview was skipped due to path filters ⛔ Files ignored due to path filters (4)
CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
WalkthroughThis PR renames the "channels" domain to "bridges", replaces network/session "space" with "channel", adds a full bridges domain implementation (models, registry, broker, runtime), replaces handlers/HTTP/UDS/CLI/contracts/tests to bridges, and updates many tests and wiring. Also changes ACP terminal allowlist: Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant HTTP_API as HTTP API (handlers)
participant Core as core.BaseHandlers
participant Registry as Bridge Registry
participant Runtime as Bridge Runtime
participant Broker as Bridge Broker
Client->>HTTP_API: POST /api/bridges {create payload}
HTTP_API->>Core: bind JSON -> ToCreateInstanceRequest()
Core->>Registry: CreateInstance(ctx, req)
Registry-->>Core: persisted BridgeInstance
Core->>Runtime: StartInstance (if enabled) / reload extensions
Runtime->>Broker: attach runtime / Broker()
Runtime-->>Core: started (or error + rollback)
Core->>HTTP_API: assemble BridgeResponse (health lookup)
HTTP_API-->>Client: 201 Created {BridgeResponse}
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
|
There was a problem hiding this comment.
Actionable comments posted: 8
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (11)
internal/api/udsapi/network_test.go (1)
56-87:⚠️ Potential issue | 🟡 MinorAssert the renamed
channelfield end-to-end.This test now sends and returns
channel, but it never checks that the handler actually preserves that field. It would still pass ifchannelwere dropped while workflow metadata remained intact.Suggested test tightening
if string(seenRequest.Ext["agh.workflow_id"]) != `"wf-1"` || string(seenRequest.Ext["agh.handoff_version"]) != `3` { t.Fatalf("seenRequest.Ext = %#v, want preserved workflow metadata", seenRequest.Ext) } + if seenRequest.Channel != "builders" { + t.Fatalf("seenRequest.Channel = %q, want %q", seenRequest.Channel, "builders") + } inboxResp := performRequest(t, engine, http.MethodGet, "/api/network/inbox?session_id=sess-a", nil) if inboxResp.Code != http.StatusOK { t.Fatalf("inbox status = %d, want %d", inboxResp.Code, http.StatusOK) } - if !strings.Contains(inboxResp.Body.String(), `"agh.workflow_id":"wf-1"`) || !strings.Contains(inboxResp.Body.String(), `"agh.handoff_version":3`) { + if !strings.Contains(inboxResp.Body.String(), `"channel":"builders"`) || + !strings.Contains(inboxResp.Body.String(), `"agh.workflow_id":"wf-1"`) || + !strings.Contains(inboxResp.Body.String(), `"agh.handoff_version":3`) { t.Fatalf("inbox body = %s, want workflow metadata", inboxResp.Body.String()) }As per coding guidelines, Ensure tests can fail when business logic changes.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/udsapi/network_test.go` around lines 56 - 87, The test currently doesn't assert that the "channel" field is preserved end-to-end; add assertions that the outgoing send request's channel is preserved (e.g., check seenRequest.Channel == "builders" after performRequest for /api/network/send) and that the inbox response contains the channel (e.g., assert inboxResp.Body contains `"channel":"builders"`), so the test fails if the handler drops or renames the channel field; locate checks around sendResp, seenRequest, inboxResp in network_test.go and add these two assertions.internal/extension/capability_test.go (1)
57-120:⚠️ Potential issue | 🟡 MinorAdd coverage for
bridges/instances/report_state.The production map now includes
bridges/instances/report_state -> bridge.write, but this table only exercisesbridges/instances/getandbridges/messages/ingest. A regression in the state-reporting gate would go uncaught.Suggested table entry
{ name: "allows bridge read method with matching grant", actions: []string{"bridges/instances/get"}, security: []string{"bridge.read"}, method: "bridges/instances/get", }, + { + name: "ShouldAllowBridgeStateReportWithWriteGrant", + actions: []string{"bridges/instances/report_state"}, + security: []string{"bridge.write"}, + method: "bridges/instances/report_state", + }, { name: "fails when action grant is missing", actions: nil, security: []string{"session.read"}, method: "sessions/list",As per coding guidelines, Ensure tests can fail when business logic changes.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/extension/capability_test.go` around lines 57 - 120, Add a test case to TestCapabilityCheckerCheckHostAPIShouldEnforceDualGates that covers the new mapping for "bridges/instances/report_state" -> "bridge.write": include an entry where method is "bridges/instances/report_state" and assert failure when actions do not include the required action or when security lacks "bridge.write" (set wantRequired to []string{"bridge.write"} and wantGranted accordingly), plus a passing case where actions include "bridges/instances/report_state" and security includes "bridge.write"; use the existing test table pattern to add both scenarios so regressions in the state-reporting gate are caught.internal/cli/session_test.go (1)
547-569:⚠️ Potential issue | 🟡 MinorAssert the rendered
channellabel, not only the value.Both assertions still pass if the UI keeps printing
spaceand only the value remainsbuilders. That misses the actual terminology change this PR is making.Suggested assertion update
- if !strings.Contains(human, "sess-1") || !strings.Contains(human, "/workspace/project") || !strings.Contains(human, "builders") { + if !strings.Contains(human, "sess-1") || + !strings.Contains(human, "/workspace/project") || + !strings.Contains(strings.ToLower(human), "channel") || + !strings.Contains(human, "builders") { t.Fatalf("sessionListBundle().human() = %q, want session, workspace, and channel output", human) } @@ - if !strings.Contains(toon, "sessions") || !strings.Contains(toon, "sess-1") || !strings.Contains(toon, "builders") { + if !strings.Contains(toon, "sessions") || + !strings.Contains(toon, "sess-1") || + !strings.Contains(strings.ToLower(toon), "channel") || + !strings.Contains(toon, "builders") { t.Fatalf("sessionListBundle().toon() = %q, want sessions array output with channel", toon) }As per coding guidelines, Ensure tests can fail when business logic changes.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/session_test.go` around lines 547 - 569, Update the test assertions in session_test.go that check bundle.human() and bundle.toon() to assert the rendered channel label as well as the value: in the human() checks, ensure you assert strings.Contains(human, "<channel label>") (e.g. "Channel" or the exact label used by sessionListBundle.human()) in addition to strings.Contains(human, "builders"); and similarly in the toon() checks assert strings.Contains(toon, "<channel label>") plus strings.Contains(toon, "builders"). Locate the assertions around the human, err := bundle.human() and toon, err := bundle.toon() blocks and update the strings.Contains conditions (used in those t.Fatalf checks) to include the channel label check so the test fails if the label text changes.internal/cli/network_client_test.go (1)
32-40:⚠️ Potential issue | 🟡 MinorAssert the renamed
channelfield in the send payload.This mock only checks the extension metadata, so the test still passes if
NetworkSendserializes the oldspacekey or drops the channel entirely. That leaves the main contract rename unguarded.Suggested assertion
- if !strings.Contains(string(body), `"agh.workflow_id":"wf-1"`) || !strings.Contains(string(body), `"agh.handoff_version":3`) { + if !strings.Contains(string(body), `"channel":"builders"`) || + !strings.Contains(string(body), `"agh.workflow_id":"wf-1"`) || + !strings.Contains(string(body), `"agh.handoff_version":3`) { t.Fatalf("network send body = %s, want ext metadata", body) }As per coding guidelines, "Ensure tests verify behavior outcomes, not just function calls".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/network_client_test.go` around lines 32 - 40, The test's mock handler in network_client_test.go only asserts ext metadata but not the renamed channel field, so update the handler inside the case for req.Method == http.MethodPost && req.URL.Path == "/api/network/send" to also assert that the serialized send payload contains the renamed channel key (e.g., that the request body includes `"channel":"builders"` or otherwise parse the JSON and verify the "channel" field equals "builders"); this ensures NetworkSend (and not an old "space" key) is being used—locate the request handling block in the test and add the channel assertion alongside the existing ext metadata checks.internal/cli/network.go (2)
350-384:⚠️ Potential issue | 🟡 MinorAdd
Channelto the human inbox table.The machine-readable output now includes
channel, but the default human table still omits it. For sessions receiving messages from multiple channels, the CLI view becomes ambiguous.💡 Suggested fix
return listBundle( messages, messages, "Network Inbox", - []string{"ID", "Kind", "From", "To", "Reply To", "Trace", "Workflow", "Handoff"}, + []string{"ID", "Kind", "Channel", "From", "To", "Reply To", "Trace", "Workflow", "Handoff"}, "network_inbox", []string{"id", "kind", "channel", "from", "to", "reply_to", "trace_id", "causation_id", "workflow_id", "handoff_version", "expires_at"}, func(message NetworkEnvelopeRecord) []string { return []string{ stringOrDash(message.ID), stringOrDash(message.Kind), + stringOrDash(message.Channel), stringOrDash(message.From), stringOrDash(optionalString(message.To)), stringOrDash(optionalString(message.ReplyTo)), stringOrDash(optionalString(message.TraceID)), stringOrDash(networkExtString(message.Ext, "agh.workflow_id")),🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/network.go` around lines 350 - 384, The human-readable network inbox table in networkInboxBundle omits the Channel column; update the header slice to include "Channel" (e.g., "ID", "Kind", "Channel", "From", "To", "Reply To", "Trace", "Workflow", "Handoff") and insert the corresponding value in the human row formatter (the first func(message NetworkEnvelopeRecord) []string) by adding stringOrDash(message.Channel) in the matching position so the human table columns align with the machine-readable fields generated by the second formatter.
150-165:⚠️ Potential issue | 🟡 MinorHandle
MarkFlagRequirederrors instead of discarding them.Lines 162–165 discard the error return value with
_ =, violating the guideline "Never ignore errors with_— every error must be handled or have a written justification". If a flag name is misspelled or renamed, the error check silently fails at setup time. Either check and propagate the error, or add a comment explaining why it is safe to ignore.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/network.go` around lines 150 - 165, The calls to cmd.MarkFlagRequired("session"/"channel"/"kind"/"body") currently ignore returned errors; update the code around the cmd.MarkFlagRequired invocations to capture the error (e.g., err := cmd.MarkFlagRequired(...)) and handle it instead of using `_ =`, by returning the error from the enclosing function or logging and exiting (use processLogger/fmt.Errorf/cli.Errorf or return err) so flag registration failures don't go unnoticed; specifically modify each cmd.MarkFlagRequired call in the network command setup to check err and propagate or handle it for the "session", "channel", "kind", and "body" flags.internal/api/core/network_test.go (1)
27-57:⚠️ Potential issue | 🟡 MinorAssert the renamed
Channels/Channelfields explicitly.These fixtures now populate the renamed fields, but the assertions only check neighboring data. The suite would still pass if the mapper dropped
Channelsor if/network/channelsforgot to emit the channel name.💡 Suggested fix
- if payload == nil || payload.MessagesDelivered != 3 || len(payload.KindMetrics) != 1 || payload.KindMetrics[0].Kind != string(network.KindSay) { + if payload == nil || payload.Channels != 1 || payload.MessagesDelivered != 3 || len(payload.KindMetrics) != 1 || payload.KindMetrics[0].Kind != string(network.KindSay) { t.Fatalf("NetworkStatusPayloadFromStatus() = %#v", payload) }- if statusPayload.Network.QueuedMessages != 2 || len(statusPayload.Network.KindMetrics) != 1 { + if statusPayload.Network.Channels != 1 || statusPayload.Network.QueuedMessages != 2 || len(statusPayload.Network.KindMetrics) != 1 { t.Fatalf("status payload = %#v", statusPayload.Network) }- if len(channelsPayload.Channels) != 1 || channelsPayload.Channels[0].PeerCount != 2 { + if len(channelsPayload.Channels) != 1 || channelsPayload.Channels[0].Channel != "builders" || channelsPayload.Channels[0].PeerCount != 2 { t.Fatalf("channels payload = %#v", channelsPayload.Channels) }As per coding guidelines, "Focus on critical paths: workflow execution, state management, error handling" and "Ensure tests verify behavior outcomes, not just function calls".
Also applies to: 150-203, 246-278
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/network_test.go` around lines 27 - 57, The test fails to explicitly assert the renamed channel fields: update the NetworkStatusPayloadFromStatus test to assert that the mapped channel count matches the source (check payload.Channels equals status.Channels) and also assert the channel identity is emitted (if the payload exposes a single channel field like payload.Channel or a slice of channel entries, assert it's non-empty and contains the expected name); modify the assertions around core.NetworkStatusPayloadFromStatus, referencing NetworkStatus.Channels and the payload's Channels/Channel (or ChannelName) field(s) so the test will fail if channel data is dropped or not emitted.internal/cli/bridge.go (1)
539-556:⚠️ Potential issue | 🟡 MinorEnforce the advertised
object|nullcontract for delivery defaults.
json.Validonly checks syntax, so values like"text",123, or[]currently pass even though the flag help says this field must be a JSON object ornull. When these invalid types reach downstream code, they are silently ignored during unmarshaling into thedeliveryTargetDefaultsstruct, making it easy to persist or send a bridge configuration that behaves unexpectedly.Suggested fix
func parseRequiredBridgeJSON(raw string) (*json.RawMessage, error) { trimmed := strings.TrimSpace(raw) if trimmed == "" { return nil, errors.New("cli: delivery defaults must be valid JSON; use null to clear") } - if !json.Valid([]byte(trimmed)) { + var decoded any + if err := json.Unmarshal([]byte(trimmed), &decoded); err != nil { return nil, errors.New("cli: delivery defaults must be valid JSON") } + switch decoded.(type) { + case nil, map[string]any: + default: + return nil, errors.New("cli: delivery defaults must be a JSON object or null") + } value := json.RawMessage(trimmed) return &value, nil }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/bridge.go` around lines 539 - 556, The parsing currently only checks JSON syntax, allowing non-object values; update parseRequiredBridgeJSON (and by extension parseOptionalBridgeJSON which delegates to it) to reject any JSON that is not either an object or null: after json.Valid, json.Unmarshal the trimmed string into an interface{} and ensure the resulting value is either nil (for "null") or a map[string]interface{} (a JSON object); if not, return an error like "cli: delivery defaults must be a JSON object or null". Ensure parseOptionalBridgeJSON still returns nil for empty input and that parseRequiredBridgeJSON returns a json.RawMessage for valid object or "null".internal/cli/cli_integration_test.go (1)
1406-1475:⚠️ Potential issue | 🟡 MinorWire
bridgeServiceinto the observer too.This harness now passes
bridgeServiceinto UDS, but the observer inRunis still built withoutobserve.WithBridgeSource(bridgeService). That leaves CLI integration running against a partially migrated daemon and can miss bridge-status/health regressions.🧪 Suggested alignment with production wiring
- observer, err := observe.New( + bridgeService := newIntegrationBridgeService(registry) + observer, err := observe.New( context.Background(), observe.WithHomePaths(d.homePaths), observe.WithRegistry(registry), observe.WithSessionSource(manager), + observe.WithBridgeSource(bridgeService), observe.WithLogger(discardLogger()), observe.WithStartTime(d.startedAt), ) @@ - bridgeService := newIntegrationBridgeService(registry) dreamTrigger := &integrationDreamTrigger{🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/cli_integration_test.go` around lines 1406 - 1475, Observer is constructed without the bridgeService, so add observe.WithBridgeSource(bridgeService) to the observer options where the observer is created (so the observer passed into udsapi.New includes the bridge source); locate the observer construction (the observe.New/observe.Options call used in Run) and include observe.WithBridgeSource(bridgeService) among its options to mirror production wiring and ensure bridge status/health is observed.internal/daemon/boot.go (1)
583-597:⚠️ Potential issue | 🟠 MajorDelay publishing the bridge-backed extension runtime until
Startsucceeds.
state.bridges.setExtensionRuntime(manager)andstate.setExtensionRuntime(manager)happen beforemanager.Start(ctx), but a start failure is explicitly non-fatal here. That leaves bridge deliveries andstate.deps.Extensionspointing at a manager that never finished starting.🛠️ Suggested fix
- if state.bridges != nil { - state.bridges.setExtensionRuntime(manager) - } - state.setExtensionRuntime(manager) - state.deps.Extensions = newDaemonExtensionService(extRegistry, manager, state.hooks, state.logger, d.now) cleanup.add(func(ctx context.Context) error { return manager.Stop(ctx) }) if err := manager.Start(ctx); err != nil { state.logger.Error("daemon: extension manager start failed; continuing without blocking boot", "error", err) + return nil + } + if state.bridges != nil { + state.bridges.setExtensionRuntime(manager) } + state.setExtensionRuntime(manager) + state.deps.Extensions = newDaemonExtensionService(extRegistry, manager, state.hooks, state.logger, d.now) if state.hooks != nil { if err := state.hooks.Rebuild(ctx); err != nil { state.logger.Error("daemon: rebuild hooks after extension boot failed; continuing without extension hooks", "error", err) } }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/boot.go` around lines 583 - 597, Currently the extension runtime (state.bridges.setExtensionRuntime and state.setExtensionRuntime) and state.deps.Extensions = newDaemonExtensionService(...) are assigned before manager.Start(ctx), which can fail and leave bridges/deps pointing at a non-started manager; change the flow so you only call state.bridges.setExtensionRuntime(manager), state.setExtensionRuntime(manager) and assign state.deps.Extensions after manager.Start(ctx) returns nil; always still register the manager.Stop cleanup via cleanup.add(func(ctx context.Context) error { return manager.Stop(ctx) }) before Start so Stop is guaranteed, but if manager.Start returns an error log it (as now) and do not set the bridge/runtime or deps to the failed manager.internal/bridges/delivery_types.go (1)
80-95:⚠️ Potential issue | 🟡 MinorReject snapshots on non-
resumerequests.The contract comment says
Snapshotis recovery-only state, butValidate()only enforces theresume -> snapshotdirection. Astart/delta/final/errorrequest with a non-nil snapshot still passes validation, which makes the wire format ambiguous and allows stale recovery state to leak into normal deliveries.Suggested fix
func (r DeliveryRequest) Validate() error { + eventType := normalizeDeliveryEventType(r.Event.EventType) if err := r.Event.Validate(); err != nil { return err } if r.Snapshot == nil { - if normalizeDeliveryEventType(r.Event.EventType) == DeliveryEventTypeResume { + if eventType == DeliveryEventTypeResume { return errors.New("bridges: resume delivery request requires a snapshot") } return nil } + if eventType != DeliveryEventTypeResume { + return errors.New("bridges: only resume delivery requests may include a snapshot") + } if err := r.Snapshot.Validate(); err != nil { return err }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/bridges/delivery_types.go` around lines 80 - 95, The validation currently only enforces that resume events require a Snapshot but does not reject snapshots on non-resume events; update the Validate logic in the delivery request type (the block that checks r.Snapshot and calls normalizeDeliveryEventType and compares to DeliveryEventTypeResume) to return an error when r.Snapshot is non-nil and normalizeDeliveryEventType(r.Event.EventType) is NOT DeliveryEventTypeResume (i.e., reject snapshots on start/delta/final/error), while keeping the existing resume->snapshot checks (call to r.Snapshot.Validate() and matching of r.Snapshot.DeliveryID and r.Snapshot.BridgeInstanceID to r.Event.DeliveryID / r.Event.BridgeInstanceID) intact.
🧹 Nitpick comments (7)
internal/api/core/handlers_test.go (1)
306-307: Add an explicit assertion forpayload.Daemon.Network.Channels.The fixture now sets
Channels, but the response assertion block doesn’t verify it yet.Suggested patch
if got, want := payload.Daemon.Network.RemotePeers, 2; got != want { t.Fatalf("daemon network remote peers = %d, want %d", got, want) } + if got, want := payload.Daemon.Network.Channels, 3; got != want { + t.Fatalf("daemon network channels = %d, want %d", got, want) + } if strings.Contains(strings.ToLower(resp.Body.String()), "token") { t.Fatalf("daemon status leaked credentials: %s", resp.Body.String()) }As per coding guidelines, "MUST test meaningful business logic, not trivial operations."
🤖 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 306 - 307, The test currently sets payload.Daemon.Network.Channels but never asserts it; add an explicit assertion in the response assertion block to verify payload.Daemon.Network.Channels equals the expected value (3) using the same assertion style used elsewhere in handlers_test.go (e.g., the existing response/assert helpers or testify/require calls) so the test validates the meaningful business logic for the Daemon.Network.Channels field.internal/cli/session.go (1)
40-40: Consider keeping a deprecated--spacealias for CLI compatibility.Line 76 introduces a hard flag rename, which can break existing automation scripts. A short deprecation window would reduce churn.
Proposed backward-compatible flag transition
func newSessionCreateCommand(deps commandDeps) *cobra.Command { var ( agentName string cwd string name string channel string + space string workspaceRef string ) @@ - created, err := client.CreateSession(cmd.Context(), CreateSessionRequest{ + selectedChannel := strings.TrimSpace(channel) + if selectedChannel == "" { + selectedChannel = strings.TrimSpace(space) + } + created, err := client.CreateSession(cmd.Context(), CreateSessionRequest{ AgentName: agentName, Name: name, Workspace: workspace, WorkspacePath: workspacePath, - Channel: strings.TrimSpace(channel), + Channel: selectedChannel, }) @@ cmd.Flags().StringVar(&name, "name", "", "Optional session label") cmd.Flags().StringVar(&channel, "channel", "", "Optional network channel opt-in for the session") + cmd.Flags().StringVar(&space, "space", "", "Deprecated: use --channel") + _ = cmd.Flags().MarkDeprecated("space", "use --channel instead") return cmd }Also applies to: 63-64, 76-76
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/session.go` at line 40, Add a short compatibility layer so the renamed flag accepts the old --space alias: when parsing flags, continue to bind the same internal variable (channel) to both "--channel" and "--space"; if "--space" is provided, copy its value into channel and emit a single deprecation warning mentioning "--space" is deprecated and to use "--channel" instead, while preferring "--channel" when both are set. Update the flag parsing logic that defines/reads the channel variable (the channel field and the code that registers/parses the CLI flags) to accept both names and perform the warning and precedence handling.internal/api/httpapi/bridges_test.go (1)
13-131: Collapse these handler cases into a table-drivent.Run("Should...")suite.The router setup and assertion shape are almost identical across all three tests, so a single table-driven suite would keep this file smaller and make new bridge endpoints easier to cover consistently. As per coding guidelines,
**/*_test.go:Use table-driven tests with subtests (\t.Run`) as defaultandMUST use t.Run("Should...") pattern for ALL test cases`.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/httpapi/bridges_test.go` around lines 13 - 131, Collapse the three separate tests (TestCreateBridgeHandlerCreatesBridgeInstance, TestListBridgeRoutesHandlerReturnsRequestedRouteSet, TestBridgeTestDeliveryHandlerResolvesTypedTarget) into a single table-driven test that iterates subtests with t.Run("Should ...") names; factor out the repeated setup (homePaths := newTestHomePaths(t), engine := newTestRouter(... newTestHandlersWithBridges ...), performRequest, and decodeJSONResponse) and express each case as an entry with the unique inputs (stub implementations for stubBridgeService methods ResolveDeliveryTargetFn/CreateInstanceFn/ListRoutesFn, HTTP method, path, request body) plus expected status and assertions (e.g. expected Bridge ID/status, Routes length and fields, DeliveryTarget fields); in each iteration invoke the appropriate stubbed behavior, call performRequest, check recorder.Code, decodeJSONResponse and run the case-specific assertions — keeping test logic encapsulated in the case struct and naming each subtest with the "Should..." pattern.internal/extension/bridge_delivery_integration_test.go (1)
66-241: Prefer one table-drivent.Run("Should...")suite for these bridge delivery scenarios.These three cases reuse the same harness and only vary in script input, broker options, and expected marker progression. Folding them into a single table-driven suite will cut setup duplication and make future bridge-delivery cases cheaper to add. As per coding guidelines,
**/*_test.go:Use table-driven tests with subtests (\t.Run`) as defaultandMUST use t.Run("Should...") pattern for ALL test cases`.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/extension/bridge_delivery_integration_test.go` around lines 66 - 241, These three tests (TestBridgeDeliveryIntegrationPromptProducesOrderedDeliveryStream, TestBridgeDeliveryIntegrationSlowAdapterCoalescesIntermediateDeltas, TestBridgeDeliveryIntegrationRestartResumesActiveDelivery) share identical harness/setup and should be collapsed into a single table-driven test that runs each scenario as a subtest via t.Run("Should ..."). Create a slice of cases containing the unique inputs (scripted prompt events for newScriptedPromptDriver, markerPath, extension/handler names like "record_deliveries", "slow_record_deliveries", "exit_once_record_deliveries", and any bridgepkg options such as WithDeliveryBrokerQueueCapacity or WithDeliveryBrokerRetryDelay) plus expected assertions (e.g. final seq, max marker count, presence of Resume and snapshot). Move the common setup code (withDaemonVersion, env := newDeliveryIntegrationEnv(...), instance creation, params construction, env.callWithContext, waitForDeliveryMarkers, readDeliveryMarkers, and shared assertions like using waitForDeliveryMarkers/readDeliveryMarkers) into the loop, and inside each t.Run execute only the per-case customization and its specific checks (e.g. coalescing and resume-specific checks). Keep helper functions waitForDeliveryMarkers and readDeliveryMarkers as-is and reference them from each subtest.internal/daemon/daemon.go (1)
299-303:WithSignalBridgemakes this option name misleading.This function injects an OS signal channel, not bridge runtime state. Renaming it as part of the bridge migration makes the API harder to read and forces an unrelated breaking rename. Prefer a neutral name and keep this as a compatibility alias.
♻️ Proposed fix
-// WithSignalBridge overrides OS signal delivery, mainly for tests. -func WithSignalBridge(ch <-chan os.Signal) Option { +// WithSignalSource overrides OS signal delivery, mainly for tests. +func WithSignalSource(ch <-chan os.Signal) Option { return func(d *Daemon) { d.signalCh = ch } } + +// WithSignalBridge is kept as a deprecated alias for compatibility with the +// bridge migration. +func WithSignalBridge(ch <-chan os.Signal) Option { + return WithSignalSource(ch) +}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/daemon.go` around lines 299 - 303, The option function name WithSignalBridge is misleading because it injects an OS signal channel (d.signalCh) rather than bridge runtime state; rename the API to a neutral name such as WithSignalChannel or WithSignalChan and update references to use that new function, while keeping WithSignalBridge as a thin compatibility wrapper that simply delegates to the new WithSignalChannel (both should set d.signalCh = ch); also update any godoc/comments on the function to reflect it accepts an os.Signal channel.internal/api/httpapi/bridges_integration_test.go (1)
376-385: Avoid raw sleep-based polling in the shared wait helper.This helper backs multiple integration tests, so the fixed
time.Sleepinterval becomes a suite-wide flake point. Prefer a timeout context plus ticker, or ideally a state-change signal from the runtime, instead of direct sleep polling.♻️ Proposed fix
func waitForHTTPCondition(t *testing.T, fn func() bool) { t.Helper() - deadline := time.Now().Add(2 * time.Second) - for time.Now().Before(deadline) { - if fn() { - return - } - time.Sleep(10 * time.Millisecond) - } - t.Fatal("condition did not become true before timeout") + ctx, cancel := context.WithTimeout(testutil.Context(t), 2*time.Second) + defer cancel() + + ticker := time.NewTicker(10 * time.Millisecond) + defer ticker.Stop() + + for { + if fn() { + return + } + select { + case <-ctx.Done(): + t.Fatal("condition did not become true before timeout") + case <-ticker.C: + } + } }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/httpapi/bridges_integration_test.go` around lines 376 - 385, The shared helper waitForHTTPCondition currently uses time.Sleep polling which causes flakiness; replace it with a context-with-timeout plus a ticker (or wait on a runtime-provided signal) so the loop uses select on ticker.C and ctx.Done instead of time.Sleep: create ctx, defer cancel with a 2s timeout, use ticker := time.NewTicker(10*time.Millisecond) and a select that returns when fn() is true or exits when ctx.Done(), and stop the ticker before return; update waitForHTTPCondition to use this pattern (or hook into a provided state-change channel if available) so tests no longer rely on raw sleeps.internal/daemon/daemon_integration_test.go (1)
1386-1484: Extract a shared bridge-extension fixture for these scenarios.These four tests repeat the same extension install, registry bootstrap, daemon boot, and bridge setup flow. Pulling that into one helper will reduce setup drift and make the next bridge-contract rename much safer to update.
As per coding guidelines, "Use shared test helpers from
internal/testutilandinternal/api/testutil"Also applies to: 1486-1567, 1569-1715, 1717-1824
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/daemon_integration_test.go` around lines 1386 - 1484, Multiple tests duplicate the same extension install, registry bootstrap, daemon boot, and bridge setup code; extract that sequence into a shared test helper (e.g., in internal/testutil or internal/api/testutil) that wraps installExtensionForDaemonIntegration, openDaemonIntegrationGlobalDB + bridgepkg.NewRegistry, bridgeRegistry.CreateInstance, registry.PutBridgeSecretBinding, creation of recordingBridgeSecretResolver, New(...), d.boot(...) and returns the created bridge instance ID, resolver, daemon instance (d), markerPath and a cleanup function; then update TestBootStartsBridgeExtensionWithBoundRuntime (and the other three tests) to call that helper and assert only the test-specific expectations, ensuring the helper handles error t.Fatalf on setup failures and registers t.Cleanup to shutdown the daemon.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@internal/api/core/bridges.go`:
- Around line 234-240: respondBridge currently treats any error from
bridgeResponse (which can fail due to observer health lookup) as a 500 via
respondError, turning successful mutations into failures; change respondBridge
so that when bridgeResponse returns an error it does not call respondError for
successful status codes—instead log the error and return the success status with
a best-effort response (e.g. the created/updated BridgeInstance or a response
with health set to "unknown"/nil) so clients see the write succeeded; keep
calling respondError only for genuine server-side failures when the operation
itself failed.
In `@internal/api/core/handlers.go`:
- Around line 146-148: The nil-logger panic occurs in SetStreamDone when it
dereferences h.Logger to call Warn while h may be a zero-valued BaseHandlers;
change SetStreamDone to guard before logging by first checking if h == nil or
h.Logger == nil and only call h.Logger.Warn when the logger is non-nil,
otherwise skip the log and still create/assign the fallback done channel (or
return safely); locate the SetStreamDone method and the done assignment branch
that uses h.Logger.Warn and wrap the log call with a nil-check for h and
h.Logger so the fallback channel is installed without panicking.
In `@internal/api/httpapi/bridges_integration_test.go`:
- Around line 389-399: The helper mustReadAll currently discards the error from
body.Close; change the defer to capture and handle Close's error (e.g., if cerr
:= body.Close(); cerr != nil { t.Fatalf("body.Close() error = %v", cerr) }) so
transport/handler Close failures surface in tests; keep the existing io.ReadAll
error handling and t.Helper usage and ensure you don't shadow the read error
variable when adding the Close error check.
In `@internal/bridges/registry.go`:
- Around line 485-487: New bridge instances are still minted with the old "chan"
prefix (instance.ID = store.NewID("chan")), which can leak the channel namespace
and cause collisions; update the ID generation in registry.go to use the new
bridge namespace (e.g., call store.NewID("bridge") when instance.ID == ""), and
scan for other usages of store.NewID("chan") in the bridge/registry logic to
replace or migrate them to the new "bridge" prefix to avoid cross-namespace
collisions with legacy channel records.
In `@internal/cli/bridge.go`:
- Around line 97-119: When building the CreateBridgeRequest after
parseBridgeScope(scopeRaw) and resolveBridgeStatus(...), add a client-side
validation: if the parsed scope indicates workspace (e.g., scope == "workspace"
or the enum value returned by parseBridgeScope) then ensure
strings.TrimSpace(workspaceID) is not empty and return a descriptive error if it
is; do the same validation in the analogous block that constructs the update
payload (the block referenced at lines 134-145) so workspace-scoped operations
are rejected client-side when --workspace-id is missing.
In `@internal/cli/client_test.go`:
- Around line 719-738: The mock transport handlers in client_test.go only check
a few fields so CreateBridge/UpdateBridge tests won't catch dropped fields;
update the POST (Create) and PATCH (Update) case handlers to fully validate the
decoded contract.CreateBridgeRequest and contract.UpdateBridgeRequest payloads
(not just DisplayName/Platform/ExtensionName) — for Create assert expected
Scope, Enabled, Status (or absence if not sent), RoutingPolicy fields
(IncludePeer, IncludeThread) and any other bridge-specific fields, and for
Update assert that optional pointers are set as expected and that RoutingPolicy
contains the expected flags; you can either compare the decoded payload against
an expected struct or add explicit checks for each field (e.g., payload.Scope,
payload.Enabled, payload.RoutingPolicy.IncludePeer/IncludeThread) in the cases
that handle CreateBridgeRequest and UpdateBridgeRequest.
In `@internal/cli/command_paths_test.go`:
- Around line 47-57: The stubs (networkPeersFn, networkChannelsFn,
networkSendFn, networkInboxFn) currently ignore incoming arguments; update each
closure to assert the expected inputs (e.g., compare the received
NetworkPeersQuery fields inside networkPeersFn, the NetworkSendRequest fields
inside networkSendFn, and the string arg inside networkInboxFn) against expected
values captured in the test scope and call t.Fatalf/t.Errorf on mismatch so
renames or arg-wiring regressions fail the test; for networkChannelsFn (which
has no params) add a closure-level expectation flag or capture an expected
context value in the test and assert it was observed inside the closure to
ensure the "network channels"/--channel call path is exercised.
In `@internal/config/config_test.go`:
- Around line 1047-1052: Rename the test case name field to follow the required
t.Run("Should...") pattern: replace the current name "invalid default channel"
with a description beginning with "Should..." (e.g., "Should reject invalid
default channel") in the test cases slice used by the table-driven test so that
t.Run uses the "Should..." prefix; locate the test cases by the name field in
the table and the use of cfg.Network.DefaultChannel within that specific case to
update only this entry.
---
Outside diff comments:
In `@internal/api/core/network_test.go`:
- Around line 27-57: The test fails to explicitly assert the renamed channel
fields: update the NetworkStatusPayloadFromStatus test to assert that the mapped
channel count matches the source (check payload.Channels equals status.Channels)
and also assert the channel identity is emitted (if the payload exposes a single
channel field like payload.Channel or a slice of channel entries, assert it's
non-empty and contains the expected name); modify the assertions around
core.NetworkStatusPayloadFromStatus, referencing NetworkStatus.Channels and the
payload's Channels/Channel (or ChannelName) field(s) so the test will fail if
channel data is dropped or not emitted.
In `@internal/api/udsapi/network_test.go`:
- Around line 56-87: The test currently doesn't assert that the "channel" field
is preserved end-to-end; add assertions that the outgoing send request's channel
is preserved (e.g., check seenRequest.Channel == "builders" after performRequest
for /api/network/send) and that the inbox response contains the channel (e.g.,
assert inboxResp.Body contains `"channel":"builders"`), so the test fails if the
handler drops or renames the channel field; locate checks around sendResp,
seenRequest, inboxResp in network_test.go and add these two assertions.
In `@internal/bridges/delivery_types.go`:
- Around line 80-95: The validation currently only enforces that resume events
require a Snapshot but does not reject snapshots on non-resume events; update
the Validate logic in the delivery request type (the block that checks
r.Snapshot and calls normalizeDeliveryEventType and compares to
DeliveryEventTypeResume) to return an error when r.Snapshot is non-nil and
normalizeDeliveryEventType(r.Event.EventType) is NOT DeliveryEventTypeResume
(i.e., reject snapshots on start/delta/final/error), while keeping the existing
resume->snapshot checks (call to r.Snapshot.Validate() and matching of
r.Snapshot.DeliveryID and r.Snapshot.BridgeInstanceID to r.Event.DeliveryID /
r.Event.BridgeInstanceID) intact.
In `@internal/cli/bridge.go`:
- Around line 539-556: The parsing currently only checks JSON syntax, allowing
non-object values; update parseRequiredBridgeJSON (and by extension
parseOptionalBridgeJSON which delegates to it) to reject any JSON that is not
either an object or null: after json.Valid, json.Unmarshal the trimmed string
into an interface{} and ensure the resulting value is either nil (for "null") or
a map[string]interface{} (a JSON object); if not, return an error like "cli:
delivery defaults must be a JSON object or null". Ensure parseOptionalBridgeJSON
still returns nil for empty input and that parseRequiredBridgeJSON returns a
json.RawMessage for valid object or "null".
In `@internal/cli/cli_integration_test.go`:
- Around line 1406-1475: Observer is constructed without the bridgeService, so
add observe.WithBridgeSource(bridgeService) to the observer options where the
observer is created (so the observer passed into udsapi.New includes the bridge
source); locate the observer construction (the observe.New/observe.Options call
used in Run) and include observe.WithBridgeSource(bridgeService) among its
options to mirror production wiring and ensure bridge status/health is observed.
In `@internal/cli/network_client_test.go`:
- Around line 32-40: The test's mock handler in network_client_test.go only
asserts ext metadata but not the renamed channel field, so update the handler
inside the case for req.Method == http.MethodPost && req.URL.Path ==
"/api/network/send" to also assert that the serialized send payload contains the
renamed channel key (e.g., that the request body includes `"channel":"builders"`
or otherwise parse the JSON and verify the "channel" field equals "builders");
this ensures NetworkSend (and not an old "space" key) is being used—locate the
request handling block in the test and add the channel assertion alongside the
existing ext metadata checks.
In `@internal/cli/network.go`:
- Around line 350-384: The human-readable network inbox table in
networkInboxBundle omits the Channel column; update the header slice to include
"Channel" (e.g., "ID", "Kind", "Channel", "From", "To", "Reply To", "Trace",
"Workflow", "Handoff") and insert the corresponding value in the human row
formatter (the first func(message NetworkEnvelopeRecord) []string) by adding
stringOrDash(message.Channel) in the matching position so the human table
columns align with the machine-readable fields generated by the second
formatter.
- Around line 150-165: The calls to
cmd.MarkFlagRequired("session"/"channel"/"kind"/"body") currently ignore
returned errors; update the code around the cmd.MarkFlagRequired invocations to
capture the error (e.g., err := cmd.MarkFlagRequired(...)) and handle it instead
of using `_ =`, by returning the error from the enclosing function or logging
and exiting (use processLogger/fmt.Errorf/cli.Errorf or return err) so flag
registration failures don't go unnoticed; specifically modify each
cmd.MarkFlagRequired call in the network command setup to check err and
propagate or handle it for the "session", "channel", "kind", and "body" flags.
In `@internal/cli/session_test.go`:
- Around line 547-569: Update the test assertions in session_test.go that check
bundle.human() and bundle.toon() to assert the rendered channel label as well as
the value: in the human() checks, ensure you assert strings.Contains(human,
"<channel label>") (e.g. "Channel" or the exact label used by
sessionListBundle.human()) in addition to strings.Contains(human, "builders");
and similarly in the toon() checks assert strings.Contains(toon, "<channel
label>") plus strings.Contains(toon, "builders"). Locate the assertions around
the human, err := bundle.human() and toon, err := bundle.toon() blocks and
update the strings.Contains conditions (used in those t.Fatalf checks) to
include the channel label check so the test fails if the label text changes.
In `@internal/daemon/boot.go`:
- Around line 583-597: Currently the extension runtime
(state.bridges.setExtensionRuntime and state.setExtensionRuntime) and
state.deps.Extensions = newDaemonExtensionService(...) are assigned before
manager.Start(ctx), which can fail and leave bridges/deps pointing at a
non-started manager; change the flow so you only call
state.bridges.setExtensionRuntime(manager), state.setExtensionRuntime(manager)
and assign state.deps.Extensions after manager.Start(ctx) returns nil; always
still register the manager.Stop cleanup via cleanup.add(func(ctx
context.Context) error { return manager.Stop(ctx) }) before Start so Stop is
guaranteed, but if manager.Start returns an error log it (as now) and do not set
the bridge/runtime or deps to the failed manager.
In `@internal/extension/capability_test.go`:
- Around line 57-120: Add a test case to
TestCapabilityCheckerCheckHostAPIShouldEnforceDualGates that covers the new
mapping for "bridges/instances/report_state" -> "bridge.write": include an entry
where method is "bridges/instances/report_state" and assert failure when actions
do not include the required action or when security lacks "bridge.write" (set
wantRequired to []string{"bridge.write"} and wantGranted accordingly), plus a
passing case where actions include "bridges/instances/report_state" and security
includes "bridge.write"; use the existing test table pattern to add both
scenarios so regressions in the state-reporting gate are caught.
---
Nitpick comments:
In `@internal/api/core/handlers_test.go`:
- Around line 306-307: The test currently sets payload.Daemon.Network.Channels
but never asserts it; add an explicit assertion in the response assertion block
to verify payload.Daemon.Network.Channels equals the expected value (3) using
the same assertion style used elsewhere in handlers_test.go (e.g., the existing
response/assert helpers or testify/require calls) so the test validates the
meaningful business logic for the Daemon.Network.Channels field.
In `@internal/api/httpapi/bridges_integration_test.go`:
- Around line 376-385: The shared helper waitForHTTPCondition currently uses
time.Sleep polling which causes flakiness; replace it with a
context-with-timeout plus a ticker (or wait on a runtime-provided signal) so the
loop uses select on ticker.C and ctx.Done instead of time.Sleep: create ctx,
defer cancel with a 2s timeout, use ticker :=
time.NewTicker(10*time.Millisecond) and a select that returns when fn() is true
or exits when ctx.Done(), and stop the ticker before return; update
waitForHTTPCondition to use this pattern (or hook into a provided state-change
channel if available) so tests no longer rely on raw sleeps.
In `@internal/api/httpapi/bridges_test.go`:
- Around line 13-131: Collapse the three separate tests
(TestCreateBridgeHandlerCreatesBridgeInstance,
TestListBridgeRoutesHandlerReturnsRequestedRouteSet,
TestBridgeTestDeliveryHandlerResolvesTypedTarget) into a single table-driven
test that iterates subtests with t.Run("Should ...") names; factor out the
repeated setup (homePaths := newTestHomePaths(t), engine := newTestRouter(...
newTestHandlersWithBridges ...), performRequest, and decodeJSONResponse) and
express each case as an entry with the unique inputs (stub implementations for
stubBridgeService methods ResolveDeliveryTargetFn/CreateInstanceFn/ListRoutesFn,
HTTP method, path, request body) plus expected status and assertions (e.g.
expected Bridge ID/status, Routes length and fields, DeliveryTarget fields); in
each iteration invoke the appropriate stubbed behavior, call performRequest,
check recorder.Code, decodeJSONResponse and run the case-specific assertions —
keeping test logic encapsulated in the case struct and naming each subtest with
the "Should..." pattern.
In `@internal/cli/session.go`:
- Line 40: Add a short compatibility layer so the renamed flag accepts the old
--space alias: when parsing flags, continue to bind the same internal variable
(channel) to both "--channel" and "--space"; if "--space" is provided, copy its
value into channel and emit a single deprecation warning mentioning "--space" is
deprecated and to use "--channel" instead, while preferring "--channel" when
both are set. Update the flag parsing logic that defines/reads the channel
variable (the channel field and the code that registers/parses the CLI flags) to
accept both names and perform the warning and precedence handling.
In `@internal/daemon/daemon_integration_test.go`:
- Around line 1386-1484: Multiple tests duplicate the same extension install,
registry bootstrap, daemon boot, and bridge setup code; extract that sequence
into a shared test helper (e.g., in internal/testutil or internal/api/testutil)
that wraps installExtensionForDaemonIntegration, openDaemonIntegrationGlobalDB +
bridgepkg.NewRegistry, bridgeRegistry.CreateInstance,
registry.PutBridgeSecretBinding, creation of recordingBridgeSecretResolver,
New(...), d.boot(...) and returns the created bridge instance ID, resolver,
daemon instance (d), markerPath and a cleanup function; then update
TestBootStartsBridgeExtensionWithBoundRuntime (and the other three tests) to
call that helper and assert only the test-specific expectations, ensuring the
helper handles error t.Fatalf on setup failures and registers t.Cleanup to
shutdown the daemon.
In `@internal/daemon/daemon.go`:
- Around line 299-303: The option function name WithSignalBridge is misleading
because it injects an OS signal channel (d.signalCh) rather than bridge runtime
state; rename the API to a neutral name such as WithSignalChannel or
WithSignalChan and update references to use that new function, while keeping
WithSignalBridge as a thin compatibility wrapper that simply delegates to the
new WithSignalChannel (both should set d.signalCh = ch); also update any
godoc/comments on the function to reflect it accepts an os.Signal channel.
In `@internal/extension/bridge_delivery_integration_test.go`:
- Around line 66-241: These three tests
(TestBridgeDeliveryIntegrationPromptProducesOrderedDeliveryStream,
TestBridgeDeliveryIntegrationSlowAdapterCoalescesIntermediateDeltas,
TestBridgeDeliveryIntegrationRestartResumesActiveDelivery) share identical
harness/setup and should be collapsed into a single table-driven test that runs
each scenario as a subtest via t.Run("Should ..."). Create a slice of cases
containing the unique inputs (scripted prompt events for
newScriptedPromptDriver, markerPath, extension/handler names like
"record_deliveries", "slow_record_deliveries", "exit_once_record_deliveries",
and any bridgepkg options such as WithDeliveryBrokerQueueCapacity or
WithDeliveryBrokerRetryDelay) plus expected assertions (e.g. final seq, max
marker count, presence of Resume and snapshot). Move the common setup code
(withDaemonVersion, env := newDeliveryIntegrationEnv(...), instance creation,
params construction, env.callWithContext, waitForDeliveryMarkers,
readDeliveryMarkers, and shared assertions like using
waitForDeliveryMarkers/readDeliveryMarkers) into the loop, and inside each t.Run
execute only the per-case customization and its specific checks (e.g. coalescing
and resume-specific checks). Keep helper functions waitForDeliveryMarkers and
readDeliveryMarkers as-is and reference them from each subtest.
🪄 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: 9928ac09-df1d-4f80-9ad2-4a4301c697cd
⛔ Files ignored due to path filters (10)
.codex/plans/2026-04-13-network-rename-hard-cut.mdis excluded by!**/*.mddocs/rfcs/003_agh-network-OLD.mdis excluded by!**/*.mddocs/rfcs/003_agh-network-v0.mdis excluded by!**/*.mddocs/rfcs/004_agh-network-v1.mdis excluded by!**/*.mdinternal/skills/bundled/skills/agh-network/SKILL.mdis excluded by!**/*.mdopenapi/agh.jsonis excluded by!**/*.jsonsdk/examples/telegram-reference/README.mdis excluded by!**/*.mdsdk/examples/telegram-reference/extension.tomlis excluded by!**/*.tomlsdk/typescript/src/generated/contracts.tsis excluded by!**/generated/**web/src/generated/agh-openapi.d.tsis excluded by!**/generated/**
📒 Files selected for processing (182)
internal/acp/handlers.gointernal/api/contract/bridges.gointernal/api/contract/bridges_test.gointernal/api/contract/channels.gointernal/api/contract/contract.gointernal/api/contract/responses.gointernal/api/core/bridges.gointernal/api/core/bridges_test.gointernal/api/core/channels.gointernal/api/core/channels_test.gointernal/api/core/conversions.gointernal/api/core/conversions_parsers_test.gointernal/api/core/errors.gointernal/api/core/errors_test.gointernal/api/core/handlers.gointernal/api/core/handlers_test.gointernal/api/core/hooks_test.gointernal/api/core/interfaces.gointernal/api/core/network.gointernal/api/core/network_test.gointernal/api/core/test_helpers_test.gointernal/api/httpapi/bridges_integration_test.gointernal/api/httpapi/bridges_test.gointernal/api/httpapi/channels_integration_test.gointernal/api/httpapi/channels_test.gointernal/api/httpapi/handlers.gointernal/api/httpapi/handlers_test.gointernal/api/httpapi/helpers_test.gointernal/api/httpapi/httpapi_integration_test.gointernal/api/httpapi/routes.gointernal/api/httpapi/server.gointernal/api/spec/spec.gointernal/api/spec/spec_test.gointernal/api/testutil/apitest.gointernal/api/udsapi/bridges_integration_test.gointernal/api/udsapi/bridges_test.gointernal/api/udsapi/channels_integration_test.gointernal/api/udsapi/channels_test.gointernal/api/udsapi/handlers_test.gointernal/api/udsapi/helpers_test.gointernal/api/udsapi/network_test.gointernal/api/udsapi/routes.gointernal/api/udsapi/server.gointernal/api/udsapi/server_test.gointernal/api/udsapi/udsapi_integration_test.gointernal/bridges/delivery_broker.gointernal/bridges/delivery_broker_test.gointernal/bridges/delivery_metrics.gointernal/bridges/delivery_projection_test.gointernal/bridges/delivery_types.gointernal/bridges/dimensions.gointernal/bridges/doc.gointernal/bridges/lifecycle.gointernal/bridges/registry.gointernal/bridges/registry_integration_test.gointernal/bridges/registry_test.gointernal/bridges/routing.gointernal/bridges/target.gointernal/bridges/target_integration_test.gointernal/bridges/target_test.gointernal/bridges/types.gointernal/bridges/types_test.gointernal/channels/doc.gointernal/channels/registry.gointernal/cli/bridge.gointernal/cli/bridge_test.gointernal/cli/channel_test.gointernal/cli/cli_integration_test.gointernal/cli/client.gointernal/cli/client_test.gointernal/cli/command_paths_test.gointernal/cli/daemon.gointernal/cli/helpers_test.gointernal/cli/network.gointernal/cli/network_client_test.gointernal/cli/network_test.gointernal/cli/root.gointernal/cli/session.gointernal/cli/session_test.gointernal/cli/skill_test.gointernal/config/config.gointernal/config/config_test.gointernal/config/merge.gointernal/config/merge_test.gointernal/daemon/boot.gointernal/daemon/bridges.gointernal/daemon/bridges_test.gointernal/daemon/channels.gointernal/daemon/daemon.gointernal/daemon/daemon_integration_test.gointernal/daemon/daemon_test.gointernal/extension/bridge_delivery_integration_test.gointernal/extension/bridge_delivery_notifier.gointernal/extension/bridge_delivery_notifier_test.gointernal/extension/capability.gointernal/extension/capability_test.gointernal/extension/contract/host_api.gointernal/extension/contract/sdk.gointernal/extension/describe_test.gointernal/extension/host_api.gointernal/extension/host_api_bridges.gointernal/extension/host_api_channels.gointernal/extension/host_api_integration_test.gointernal/extension/host_api_test.gointernal/extension/manager.gointernal/extension/manager_integration_test.gointernal/extension/manager_test.gointernal/extension/protocol/host_api.gointernal/extension/protocol/host_api_test.gointernal/extension/telegram_reference_integration_test.gointernal/extensiontest/bridge_adapter_harness.gointernal/extensiontest/bridge_adapter_harness_integration_test.gointernal/extensiontest/bridge_adapter_harness_test.gointernal/network/audit.gointernal/network/audit_test.gointernal/network/delivery.gointernal/network/delivery_test.gointernal/network/envelope.gointernal/network/envelope_integration_test.gointernal/network/helpers_test.gointernal/network/lifecycle.gointernal/network/lifecycle_test.gointernal/network/manager.gointernal/network/manager_test.gointernal/network/peer.gointernal/network/peer_test.gointernal/network/router.gointernal/network/router_integration_test.gointernal/network/router_test.gointernal/network/transport.gointernal/network/transport_integration_test.gointernal/network/transport_test.gointernal/network/validate.gointernal/network/validate_test.gointernal/observe/bridges.gointernal/observe/bridges_test.gointernal/observe/channels.gointernal/observe/channels_test.gointernal/observe/health.gointernal/observe/observer.gointernal/observe/observer_test.gointernal/observe/reconcile.gointernal/session/interfaces.gointernal/session/manager.gointernal/session/manager_helpers.gointernal/session/manager_hooks_test.gointernal/session/manager_integration_test.gointernal/session/manager_lifecycle.gointernal/session/manager_network_skill.gointernal/session/manager_start.gointernal/session/manager_test.gointernal/session/query.gointernal/session/query_test.gointernal/session/session.gointernal/skills/bundled/bundled_test.gointernal/store/globaldb/global_db.gointernal/store/globaldb/global_db_bridge.gointernal/store/globaldb/global_db_bridges_integration_test.gointernal/store/globaldb/global_db_bridges_test.gointernal/store/globaldb/global_db_channel.gointernal/store/globaldb/global_db_channels_integration_test.gointernal/store/globaldb/global_db_channels_test.gointernal/store/globaldb/global_db_network_audit.gointernal/store/globaldb/global_db_network_audit_test.gointernal/store/globaldb/global_db_session.gointernal/store/globaldb/global_db_session_test.gointernal/store/globaldb/global_db_test.gointernal/store/globaldb/migrate_workspace.gointernal/store/meta_test.gointernal/store/types.gointernal/subprocess/handshake.gointernal/subprocess/process_test.gosdk/examples/telegram-reference/main.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.tsweb/src/systems/daemon/adapters/daemon-api.test.tsweb/src/systems/daemon/hooks/use-daemon-health.test.tsweb/src/systems/daemon/types.test.ts
💤 Files with no reviewable changes (11)
- internal/channels/doc.go
- internal/api/core/channels_test.go
- internal/api/httpapi/channels_integration_test.go
- internal/api/udsapi/channels_test.go
- internal/api/httpapi/channels_test.go
- internal/api/contract/channels.go
- internal/api/udsapi/channels_integration_test.go
- internal/cli/channel_test.go
- internal/channels/registry.go
- internal/daemon/channels.go
- internal/api/core/channels.go
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (3)
internal/extension/bridge_delivery_integration_test.go (1)
177-180: Remove redundant loop variable capture for Go 1.25+The
tc := tcpattern is unnecessary in Go 1.25 (and Go 1.22+), as loop variables are now properly scoped per iteration. Removing this line will reduce clutter without affecting behavior.♻️ Optional cleanup
for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel()🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/extension/bridge_delivery_integration_test.go` around lines 177 - 180, Remove the redundant loop-variable capture "tc := tc" inside the table-driven test loop—the loop variable "tc" is already correctly scoped per iteration in Go 1.25+, so delete the "tc := tc" line in the anonymous func started by t.Run (the block that calls t.Parallel()) to clean up the code while keeping the existing t.Run and t.Parallel usage intact.internal/bridges/delivery_broker_test.go (1)
28-63: Add a compile-time interface verification for the fake transport.The
fakeDeliveryTransportimplementsDeliveryTransportbut lacks the compile-time assertionvar _ DeliveryTransport = (*fakeDeliveryTransport)(nil). This would catch method signature drift at compile time rather than at runtime. Per coding guidelines, use explicit 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/bridges/delivery_broker_test.go` around lines 28 - 63, Add a compile-time interface assertion to ensure fakeDeliveryTransport implements DeliveryTransport by adding the statement var _ DeliveryTransport = (*fakeDeliveryTransport)(nil) near the fakeDeliveryTransport type definition (or in the same file), so any method-signature drift on fakeDeliveryTransport will be caught at compile time; reference the fakeDeliveryTransport type and DeliveryTransport interface when adding this assertion.internal/cli/cli_integration_test.go (1)
1118-1165: Add compile-time interface verification forintegrationBridgeService.The coding guidelines require compile-time interface verification, and the reference implementation in
internal/api/udsapi/udsapi_integration_test.go:540includes this check. Adding it here ensures the test double satisfies the required interface at compile time.♻️ Proposed fix
type integrationBridgeService struct { *bridgepkg.Service } + +var _ core.BridgeService = (*integrationBridgeService)(nil)Note: You'll need to import the
corepackage if not already imported, or use the appropriate interface type thatintegrationBridgeServiceis expected to satisfy.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/cli/cli_integration_test.go` around lines 1118 - 1165, Add a compile-time interface assertion to verify integrationBridgeService implements the required BridgeService interface (e.g. add a top-level line like: var _ core.BridgeService = (*integrationBridgeService)(nil)); place it near the integrationBridgeService type definition and import the core package (or use the correct interface type) if not already imported so the build will fail if the type no longer satisfies the interface.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@internal/api/httpapi/bridges_integration_test.go`:
- Around line 35-57: Add t.Parallel() as the first statement in each independent
test to enable parallel execution: insert it at the top of
TestHTTPBridgeCreateReturnsPersistedPayload and likewise in
TestHTTPBridgeRoutesEndpointReturnsOnlyRequestedInstanceRoutes,
TestHTTPBridgeTestDeliveryResolvesTargetWithoutLiveAdapter,
TestHTTPObserveHealthIncludesBridgeMetricsAndPreservesSessionFields,
TestHTTPBridgeDetailShowsAuthRequiredStatusAndHealth, and
TestHTTPBridgeDetailReportsBacklogAndClearsAfterDeliveryCompletes (each test
uses newIntegrationRuntime(t) so they are safe to run in parallel).
In `@internal/cli/bridge.go`:
- Around line 97-105: After parsing scope (parseBridgeScope) and resolving
status (resolveBridgeStatus) but before calling the daemon, validate the
composed create payload (the combination of enabled, resolved status, scope and
workspaceID) locally and return a clear error for invalid combinations (for
example flags like --enabled=false with status=ready); add a small validation
function or call the existing registry/bridge validation helper to enforce the
same rules the daemon uses and ensure the CLI rejects invalid combos early
(refer to enabled, statusRaw, resolveBridgeStatus, parseBridgeScope and
workspaceID when locating where to insert this check).
In `@internal/daemon/boot.go`:
- Around line 583-590: manager.Start(ctx) failures that are due to context
cancellation should not be treated as non-blocking success; change the handling
around the manager.Start(ctx) call so that if errors.Is(err, context.Canceled)
or errors.Is(err, context.DeadlineExceeded) you return the error (propagate
cancellation) instead of swallowing it, and only log and continue ("continue
without blocking boot") for non-context errors; use errors.Is for checks and
keep the cleanup.add(func(ctx context.Context) error { return manager.Stop(ctx)
}) behavior intact so Stop is still invoked when boot continues.
---
Nitpick comments:
In `@internal/bridges/delivery_broker_test.go`:
- Around line 28-63: Add a compile-time interface assertion to ensure
fakeDeliveryTransport implements DeliveryTransport by adding the statement var _
DeliveryTransport = (*fakeDeliveryTransport)(nil) near the fakeDeliveryTransport
type definition (or in the same file), so any method-signature drift on
fakeDeliveryTransport will be caught at compile time; reference the
fakeDeliveryTransport type and DeliveryTransport interface when adding this
assertion.
In `@internal/cli/cli_integration_test.go`:
- Around line 1118-1165: Add a compile-time interface assertion to verify
integrationBridgeService implements the required BridgeService interface (e.g.
add a top-level line like: var _ core.BridgeService =
(*integrationBridgeService)(nil)); place it near the integrationBridgeService
type definition and import the core package (or use the correct interface type)
if not already imported so the build will fail if the type no longer satisfies
the interface.
In `@internal/extension/bridge_delivery_integration_test.go`:
- Around line 177-180: Remove the redundant loop-variable capture "tc := tc"
inside the table-driven test loop—the loop variable "tc" is already correctly
scoped per iteration in Go 1.25+, so delete the "tc := tc" line in the anonymous
func started by t.Run (the block that calls t.Parallel()) to clean up the code
while keeping the existing t.Run and t.Parallel usage intact.
🪄 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: 4b6c9238-a3a9-4f0c-bdba-ceca66926ceb
📒 Files selected for processing (31)
internal/api/core/bridges.gointernal/api/core/bridges_test.gointernal/api/core/handlers.gointernal/api/core/handlers_test.gointernal/api/core/network_test.gointernal/api/core/streamdone_internal_test.gointernal/api/httpapi/bridges_integration_test.gointernal/api/httpapi/bridges_test.gointernal/api/udsapi/network_test.gointernal/bridges/delivery_broker_test.gointernal/bridges/delivery_projection_test.gointernal/bridges/delivery_types.gointernal/bridges/registry.gointernal/bridges/registry_test.gointernal/cli/automation.gointernal/cli/bridge.gointernal/cli/bridge_test.gointernal/cli/cli_integration_test.gointernal/cli/client_test.gointernal/cli/command_paths_test.gointernal/cli/flags.gointernal/cli/memory.gointernal/cli/network.gointernal/cli/network_client_test.gointernal/cli/network_test.gointernal/cli/session_test.gointernal/config/config_test.gointernal/daemon/boot.gointernal/daemon/daemon_test.gointernal/extension/bridge_delivery_integration_test.gointernal/extension/capability_test.go
✅ Files skipped from review due to trivial changes (2)
- internal/cli/session_test.go
- internal/config/config_test.go
🚧 Files skipped from review as they are similar to previous changes (8)
- internal/api/core/network_test.go
- internal/api/core/handlers.go
- internal/extension/capability_test.go
- internal/bridges/delivery_projection_test.go
- internal/cli/command_paths_test.go
- internal/api/udsapi/network_test.go
- internal/api/httpapi/bridges_test.go
- internal/api/core/bridges.go
## 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
Refactor
Bug Fixes