feat: onboarding and improvements#201
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (11)
Disabled knowledge base sources:
WalkthroughAdds a Clear Conversation flow (new stop cause, ledger discard, clearing on reopen), introduces a read-only per-session SQLite store with retry, refactors recorder open and query retry for Events/History/Transcript, exports SQLite helpers, and consolidates E2E onboarding helpers and transcript-aware clear controls. ChangesClear Conversation & Query Infrastructure
Web E2E Test Consolidation & UI Updates
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 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: 7
🧹 Nitpick comments (3)
internal/session/manager_start.go (1)
453-455: ⚡ Quick winPreserve context values when detaching recorder cleanup.
context.Background()severs request-scoped values here.context.WithoutCancel(ctx)plus the existing timeout keeps context propagation intact while still preventing caller cancellation from abortingClose.♻️ Proposed fix
- closeCtx, cancel := context.WithTimeout(context.Background(), defaultLifecycleTimeout) + closeCtx, cancel := context.WithTimeout(context.WithoutCancel(ctx), defaultLifecycleTimeout)As per coding guidelines "Always pass context.Context as the first parameter in functions and methods; maintain context propagation through the call stack" and "
context.WithoutCanceldoes NOT preserve deadlines. Re-attach a deadline if needed."🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/session/manager_start.go` around lines 453 - 455, Replace context.Background() when creating closeCtx so request-scoped values are preserved: derive baseCtx := context.WithoutCancel(ctx) then if ctx has a deadline reattach it (use ctx.Deadline() to compute an appropriate deadline or remaining timeout) before applying the defaultLifecycleTimeout; e.g. create closeCtx via context.WithTimeout(baseCtxWithDeadline, defaultLifecycleTimeout) and use that for recorder.Close(closeCtx) in the return that constructs sessionStartStorage{}, keeping the cancel defer as-is.internal/session/query_test.go (1)
443-499: ⚡ Quick winAdd
t.Parallel()to the new subtest (or document why it must remain serial).The
t.Run("Should ...")block at Line 443 currently runs serially without a stated reason.As per coding guidelines: "
**/*_test.go: Structure tests witht.Run(\"Should ...\")subtests and mark them witht.Parallel()by default unless there is a specific reason to disable parallelization."🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/session/query_test.go` around lines 443 - 499, This subtest ("Should retry when finalization closes the active recorder during a query") is not marked parallel; add t.Parallel() as the first statement inside the t.Run closure to follow the test-suite guideline (or, if parallelization would break shared state such as newHarness(), createSession(), session.recorderHandle(), or the queryRecorderStub usage, add a short comment above the t.Run explaining the specific reason it must remain serial). Ensure the parallelization change is applied inside the subtest body so setup/cleanup (including h.manager.Stop and session.setRecorder) remain valid when run concurrently.internal/session/transcript.go (1)
26-26: ⚡ Quick winPropagate
ctxinto the cleanup logger helper.This helper drops request context from the call chain, so the warning cannot use
WarnContextor inherit request-scoped values.Suggested fix
- m.logTranscriptCleanupError(target, cleanup()) + m.logTranscriptCleanupError(ctx, target, cleanup()) … -func (m *Manager) logTranscriptCleanupError(sessionID string, err error) { +func (m *Manager) logTranscriptCleanupError(ctx context.Context, sessionID string, err error) { if err == nil { return } logger := m.logger if logger == nil { logger = slog.Default() } - logger.Warn("session: transcript cleanup failed", "session_id", sessionID, "error", err) + logger.WarnContext(ctx, "session: transcript cleanup failed", "session_id", sessionID, "error", err) }As per coding guidelines, "Always pass context.Context as the first parameter in functions and methods; maintain context propagation through the call stack."
Also applies to: 45-53
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/session/transcript.go` at line 26, The helper m.logTranscriptCleanupError drops request context — change its signature to accept ctx context.Context as the first parameter and update all call sites (e.g., where m.logTranscriptCleanupError(target, cleanup()) is invoked and the other occurrences at lines ~45-53) to pass the current ctx; inside the helper use the context-aware logger method (e.g., WarnContext/WithContext) to emit the warning so request-scoped values are preserved, and ensure any helper callers pass ctx through as the first arg.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/api/core/handlers.go`:
- Around line 639-646: The current unconditional h.Logger.Warn call for
SessionEvents query failures logs expected client cancellations; change it to
detect cancellation/timeouts (e.g., errors.Is(err, context.Canceled) or
errors.Is(err, context.DeadlineExceeded)) and log those cases at debug/info
level instead of warn, while retaining warn for other errors. Update the logging
around the SessionEvents query handler where h.Logger.Warn is called
(referencing h.Logger.Warn, err, sessionID, query.AfterSequence, query.Type,
query.TurnID) so cancellations produce a non-noisy log level and genuine
failures remain warnings.
In `@internal/session/transcript.go`:
- Around line 16-20: The loop currently trims the session ID into variable
target but still passes the original id into m.openQueryRecorder, causing
divergence; change the call sites that use id when opening the recorder to use
the normalized target instead (i.e., replace uses of id in the
m.openQueryRecorder call and any retry/wait/error paths tied to that open with
target) so the open/query/cleanup paths consistently use the trimmed session ID.
In `@internal/store/sessiondb/read_only.go`:
- Around line 16-20: The retry tuning constants readOnlyOpenMaxAttempts,
readOnlyOpenMinRetryDelay, and readOnlyOpenMaxRetryDelay must be removed as
hardcoded literals and sourced from configuration or injected options; update
the code that constructs or defines the read-only session DB (e.g., the
ReadOnlyStore constructor or NewReadOnly... factory) to accept configured values
(or read them from the config system) and replace uses of those constants with
the injected/configured fields so environments can tune max attempts and min/max
retry delays at runtime.
- Around line 157-163: Define exported package-level sentinel errors and return
them from the read-only methods instead of allocating new errors each call: add
e.g. var ErrReadOnlySessionDBWrite = errors.New("store: read-only session
database: write rejected") (or two specific exported vars like
ErrReadOnlySessionDBCannotRecordEvents and
ErrReadOnlySessionDBCannotRecordTokenUsage) and change ReadOnlySessionDB.Record
and ReadOnlySessionDB.RecordTokenUsage to return those variables; update
callers/tests to use errors.Is(err, ErrReadOnlySessionDBWrite) (or the specific
sentinels) for stable comparisons.
In `@internal/store/sessiondb/session_db_test.go`:
- Around line 172-173: The subtest "Should retry transient SQLite locks while
opening" in the t.Run closure is missing parallelization; inside that t.Run's
func(t *testing.T) add t.Parallel() as the first statement to match the suite's
parallel-subtest convention and ensure the subtest runs concurrently with its
siblings (locate the t.Run block with the exact title "Should retry transient
SQLite locks while opening" in session_db_test.go).
In `@internal/store/sessiondb/session_db.go`:
- Around line 286-293: The Clear path currently only holds acceptMu and calls
clearSessionSQLite directly, but that doesn't prevent in-flight writer goroutine
requests from re-inserting rows; modify Clear to serialize through the writer
loop by enqueuing a special "clear" request on the same writer channel used by
the writer goroutine (e.g., the writeRequests/writerCh used by the write loop)
and wait for its acknowledgement before returning, instead of calling
clearSessionSQLite directly; ensure Clear still uses acceptMu to block new API
callers, but the actual DB clear is performed by the writer goroutine (which
then calls clearSessionSQLite) so any queued writes before the clear are
processed in order and no post-clear reinserts can occur (also apply same change
to the other Clear instance around the code referenced at 699-718).
In `@web/src/hooks/routes/use-session-page-controls.ts`:
- Line 18: The file use-session-page-controls.ts imports the hook
useSessionTranscriptThreadMessages via a deep import into another system's
internals; instead, re-export useSessionTranscriptThreadMessages from the public
session barrel (export it from the index file under the systems/session barrel)
and update this file to import the hook from "`@/systems/session`". Also update
any mocks/tests that currently deep-import useSessionTranscriptThreadMessages to
use the public barrel import so all cross-system imports follow the
public-barrel rule.
---
Nitpick comments:
In `@internal/session/manager_start.go`:
- Around line 453-455: Replace context.Background() when creating closeCtx so
request-scoped values are preserved: derive baseCtx :=
context.WithoutCancel(ctx) then if ctx has a deadline reattach it (use
ctx.Deadline() to compute an appropriate deadline or remaining timeout) before
applying the defaultLifecycleTimeout; e.g. create closeCtx via
context.WithTimeout(baseCtxWithDeadline, defaultLifecycleTimeout) and use that
for recorder.Close(closeCtx) in the return that constructs
sessionStartStorage{}, keeping the cancel defer as-is.
In `@internal/session/query_test.go`:
- Around line 443-499: This subtest ("Should retry when finalization closes the
active recorder during a query") is not marked parallel; add t.Parallel() as the
first statement inside the t.Run closure to follow the test-suite guideline (or,
if parallelization would break shared state such as newHarness(),
createSession(), session.recorderHandle(), or the queryRecorderStub usage, add a
short comment above the t.Run explaining the specific reason it must remain
serial). Ensure the parallelization change is applied inside the subtest body so
setup/cleanup (including h.manager.Stop and session.setRecorder) remain valid
when run concurrently.
In `@internal/session/transcript.go`:
- Line 26: The helper m.logTranscriptCleanupError drops request context — change
its signature to accept ctx context.Context as the first parameter and update
all call sites (e.g., where m.logTranscriptCleanupError(target, cleanup()) is
invoked and the other occurrences at lines ~45-53) to pass the current ctx;
inside the helper use the context-aware logger method (e.g.,
WarnContext/WithContext) to emit the warning so request-scoped values are
preserved, and ensure any helper callers pass ctx through as the first arg.
🪄 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: 96fb2ddf-389f-4f72-afff-4b77368fe9fd
⛔ Files ignored due to path filters (1)
web/e2e/fixtures/workspace.tsis excluded by!**/fixtures/**
📒 Files selected for processing (40)
internal/api/core/handlers.gointernal/api/core/session_workspace.gointernal/api/core/session_workspace_internal_test.gointernal/session/interfaces.gointernal/session/ledger.gointernal/session/manager.gointernal/session/manager_clear.gointernal/session/manager_clear_test.gointernal/session/manager_start.gointernal/session/manager_test.gointernal/session/query.gointernal/session/query_test.gointernal/session/repair.gointernal/session/session.gointernal/session/stop_cause.gointernal/session/stop_reason.gointernal/session/stop_reason_test.gointernal/session/transcript.gointernal/sessions/ledger/materializer.gointernal/store/sessiondb/read_only.gointernal/store/sessiondb/session_db.gointernal/store/sessiondb/session_db_test.gointernal/store/store.gointernal/store/write.goweb/e2e/__tests__/agent-categories.spec.tsweb/e2e/__tests__/agents.spec.tsweb/e2e/__tests__/dashboard.spec.tsweb/e2e/__tests__/extensibility.spec.tsweb/e2e/__tests__/harness-smoke.spec.tsweb/e2e/__tests__/network.spec.tsweb/e2e/__tests__/sandbox.spec.tsweb/e2e/__tests__/session-onboarding.spec.tsweb/e2e/__tests__/session-provider-override.spec.tsweb/e2e/__tests__/settings-hardening.spec.tsweb/e2e/__tests__/settings-transport.spec.tsweb/e2e/__tests__/settings.spec.tsweb/e2e/__tests__/tasks-hardening.spec.tsweb/e2e/__tests__/workspace-setup.spec.tsweb/src/hooks/routes/__tests__/use-session-page-controls.test.tsxweb/src/hooks/routes/use-session-page-controls.ts
8f86a08 to
974343e
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (4)
web/src/hooks/routes/use-session-page-controls.ts (1)
18-18:⚠️ Potential issue | 🟠 Major | ⚡ Quick winUse the session public barrel instead of a deep hook import.
This import reaches into another system's internals (
@/systems/session/hooks/...). The hook should be exported from@/systems/sessionand imported from that barrel here.As per coding guidelines: "Cross-system imports: Only through the public barrel (
@/systems/<domain>). Never reach into another system's internals."♻️ Suggested change
-import { useSessionTranscriptThreadMessages } from "`@/systems/session/hooks/use-session-transcript-thread-messages`"; +import { useSessionTranscriptThreadMessages } from "`@/systems/session`";Note: You'll also need to export
useSessionTranscriptThreadMessagesfrom the@/systems/sessionbarrel index file and update the mock in the test file to import from the barrel.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/src/hooks/routes/use-session-page-controls.ts` at line 18, The file imports the hook directly from internals; replace the deep import of useSessionTranscriptThreadMessages with an import from the public barrel `@/systems/session`, and add an export of useSessionTranscriptThreadMessages in that barrel (index) so it’s publicly available; also update any tests/mocks that currently import the hook from the deep path to import from `@/systems/session` so the mock targets the barrel export instead of the internal path.internal/store/sessiondb/session_db_test.go (1)
172-173:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winParallelize this subtest for consistency with test guidelines.
Add
t.Parallel()as the first statement inside thist.Runblock.Proposed diff
t.Run("Should retry transient SQLite locks while opening", func(t *testing.T) { + t.Parallel() ctx := testutil.Context(t) path := filepath.Join(t.TempDir(), SessionDatabaseName)As per coding guidelines, "Structure tests with
t.Run("Should ...")subtests and mark them witht.Parallel()by default unless there is a specific reason to disable parallelization."🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/store/sessiondb/session_db_test.go` around lines 172 - 173, The subtest started with t.Run("Should retry transient SQLite locks while opening", func(t *testing.T) { ... }) is not marked for parallel execution; update that subtest by adding t.Parallel() as the first statement inside the func(t *testing.T) body so the subtest runs in parallel with other subtests and follows the test guidelines.internal/store/sessiondb/read_only.go (2)
16-20: 🛠️ Refactor suggestion | 🟠 Major | 🏗️ Heavy liftAvoid hardcoded retry tuning in the read-open path.
Line 16–Line 20 hardcode retry attempts and delays, which makes lock-retry behavior non-tunable per environment. Move these values to config/injected options.
As per coding guidelines, "Never hardcode configuration values — always retrieve configuration from the config system or environment, never from constants or literals."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/store/sessiondb/read_only.go` around lines 16 - 20, The read-only open retry parameters are hardcoded as constants (readOnlyOpenMaxAttempts, readOnlyOpenMinRetryDelay, readOnlyOpenMaxRetryDelay) in read_only.go; make them configurable instead by wiring them into the sessiondb read-only opener via configuration or injected options (e.g., add fields to the ReadOnlyStore / NewReadOnlyStore constructor or accept a RetryOptions struct) and replace uses of those constants with the injected values, defaulting to the current constants only when config/env values are absent; update any references in methods that perform the open/retry logic to read from the new config/option fields rather than the file-level constants.
157-163: 🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick winReturn stable sentinel errors for read-only write rejections.
Line 157 and Line 161 allocate new errors each call, so callers/tests can’t reliably use
errors.Is. Define package-level sentinel errors and return those instead.Proposed diff
+var ( + ErrReadOnlyRecordEvents = errors.New("store: read-only session database cannot record events") + ErrReadOnlyRecordTokenUsage = errors.New("store: read-only session database cannot record token usage") +) + func (s *ReadOnlySessionDB) Record(context.Context, store.SessionEvent) error { - return errors.New("store: read-only session database cannot record events") + return ErrReadOnlyRecordEvents } func (s *ReadOnlySessionDB) RecordTokenUsage(context.Context, store.TokenUsage) error { - return errors.New("store: read-only session database cannot record token usage") + return ErrReadOnlyRecordTokenUsage }As per coding guidelines, "Use error wrapping with
%wformat specifier and handle errors witherrors.Is()orerrors.As()only — no type assertions on errors."🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/store/sessiondb/read_only.go` around lines 157 - 163, Define package-level sentinel errors (e.g., var ErrReadOnlyRecord = errors.New("store: read-only session database cannot record events") and var ErrReadOnlyTokenUsage = errors.New("store: read-only session database cannot record token usage")) and replace the current ad-hoc errors in ReadOnlySessionDB.Record and ReadOnlySessionDB.RecordTokenUsage with wrapped returns that use those sentinels (e.g., return fmt.Errorf("%w", ErrReadOnlyRecord) / return fmt.Errorf("%w", ErrReadOnlyTokenUsage)) so callers can reliably use errors.Is; reference the ReadOnlySessionDB.Record and ReadOnlySessionDB.RecordTokenUsage methods when making the change.
🧹 Nitpick comments (2)
web/e2e/__tests__/dashboard.spec.ts (1)
462-468: 💤 Low valueConsider explicit handling of undefined or unexpected status values.
The
dashboardStatusKeyhelper defaults to"degraded"for any status that isn't explicitly"ok","healthy", or"running". This includesundefinedand unexpected values. While this provides a safe fallback, it could mask bugs where the backend sends an unexpected status orundefined.Consider either:
- Explicitly handling
undefinedto return a specific value or throw- Logging a warning when an unexpected status is encountered
- Adding a comment documenting that the default is intentional
💡 Example with explicit undefined handling
function dashboardStatusKey(status: string | undefined): "healthy" | "degraded" { + if (status === undefined) { + return "degraded"; // or throw new Error("Status is undefined") + } const normalized = status?.trim().toLowerCase(); if (normalized === "ok" || normalized === "healthy" || normalized === "running") { return "healthy"; } + // Unknown status values default to degraded return "degraded"; }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/e2e/__tests__/dashboard.spec.ts` around lines 462 - 468, dashboardStatusKey currently treats any non-matching string (including undefined) as "degraded"; update the dashboardStatusKey function to explicitly handle undefined (e.g., if status === undefined return "degraded" or throw) and add a warning log for unexpected values so backend anomalies are visible; modify the function dashboardStatusKey to first check for undefined, then normalize and match "ok"/"healthy"/"running", and if falling back to "degraded" emit a console.warn or use the test logger with the unexpected status value and a short comment explaining the intentional default.internal/session/manager_start.go (1)
467-480: 💤 Low valueConsider adding documentation for the internal interface pattern.
The
clearableEventRecorderinterface andclearSessionStartRecorderhelper implement a capability-check pattern for optional clear support. While the implementation is correct and idiomatic, a brief comment explaining when/why this pattern is used would help future maintainers understand the clearing flow.📝 Optional documentation improvement
+// clearableEventRecorder is an optional interface for EventRecorder implementations +// that support clearing/resetting their event store. Used during conversation clearing +// to reset the recorder when reopening a session. type clearableEventRecorder interface { Clear(context.Context) error } +// clearSessionStartRecorder attempts to clear the event recorder if it supports the +// clearableEventRecorder interface. Returns an error if the recorder doesn't support +// clearing or if the Clear operation fails. func clearSessionStartRecorder(ctx context.Context, recorder EventRecorder, dbPath string) error {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/session/manager_start.go` around lines 467 - 480, Add a brief doc comment above the clearableEventRecorder type and/or the clearSessionStartRecorder function explaining this is an optional-capability pattern: EventRecorder implementations may or may not implement Clear, so we type-assert to clearableEventRecorder to detect and invoke the capability only when present; mention the semantics (reset/clear of persisted session start events) and why we return an error when Clear is unsupported or fails. Reference the clearableEventRecorder interface and clearSessionStartRecorder helper in the comment so future maintainers can quickly understand the intent and usage.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/api/core/session_workspace_internal_test.go`:
- Around line 157-159: The two flat assertions that call
statusForWorkspaceError(context.Canceled) and compare to
statusClientClosedRequest (and the similar check at the later occurrence) should
be converted into t.Run subtests using the "Should ..." naming pattern; wrap
each assertion in its own t.Run block (e.g., t.Run("Should map context.Canceled
to statusClientClosedRequest", func(t *testing.T) { if got :=
statusForWorkspaceError(context.Canceled); got != statusClientClosedRequest {
t.Fatalf(...) } })) so each check becomes an isolated subtest and follow the
same pattern for the other occurrence.
In `@internal/session/manager_clear_test.go`:
- Around line 94-160: The two new subtests created with t.Run (including the one
titled "Should remove stale materialized ledger before replacing the event
store" and the other new subtest around lines 166-220) must be marked to run in
parallel; inside each subtest's func(t *testing.T) body add a call to
t.Parallel() as the first statement to follow the project's test guidelines for
subtests. Ensure you place t.Parallel() at the top of the anonymous test
function in the subtests that exercise manager.ClearConversation/Resume/Stop and
related helpers (e.g., where newHarness, NewMaterializer, createSession,
h.manager.Prompt/Resume/ClearConversation are used).
---
Duplicate comments:
In `@internal/store/sessiondb/read_only.go`:
- Around line 16-20: The read-only open retry parameters are hardcoded as
constants (readOnlyOpenMaxAttempts, readOnlyOpenMinRetryDelay,
readOnlyOpenMaxRetryDelay) in read_only.go; make them configurable instead by
wiring them into the sessiondb read-only opener via configuration or injected
options (e.g., add fields to the ReadOnlyStore / NewReadOnlyStore constructor or
accept a RetryOptions struct) and replace uses of those constants with the
injected values, defaulting to the current constants only when config/env values
are absent; update any references in methods that perform the open/retry logic
to read from the new config/option fields rather than the file-level constants.
- Around line 157-163: Define package-level sentinel errors (e.g., var
ErrReadOnlyRecord = errors.New("store: read-only session database cannot record
events") and var ErrReadOnlyTokenUsage = errors.New("store: read-only session
database cannot record token usage")) and replace the current ad-hoc errors in
ReadOnlySessionDB.Record and ReadOnlySessionDB.RecordTokenUsage with wrapped
returns that use those sentinels (e.g., return fmt.Errorf("%w",
ErrReadOnlyRecord) / return fmt.Errorf("%w", ErrReadOnlyTokenUsage)) so callers
can reliably use errors.Is; reference the ReadOnlySessionDB.Record and
ReadOnlySessionDB.RecordTokenUsage methods when making the change.
In `@internal/store/sessiondb/session_db_test.go`:
- Around line 172-173: The subtest started with t.Run("Should retry transient
SQLite locks while opening", func(t *testing.T) { ... }) is not marked for
parallel execution; update that subtest by adding t.Parallel() as the first
statement inside the func(t *testing.T) body so the subtest runs in parallel
with other subtests and follows the test guidelines.
In `@web/src/hooks/routes/use-session-page-controls.ts`:
- Line 18: The file imports the hook directly from internals; replace the deep
import of useSessionTranscriptThreadMessages with an import from the public
barrel `@/systems/session`, and add an export of
useSessionTranscriptThreadMessages in that barrel (index) so it’s publicly
available; also update any tests/mocks that currently import the hook from the
deep path to import from `@/systems/session` so the mock targets the barrel export
instead of the internal path.
---
Nitpick comments:
In `@internal/session/manager_start.go`:
- Around line 467-480: Add a brief doc comment above the clearableEventRecorder
type and/or the clearSessionStartRecorder function explaining this is an
optional-capability pattern: EventRecorder implementations may or may not
implement Clear, so we type-assert to clearableEventRecorder to detect and
invoke the capability only when present; mention the semantics (reset/clear of
persisted session start events) and why we return an error when Clear is
unsupported or fails. Reference the clearableEventRecorder interface and
clearSessionStartRecorder helper in the comment so future maintainers can
quickly understand the intent and usage.
In `@web/e2e/__tests__/dashboard.spec.ts`:
- Around line 462-468: dashboardStatusKey currently treats any non-matching
string (including undefined) as "degraded"; update the dashboardStatusKey
function to explicitly handle undefined (e.g., if status === undefined return
"degraded" or throw) and add a warning log for unexpected values so backend
anomalies are visible; modify the function dashboardStatusKey to first check for
undefined, then normalize and match "ok"/"healthy"/"running", and if falling
back to "degraded" emit a console.warn or use the test logger with the
unexpected status value and a short comment explaining the intentional default.
🪄 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: 38967b21-6c34-4e2b-87c5-d9823d4a5193
⛔ Files ignored due to path filters (1)
web/e2e/fixtures/workspace.tsis excluded by!**/fixtures/**
📒 Files selected for processing (40)
internal/api/core/handlers.gointernal/api/core/session_workspace.gointernal/api/core/session_workspace_internal_test.gointernal/session/interfaces.gointernal/session/ledger.gointernal/session/manager.gointernal/session/manager_clear.gointernal/session/manager_clear_test.gointernal/session/manager_start.gointernal/session/manager_test.gointernal/session/query.gointernal/session/query_test.gointernal/session/repair.gointernal/session/session.gointernal/session/stop_cause.gointernal/session/stop_reason.gointernal/session/stop_reason_test.gointernal/session/transcript.gointernal/sessions/ledger/materializer.gointernal/store/sessiondb/read_only.gointernal/store/sessiondb/session_db.gointernal/store/sessiondb/session_db_test.gointernal/store/store.gointernal/store/write.goweb/e2e/__tests__/agent-categories.spec.tsweb/e2e/__tests__/agents.spec.tsweb/e2e/__tests__/dashboard.spec.tsweb/e2e/__tests__/extensibility.spec.tsweb/e2e/__tests__/harness-smoke.spec.tsweb/e2e/__tests__/network.spec.tsweb/e2e/__tests__/sandbox.spec.tsweb/e2e/__tests__/session-onboarding.spec.tsweb/e2e/__tests__/session-provider-override.spec.tsweb/e2e/__tests__/settings-hardening.spec.tsweb/e2e/__tests__/settings-transport.spec.tsweb/e2e/__tests__/settings.spec.tsweb/e2e/__tests__/tasks-hardening.spec.tsweb/e2e/__tests__/workspace-setup.spec.tsweb/src/hooks/routes/__tests__/use-session-page-controls.test.tsxweb/src/hooks/routes/use-session-page-controls.ts
✅ Files skipped from review due to trivial changes (2)
- internal/session/stop_reason.go
- internal/store/write.go
| if got := statusForWorkspaceError(context.Canceled); got != statusClientClosedRequest { | ||
| t.Fatalf("statusForWorkspaceError(context canceled) = %d, want %d", got, statusClientClosedRequest) | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win
Move these status-mapping checks into t.Run("Should ...") subtests.
Adding more inline assertions here keeps extending a flat test body instead of the required subtest structure, and failures stay less targeted than they need to be.
As per coding guidelines: "**/*_test.go: MUST use t.Run("Should...") pattern for ALL test cases`."
Also applies to: 185-187
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@internal/api/core/session_workspace_internal_test.go` around lines 157 - 159,
The two flat assertions that call statusForWorkspaceError(context.Canceled) and
compare to statusClientClosedRequest (and the similar check at the later
occurrence) should be converted into t.Run subtests using the "Should ..."
naming pattern; wrap each assertion in its own t.Run block (e.g., t.Run("Should
map context.Canceled to statusClientClosedRequest", func(t *testing.T) { if got
:= statusForWorkspaceError(context.Canceled); got != statusClientClosedRequest {
t.Fatalf(...) } })) so each check becomes an isolated subtest and follow the
same pattern for the other occurrence.
| t.Run("Should remove stale materialized ledger before replacing the event store", func(t *testing.T) { | ||
| h := newHarness(t) | ||
| materializer, err := sessionledger.NewMaterializer(sessionledger.Config{ | ||
| RootDir: h.homePaths.SessionsDir, | ||
| }) | ||
| if err != nil { | ||
| t.Fatalf("NewMaterializer() error = %v", err) | ||
| } | ||
| h.manager = newManagerWithHarness(t, h, WithLedgerMaterializer(materializer)) | ||
|
|
||
| session := createSession(t, h) | ||
| firstEvents, err := h.manager.Prompt(testutil.Context(t), session.ID, "before clear") | ||
| if err != nil { | ||
| t.Fatalf("Prompt(before clear) error = %v", err) | ||
| } | ||
| collectEvents(t, firstEvents) | ||
| if err := h.manager.Stop(testutil.Context(t), session.ID); err != nil { | ||
| t.Fatalf("Stop(before clear) error = %v", err) | ||
| } | ||
|
|
||
| ledgerPath := filepath.Join(h.homePaths.SessionsDir, h.workspaceID, session.ID, "ledger.jsonl") | ||
| ledgerBefore, err := os.ReadFile(ledgerPath) | ||
| if err != nil { | ||
| t.Fatalf("ReadFile(ledger before clear) error = %v", err) | ||
| } | ||
| if !strings.Contains(string(ledgerBefore), "before clear") { | ||
| t.Fatalf("ledger before clear = %s, want original prompt content", ledgerBefore) | ||
| } | ||
|
|
||
| resumed, err := h.manager.Resume(testutil.Context(t), session.ID) | ||
| if err != nil { | ||
| t.Fatalf("Resume() error = %v", err) | ||
| } | ||
| cleared, err := h.manager.ClearConversation(testutil.Context(t), resumed.ID) | ||
| if err != nil { | ||
| t.Fatalf("ClearConversation() error = %v", err) | ||
| } | ||
|
|
||
| if _, statErr := os.Stat(ledgerPath); !errors.Is(statErr, os.ErrNotExist) { | ||
| t.Fatalf("Stat(discarded ledger) error = %v, want os.ErrNotExist", statErr) | ||
| } | ||
| events, err := h.manager.Events(testutil.Context(t), cleared.ID, store.EventQuery{}) | ||
| if err != nil { | ||
| t.Fatalf("Events(after clear) error = %v", err) | ||
| } | ||
| if got := len(events); got != 0 { | ||
| t.Fatalf("Events(after clear) len = %d, want 0", got) | ||
| } | ||
| messages, err := h.manager.Transcript(testutil.Context(t), cleared.ID) | ||
| if err != nil { | ||
| t.Fatalf("Transcript(after clear) error = %v", err) | ||
| } | ||
| if got := len(messages); got != 0 { | ||
| t.Fatalf("Transcript(after clear) len = %d, want 0", got) | ||
| } | ||
|
|
||
| if err := h.manager.Stop(testutil.Context(t), cleared.ID); err != nil { | ||
| t.Fatalf("Stop(after clear) error = %v", err) | ||
| } | ||
| ledgerAfter, err := os.ReadFile(ledgerPath) | ||
| if err != nil { | ||
| t.Fatalf("ReadFile(ledger after clear stop) error = %v", err) | ||
| } | ||
| if strings.Contains(string(ledgerAfter), "before clear") { | ||
| t.Fatalf("ledger after clear stop still contains cleared prompt: %s", ledgerAfter) | ||
| } | ||
| }) |
There was a problem hiding this comment.
Add t.Parallel() to the new subtests.
Both newly added t.Run("Should ...") blocks are missing t.Parallel() with no stated reason to run serially.
Suggested patch
func TestClearConversationDiscardsMaterializedLedger(t *testing.T) {
t.Parallel()
t.Run("Should remove stale materialized ledger before replacing the event store", func(t *testing.T) {
+ t.Parallel()
h := newHarness(t)
materializer, err := sessionledger.NewMaterializer(sessionledger.Config{
RootDir: h.homePaths.SessionsDir,
@@
func TestClearConversationResetsStoreOpenedWithStaleRows(t *testing.T) {
t.Parallel()
t.Run("Should clear stale rows present when the replacement store opens", func(t *testing.T) {
+ t.Parallel()
h := newHarness(t)
var openCount atomic.Int32
h.manager = newManagerWithHarness(As per coding guidelines "**/*_test.go: Structure tests with t.Run(\"Should ...\") subtests and mark them with t.Parallel() by default unless there is a specific reason to disable parallelization."
Also applies to: 166-220
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@internal/session/manager_clear_test.go` around lines 94 - 160, The two new
subtests created with t.Run (including the one titled "Should remove stale
materialized ledger before replacing the event store" and the other new subtest
around lines 166-220) must be marked to run in parallel; inside each subtest's
func(t *testing.T) body add a call to t.Parallel() as the first statement to
follow the project's test guidelines for subtests. Ensure you place t.Parallel()
at the top of the anonymous test function in the subtests that exercise
manager.ClearConversation/Resume/Stop and related helpers (e.g., where
newHarness, NewMaterializer, createSession,
h.manager.Prompt/Resume/ClearConversation are used).
## 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
Changes
Release Notes
AGH Impact Audit
Screenshots
/tmp/agh-ui-screenshots-session-reattach/session-thread-mixed-streaming.png/tmp/agh-ui-screenshots-session-reattach/agent-sessions-list-default.png/tmp/agh-ui-screenshots-session-reattach/app-sidebar-categorized.pngTest plan
rtk go test ./internal/store/sessiondb ./internal/session -run 'TestOpenSessionDBReadOnly|TestClearConversation|TestClassifyStopReason|TestManagerEventsAndHistoryRetryClosedActiveRecorder|TestManagerEventsAndHistoryUseStoredEvents' -count=1rtk go test ./internal/session ./internal/api/httpapi ./internal/api/udsapirtk go test ./internal/api/core ./internal/store/sessiondb -run 'TestSessionWorkspaceStatusMappings|TestOpenSessionDBReadOnly' -count=1rtk bunx turbo run test --filter=./webrtk make bun-lintrtk make bun-typecheckrtk make bun-testrtk make lintrtk bunx playwright test e2e/__tests__/session-hardening.spec.ts -g "operator repairs an interrupted session" --reporter=line --workers=1 --repeat-each=10 --max-failures=1rtk bunx playwright test e2e/__tests__/session-hardening.spec.ts --reporter=line --workers=1 --repeat-each=8 --max-failures=1rtk make verify(captured withVERIFY_EXIT=0in/tmp/agh-final-verify.log)agh-ui-screenshotcaptures for session thread, agent sessions list, and app sidebarSummary by CodeRabbit
Bug Fixes
New Features
Improvements