fix: acp integration#4
Conversation
WalkthroughThis pull request introduces a comprehensive session transcript feature across the backend and frontend, adding session history retrieval endpoints and replacing history-based hydration with transcript-based initialization. It also modifies session resume validation to independently check ResumeSessionID and error if the agent lacks LoadSession support. Changes
Sequence Diagram(s)sequenceDiagram
participant User as User/Client
participant Frontend as Frontend Component
participant Query as React Query
participant API as HTTP API
participant Manager as Session Manager
participant DB as Event Recorder
User->>Frontend: Navigate to session/:id
Frontend->>Frontend: Reset session state<br/>(clear messages, stop streaming)
Frontend->>Query: Request sessionTranscriptOptions(id)
Query->>API: GET /api/sessions/:id/transcript
API->>Manager: Transcript(ctx, id)
Manager->>DB: Query events by session ID
DB-->>Manager: Return ordered events
Manager->>Manager: Assembly: buffer by turn,<br/>correlate tool calls/results
Manager-->>API: []TranscriptMessage
API-->>Query: {messages: [...]}
Query-->>Frontend: transcriptMessages
alt Messages match active session ID
Frontend->>Frontend: setActiveSession(id, messages)
Frontend->>Frontend: Hydrate chat with messages
end
Frontend-->>User: Render chat with transcript
sequenceDiagram
participant Driver as ACP Driver
participant Client as ACP Client
participant Agent as Agent Process
Client->>Client: Validate normalized.ResumeSessionID
Client->>Agent: Check Caps.SupportsLoadSession
alt SupportsLoadSession is true
Client->>Agent: Session/load
alt Load succeeds
Agent-->>Client: loadResponse with SessionID/Caps
Client->>Client: Update process state
Client-->>Driver: Return process
else Load fails
Agent-->>Client: loadErr
Client->>Agent: Stop process
Client-->>Driver: Return wrapped error
end
else SupportsLoadSession is false
Client->>Agent: Stop process
Client-->>Driver: Return "does not support session/load"
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 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/acp/client_test.go`:
- Around line 334-352: Collapse the two near-duplicate tests
(TestStartResumeReturnsErrorWhenLoadFails and the adjacent resume-failure test)
into a single table-driven test that iterates cases (scenario name, Env value,
expected sentinel error) and uses t.Run per case; in addition, introduce
exported sentinel errors in the driver package (e.g.
ErrAgentDoesNotSupportSession and ErrLoadSessionFailed or similar names) that
Start(...) returns for the two resume failure paths, and update the Start caller
in the tests to assert the error using errors.Is(err, sentinelErr) instead of
string matching via strings.Contains; locate the Start function implementation
to return the new sentinel errors on the corresponding branches and update the
test cases to reference those sentinel symbols.
In `@internal/acp/client.go`:
- Around line 206-209: The resume-paths currently ignore errors from d.Stop(...)
causing subprocesses to potentially remain alive; update both places where you
call d.Stop(context.Background(), process) (the branch gated by
normalized.ResumeSessionID && !process.Caps.SupportsLoadSession and the similar
branch around lines 218-220) to capture the error return, and if Stop fails,
return a wrapped/combined error that includes the original resume/load error and
the Stop error (e.g., using fmt.Errorf("...; stop failed: %w", stopErr)) so
callers see both failures instead of swallowing the Stop error.
In `@internal/httpapi/handlers_test.go`:
- Around line 302-332: Add t.Parallel() to the start of the
TestSessionTranscriptHandlerReturnsMessages test to run it concurrently;
specifically, insert a call to t.Parallel() as the first statement in the
TestSessionTranscriptHandlerReturnsMessages function (before creating homePaths,
manager, handlers, and engine) so the test aligns with the test concurrency
standard for independent tests.
In `@internal/session/transcript_test.go`:
- Around line 17-19: The cleanup currently ignores errors from
h.manager.Stop(testContext(t), session.ID) using `_ =`; change this to capture
the error and log it instead of discarding it (e.g., `if err :=
h.manager.Stop(testContext(t), session.ID); err != nil { t.Logf("h.manager.Stop
failed for session %s: %v", session.ID, err) }`) in both cleanup blocks
referenced (including the other occurrence around lines 147-149) so failures
during Stop are recorded; use testContext(t), session.ID and h.manager.Stop
identifiers to locate and update the code.
In `@internal/session/transcript.go`:
- Around line 107-109: The deferred call currently ignores the cleanup error via
`_ = cleanup()`; update the deferred anonymous function to handle the returned
error instead—call cleanup(), capture its error, and either log it with the
package logger (e.g., a processLogger / std logger) or explicitly comment why it
can be ignored; reference the deferred anonymous function and cleanup() so
reviewers can find and replace the `_ = cleanup()` with an error check (e.g., if
err := cleanup(); err != nil { logger.Warn("transcript cleanup failed:", err) })
or add a one-line justification comment if ignoring is intentional.
In `@internal/udsapi/handlers_test.go`:
- Around line 299-329: In TestSessionTranscriptHandlerReturnsMessages add
t.Parallel() at the start of the test to run it concurrently with other tests;
modify the TestSessionTranscriptHandlerReturnsMessages function (the test with
stubSessionManager and newTestRouter/newTestHandlers) to call t.Parallel()
immediately after the function begins so it behaves consistently with other
tests in this file.
🪄 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: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 6436f8b2-e524-48d8-b503-d88abe104373
⛔ Files ignored due to path filters (35)
.codex/plans/2026-03-31-daemon-runtime-dashboard.mdis excluded by!**/*.md.codex/plans/2026-04-01-dashboard-zoom-fix.mdis excluded by!**/*.md.codex/plans/2026-04-01-observability-spine.mdis excluded by!**/*.md.codex/plans/2026-04-02-child-workgroup-activation.mdis excluded by!**/*.md.codex/plans/2026-04-02-dashboard-xterm-visibility.mdis excluded by!**/*.md.codex/plans/2026-04-02-session-bootstrap-live-dashboard.mdis excluded by!**/*.md.codex/plans/2026-04-05-daemon-web-integration.mdis excluded by!**/*.md.codex/plans/2026-04-06-acp-history-replay.mdis excluded by!**/*.md.codex/plans/2026-04-06-default-agent-install.mdis excluded by!**/*.md.codex/plans/2026-04-06-session-stop-hang.mdis excluded by!**/*.md.codex/plans/remove-legacy-alpha.mdis excluded by!**/*.mddocs/cc-ideas/_meta.mdis excluded by!**/*.mddocs/cc-ideas/analysis_memory_autonomous.mdis excluded by!**/*.mddocs/cc-ideas/analysis_multi_agent.mdis excluded by!**/*.mddocs/cc-ideas/analysis_prompt_architecture.mdis excluded by!**/*.mddocs/cc-ideas/analysis_query_engine.mdis excluded by!**/*.mddocs/cc-ideas/analysis_services_infra.mdis excluded by!**/*.mddocs/cc-ideas/analysis_tool_system.mdis excluded by!**/*.mddocs/cc-ideas/filtered_recommendations.mdis excluded by!**/*.mddocs/cc-ideas/our_system_cli.mdis excluded by!**/*.mddocs/cc-ideas/our_system_infra.mdis excluded by!**/*.mddocs/cc-ideas/our_system_kernel.mdis excluded by!**/*.mddocs/network/ideas/agora-council_round1.mdis excluded by!**/*.mddocs/network/ideas/agora-council_round2.mdis excluded by!**/*.mddocs/network/ideas/agora-recipe-design.mdis excluded by!**/*.mddocs/network/ideas/agora-spec-v0.1.mdis excluded by!**/*.mddocs/network/ideas/agora-spec-v0.2.mdis excluded by!**/*.mddocs/network/ideas/draft_1.mdis excluded by!**/*.mddocs/network/ideas/draft_2.mdis excluded by!**/*.mddocs/network/ideas/draft_3.mdis excluded by!**/*.mddocs/network/ideas/draft_4.mdis excluded by!**/*.mddocs/network/ideas/draft_5.mdis excluded by!**/*.mddocs/plans/2026-04-03-web-design-system-foundations-design.mdis excluded by!**/*.mddocs/rfcs/agent-md-with-skills-memory.mdis excluded by!**/*.mddocs/rfcs/skills-system-final.mdis excluded by!**/*.md
📒 Files selected for processing (34)
.codex/ledger/.gitkeep.gitignoreinternal/acp/client.gointernal/acp/client_test.gointernal/daemon/daemon.gointernal/daemon/daemon_test.gointernal/httpapi/handlers_test.gointernal/httpapi/helpers_test.gointernal/httpapi/server.gointernal/httpapi/sessions.gointernal/session/additional_test.gointernal/session/manager.gointernal/session/manager_test.gointernal/session/query_test.gointernal/session/transcript.gointernal/session/transcript_test.gointernal/udsapi/handlers.gointernal/udsapi/handlers_test.gointernal/udsapi/helpers_test.gointernal/udsapi/routes.gointernal/udsapi/server.goweb/src/routes/_app/-session.$id.test.tsxweb/src/routes/_app/session.$id.tsxweb/src/systems/session/adapters/session-api.test.tsweb/src/systems/session/adapters/session-api.tsweb/src/systems/session/hooks/use-session-history.tsweb/src/systems/session/hooks/use-session-transcript.tsweb/src/systems/session/index.tsweb/src/systems/session/lib/query-keys.tsweb/src/systems/session/lib/query-options.tsweb/src/systems/session/lib/transcript-mapper.test.tsweb/src/systems/session/lib/transcript-mapper.tsweb/src/systems/session/types.test.tsweb/src/systems/session/types.ts
| func TestStartResumeReturnsErrorWhenLoadFails(t *testing.T) { | ||
| t.Parallel() | ||
|
|
||
| driver := New() | ||
| _, err := driver.Start(testContext(t), StartOpts{ | ||
| AgentName: "helper", | ||
| Command: helperCommand(t), | ||
| Cwd: t.TempDir(), | ||
| Env: helperEnv("load_session_error", ""), | ||
| Permissions: aghconfig.PermissionModeApproveAll, | ||
| ResumeSessionID: "sess-existing", | ||
| }) | ||
| if err == nil { | ||
| t.Fatal("Start(load_session_error) error = nil, want non-nil") | ||
| } | ||
| if !strings.Contains(err.Error(), "load session") { | ||
| t.Fatalf("Start(load_session_error) error = %v, want load session failure", err) | ||
| } | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# Read the test file to see the actual test code at the mentioned lines
head -400 internal/acp/client_test.go | tail -100Repository: compozy/agh
Length of output: 3272
🏁 Script executed:
# Check the full test to see if there are duplicated tests and what error patterns are used
rg -n "TestStartResume" internal/acp/client_test.go -A 20Repository: compozy/agh
Length of output: 2420
🏁 Script executed:
# Check the Start() function implementation to see what errors it returns
rg -n "func.*Start.*StartOpts" internal/acp/client.go -A 30Repository: compozy/agh
Length of output: 2038
🏁 Script executed:
# Check for any sentinel errors defined in the acp package
rg -n "var.*Err\|errors\.New\|fmt\.Errorf" internal/acp/client.go | head -20Repository: compozy/agh
Length of output: 37
🏁 Script executed:
# Look at the session interfaces mentioned in the comment
cat internal/session/interfaces.go | head -100Repository: compozy/agh
Length of output: 2648
🏁 Script executed:
# Check what errors Start() returns by looking at the process interaction and how errors are returned
rg -n "return nil, fmt\\.Errorf\|return nil, errors" internal/acp/client.go | head -30Repository: compozy/agh
Length of output: 37
🏁 Script executed:
# Look for where session load/resume errors are generated
rg -n "load session\|does not support session/load" internal/acp/client.go -B 5 -A 5Repository: compozy/agh
Length of output: 37
🏁 Script executed:
# Check the helper implementation to understand the error scenarios
grep -n "load_session_error\|stream_updates" internal/acp/client_test.go -B 3 -A 3Repository: compozy/agh
Length of output: 1704
🏁 Script executed:
# Find where LoadSession is called in the client code
rg -n "LoadSession" internal/acp/client.go -B 5 -A 10Repository: compozy/agh
Length of output: 3074
🏁 Script executed:
# Look for error messages in the client that mention "load session" or "does not support"
rg -n "load session\|does not support" internal/acp/ -rRepository: compozy/agh
Length of output: 468
🏁 Script executed:
# Check the full Start() function to see how resume/load session errors are handled
sed -n '110,250p' internal/acp/client.goRepository: compozy/agh
Length of output: 4713
🏁 Script executed:
# Check if there are already any sentinel errors defined in the acp package
rg -n "var \(" internal/acp/client.go | head -20Repository: compozy/agh
Length of output: 37
🏁 Script executed:
# Look for the complete flow: check how acpsdk.SendRequest wraps errors
rg -n "SendRequest\|LoadSessionResponse" internal/acp/ -A 2 | head -40Repository: compozy/agh
Length of output: 37
🏁 Script executed:
# Verify the exact error text that will be in the wrapped error for both scenarios
rg -n "fmt.Errorf.*load session\|fmt.Errorf.*does not support" internal/acp/client.goRepository: compozy/agh
Length of output: 37
🏁 Script executed:
# Check if there are any error constants/sentinel errors defined anywhere in the acp package
find internal/acp -name "*.go" -exec grep -l "var.*Err\|const.*Err" {} \;Repository: compozy/agh
Length of output: 79
🏁 Script executed:
# Let's look at the imports and error handling in client.go to see what error pattern is used
head -30 internal/acp/client.goRepository: compozy/agh
Length of output: 580
🏁 Script executed:
# Check if errors.Is is used anywhere in the test file to understand the testing pattern
rg -n "errors\\.Is\|errors\\.As" internal/acp/client_test.goRepository: compozy/agh
Length of output: 37
🏁 Script executed:
# Check handlers.go to see if sentinel errors are defined there
cat internal/acp/handlers.go | head -50Repository: compozy/agh
Length of output: 1274
🏁 Script executed:
# Get the complete picture of what errors are actually returned from Start() and how they're constructed
rg -n "fmt.Errorf\|errors.New" internal/acp/client.go | grep -E "load|does not support"Repository: compozy/agh
Length of output: 37
🏁 Script executed:
# Let's check the exact error messages that will be in the wrapped errors
grep -n "fmt.Errorf" internal/acp/client.go | grep -E "209|220"Repository: compozy/agh
Length of output: 319
🏁 Script executed:
# Check what error the helper returns for load_session_error scenario
sed -n '597,605p' internal/acp/client_test.goRepository: compozy/agh
Length of output: 414
🏁 Script executed:
# Look at the overall structure to understand if the tests could use errors.Is
rg -n "errors\.New\|sentinel\|var.*=" internal/acp/handlers.go | head -20Repository: compozy/agh
Length of output: 37
🏁 Script executed:
# Verify what package the error handling should follow - check if other Go files define sentinel errors
rg -n "var.*Error.*=" internal/ -A 1 | grep -v test | head -30Repository: compozy/agh
Length of output: 37
🏁 Script executed:
# Check the coding guidelines enforcement - look for any existing sentinel error pattern in the codebase
rg -n "errors\.New\(" internal/acp/ -B 1 -A 1 | head -40Repository: compozy/agh
Length of output: 2591
Refactor these into a single table-driven test and use sentinel errors with errors.Is() for error matching.
Both tests (lines 334-352 and 354-372) have identical structure with only the scenario, environment, and expected error message varying. Collapse into one t.Run table with different test cases. Currently both use strings.Contains(err.Error(), ...), which violates the guideline: "Use errors.Is() and errors.As() for error matching — never compare error strings."
Define sentinel errors in Start() for the two resume failure cases:
- Agent does not support session/load
- Load session fails
Then update tests to check these sentinel errors with errors.Is() rather than parsing error strings. This matches the codebase pattern already established in permission.go (e.g., ErrPermissionDenied, ErrPathOutsideWorkspace).
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@internal/acp/client_test.go` around lines 334 - 352, Collapse the two
near-duplicate tests (TestStartResumeReturnsErrorWhenLoadFails and the adjacent
resume-failure test) into a single table-driven test that iterates cases
(scenario name, Env value, expected sentinel error) and uses t.Run per case; in
addition, introduce exported sentinel errors in the driver package (e.g.
ErrAgentDoesNotSupportSession and ErrLoadSessionFailed or similar names) that
Start(...) returns for the two resume failure paths, and update the Start caller
in the tests to assert the error using errors.Is(err, sentinelErr) instead of
string matching via strings.Contains; locate the Start function implementation
to return the new sentinel errors on the corresponding branches and update the
test cases to reference those sentinel symbols.
| if normalized.ResumeSessionID != "" { | ||
| if !process.Caps.SupportsLoadSession { | ||
| _ = d.Stop(context.Background(), process) | ||
| return nil, fmt.Errorf("acp: agent %q does not support session/load for resume %q", normalized.AgentName, normalized.ResumeSessionID) |
There was a problem hiding this comment.
Handle Stop failures in these resume error paths.
Both branches drop d.Stop(...) with _. If shutdown fails during Start, the caller only sees the resume/load error while the ACP subprocess can remain alive. Return the stop failure as part of the error.
♻️ Suggested change
if normalized.ResumeSessionID != "" {
if !process.Caps.SupportsLoadSession {
- _ = d.Stop(context.Background(), process)
- return nil, fmt.Errorf("acp: agent %q does not support session/load for resume %q", normalized.AgentName, normalized.ResumeSessionID)
+ startErr := fmt.Errorf("acp: agent %q does not support session/load for resume %q", normalized.AgentName, normalized.ResumeSessionID)
+ if stopErr := d.Stop(context.Background(), process); stopErr != nil {
+ return nil, errors.Join(startErr, fmt.Errorf("acp: stop subprocess after resume rejection: %w", stopErr))
+ }
+ return nil, startErr
}
loadRequest := acpsdk.LoadSessionRequest{
Cwd: normalized.Cwd,
McpServers: toSDKMCPServers(normalized.MCPServers),
SessionId: acpsdk.SessionId(normalized.ResumeSessionID),
}
loadResponse, loadErr := acpsdk.SendRequest[acpsdk.LoadSessionResponse](process.conn, ctx, acpsdk.AgentMethodSessionLoad, loadRequest)
if loadErr != nil {
- _ = d.Stop(context.Background(), process)
- return nil, fmt.Errorf("acp: load session %q for %q: %w", normalized.ResumeSessionID, normalized.AgentName, loadErr)
+ startErr := fmt.Errorf("acp: load session %q for %q: %w", normalized.ResumeSessionID, normalized.AgentName, loadErr)
+ if stopErr := d.Stop(context.Background(), process); stopErr != nil {
+ return nil, errors.Join(startErr, fmt.Errorf("acp: stop subprocess after load failure: %w", stopErr))
+ }
+ return nil, startErr
}As per coding guidelines, "Never ignore errors with _ — every error must be handled or have a written justification".
Also applies to: 218-220
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@internal/acp/client.go` around lines 206 - 209, The resume-paths currently
ignore errors from d.Stop(...) causing subprocesses to potentially remain alive;
update both places where you call d.Stop(context.Background(), process) (the
branch gated by normalized.ResumeSessionID && !process.Caps.SupportsLoadSession
and the similar branch around lines 218-220) to capture the error return, and if
Stop fails, return a wrapped/combined error that includes the original
resume/load error and the Stop error (e.g., using fmt.Errorf("...; stop failed:
%w", stopErr)) so callers see both failures instead of swallowing the Stop
error.
| func TestSessionTranscriptHandlerReturnsMessages(t *testing.T) { | ||
| homePaths := newTestHomePaths(t) | ||
| manager := stubSessionManager{ | ||
| transcriptFn: func(context.Context, string) ([]session.TranscriptMessage, error) { | ||
| return []session.TranscriptMessage{{ | ||
| ID: "msg-1", | ||
| Role: session.TranscriptRoleAssistant, | ||
| Content: "hello", | ||
| Timestamp: time.Date(2026, 4, 3, 12, 0, 0, 0, time.UTC), | ||
| }}, nil | ||
| }, | ||
| } | ||
| handlers := newTestHandlers(t, manager, stubObserver{}, homePaths) | ||
| engine := newTestRouter(t, handlers) | ||
|
|
||
| recorder := performRequest(t, engine, http.MethodGet, "/api/sessions/sess-123/transcript", nil) | ||
| if recorder.Code != http.StatusOK { | ||
| t.Fatalf("status = %d, want %d; body=%s", recorder.Code, http.StatusOK, recorder.Body.String()) | ||
| } | ||
|
|
||
| var response struct { | ||
| Messages []session.TranscriptMessage `json:"messages"` | ||
| } | ||
| decodeJSONResponse(t, recorder, &response) | ||
| if len(response.Messages) != 1 { | ||
| t.Fatalf("len(messages) = %d, want 1", len(response.Messages)) | ||
| } | ||
| if got := response.Messages[0].Content; got != "hello" { | ||
| t.Fatalf("messages[0].Content = %q, want %q", got, "hello") | ||
| } | ||
| } |
There was a problem hiding this comment.
Run this new test in parallel.
This test is independent and should call t.Parallel() to align with the test concurrency standard.
✅ Suggested patch
func TestSessionTranscriptHandlerReturnsMessages(t *testing.T) {
+ t.Parallel()
+
homePaths := newTestHomePaths(t)
manager := stubSessionManager{
transcriptFn: func(context.Context, string) ([]session.TranscriptMessage, error) {As per coding guidelines, **/*_test.go: "Use t.Parallel() for independent subtests in Go tests".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@internal/httpapi/handlers_test.go` around lines 302 - 332, Add t.Parallel()
to the start of the TestSessionTranscriptHandlerReturnsMessages test to run it
concurrently; specifically, insert a call to t.Parallel() as the first statement
in the TestSessionTranscriptHandlerReturnsMessages function (before creating
homePaths, manager, handlers, and engine) so the test aligns with the test
concurrency standard for independent tests.
| t.Cleanup(func() { | ||
| _ = h.manager.Stop(testContext(t), session.ID) | ||
| }) |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Consider logging cleanup errors instead of silently ignoring.
The cleanup functions ignore errors from h.manager.Stop() with _ =. While cleanup errors are often secondary to test failures, the coding guidelines state errors should not be ignored without justification.
🔧 Optional: Log cleanup errors
t.Cleanup(func() {
- _ = h.manager.Stop(testContext(t), session.ID)
+ if err := h.manager.Stop(testContext(t), session.ID); err != nil {
+ t.Logf("cleanup: stop session failed: %v", err)
+ }
})As per coding guidelines: "Never ignore errors with _ — every error must be handled or have a written justification"
Also applies to: 147-149
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@internal/session/transcript_test.go` around lines 17 - 19, The cleanup
currently ignores errors from h.manager.Stop(testContext(t), session.ID) using
`_ =`; change this to capture the error and log it instead of discarding it
(e.g., `if err := h.manager.Stop(testContext(t), session.ID); err != nil {
t.Logf("h.manager.Stop failed for session %s: %v", session.ID, err) }`) in both
cleanup blocks referenced (including the other occurrence around lines 147-149)
so failures during Stop are recorded; use testContext(t), session.ID and
h.manager.Stop identifiers to locate and update the code.
| defer func() { | ||
| _ = cleanup() | ||
| }() |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Consider handling cleanup errors.
The deferred cleanup ignores its error with _ = cleanup(). While this is a common pattern in cleanup code, the coding guidelines require explicit handling or justification.
🔧 Optional: Log cleanup errors
defer func() {
- _ = cleanup()
+ if err := cleanup(); err != nil {
+ m.logger.Warn("session: transcript recorder cleanup failed", "session_id", id, "error", err)
+ }
}()As per coding guidelines: "Never ignore errors with _ — every error must be handled or have a written justification"
📝 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.
| defer func() { | |
| _ = cleanup() | |
| }() | |
| defer func() { | |
| if err := cleanup(); err != nil { | |
| m.logger.Warn("session: transcript recorder cleanup failed", "session_id", id, "error", err) | |
| } | |
| }() |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@internal/session/transcript.go` around lines 107 - 109, The deferred call
currently ignores the cleanup error via `_ = cleanup()`; update the deferred
anonymous function to handle the returned error instead—call cleanup(), capture
its error, and either log it with the package logger (e.g., a processLogger /
std logger) or explicitly comment why it can be ignored; reference the deferred
anonymous function and cleanup() so reviewers can find and replace the `_ =
cleanup()` with an error check (e.g., if err := cleanup(); err != nil {
logger.Warn("transcript cleanup failed:", err) }) or add a one-line
justification comment if ignoring is intentional.
| func TestSessionTranscriptHandlerReturnsMessages(t *testing.T) { | ||
| homePaths := newTestHomePaths(t) | ||
| manager := stubSessionManager{ | ||
| transcriptFn: func(context.Context, string) ([]session.TranscriptMessage, error) { | ||
| return []session.TranscriptMessage{{ | ||
| ID: "msg-1", | ||
| Role: session.TranscriptRoleAssistant, | ||
| Content: "hello", | ||
| Timestamp: time.Date(2026, 4, 3, 12, 0, 0, 0, time.UTC), | ||
| }}, nil | ||
| }, | ||
| } | ||
| handlers := newTestHandlers(t, manager, stubObserver{}, homePaths) | ||
| engine := newTestRouter(t, handlers) | ||
|
|
||
| recorder := performRequest(t, engine, http.MethodGet, "/api/sessions/sess-123/transcript", nil) | ||
| if recorder.Code != http.StatusOK { | ||
| t.Fatalf("status = %d, want %d; body=%s", recorder.Code, http.StatusOK, recorder.Body.String()) | ||
| } | ||
|
|
||
| var response struct { | ||
| Messages []session.TranscriptMessage `json:"messages"` | ||
| } | ||
| decodeJSONResponse(t, recorder, &response) | ||
| if len(response.Messages) != 1 { | ||
| t.Fatalf("len(messages) = %d, want 1", len(response.Messages)) | ||
| } | ||
| if got := response.Messages[0].Content; got != "hello" { | ||
| t.Fatalf("messages[0].Content = %q, want %q", got, "hello") | ||
| } | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Consider adding t.Parallel() for consistency.
The test correctly validates the transcript handler behavior. However, other test functions in this file use t.Parallel() for independent tests. Consider adding it here for consistency and faster test execution.
💡 Suggested addition
func TestSessionTranscriptHandlerReturnsMessages(t *testing.T) {
+ t.Parallel()
homePaths := newTestHomePaths(t)📝 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 TestSessionTranscriptHandlerReturnsMessages(t *testing.T) { | |
| homePaths := newTestHomePaths(t) | |
| manager := stubSessionManager{ | |
| transcriptFn: func(context.Context, string) ([]session.TranscriptMessage, error) { | |
| return []session.TranscriptMessage{{ | |
| ID: "msg-1", | |
| Role: session.TranscriptRoleAssistant, | |
| Content: "hello", | |
| Timestamp: time.Date(2026, 4, 3, 12, 0, 0, 0, time.UTC), | |
| }}, nil | |
| }, | |
| } | |
| handlers := newTestHandlers(t, manager, stubObserver{}, homePaths) | |
| engine := newTestRouter(t, handlers) | |
| recorder := performRequest(t, engine, http.MethodGet, "/api/sessions/sess-123/transcript", nil) | |
| if recorder.Code != http.StatusOK { | |
| t.Fatalf("status = %d, want %d; body=%s", recorder.Code, http.StatusOK, recorder.Body.String()) | |
| } | |
| var response struct { | |
| Messages []session.TranscriptMessage `json:"messages"` | |
| } | |
| decodeJSONResponse(t, recorder, &response) | |
| if len(response.Messages) != 1 { | |
| t.Fatalf("len(messages) = %d, want 1", len(response.Messages)) | |
| } | |
| if got := response.Messages[0].Content; got != "hello" { | |
| t.Fatalf("messages[0].Content = %q, want %q", got, "hello") | |
| } | |
| } | |
| func TestSessionTranscriptHandlerReturnsMessages(t *testing.T) { | |
| t.Parallel() | |
| homePaths := newTestHomePaths(t) | |
| manager := stubSessionManager{ | |
| transcriptFn: func(context.Context, string) ([]session.TranscriptMessage, error) { | |
| return []session.TranscriptMessage{{ | |
| ID: "msg-1", | |
| Role: session.TranscriptRoleAssistant, | |
| Content: "hello", | |
| Timestamp: time.Date(2026, 4, 3, 12, 0, 0, 0, time.UTC), | |
| }}, nil | |
| }, | |
| } | |
| handlers := newTestHandlers(t, manager, stubObserver{}, homePaths) | |
| engine := newTestRouter(t, handlers) | |
| recorder := performRequest(t, engine, http.MethodGet, "/api/sessions/sess-123/transcript", nil) | |
| if recorder.Code != http.StatusOK { | |
| t.Fatalf("status = %d, want %d; body=%s", recorder.Code, http.StatusOK, recorder.Body.String()) | |
| } | |
| var response struct { | |
| Messages []session.TranscriptMessage `json:"messages"` | |
| } | |
| decodeJSONResponse(t, recorder, &response) | |
| if len(response.Messages) != 1 { | |
| t.Fatalf("len(messages) = %d, want 1", len(response.Messages)) | |
| } | |
| if got := response.Messages[0].Content; got != "hello" { | |
| t.Fatalf("messages[0].Content = %q, want %q", got, "hello") | |
| } | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@internal/udsapi/handlers_test.go` around lines 299 - 329, In
TestSessionTranscriptHandlerReturnsMessages add t.Parallel() at the start of the
test to run it concurrently with other tests; modify the
TestSessionTranscriptHandlerReturnsMessages function (the test with
stubSessionManager and newTestRouter/newTestHandlers) to call t.Parallel()
immediately after the function begins so it behaves consistently with other
tests in this file.
## 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