feat: memory v2#108
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (38)
📒 Files selected for processing (41)
WalkthroughThis PR implements Memory v2 across the codebase: it adds a large public memory contract (types/payloads), expands memory configuration, introduces three memory service interfaces (extractor, providers, session ledger), wires memory services through handlers/servers/daemon boot, updates SSE scrubbing for memory content, migrates many tests to the new memcontract surface, and extends CLI, OpenAPI, and HTTP/UDS routes for the new memory API. ChangesMemory v2 Contract and Configuration
API Core Services and Wiring
HTTP/UDS API Endpoints and OpenAPI
API Tests, Integration and Shared Utilities
Daemon Boot and Runtime Integration
CLI Surface and Client
SDK / Codegen
Sequence Diagram(s)sequenceDiagram
participant Client
participant HTTPAPI
participant Core
participant Store
rect rgba(100, 150, 200, 0.5)
Note over Client,HTTPAPI: Memory Create Flow
Client->>HTTPAPI: POST /api/memory (MemoryCreateRequest)
HTTPAPI->>Core: WriteMemory handler
Core->>Store: Create entry (scope/workspace/agent)
Store-->>Core: MemoryMutationDecisionResponse
Core-->>HTTPAPI: Decision response
HTTPAPI-->>Client: Applied=true + metadata
end
sequenceDiagram
participant Client
participant HTTPAPI
participant Core
participant Store
rect rgba(150, 100, 200, 0.5)
Note over Client,HTTPAPI: Memory Search Flow
Client->>HTTPAPI: POST /api/memory/search (MemorySearchRequest)
HTTPAPI->>Core: SearchMemory handler
Core->>Store: Recall query (weights/topk)
Store-->>Core: MemorySearchResponse (results)
Core-->>HTTPAPI: Ranked results
HTTPAPI-->>Client: Search results
end
sequenceDiagram
participant Client
participant HTTPAPI
participant Core
participant Extractor
participant Providers
rect rgba(100, 200, 150, 0.5)
Note over Client,HTTPAPI: Dream Trigger Flow
Client->>HTTPAPI: POST /api/memory/dreams/trigger
HTTPAPI->>Core: TriggerMemoryDream handler
Core->>Providers: Check/select provider
Core->>Extractor: Check extractor status
Extractor-->>Core: Status
Providers-->>Core: Provider selection
Core-->>HTTPAPI: MemoryDreamTriggerResponse
HTTPAPI-->>Client: Trigger result
end
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
|
There was a problem hiding this comment.
Actionable comments posted: 13
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
internal/cli/client_test.go (1)
3297-3315:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winThis parity check marshals the same type twice.
sharedMemoryRequestis inferred asMemoryCreateRequest, so this comparison can never catch drift fromcontract.MemoryCreateRequest.💡 Suggested fix
- var sharedMemoryRequest = memoryRequest + var sharedMemoryRequest contract.MemoryCreateRequest = memoryRequest🤖 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/cli/client_test.go` around lines 3297 - 3315, The test currently marshals the same local type twice (MemoryCreateRequest) so it cannot detect drift against the contract type; change the second instance to explicitly use the contract type (e.g., memcontract.MemoryCreateRequest) for sharedMemoryRequest, populate its fields to match the CLI MemoryCreateRequest, then json.Marshal that contract instance and compare cliMemoryJSON to sharedMemoryJSON (variables cliMemoryJSON/sharedMemoryJSON) to validate parity.internal/api/core/memory_workspace_test.go (1)
356-377:⚠️ Potential issue | 🟠 Major | ⚡ Quick winClose recall signal recorders for the manual stores too.
These two tests call
Search()on stores that never getCloseRecallSignalRecorders(). Sincesetup()needed explicit cleanup for the same lifecycle, these cases can still leak goroutines/file handles and make the suite flaky under parallel runs.Suggested fix
store := memory.NewStore( filepath.Join(baseDir, "global"), memory.WithCatalogDatabasePath(filepath.Join(baseDir, "agh.db")), ).ForWorkspace(workspace) + t.Cleanup(func() { + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + if err := store.CloseRecallSignalRecorders(ctx); err != nil { + t.Fatalf("CloseRecallSignalRecorders() error = %v", err) + } + }) if err := store.EnsureDirs(); err != nil { t.Fatalf("EnsureDirs() error = %v", err) }Apply the same cleanup in both manual-store test setups.
Also applies to: 409-429
🤖 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/memory_workspace_test.go` around lines 356 - 377, The tests create manual stores via memory.NewStore(...).ForWorkspace(workspace) and call EnsureDirs/Write/Search but never call CloseRecallSignalRecorders(), which can leak goroutines/handles; fix by adding a deferred cleanup (prefer t.Cleanup) to invoke store.CloseRecallSignalRecorders() (and Close if applicable) after setup in the test that uses ForWorkspace(workspace) and repeat the same change for the other manual-store test (the one around the other block mentioned), ensuring the recorder is closed regardless of test outcome.internal/api/udsapi/udsapi_integration_test.go (1)
335-353:⚠️ Potential issue | 🟠 Major | ⚡ Quick winAssert the workspace identifier passed into the dream trigger.
This route test only checks
calls == 1, whileintegrationDreamTrigger.Triggerdrops the workspace argument. The test will still pass if/api/memory/dreams/triggerforwards the wrong identifier type or no identifier at all, which leaves the new Memory v2 contract path effectively unverified.As per coding guidelines, "MUST test meaningful business logic, not trivial operations".Suggested fix
func TestUDSMemoryRoundTripAndConsolidate(t *testing.T) { runtime := newIntegrationRuntime(t) + + resolveResp := mustUnixRequest( + t, + runtime.client, + http.MethodPost, + "http://unix/api/workspaces/resolve", + []byte(`{"path":"`+runtime.workspace+`"}`), + nil, + ) + if resolveResp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resolveResp.Body) + _ = resolveResp.Body.Close() + t.Fatalf("resolve workspace status = %d, want %d; body=%s", resolveResp.StatusCode, http.StatusOK, string(body)) + } + var resolved contract.WorkspaceResponse + decodeHTTPJSON(t, resolveResp, &resolved) writeResp := mustUnixRequest( t, runtime.client, @@ resp := mustUnixRequest( t, runtime.client, http.MethodPost, "http://unix/api/memory/dreams/trigger", - []byte(`{"workspace_id":"`+runtime.workspace+`"}`), + []byte(`{"workspace_id":"`+resolved.Workspace.ID+`"}`), nil, ) @@ - if !payload.Triggered || runtime.dream.calls != 1 { + if !payload.Triggered || runtime.dream.calls != 1 || runtime.dream.workspaceID != resolved.Workspace.ID { t.Fatalf("payload = %#v dream.calls=%d, want triggered once", payload, runtime.dream.calls) } } type integrationDreamTrigger struct { enabled bool triggered bool reason string last time.Time calls int + workspaceID string } @@ -func (t *integrationDreamTrigger) Trigger(context.Context, string) (bool, string, error) { +func (t *integrationDreamTrigger) Trigger(_ context.Context, workspaceID string) (bool, string, error) { t.calls++ + t.workspaceID = workspaceID return t.triggered, t.reason, nil }Also applies to: 2557-2559
🤖 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/udsapi/udsapi_integration_test.go` around lines 335 - 353, The test currently only asserts runtime.dream.calls but doesn't verify the workspace id sent; update the test after decodeHTTPJSON to also assert that the fake handler received the expected workspace by comparing runtime.dream.<field-that-records-workspace> (or add such a field to integrationDreamTrigger.Trigger if missing) against runtime.workspace, e.g. fail the test if they differ, and keep the existing assertions on payload. Ensure you reference the runtime.dream recorder used by the fake Trigger implementation so the test fails when the route forwards the wrong or missing workspace identifier.
🧹 Nitpick comments (1)
internal/daemon/boot.go (1)
1867-1872: 💤 Low valueConditional assignment can be simplified
The assignment pattern on lines 1869-1872 can be simplified. The explicit nil assignment before the conditional is unnecessary since Go initializes pointers to nil by default.
♻️ Simplified assignment
d.memoryExtractor = state.memoryExtractor -d.localMemoryProvider = nil -if state.localMemoryProvider != nil { - d.localMemoryProvider = state.localMemoryProvider -} +d.localMemoryProvider = state.localMemoryProvider🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/daemon/boot.go` around lines 1867 - 1872, The code redundantly sets d.localMemoryProvider = nil before conditionally assigning state.localMemoryProvider; simplify by removing the explicit nil and directly assign d.localMemoryProvider = state.localMemoryProvider (leave the existing assignments to d.memoryProviderRegistry and d.memoryExtractor unchanged) so the pointer is set correctly in one statement using the unique symbols d.localMemoryProvider and state.localMemoryProvider.
🤖 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/contract/memory.go`:
- Around line 503-507: The MemoryProviderLifecycleRequest struct currently
contains Name and Reason which allows two different identifiers for the same
lifecycle call; remove the Name field from MemoryProviderLifecycleRequest so
lifecycle requests only carry Reason (and rely on the provider path/ID from
routing/client surface), then update all handlers and callers that previously
read MemoryProviderLifecycleRequest.Name (e.g., your enable/disable provider
handlers and any client code constructing this request) to use the route/path
provider identifier instead; also update tests and any JSON serialization
expectations accordingly.
In `@internal/api/contract/settings.go`:
- Around line 348-350: The SettingsMemoryWorkspacePayload struct change removed
legacy fields (enabled, global_dir, dream) and will break clients; restore
backward compatibility by either (A) adding the old fields back into
SettingsMemoryWorkspacePayload (enabled bool, global_dir string, dream string)
alongside the new TOMLPath and AutoCreate so deserialization preserves both
shapes, or (B) introduce a versioned envelope struct (e.g., SettingsWorkspaceV1
and SettingsWorkspaceV2) and update the API handler/serializer to emit a version
tag and marshal/unmarshal the appropriate struct; locate the
SettingsMemoryWorkspacePayload type and the related serializer/deserializer code
paths to implement one of these options.
In `@internal/api/core/memory_services_test.go`:
- Around line 54-79: The tests call performRequest and immediately decode bodies
(variables failuresResp, retryResp, drainResp) which can mask HTTP errors;
before decoding each response for the memory extractor endpoints
("/memory/extractor/failures", "/memory/extractor/retry",
"/memory/extractor/drain") assert resp.Code == http.StatusOK (use the response
objects failuresResp, retryResp, drainResp) and fail the test if not OK, then
proceed to decode into contract.MemoryExtractorFailuresResponse,
contract.MemoryExtractorRetryResponse and contract.MemoryExtractorDrainResponse;
apply the same pattern to the other test blocks referenced (lines ~95-121 and
~152-170) so every handler call checks status code before decoding.
In `@internal/api/httpapi/httpapi_integration_test.go`:
- Around line 3434-3441: The test builds JSON request bodies via string
concatenation (see the mustHTTPRequest call that injects runtime.workspace and
other variables), which breaks on Windows (backslashes) and with quotes/newlines
in message; instead, create a Go value (struct or map) for the request body,
marshal it with json.Marshal, and pass the resulting bytes to mustHTTPRequest;
update the two occurrences referenced (around the mustHTTPRequest that posts to
"/api/sessions" and the other block at lines ~3555-3562) to use e.g. a
map{"agent_name": "coder", "workspace_path": runtime.workspace} and json.Marshal
so inputs are properly escaped.
- Around line 1574-1596: The test currently only checks for HTTP 401 but not the
response payload; update the invalid webhook assertion to read and decode the
response body from invalidResp (use io.ReadAll on invalidResp.Body and close
it), unmarshal the JSON into the project's error response shape (or a small
local struct with fields like Code and Message), and assert that the error
payload indicates a signature-validation failure (e.g., error code/message
referencing invalid webhook signature) for the request sent with
core.WebhookSignatureHeader = "sha256=deadbeef"; keep the status code assertion
and add explicit checks on the decoded fields to ensure the contract for
signature validation is enforced.
- Around line 1254-1271: The test currently only checks payload.Triggered and
runtime.dream.calls, which lets a handler ignore workspace_id; modify the POST
to include the scope/workspace in the JSON (add "scope" or "workspace_id" field
alongside workspace_id already present), extend memoryDreamTriggerResponse (or
inspect the decoded payload) to include the returned scope field if the endpoint
echoes it, and update the dream stub used by runtime.dream to record the
workspace argument it received (add a recordedWorkspace field or similar) so the
test can assert that runtime.dream.recordedWorkspace == runtime.workspace; keep
the existing checks for payload.Triggered and runtime.dream.calls but add an
explicit equality assertion for the recorded workspace to ensure the correct
target was triggered.
In `@internal/api/udsapi/routes.go`:
- Around line 278-310: Add a backward-compatibility path: keep the current new
handlers but add aliases that preserve the old unversioned endpoints and/or
introduce a versioned prefix for the new surface. Concretely, create a v2 group
(e.g., memoryV2) and move the new handlers (ReadMemory, WriteMemory,
SearchMemory, ReindexMemory, PromoteMemory, EditMemory, DeleteMemory, etc.)
under "/v2/memory"; then add compatibility routes on the original unversioned
group that map the legacy endpoints to the appropriate current handlers — e.g.,
register PUT("/:filename") to the handler that previously served file writes
(WriteMemory or EditMemory as appropriate), GET("/search") -> SearchMemory, and
POST("/consolidate") -> ReindexMemory (or the exact handler that implements
consolidation), so existing clients keep working while new clients use
/v2/memory during the migration window.
In `@internal/api/udsapi/udsapi_integration_test.go`:
- Around line 2942-2948: The helpers createIntegrationSession and sendPrompt
currently construct request bodies by concatenating strings (e.g., embedding
runtime.workspace or the prompt directly into JSON) and ignore response
read/close errors; replace hand-built JSON with proper encoding using
encoding/json (marshal a struct or map) when building the POST body in
mustUnixRequest calls inside createIntegrationSession and sendPrompt to ensure
proper quoting/escaping, and ensure all response bodies are closed and
io.ReadAll errors are checked and returned/handled (do not use blank identifier
for errors) so callers receive and can assert on real errors.
In `@internal/cli/client_test.go`:
- Around line 1376-1398: The stub responses for ShowMemory, CreateMemory,
DeleteMemory, and TriggerMemoryDream must validate incoming request shape;
update the matching cases in internal/cli/client_test.go to assert the query
params and JSON body fields (e.g., for ShowMemory ensure
req.URL.Query().Get("scope") and workspace_id when required; for CreateMemory
parse req.Body and assert required fields like frontmatter.name/type, scope,
workspace_id or content; for DeleteMemory assert scope query equals "workspace"
already shown and add any required workspace_id; for TriggerMemoryDream parse
body and assert scope and workspace_id/payload fields). Use the existing pattern
(read and decode req.Body, compare values and call t.Fatalf on mismatch)
consistent with the SearchMemory/ReindexMemory assertions to make the tests fail
on regressions.
In `@internal/cli/memory.go`:
- Line 1000: The variable fromDLQ is being captured but then suppressed with a
blank identifier assignment (`_ = fromDLQ`), leaving an incomplete
implementation; remove the dummy assignment and either use the fromDLQ flag in
the memory command flow (e.g., pass it into the function that lists/filters
memories or DLQ handling logic where flags like fromDLQ were intended) or, if
the flag is not needed, remove its capture/definition entirely (search for the
fromDLQ variable and the surrounding flag parsing/handler code to apply the
fix).
- Line 552: The includeSystem boolean flag is captured but then discarded with
`_ = includeSystem`; either remove the flag registration entirely or actually
use includeSystem when querying/filtering memories. Locate the flag variable
`includeSystem` and either delete its declaration and any flag registration
code, or thread it into the memory listing/query call (e.g., pass
`includeSystem` into the function that fetches memories such as the memory
query/list function) and ensure the query logic respects the flag to include or
exclude system memories.
In `@internal/config/bootstrap.go`:
- Around line 57-61: The migration only handles empty or legacy ("claude")
values; extend the condition that sets dreamAgent so it also treats the old
bootstrap-managed agent value as needing migration: when
current.Memory.Dream.Agent is empty, equals legacyDreamAgentName, or equals the
previous bootstrap agent constant (e.g. DefaultAgentName), set dreamAgent =
DefaultMemoryDreamAgentName; update the conditional around
current.Memory.Dream.Agent/dreamAgent in bootstrap.go accordingly.
In `@internal/config/config.go`:
- Around line 1944-1950: validateEnum currently lowercases/trims the input for
validation but leaves the original value in configs, causing downstream exact
comparisons to fail; change validateEnum to return the canonicalized value along
with error (signature like validateEnum(path string, value string, allowed
...string) (string, error)) and have the function normalize
(strings.ToLower/strings.TrimSpace) and return that normalized string when
validation passes, or return an error for invalid input; update all callers to
assign the returned canonical value into the config fields (or alternatively
enforce canonical literals by comparing against the provided allowed slice
without lowercasing and return an explicit error), ensuring the config stores
the normalized/canonical enum rather than the original input.
---
Outside diff comments:
In `@internal/api/core/memory_workspace_test.go`:
- Around line 356-377: The tests create manual stores via
memory.NewStore(...).ForWorkspace(workspace) and call EnsureDirs/Write/Search
but never call CloseRecallSignalRecorders(), which can leak goroutines/handles;
fix by adding a deferred cleanup (prefer t.Cleanup) to invoke
store.CloseRecallSignalRecorders() (and Close if applicable) after setup in the
test that uses ForWorkspace(workspace) and repeat the same change for the other
manual-store test (the one around the other block mentioned), ensuring the
recorder is closed regardless of test outcome.
In `@internal/api/udsapi/udsapi_integration_test.go`:
- Around line 335-353: The test currently only asserts runtime.dream.calls but
doesn't verify the workspace id sent; update the test after decodeHTTPJSON to
also assert that the fake handler received the expected workspace by comparing
runtime.dream.<field-that-records-workspace> (or add such a field to
integrationDreamTrigger.Trigger if missing) against runtime.workspace, e.g. fail
the test if they differ, and keep the existing assertions on payload. Ensure you
reference the runtime.dream recorder used by the fake Trigger implementation so
the test fails when the route forwards the wrong or missing workspace
identifier.
In `@internal/cli/client_test.go`:
- Around line 3297-3315: The test currently marshals the same local type twice
(MemoryCreateRequest) so it cannot detect drift against the contract type;
change the second instance to explicitly use the contract type (e.g.,
memcontract.MemoryCreateRequest) for sharedMemoryRequest, populate its fields to
match the CLI MemoryCreateRequest, then json.Marshal that contract instance and
compare cliMemoryJSON to sharedMemoryJSON (variables
cliMemoryJSON/sharedMemoryJSON) to validate parity.
---
Nitpick comments:
In `@internal/daemon/boot.go`:
- Around line 1867-1872: The code redundantly sets d.localMemoryProvider = nil
before conditionally assigning state.localMemoryProvider; simplify by removing
the explicit nil and directly assign d.localMemoryProvider =
state.localMemoryProvider (leave the existing assignments to
d.memoryProviderRegistry and d.memoryExtractor unchanged) so the pointer is set
correctly in one statement using the unique symbols d.localMemoryProvider and
state.localMemoryProvider.
🪄 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: 3210468e-ba9d-4b11-ab7c-65a749a27f57
⛔ Files ignored due to path filters (80)
internal/memory/prompts/what_not_to_save.v1.mdis excluded by!**/*.mdinternal/skills/bundled/skills/agh-memory-guide/SKILL.mdis excluded by!**/*.mdinternal/testutil/acpmock/testdata/bridge_ingress_fixture.jsonis excluded by!**/*.jsoninternal/testutil/acpmock/testdata/browser_session_lifecycle_fixture.jsonis excluded by!**/*.jsoninternal/testutil/acpmock/testdata/driver_fault_fixture.jsonis excluded by!**/*.jsoninternal/testutil/acpmock/testdata/permission_env_fixture.jsonis excluded by!**/*.jsoninternal/testutil/acpmock/testdata/tool_permission_fixture.jsonis excluded by!**/*.jsonopenapi/agh.jsonis excluded by!**/*.jsonpackages/site/content/runtime/api-reference/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/agh.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/adhoc/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/adhoc/list.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/adhoc/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/memory/adhoc/show.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/daily/archive.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/daily/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/daily/ls.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/daily/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/memory/daily/purge.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/daily/restore.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/daily/show.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/decisions/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/decisions/list.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/decisions/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/memory/decisions/revert.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/decisions/show.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/delete.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/dream/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/dream/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/memory/dream/retry.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/dream/show.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/dream/status.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/dream/trigger.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/edit.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/extractor/disable.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/extractor/drain.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/extractor/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/extractor/list-pending.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/extractor/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/memory/extractor/replay.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/extractor/status.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/health.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/history.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/list.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/memory/promote.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/provider/disable.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/provider/enable.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/provider/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/provider/list.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/provider/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/memory/recall/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/recall/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/memory/recall/trace.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/reindex.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/reload.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/reset.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/scope-show.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/search.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/show.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/write.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/observe/events.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/task/run/enqueue.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/configuration/config-toml.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/configuration/file-locations.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/extensions/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/hooks/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/memory/best-practices.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/memory/dream.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/memory/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/memory/scopes.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/memory/system.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/sessions/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/skills/bundled.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/tools/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/workspaces/resolver.mdxis excluded by!**/*.mdxsdk/typescript/src/generated/contracts.tsis excluded by!**/generated/**web/src/generated/agh-openapi.d.tsis excluded by!**/generated/**
📒 Files selected for processing (220)
go.modinternal/api/contract/contract_test.gointernal/api/contract/memory.gointernal/api/contract/settings.gointernal/api/core/conversions.gointernal/api/core/error_paths_test.gointernal/api/core/errors.gointernal/api/core/handlers.gointernal/api/core/interfaces.gointernal/api/core/memory.gointernal/api/core/memory_services_test.gointernal/api/core/memory_workspace_test.gointernal/api/core/more_coverage_test.gointernal/api/core/prompt_stream.gointernal/api/core/settings.gointernal/api/core/settings_internal_test.gointernal/api/core/settings_test.gointernal/api/core/sse.gointernal/api/core/sse_hygiene_test.gointernal/api/core/test_helpers_test.gointernal/api/httpapi/handlers.gointernal/api/httpapi/handlers_test.gointernal/api/httpapi/httpapi_integration_test.gointernal/api/httpapi/memory_test.gointernal/api/httpapi/routes.gointernal/api/httpapi/server.gointernal/api/httpapi/shared_test.gointernal/api/spec/spec.gointernal/api/spec/spec_test.gointernal/api/testutil/memory_routes.gointernal/api/udsapi/handlers_test.gointernal/api/udsapi/memory_test.gointernal/api/udsapi/routes.gointernal/api/udsapi/server.gointernal/api/udsapi/shared_test.gointernal/api/udsapi/transport_parity_integration_test.gointernal/api/udsapi/udsapi_integration_test.gointernal/cli/client.gointernal/cli/client_test.gointernal/cli/config.gointernal/cli/format.gointernal/cli/helpers_test.gointernal/cli/memory.gointernal/cli/memory_test.gointernal/codegen/sdkts/generate.gointernal/config/bootstrap.gointernal/config/bootstrap_test.gointernal/config/config.gointernal/config/config_test.gointernal/config/memory_v2_config_test.gointernal/config/merge.gointernal/config/tool_surface.gointernal/config/tool_surface_test.gointernal/daemon/boot.gointernal/daemon/boundary.gointernal/daemon/daemon.gointernal/daemon/daemon_memory_e2e_integration_test.gointernal/daemon/daemon_test.gointernal/daemon/hooks_bridge.gointernal/daemon/memory_runtime.gointernal/daemon/native_tools.gointernal/daemon/native_tools_test.gointernal/daemon/notifier_test.gointernal/daemon/prompt_input_composite_test.gointernal/daemon/settings.gointernal/extension/contract/host_api.gointernal/extension/contract/sdk.gointernal/extension/host_api.gointernal/extension/host_api_bridges.gointernal/extension/host_api_test.gointernal/extension/memory_provider_registry.gointernal/extension/memory_provider_registry_test.gointernal/fileutil/atomic.gointernal/fileutil/atomic_memv2_test.gointernal/hooks/async_clone.gointernal/hooks/dispatch.gointernal/hooks/dispatch_events.gointernal/hooks/events.gointernal/hooks/events_test.gointernal/hooks/hooks_test.gointernal/hooks/introspection.gointernal/hooks/matcher.gointernal/hooks/payloads.gointernal/hooks/payloads_test.gointernal/memory/assembler.gointernal/memory/assembler_test.gointernal/memory/catalog.gointernal/memory/consolidation/runtime.gointernal/memory/consolidation/runtime_test.gointernal/memory/contract/contract_test.gointernal/memory/contract/doc.gointernal/memory/contract/enums.gointernal/memory/contract/types.gointernal/memory/controller/controller.gointernal/memory/controller/controller_test.gointernal/memory/decision.gointernal/memory/document.gointernal/memory/dream.gointernal/memory/dream_test.gointernal/memory/dream_v2.gointernal/memory/extractor/events.gointernal/memory/extractor/inbox.gointernal/memory/extractor/runtime.gointernal/memory/extractor/runtime_test.gointernal/memory/extractor_events.gointernal/memory/extractor_events_test.gointernal/memory/interfaces_test.gointernal/memory/observability.gointernal/memory/observability_test.gointernal/memory/perf_bench_test.gointernal/memory/prompts/decide.v1.tmplinternal/memory/prompts/doc.gointernal/memory/prompts/dream.v1.tmplinternal/memory/prompts/extract.v1.tmplinternal/memory/prompts/registry.gointernal/memory/prompts/registry_test.gointernal/memory/provider/local/memstore/memstore.gointernal/memory/provider/local/memstore/memstore_test.gointernal/memory/provider/local/provider.gointernal/memory/provider/local/provider_test.gointernal/memory/query_records.gointernal/memory/recall.gointernal/memory/recall/recall.gointernal/memory/recall/recall_test.gointernal/memory/recall/signal_recorder.gointernal/memory/recall/signal_recorder_test.gointernal/memory/recall_source.gointernal/memory/recall_test.gointernal/memory/replay.gointernal/memory/scan/doc.gointernal/memory/scan/scan.gointernal/memory/scan/scan_test.gointernal/memory/snapshot.gointernal/memory/store.gointernal/memory/store_memv2_test.gointernal/memory/store_test.gointernal/memory/types.gointernal/observe/observer.gointernal/observe/observer_test.gointernal/observe/query.gointernal/resources/kernel.gointernal/resources/kernel_test.gointernal/session/hooks.gointernal/session/interfaces.gointernal/session/ledger.gointernal/session/ledger_test.gointernal/session/manager.gointernal/session/manager_hooks.gointernal/session/manager_hooks_test.gointernal/session/manager_lifecycle.gointernal/session/manager_prompt.gointernal/session/query.gointernal/session/query_test.gointernal/session/spawn.gointernal/session/spawn_test.gointernal/sessions/ledger/materializer.gointernal/sessions/ledger/materializer_test.gointernal/settings/sections.gointernal/settings/service_test.gointernal/skills/registry.gointernal/sse/decode_test.gointernal/sse/scrub.gointernal/store/globaldb/global_db.gointernal/store/globaldb/global_db_heartbeat_test.gointernal/store/globaldb/global_db_observe.gointernal/store/globaldb/global_db_soul_test.gointernal/store/globaldb/global_db_test.gointernal/store/globaldb/global_db_workspace.gointernal/store/memv2_coverage_test.gointernal/store/schema.gointernal/store/sessiondb/session_db.gointernal/store/sessiondb/session_db_extra_test.gointernal/store/store_helpers_test.gointernal/store/types.gointernal/store/workspacedb/workspace_db.gointernal/store/workspacedb/workspace_db_test.gointernal/store/write.gointernal/store/write_test.gointernal/testutil/acpmock/cmd/acpmock-driver/main.gointernal/testutil/acpmock/cmd/acpmock-driver/main_test.gointernal/testutil/acpmock/fixture.gointernal/testutil/acpmock/fixture_test.gointernal/tools/builtin/builtin_test.gointernal/tools/builtin/memory.gointernal/tools/builtin/toolsets.gointernal/tools/builtin_ids.gointernal/tools/dispatch.gointernal/tools/native.gointernal/tools/reason.gointernal/tools/tool.gointernal/workspace/clone.gointernal/workspace/helpers.gointernal/workspace/identity.gointernal/workspace/identity_test.gointernal/workspace/resolver.gointernal/workspace/resolver_crud.gointernal/workspace/resolver_test.gointernal/workspace/workspace.gointernal/workspace/workspace_test.gomagefile.gopackages/site/components/landing/__tests__/landing.test.tsxpackages/site/components/landing/memory-dream-section.tsxpackages/site/lib/memory-v2-qa-artifacts.test.tspackages/site/lib/runtime-docs-discovery.test.tspackages/site/lib/runtime-docs-truth.test.tspackages/site/lib/runtime-manual-cli-examples.test.tspackages/site/scripts/generate-openapi.tspackages/ui/src/components/stories/accordion.stories.tsxsdk/typescript/src/integration.test.tssdk/typescript/vitest.config.tsweb/e2e/bridges.spec.tsweb/src/hooks/routes/use-knowledge-page.test.tsxweb/src/hooks/routes/use-knowledge-page.tsweb/src/hooks/routes/use-settings-memory-page.test.tsxweb/src/hooks/routes/use-settings-memory-page.tsweb/src/lib/memory-api-contract.test.tsweb/src/routes/_app/-agents.$name.sessions.$id.test.tsxweb/src/routes/_app/-knowledge.test.tsxweb/src/routes/_app/agents.$name.sessions.$id.tsxweb/src/routes/_app/knowledge.tsx
There was a problem hiding this comment.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
internal/config/config.go (1)
1613-1618:⚠️ Potential issue | 🟠 Major | ⚡ Quick winAdd NaN and infinity checks to float64 threshold validations.
NaNandInfslip through the current checks because IEEE-754 comparison semantics make all ordering comparisons (<,>,<=,>=) return false when either operand isNaN. This lets invalid config pass validation and corrupt downstream scoring and scheduling logic.Two vulnerable fields need protection:
MinHours(float64) inDreamConfig.Validate(): line 1614 check should verify finitenessMinScore(float64) inMemoryDreamGatesConfig.Validate(): line 1830 check should verify finitenessThe codebase already has a
validateWeight()helper (line 1962) that implements the correct pattern; use it forMinScore. ForMinHours, add explicitmath.IsNaN()andmath.IsInf()checks before the range check.Suggested fix
func (c DreamConfig) Validate() error { if !c.Enabled { return nil } if strings.TrimSpace(c.Agent) == "" { return errors.New("memory.dream.agent is required") } - if c.MinHours <= 0 { - return fmt.Errorf("memory.dream.min_hours must be positive: %v", c.MinHours) + if math.IsNaN(c.MinHours) || math.IsInf(c.MinHours, 0) || c.MinHours <= 0 { + return fmt.Errorf("memory.dream.min_hours must be positive and finite: %v", c.MinHours) }func (c MemoryDreamGatesConfig) Validate() error { if c.MinUnpromoted <= 0 { return fmt.Errorf("memory.dream.gates.min_unpromoted must be positive: %d", c.MinUnpromoted) } if c.MinRecallCount <= 0 { return fmt.Errorf("memory.dream.gates.min_recall_count must be positive: %d", c.MinRecallCount) } - if c.MinScore < 0 || c.MinScore > 1 { - return fmt.Errorf("memory.dream.gates.min_score must be between 0 and 1: %v", c.MinScore) + if err := validateWeight("memory.dream.gates.min_score", c.MinScore); err != nil { + return err } return nil }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/config/config.go` around lines 1613 - 1618, The MinHours float validation in DreamConfig.Validate currently only checks <=0 and misses NaN/Inf; update DreamConfig.Validate to first check math.IsNaN(c.MinHours) || math.IsInf(c.MinHours, 0) and return an error if so, then perform the existing <=0 range check on c.MinHours; for MinScore in MemoryDreamGatesConfig.Validate, replace the manual numeric check with a call to the existing validateWeight(name, value) helper (or call validateWeight("memory.dream.min_score", c.MinScore)) so NaN/Inf and range are handled consistently via validateWeight.internal/cli/client_test.go (1)
3320-3338:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winUse an explicit shared-contract value in this parity check.
sharedMemoryRequest := memoryRequestmarshals the CLI type twice, so this stays green even ifMemoryCreateRequestdrifts fromcontract.MemoryCreateRequest.As per coding guidelines "MUST test meaningful business logic, not trivial operations".💡 Minimal fix
- var sharedMemoryRequest = memoryRequest + sharedMemoryRequest := contract.MemoryCreateRequest{ + Scope: memoryRequest.Scope, + WorkspaceID: memoryRequest.WorkspaceID, + Type: memoryRequest.Type, + Name: memoryRequest.Name, + Content: memoryRequest.Content, + }🤖 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/cli/client_test.go` around lines 3320 - 3338, The test currently assigns sharedMemoryRequest := memoryRequest which just copies the CLI type and makes the JSON parity check vacuous; instead construct an explicit shared-contract instance (e.g. memcontract.MemoryCreateRequest) with the same field values as the CLI MemoryCreateRequest and marshal that for comparison. Update the code to build a memcontract.MemoryCreateRequest (setting Scope, WorkspaceID, Type, Name, Content to the same values) into sharedMemoryRequest, marshal it to sharedMemoryJSON, and then keep the bytes.Equal assertion to ensure real parity between the CLI type (MemoryCreateRequest) and the shared contract type (memcontract.MemoryCreateRequest).
🧹 Nitpick comments (1)
internal/cli/memory.go (1)
47-57: ⚡ Quick winPreserve agent tier in memory search output.
memorySearchItemdropsAgentTier, and the renderers printstring(item.Scope). That makesagent:workspaceandagent:globalresults both show up as justagent, unlike the other memory commands.Suggested fix
type memorySearchItem struct { Filename string `json:"filename"` Name string `json:"name"` Type memcontract.Type `json:"type"` Scope memcontract.Scope `json:"scope"` + AgentTier memcontract.AgentTier `json:"agent_tier,omitempty"` Score float64 `json:"score"` Snippet string `json:"snippet,omitempty"` WhyRecalled []string `json:"why_recalled,omitempty"` ShadowedBy string `json:"shadowed_by,omitempty"` AlreadyShown bool `json:"already_shown"` StalenessNote string `json:"staleness_banner,omitempty"` } @@ items = append(items, memorySearchItem{ Filename: result.Memory.Filename, Name: result.Memory.Name, Type: result.Memory.Type, Scope: result.Memory.Scope, + AgentTier: result.Memory.AgentTier, Score: result.Score, Snippet: result.Snippet, WhyRecalled: result.WhyRecalled, ShadowedBy: result.ShadowedBy, AlreadyShown: result.AlreadyShown, @@ func(item memorySearchItem) []string { return []string{ stringOrDash(item.Filename), stringOrDash(item.Name), - stringOrDash(string(item.Scope)), + stringOrDash(memoryScopeLabel(item.Scope, item.AgentTier)), fmt.Sprintf("%.2f", item.Score), stringOrDash(item.Snippet), } }, func(item memorySearchItem) []string { - return []string{item.Filename, item.Name, string(item.Scope), fmt.Sprintf("%.2f", item.Score), item.Snippet} + return []string{ + item.Filename, + item.Name, + memoryScopeLabel(item.Scope, item.AgentTier), + fmt.Sprintf("%.2f", item.Score), + item.Snippet, + } }, )Also applies to: 1500-1539
🤖 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/cli/memory.go` around lines 47 - 57, The memorySearchItem struct drops AgentTier which causes agent-scoped results to render identically; add an AgentTier field (use the existing memcontract.AgentTier type or string) to memorySearchItem and populate it where items are constructed, then update the renderers that currently call string(item.Scope) to include/format item.AgentTier when Scope==memcontract.ScopeAgent (or always include AgentTier for agent scopes) so results show agent:workspace vs agent:global correctly; update any JSON tags (e.g., `agent_tier` or `agent_tier,omitempty`) to match existing conventions.
🤖 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/memory.go`:
- Around line 75-83: ListMemory currently always returns system memories; update
it (and the corresponding show handler) to honor the include_system flag by
reading the query param (or the flag set by memorySelectorFromQuery) and
filtering out entries whose name starts with "_system" when include_system is
false. Concretely: in BaseHandlers.ListMemory (and the memory show handler) use
the selector returned by memorySelectorFromQuery or c.Query("include_system") to
determine include_system, call listMemoryHeaders as you already do, then if
include_system is false remove any headers with names starting with "_system"
before converting with memorySummaryPayloads and returning; ensure the same
check is applied in the single-memory show path so system-managed entries are
only returned when include_system is true.
- Around line 1549-1567: memoryRecallStoreForSelector currently calls
store.ForWorkspace(resolved.Workspace) and store.ForAgent(...) whenever
resolved.Workspace or resolved.AgentName are set, which incorrectly routes
explicit global selectors into a workspace-local store; update the logic after
resolveMemorySelector so you only call ForWorkspace when resolved.Workspace is
non-empty AND not equal to the global sentinel (e.g., "global"), and only call
ForAgent when resolved.AgentName is non-empty AND not equal to the agent-global
sentinel (e.g., "global"); keep using resolved.WorkspaceID/resolved.AgentTier as
before but guard the ForWorkspace and ForAgent calls against the global values
to preserve true global scope.
In `@internal/api/httpapi/httpapi_integration_test.go`:
- Around line 81-92: The test currently only checks statusResp.StatusCode after
calling mustHTTPRequest for GET "/api/daemon/status" and immediately closes
statusResp.Body, so it doesn't validate the JSON payload; update the test in
httpapi_integration_test.go to read and decode statusResp.Body (from the
mustHTTPRequest call using runtime.client and runtime.host/runtime.port) into a
struct/map and assert that the response contains a "daemon" field (and any
expected subfields) before closing the body; use the existing statusResp
variable and fail the test with t.Fatalf or t.Errorf if decoding fails or the
"daemon" field is missing/incorrect.
- Around line 1282-1283: The test references memcontract.ScopeWorkspace but the
package is not imported; add an import for the memcontract package in
internal/api/httpapi/httpapi_integration_test.go (so memcontract.ScopeWorkspace
can be resolved) — update the import block that contains the test functions
(where runtime.workspace and payload.Dream are used) to include the memcontract
package name.
In `@internal/cli/memory.go`:
- Around line 1010-1035: The --timeout flag is only validated but not applied;
update newMemoryExtractorDrainCommand to parse timeoutRaw into a time.Duration,
derive a timed context via context.WithTimeout(ctx, duration) (remember to defer
cancel()), and pass that timed context to client.DrainMemoryExtractor instead of
cmd.Context(); keep validating the parse error as already done and ensure the
default "60s" is honored when timeoutRaw is empty or whitespace. Reference
symbols: newMemoryExtractorDrainCommand, timeoutRaw,
client.DrainMemoryExtractor, cmd.Context(), and the deferred cancel for the
created context.
In `@internal/config/config.go`:
- Around line 1679-1710: The validator currently normalizes origins for checking
but leaves MemoryControllerPolicyConfig.AllowOrigins unchanged, causing later
exact-match checks to fail; change Validate to accept a pointer receiver (func
(c *MemoryControllerPolicyConfig) Validate() error) and, inside the loop over
c.AllowOrigins in Validate, replace each entry with its canonical form
(strings.ToLower(strings.TrimSpace(origin))) after validating it (use the same
allowedOrigins/seen logic), so the stored AllowOrigins are normalized for
downstream use.
---
Outside diff comments:
In `@internal/cli/client_test.go`:
- Around line 3320-3338: The test currently assigns sharedMemoryRequest :=
memoryRequest which just copies the CLI type and makes the JSON parity check
vacuous; instead construct an explicit shared-contract instance (e.g.
memcontract.MemoryCreateRequest) with the same field values as the CLI
MemoryCreateRequest and marshal that for comparison. Update the code to build a
memcontract.MemoryCreateRequest (setting Scope, WorkspaceID, Type, Name, Content
to the same values) into sharedMemoryRequest, marshal it to sharedMemoryJSON,
and then keep the bytes.Equal assertion to ensure real parity between the CLI
type (MemoryCreateRequest) and the shared contract type
(memcontract.MemoryCreateRequest).
In `@internal/config/config.go`:
- Around line 1613-1618: The MinHours float validation in DreamConfig.Validate
currently only checks <=0 and misses NaN/Inf; update DreamConfig.Validate to
first check math.IsNaN(c.MinHours) || math.IsInf(c.MinHours, 0) and return an
error if so, then perform the existing <=0 range check on c.MinHours; for
MinScore in MemoryDreamGatesConfig.Validate, replace the manual numeric check
with a call to the existing validateWeight(name, value) helper (or call
validateWeight("memory.dream.min_score", c.MinScore)) so NaN/Inf and range are
handled consistently via validateWeight.
---
Nitpick comments:
In `@internal/cli/memory.go`:
- Around line 47-57: The memorySearchItem struct drops AgentTier which causes
agent-scoped results to render identically; add an AgentTier field (use the
existing memcontract.AgentTier type or string) to memorySearchItem and populate
it where items are constructed, then update the renderers that currently call
string(item.Scope) to include/format item.AgentTier when
Scope==memcontract.ScopeAgent (or always include AgentTier for agent scopes) so
results show agent:workspace vs agent:global correctly; update any JSON tags
(e.g., `agent_tier` or `agent_tier,omitempty`) to match existing conventions.
🪄 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: 410b516c-f0e1-42a3-96ef-b2de767efaa2
⛔ Files ignored due to path filters (30)
.compozy/tasks/mem-v2/qa/test-cases/TC-INT-001.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-INT-002.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-INT-003.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-INT-004.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-INT-005.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-REG-001.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-SCEN-001.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-SCEN-002.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-SEC-001.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-UI-001.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-UI-002.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-cases/TC-UI-003.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-plans/memory-v2-regression.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-plans/memory-v2-test-plan.mdis excluded by!**/*.md.compozy/tasks/mem-v2/qa/test-plans/memory-v2-traceability.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_001.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_002.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_003.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_004.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_005.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_006.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_007.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_008.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_009.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_010.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_011.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_012.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_013.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-001/issue_014.mdis excluded by!**/*.mdopenapi/agh.jsonis excluded by!**/*.json
📒 Files selected for processing (12)
internal/api/contract/memory.gointernal/api/core/memory.gointernal/api/core/memory_services_test.gointernal/api/httpapi/httpapi_integration_test.gointernal/api/udsapi/udsapi_integration_test.gointernal/cli/client_test.gointernal/cli/memory.gointernal/cli/memory_test.gointernal/config/bootstrap.gointernal/config/bootstrap_test.gointernal/config/config.gointernal/config/memory_v2_config_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
- internal/cli/memory_test.go
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
internal/api/httpapi/memory_test.go (1)
77-156: 🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick winNormalize subtests to required
Should ...pattern and parallelize each subtestThe new subtests are missing the mandated naming format and per-subtest
t.Parallel(). Please apply this consistently to eacht.Runblock.Suggested update pattern
- t.Run("default list returns global scope", func(t *testing.T) { + t.Run("Should return global scope by default", func(t *testing.T) { + t.Parallel() resp := performRequest(t, engine, http.MethodGet, "/api/memory", nil) ... })As per coding guidelines, "Use
t.Run('Should ...')pattern for Go test subtests instead of flat test structures" and "Default tot.Parallelin Go tests unless there is a specific reason to disable it (opt-out witht.Setenv)."🤖 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/httpapi/memory_test.go` around lines 77 - 156, The subtests in memory_test.go (the t.Run blocks testing default list, scope filtering, workspace query, and include_system behavior) do not follow the required "Should ..." naming convention and are missing per-subtest t.Parallel() calls; update each t.Run invocation to use a name like "Should return global scope by default" / "Should filter to global when scope=global" / "Should filter to workspace when scope=workspace" / "Should include both scopes when workspace_id is provided" / "Should include system-managed entries when include_system=true" and add a t.Parallel() as the first line inside each subtest body (inside the closure) so each subtest runs in parallel while preserving existing assertions and use of performRequest, decodeJSONResponse, and the memoryListResponse checks.
🧹 Nitpick comments (2)
internal/cli/memory_test.go (1)
560-619: 💤 Low valueConsider grouping related assertions into subtests.
The
TestMemoryBundleHelpersfunction contains multiple independent assertions (e.g.,memoryScopeLabel,boolStatus,parseOptionalCLIMemoryScope) that could be organized intot.Run("Should...")subtests for clearer failure attribution and documentation.🤖 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/cli/memory_test.go` around lines 560 - 619, TestMemoryBundleHelpers contains many independent checks that should be split into identifiable subtests; refactor the test by wrapping each logical assertion group (e.g., the listBundle human check for memoryListBundle/memoryListBundle.human, the decisionBundle check for memoryMutationBundle.human, the memoryScopeLabel and boolStatus checks, the parseOptionalCLIMemoryScope/parseOptionalCLIAgentTier/parseOptionalMemoryType validation checks, the resolveMemoryContentValue error cases, and the readOptionalCommandInput call) into separate t.Run("description", func(t *testing.T){ ... }) subtests so failures are scoped and labeled; keep t.Parallel on the top-level TestMemoryBundleHelpers (or call t.Parallel inside each subtest if desired), move the existing assertions into their respective subtest bodies, and preserve existing helper calls like memoryScopeLabel, boolStatus, parseOptionalCLIMemoryScope, parseOptionalCLIAgentTier, parseOptionalMemoryType, resolveMemoryContentValue, readOptionalCommandInput, memoryListBundle and memoryMutationBundle.internal/config/config.go (1)
718-730: ⚡ Quick winKeep the allowed-origin list in one place.
defaultMemoryControllerConfig()andMemoryControllerPolicyConfig.Validate()each carry the same origin set. The next edit can make the built-in defaults fail validation or leave the validator behind the runtime contract.Suggested refactor
+var defaultMemoryControllerAllowOrigins = []string{ + "cli", + "http", + "uds", + "tool", + "extractor", + "dreaming", + "file", + "provider", +} + func defaultMemoryControllerConfig() MemoryControllerConfig { return MemoryControllerConfig{ Mode: "hybrid", MaxLatency: 300 * time.Millisecond, DefaultOpOnFail: "noop", @@ Policy: MemoryControllerPolicyConfig{ MaxContentChars: 4096, MaxWritesPerMin: 60, - AllowOrigins: []string{ - "cli", - "http", - "uds", - "tool", - "extractor", - "dreaming", - "file", - "provider", - }, + AllowOrigins: cloneStrings(defaultMemoryControllerAllowOrigins), }, } } @@ - allowedOrigins := map[string]struct{}{ - "cli": {}, - "http": {}, - "uds": {}, - "tool": {}, - "extractor": {}, - "dreaming": {}, - "file": {}, - "provider": {}, - } + allowedOrigins := make(map[string]struct{}, len(defaultMemoryControllerAllowOrigins)) + for _, origin := range defaultMemoryControllerAllowOrigins { + allowedOrigins[origin] = struct{}{} + }Also applies to: 1686-1712
🤖 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/config/config.go` around lines 718 - 730, defaultMemoryControllerConfig() and MemoryControllerPolicyConfig.Validate() duplicate the same AllowOrigins list; extract the canonical allowed-origins slice into a single shared constant or package-level variable (e.g., DefaultMemoryControllerAllowedOrigins) and have both defaultMemoryControllerConfig() and MemoryControllerPolicyConfig.Validate() reference that shared symbol so defaults and validation remain consistent; update any tests or usages that construct the list inline to use the new symbol and keep the original semantics (same entries and order).
🤖 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/httpapi/httpapi_integration_test.go`:
- Around line 107-114: The JSON request body is built via string concatenation
(`"{"agent_name":"coder","name":"demo","workspace_path":"`+runtime.workspace+`"}"`)
which breaks on Windows paths; replace this with the existing helper
`mustIntegrationJSON` to construct a proper JSON payload (e.g., pass a
map/struct with keys agent_name, name, workspace_path) and use that result as
the request body in the call to `mustHTTPRequest` (keep using `mustURL` and
`runtime.client`/`origin` unchanged). Ensure the code uses `runtime.workspace`
as a value in the object passed to `mustIntegrationJSON` so backslashes are
escaped correctly.
- Around line 877-884: The request body for the POST to /api/sessions is being
built via raw string concatenation (see createResp and the mustHTTPRequest call
using runtime.workspace), which can break on Windows or when the workspace
contains quotes/escapes; instead construct a Go struct or map with fields
agent_name, workspace_path and channel and json.Marshal it, then pass the
marshaled []byte to mustHTTPRequest (or use fmt.Sprintf only after properly
json-escaping runtime.workspace via json.Marshal); update the code around
createResp/mustHTTPRequest to use the marshaled JSON to ensure safe escaping.
In `@internal/api/httpapi/memory_test.go`:
- Around line 251-265: The negative-path tests (using performRequest with engine
against POST "/api/memory", variables invalid and missing) currently only assert
HTTP status; update each failure-case to also decode the response body JSON and
assert the structured error contract (e.g., an "error" or "message" field exists
and the message contains the expected fragment like "missing" or "invalid
name/type"); do this for the invalid and missing cases shown here and similarly
for the other failure blocks referenced (around the other test ranges) so tests
assert both status code and expected error message content.
In `@internal/config/config.go`:
- Around line 1635-1652: MemoryControllerConfig.Validate currently allows c.Mode
to be "llm" even when the nested LLM config is disabled; after you
validate/assign mode in MemoryControllerConfig.Validate, add a check that if
c.Mode == "llm" and the nested LLM enabled flag (c.LLM.Enabled) is false (or
nil/false-equivalent), return a validation error rejecting the combination,
similarly mirror this guard in the other nearby validator block (the second
MemoryControllerConfig validation around lines 1656-1675) so any "llm" mode is
rejected when the LLM block is disabled.
---
Outside diff comments:
In `@internal/api/httpapi/memory_test.go`:
- Around line 77-156: The subtests in memory_test.go (the t.Run blocks testing
default list, scope filtering, workspace query, and include_system behavior) do
not follow the required "Should ..." naming convention and are missing
per-subtest t.Parallel() calls; update each t.Run invocation to use a name like
"Should return global scope by default" / "Should filter to global when
scope=global" / "Should filter to workspace when scope=workspace" / "Should
include both scopes when workspace_id is provided" / "Should include
system-managed entries when include_system=true" and add a t.Parallel() as the
first line inside each subtest body (inside the closure) so each subtest runs in
parallel while preserving existing assertions and use of performRequest,
decodeJSONResponse, and the memoryListResponse checks.
---
Nitpick comments:
In `@internal/cli/memory_test.go`:
- Around line 560-619: TestMemoryBundleHelpers contains many independent checks
that should be split into identifiable subtests; refactor the test by wrapping
each logical assertion group (e.g., the listBundle human check for
memoryListBundle/memoryListBundle.human, the decisionBundle check for
memoryMutationBundle.human, the memoryScopeLabel and boolStatus checks, the
parseOptionalCLIMemoryScope/parseOptionalCLIAgentTier/parseOptionalMemoryType
validation checks, the resolveMemoryContentValue error cases, and the
readOptionalCommandInput call) into separate t.Run("description", func(t
*testing.T){ ... }) subtests so failures are scoped and labeled; keep t.Parallel
on the top-level TestMemoryBundleHelpers (or call t.Parallel inside each subtest
if desired), move the existing assertions into their respective subtest bodies,
and preserve existing helper calls like memoryScopeLabel, boolStatus,
parseOptionalCLIMemoryScope, parseOptionalCLIAgentTier, parseOptionalMemoryType,
resolveMemoryContentValue, readOptionalCommandInput, memoryListBundle and
memoryMutationBundle.
In `@internal/config/config.go`:
- Around line 718-730: defaultMemoryControllerConfig() and
MemoryControllerPolicyConfig.Validate() duplicate the same AllowOrigins list;
extract the canonical allowed-origins slice into a single shared constant or
package-level variable (e.g., DefaultMemoryControllerAllowedOrigins) and have
both defaultMemoryControllerConfig() and MemoryControllerPolicyConfig.Validate()
reference that shared symbol so defaults and validation remain consistent;
update any tests or usages that construct the list inline to use the new symbol
and keep the original semantics (same entries and order).
🪄 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: c87d405a-4e91-4eb8-9754-1560742224e2
⛔ Files ignored due to path filters (7)
.compozy/tasks/mem-v2/reviews-002/issue_001.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-002/issue_002.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-002/issue_003.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-002/issue_004.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-002/issue_005.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-002/issue_006.mdis excluded by!**/*.md.compozy/tasks/mem-v2/reviews-002/issue_007.mdis excluded by!**/*.md
📒 Files selected for processing (7)
internal/api/core/memory.gointernal/api/httpapi/httpapi_integration_test.gointernal/api/httpapi/memory_test.gointernal/cli/memory.gointernal/cli/memory_test.gointernal/config/config.gointernal/config/memory_v2_config_test.go
| createResp := mustHTTPRequest( | ||
| t, | ||
| runtime.client, | ||
| http.MethodPost, | ||
| mustURL(runtime.host, runtime.port, "/api/sessions"), | ||
| []byte(`{"agent_name":"coder","name":"demo","workspace_path":"`+runtime.workspace+`"}`), | ||
| map[string]string{"Origin": origin}, | ||
| ) |
There was a problem hiding this comment.
JSON request body still uses string concatenation with file paths.
The same pattern flagged in past reviews (string concatenation for JSON bodies) appears here. runtime.workspace from t.TempDir() contains backslashes on Windows, producing invalid JSON. Use mustIntegrationJSON as done in the helper functions.
🛠️ Suggested fix
origin := fmt.Sprintf("http://%s:%d", runtime.host, runtime.port)
createResp := mustHTTPRequest(
t,
runtime.client,
http.MethodPost,
mustURL(runtime.host, runtime.port, "/api/sessions"),
- []byte(`{"agent_name":"coder","name":"demo","workspace_path":"`+runtime.workspace+`"}`),
+ mustIntegrationJSON(map[string]any{
+ "agent_name": "coder",
+ "name": "demo",
+ "workspace_path": runtime.workspace,
+ }),
map[string]string{"Origin": origin},
)🤖 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/httpapi/httpapi_integration_test.go` around lines 107 - 114, The
JSON request body is built via string concatenation
(`"{"agent_name":"coder","name":"demo","workspace_path":"`+runtime.workspace+`"}"`)
which breaks on Windows paths; replace this with the existing helper
`mustIntegrationJSON` to construct a proper JSON payload (e.g., pass a
map/struct with keys agent_name, name, workspace_path) and use that result as
the request body in the call to `mustHTTPRequest` (keep using `mustURL` and
`runtime.client`/`origin` unchanged). Ensure the code uses `runtime.workspace`
as a value in the object passed to `mustIntegrationJSON` so backslashes are
escaped correctly.
| createResp := mustHTTPRequest( | ||
| t, | ||
| runtime.client, | ||
| http.MethodPost, | ||
| mustURL(runtime.host, runtime.port, "/api/sessions"), | ||
| []byte(`{"agent_name":"coder","workspace_path":"`+runtime.workspace+`","channel":"builders"}`), | ||
| nil, | ||
| ) |
There was a problem hiding this comment.
Same string concatenation issue with workspace path.
This is another instance of the same pattern that could break on Windows.
🛠️ Suggested fix
createResp := mustHTTPRequest(
t,
runtime.client,
http.MethodPost,
mustURL(runtime.host, runtime.port, "/api/sessions"),
- []byte(`{"agent_name":"coder","workspace_path":"`+runtime.workspace+`","channel":"builders"}`),
+ mustIntegrationJSON(map[string]any{
+ "agent_name": "coder",
+ "workspace_path": runtime.workspace,
+ "channel": "builders",
+ }),
nil,
)📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| createResp := mustHTTPRequest( | |
| t, | |
| runtime.client, | |
| http.MethodPost, | |
| mustURL(runtime.host, runtime.port, "/api/sessions"), | |
| []byte(`{"agent_name":"coder","workspace_path":"`+runtime.workspace+`","channel":"builders"}`), | |
| nil, | |
| ) | |
| createResp := mustHTTPRequest( | |
| t, | |
| runtime.client, | |
| http.MethodPost, | |
| mustURL(runtime.host, runtime.port, "/api/sessions"), | |
| mustIntegrationJSON(map[string]any{ | |
| "agent_name": "coder", | |
| "workspace_path": runtime.workspace, | |
| "channel": "builders", | |
| }), | |
| nil, | |
| ) |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@internal/api/httpapi/httpapi_integration_test.go` around lines 877 - 884, The
request body for the POST to /api/sessions is being built via raw string
concatenation (see createResp and the mustHTTPRequest call using
runtime.workspace), which can break on Windows or when the workspace contains
quotes/escapes; instead construct a Go struct or map with fields agent_name,
workspace_path and channel and json.Marshal it, then pass the marshaled []byte
to mustHTTPRequest (or use fmt.Sprintf only after properly json-escaping
runtime.workspace via json.Marshal); update the code around
createResp/mustHTTPRequest to use the marshaled JSON to ensure safe escaping.
| invalid := performRequest( | ||
| t, | ||
| engine, | ||
| http.MethodPut, | ||
| "/api/memory/invalid.md", | ||
| []byte(`{"scope":"global","content":"not frontmatter"}`), | ||
| http.MethodPost, | ||
| "/api/memory", | ||
| []byte(`{"scope":"global","type":"user","name":"Invalid"}`), | ||
| ) | ||
| if invalid.Code != http.StatusBadRequest { | ||
| t.Fatalf("invalid status = %d, want %d; body=%s", invalid.Code, http.StatusBadRequest, invalid.Body.String()) | ||
| } | ||
|
|
||
| missing := performRequest(t, engine, http.MethodPut, "/api/memory/missing.md", []byte(`{"scope":"global"}`)) | ||
| missing := performRequest(t, engine, http.MethodPost, "/api/memory", []byte(`{"scope":"global"}`)) | ||
| if missing.Code != http.StatusBadRequest { | ||
| t.Fatalf("missing status = %d, want %d; body=%s", missing.Code, http.StatusBadRequest, missing.Body.String()) | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win
Strengthen negative-path assertions by validating error response bodies
These updated failure-path checks currently assert status code only. Please also assert response body contract/content (e.g., structured error field and expected message fragment) so regressions in API error semantics are caught.
Suggested assertion pattern
invalid := performRequest(t, engine, http.MethodPost, "/api/memory", []byte(`{"scope":"global","type":"user","name":"Invalid"}`))
if invalid.Code != http.StatusBadRequest {
t.Fatalf("invalid status = %d, want %d; body=%s", invalid.Code, http.StatusBadRequest, invalid.Body.String())
}
+var invalidErr map[string]any
+decodeJSONResponse(t, invalid, &invalidErr)
+msg, _ := invalidErr["error"].(string)
+if msg == "" {
+ t.Fatalf("invalid error payload = %#v, want non-empty error message", invalidErr)
+}As per coding guidelines, "Assert both HTTP status code AND response body in tests; status-code-only assertions are insufficient."
Also applies to: 467-475, 696-708
🤖 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/httpapi/memory_test.go` around lines 251 - 265, The
negative-path tests (using performRequest with engine against POST
"/api/memory", variables invalid and missing) currently only assert HTTP status;
update each failure-case to also decode the response body JSON and assert the
structured error contract (e.g., an "error" or "message" field exists and the
message contains the expected fragment like "missing" or "invalid name/type");
do this for the invalid and missing cases shown here and similarly for the other
failure blocks referenced (around the other test ranges) so tests assert both
status code and expected error message content.
| func (c *MemoryControllerConfig) Validate() error { | ||
| mode, err := validateEnum("memory.controller.mode", c.Mode, "hybrid", "rules", "llm") | ||
| if err != nil { | ||
| return err | ||
| } | ||
| c.Mode = mode | ||
| if c.MaxLatency <= 0 { | ||
| return fmt.Errorf("memory.controller.max_latency must be positive: %s", c.MaxLatency) | ||
| } | ||
| defaultOpOnFail, err := validateEnum("memory.controller.default_op_on_fail", c.DefaultOpOnFail, "noop", "reject") | ||
| if err != nil { | ||
| return err | ||
| } | ||
| c.DefaultOpOnFail = defaultOpOnFail | ||
| if err := c.LLM.Validate(); err != nil { | ||
| return err | ||
| } | ||
| return c.Policy.Validate() |
There was a problem hiding this comment.
Reject mode = "llm" when the LLM block is disabled.
This currently validates a self-contradictory config: memory.controller.mode = "llm" can pass while memory.controller.llm.enabled = false, because the nested validator short-circuits on disabled configs. That pushes an invalid mode combination into runtime instead of failing fast.
Suggested fix
func (c *MemoryControllerConfig) Validate() error {
mode, err := validateEnum("memory.controller.mode", c.Mode, "hybrid", "rules", "llm")
if err != nil {
return err
}
c.Mode = mode
+ if c.Mode == "llm" && !c.LLM.Enabled {
+ return errors.New(`memory.controller.llm.enabled must be true when memory.controller.mode is "llm"`)
+ }
if c.MaxLatency <= 0 {
return fmt.Errorf("memory.controller.max_latency must be positive: %s", c.MaxLatency)
}
defaultOpOnFail, err := validateEnum("memory.controller.default_op_on_fail", c.DefaultOpOnFail, "noop", "reject")Also applies to: 1656-1675
🤖 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/config/config.go` around lines 1635 - 1652,
MemoryControllerConfig.Validate currently allows c.Mode to be "llm" even when
the nested LLM config is disabled; after you validate/assign mode in
MemoryControllerConfig.Validate, add a check that if c.Mode == "llm" and the
nested LLM enabled flag (c.LLM.Enabled) is false (or nil/false-equivalent),
return a validation error rejecting the combination, similarly mirror this guard
in the other nearby validator block (the second MemoryControllerConfig
validation around lines 1656-1675) so any "llm" mode is rejected when the LLM
block is disabled.
## 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
Tests
Chores