feat: settings ui#37
Conversation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (149)
📒 Files selected for processing (2)
WalkthroughAdds a complete settings subsystem: API contracts, conversion layer, HTTP/UDS handlers (including SSE log-tail), config overlay persistence with TOML AST edits, MCP JSON sidecar writes, daemon restart orchestration with persisted operations and relaunch helper, detached process utilities, extension handlers, and extensive tests across server, UDS, spec, persistence, and restart flows. Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant APIHandler as API Handler
participant SettingsService as Settings Service
participant Persistence as Persistence Layer
participant Disk as Disk/File
Client->>APIHandler: GET /api/settings/general?scope=global
APIHandler->>SettingsService: GetSection(ctx, req)
SettingsService->>Persistence: Load merged config for scope
Persistence->>Disk: Read files (global/workspace)
Persistence-->>SettingsService: SectionEnvelope
SettingsService-->>APIHandler: SectionEnvelope -> API payload
APIHandler-->>Client: 200 OK JSON
Client->>APIHandler: PATCH /api/settings/general (loopback)
APIHandler->>SettingsService: UpdateSection(ctx, updateReq)
SettingsService->>Persistence: EditConfigOverlay(scope, mutations)
Persistence->>Disk: Read overlay
Persistence->>Disk: Parse TOML AST, apply edits, write overlay
Persistence->>SettingsService: Validated merged Config
SettingsService-->>APIHandler: MutationResult (applied/restart_required)
APIHandler-->>Client: 200/202 JSON
sequenceDiagram
participant Client
participant RestartAPI as Restart API
participant RestartController as Restart Controller
participant Daemon as Daemon
participant RestartStore as Restart Store
participant RelaunchHelper as Relaunch Helper
participant NewDaemon as New Daemon
participant Disk as Disk/File
Client->>RestartAPI: POST /api/settings/actions/restart
RestartAPI->>RestartController: RequestRestart(ctx)
RestartController->>Daemon: RequestRestart()
Daemon->>RestartStore: Create operation (pending -> stopping) and persist
RestartStore->>Disk: Write JSON operation file
Daemon->>Daemon: Send SIGTERM to old process
Daemon->>RelaunchHelper: Spawn "daemon relaunch" (env: operation_id)
RestartController-->>RestartAPI: RestartOperation (operation_id, status)
RestartAPI-->>Client: 202 Accepted + status URL
RelaunchHelper->>RestartStore: Poll operation status (waiting for stopping)
RelaunchHelper->>Daemon: Poll release conditions (socket/file/lock)
RelaunchHelper->>RestartStore: Transition waiting_release -> starting (persist)
RelaunchHelper->>NewDaemon: Spawn replacement ("daemon start")
NewDaemon->>RestartStore: markRestartReady(new_pid) (persist ready)
RestartStore->>Disk: Update operation file to ready
Client->>RestartAPI: GET /api/settings/actions/restart/{operation_id}
RestartAPI->>RestartController: GetRestartOperation(ctx, id)
RestartController->>RestartStore: Read operation file
RestartController-->>RestartAPI: RestartOperation (ready, new_pid)
RestartAPI-->>Client: 200 OK JSON
Estimated Code Review Effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly Related PRs
|
There was a problem hiding this comment.
Actionable comments posted: 14
🧹 Nitpick comments (8)
internal/api/httpapi/transport_parity_integration_test.go (1)
248-251: Avoid representation-sensitive parity assertions here.
reflect.DeepEqualwill treatniland empty slices/maps as different, so this can fail even when HTTP and UDS are semantically identical after JSON decoding. Normalize zero-value collections first, or switch to a comparator that equates empty collections before asserting transport parity.As per coding guidelines, "MUST test meaningful business logic, not trivial operations".
Also applies to: 285-286
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/httpapi/transport_parity_integration_test.go` around lines 248 - 251, The parity assertion uses reflect.DeepEqual on httpList.Extensions and udsList.Extensions which treats nil and empty slices/maps as different; normalize zero-value collections before comparing (e.g., add a small helper like normalizeExtensions or nilToEmpty that converts nil slices/maps to empty slices) and call it on both httpList.Extensions and udsList.Extensions prior to sortExtensionsByName and the DeepEqual, or replace reflect.DeepEqual with a comparator that equates empty and nil (e.g., cmp.Equal with cmpopts.SortSlices/AllowUnexported) for the same symbols; apply the same normalization/comparator change to the other occurrence around the http/uds comparison at the noted lines too.internal/api/httpapi/server_test.go (1)
515-562: Split the non-loopback matrix intot.Run("Should...")subtests.This loop packs several independent cases into one test body, so the first failure hides the rest and the failure output is less specific. Wrapping each entry in a named subtest will make this matrix much easier to debug and extend.
As per coding guidelines, "
**/*_test.go: MUST use t.Run("Should...") pattern for ALL test cases`".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/httpapi/server_test.go` around lines 515 - 562, Split the two loops into named subtests using t.Run("Should ...") so each case runs as its own test: for the readPaths slice wrap each iteration in t.Run(fmt.Sprintf("Should allow GET %s", path), func(t *testing.T){ ... }) and execute the existing doServerRequest checks inside; for the mutationCases slice wrap each tc in t.Run(fmt.Sprintf("Should forbid %s %s", tc.method, tc.path), func(t *testing.T){ ... }) and keep the existing assertions (status check, decodeServerJSON into contract.ErrorPayload and compare to errLoopbackMutationRequired). Ensure you reference the same symbols (readPaths, mutationCases, doServerRequest, decodeServerJSON, errLoopbackMutationRequired, server.Port) and preserve the original request/response logic inside each subtest.internal/api/udsapi/helpers_test.go (1)
37-157: Code duplication withinternal/api/httpapi/helpers_test.go.The
stubSettingsService,stubSettingsRestartController,settingsTestSectionEnvelope, andsettingsTestCollectionEnvelopeimplementations are nearly identical to those ininternal/api/httpapi/helpers_test.go. Consider extracting these tointernal/api/testutilto follow the existing pattern of shared test helpers (likeStubSessionManager,StubObserver, etc.) and reduce maintenance burden.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/udsapi/helpers_test.go` around lines 37 - 157, Extract the duplicated test helpers (stubSettingsService, stubSettingsRestartController, settingsTestSectionEnvelope, settingsTestCollectionEnvelope) into a new shared package (e.g. internal/api/testutil) and replace the local copies in both internal/api/udsapi/helpers_test.go and internal/api/httpapi/helpers_test.go with imports from that package; move the types and their methods (GetSection, UpdateSection, ListCollection, PutCollectionItem, DeleteCollectionItem, RequestRestart, GetRestartOperation) plus the two helper envelope functions into the new file, export them or provide package-level constructors as needed, update tests to call testutil.NewStubSettingsService() / testutil.NewStubSettingsRestartController() or use the exported names, and run tests to ensure no behavioral changes.internal/api/httpapi/helpers_test.go (1)
492-554: Duplicate helper functions withinternal/api/udsapi/helpers_test.go.
settingsTestSectionEnvelopeandsettingsTestCollectionEnvelopeare duplicated across both test packages. Consider extracting tointernal/api/testutilalongside the shared stubs.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/httpapi/helpers_test.go` around lines 492 - 554, The two helper functions settingsTestSectionEnvelope and settingsTestCollectionEnvelope are duplicated; extract them into a shared test helper package (e.g., package testutil) and replace the duplicates with calls to the shared functions. Create exported versions (e.g., SettingsTestSectionEnvelope and SettingsTestCollectionEnvelope) in the new testutil package that return the same settingspkg.SectionEnvelope and settingspkg.CollectionEnvelope, ensure the testutil file imports settingspkg and aghconfig as needed, then update internal/api/httpapi and internal/api/udsapi tests to import testutil and call testutil.SettingsTestSectionEnvelope(...) and testutil.SettingsTestCollectionEnvelope(...), removing the duplicated definitions from both test files.internal/settings/classify.go (1)
80-121: Control flow between section-specific and collection field handling could be clearer.The
classifyFieldfunction has two layers of field matching:
- Section-specific handling (lines 86-103) that returns early for known sections
- Collection prefix fallthrough (lines 105-120) for fields not matching section patterns
This means
hooks.prefix is matched in two places (line 100 forSectionHooksExtensions, line 112 for fallthrough), but the section case returns first. The structure works correctly, but adding a brief comment explaining that lines 105-120 handle collection fields for sections without explicit field patterns would improve readability.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/settings/classify.go` around lines 80 - 121, The classifyField function’s control flow mixes section-specific branches (e.g., SectionHooksExtensions and SectionSkills) with a subsequent generic collection-prefix switch; add a concise comment above the second switch (the one checking strings.HasPrefix for "providers.", "mcp-servers.", "environments.", "hooks.") clarifying that this block handles collection-level prefixes for sections that don’t have explicit per-section patterns (and that some prefixes like "hooks." are also handled earlier for SectionHooksExtensions and thus will return earlier), so future readers understand the early-return behavior of classifyField and the intended fallthrough semantics.internal/daemon/restart_integration_test.go (2)
19-70: Consider addingt.Parallel()to independent integration tests.Per coding guidelines, independent tests should use
t.Parallel(). These three integration tests appear to be independent (each creates its ownhomePathsviaintegrationHomePaths(t)with isolated temp directories) and could run in parallel.Suggested change
func TestRequestRestartPersistsPreRestartContextBeforeShutdownSignal(t *testing.T) { + t.Parallel() + homePaths := integrationHomePaths(t)Apply similarly to
TestRelaunchHelperFailurePersistsAfterOldDaemonExitandTestBootMarksRestartOperationReadyAfterFreshDaemonInfo.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/restart_integration_test.go` around lines 19 - 70, Add t.Parallel() at the start of each independent integration test function to allow them to run concurrently: insert a call to t.Parallel() as the first statement inside TestRequestRestartPersistsPreRestartContextBeforeShutdownSignal (and likewise in TestRelaunchHelperFailurePersistsAfterOldDaemonExit and TestBootMarksRestartOperationReadyAfterFreshDaemonInfo) so these tests (which use integrationHomePaths and isolated temp dirs) run in parallel without changing other logic like newTestDaemon, RequestRestart, or the signalProcess checks.
142-145: Assertion uses string matching for error validation.The error check uses
strings.Contains(err.Error(), "replacement daemon exited before ready")which is brittle. Consider usingerrors.Isorerrors.Asif a sentinel error is available, or at minimum document that this error message is part of the contract.Per coding guidelines: "Use
errors.Is()anderrors.As()for error matching — never compare error strings."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/restart_integration_test.go` around lines 142 - 145, The test currently matches the error text from helper.run() using strings.Contains which is brittle; instead have helper.run return a sentinel or typed error and update the assertion to use errors.Is or errors.As. Define or export a sentinel error (e.g. ErrReplacementExitedBeforeReady) from the package that helper.run returns (or wrap the internal error with fmt.Errorf("%w", ErrReplacementExitedBeforeReady)), then replace the strings.Contains check with if err == nil || !errors.Is(err, ErrReplacementExitedBeforeReady) (or use errors.As for a typed error) so the test uses errors.Is against the sentinel instead of comparing error strings.internal/daemon/restart_test.go (1)
533-537: Make this “not launched yet” assertion event-driven.Waiting a fixed 50ms only proves the helper did not launch quickly; a slower regression can still pass. Prefer an explicit sync point or probe channel over a wall-clock delay here.
As per coding guidelines, "Never use
time.Sleep()in orchestration — use proper synchronization primitives."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/restart_test.go` around lines 533 - 537, The test currently uses a fixed 50ms delay to assert that launchStarted hasn't fired, which is flaky; replace the wall-clock wait with an explicit synchronization channel from the helper that signals when singleton resources are released (e.g., add a releasedResources or resourcesReleased chan struct{} that the helper closes/dispatches once it releases resources) and change the select to wait on either launchStarted or that releasedResources signal (optionally with a generous timeout for test safety). Update the code paths that release singleton resources (in the helper or tested routine) to send/close on resourcesReleased, and use that channel in place of time.After in the select so the assertion is event-driven and deterministic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@internal/api/core/errors.go`:
- Around line 121-133: Replace the current message-based heuristics in the HTTP
status-mapping logic with typed error matching: remove the calls to
settingsMessageLooksForbidden/NotFound/Conflict/Validation and instead check for
sentinel or concrete error types using errors.Is() or errors.As() (e.g., match
against exported sentinel errors from the service layer) inside the same
function that contains the switch, returning
http.StatusForbidden/NotFound/Conflict/BadRequest only when errors.Is/As detects
the corresponding typed error, otherwise return http.StatusInternalServerError;
apply the same change to the other mapping block referenced (around lines
282-312) so all mappings rely on typed sentinels rather than string contains.
In `@internal/api/core/settings.go`:
- Around line 259-262: The restart controller currently maps restart-specific
failures (e.g., daemon.ErrRestartOperationNotFound) to 500 because
StatusForSettingsError doesn't handle restart errors; update the error-to-status
mapping for the restart endpoints by either extending StatusForSettingsError to
recognize restart-specific errors or by adding a dedicated StatusForRestartError
and calling it before the generic mapping in both SettingsRestart.RequestRestart
and TriggerSettingsRestart handlers (i.e., check errors returned from
SettingsRestart.RequestRestart and the restart lookup paths for
daemon.ErrRestartOperationNotFound and other restart-related sentinel errors and
map them to 404/appropriate HTTP codes when calling h.respondError).
- Around line 773-795: The handler currently accepts :name and body.Server.Name
separately, which can desync stored keys; after obtaining name via
requiredSettingsPathValue, enforce consistency by normalizing server.Name to the
path value (set server.Name = name after trimming) before running
server.Validate and before constructing settingspkg.CollectionItemPutRequest so
the returned MCPServer and the request Name always match; alternatively, if you
prefer strictness, reject when body.Server.Name is non-empty and doesn't equal
name by returning a validation error from the same spot (use
requiredSettingsPathValue, server.Name, server.Validate, and
settingspkg.CollectionItemPutRequest to locate where to apply the change).
- Around line 849-861: The hook declaration's name must be taken from the URL
param instead of trusting the request body: after obtaining name via
requiredSettingsPathValue and parsing decl with hookDeclarationFromPayload, set
decl.Name = name (or the appropriate field on the parsed declaration struct)
before returning the settingspkg.CollectionItemPutRequest so the returned Hook
always uses the URL key; adjust any validation if you prefer to error on
mismatch rather than silently overwrite.
In `@internal/api/httpapi/extensions.go`:
- Around line 145-165: The function extensionStatusCode fails to handle
extensionpkg.ErrExtensionExists, causing duplicate-extension errors to fall
through to 500; update extensionStatusCode to add a case that checks
errors.Is(err, extensionpkg.ErrExtensionExists) and return http.StatusConflict
(409) so duplicate install attempts map to 409 instead of 500.
In `@internal/api/httpapi/routes.go`:
- Around line 237-240: The log-tail route currently allows unauthenticated
remote reads of daemon logs; update the observability route registration to
require the same guard used elsewhere so remote clients cannot access it.
Specifically, change the registration of StreamSettingsObservabilityLogTail
(observability.GET("/log-tail", handlers.StreamSettingsObservabilityLogTail)) to
include the privileged guard (e.g., observability.GET("/log-tail", privileged,
handlers.StreamSettingsObservabilityLogTail) or the equivalent
privilegedMutationGuard), so the endpoint is protected from non-loopback HTTP.
In `@internal/cli/daemon_wait_test.go`:
- Line 8: The test currently trims captured.OperationID before asserting which
masks whether the relaunch path actually forwards whitespace; update the test in
internal/cli/daemon_wait_test.go to seed the environment variable with
surrounding whitespace (e.g. " opid "), remove the strings.TrimSpace(...)
usage, and assert captured.OperationID equals the exact string with whitespace
to ensure the command forwards the env var unchanged; apply the same change for
the other similar assertions around lines 287-293 that also use
strings.TrimSpace.
In `@internal/config/mcpjson_write.go`:
- Around line 168-204: loadMCPJSONCollection only checks duplicates within the
single collection (collection.nameIndex) so servers that normalize to the same
name across different top-level keys (e.g. "mcpServers.alpha" vs
"mcp_servers.alpha") can slip through; change loadMCPJSONCollection to accept a
shared map (e.g. existingNames map[string]string or *map[string]string) or a
pointer to a global index and, after computing normalized :=
normalizeMCPServerName(actualName), check that normalized against both
collection.nameIndex and the shared existingNames and return an error if already
present (include prior name from existingNames in the error); update the callers
that load both collections (the other load call around the lines noted 226-230)
to pass the same shared map so duplicates across top-level keys are detected and
rejected.
In `@internal/config/mcpjson.go`:
- Around line 47-57: The current json.Unmarshal calls for decoding into
document.MCPServersCamel and document.MCPServersSnake silently ignore unknown
fields; replace each json.Unmarshal(raw, &document.MCPServersCamel) and
json.Unmarshal(raw, &document.MCPServersSnake) with a
json.NewDecoder(bytes.NewReader(raw)) that calls DisallowUnknownFields() before
Decode(...) so unknown fields cause an error; ensure you import bytes if missing
and preserve the existing error wrapping (e.g., fmt.Errorf("config: decode MCP
JSON %q mcpServers: %w", sourceName, err) and similarly for mcp_servers) and
apply the same decoder pattern for both MCPServersCamel and MCPServersSnake in
mcpJSONDocument decoding.
In `@internal/config/persistence_integration_test.go`:
- Around line 13-163: These tests violate the repo rule requiring subtests with
t.Run; wrap each existing test body inside a t.Run call with a descriptive
"Should ..." name and move assertions into the t.Run closure (keep the top-level
test functions TestEditConfigOverlayGlobalWritePreservesStructureOnDisk,
TestEditConfigOverlayWorkspaceWriteLeavesGlobalConfigUntouched, and
TestPutMCPSidecarServerWritesAndPreservesUnaffectedEntries but replace their
current bodies with a single t.Run(...) that contains the current logic),
ensuring any t.TempDir or local variables are created inside the subtest closure
so they use the subtest's *testing.T context.
In `@internal/config/persistence.go`:
- Around line 1384-1390: In writePersistedFile, avoid truncated files and
overly-permissive dirs by creating the parent directory with restrictive mode
(0o700) instead of 0o755, then perform an atomic write: write contents to a temp
file in the same directory (with file mode 0o600), fsync the temp file (and
optionally the directory), and finally rename the temp file to path using
os.Rename; update error handling to report failures for temp file
creation/write/sync/rename.
In `@internal/daemon/restart_test.go`:
- Around line 1202-1216: The test in restart_test.go creates a Unix-only helper
script and will fail on Windows; update the test around the RunRelaunchHelper
invocation (and the scriptPath/script variables) to either skip this case on
non-Unix platforms (use runtime.GOOS or build tags) or create a
platform-specific stub: for Unix keep the /bin/sh executable script, and for
Windows provide an .exe/PowerShell/batch stub or return a fake executable path
from the Executable func; ensure the change is applied to the Test that calls
RunRelaunchHelper so the test only uses the shell script on Unix and uses the
Windows-specific stub or skip logic otherwise.
In `@internal/daemon/restart.go`:
- Around line 799-801: The Get call error handling near "operation, err :=
store.Get(operationID)" currently returns err and exits without marking the
operation terminal; change this path to call the helper's failure handler
(h.fail(...)) so the operation is persisted as Failed (e.g., invoke h.fail(ctx,
operationID, fmt.Errorf("status polling read failed: %w", err)) or the existing
h.fail signature used elsewhere), propagate the result of h.fail back to the
caller, and preserve the original error details in the failure message; replace
the bare "return err" at that location with the h.fail invocation matching other
restart phases.
- Around line 524-541: failRestartOperation currently hides errors from
store.Transition, causing callers to miss persistence failures; change it to
surface transitionErr when store.Transition fails by wrapping both errors into
the returned error. Concretely, in failRestartOperation (and around the call to
store.Transition with restartTransition{status: RestartStatusFailed,
failureReason: fmt.Sprintf("%s: %v", action, err)}), if transitionErr != nil
include it in the final fmt.Errorf (e.g., "daemon: %s: %w; persistence
transition error: %v" or by wrapping transitionErr) instead of discarding it,
and only set operation = failed when transitionErr == nil so the caller sees
both the original action error and the fallback persistence error.
---
Nitpick comments:
In `@internal/api/httpapi/helpers_test.go`:
- Around line 492-554: The two helper functions settingsTestSectionEnvelope and
settingsTestCollectionEnvelope are duplicated; extract them into a shared test
helper package (e.g., package testutil) and replace the duplicates with calls to
the shared functions. Create exported versions (e.g.,
SettingsTestSectionEnvelope and SettingsTestCollectionEnvelope) in the new
testutil package that return the same settingspkg.SectionEnvelope and
settingspkg.CollectionEnvelope, ensure the testutil file imports settingspkg and
aghconfig as needed, then update internal/api/httpapi and internal/api/udsapi
tests to import testutil and call testutil.SettingsTestSectionEnvelope(...) and
testutil.SettingsTestCollectionEnvelope(...), removing the duplicated
definitions from both test files.
In `@internal/api/httpapi/server_test.go`:
- Around line 515-562: Split the two loops into named subtests using
t.Run("Should ...") so each case runs as its own test: for the readPaths slice
wrap each iteration in t.Run(fmt.Sprintf("Should allow GET %s", path), func(t
*testing.T){ ... }) and execute the existing doServerRequest checks inside; for
the mutationCases slice wrap each tc in t.Run(fmt.Sprintf("Should forbid %s %s",
tc.method, tc.path), func(t *testing.T){ ... }) and keep the existing assertions
(status check, decodeServerJSON into contract.ErrorPayload and compare to
errLoopbackMutationRequired). Ensure you reference the same symbols (readPaths,
mutationCases, doServerRequest, decodeServerJSON, errLoopbackMutationRequired,
server.Port) and preserve the original request/response logic inside each
subtest.
In `@internal/api/httpapi/transport_parity_integration_test.go`:
- Around line 248-251: The parity assertion uses reflect.DeepEqual on
httpList.Extensions and udsList.Extensions which treats nil and empty
slices/maps as different; normalize zero-value collections before comparing
(e.g., add a small helper like normalizeExtensions or nilToEmpty that converts
nil slices/maps to empty slices) and call it on both httpList.Extensions and
udsList.Extensions prior to sortExtensionsByName and the DeepEqual, or replace
reflect.DeepEqual with a comparator that equates empty and nil (e.g., cmp.Equal
with cmpopts.SortSlices/AllowUnexported) for the same symbols; apply the same
normalization/comparator change to the other occurrence around the http/uds
comparison at the noted lines too.
In `@internal/api/udsapi/helpers_test.go`:
- Around line 37-157: Extract the duplicated test helpers (stubSettingsService,
stubSettingsRestartController, settingsTestSectionEnvelope,
settingsTestCollectionEnvelope) into a new shared package (e.g.
internal/api/testutil) and replace the local copies in both
internal/api/udsapi/helpers_test.go and internal/api/httpapi/helpers_test.go
with imports from that package; move the types and their methods (GetSection,
UpdateSection, ListCollection, PutCollectionItem, DeleteCollectionItem,
RequestRestart, GetRestartOperation) plus the two helper envelope functions into
the new file, export them or provide package-level constructors as needed,
update tests to call testutil.NewStubSettingsService() /
testutil.NewStubSettingsRestartController() or use the exported names, and run
tests to ensure no behavioral changes.
In `@internal/daemon/restart_integration_test.go`:
- Around line 19-70: Add t.Parallel() at the start of each independent
integration test function to allow them to run concurrently: insert a call to
t.Parallel() as the first statement inside
TestRequestRestartPersistsPreRestartContextBeforeShutdownSignal (and likewise in
TestRelaunchHelperFailurePersistsAfterOldDaemonExit and
TestBootMarksRestartOperationReadyAfterFreshDaemonInfo) so these tests (which
use integrationHomePaths and isolated temp dirs) run in parallel without
changing other logic like newTestDaemon, RequestRestart, or the signalProcess
checks.
- Around line 142-145: The test currently matches the error text from
helper.run() using strings.Contains which is brittle; instead have helper.run
return a sentinel or typed error and update the assertion to use errors.Is or
errors.As. Define or export a sentinel error (e.g.
ErrReplacementExitedBeforeReady) from the package that helper.run returns (or
wrap the internal error with fmt.Errorf("%w", ErrReplacementExitedBeforeReady)),
then replace the strings.Contains check with if err == nil || !errors.Is(err,
ErrReplacementExitedBeforeReady) (or use errors.As for a typed error) so the
test uses errors.Is against the sentinel instead of comparing error strings.
In `@internal/daemon/restart_test.go`:
- Around line 533-537: The test currently uses a fixed 50ms delay to assert that
launchStarted hasn't fired, which is flaky; replace the wall-clock wait with an
explicit synchronization channel from the helper that signals when singleton
resources are released (e.g., add a releasedResources or resourcesReleased chan
struct{} that the helper closes/dispatches once it releases resources) and
change the select to wait on either launchStarted or that releasedResources
signal (optionally with a generous timeout for test safety). Update the code
paths that release singleton resources (in the helper or tested routine) to
send/close on resourcesReleased, and use that channel in place of time.After in
the select so the assertion is event-driven and deterministic.
In `@internal/settings/classify.go`:
- Around line 80-121: The classifyField function’s control flow mixes
section-specific branches (e.g., SectionHooksExtensions and SectionSkills) with
a subsequent generic collection-prefix switch; add a concise comment above the
second switch (the one checking strings.HasPrefix for "providers.",
"mcp-servers.", "environments.", "hooks.") clarifying that this block handles
collection-level prefixes for sections that don’t have explicit per-section
patterns (and that some prefixes like "hooks." are also handled earlier for
SectionHooksExtensions and thus will return earlier), so future readers
understand the early-return behavior of classifyField and the intended
fallthrough semantics.
🪄 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: d291f02b-3925-43bf-bffe-16502df3d65e
⛔ Files ignored due to path filters (76)
.compozy/tasks/settings-ui/_meta.mdis excluded by!**/*.md.compozy/tasks/settings-ui/_tasks.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/MEMORY.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_01.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_02.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_03.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_04.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_05.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_06.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_07.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_08.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_09.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_10.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_11.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_12.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_13.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_14.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_15.mdis excluded by!**/*.md.compozy/tasks/settings-ui/memory/task_16.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/issues/BUG-001-restart-refresh-continuity.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/issues/BUG-002-skills-overlay-persistence.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/issues/BUG-003-settings-transport-parity.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/screenshots/TC-FUNC-001-settings-shell-navigation.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-FUNC-002-general-restart-polling.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-FUNC-005-skills-applied-now-vs-restart.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-FUNC-008-providers-crud-and-builtin-fallback.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-FUNC-010-mcp-global-precedence.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-FUNC-012-hooks-extensions-hybrid.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-INT-011-mcp-workspace-scope.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-INT-013-non-loopback-http-restrictions.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-INT-016-general-restart-ready.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-UI-014-summary-shell-desktop.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-UI-015-collection-providers-desktop.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/screenshots/TC-UI-015-hybrid-hooks-extensions-desktop.pngis excluded by!**/*.png.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-001-settings-shell-navigation.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-002-general-restart-flow.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-003-memory-config-and-consolidate.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-004-observability-diagnostics-and-log-tail.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-005-skills-applied-now-vs-restart.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-006-automation-summary-and-link.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-007-network-summary-and-link.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-008-providers-crud-and-builtin-fallback.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-009-environments-crud-and-usage.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-010-mcp-global-precedence.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-FUNC-012-hooks-extensions-hybrid.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-INT-011-mcp-workspace-scope.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-INT-013-non-loopback-http-restrictions.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-UI-014-summary-routes-visual.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-cases/TC-UI-015-collection-and-hybrid-visual.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-plans/settings-ui-regression.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/test-plans/settings-ui-test-plan.mdis excluded by!**/*.md.compozy/tasks/settings-ui/qa/verification-report.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_01.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_02.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_03.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_04.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_05.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_06.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_07.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_08.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_09.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_10.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_11.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_12.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_13.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_14.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_15.mdis excluded by!**/*.md.compozy/tasks/settings-ui/task_16.mdis excluded by!**/*.mdgo.sumis excluded by!**/*.sumopenapi/agh.jsonis excluded by!**/*.jsonweb/e2e/fixtures/runtime-seed.test.tsis excluded by!**/fixtures/**web/e2e/fixtures/runtime-seed.tsis excluded by!**/fixtures/**web/e2e/fixtures/runtime.tsis excluded by!**/fixtures/**web/e2e/fixtures/selectors.test.tsis excluded by!**/fixtures/**web/e2e/fixtures/selectors.tsis excluded by!**/fixtures/**web/src/generated/agh-openapi.d.tsis excluded by!**/generated/**
📒 Files selected for processing (148)
.compozy/tasks/settings-ui/qa/issues/.gitkeep.compozy/tasks/settings-ui/qa/screenshots/.gitkeepgo.modinternal/api/contract/settings.gointernal/api/contract/settings_test.gointernal/api/core/conversions.gointernal/api/core/errors.gointernal/api/core/handlers.gointernal/api/core/interfaces.gointernal/api/core/settings.gointernal/api/core/settings_internal_test.gointernal/api/core/settings_test.gointernal/api/httpapi/extensions.gointernal/api/httpapi/handlers.gointernal/api/httpapi/handlers_test.gointernal/api/httpapi/helpers_test.gointernal/api/httpapi/middleware.gointernal/api/httpapi/routes.gointernal/api/httpapi/server.gointernal/api/httpapi/server_test.gointernal/api/httpapi/transport_parity_integration_test.gointernal/api/spec/settings_test.gointernal/api/spec/spec.gointernal/api/udsapi/handlers_test.gointernal/api/udsapi/helpers_test.gointernal/api/udsapi/routes.gointernal/api/udsapi/server.gointernal/api/udsapi/transport_parity_integration_test.gointernal/cli/daemon.gointernal/cli/daemon_wait_test.gointernal/cli/root.gointernal/config/bootstrap.gointernal/config/bootstrap_test.gointernal/config/home.gointernal/config/home_test.gointernal/config/mcpjson.gointernal/config/mcpjson_test.gointernal/config/mcpjson_write.gointernal/config/merge.gointernal/config/persistence.gointernal/config/persistence_integration_test.gointernal/config/persistence_test.gointernal/daemon/boot.gointernal/daemon/daemon.gointernal/daemon/restart.gointernal/daemon/restart_integration_test.gointernal/daemon/restart_test.gointernal/daemon/settings.gointernal/daemon/settings_test.gointernal/procutil/detached.gointernal/procutil/detached_unix.gointernal/procutil/detached_windows.gointernal/settings/classify.gointernal/settings/collections.gointernal/settings/models.gointernal/settings/sections.gointernal/settings/service.gointernal/settings/service_integration_test.gointernal/settings/service_test.goweb/e2e/settings-transport.spec.tsweb/e2e/settings.spec.tsweb/src/components/app-sidebar.test.tsxweb/src/components/app-sidebar.tsxweb/src/hooks/routes/use-settings-automation-page.test.tsxweb/src/hooks/routes/use-settings-automation-page.tsweb/src/hooks/routes/use-settings-environments-page.test.tsxweb/src/hooks/routes/use-settings-environments-page.tsweb/src/hooks/routes/use-settings-general-page.test.tsxweb/src/hooks/routes/use-settings-general-page.tsweb/src/hooks/routes/use-settings-hooks-extensions-page.test.tsxweb/src/hooks/routes/use-settings-hooks-extensions-page.tsweb/src/hooks/routes/use-settings-mcp-servers-page.test.tsxweb/src/hooks/routes/use-settings-mcp-servers-page.tsweb/src/hooks/routes/use-settings-memory-page.test.tsxweb/src/hooks/routes/use-settings-memory-page.tsweb/src/hooks/routes/use-settings-network-page.test.tsxweb/src/hooks/routes/use-settings-network-page.tsweb/src/hooks/routes/use-settings-observability-page.test.tsxweb/src/hooks/routes/use-settings-observability-page.tsweb/src/hooks/routes/use-settings-page.test.tsxweb/src/hooks/routes/use-settings-page.tsweb/src/hooks/routes/use-settings-providers-page.test.tsxweb/src/hooks/routes/use-settings-providers-page.tsweb/src/hooks/routes/use-settings-skills-page.test.tsxweb/src/hooks/routes/use-settings-skills-page.tsweb/src/lib/settings-api-contract.test.tsweb/src/routeTree.gen.tsweb/src/routes/-settings-route-tree.test.tsweb/src/routes/_app/-settings.test.tsxweb/src/routes/_app/settings.tsxweb/src/routes/_app/settings/-automation.test.tsxweb/src/routes/_app/settings/-environments.test.tsxweb/src/routes/_app/settings/-general.test.tsxweb/src/routes/_app/settings/-hooks-extensions.test.tsxweb/src/routes/_app/settings/-index.test.tsxweb/src/routes/_app/settings/-mcp-servers.test.tsxweb/src/routes/_app/settings/-memory.test.tsxweb/src/routes/_app/settings/-network.test.tsxweb/src/routes/_app/settings/-observability.test.tsxweb/src/routes/_app/settings/-providers.test.tsxweb/src/routes/_app/settings/-skills.test.tsxweb/src/routes/_app/settings/automation.tsxweb/src/routes/_app/settings/environments.tsxweb/src/routes/_app/settings/general.tsxweb/src/routes/_app/settings/hooks-extensions.tsxweb/src/routes/_app/settings/index.tsxweb/src/routes/_app/settings/mcp-servers.tsxweb/src/routes/_app/settings/memory.tsxweb/src/routes/_app/settings/network.tsxweb/src/routes/_app/settings/observability.tsxweb/src/routes/_app/settings/providers.tsxweb/src/routes/_app/settings/skills.tsxweb/src/systems/settings/adapters/settings-api.test.tsweb/src/systems/settings/adapters/settings-api.tsweb/src/systems/settings/components/index.tsweb/src/systems/settings/components/settings-collection-header.tsxweb/src/systems/settings/components/settings-delete-dialog.test.tsxweb/src/systems/settings/components/settings-delete-dialog.tsxweb/src/systems/settings/components/settings-editor-dialog.test.tsxweb/src/systems/settings/components/settings-editor-dialog.tsxweb/src/systems/settings/components/settings-field-row.tsxweb/src/systems/settings/components/settings-page-shell.tsxweb/src/systems/settings/components/settings-restart-banner.test.tsxweb/src/systems/settings/components/settings-restart-banner.tsxweb/src/systems/settings/components/settings-save-bar.tsxweb/src/systems/settings/components/settings-section-card.tsxweb/src/systems/settings/components/settings-source-badge.test.tsxweb/src/systems/settings/components/settings-source-badge.tsxweb/src/systems/settings/components/settings-status-line.tsxweb/src/systems/settings/hooks/use-settings-collections.tsweb/src/systems/settings/hooks/use-settings-mutations.test.tsxweb/src/systems/settings/hooks/use-settings-mutations.tsweb/src/systems/settings/hooks/use-settings-restart.test.tsxweb/src/systems/settings/hooks/use-settings-restart.tsweb/src/systems/settings/hooks/use-settings-sections.tsweb/src/systems/settings/index.tsweb/src/systems/settings/lib/query-keys.test.tsweb/src/systems/settings/lib/query-keys.tsweb/src/systems/settings/lib/query-options.test.tsweb/src/systems/settings/lib/query-options.tsweb/src/systems/settings/lib/restart-status.test.tsweb/src/systems/settings/lib/restart-status.tsweb/src/systems/settings/lib/sections.test.tsweb/src/systems/settings/lib/sections.tsweb/src/systems/settings/stores/settings-restart-store.tsweb/src/systems/settings/stores/use-settings-restart-store.tsweb/src/systems/settings/types.tsweb/src/test-setup.ts
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Consolidates settings API access, query infrastructure, mutation invalidation, and restart polling under web/src/systems/settings so section routes can stay presentational. Adds useSettingsPage to share restart banner and active-section state across the settings shell. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Introduce the three configuration-and-diagnostics settings pages on top of the shared shell and @/systems/settings hooks, plus the shared section primitives (page shell, section cards, field rows, save bar, restart banner, status line) that later settings section tasks will reuse. Route-level orchestration lives in dedicated use-settings-<slug>-page hooks so route files stay presentational. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds per-section settings routes under /settings that summarize runtime state and expose the configurable surface for each area without duplicating the operational pages. Skills splits its save flow into applied-now disabled-skills and restart-required marketplace/policy cards so mutations stay within a single behavior bucket enforced by the settings service. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Introduces the collection-driven settings surface for provider and environment overlays with full-replacement PUT semantics and overlay-reveals-builtin delete behavior. - Shared collection primitives: SettingsCollectionHeader, SettingsSourceBadge, SettingsEditorDialog, SettingsDeleteDialog (ready for reuse by mcp-servers and hooks & extensions pages). - Providers page renders the builtin catalog as a table with effective/shadowed source metadata, API key presence state, and per-row edit/delete controls that disable against builtin-only providers. - Environments page renders a profile grid with workspace usage counts, preserved nested profile keys (daytona/network/env) on edit, and usage warnings on delete. - Page hooks expose a tagged-union editor state (closed/create/edit) so conflict and validation errors keep the selected item pinned, plus a last-action banner that surfaces the restart badge and builtin-fallback hint from the mutation result. - Tests cover render, CRUD dispatch, validation and conflict errors, builtin-fallback delete notes, and shared primitive behavior. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Scope chips let operators switch between global and workspace overrides; scope changes reset the editor/delete state so drafts never leak across scopes - Explicit target=auto|config|sidecar selector in the editor with inline available_targets so operators see which persistence destinations the backend permits - Delete dialog previews the current effective source plus the next shadowed source that becomes effective on reload, and carries its own target selector for precedence-specific removal - Hook/route tests cover scope switching, target submission, precedence rendering, and fallback messaging; both files exceed the 80% coverage target Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Combined settings surface that renders config-backed hook declarations and extension policy alongside immediate operational actions (enable, disable) against the HTTP-visible /api/extensions parity. Policy edits stay restart-aware and extension toggles apply immediately, with a banner surfacing transport-parity restrictions when HTTP mutation is disabled. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.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 ### 🧪 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
Documentation