refactor: kb improvements#12
Conversation
|
Important Review skippedReview was skipped due to path filters ⛔ Files ignored due to path filters (15)
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:
WalkthroughRefactors and feature additions across multiple subsystems: ACP client start flow decomposed into helpers; hook dispatch split into domain-specific interfaces ( Changes
Sequence Diagram(s)sequenceDiagram
participant Driver
participant Process as Subprocess
participant Conn as ACP Connection
participant Server
Driver->>Driver: spawnProcess() - parse cmd, start subprocess, build AgentProcess
Driver->>Conn: initializeConnection(process.conn) - send Initialize request
Conn-->>Driver: initialize response (caps)
Driver->>Driver: negotiateSession() - if ResumeSessionID -> loadSession() else createSession()
Driver->>Server: create/load session requests (MCP/ACP)
Server-->>Driver: session created/resumed response
Driver->>Process: on failure -> cleanupFailedStart(process, err)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related issues
Possibly related PRs
✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Actionable comments posted: 16
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
internal/memory/consolidation/runtime.go (1)
245-257:⚠️ Potential issue | 🟠 MajorReintroduce a configurable dream-session stop timeout.
This now forces every spawned dream session through the fixed
10stimeout, which removes the only escape hatch for slower agents/workspaces and can leave sessions running whensessions.Stop()needs longer. Please thread the timeout back through config or a functional option instead of baking it into the spawner. As per coding guidelines, "Never hardcode configuration — use TOML config or functional options".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/memory/consolidation/runtime.go` around lines 245 - 257, The closure currently hardcodes defaultSessionStopTimeout when calling spawnSession, causing timeouts to be fixed; make the stop timeout configurable by threading a timeout value from the surrounding configuration or functional option into the closure and passing that value to spawnSession instead of defaultSessionStopTimeout (e.g., add/use cfg.Memory.Dream.SessionStopTimeout or accept a functional option like dreamSessionTimeout and reference it in the returned func); update the call site where this closure is created to supply the configured timeout and ensure spawnSession's signature is unchanged or adjusted accordingly so sessions.Stop() can use the configured duration.internal/daemon/daemon_test.go (1)
1416-1432:⚠️ Potential issue | 🟡 MinorReplace the sleep-based negative assertion with explicit synchronization.
This check depends on a fixed 20ms pause to prove that a dream-session stop did not enqueue another run, which is scheduler-dependent and prone to CI flakes. Please expose a deterministic signal/counter from the notifier or fake dream service and wait on that instead. 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/daemon/daemon_test.go` around lines 1416 - 1432, The test currently uses time.Sleep(20 * time.Millisecond) to assert no extra dream runs after calling dispatcher.Session.DispatchSessionPostStop; replace this flaky sleep with explicit synchronization by exposing and waiting on a deterministic signal/counter from the notifier/fake dream service (e.g., add or use a channel, condition variable, or WaitGroup in the fake notifier and/or the fake dream service) so the test waits until the notifier has processed the post-stop event and then assert dream.runCount() == 1; update the test to call dispatcher.Session.DispatchSessionPostStop(...), wait on the exposed synchronization primitive from the fake notifier or dream (instead of sleeping), and then check dream.runCount() to ensure no extra enqueues.internal/config/config.go (1)
157-167:⚠️ Potential issue | 🟡 MinorWrap the
ResolveHomePaths()error indefaultConfig()to add context.The helpers
withoutDotEnv()andwithoutValidation()are now private, but no external code depends on the previously exported versions—the codebase uses the functional option pattern directly. However, at line 248,defaultConfig()returns the raw error fromResolveHomePaths()without wrapping, which violates the coding guideline requiring wrapped errors with context.♻️ Add error context
func defaultConfig() (Config, error) { homePaths, err := ResolveHomePaths() if err != nil { - return Config{}, err + return Config{}, fmt.Errorf("resolve home paths for default config: %w", err) } return DefaultWithHome(homePaths), nil }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/config/config.go` around lines 157 - 167, The call to ResolveHomePaths() inside defaultConfig() returns an unwrapped error; update defaultConfig() to wrap that error with context using fmt.Errorf("<context>: %w", err) (or an equivalent error-wrapping helper) so callers get meaningful context; locate the ResolveHomePaths() invocation in defaultConfig() and replace the bare return of its error with a wrapped error message referencing ResolveHomePaths.
🧹 Nitpick comments (2)
internal/acp/handlers.go (1)
105-143: Consider hoisting the handler map to a struct field for reduced allocations.The
handlersmap is recreated on everyhandleInboundcall. While the map size is small (9 entries), moving it to a field initialized once duringAgentProcessconstruction would eliminate per-call allocations in a potentially hot path.♻️ Suggested approach
Initialize the handler map once in the
AgentProcessconstructor or via async.Once, then reference it inhandleInbound. This would change the pattern from:func (p *AgentProcess) handleInbound(...) { handlers := map[string]func(...){...} // allocated per call ... }to:
type AgentProcess struct { // ... inboundHandlers map[string]func(context.Context, json.RawMessage) (any, *acpsdk.RequestError) } func (p *AgentProcess) handleInbound(...) { handler, ok := p.inboundHandlers[method] ... }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/acp/handlers.go` around lines 105 - 143, The handlers map inside AgentProcess.handleInbound is allocated on every call; hoist it as a field (e.g., AgentProcess.inboundHandlers) initialized once in the AgentProcess constructor or via sync.Once to avoid per-call allocations. Populate the map with the same keys/func values (e.g., acpsdk.ClientMethodFsReadTextFile -> p.handleReadTextFile, ClientMethodTerminalCreate -> p.handleCreateTerminal, etc.) and update handleInbound to look up handler := p.inboundHandlers[method] and call it (preserving the same function signature and error wrapping) instead of building the map each invocation.internal/session/hooks.go (1)
65-105: Consider adding compile-time interface verification.The accessor methods correctly return no-op implementations when fields are nil. Per coding guidelines, consider adding compile-time interface verification for the no-op types to catch signature mismatches early.
🔧 Compile-time verification
Add at the end of the file:
// Compile-time interface verification var ( _ SessionLifecycleHooks = noopSessionLifecycleHooks{} _ PromptHooks = noopPromptHooks{} _ EventHooks = noopEventHooks{} _ AgentHooks = noopAgentHooks{} _ ConversationHooks = noopConversationHooks{} _ CompactionHooks = noopCompactionHooks{} )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/session/hooks.go` around lines 65 - 105, Add compile-time interface verification for the noop types at the end of internal/session/hooks.go so any signature mismatch is caught at build time; specifically, add var declarations asserting each interface equals the corresponding noop type using the recommended pointer-nil form (e.g. _ SessionLifecycleHooks = (*noopSessionLifecycleHooks)(nil)) for the pairs SessionLifecycleHooks/noopSessionLifecycleHooks, PromptHooks/noopPromptHooks, EventHooks/noopEventHooks, AgentHooks/noopAgentHooks, ConversationHooks/noopConversationHooks, and CompactionHooks/noopCompactionHooks.
🤖 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/session_stream.go`:
- Around line 100-127: The three occurrences where the WriteSSE or
writeSessionStoppedEvent return values are discarded (the calls to WriteSSE
after pollErr and statusErr, and the `_ = h.writeSessionStoppedEvent(writer,
latest)` call) must include a brief comment justifying the ignored error per
guidelines; update each site (the WriteSSE calls handling pollErr and statusErr,
and the writeSessionStoppedEvent call) with a one-line comment explaining this
is intentional/unrecoverable (e.g., client disconnect or SSE stream closed) so
the error cannot be handled or retried.
In `@internal/api/httpapi/middleware.go`:
- Around line 61-83: The function resolveAllowedOrigin currently compares only
hostnames; change it to compare full origin tuples (scheme, hostname, port)
instead. Parse requestHost and boundHost into URLs (like you do for origin),
normalize scheme and port (use default ports for http/https when port is empty),
build a canonical origin string (scheme://hostname:port) for origin, request and
bound, and then compare those full canonical origins in the switch cases instead
of originHost/requestHostname/boundHostname; keep special-case loopback handling
but apply it to the full origin (or allow any loopback port if intended), and
preserve wildcard logic by matching bound origin appropriately (e.g., allow
wildcard host only when bound indicates it). Update helper calls (canonicalHost,
hostOnly, isLoopbackHost, isWildcardHost) or add small helpers to normalize and
compare full origins used by resolveAllowedOrigin.
In `@internal/api/httpapi/routes.go`:
- Around line 6-21: The RegisterRoutes function calls multiple route
registration helpers (registerWorkspaceRoutes, registerSessionRoutes,
registerAgentRoutes, registerObserveRoutes, registerHookRoutes,
registerSkillRoutes, registerMemoryRoutes, registerDaemonRoutes) using the
handlers pointer without guarding for nil, which can cause panics when handlers
is nil; update RegisterRoutes to check that handlers != nil before invoking
those register* functions (either return early or skip registration when
handlers is nil) so calls like handlers.CreateWorkspace won't be dereferenced,
while preserving the existing NoRoute handler setup that already checks for nil.
In `@internal/cli/skill_commands.go`:
- Line 54: The --source flag help currently lists only
bundled/user/additional/workspace but normalizeSkillSourceFilter also accepts
marketplace and the agents aliases; update the flag registration (where
cmd.Flags().StringVar(&sourceFilter, "source", ... ) is called) to include all
supported values (e.g., bundled, user, additional, workspace, marketplace,
agents) in the help string so the CLI help matches the
normalizeSkillSourceFilter parser and its accepted aliases.
In `@internal/cli/skill_marketplace.go`:
- Around line 128-145: installMarketplaceSkill (and updateMarketplaceSkill)
compute targetDir from parsedSkill.Meta.Name which allows a package rename to
create a new directory instead of replacing the existing install; change the
logic to prefer the existing installation directory when updating: in
updateMarketplaceSkill, when an installed record (installed.Dir or
installed.Path) exists, reuse that path as targetDir (or fail if the new package
explicitly intends a rename), and only fall back to deriving a path from
parsedSkill.Meta.Name when there is no existing install; update the call sites
around moveInstalledSkillDir(parsedSkill.Dir, targetDir, replaceExisting)
accordingly so replacements operate on the stable installed.Dir rather than the
archive name.
- Around line 84-94: The defer and error-path currently discard cleanup errors
for archive.Data.Close(), gzipReader.Close(), and file.Close(); change each
ignore (“_ = ...Close()”) to capture the error and handle it (e.g., if closeErr
:= archive.Data.Close(); closeErr != nil { return or wrap/log the error } or log
it with context) so cleanup failures are not silently dropped; update the defer
for tempRoot removal similarly if needed, and ensure the error-path after
creating/writing the file returns or logs the file.Close() error instead of
discarding it, referencing archive.Data.Close, gzipReader.Close, and file.Close
in skill_marketplace.go.
- Around line 544-570: The fallback string comparison in versionIsNewer is
incorrect for pre-release semantics; update versionIsNewer (and helper
parseVersionParts/normalizeVersion if needed) to detect and handle pre-release
suffixes instead of blindly comparing normalized strings: after comparing
numeric parts, if one version has a pre-release tag and the other does not,
treat the one without the tag as newer; if both have pre-release tags, compare
those tags using semver rules (split on dots/hyphens and compare identifiers
numerically when numeric, lexically otherwise). Ensure
versionPartAt/parseVersionParts expose or return the pre-release portion so
versionIsNewer can apply this logic rather than using normalizedLatest >
normalizedCurrent.
In `@internal/cli/skill_workspace.go`:
- Around line 421-438: The skill body (variable content) is embedded verbatim
into XML causing unescaped characters like '<' or '&' to break consumers; update
the XML assembly to escape the skill body before writing it (use the existing
skillXMLTextReplacer or an equivalent XML-escaping function) where content is
appended to the strings.Builder (the same way resources use
skillXMLTextReplacer.Replace(resource)), ensuring you replace/escape content
prior to checking/adding trailing newlines and before
builder.WriteString(content) so the produced XML is always well-formed.
- Around line 22-63: The function returns raw errors from each initialization
step; wrap each returned error with context using fmt.Errorf("...: %w", err) so
callers know which phase failed — specifically wrap errors from
loadRuntimeContext, resolveCLIWorkspaceRoot,
aghconfig.ResolveUserAgentsSkillsDir, registry.LoadAll, resolveSkillWorkspace,
and registry.ForWorkspace (update the error returns in loadSkillCommandContext
to include phase-specific messages referencing those functions/steps).
In `@internal/hooks/dispatch_async.go`:
- Around line 24-26: The async hook's baseCtx is currently rooted in poolCtx so
it ignores parent cancellation; change the base context to be derived from the
parent's context (e.g., use parent.Context() or the parent context variable)
when building baseCtx before calling h.enterDispatch(asyncHook.Event) so that
cancellation of parent cancels the async hook goroutine; update the lines
creating baseCtx and the subsequent WithValue call (which reference
dispatchDepthContextKey{} and dispatchChainContextKey{} and
currentDispatchChain(parent)) to use the parent's context as the root instead of
poolCtx so enterDispatch and any spawned goroutines inherit parent cancellation.
- Around line 21-55: The call to h.pool.Submit(asyncTask{...}) currently ignores
its boolean return; if Submit returns false the asyncTask is dropped silently —
update the code after calling h.pool.Submit to check the returned bool and when
it is false call h.emitHookRun(...) with the same parameters used for other
skipped paths (use asyncPayload, asyncHook.RegisteredHook,
HookRunOutcomeSkipped, duration 0, nil patch, appropriate err value or nil, and
parentDepth) and also log/emit the "hook.dispatch.async_dropped" outcome so
callers get visibility; reference h.pool.Submit, asyncTask, h.emitHookRun,
HookRunOutcomeSkipped, asyncPayload, asyncHook.RegisteredHook and parentDepth to
locate where to add this conditional handling.
In `@internal/hooks/matcher.go`:
- Around line 171-191: selectMatchingHooks currently drops hooks with unknown
hook.Mode silently; add an explicit default branch in the switch in
selectMatchingHooks that handles unexpected modes: log a clear warning
(including hook identity and hook.Mode) and use a safe fallback (e.g., append
the hook to syncHooks) so the hook is not lost; reference the switch on
hook.Mode and constants HookModeAsync and HookModeSync when implementing the
default branch.
In `@internal/memory/store_test.go`:
- Around line 660-682: Split the block of assertions into a table-driven set of
subtests using t.Run("Should ...") entries that each test one expectation for
ageDays, ageText, and freshnessWarning; create a testCases slice referencing the
inputs (today, yesterday, threeDaysAgo, now) and expected outputs, loop over it
and for each case call t.Run with a descriptive "Should ..." name, run
t.Parallel() inside each subtest, and perform the single assertion (use equality
checks for ageDays/ageText and strings.Contains for freshnessWarning's "3 days
old" expectation) against the functions ageDays, ageText, and freshnessWarning
so failures are isolated.
In `@internal/skills/registry_workspace_cache.go`:
- Around line 68-75: The returns from checkRegistryContext(ctx) and
skillSourceFromWorkspacePath(skillPath.Source) should be wrapped with local
context before propagating so failures in workspace loading are diagnosable;
replace direct returns like `return workspaceLoad{}, err` with wrapped errors
using fmt.Errorf to add context (e.g., "checking registry context failed: %w")
when handling the error from checkRegistryContext and similarly add context for
skillSourceFromWorkspacePath (e.g., "determining skill source from workspace
path failed: %w"), keeping references to the existing symbols
checkRegistryContext, skillSourceFromWorkspacePath, and the workspaceLoad return
value.
- Around line 43-51: In workspaceSkillTargetLocked, the read path calls
workspaceCacheKey(*resolved, nil) and drops resolved.Skills causing cache
misses; modify workspaceSkillTargetLocked to extract the skill paths from
resolved.Skills (e.g., map to []string or the same shape used by the write path)
and pass those paths as the second argument to workspaceCacheKey so the read-key
generation matches the write-path key generation (ensure you use the same
transformation of resolved.Skills that the write path uses).
In `@internal/sse/decode.go`:
- Around line 31-52: The Decode function must guard against nil inputs to avoid
panics: at the start of Decode check that ctx != nil and handler != nil (and
optionally body != nil) and return a clear error (e.g., errors.New or
fmt.Errorf) if any are nil; this ensures subsequent calls to ctx.Err() and
handler(event) (and the emit closure) are safe. Update the Decode function
signature's entry checks to validate ctx and handler, add appropriate error
returns, and adjust imports if you use errors/fmt. Ensure the emit closure and
the loop assume handler is non-nil after these guards.
---
Outside diff comments:
In `@internal/config/config.go`:
- Around line 157-167: The call to ResolveHomePaths() inside defaultConfig()
returns an unwrapped error; update defaultConfig() to wrap that error with
context using fmt.Errorf("<context>: %w", err) (or an equivalent error-wrapping
helper) so callers get meaningful context; locate the ResolveHomePaths()
invocation in defaultConfig() and replace the bare return of its error with a
wrapped error message referencing ResolveHomePaths.
In `@internal/daemon/daemon_test.go`:
- Around line 1416-1432: The test currently uses time.Sleep(20 *
time.Millisecond) to assert no extra dream runs after calling
dispatcher.Session.DispatchSessionPostStop; replace this flaky sleep with
explicit synchronization by exposing and waiting on a deterministic
signal/counter from the notifier/fake dream service (e.g., add or use a channel,
condition variable, or WaitGroup in the fake notifier and/or the fake dream
service) so the test waits until the notifier has processed the post-stop event
and then assert dream.runCount() == 1; update the test to call
dispatcher.Session.DispatchSessionPostStop(...), wait on the exposed
synchronization primitive from the fake notifier or dream (instead of sleeping),
and then check dream.runCount() to ensure no extra enqueues.
In `@internal/memory/consolidation/runtime.go`:
- Around line 245-257: The closure currently hardcodes defaultSessionStopTimeout
when calling spawnSession, causing timeouts to be fixed; make the stop timeout
configurable by threading a timeout value from the surrounding configuration or
functional option into the closure and passing that value to spawnSession
instead of defaultSessionStopTimeout (e.g., add/use
cfg.Memory.Dream.SessionStopTimeout or accept a functional option like
dreamSessionTimeout and reference it in the returned func); update the call site
where this closure is created to supply the configured timeout and ensure
spawnSession's signature is unchanged or adjusted accordingly so sessions.Stop()
can use the configured duration.
---
Nitpick comments:
In `@internal/acp/handlers.go`:
- Around line 105-143: The handlers map inside AgentProcess.handleInbound is
allocated on every call; hoist it as a field (e.g.,
AgentProcess.inboundHandlers) initialized once in the AgentProcess constructor
or via sync.Once to avoid per-call allocations. Populate the map with the same
keys/func values (e.g., acpsdk.ClientMethodFsReadTextFile ->
p.handleReadTextFile, ClientMethodTerminalCreate -> p.handleCreateTerminal,
etc.) and update handleInbound to look up handler := p.inboundHandlers[method]
and call it (preserving the same function signature and error wrapping) instead
of building the map each invocation.
In `@internal/session/hooks.go`:
- Around line 65-105: Add compile-time interface verification for the noop types
at the end of internal/session/hooks.go so any signature mismatch is caught at
build time; specifically, add var declarations asserting each interface equals
the corresponding noop type using the recommended pointer-nil form (e.g. _
SessionLifecycleHooks = (*noopSessionLifecycleHooks)(nil)) for the pairs
SessionLifecycleHooks/noopSessionLifecycleHooks, PromptHooks/noopPromptHooks,
EventHooks/noopEventHooks, AgentHooks/noopAgentHooks,
ConversationHooks/noopConversationHooks, and
CompactionHooks/noopCompactionHooks.
🪄 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: 56b42296-8c25-4f09-b976-091a67676bbf
⛔ Files ignored due to path filters (28)
.agents/skills/kodebase/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/kodebase/references/cli-generate.mdis excluded by!**/*.md,!.agents/**.agents/skills/kodebase/references/cli-inspect.mdis excluded by!**/*.md,!.agents/**.agents/skills/kodebase/references/cli-search-index.mdis excluded by!**/*.md,!.agents/**.agents/skills/kodebase/references/error-handling.mdis excluded by!**/*.md,!.agents/**.agents/skills/kodebase/references/output-formats.mdis excluded by!**/*.md,!.agents/**.codex/plans/2026-04-10-kb-refac-full-sweep.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/_techspec.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/adrs/adr-001.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/adrs/adr-002.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/adrs/adr-003.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/adrs/adr-004.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/adrs/adr-005.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/analysis_claude_code.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/analysis_goclaw.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/analysis_hermes.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/analysis_libraries.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/analysis_openclaw.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/analysis_openfang.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/analysis_pi_mono.mdis excluded by!**/*.md.compozy/tasks/kb-refac/_techspec.mdis excluded by!**/*.md.compozy/tasks/kb-refac/adrs/adr-001.mdis excluded by!**/*.md.compozy/tasks/kb-refac/adrs/adr-002.mdis excluded by!**/*.md.compozy/tasks/kb-refac/adrs/adr-003.mdis excluded by!**/*.md.compozy/tasks/kb-refac/adrs/adr-004.mdis excluded by!**/*.mdbun.lockis excluded by!**/*.lockskills-lock.jsonis excluded by!**/*.jsonweb/package.jsonis excluded by!**/*.json
📒 Files selected for processing (67)
internal/acp/client.gointernal/acp/handlers.gointernal/api/core/conversions.gointernal/api/core/handlers.gointernal/api/core/session_stream.gointernal/api/httpapi/handlers.gointernal/api/httpapi/middleware.gointernal/api/httpapi/routes.gointernal/api/httpapi/server.gointernal/api/udsapi/server.gointernal/api/udsapi/server_test.gointernal/cli/client.gointernal/cli/install_test.gointernal/cli/skill.gointernal/cli/skill_commands.gointernal/cli/skill_marketplace.gointernal/cli/skill_output.gointernal/cli/skill_workspace.gointernal/config/config.gointernal/config/config_test.gointernal/config/provider.gointernal/daemon/boot.gointernal/daemon/daemon.gointernal/daemon/daemon_integration_test.gointernal/daemon/daemon_test.gointernal/daemon/hooks_bridge.gointernal/hooks/dispatch.gointernal/hooks/dispatch_async.gointernal/hooks/matcher.gointernal/memory/consolidation/runtime.gointernal/memory/dream.gointernal/memory/dream_test.gointernal/memory/staleness.gointernal/memory/store_test.gointernal/session/hooks.gointernal/session/interfaces.gointernal/session/manager.gointernal/session/manager_hooks.gointernal/session/manager_hooks_test.gointernal/session/manager_integration_test.gointernal/session/manager_lifecycle.gointernal/session/manager_start.gointernal/skills/registry.gointernal/skills/registry_snapshot.gointernal/skills/registry_workspace_cache.gointernal/sse/decode.gointernal/transcript/transcript.gointernal/transcript/transcript_test.gointernal/workref/ref.gointernal/workspace/options.gointernal/workspace/resolver_test.goweb/src/components/ui/alert-dialog.tsxweb/src/components/ui/aspect-ratio.tsxweb/src/components/ui/calendar.tsxweb/src/components/ui/carousel.tsxweb/src/components/ui/chart.tsxweb/src/components/ui/checkbox.tsxweb/src/components/ui/context-menu.tsxweb/src/components/ui/drawer.tsxweb/src/components/ui/hover-card.tsxweb/src/components/ui/input-otp.tsxweb/src/components/ui/menubar.tsxweb/src/components/ui/navigation-menu.tsxweb/src/components/ui/pagination.tsxweb/src/components/ui/radio-group.tsxweb/src/components/ui/resizable.tsxweb/src/components/ui/slider.tsx
💤 Files with no reviewable changes (22)
- internal/api/udsapi/server.go
- web/src/components/ui/input-otp.tsx
- web/src/components/ui/checkbox.tsx
- web/src/components/ui/aspect-ratio.tsx
- web/src/components/ui/slider.tsx
- internal/hooks/dispatch.go
- web/src/components/ui/radio-group.tsx
- internal/api/httpapi/server.go
- web/src/components/ui/resizable.tsx
- web/src/components/ui/navigation-menu.tsx
- web/src/components/ui/chart.tsx
- web/src/components/ui/context-menu.tsx
- web/src/components/ui/menubar.tsx
- web/src/components/ui/pagination.tsx
- web/src/components/ui/alert-dialog.tsx
- web/src/components/ui/hover-card.tsx
- web/src/components/ui/carousel.tsx
- internal/skills/registry.go
- web/src/components/ui/drawer.tsx
- internal/session/interfaces.go
- web/src/components/ui/calendar.tsx
- internal/cli/skill.go
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
internal/skills/registry_workspace_cache.go (1)
100-112: Silent error suppression in cache key path derivation.When
workspaceSkillLoadPathreturns an error at line 104, the function returns(nil, false)silently discarding the error. This could mask configuration issues or unexpected skill source values during cache key computation.Consider logging the error or propagating it to help diagnose cache miss issues in production.
♻️ Proposed improvement
-func workspaceCacheKeyPaths(resolved workspacepkg.ResolvedWorkspace) ([]workspaceSkillPath, bool) { +func workspaceCacheKeyPaths(resolved workspacepkg.ResolvedWorkspace) ([]workspaceSkillPath, bool, error) { paths := make([]workspaceSkillPath, 0, len(resolved.Skills)) for _, skillPath := range resolved.Skills { path, include, err := workspaceSkillLoadPath(skillPath) if err != nil { - return nil, false + return nil, false, err } if include { paths = append(paths, path) } } - return paths, true + return paths, true, nil }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/skills/registry_workspace_cache.go` around lines 100 - 112, workspaceCacheKeyPaths currently swallows errors from workspaceSkillLoadPath and returns (nil, false), which hides configuration/runtime problems; change workspaceCacheKeyPaths to propagate the underlying error instead of silently returning false (e.g., add an error return and return the error when workspaceSkillLoadPath fails), update all callers to handle the error, or alternatively log the error via the project's logger before returning; reference the workspaceCacheKeyPaths and workspaceSkillLoadPath symbols and ensure callers that rely on the boolean return are updated to handle the propagated error.internal/cli/skill_workspace.go (1)
552-562: Shallow clone creates inconsistency with existing deep-clone pattern in the codebase.
cloneMetadataperforms a shallow copy, while the similarcloneMetadataMapfunction ininternal/skills/registry_snapshot.goimplements full deep cloning for nested maps and slices. Since metadata can contain nested structures (e.g.,map[string]any{"agh": map[string]any{"category": "quality"}}), consider adopting the deeper cloning pattern here for consistency and to prevent future mutations of nested structures from affecting both copies.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/skill_workspace.go` around lines 552 - 562, cloneMetadata currently performs a shallow copy which can leak nested maps/slices; update cloneMetadata to perform a deep clone following the same approach used by cloneMetadataMap in internal/skills/registry_snapshot.go: recursively copy nested map[string]any and []any values (and preserve primitive values as-is), handle nils, and ensure returned map contains fully independent nested structures so mutations to the clone or original do not affect the other; reference the cloneMetadata and cloneMetadataMap implementations to mirror recursion and type switches for maps and slices.
🤖 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/hooks/telemetry_test.go`:
- Around line 174-234: The test can hang if assertions call t.Fatalf while the
executor is still blocked on the channel `blocked`; to fix, ensure `blocked` is
always closed on test exit by adding `defer close(blocked)` immediately after
`blocked := make(chan struct{})` in
TestHookTelemetryRecordsDroppedAsyncSubmission so the native executor unblocks
even when assertions fail (this prevents hooks.Close from waiting indefinitely).
---
Nitpick comments:
In `@internal/cli/skill_workspace.go`:
- Around line 552-562: cloneMetadata currently performs a shallow copy which can
leak nested maps/slices; update cloneMetadata to perform a deep clone following
the same approach used by cloneMetadataMap in
internal/skills/registry_snapshot.go: recursively copy nested map[string]any and
[]any values (and preserve primitive values as-is), handle nils, and ensure
returned map contains fully independent nested structures so mutations to the
clone or original do not affect the other; reference the cloneMetadata and
cloneMetadataMap implementations to mirror recursion and type switches for maps
and slices.
In `@internal/skills/registry_workspace_cache.go`:
- Around line 100-112: workspaceCacheKeyPaths currently swallows errors from
workspaceSkillLoadPath and returns (nil, false), which hides
configuration/runtime problems; change workspaceCacheKeyPaths to propagate the
underlying error instead of silently returning false (e.g., add an error return
and return the error when workspaceSkillLoadPath fails), update all callers to
handle the error, or alternatively log the error via the project's logger before
returning; reference the workspaceCacheKeyPaths and workspaceSkillLoadPath
symbols and ensure callers that rely on the boolean return are updated to handle
the propagated error.
🪄 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: a88b2675-b3d6-4922-859f-9f952c7477ec
⛔ Files ignored due to path filters (25)
.compozy/tasks/ext-architecture/_examples.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/_techspec.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/adrs/adr-001.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/adrs/adr-002.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/adrs/adr-003.mdis excluded by!**/*.md.compozy/tasks/ext-architecture/adrs/adr-005.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/_meta.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_001.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_002.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_003.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_004.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_005.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_006.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_007.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_008.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_009.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_010.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_011.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_012.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_013.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_014.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_015.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_016.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_017.mdis excluded by!**/*.md.compozy/tasks/kb-refac/reviews-001/issue_018.mdis excluded by!**/*.md
📒 Files selected for processing (18)
internal/api/core/session_stream.gointernal/api/httpapi/handlers_error_test.gointernal/api/httpapi/handlers_test.gointernal/api/httpapi/middleware.gointernal/api/httpapi/routes.gointernal/cli/skill_commands.gointernal/cli/skill_marketplace.gointernal/cli/skill_test.gointernal/cli/skill_workspace.gointernal/hooks/dispatch_async.gointernal/hooks/hooks_test.gointernal/hooks/telemetry_test.gointernal/memory/store_test.gointernal/session/hooks.gointernal/skills/registry_test.gointernal/skills/registry_workspace_cache.gointernal/sse/decode.gointernal/sse/decode_test.go
✅ Files skipped from review due to trivial changes (2)
- internal/api/core/session_stream.go
- internal/session/hooks.go
🚧 Files skipped from review as they are similar to previous changes (2)
- internal/api/httpapi/routes.go
- internal/cli/skill_marketplace.go
| func TestHookTelemetryRecordsDroppedAsyncSubmission(t *testing.T) { | ||
| t.Parallel() | ||
|
|
||
| writer := &captureHookRunWriter{} | ||
| blocked := make(chan struct{}) | ||
| hooks := NewHooks( | ||
| WithLogger(discardPoolLogger()), | ||
| WithAsyncWorkerCount(1), | ||
| WithAsyncQueueCapacity(1), | ||
| WithNativeDeclarations([]HookDecl{{ | ||
| Name: "async-event", | ||
| Event: HookEventPreRecord, | ||
| Mode: HookModeAsync, | ||
| ExecutorKind: HookExecutorNative, | ||
| }}), | ||
| WithExecutorResolver(func(decl HookDecl) (Executor, error) { | ||
| if decl.Name != "async-event" { | ||
| return nil, errors.New("missing executor") | ||
| } | ||
| return NewTypedNativeExecutor(func(context.Context, RegisteredHook, EventPreRecordPayload) (EventPreRecordPatch, error) { | ||
| <-blocked | ||
| return EventPreRecordPatch{}, nil | ||
| }), nil | ||
| }), | ||
| ) | ||
| t.Cleanup(hooks.Close) | ||
| if err := hooks.Rebuild(t.Context()); err != nil { | ||
| t.Fatalf("Rebuild() error = %v", err) | ||
| } | ||
|
|
||
| ctx := WithHookRunWriter(t.Context(), writer) | ||
| payload := EventPreRecordPayload{PayloadBase: PayloadBase{Event: HookEventPreRecord}, RecordType: "agent_message"} | ||
| for i := 0; i < 3; i++ { | ||
| if _, err := hooks.DispatchEventPreRecord(ctx, payload); err != nil { | ||
| t.Fatalf("DispatchEventPreRecord() #%d error = %v", i+1, err) | ||
| } | ||
| } | ||
|
|
||
| deadline := time.After(time.Second) | ||
| for { | ||
| records := writer.recordsSnapshot() | ||
| if len(records) > 0 { | ||
| record := records[0] | ||
| if record.Outcome != HookRunOutcomeDropped { | ||
| t.Fatalf("record.Outcome = %q, want %q", record.Outcome, HookRunOutcomeDropped) | ||
| } | ||
| if record.Error != errAsyncHookDropped.Error() { | ||
| t.Fatalf("record.Error = %q, want %q", record.Error, errAsyncHookDropped.Error()) | ||
| } | ||
| close(blocked) | ||
| return | ||
| } | ||
|
|
||
| select { | ||
| case <-deadline: | ||
| close(blocked) | ||
| t.Fatal("expected dropped async hook telemetry record") | ||
| case <-time.After(10 * time.Millisecond): | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Test may hang on assertion failure due to unclosed blocking channel.
If assertions at lines 218 or 221 fail, t.Fatalf exits without closing blocked, leaving the async executor blocked indefinitely. The t.Cleanup(hooks.Close) will then wait for pool drain, potentially causing test hangs.
Consider setting an explicit drain timeout to prevent this:
🛡️ Proposed fix to prevent test hangs
hooks := NewHooks(
WithLogger(discardPoolLogger()),
WithAsyncWorkerCount(1),
WithAsyncQueueCapacity(1),
+ WithAsyncDrainTimeout(2*time.Second),
WithNativeDeclarations([]HookDecl{{Alternatively, add a deferred cleanup that ensures blocked is closed:
blocked := make(chan struct{})
+ t.Cleanup(func() {
+ select {
+ case <-blocked:
+ default:
+ close(blocked)
+ }
+ })
hooks := NewHooks(📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| func TestHookTelemetryRecordsDroppedAsyncSubmission(t *testing.T) { | |
| t.Parallel() | |
| writer := &captureHookRunWriter{} | |
| blocked := make(chan struct{}) | |
| hooks := NewHooks( | |
| WithLogger(discardPoolLogger()), | |
| WithAsyncWorkerCount(1), | |
| WithAsyncQueueCapacity(1), | |
| WithNativeDeclarations([]HookDecl{{ | |
| Name: "async-event", | |
| Event: HookEventPreRecord, | |
| Mode: HookModeAsync, | |
| ExecutorKind: HookExecutorNative, | |
| }}), | |
| WithExecutorResolver(func(decl HookDecl) (Executor, error) { | |
| if decl.Name != "async-event" { | |
| return nil, errors.New("missing executor") | |
| } | |
| return NewTypedNativeExecutor(func(context.Context, RegisteredHook, EventPreRecordPayload) (EventPreRecordPatch, error) { | |
| <-blocked | |
| return EventPreRecordPatch{}, nil | |
| }), nil | |
| }), | |
| ) | |
| t.Cleanup(hooks.Close) | |
| if err := hooks.Rebuild(t.Context()); err != nil { | |
| t.Fatalf("Rebuild() error = %v", err) | |
| } | |
| ctx := WithHookRunWriter(t.Context(), writer) | |
| payload := EventPreRecordPayload{PayloadBase: PayloadBase{Event: HookEventPreRecord}, RecordType: "agent_message"} | |
| for i := 0; i < 3; i++ { | |
| if _, err := hooks.DispatchEventPreRecord(ctx, payload); err != nil { | |
| t.Fatalf("DispatchEventPreRecord() #%d error = %v", i+1, err) | |
| } | |
| } | |
| deadline := time.After(time.Second) | |
| for { | |
| records := writer.recordsSnapshot() | |
| if len(records) > 0 { | |
| record := records[0] | |
| if record.Outcome != HookRunOutcomeDropped { | |
| t.Fatalf("record.Outcome = %q, want %q", record.Outcome, HookRunOutcomeDropped) | |
| } | |
| if record.Error != errAsyncHookDropped.Error() { | |
| t.Fatalf("record.Error = %q, want %q", record.Error, errAsyncHookDropped.Error()) | |
| } | |
| close(blocked) | |
| return | |
| } | |
| select { | |
| case <-deadline: | |
| close(blocked) | |
| t.Fatal("expected dropped async hook telemetry record") | |
| case <-time.After(10 * time.Millisecond): | |
| } | |
| } | |
| } | |
| func TestHookTelemetryRecordsDroppedAsyncSubmission(t *testing.T) { | |
| t.Parallel() | |
| writer := &captureHookRunWriter{} | |
| blocked := make(chan struct{}) | |
| t.Cleanup(func() { | |
| select { | |
| case <-blocked: | |
| default: | |
| close(blocked) | |
| } | |
| }) | |
| hooks := NewHooks( | |
| WithLogger(discardPoolLogger()), | |
| WithAsyncWorkerCount(1), | |
| WithAsyncQueueCapacity(1), | |
| WithNativeDeclarations([]HookDecl{{ | |
| Name: "async-event", | |
| Event: HookEventPreRecord, | |
| Mode: HookModeAsync, | |
| ExecutorKind: HookExecutorNative, | |
| }}), | |
| WithExecutorResolver(func(decl HookDecl) (Executor, error) { | |
| if decl.Name != "async-event" { | |
| return nil, errors.New("missing executor") | |
| } | |
| return NewTypedNativeExecutor(func(context.Context, RegisteredHook, EventPreRecordPayload) (EventPreRecordPatch, error) { | |
| <-blocked | |
| return EventPreRecordPatch{}, nil | |
| }), nil | |
| }), | |
| ) | |
| t.Cleanup(hooks.Close) | |
| if err := hooks.Rebuild(t.Context()); err != nil { | |
| t.Fatalf("Rebuild() error = %v", err) | |
| } | |
| ctx := WithHookRunWriter(t.Context(), writer) | |
| payload := EventPreRecordPayload{PayloadBase: PayloadBase{Event: HookEventPreRecord}, RecordType: "agent_message"} | |
| for i := 0; i < 3; i++ { | |
| if _, err := hooks.DispatchEventPreRecord(ctx, payload); err != nil { | |
| t.Fatalf("DispatchEventPreRecord() #%d error = %v", i+1, err) | |
| } | |
| } | |
| deadline := time.After(time.Second) | |
| for { | |
| records := writer.recordsSnapshot() | |
| if len(records) > 0 { | |
| record := records[0] | |
| if record.Outcome != HookRunOutcomeDropped { | |
| t.Fatalf("record.Outcome = %q, want %q", record.Outcome, HookRunOutcomeDropped) | |
| } | |
| if record.Error != errAsyncHookDropped.Error() { | |
| t.Fatalf("record.Error = %q, want %q", record.Error, errAsyncHookDropped.Error()) | |
| } | |
| close(blocked) | |
| return | |
| } | |
| select { | |
| case <-deadline: | |
| close(blocked) | |
| t.Fatal("expected dropped async hook telemetry record") | |
| case <-time.After(10 * time.Millisecond): | |
| } | |
| } | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@internal/hooks/telemetry_test.go` around lines 174 - 234, The test can hang
if assertions call t.Fatalf while the executor is still blocked on the channel
`blocked`; to fix, ensure `blocked` is always closed on test exit by adding
`defer close(blocked)` immediately after `blocked := make(chan struct{})` in
TestHookTelemetryRecordsDroppedAsyncSubmission so the native executor unblocks
even when assertions fail (this prevents hooks.Close from waiting indefinitely).
## 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
Refactoring
Removals
Tests