fix: final review round#151
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (7)
📒 Files selected for processing (290)
✨ Finishing Touches📝 Generate docstrings
|
There was a problem hiding this comment.
Actionable comments posted: 18
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
internal/api/core/resources.go (1)
110-116:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winTrigger errors are silently swallowed.
The trigger error is neither returned nor logged. Per coding guidelines, errors must be handled or have written justification. If reconciliation is non-critical, at minimum log the error for observability:
🔧 Suggested fix
if s.trigger != nil { if err := s.trigger(ctx, next.Kind, resources.ReconcileReasonWrite); err != nil { - return record, nil + // Trigger errors are non-fatal; the write succeeded but reconciliation + // may be delayed until next trigger. + slog.Warn("resource reconcile trigger failed after write", + "kind", next.Kind, + "id", record.ID, + "error", err, + ) + return record, nil } }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/api/core/resources.go` around lines 110 - 116, The trigger error is being swallowed in the block that calls s.trigger(ctx, next.Kind, resources.ReconcileReasonWrite); update this code to handle errors: if s.trigger returns an error, either return it (propagate) or at minimum log it for observability before continuing; use the existing logger on the receiver (e.g., s.logger.Errorf or similar) to record the error with context (include next.Kind and ReconcileReasonWrite) and then continue to return record, nil if reconciliation is non-critical. Ensure you modify the branch that currently does "if err := s.trigger(...); err != nil { return record, nil }" to include the logging or propagate the error as appropriate.internal/daemon/native_tools.go (1)
1858-1872:⚠️ Potential issue | 🟠 Major | ⚡ Quick winSession-bound callers still cannot omit
session_idhere.
decodeSessionEventQueryInput()rejects emptysession_idbefore the bound-session fallback runs, so a caller withscope.SessionIDstill has to pass its own session explicitly. That defeats the new binding behavior forsessionDescribe.Suggested fix
- input, query, err := decodeSessionEventQueryInput(req) - if err != nil { - return toolspkg.ToolResult{}, err - } + var input sessionEventQueryInput + if err := decodeNativeInput(req, &input); err != nil { + return toolspkg.ToolResult{}, err + } bound, err := n.nativeBoundSession(ctx, scope) if err != nil { return toolspkg.ToolResult{}, err } input.SessionID = nativeBoundSessionID(bound, input.SessionID) + input.SessionID, err = requiredNativeString(req.ToolID, "session_id", input.SessionID) + if err != nil { + return toolspkg.ToolResult{}, err + } + query, err := input.eventQuery(req.ToolID) + if err != nil { + return toolspkg.ToolResult{}, err + } resolved, err := n.nativeResolvedWorkspace( ctx, req.ToolID,🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/daemon/native_tools.go` around lines 1858 - 1872, decodeSessionEventQueryInput currently rejects an empty session_id before the binding fallback runs, preventing callers that rely on scope.SessionID from omitting session_id; change the flow so the session binding occurs before validation (or allow decodeSessionEventQueryInput to accept an empty session_id), i.e., call n.nativeBoundSession and nativeBoundSessionID to fill input.SessionID (using nativeBoundWorkspaceRef/nativeResolvedWorkspace as needed) prior to enforcing non-empty session_id, or update decodeSessionEventQueryInput to not error on empty session_id and let nativeBoundSessionID populate it for sessionDescribe; adjust the code paths in native_tools.go (functions decodeSessionEventQueryInput, nativeBoundSession, nativeBoundSessionID, and nativeResolvedWorkspace/sessionDescribe call sites) accordingly.
🧹 Nitpick comments (2)
internal/automation/resource_test.go (1)
1119-1197: ⚡ Quick winAdd compile-time interface assertions for the new adapter stores.
These adapters fully implement their respective interfaces (
resources.Store[T]forcancelAfterMutationStoreandWebhookSecretStoreforcancelAfterWebhookSecretStore). Compile-time assertions will fail fast on interface drift and ensure test infrastructure stability.Suggested patch
+var ( + _ resources.Store[Job] = (*cancelAfterMutationStore[Job])(nil) + _ resources.Store[Trigger] = (*cancelAfterMutationStore[Trigger])(nil) + _ WebhookSecretStore = (*cancelAfterWebhookSecretStore)(nil) +) + type cancelAfterMutationStore[T any] struct { store resources.Store[T] cancel context.CancelFunc cancelOnPut bool cancelOnDelete bool🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/automation/resource_test.go` around lines 1119 - 1197, Add compile-time interface assertions to ensure cancelAfterMutationStore[T] implements resources.Store[T] and cancelAfterWebhookSecretStore implements WebhookSecretStore: after the type declarations, add var _ resources.Store[YourTypePlaceholder] = (*cancelAfterMutationStore[YourTypePlaceholder])(nil) (use a representative concrete type or keep it generic via a concrete instantiation used in tests) and var _ WebhookSecretStore = (*cancelAfterWebhookSecretStore)(nil); this will cause a compile-time error if either cancelAfterMutationStore.Put/Delete/Get/List or cancelAfterWebhookSecretStore.ResolveRef/PutSecret/DeleteSecret stop satisfying their interfaces.extensions/bridges/gchat/provider.go (1)
419-439: 💤 Low valueAPI client cache key is computed outside the lock.
The
gchatAPIClientCacheKey(cfg)call at line 420 happens before acquiringp.mu.Lock(), whilecfg.instanceIDis read again at line 437 inside the lock. This is safe because the config pointer is obtained from routes (which is protected by the same mutex) or is newly created and not yet shared. However, if future refactoring introduces concurrent config modification, this could become a subtle race.Consider documenting this invariant or computing the cache key fully inside the lock for defensive clarity.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@extensions/bridges/gchat/provider.go` around lines 419 - 439, The cache key for the GChat API client is computed by gchatAPIClientCacheKey(cfg) before acquiring p.mu.Lock() inside apiForConfig, which relies on the invariant that cfg won't be concurrently modified; to make this defensive and avoid a potential race, move the call to gchatAPIClientCacheKey(cfg) and the read of cfg.instanceID so they occur inside the p.mu.Lock()/defer p.mu.Unlock() critical section where p.apiClients is accessed/initialized (i.e., compute cacheKey and instanceID within the locked block before checking or writing p.apiClients).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@extensions/bridges/linear/provider_test.go`:
- Around line 369-399: The shared-path scenario needs to be moved into a named
subtest using t.Run to isolate failures; wrap the entire block that builds
sharedPathBody, sharedPathReq, sharedPathCandidates, calls
selectLinearWebhookSignatureCandidates and verifyLinearWebhookSignature into a
t.Run("Should ...") closure (e.g., t.Run("Should scope shared-path signatures to
organization", func(t *testing.T) { ... })) and keep all existing assertions and
header manipulations (calls to linearSignature, verifyLinearWebhookSignature)
inside that closure so the test follows the required t.Run("Should...") pattern
while preserving the same setup and checks using
selectLinearWebhookSignatureCandidates and verifyLinearWebhookSignature.
In `@extensions/bridges/linear/runtime_test.go`:
- Around line 268-386: Wrap the main test logic inside
TestWebhookIngressRejectsCrossInstanceSignatureOnSharedPath in a t.Run subtest
(e.g., t.Run("Should reject cross-instance signature on shared path", func(t
*testing.T) { ... })), moving the existing setup/calls/assertions into that
closure while keeping declarations like runtime, hostPeer, cleanup, managed, and
the mustHandleLinear callback accessible; ensure deferred cleanup remains inside
the subtest (or is preserved correctly) so resource teardown still runs when the
subtest finishes.
In `@extensions/bridges/slack/provider.go`:
- Around line 2119-2140: FindDeliveryMessage currently only requests up to 100
messages and returns nil if the matching message isn’t in that first page;
implement cursor-based pagination to iterate pages until a match is found or
there are no more pages. Modify the loop around c.call so
slackConversationMessagesRequest includes a Cursor field set from
slackConversationMessagesResponse.ResponseMetadata.NextCursor (or equivalent)
and repeat calling c.call while result.HasMore is true (or NextCursor != ""); on
each page check messages with slackMetadataMatchesDelivery and return
slackPostedMessage when found. Ensure you preserve the thread/replies behavior
by keeping method set to "conversations.replies" and TS/Inclusive set when
req.ThreadTS is present, and stop paginating immediately when a match is
returned.
In `@extensions/bridges/teams/provider_test.go`:
- Around line 1724-1801: The test function TestWebhookRejectsDuplicateSharedPath
is missing the required t.Run("Should...") subtest wrapper; wrap the existing
test body inside t.Run with a descriptive name (e.g., t.Run("Should reject
duplicate shared path", func(t *testing.T) { ... })) so all assertions and setup
(including calls to newRuntimePeerPair, testTeamsManagedInstance,
mustHandleLifecycle, hostPeer.Call, runtime.currentSession,
runtime.reconcileInstanceConfigs, and runtime.serveWebhookHTTP) execute inside
the subtest; keep the same logic and use the subtest's t for all checks.
In `@extensions/bridges/teams/provider.go`:
- Around line 2025-2047: The helper resolveTeamsReferencedRemoteMessageID
currently falls back to state.RemoteMessageID/snapshot.RemoteMessageID when
reference.delivery_id is present but referenceStateLookup misses; change it to
"fail closed": if referenceDeliveryID(reference) returns a non-empty deliveryID
and referenceStateLookup is non-nil, then if the lookup does not find a
referencedState (ok == false) return empty string immediately (do not proceed to
check state.RemoteMessageID or snapshot.RemoteMessageID); keep the existing
early-return when referenceRemoteMessageID(reference) is present, and retain the
later fallback to state/snapshot only when no delivery_id was supplied or no
lookup attempt was made. Reference symbols:
resolveTeamsReferencedRemoteMessageID, referenceDeliveryID,
referenceRemoteMessageID, referenceStateLookup, deliveryState,
state.RemoteMessageID, snapshot.RemoteMessageID.
In `@internal/acp/tool_host.go`:
- Around line 62-66: WithLocalAdditionalRoots currently overwrites
cfg.additionalRoots causing earlier calls to be lost; change the mutation to
append the new roots onto existing cfg.additionalRoots (e.g., use
append(cfg.additionalRoots, roots...)) so repeated calls accumulate roots
instead of the last call winning; update the closure that mutates
localRuntimeConfig in WithLocalAdditionalRoots and ensure newPermissionPolicy
will see the combined list.
In `@internal/api/contract/agents.go`:
- Around line 16-17: The regex rawClaimTokenValuePattern only matches lowercase
"agh_claim_" so containsRawClaimTokenJSON can miss upper-case variants; update
the regex used in rawClaimTokenValuePattern to be case-insensitive (or compile
with (?i) prefix) so it matches AGH_CLAIM_... in any casing, and also verify any
other uses around containsRawClaimTokenJSON (references in the same file around
lines ~587-593) use the updated pattern; keep the symbol name
rawClaimTokenValuePattern and ensure no other manual case checks conflict with
this change.
In `@internal/api/contract/json_safety.go`:
- Around line 55-57: The current normalization only replaces hyphens so keys
like "claim.token" or "api.key" bypass the sensitive-key switch; update the
normalization in json_safety.go (the code that defines normalized :=
strings.ToLower(strings.TrimSpace(key)) and the subsequent strings.ReplaceAll)
to generically canonicalize delimiters by replacing any non-alphanumeric
character with an underscore (e.g., via a regexp), then collapse repeated
underscores and trim leading/trailing underscores before the switch; this
ensures variants like "claim.token", "claim-token", "claim token", "claim:token"
all normalize to "claim_token" so the existing sensitive-key switch (the switch
on normalized) will catch them.
In `@internal/api/core/agent_channels.go`:
- Around line 575-577: The code path that calls
coordinationMetadataFromEnvelope(envelope) currently swallows ExtJSON
json.Unmarshal errors (returning nil metadata) which can hide persisted decode
failures and break validateReplySource; update coordinationMetadataFromEnvelope
(and the callers around envelopeFromNetworkMessage usage) to propagate the JSON
decode error instead of returning a nil metadata/ok, e.g., change the function
signature to return (metadata, ok, err) or return an error alongside
sourceCoordinationMetadata so callers (where envelopeFromNetworkMessage,
sourceCoordinationMetadata, validateReplySource are used) can log/handle the
decode failure and return the error up the call chain rather than silently
discarding it.
In `@internal/api/core/resources.go`:
- Around line 127-132: In the Delete handler there's silent swallowing of the
trigger error: when s.trigger(ctx, kind, resources.ReconcileReasonWrite) returns
an error the code returns nil; update the Delete method to propagate the error
instead of dropping it (i.e., return the err from the s.trigger call) and ensure
the Delete function's signature/ callers handle the propagated error; reference
the s.trigger call and the Delete method (and the kind /
resources.ReconcileReasonWrite usage) to locate and fix the code.
In `@internal/api/httpapi/prompt.go`:
- Around line 103-109: The detached drain goroutine currently uses
context.WithoutCancel(ctx) which drops any deadline and can let
drainPromptEvents run forever; instead preserve a bounded deadline by checking
ctx.Deadline() and creating a new context that re-attaches that deadline (or use
context.WithTimeout/context.WithDeadline) before calling h.promptDrainWG.Go;
update the code around ctx, drainCtx, context.WithoutCancel, h.promptDrainWG.Go,
cancelPrompt(), and h.drainPromptEvents so the goroutine always has a finite
deadline (or a reasonable timeout) and still detaches cancellation, ensuring
waitForPromptDrains() cannot block indefinitely.
In `@internal/api/udsapi/server_test.go`:
- Around line 511-515: The test currently only checks that
server.Shutdown(shutdownCtx) returns a non-nil error; change it to assert the
timeout-specific shutdown error instead by verifying the returned error matches
the prompt-drain timeout condition: capture err := server.Shutdown(shutdownCtx)
and then either use errors.Is(err, context.DeadlineExceeded) (or the concrete
timeout error type used by Shutdown) via errors.Is/ErrorAs, or use a string
assertion like require.ErrorContains(t, err, "prompt drain") / t.Fatalf if not
matched; reference the shutdownCtx, cancelShutdown and server.Shutdown call when
making the assertion so the test fails only for the timeout branch.
In `@internal/api/udsapi/server.go`:
- Around line 833-841: The code unconditionally clears server handles and sets
s.state = serverStateStopped even if s.serveErr indicates a partial/timeout
failure; change this so we only clear s.httpServer, s.listener, s.serveDone,
s.streamCancel and set s.state = serverStateStopped when the shutdown/serve
completed successfully (i.e. s.serveErr is nil). Concretely, inside the critical
section around s.mu.Lock()/Unlock() check s.serveErr (the local serveErr
variable you already read) and if serveErr == nil perform the current clearing
and state transition; otherwise leave the handles and state intact (so Start
cannot race in) and ensure serveErr remains set for callers to observe. Keep the
existing s.serveErr assignment behavior but do not overwrite/clear it when
non-nil.
In `@internal/automation/trigger.go`:
- Around line 476-479: The branch after calling dispatchAfterFilter incorrectly
only releases the webhook claim when an error occurred AND there are no runs;
change the condition so the claim is released when there are no runs OR an error
occurred. Update the check around result/err in the code that calls
e.dispatchAfterFilter(ctx, envelope, []TriggerRegistration{registration},
claim.reservedRun) to call e.releaseWebhookDelivery(ctx, claim) when
len(result.Runs) == 0 || err != nil (referencing result, err,
dispatchAfterFilter, releaseWebhookDelivery and claim.reservedRun).
In `@internal/bridges/task_notifier.go`:
- Around line 578-580: After decoding with decoder :=
json.NewDecoder(bytes.NewReader(raw)) and decoder.Decode(&payload), explicitly
reject any trailing JSON by attempting a second decode into a dummy (e.g. var
extra interface{}) and treating a successful second decode as an error;
specifically, after Decode(&payload) call if err := decoder.Decode(&extra); err
== nil { return fmt.Errorf("trailing JSON after payload") } else if err !=
io.EOF && err != nil { return err } so that decoder and payload handling in
task_notifier.go does not allow extra tokens after the primary JSON value.
In `@internal/bundles/resource_store_test.go`:
- Around line 264-309: Wrap the existing test body of
TestResourceStoreApplyRollsBackEarlierKindsOnLaterFailure inside a t.Run subtest
with a descriptive name beginning with "Should" (e.g., t.Run("Should rollback
earlier kinds on later failure", func(t *testing.T) { ... })) so the case
follows the required subtest naming pattern; keep the existing setup
(newBundleResourceUnitHarness, failingJobStore, scope, agent, job, activationID)
and all assertions intact but move them into the t.Run closure and call
t.Parallel() inside the subtest if parallelization is desired.
In `@internal/bundles/resource_store.go`:
- Around line 421-423: The rollback uses context.WithoutCancel(ctx) which drops
any deadline; change this so the rollback context preserves the original
deadline: check ctx.Deadline() and if present create rollbackCtx with
context.WithDeadline (or WithTimeout using remaining time) derived from that
deadline, otherwise fall back to context.WithoutCancel; ensure you call the
returned cancel function after restoreOwnedBundleActivationResources to free
resources and pass rollbackCtx into
restoreOwnedBundleActivationResources(snapshot) instead of the current
context.WithoutCancel result.
In `@internal/daemon/bridge_secrets_test.go`:
- Around line 88-90: Add a presence check for managed.BoundSecrets before
indexing: ensure len(managed.BoundSecrets) > 0 and call t.Fatalf (or
t.Fatalf-like helper) with a diagnostic message if it's empty, then proceed to
compare managed.BoundSecrets[0].Value to resolvedValue; reference the
ManagedInstance via instance.ID in the failure messages so test output
identifies which instance lacked BoundSecrets.
---
Outside diff comments:
In `@internal/api/core/resources.go`:
- Around line 110-116: The trigger error is being swallowed in the block that
calls s.trigger(ctx, next.Kind, resources.ReconcileReasonWrite); update this
code to handle errors: if s.trigger returns an error, either return it
(propagate) or at minimum log it for observability before continuing; use the
existing logger on the receiver (e.g., s.logger.Errorf or similar) to record the
error with context (include next.Kind and ReconcileReasonWrite) and then
continue to return record, nil if reconciliation is non-critical. Ensure you
modify the branch that currently does "if err := s.trigger(...); err != nil {
return record, nil }" to include the logging or propagate the error as
appropriate.
In `@internal/daemon/native_tools.go`:
- Around line 1858-1872: decodeSessionEventQueryInput currently rejects an empty
session_id before the binding fallback runs, preventing callers that rely on
scope.SessionID from omitting session_id; change the flow so the session binding
occurs before validation (or allow decodeSessionEventQueryInput to accept an
empty session_id), i.e., call n.nativeBoundSession and nativeBoundSessionID to
fill input.SessionID (using nativeBoundWorkspaceRef/nativeResolvedWorkspace as
needed) prior to enforcing non-empty session_id, or update
decodeSessionEventQueryInput to not error on empty session_id and let
nativeBoundSessionID populate it for sessionDescribe; adjust the code paths in
native_tools.go (functions decodeSessionEventQueryInput, nativeBoundSession,
nativeBoundSessionID, and nativeResolvedWorkspace/sessionDescribe call sites)
accordingly.
---
Nitpick comments:
In `@extensions/bridges/gchat/provider.go`:
- Around line 419-439: The cache key for the GChat API client is computed by
gchatAPIClientCacheKey(cfg) before acquiring p.mu.Lock() inside apiForConfig,
which relies on the invariant that cfg won't be concurrently modified; to make
this defensive and avoid a potential race, move the call to
gchatAPIClientCacheKey(cfg) and the read of cfg.instanceID so they occur inside
the p.mu.Lock()/defer p.mu.Unlock() critical section where p.apiClients is
accessed/initialized (i.e., compute cacheKey and instanceID within the locked
block before checking or writing p.apiClients).
In `@internal/automation/resource_test.go`:
- Around line 1119-1197: Add compile-time interface assertions to ensure
cancelAfterMutationStore[T] implements resources.Store[T] and
cancelAfterWebhookSecretStore implements WebhookSecretStore: after the type
declarations, add var _ resources.Store[YourTypePlaceholder] =
(*cancelAfterMutationStore[YourTypePlaceholder])(nil) (use a representative
concrete type or keep it generic via a concrete instantiation used in tests) and
var _ WebhookSecretStore = (*cancelAfterWebhookSecretStore)(nil); this will
cause a compile-time error if either
cancelAfterMutationStore.Put/Delete/Get/List or
cancelAfterWebhookSecretStore.ResolveRef/PutSecret/DeleteSecret stop satisfying
their interfaces.
🪄 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: 1ff76e16-012e-41d9-9afd-3724dd1b8b26
⛔ Files ignored due to path filters (8)
.agents/skills/firecrawl/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/firecrawl/rules/install.mdis excluded by!**/*.md,!.agents/**.agents/skills/firecrawl/rules/security.mdis excluded by!**/*.md,!.agents/**.github/actions/setup-go/action.ymlis excluded by!**/*.yml.github/workflows/ci.ymlis excluded by!**/*.yml.github/workflows/release.ymlis excluded by!**/*.yml.goreleaser.ymlis excluded by!**/*.ymlagh-daytona-sidecar.exeis excluded by!**/*.exe
📒 Files selected for processing (292)
Makefilecmd/agh-codegen/main.gocmd/agh-codegen/main_test.gocmd/agh-codegen/openapi_temp_storage_test.goextensions/bridges/discord/provider.goextensions/bridges/discord/reconcile_zero_managed_test.goextensions/bridges/gchat/provider.goextensions/bridges/gchat/provider_contract_test.goextensions/bridges/gchat/provider_test.goextensions/bridges/github/api.goextensions/bridges/github/provider.goextensions/bridges/github/provider_delivery_test.goextensions/bridges/github/provider_test.goextensions/bridges/linear/api.goextensions/bridges/linear/oauth_failure_test.goextensions/bridges/linear/provider.goextensions/bridges/linear/provider_test.goextensions/bridges/linear/runtime_test.goextensions/bridges/linear/runtime_webhook_timeout_test.goextensions/bridges/slack/provider.goextensions/bridges/slack/provider_delivery_test.goextensions/bridges/slack/provider_test.goextensions/bridges/teams/provider.goextensions/bridges/teams/provider_delivery_test.goextensions/bridges/teams/provider_test.goextensions/bridges/telegram/provider.goextensions/bridges/telegram/provider_delivery_test.goextensions/bridges/telegram/provider_test.goextensions/bridges/whatsapp/provider.goextensions/bridges/whatsapp/provider_delivery_test.goextensions/bridges/whatsapp/provider_test.gogo.modinternal/acp/client.gointernal/acp/client_integration_test.gointernal/acp/launcher_tool_host_test.gointernal/acp/permission.gointernal/acp/request_contract_test.gointernal/acp/terminal.gointernal/acp/tool_host.gointernal/agentidentity/identity.gointernal/agentidentity/identity_test.gointernal/api/contract/agents.gointernal/api/contract/agents_test.gointernal/api/contract/authored_context.gointernal/api/contract/bridges.gointernal/api/contract/bridges_test.gointernal/api/contract/json_safety.gointernal/api/core/agent_channels.gointernal/api/core/agent_channels_internal_test.gointernal/api/core/authored_context.gointernal/api/core/errors.gointernal/api/core/resources.gointernal/api/core/resources_trigger_test.gointernal/api/core/tasks_integration_test.gointernal/api/core/tasks_surface_integration_test.gointernal/api/core/tasks_terminal_integration_test.gointernal/api/core/tasks_token_fence_integration_test.gointernal/api/core/testutil_stub_test.gointernal/api/httpapi/bridges_integration_test.gointernal/api/httpapi/helpers_integration_test.gointernal/api/httpapi/hooks_integration_test.gointernal/api/httpapi/httpapi_integration_test.gointernal/api/httpapi/middleware.gointernal/api/httpapi/network_test.gointernal/api/httpapi/prompt.gointernal/api/httpapi/prompt_drain_test.gointernal/api/httpapi/request_body_limit_test.gointernal/api/httpapi/transport_parity_integration_test.gointernal/api/spec/authored_context.gointernal/api/spec/authored_context_test.gointernal/api/spec/resources_test.gointernal/api/spec/spec.gointernal/api/spec/spec_test.gointernal/api/testutil/apitest_test.gointernal/api/testutil/automation_stub.gointernal/api/testutil/bridge_stub.gointernal/api/testutil/session_stub.gointernal/api/testutil/sse.gointernal/api/udsapi/bridges_integration_test.gointernal/api/udsapi/hosted_mcp.gointernal/api/udsapi/hosted_mcp_test.gointernal/api/udsapi/server.gointernal/api/udsapi/server_test.gointernal/api/udsapi/transport_parity_integration_test.gointernal/api/udsapi/udsapi_integration_test.gointernal/automation/dispatch.gointernal/automation/manager.gointernal/automation/manager_integration_test.gointernal/automation/manager_webhook_replay_test.gointernal/automation/model/persistence.gointernal/automation/model/template.gointernal/automation/model/template_test.gointernal/automation/persistence.gointernal/automation/resource_projection.gointernal/automation/resource_test.gointernal/automation/trigger.gointernal/automation/trigger_refac_test.gointernal/bridges/delivery_broker.gointernal/bridges/delivery_broker_contract_test.gointernal/bridges/delivery_types.gointernal/bridges/registry_integration_test.gointernal/bridges/target_integration_test.gointernal/bridges/task_notifier.gointernal/bridges/task_notifier_test.gointernal/bridgesdk/batching.gointernal/bridgesdk/batching_refac_test.gointernal/bridgesdk/dedup.gointernal/bridgesdk/dedup_test.gointernal/bridgesdk/runtime.gointernal/bridgesdk/runtime_initialize_request_test.gointernal/bridgesdk/runtime_integration_test.gointernal/bundles/model/model.gointernal/bundles/model/model_test.gointernal/bundles/resource_store.gointernal/bundles/resource_store_test.gointernal/bundles/service.gointernal/bundles/service_refac_test.gointernal/cli/authored_context.gointernal/cli/cli_historical_mixed_ownership_integration_test.gointernal/cli/cli_historical_task_run_terminal_integration_test.gointernal/cli/cli_integration_test.gointernal/cli/client.gointernal/cli/client_test.gointernal/cli/client_tools.gointernal/cli/daemon.gointernal/cli/daemon_authored_context_test.gointernal/cli/daemon_relaunch_test.gointernal/cli/daemon_wait_test.gointernal/cli/docpost/docpost.gointernal/cli/docpost/process_input_test.gointernal/cli/extension_marketplace_integration_test.gointernal/cli/helpers_test.gointernal/cli/lifecycle_test.gointernal/cli/mcp_auth.gointernal/cli/mcp_auth_test.gointernal/cli/perf_bench_test.gointernal/cli/root.gointernal/cli/skill_marketplace_integration_test.gointernal/cli/tool_integration_test.gointernal/cli/tool_test.gointernal/codegen/openapits/generate.gointernal/codegen/openapits/generate_test.gointernal/config/agent.gointernal/config/agent_create.gointernal/config/agent_edit.gointernal/config/agent_edit_test.gointernal/config/agent_resource.gointernal/config/agent_resource_test.gointernal/config/agent_workspace_discovery_test.gointernal/config/bootstrap.gointernal/config/capabilities.gointernal/config/config.gointernal/config/file_io.gointernal/config/home.gointernal/config/home_permissions_test.gointernal/config/hooks.gointernal/config/mcp_resource.gointernal/config/persistence_integration_test.gointernal/daemon/agent_skill_resources_integration_test.gointernal/daemon/boot.gointernal/daemon/bridge_secrets.gointernal/daemon/bridge_secrets_test.gointernal/daemon/daemon_acpmock_faults_integration_test.gointernal/daemon/daemon_bridge_extension_integration_test.gointernal/daemon/daemon_integration_test.gointernal/daemon/daemon_mock_agents_integration_test.gointernal/daemon/daemon_network_collaboration_integration_test.gointernal/daemon/daemon_nightly_combined_integration_test.gointernal/daemon/daemon_test.gointernal/daemon/harness_context_integration_test.gointernal/daemon/native_provider_model_tools.gointernal/daemon/native_tools.gointernal/daemon/native_tools_test.gointernal/daemon/prompt_input_composite_integration_test.gointernal/daemon/tool_mcp_resources_integration_test.gointernal/daemon/tool_policy_resolver.gointernal/diagnostics/redact.gointernal/diagnostics/redact_test.gointernal/e2elane/command_wiring_test.gointernal/e2elane/go_module_contract_test.gointernal/e2elane/makefile_web_targets_test.gointernal/extension/bridge_delivery_integration_test.gointernal/extension/discord_provider_integration_test.gointernal/extension/gchat_provider_integration_test.gointernal/extension/github_provider_integration_test.gointernal/extension/host_api.gointernal/extension/host_api_authored_context.gointernal/extension/host_api_automation_payload_test.gointernal/extension/host_api_bridges.gointernal/extension/host_api_bridges_ingest_test.gointernal/extension/host_api_integration_test.gointernal/extension/host_api_soul_validate_test.gointernal/extension/linear_provider_integration_test.gointernal/extension/manager_integration_test.gointernal/extension/manifest_integration_test.gointernal/extension/model_source_test.gointernal/extension/provider_conformance_matrix_integration_test.gointernal/extension/reference_integration_test.gointernal/extension/registry_integration_test.gointernal/extension/slack_provider_integration_test.gointernal/extension/teams_provider_integration_test.gointernal/extension/telegram_provider_integration_test.gointernal/extension/telegram_reference_integration_test.gointernal/extension/whatsapp_provider_integration_test.gointernal/extensiontest/bridge_adapter_harness.gointernal/extensiontest/bridge_adapter_harness_ack_test.gointernal/extensiontest/bridge_adapter_harness_delivery_test.gointernal/extensiontest/bridge_adapter_harness_integration_test.gointernal/extensiontest/bridge_conformance_matrix.gointernal/extensiontest/bridge_conformance_matrix_outcomes_test.gointernal/fileutil/atomic.gointernal/fileutil/atomic_dirsync_windows.gointernal/fileutil/atomic_remove_test.gointernal/fileutil/atomic_remove_unix.gointernal/fileutil/atomic_remove_windows.gointernal/fileutil/atomic_test.gointernal/fileutil/atomic_windows_test.gointernal/heartbeat/authoring.gointernal/heartbeat/authoring_status_test.gointernal/heartbeat/heartbeat.gointernal/heartbeat/persistence.gointernal/heartbeat/status.gointernal/heartbeat/wake.gointernal/heartbeat/wake_test.gointernal/hooks/async_clone.gointernal/hooks/async_clone_test.gointernal/hooks/automation_job_payload_test.gointernal/hooks/dispatch_async_test.gointernal/hooks/dispatch_integration_test.gointernal/hooks/executor_subprocess.gointernal/hooks/executor_subprocess_windows.gointernal/hooks/executor_subprocess_windows_test.gointernal/hooks/hooks.gointernal/hooks/introspection.gointernal/hooks/introspection_wildcard_test.gointernal/hooks/matcher.gointernal/hooks/matcher_authored_context_test.gointernal/hooks/payloads.gointernal/mcp/auth/metadata.gointernal/mcp/auth/service.gointernal/mcp/auth/service_direct_endpoint_test.gointernal/mcp/auth/service_expires_in_test.gointernal/mcp/executor.gointernal/mcp/executor_test.gointernal/mcp/hosted_proxy.gointernal/mcp/hosted_proxy_result_test.gointernal/memory/assembler_test.gointernal/memory/consolidation/perf_bench_test.gointernal/memory/consolidation/runtime.gointernal/memory/consolidation/runtime_spawner_test.gointernal/memory/consolidation/runtime_test.gointernal/memory/contract/contract_test.gointernal/memory/contract/types.gointernal/memory/controller/controller.gointernal/memory/controller/controller_test.gointernal/memory/decision.gointernal/memory/dream.gointernal/memory/dream_test.gointernal/memory/extractor/inbox.gointernal/memory/extractor/runtime.gointernal/memory/extractor/runtime_test.gointernal/memory/extractor_events.gointernal/memory/extractor_events_test.gointernal/memory/lock.gointernal/memory/lock_concurrency_test.gointernal/memory/observability.gointernal/memory/observability_test.gointernal/memory/prompts/registry.gointernal/memory/prompts/registry_test.gointernal/memory/provider/local/provider.gointernal/memory/provider/local/provider_test.gointernal/memory/recall/signal_recorder.gointernal/memory/recall/signal_recorder_test.gointernal/memory/store.gointernal/memory/store_memv2_test.gointernal/memory/store_test.gointernal/modelcatalog/merge.gointernal/modelcatalog/service.gointernal/modelcatalog/service_test.gointernal/network/audit.gointernal/network/audit_timeline_test.gointernal/network/delivery_integration_test.gointernal/network/envelope_integration_test.gointernal/network/manager_integration_test.gointernal/network/router_integration_test.gointernal/network/tasks_integration_test.gointernal/network/transport.gointernal/network/transport_shutdown_test.gointernal/observe/reconcile.gointernal/observe/reconcile_test.gointernal/observe/tasks_integration_test.gointernal/procutil/detached.go
💤 Files with no reviewable changes (2)
- internal/daemon/boot.go
- internal/daemon/native_provider_model_tools.go
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
extensions/bridges/slack/provider.go (1)
222-224: 💤 Low valueAdd compile-time interface assertion for
slackDeliveryReconciler.The
slackBotClientimplementsslackDeliveryReconcilerviaFindDeliveryMessage, but there's no compile-time assertion to verify interface satisfaction. While the runtime type assertion at line 1528 handles cases where the interface isn't implemented, a compile-time check catches implementation drift earlier.♻️ Add compile-time assertion
Add near the type definition:
var _ slackDeliveryReconciler = (*slackBotClient)(nil)As per coding guidelines: "Use compile-time interface assertions (
var _ InterfaceName = (*ConcreteType)(nil)) to verify interface satisfaction".🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@extensions/bridges/slack/provider.go` around lines 222 - 224, Add a compile-time interface assertion to ensure slackBotClient implements slackDeliveryReconciler: near the slackDeliveryReconciler type definition, add the statement asserting var _ slackDeliveryReconciler = (*slackBotClient)(nil). This references the slackDeliveryReconciler interface and the slackBotClient concrete type (which implements FindDeliveryMessage) so the compiler will catch any future drift.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/automation/trigger_test.go`:
- Around line 554-618: Wrap the existing
TestTriggerEngineAllowsWebhookRetryWhenFilteringProducesNoRuns body in a
t.Run("Should allow webhook retry when filtering produces no runs", func(t
*testing.T) { ... }) subtest and move the t.Parallel() call inside that subtest;
keep all existing setup and assertions
(store/newRecordingSessionCreator/current/dispatcher/newTestTriggerEngine,
registering the trigger, signing payload, the two HandleWebhook calls and
assertions, and checks against creator.promptCalls()) unchanged except for the
surrounding t.Run wrapper so the test follows the required t.Run("Should...")
pattern.
---
Nitpick comments:
In `@extensions/bridges/slack/provider.go`:
- Around line 222-224: Add a compile-time interface assertion to ensure
slackBotClient implements slackDeliveryReconciler: near the
slackDeliveryReconciler type definition, add the statement asserting var _
slackDeliveryReconciler = (*slackBotClient)(nil). This references the
slackDeliveryReconciler interface and the slackBotClient concrete type (which
implements FindDeliveryMessage) so the compiler will catch any future drift.
🪄 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: eaf2b1d3-91af-4219-9c9f-ab92973e99ad
📒 Files selected for processing (25)
extensions/bridges/linear/provider_test.goextensions/bridges/linear/runtime_test.goextensions/bridges/slack/provider.goextensions/bridges/slack/provider_test.goextensions/bridges/teams/provider.goextensions/bridges/teams/provider_test.gointernal/acp/launcher_tool_host_test.gointernal/acp/tool_host.gointernal/api/contract/agents.gointernal/api/contract/agents_test.gointernal/api/contract/json_safety.gointernal/api/core/agent_channels.gointernal/api/core/agent_channels_internal_test.gointernal/api/httpapi/prompt.gointernal/api/httpapi/prompt_drain_test.gointernal/api/udsapi/server.gointernal/api/udsapi/server_test.gointernal/automation/resource_test.gointernal/automation/trigger.gointernal/automation/trigger_test.gointernal/bridges/task_notifier.gointernal/bridges/task_notifier_test.gointernal/bundles/resource_store.gointernal/bundles/resource_store_test.gointernal/daemon/bridge_secrets_test.go
🚧 Files skipped from review as they are similar to previous changes (16)
- extensions/bridges/linear/provider_test.go
- internal/api/contract/json_safety.go
- internal/api/contract/agents.go
- internal/bridges/task_notifier.go
- internal/acp/tool_host.go
- internal/api/core/agent_channels.go
- internal/daemon/bridge_secrets_test.go
- extensions/bridges/teams/provider_test.go
- extensions/bridges/linear/runtime_test.go
- internal/bundles/resource_store_test.go
- internal/automation/resource_test.go
- internal/bundles/resource_store.go
- internal/api/core/agent_channels_internal_test.go
- internal/bridges/task_notifier_test.go
- extensions/bridges/teams/provider.go
- internal/automation/trigger.go
| func TestTriggerEngineAllowsWebhookRetryWhenFilteringProducesNoRuns(t *testing.T) { | ||
| t.Parallel() | ||
|
|
||
| store := newMemoryRunStore() | ||
| creator := newRecordingSessionCreator() | ||
| current := time.Date(2026, 4, 11, 5, 0, 0, 0, time.UTC) | ||
| dispatcher := newTestDispatcher(t, creator, store, WithDispatcherNow(func() time.Time { return current })) | ||
| engine := newTestTriggerEngine( | ||
| t, | ||
| dispatcher, | ||
| WithTriggerEngineNow(func() time.Time { return current }), | ||
| WithTriggerEngineWebhookFreshnessWindow(5*time.Minute), | ||
| ) | ||
|
|
||
| trigger := testWebhookTrigger(AutomationScopeGlobal, "webhook-filter-no-runs", "") | ||
| trigger.Filter = map[string]string{"data.payload": "approved"} | ||
| if err := engine.Register(TriggerRegistration{Trigger: trigger}); err != nil { | ||
| t.Fatalf("Register() error = %v", err) | ||
| } | ||
|
|
||
| payload := []byte(`{"payload":"deploy"}`) | ||
| signature, err := SignWebhookPayload(testWebhookSecretValue(trigger.WebhookSecretRef), current, payload) | ||
| if err != nil { | ||
| t.Fatalf("SignWebhookPayload() error = %v", err) | ||
| } | ||
|
|
||
| firstResult, err := engine.HandleWebhook(testutil.Context(t), WebhookRequest{ | ||
| Scope: AutomationScopeGlobal, | ||
| Endpoint: "deploy-review--" + trigger.WebhookID, | ||
| DeliveryID: "delivery-filtered", | ||
| Timestamp: current, | ||
| Signature: signature, | ||
| Payload: payload, | ||
| Data: map[string]any{ | ||
| "payload": "deploy", | ||
| }, | ||
| }) | ||
| if err != nil { | ||
| t.Fatalf("HandleWebhook(first) error = %v", err) | ||
| } | ||
| if got := len(firstResult.Runs); got != 0 { | ||
| t.Fatalf("len(firstResult.Runs) = %d, want 0", got) | ||
| } | ||
|
|
||
| secondResult, err := engine.HandleWebhook(testutil.Context(t), WebhookRequest{ | ||
| Scope: AutomationScopeGlobal, | ||
| Endpoint: "deploy-review--" + trigger.WebhookID, | ||
| DeliveryID: "delivery-filtered", | ||
| Timestamp: current, | ||
| Signature: signature, | ||
| Payload: payload, | ||
| Data: map[string]any{ | ||
| "payload": "deploy", | ||
| }, | ||
| }) | ||
| if err != nil { | ||
| t.Fatalf("HandleWebhook(second) error = %v, want nil retry after filter", err) | ||
| } | ||
| if got := len(secondResult.Runs); got != 0 { | ||
| t.Fatalf("len(secondResult.Runs) = %d, want 0", got) | ||
| } | ||
| if got := len(creator.promptCalls()); got != 0 { | ||
| t.Fatalf("len(Prompt calls) = %d, want 0", got) | ||
| } | ||
| } |
There was a problem hiding this comment.
Wrap this test case in a t.Run("Should...") subtest.
This new test is implemented as a direct top-level case instead of the required t.Run("Should...") pattern.
Suggested change
func TestTriggerEngineAllowsWebhookRetryWhenFilteringProducesNoRuns(t *testing.T) {
t.Parallel()
+ t.Run("ShouldAllowWebhookRetryWhenFilteringProducesNoRuns", func(t *testing.T) {
+ t.Parallel()
// existing test body
+ })
}As per coding guidelines, MUST use t.Run("Should...") pattern for ALL test cases.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@internal/automation/trigger_test.go` around lines 554 - 618, Wrap the
existing TestTriggerEngineAllowsWebhookRetryWhenFilteringProducesNoRuns body in
a t.Run("Should allow webhook retry when filtering produces no runs", func(t
*testing.T) { ... }) subtest and move the t.Parallel() call inside that subtest;
keep all existing setup and assertions
(store/newRecordingSessionCreator/current/dispatcher/newTestTriggerEngine,
registering the trigger, signing payload, the two HandleWebhook calls and
assertions, and checks against creator.promptCalls()) unchanged except for the
surrounding t.Run wrapper so the test follows the required t.Run("Should...")
pattern.
## Release v0.0.1 This PR prepares the release of version v0.0.1. ### Changelog ## 0.0.1 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.1 This PR prepares the release of version v0.0.1. ### Changelog ## 0.0.1 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.2 This PR prepares the release of version v0.0.2. ### Changelog ## 0.0.2 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release - Fix release process ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows - Improve suite speed Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.2 This PR prepares the release of version v0.0.2. ### Changelog ## 0.0.2 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release - Fix release process - Fix release sync - Decouple release dry-run npm auth - Persist web assets git auth ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows - Improve suite speed <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated web assets dependency to a newer version for improved stability and performance. <!-- review_stack_entry_start --> [](https://app.coderabbit.ai/change-stack/compozy/agh/pull/211?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.2 This PR prepares the release of version v0.0.2. ### Changelog ## 0.0.2 - 2026-05-27 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout - Fix release dry-run token contract ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release - Fix release process - Fix release sync - Decouple release dry-run npm auth - Persist web assets git auth - Require npm auth before release merge ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows - Improve suite speed <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated dependencies to latest versions. <!-- review_stack_entry_start --> [](https://app.coderabbit.ai/change-stack/compozy/agh/pull/214?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Summary by CodeRabbit
New Features
Bug Fixes
Improvements