@namzu/sdk 30.2.0 → 31.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +562 -0
- package/README.md +43 -2
- package/dist/advisory/executor.d.ts +2 -1
- package/dist/advisory/executor.d.ts.map +1 -1
- package/dist/advisory/executor.js +4 -1
- package/dist/advisory/executor.js.map +1 -1
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +12 -0
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/RouterAgent.d.ts.map +1 -1
- package/dist/agents/RouterAgent.js +21 -3
- package/dist/agents/RouterAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +34 -11
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/agents/runAgent.d.ts +12 -0
- package/dist/agents/runAgent.d.ts.map +1 -1
- package/dist/agents/runAgent.js +26 -2
- package/dist/agents/runAgent.js.map +1 -1
- package/dist/authorization/command-line.d.ts +81 -0
- package/dist/authorization/command-line.d.ts.map +1 -0
- package/dist/authorization/command-line.js +347 -0
- package/dist/authorization/command-line.js.map +1 -0
- package/dist/authorization/rules.d.ts.map +1 -1
- package/dist/authorization/rules.js +22 -1
- package/dist/authorization/rules.js.map +1 -1
- package/dist/bridge/a2a/client.d.ts +23 -5
- package/dist/bridge/a2a/client.d.ts.map +1 -1
- package/dist/bridge/a2a/client.js +320 -73
- package/dist/bridge/a2a/client.js.map +1 -1
- package/dist/bridge/a2a/mapper.d.ts.map +1 -1
- package/dist/bridge/a2a/mapper.js +4 -0
- package/dist/bridge/a2a/mapper.js.map +1 -1
- package/dist/bridge/acp/server.d.ts +13 -1
- package/dist/bridge/acp/server.d.ts.map +1 -1
- package/dist/bridge/acp/server.js +150 -44
- package/dist/bridge/acp/server.js.map +1 -1
- package/dist/bridge/mcp/connector/adapter.d.ts +3 -2
- package/dist/bridge/mcp/connector/adapter.d.ts.map +1 -1
- package/dist/bridge/mcp/connector/adapter.js +17 -21
- package/dist/bridge/mcp/connector/adapter.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +3 -0
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/compaction/dangling.d.ts +29 -2
- package/dist/compaction/dangling.d.ts.map +1 -1
- package/dist/compaction/dangling.js +172 -35
- package/dist/compaction/dangling.js.map +1 -1
- package/dist/compaction/index.d.ts +3 -2
- package/dist/compaction/index.d.ts.map +1 -1
- package/dist/compaction/index.js +1 -1
- package/dist/compaction/index.js.map +1 -1
- package/dist/compaction/manual.d.ts +11 -1
- package/dist/compaction/manual.d.ts.map +1 -1
- package/dist/compaction/manual.js +89 -14
- package/dist/compaction/manual.js.map +1 -1
- package/dist/compaction/plan.d.ts +19 -6
- package/dist/compaction/plan.d.ts.map +1 -1
- package/dist/compaction/plan.js +18 -4
- package/dist/compaction/plan.js.map +1 -1
- package/dist/compaction/retention.d.ts +10 -7
- package/dist/compaction/retention.d.ts.map +1 -1
- package/dist/compaction/retention.js +26 -8
- package/dist/compaction/retention.js.map +1 -1
- package/dist/compaction/summary.d.ts +4 -4
- package/dist/compaction/summary.js +4 -4
- package/dist/compaction/verifier.d.ts +19 -1
- package/dist/compaction/verifier.d.ts.map +1 -1
- package/dist/compaction/verifier.js +20 -1
- package/dist/compaction/verifier.js.map +1 -1
- package/dist/config/runtime.d.ts +6 -6
- package/dist/connector/BaseConnector.d.ts +6 -4
- package/dist/connector/BaseConnector.d.ts.map +1 -1
- package/dist/connector/BaseConnector.js +8 -2
- package/dist/connector/BaseConnector.js.map +1 -1
- package/dist/connector/builtins/http.d.ts +16 -4
- package/dist/connector/builtins/http.d.ts.map +1 -1
- package/dist/connector/builtins/http.js +177 -44
- package/dist/connector/builtins/http.js.map +1 -1
- package/dist/connector/builtins/webhook.d.ts +15 -4
- package/dist/connector/builtins/webhook.d.ts.map +1 -1
- package/dist/connector/builtins/webhook.js +165 -45
- package/dist/connector/builtins/webhook.js.map +1 -1
- package/dist/connector/execution-contract.d.ts +11 -0
- package/dist/connector/execution-contract.d.ts.map +1 -0
- package/dist/connector/execution-contract.js +14 -0
- package/dist/connector/execution-contract.js.map +1 -0
- package/dist/connector/http-operation.d.ts +48 -0
- package/dist/connector/http-operation.d.ts.map +1 -0
- package/dist/connector/http-operation.js +205 -0
- package/dist/connector/http-operation.js.map +1 -0
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +8 -3
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/connector/mcp/client.d.ts +14 -8
- package/dist/connector/mcp/client.d.ts.map +1 -1
- package/dist/connector/mcp/client.js +160 -44
- package/dist/connector/mcp/client.js.map +1 -1
- package/dist/connector/mcp/http-sse.d.ts +8 -2
- package/dist/connector/mcp/http-sse.d.ts.map +1 -1
- package/dist/connector/mcp/http-sse.js +70 -17
- package/dist/connector/mcp/http-sse.js.map +1 -1
- package/dist/connector/mcp/prompt-adapter.d.ts.map +1 -1
- package/dist/connector/mcp/prompt-adapter.js +9 -2
- package/dist/connector/mcp/prompt-adapter.js.map +1 -1
- package/dist/connector/mcp/stdio.d.ts +2 -2
- package/dist/connector/mcp/stdio.d.ts.map +1 -1
- package/dist/connector/mcp/stdio.js +14 -50
- package/dist/connector/mcp/stdio.js.map +1 -1
- package/dist/connector/mcp/streamable-http.d.ts +7 -2
- package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
- package/dist/connector/mcp/streamable-http.js +66 -18
- package/dist/connector/mcp/streamable-http.js.map +1 -1
- package/dist/connector/tools/adapter.d.ts +2 -2
- package/dist/connector/tools/adapter.d.ts.map +1 -1
- package/dist/connector/tools/adapter.js +23 -14
- package/dist/connector/tools/adapter.js.map +1 -1
- package/dist/connector/tools/definitions.d.ts.map +1 -1
- package/dist/connector/tools/definitions.js +5 -2
- package/dist/connector/tools/definitions.js.map +1 -1
- package/dist/connector/tools/result.d.ts +4 -0
- package/dist/connector/tools/result.d.ts.map +1 -0
- package/dist/connector/tools/result.js +20 -0
- package/dist/connector/tools/result.js.map +1 -0
- package/dist/connector/web/guarded-fetch.d.ts +4 -2
- package/dist/connector/web/guarded-fetch.d.ts.map +1 -1
- package/dist/connector/web/guarded-fetch.js +157 -43
- package/dist/connector/web/guarded-fetch.js.map +1 -1
- package/dist/constants/sandbox/index.d.ts +3 -2
- package/dist/constants/sandbox/index.d.ts.map +1 -1
- package/dist/constants/sandbox/index.js +3 -2
- package/dist/constants/sandbox/index.js.map +1 -1
- package/dist/contracts/api.d.ts +2 -0
- package/dist/contracts/api.d.ts.map +1 -1
- package/dist/contracts/schemas.d.ts +38 -12
- package/dist/contracts/schemas.d.ts.map +1 -1
- package/dist/contracts/schemas.js +7 -0
- package/dist/contracts/schemas.js.map +1 -1
- package/dist/directory/derive-supervisor.d.ts.map +1 -1
- package/dist/directory/derive-supervisor.js +8 -0
- package/dist/directory/derive-supervisor.js.map +1 -1
- package/dist/directory/derive.d.ts.map +1 -1
- package/dist/directory/derive.js +8 -0
- package/dist/directory/derive.js.map +1 -1
- package/dist/directory/load.d.ts.map +1 -1
- package/dist/directory/load.js +2 -0
- package/dist/directory/load.js.map +1 -1
- package/dist/directory/types.d.ts +4 -0
- package/dist/directory/types.d.ts.map +1 -1
- package/dist/eval/experiment.d.ts +10 -10
- package/dist/eval/experiment.d.ts.map +1 -1
- package/dist/eval/experiment.js +121 -91
- package/dist/eval/experiment.js.map +1 -1
- package/dist/eval/judge.d.ts +6 -0
- package/dist/eval/judge.d.ts.map +1 -1
- package/dist/eval/judge.js +7 -2
- package/dist/eval/judge.js.map +1 -1
- package/dist/eval/types.d.ts +7 -1
- package/dist/eval/types.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.d.ts +12 -10
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +16 -3
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/connector/environment.d.ts +2 -2
- package/dist/manager/connector/environment.d.ts.map +1 -1
- package/dist/manager/connector/environment.js +2 -2
- package/dist/manager/connector/environment.js.map +1 -1
- package/dist/manager/connector/lifecycle.d.ts +10 -2
- package/dist/manager/connector/lifecycle.d.ts.map +1 -1
- package/dist/manager/connector/lifecycle.js +273 -24
- package/dist/manager/connector/lifecycle.js.map +1 -1
- package/dist/manager/connector/tenant.d.ts +5 -4
- package/dist/manager/connector/tenant.d.ts.map +1 -1
- package/dist/manager/connector/tenant.js +47 -22
- package/dist/manager/connector/tenant.js.map +1 -1
- package/dist/manager/goal/activation.d.ts +23 -0
- package/dist/manager/goal/activation.d.ts.map +1 -0
- package/dist/manager/goal/activation.js +41 -0
- package/dist/manager/goal/activation.js.map +1 -0
- package/dist/manager/index.d.ts +3 -2
- package/dist/manager/index.d.ts.map +1 -1
- package/dist/manager/index.js.map +1 -1
- package/dist/manager/run/persistence.d.ts +2 -0
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +5 -1
- package/dist/manager/run/persistence.js.map +1 -1
- package/dist/manager/topic/dependency.d.ts +24 -0
- package/dist/manager/topic/dependency.d.ts.map +1 -0
- package/dist/manager/topic/dependency.js +13 -0
- package/dist/manager/topic/dependency.js.map +1 -0
- package/dist/manager/topic/lifecycle.d.ts +9 -21
- package/dist/manager/topic/lifecycle.d.ts.map +1 -1
- package/dist/manager/topic/lifecycle.js +17 -29
- package/dist/manager/topic/lifecycle.js.map +1 -1
- package/dist/plugin/index.d.ts +1 -0
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/lifecycle.d.ts +15 -0
- package/dist/plugin/lifecycle.d.ts.map +1 -1
- package/dist/plugin/lifecycle.js +144 -38
- package/dist/plugin/lifecycle.js.map +1 -1
- package/dist/plugin/loader.d.ts +3 -3
- package/dist/plugin/loader.d.ts.map +1 -1
- package/dist/plugin/loader.js +58 -12
- package/dist/plugin/loader.js.map +1 -1
- package/dist/provider/collect-chat-completion.d.ts.map +1 -1
- package/dist/provider/collect-chat-completion.js +4 -0
- package/dist/provider/collect-chat-completion.js.map +1 -1
- package/dist/provider/fallback.d.ts +3 -1
- package/dist/provider/fallback.d.ts.map +1 -1
- package/dist/provider/fallback.js +62 -10
- package/dist/provider/fallback.js.map +1 -1
- package/dist/provider/idle-timeout.d.ts +4 -0
- package/dist/provider/idle-timeout.d.ts.map +1 -1
- package/dist/provider/idle-timeout.js +131 -15
- package/dist/provider/idle-timeout.js.map +1 -1
- package/dist/provider/index.d.ts +2 -0
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +1 -0
- package/dist/provider/index.js.map +1 -1
- package/dist/provider/instrumentation.d.ts.map +1 -1
- package/dist/provider/instrumentation.js +1 -0
- package/dist/provider/instrumentation.js.map +1 -1
- package/dist/provider/retry.d.ts.map +1 -1
- package/dist/provider/retry.js +13 -1
- package/dist/provider/retry.js.map +1 -1
- package/dist/public-runtime.d.ts +57 -24
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +42 -35
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +1 -0
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +5 -0
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +33 -12
- package/dist/public-types.d.ts.map +1 -1
- package/dist/rag/embedding.d.ts +8 -3
- package/dist/rag/embedding.d.ts.map +1 -1
- package/dist/rag/embedding.js +120 -9
- package/dist/rag/embedding.js.map +1 -1
- package/dist/rag/index.d.ts +1 -1
- package/dist/rag/index.d.ts.map +1 -1
- package/dist/rag/index.js +1 -1
- package/dist/rag/index.js.map +1 -1
- package/dist/rag/ingestion.d.ts +2 -2
- package/dist/rag/ingestion.d.ts.map +1 -1
- package/dist/rag/ingestion.js +15 -3
- package/dist/rag/ingestion.js.map +1 -1
- package/dist/rag/knowledge-base.d.ts +3 -3
- package/dist/rag/knowledge-base.d.ts.map +1 -1
- package/dist/rag/knowledge-base.js +8 -4
- package/dist/rag/knowledge-base.js.map +1 -1
- package/dist/rag/operation.d.ts +10 -0
- package/dist/rag/operation.d.ts.map +1 -0
- package/dist/rag/operation.js +26 -0
- package/dist/rag/operation.js.map +1 -0
- package/dist/rag/rag-tool.d.ts.map +1 -1
- package/dist/rag/rag-tool.js +6 -3
- package/dist/rag/rag-tool.js.map +1 -1
- package/dist/rag/retriever.d.ts +2 -2
- package/dist/rag/retriever.d.ts.map +1 -1
- package/dist/rag/retriever.js +31 -15
- package/dist/rag/retriever.js.map +1 -1
- package/dist/rag/vector-store.d.ts +3 -3
- package/dist/rag/vector-store.d.ts.map +1 -1
- package/dist/rag/vector-store.js +4 -2
- package/dist/rag/vector-store.js.map +1 -1
- package/dist/registry/command/kernel-commands.d.ts +16 -4
- package/dist/registry/command/kernel-commands.d.ts.map +1 -1
- package/dist/registry/command/kernel-commands.js +171 -0
- package/dist/registry/command/kernel-commands.js.map +1 -1
- package/dist/run/reporter.d.ts.map +1 -1
- package/dist/run/reporter.js +9 -0
- package/dist/run/reporter.js.map +1 -1
- package/dist/run-query/index.d.ts +15 -1
- package/dist/run-query/index.d.ts.map +1 -1
- package/dist/run-query/index.js +69 -15
- package/dist/run-query/index.js.map +1 -1
- package/dist/runtime/query/context.d.ts.map +1 -1
- package/dist/runtime/query/context.js +10 -3
- package/dist/runtime/query/context.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +3 -0
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +80 -18
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/guard.d.ts +9 -0
- package/dist/runtime/query/guard.d.ts.map +1 -1
- package/dist/runtime/query/guard.js +11 -0
- package/dist/runtime/query/guard.js.map +1 -1
- package/dist/runtime/query/index.d.ts +30 -1
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +548 -95
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +74 -14
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +94 -53
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +3 -0
- package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/context.js.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.js +21 -0
- package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.js +4 -0
- package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
- package/dist/runtime/query/project-instructions.d.ts +69 -0
- package/dist/runtime/query/project-instructions.d.ts.map +1 -0
- package/dist/runtime/query/project-instructions.js +137 -0
- package/dist/runtime/query/project-instructions.js.map +1 -0
- package/dist/runtime/query/request-rich-content.d.ts +22 -0
- package/dist/runtime/query/request-rich-content.d.ts.map +1 -0
- package/dist/runtime/query/request-rich-content.js +122 -0
- package/dist/runtime/query/request-rich-content.js.map +1 -0
- package/dist/runtime/query/result.d.ts.map +1 -1
- package/dist/runtime/query/result.js +12 -1
- package/dist/runtime/query/result.js.map +1 -1
- package/dist/runtime/query/resume-pending.d.ts.map +1 -1
- package/dist/runtime/query/resume-pending.js +19 -20
- package/dist/runtime/query/resume-pending.js.map +1 -1
- package/dist/runtime/query/resume-run.d.ts.map +1 -1
- package/dist/runtime/query/resume-run.js +54 -8
- package/dist/runtime/query/resume-run.js.map +1 -1
- package/dist/runtime/query/run-state.d.ts +5 -0
- package/dist/runtime/query/run-state.d.ts.map +1 -1
- package/dist/runtime/query/run-state.js +6 -1
- package/dist/runtime/query/run-state.js.map +1 -1
- package/dist/runtime/query/sandbox-lifecycle.d.ts +54 -0
- package/dist/runtime/query/sandbox-lifecycle.d.ts.map +1 -0
- package/dist/runtime/query/sandbox-lifecycle.js +167 -0
- package/dist/runtime/query/sandbox-lifecycle.js.map +1 -0
- package/dist/sandbox/isolation.d.ts.map +1 -1
- package/dist/sandbox/isolation.js +9 -0
- package/dist/sandbox/isolation.js.map +1 -1
- package/dist/sandbox/provider/local.d.ts +56 -6
- package/dist/sandbox/provider/local.d.ts.map +1 -1
- package/dist/sandbox/provider/local.js +181 -76
- package/dist/sandbox/provider/local.js.map +1 -1
- package/dist/sandbox/terminal.d.ts +13 -5
- package/dist/sandbox/terminal.d.ts.map +1 -1
- package/dist/sandbox/terminal.js +11 -3
- package/dist/sandbox/terminal.js.map +1 -1
- package/dist/session/errors.d.ts +28 -29
- package/dist/session/errors.d.ts.map +1 -1
- package/dist/session/errors.js +28 -29
- package/dist/session/errors.js.map +1 -1
- package/dist/session/handoff/broadcast.d.ts +5 -8
- package/dist/session/handoff/broadcast.d.ts.map +1 -1
- package/dist/session/handoff/broadcast.js +16 -6
- package/dist/session/handoff/broadcast.js.map +1 -1
- package/dist/session/handoff/single.d.ts +5 -8
- package/dist/session/handoff/single.d.ts.map +1 -1
- package/dist/session/handoff/single.js +7 -4
- package/dist/session/handoff/single.js.map +1 -1
- package/dist/store/attachment/index.d.ts +11 -3
- package/dist/store/attachment/index.d.ts.map +1 -1
- package/dist/store/attachment/index.js +49 -4
- package/dist/store/attachment/index.js.map +1 -1
- package/dist/store/feedback/conformance.d.ts.map +1 -1
- package/dist/store/feedback/conformance.js +32 -0
- package/dist/store/feedback/conformance.js.map +1 -1
- package/dist/store/feedback/disk.d.ts +8 -6
- package/dist/store/feedback/disk.d.ts.map +1 -1
- package/dist/store/feedback/disk.js +111 -76
- package/dist/store/feedback/disk.js.map +1 -1
- package/dist/store/goal/index.d.ts +111 -0
- package/dist/store/goal/index.d.ts.map +1 -0
- package/dist/store/goal/index.js +436 -0
- package/dist/store/goal/index.js.map +1 -0
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/kv/revision-record-store.d.ts +70 -0
- package/dist/store/kv/revision-record-store.d.ts.map +1 -0
- package/dist/store/kv/revision-record-store.js +290 -0
- package/dist/store/kv/revision-record-store.js.map +1 -0
- package/dist/store/memory/disk.d.ts +9 -7
- package/dist/store/memory/disk.d.ts.map +1 -1
- package/dist/store/memory/disk.js +256 -98
- package/dist/store/memory/disk.js.map +1 -1
- package/dist/store/run/disk.d.ts +10 -2
- package/dist/store/run/disk.d.ts.map +1 -1
- package/dist/store/run/disk.js +70 -4
- package/dist/store/run/disk.js.map +1 -1
- package/dist/store/run/memory.d.ts +4 -2
- package/dist/store/run/memory.d.ts.map +1 -1
- package/dist/store/run/memory.js +15 -1
- package/dist/store/run/memory.js.map +1 -1
- package/dist/store/session/disk.d.ts +9 -0
- package/dist/store/session/disk.d.ts.map +1 -1
- package/dist/store/session/disk.js +57 -5
- package/dist/store/session/disk.js.map +1 -1
- package/dist/store/session/memory.d.ts +1 -0
- package/dist/store/session/memory.d.ts.map +1 -1
- package/dist/store/session/memory.js +14 -0
- package/dist/store/session/memory.js.map +1 -1
- package/dist/store/topic/memory.d.ts +1 -2
- package/dist/store/topic/memory.d.ts.map +1 -1
- package/dist/store/topic/memory.js +4 -5
- package/dist/store/topic/memory.js.map +1 -1
- package/dist/store/topic/objective.d.ts +8 -4
- package/dist/store/topic/objective.d.ts.map +1 -1
- package/dist/store/topic/objective.js +185 -100
- package/dist/store/topic/objective.js.map +1 -1
- package/dist/store/topic/state.d.ts +1 -2
- package/dist/store/topic/state.d.ts.map +1 -1
- package/dist/store/topic/state.js +50 -62
- package/dist/store/topic/state.js.map +1 -1
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +20 -0
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/computer-use.d.ts +9 -1
- package/dist/tools/builtins/computer-use.d.ts.map +1 -1
- package/dist/tools/builtins/computer-use.js.map +1 -1
- package/dist/tools/builtins/content-fingerprint.d.ts +8 -7
- package/dist/tools/builtins/content-fingerprint.d.ts.map +1 -1
- package/dist/tools/builtins/content-fingerprint.js +9 -10
- package/dist/tools/builtins/content-fingerprint.js.map +1 -1
- package/dist/tools/builtins/edit.d.ts +6 -1
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +166 -27
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/write-file.d.ts.map +1 -1
- package/dist/tools/builtins/write-file.js +45 -19
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/command-arguments.d.ts +43 -0
- package/dist/tools/command-arguments.d.ts.map +1 -0
- package/dist/tools/command-arguments.js +52 -0
- package/dist/tools/command-arguments.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +2 -0
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +3 -1
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/defineTool.d.ts +10 -0
- package/dist/tools/defineTool.d.ts.map +1 -1
- package/dist/tools/defineTool.js +1 -0
- package/dist/tools/defineTool.js.map +1 -1
- package/dist/tools/env-scrub.d.ts +7 -5
- package/dist/tools/env-scrub.d.ts.map +1 -1
- package/dist/tools/env-scrub.js +7 -5
- package/dist/tools/env-scrub.js.map +1 -1
- package/dist/tools/goal/index.d.ts +20 -0
- package/dist/tools/goal/index.d.ts.map +1 -0
- package/dist/tools/goal/index.js +104 -0
- package/dist/tools/goal/index.js.map +1 -0
- package/dist/tools/memory/index.d.ts +16 -0
- package/dist/tools/memory/index.d.ts.map +1 -1
- package/dist/tools/memory/index.js +6 -2
- package/dist/tools/memory/index.js.map +1 -1
- package/dist/tools/memory/search.d.ts +4 -1
- package/dist/tools/memory/search.d.ts.map +1 -1
- package/dist/tools/memory/search.js +10 -2
- package/dist/tools/memory/search.js.map +1 -1
- package/dist/types/agent/base.d.ts +11 -3
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/factory.d.ts +2 -0
- package/dist/types/agent/factory.d.ts.map +1 -1
- package/dist/types/agent/reactive.d.ts +2 -0
- package/dist/types/agent/reactive.d.ts.map +1 -1
- package/dist/types/agent/supervisor.d.ts +6 -0
- package/dist/types/agent/supervisor.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +6 -2
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/connector/core.d.ts +13 -8
- package/dist/types/connector/core.d.ts.map +1 -1
- package/dist/types/connector/definition.d.ts +37 -18
- package/dist/types/connector/definition.d.ts.map +1 -1
- package/dist/types/connector/http.d.ts +6 -0
- package/dist/types/connector/http.d.ts.map +1 -1
- package/dist/types/connector/mcp.d.ts +24 -6
- package/dist/types/connector/mcp.d.ts.map +1 -1
- package/dist/types/connector/tenant.d.ts +17 -7
- package/dist/types/connector/tenant.d.ts.map +1 -1
- package/dist/types/connector/webhook.d.ts +6 -0
- package/dist/types/connector/webhook.d.ts.map +1 -1
- package/dist/types/goal/index.d.ts +46 -0
- package/dist/types/goal/index.d.ts.map +1 -0
- package/dist/types/goal/index.js +2 -0
- package/dist/types/goal/index.js.map +1 -0
- package/dist/types/ids/index.d.ts +2 -0
- package/dist/types/ids/index.d.ts.map +1 -1
- package/dist/types/ids/index.js.map +1 -1
- package/dist/types/message/index.d.ts +79 -13
- package/dist/types/message/index.d.ts.map +1 -1
- package/dist/types/message/index.js +49 -3
- package/dist/types/message/index.js.map +1 -1
- package/dist/types/plugin/index.d.ts +7 -5
- package/dist/types/plugin/index.d.ts.map +1 -1
- package/dist/types/plugin/index.js.map +1 -1
- package/dist/types/provider/chat.d.ts +27 -4
- package/dist/types/provider/chat.d.ts.map +1 -1
- package/dist/types/provider/index.d.ts +1 -1
- package/dist/types/provider/index.d.ts.map +1 -1
- package/dist/types/provider/interface.d.ts +18 -7
- package/dist/types/provider/interface.d.ts.map +1 -1
- package/dist/types/provider/model.d.ts +12 -0
- package/dist/types/provider/model.d.ts.map +1 -1
- package/dist/types/provider/stream.d.ts +6 -0
- package/dist/types/provider/stream.d.ts.map +1 -1
- package/dist/types/rag/embedding.d.ts +15 -2
- package/dist/types/rag/embedding.d.ts.map +1 -1
- package/dist/types/rag/ingestion.d.ts +2 -2
- package/dist/types/rag/ingestion.d.ts.map +1 -1
- package/dist/types/rag/knowledge-base.d.ts +3 -3
- package/dist/types/rag/knowledge-base.d.ts.map +1 -1
- package/dist/types/rag/retrieval.d.ts +2 -2
- package/dist/types/rag/retrieval.d.ts.map +1 -1
- package/dist/types/rag/scope.d.ts +4 -0
- package/dist/types/rag/scope.d.ts.map +1 -1
- package/dist/types/rag/vector.d.ts +5 -2
- package/dist/types/rag/vector.d.ts.map +1 -1
- package/dist/types/run/config.d.ts +20 -0
- package/dist/types/run/config.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +25 -1
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js.map +1 -1
- package/dist/types/run/metadata.d.ts +2 -0
- package/dist/types/run/metadata.d.ts.map +1 -1
- package/dist/types/run/step.d.ts +2 -6
- package/dist/types/run/step.d.ts.map +1 -1
- package/dist/types/run/step.js.map +1 -1
- package/dist/types/run/store.d.ts +55 -2
- package/dist/types/run/store.d.ts.map +1 -1
- package/dist/types/sandbox/index.d.ts +47 -6
- package/dist/types/sandbox/index.d.ts.map +1 -1
- package/dist/types/sandbox/index.js +23 -10
- package/dist/types/sandbox/index.js.map +1 -1
- package/dist/types/session/store.d.ts +13 -0
- package/dist/types/session/store.d.ts.map +1 -1
- package/dist/types/tool/index.d.ts +33 -11
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/types/topic/entity.d.ts +3 -4
- package/dist/types/topic/entity.d.ts.map +1 -1
- package/dist/types/topic/store.d.ts +3 -3
- package/dist/utils/id.d.ts +3 -1
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +4 -0
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/process-environment.d.ts +26 -0
- package/dist/utils/process-environment.d.ts.map +1 -0
- package/dist/utils/process-environment.js +78 -0
- package/dist/utils/process-environment.js.map +1 -0
- package/dist/vault/InMemoryCredentialVault.d.ts +2 -0
- package/dist/vault/InMemoryCredentialVault.d.ts.map +1 -1
- package/dist/vault/InMemoryCredentialVault.js +24 -4
- package/dist/vault/InMemoryCredentialVault.js.map +1 -1
- package/dist/vault/instrumentation.d.ts.map +1 -1
- package/dist/vault/instrumentation.js +15 -0
- package/dist/vault/instrumentation.js.map +1 -1
- package/package.json +1 -1
- package/src/advisory/executor.ts +4 -1
- package/src/agents/ReactiveAgent.ts +12 -0
- package/src/agents/RouterAgent.ts +25 -3
- package/src/agents/SupervisorAgent.ts +33 -11
- package/src/agents/runAgent.ts +38 -2
- package/src/authorization/command-line.ts +390 -0
- package/src/authorization/rules.ts +22 -1
- package/src/bridge/a2a/client.ts +384 -97
- package/src/bridge/a2a/mapper.ts +5 -0
- package/src/bridge/acp/server.ts +184 -42
- package/src/bridge/mcp/connector/adapter.ts +28 -20
- package/src/bridge/sse/mapper.ts +3 -0
- package/src/compaction/dangling.ts +203 -38
- package/src/compaction/index.ts +9 -2
- package/src/compaction/manual.ts +125 -18
- package/src/compaction/plan.ts +42 -11
- package/src/compaction/retention.ts +23 -8
- package/src/compaction/summary.ts +4 -4
- package/src/compaction/verifier.ts +66 -0
- package/src/connector/BaseConnector.ts +19 -4
- package/src/connector/builtins/http.ts +236 -46
- package/src/connector/builtins/webhook.ts +207 -47
- package/src/connector/execution-contract.ts +27 -0
- package/src/connector/http-operation.ts +238 -0
- package/src/connector/mcp/adapter.ts +8 -3
- package/src/connector/mcp/client.ts +207 -58
- package/src/connector/mcp/http-sse.ts +91 -23
- package/src/connector/mcp/prompt-adapter.ts +8 -2
- package/src/connector/mcp/stdio.ts +21 -46
- package/src/connector/mcp/streamable-http.ts +86 -22
- package/src/connector/tools/adapter.ts +23 -14
- package/src/connector/tools/definitions.ts +5 -2
- package/src/connector/tools/result.ts +21 -0
- package/src/connector/web/guarded-fetch.ts +188 -48
- package/src/constants/sandbox/index.ts +3 -2
- package/src/contracts/api.ts +2 -0
- package/src/contracts/schemas.ts +7 -0
- package/src/directory/derive-supervisor.ts +8 -0
- package/src/directory/derive.ts +8 -0
- package/src/directory/load.ts +2 -0
- package/src/directory/types.ts +4 -0
- package/src/eval/experiment.ts +160 -111
- package/src/eval/judge.ts +13 -2
- package/src/eval/types.ts +7 -1
- package/src/manager/agent/lifecycle.ts +28 -12
- package/src/manager/connector/environment.ts +3 -1
- package/src/manager/connector/lifecycle.ts +364 -24
- package/src/manager/connector/tenant.ts +56 -23
- package/src/manager/goal/activation.ts +52 -0
- package/src/manager/index.ts +10 -2
- package/src/manager/run/persistence.ts +6 -1
- package/src/manager/topic/dependency.ts +39 -0
- package/src/manager/topic/lifecycle.ts +19 -31
- package/src/plugin/index.ts +1 -0
- package/src/plugin/lifecycle.ts +180 -39
- package/src/plugin/loader.ts +70 -13
- package/src/provider/collect-chat-completion.ts +3 -0
- package/src/provider/fallback.ts +79 -11
- package/src/provider/idle-timeout.ts +143 -17
- package/src/provider/index.ts +2 -0
- package/src/provider/instrumentation.ts +1 -0
- package/src/provider/retry.ts +16 -1
- package/src/public-runtime.ts +190 -32
- package/src/public-tools.ts +5 -0
- package/src/public-types.ts +85 -11
- package/src/rag/embedding.ts +147 -19
- package/src/rag/index.ts +1 -1
- package/src/rag/ingestion.ts +16 -2
- package/src/rag/knowledge-base.ts +13 -4
- package/src/rag/operation.ts +28 -0
- package/src/rag/rag-tool.ts +6 -3
- package/src/rag/retriever.ts +62 -11
- package/src/rag/vector-store.ts +8 -2
- package/src/registry/command/kernel-commands.ts +223 -4
- package/src/run/reporter.ts +10 -0
- package/src/run-query/index.ts +84 -15
- package/src/runtime/query/context.ts +13 -3
- package/src/runtime/query/executor.ts +90 -17
- package/src/runtime/query/guard.ts +12 -0
- package/src/runtime/query/index.ts +652 -103
- package/src/runtime/query/iteration/index.ts +89 -13
- package/src/runtime/query/iteration/phases/compaction.ts +120 -55
- package/src/runtime/query/iteration/phases/context.ts +4 -0
- package/src/runtime/query/iteration/phases/tool-review.ts +28 -0
- package/src/runtime/query/iteration/stream-turn.ts +3 -0
- package/src/runtime/query/project-instructions.ts +212 -0
- package/src/runtime/query/request-rich-content.ts +153 -0
- package/src/runtime/query/result.ts +12 -1
- package/src/runtime/query/resume-pending.ts +20 -18
- package/src/runtime/query/resume-run.ts +52 -8
- package/src/runtime/query/run-state.ts +11 -1
- package/src/runtime/query/sandbox-lifecycle.ts +210 -0
- package/src/sandbox/isolation.ts +9 -0
- package/src/sandbox/provider/local.ts +255 -90
- package/src/sandbox/terminal.ts +13 -5
- package/src/session/errors.ts +68 -42
- package/src/session/handoff/broadcast.ts +20 -14
- package/src/session/handoff/single.ts +14 -13
- package/src/store/attachment/index.ts +65 -3
- package/src/store/feedback/conformance.ts +39 -0
- package/src/store/feedback/disk.ts +128 -82
- package/src/store/goal/index.ts +594 -0
- package/src/store/index.ts +1 -1
- package/src/store/kv/revision-record-store.ts +346 -0
- package/src/store/memory/disk.ts +288 -113
- package/src/store/run/disk.ts +96 -5
- package/src/store/run/memory.ts +22 -2
- package/src/store/session/disk.ts +93 -6
- package/src/store/session/memory.ts +22 -0
- package/src/store/topic/memory.ts +4 -5
- package/src/store/topic/objective.ts +215 -100
- package/src/store/topic/state.ts +100 -63
- package/src/tools/builtins/bash.ts +21 -0
- package/src/tools/builtins/computer-use.ts +9 -1
- package/src/tools/builtins/content-fingerprint.ts +9 -12
- package/src/tools/builtins/edit.ts +190 -27
- package/src/tools/builtins/write-file.ts +55 -19
- package/src/tools/command-arguments.ts +54 -0
- package/src/tools/coordinator/index.ts +4 -1
- package/src/tools/defineTool.ts +11 -0
- package/src/tools/env-scrub.ts +7 -5
- package/src/tools/goal/index.ts +129 -0
- package/src/tools/memory/index.ts +26 -3
- package/src/tools/memory/search.ts +20 -3
- package/src/types/agent/base.ts +12 -3
- package/src/types/agent/factory.ts +2 -0
- package/src/types/agent/reactive.ts +2 -0
- package/src/types/agent/supervisor.ts +6 -0
- package/src/types/agent/task.ts +6 -2
- package/src/types/connector/core.ts +13 -8
- package/src/types/connector/definition.ts +54 -20
- package/src/types/connector/http.ts +7 -0
- package/src/types/connector/mcp.ts +27 -6
- package/src/types/connector/tenant.ts +21 -7
- package/src/types/connector/webhook.ts +7 -0
- package/src/types/goal/index.ts +50 -0
- package/src/types/ids/index.ts +2 -0
- package/src/types/message/index.ts +147 -12
- package/src/types/plugin/index.ts +7 -5
- package/src/types/provider/chat.ts +35 -4
- package/src/types/provider/index.ts +1 -1
- package/src/types/provider/interface.ts +22 -7
- package/src/types/provider/model.ts +13 -0
- package/src/types/provider/stream.ts +6 -0
- package/src/types/rag/embedding.ts +16 -2
- package/src/types/rag/ingestion.ts +2 -1
- package/src/types/rag/knowledge-base.ts +7 -3
- package/src/types/rag/retrieval.ts +2 -1
- package/src/types/rag/scope.ts +5 -0
- package/src/types/rag/vector.ts +5 -2
- package/src/types/run/config.ts +20 -0
- package/src/types/run/events.ts +28 -3
- package/src/types/run/metadata.ts +2 -0
- package/src/types/run/step.ts +2 -7
- package/src/types/run/store.ts +60 -2
- package/src/types/sandbox/index.ts +57 -14
- package/src/types/session/store.ts +18 -0
- package/src/types/tool/index.ts +33 -11
- package/src/types/topic/entity.ts +3 -4
- package/src/types/topic/store.ts +3 -3
- package/src/utils/id.ts +6 -0
- package/src/utils/process-environment.ts +101 -0
- package/src/vault/InMemoryCredentialVault.ts +29 -4
- package/src/vault/instrumentation.ts +24 -0
package/src/store/memory/disk.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { mkdir, unlink } from 'node:fs/promises'
|
|
2
|
-
import { join } from 'node:path'
|
|
1
|
+
import { mkdir, realpath, unlink } from 'node:fs/promises'
|
|
2
|
+
import { dirname, join, resolve } from 'node:path'
|
|
3
|
+
import { NamzuError } from '../../types/errors/index.js'
|
|
3
4
|
import type { MemoryId } from '../../types/ids/index.js'
|
|
4
5
|
import type {
|
|
5
6
|
CreateMemoryParams,
|
|
@@ -9,7 +10,7 @@ import type {
|
|
|
9
10
|
MemorySearchResult,
|
|
10
11
|
MemoryStore,
|
|
11
12
|
} from '../../types/memory/index.js'
|
|
12
|
-
import { generateMemoryId } from '../../utils/id.js'
|
|
13
|
+
import { asMemoryId, generateMemoryId } from '../../utils/id.js'
|
|
13
14
|
import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
|
|
14
15
|
import { type Logger, resolveLogger } from '../../utils/logger.js'
|
|
15
16
|
import { DiskRecordStore } from '../kv/record-store.js'
|
|
@@ -26,142 +27,315 @@ import { InMemoryMemoryIndex } from './index.js'
|
|
|
26
27
|
*/
|
|
27
28
|
const SCHEMA = defineSchema({ kind: 'memory-store', current: 1, migrations: {} })
|
|
28
29
|
|
|
30
|
+
const SAFE_STORAGE_ID = /^mem_[A-Za-z0-9_-]+$/
|
|
31
|
+
|
|
32
|
+
interface StorageLocation {
|
|
33
|
+
readonly indexPath: string
|
|
34
|
+
readonly contentDir: string
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const operationTails = new Map<string, Promise<void>>()
|
|
38
|
+
|
|
39
|
+
/** Serialize every operation over one canonical disk projection in this process. */
|
|
40
|
+
async function withMemoryOperationLock<T>(key: string, operation: () => Promise<T>): Promise<T> {
|
|
41
|
+
const previous = operationTails.get(key) ?? Promise.resolve()
|
|
42
|
+
let release = () => {}
|
|
43
|
+
const current = new Promise<void>((resolveCurrent) => {
|
|
44
|
+
release = resolveCurrent
|
|
45
|
+
})
|
|
46
|
+
const tail = previous.then(() => current)
|
|
47
|
+
operationTails.set(key, tail)
|
|
48
|
+
|
|
49
|
+
await previous
|
|
50
|
+
try {
|
|
51
|
+
return await operation()
|
|
52
|
+
} finally {
|
|
53
|
+
release()
|
|
54
|
+
if (operationTails.get(key) === tail) operationTails.delete(key)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function invalidIndex(
|
|
59
|
+
reason: string,
|
|
60
|
+
details: { entryIndex?: number; field?: string } = {},
|
|
61
|
+
): never {
|
|
62
|
+
throw new NamzuError({
|
|
63
|
+
code: 'storage_error',
|
|
64
|
+
message: `Memory index is invalid${
|
|
65
|
+
details.entryIndex === undefined ? '' : ` at entry ${details.entryIndex}`
|
|
66
|
+
}: ${reason}. Refusing to treat unreadable durable memory as empty.`,
|
|
67
|
+
details,
|
|
68
|
+
retryable: false,
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function invalidContent(id: string, reason: string, details: { field?: string } = {}): never {
|
|
73
|
+
throw new NamzuError({
|
|
74
|
+
code: 'storage_error',
|
|
75
|
+
message: `Memory content for ${id} is invalid: ${reason}. Refusing to treat indexed durable memory as absent or valid.`,
|
|
76
|
+
details: { id, ...details },
|
|
77
|
+
retryable: false,
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** A typed ID is not automatically a safe filesystem segment. */
|
|
82
|
+
function assertStorageMemoryId(
|
|
83
|
+
value: unknown,
|
|
84
|
+
refuse: (reason: string) => never,
|
|
85
|
+
): asserts value is MemoryId {
|
|
86
|
+
if (typeof value !== 'string') refuse('id must be a memory ID string')
|
|
87
|
+
try {
|
|
88
|
+
asMemoryId(value)
|
|
89
|
+
} catch {
|
|
90
|
+
refuse('id must use the recognized mem_ prefix')
|
|
91
|
+
}
|
|
92
|
+
if (!SAFE_STORAGE_ID.test(value)) {
|
|
93
|
+
refuse('id must be one cross-platform safe filename segment')
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Validate the domain shape before anything is installed in the live index.
|
|
99
|
+
*
|
|
100
|
+
* `DiskRecordStore` owns the version envelope and JSON parsing; it cannot
|
|
101
|
+
* know that this particular array contains memory entries. Keeping this
|
|
102
|
+
* check here avoids turning the generic primitive into a schema registry,
|
|
103
|
+
* while ensuring valid JSON with a wrong field type cannot be accepted and
|
|
104
|
+
* later written back beside a new record.
|
|
105
|
+
*/
|
|
106
|
+
function assertMemoryIndexEntries(value: unknown): asserts value is readonly MemoryIndexEntry[] {
|
|
107
|
+
if (!Array.isArray(value)) invalidIndex('the top-level value must be an array')
|
|
108
|
+
|
|
109
|
+
const ids = new Set<string>()
|
|
110
|
+
for (const [entryIndex, candidate] of value.entries()) {
|
|
111
|
+
if (candidate === null || typeof candidate !== 'object' || Array.isArray(candidate)) {
|
|
112
|
+
invalidIndex('each entry must be an object', { entryIndex })
|
|
113
|
+
}
|
|
114
|
+
const entry = candidate as Record<string, unknown>
|
|
115
|
+
|
|
116
|
+
assertStorageMemoryId(entry.id, (reason) =>
|
|
117
|
+
invalidIndex(reason, {
|
|
118
|
+
entryIndex,
|
|
119
|
+
field: 'id',
|
|
120
|
+
}),
|
|
121
|
+
)
|
|
122
|
+
if (ids.has(entry.id)) {
|
|
123
|
+
invalidIndex('ids must be unique', { entryIndex, field: 'id' })
|
|
124
|
+
}
|
|
125
|
+
ids.add(entry.id)
|
|
126
|
+
|
|
127
|
+
for (const field of ['title', 'summary'] as const) {
|
|
128
|
+
if (typeof entry[field] !== 'string') {
|
|
129
|
+
invalidIndex(`${field} must be a string`, { entryIndex, field })
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (!Array.isArray(entry.tags) || !entry.tags.every((tag) => typeof tag === 'string')) {
|
|
133
|
+
invalidIndex('tags must be an array of strings', { entryIndex, field: 'tags' })
|
|
134
|
+
}
|
|
135
|
+
if (entry.status !== 'active' && entry.status !== 'archived') {
|
|
136
|
+
invalidIndex('status must be active or archived', { entryIndex, field: 'status' })
|
|
137
|
+
}
|
|
138
|
+
for (const field of ['createdAt', 'updatedAt'] as const) {
|
|
139
|
+
if (typeof entry[field] !== 'number' || !Number.isFinite(entry[field])) {
|
|
140
|
+
invalidIndex(`${field} must be a finite number`, { entryIndex, field })
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function assertMemoryContent(value: unknown, expectedId: MemoryId): asserts value is MemoryContent {
|
|
147
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
148
|
+
invalidContent(expectedId, 'the record must be an object')
|
|
149
|
+
}
|
|
150
|
+
const content = value as Record<string, unknown>
|
|
151
|
+
assertStorageMemoryId(content.id, (reason) => invalidContent(expectedId, reason, { field: 'id' }))
|
|
152
|
+
if (content.id !== expectedId) {
|
|
153
|
+
invalidContent(expectedId, 'record id does not match its index owner', { field: 'id' })
|
|
154
|
+
}
|
|
155
|
+
if (typeof content.content !== 'string') {
|
|
156
|
+
invalidContent(expectedId, 'content must be a string', { field: 'content' })
|
|
157
|
+
}
|
|
158
|
+
if (content.format !== 'text' && content.format !== 'markdown' && content.format !== 'json') {
|
|
159
|
+
invalidContent(expectedId, 'format must be text, markdown, or json', { field: 'format' })
|
|
160
|
+
}
|
|
161
|
+
if (
|
|
162
|
+
content.metadata !== undefined &&
|
|
163
|
+
(content.metadata === null ||
|
|
164
|
+
typeof content.metadata !== 'object' ||
|
|
165
|
+
Array.isArray(content.metadata))
|
|
166
|
+
) {
|
|
167
|
+
invalidContent(expectedId, 'metadata must be an object when present', { field: 'metadata' })
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
29
171
|
export interface DiskMemoryStoreConfig {
|
|
30
172
|
baseDir: string
|
|
31
173
|
logger?: Logger
|
|
32
174
|
}
|
|
33
175
|
|
|
34
176
|
export class DiskMemoryStore implements MemoryStore {
|
|
35
|
-
private baseDir: string
|
|
36
|
-
private log: Logger
|
|
37
|
-
private index = new InMemoryMemoryIndex()
|
|
38
|
-
private
|
|
177
|
+
private readonly baseDir: string
|
|
178
|
+
private readonly log: Logger
|
|
179
|
+
private readonly index = new InMemoryMemoryIndex()
|
|
180
|
+
private location?: StorageLocation
|
|
39
181
|
// Two instances of one primitive rather than two copies of its body.
|
|
40
182
|
// Typed separately because the index file holds an ARRAY and a content
|
|
41
183
|
// file holds one record, and a single `DiskRecordStore<unknown>` would
|
|
42
184
|
// have put the cast back at every call site.
|
|
43
|
-
private readonly records = new DiskRecordStore<
|
|
44
|
-
private readonly indexRecords = new DiskRecordStore<
|
|
185
|
+
private readonly records = new DiskRecordStore<unknown>(SCHEMA)
|
|
186
|
+
private readonly indexRecords = new DiskRecordStore<unknown>(SCHEMA)
|
|
45
187
|
|
|
46
188
|
constructor(config: DiskMemoryStoreConfig) {
|
|
47
189
|
this.baseDir = join(config.baseDir, 'memory')
|
|
48
190
|
this.log = resolveLogger(config.logger).child({ [SCOPE_ATTRIBUTE]: 'store/memory/disk' })
|
|
49
191
|
}
|
|
50
192
|
|
|
51
|
-
private get indexPath(): string {
|
|
52
|
-
return join(this.baseDir, 'index.json')
|
|
53
|
-
}
|
|
54
|
-
|
|
55
193
|
private get contentDir(): string {
|
|
56
194
|
return join(this.baseDir, 'content')
|
|
57
195
|
}
|
|
58
196
|
|
|
59
|
-
private
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
private async ensureInit(): Promise<void> {
|
|
64
|
-
if (this.initialized) return
|
|
197
|
+
private async storageLocation(): Promise<StorageLocation> {
|
|
198
|
+
if (this.location) return this.location
|
|
65
199
|
|
|
66
200
|
await mkdir(this.contentDir, { recursive: true })
|
|
201
|
+
const [canonicalBaseDir, canonicalContentDir] = await Promise.all([
|
|
202
|
+
realpath(this.baseDir),
|
|
203
|
+
realpath(this.contentDir),
|
|
204
|
+
])
|
|
205
|
+
if (dirname(canonicalContentDir) !== canonicalBaseDir) {
|
|
206
|
+
invalidIndex('the content directory resolves outside the memory store')
|
|
207
|
+
}
|
|
208
|
+
this.location = {
|
|
209
|
+
indexPath: join(canonicalBaseDir, 'index.json'),
|
|
210
|
+
contentDir: canonicalContentDir,
|
|
211
|
+
}
|
|
212
|
+
return this.location
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
private contentPath(location: StorageLocation, id: MemoryId): string {
|
|
216
|
+
assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
|
|
217
|
+
const path = resolve(location.contentDir, `${id}.json`)
|
|
218
|
+
if (dirname(path) !== location.contentDir) {
|
|
219
|
+
invalidContent(id, 'resolved path escapes the content directory', { field: 'id' })
|
|
220
|
+
}
|
|
221
|
+
return path
|
|
222
|
+
}
|
|
67
223
|
|
|
224
|
+
private async reloadIndex(location: StorageLocation): Promise<void> {
|
|
68
225
|
try {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const entries = await this.indexRecords.read(this.indexPath)
|
|
74
|
-
if (entries !== null) {
|
|
75
|
-
this.index.rebuild([...entries])
|
|
76
|
-
this.log.info('Memory index loaded', { 'namzu.store.count': entries.length })
|
|
226
|
+
const entries = await this.indexRecords.read(location.indexPath)
|
|
227
|
+
if (entries === null) {
|
|
228
|
+
this.index.rebuild([])
|
|
229
|
+
return
|
|
77
230
|
}
|
|
231
|
+
assertMemoryIndexEntries(entries)
|
|
232
|
+
this.index.rebuild([...entries])
|
|
233
|
+
this.log.info('Memory index loaded', { 'namzu.store.count': entries.length })
|
|
78
234
|
} catch (err) {
|
|
79
|
-
this.log.
|
|
235
|
+
this.log.error('Failed to read memory index — refusing to start empty', {
|
|
80
236
|
'exception.message': String(err),
|
|
81
237
|
})
|
|
238
|
+
throw err
|
|
82
239
|
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private async withAuthoritativeIndex<T>(
|
|
243
|
+
operation: (location: StorageLocation) => Promise<T>,
|
|
244
|
+
): Promise<T> {
|
|
245
|
+
const location = await this.storageLocation()
|
|
246
|
+
return withMemoryOperationLock(location.indexPath, async () => {
|
|
247
|
+
await this.reloadIndex(location)
|
|
248
|
+
return operation(location)
|
|
249
|
+
})
|
|
250
|
+
}
|
|
83
251
|
|
|
84
|
-
|
|
252
|
+
private async readContent(location: StorageLocation, id: MemoryId): Promise<MemoryContent> {
|
|
253
|
+
const content = await this.records.read(this.contentPath(location, id))
|
|
254
|
+
if (content === null) invalidContent(id, 'the indexed content record is missing')
|
|
255
|
+
assertMemoryContent(content, id)
|
|
256
|
+
return content
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
private async writeIndex(
|
|
260
|
+
location: StorageLocation,
|
|
261
|
+
entries: readonly MemoryIndexEntry[],
|
|
262
|
+
): Promise<void> {
|
|
263
|
+
await this.indexRecords.write(location.indexPath, entries)
|
|
85
264
|
}
|
|
86
265
|
|
|
87
266
|
async create(
|
|
88
267
|
params: CreateMemoryParams,
|
|
89
268
|
): Promise<{ entry: MemoryIndexEntry; content: MemoryContent }> {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
269
|
+
return this.withAuthoritativeIndex(async (location) => {
|
|
270
|
+
const id = generateMemoryId()
|
|
271
|
+
const now = Date.now()
|
|
272
|
+
|
|
273
|
+
const entry: MemoryIndexEntry = {
|
|
274
|
+
id,
|
|
275
|
+
title: params.title,
|
|
276
|
+
summary: params.summary,
|
|
277
|
+
tags: params.tags ? [...params.tags] : [],
|
|
278
|
+
status: 'active',
|
|
279
|
+
createdAt: now,
|
|
280
|
+
updatedAt: now,
|
|
281
|
+
}
|
|
104
282
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
283
|
+
const memoryContent: MemoryContent = {
|
|
284
|
+
id,
|
|
285
|
+
content: params.content,
|
|
286
|
+
format: params.format ?? 'text',
|
|
287
|
+
metadata: params.metadata ? { ...params.metadata } : undefined,
|
|
288
|
+
}
|
|
289
|
+
const contentPath = this.contentPath(location, id)
|
|
290
|
+
const entries = [...this.index.allEntries(), entry]
|
|
111
291
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
292
|
+
await this.records.write(contentPath, memoryContent)
|
|
293
|
+
try {
|
|
294
|
+
await this.writeIndex(location, entries)
|
|
295
|
+
} catch (error) {
|
|
296
|
+
await unlink(contentPath).catch(() => undefined)
|
|
297
|
+
throw error
|
|
298
|
+
}
|
|
299
|
+
this.index.rebuild(entries)
|
|
115
300
|
|
|
116
|
-
|
|
301
|
+
this.log.info('Memory created', {
|
|
302
|
+
'namzu.memory.id': id,
|
|
303
|
+
'namzu.store.title': params.title,
|
|
304
|
+
})
|
|
117
305
|
|
|
118
|
-
|
|
306
|
+
return { entry, content: memoryContent }
|
|
307
|
+
})
|
|
119
308
|
}
|
|
120
309
|
|
|
121
310
|
async get(id: MemoryId): Promise<MemoryContent | undefined> {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return (await this.records.read(this.contentPath(id))) ?? undefined
|
|
128
|
-
} catch {
|
|
129
|
-
this.log.warn('Failed to read memory content', { 'namzu.memory.id': id })
|
|
130
|
-
return undefined
|
|
131
|
-
}
|
|
311
|
+
return this.withAuthoritativeIndex(async (location) => {
|
|
312
|
+
assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
|
|
313
|
+
if (!this.index.getEntry(id)) return undefined
|
|
314
|
+
return this.readContent(location, id)
|
|
315
|
+
})
|
|
132
316
|
}
|
|
133
317
|
|
|
134
318
|
async update(
|
|
135
319
|
id: MemoryId,
|
|
136
320
|
updates: Partial<CreateMemoryParams>,
|
|
137
321
|
): Promise<MemoryIndexEntry | undefined> {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
if (
|
|
157
|
-
updates.content !== undefined ||
|
|
158
|
-
updates.format !== undefined ||
|
|
159
|
-
updates.metadata !== undefined
|
|
160
|
-
) {
|
|
161
|
-
try {
|
|
162
|
-
const existingContent = await this.records.read(this.contentPath(id))
|
|
163
|
-
if (existingContent === null) throw new Error('memory content is missing')
|
|
164
|
-
|
|
322
|
+
return this.withAuthoritativeIndex(async (location) => {
|
|
323
|
+
assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
|
|
324
|
+
const existing = this.index.getEntry(id)
|
|
325
|
+
if (!existing) return undefined
|
|
326
|
+
const existingContent = await this.readContent(location, id)
|
|
327
|
+
const updated: MemoryIndexEntry = {
|
|
328
|
+
...existing,
|
|
329
|
+
title: updates.title ?? existing.title,
|
|
330
|
+
summary: updates.summary ?? existing.summary,
|
|
331
|
+
tags: updates.tags ? [...updates.tags] : existing.tags,
|
|
332
|
+
updatedAt: Date.now(),
|
|
333
|
+
}
|
|
334
|
+
const updatesContent =
|
|
335
|
+
updates.content !== undefined ||
|
|
336
|
+
updates.format !== undefined ||
|
|
337
|
+
updates.metadata !== undefined
|
|
338
|
+
if (updatesContent) {
|
|
165
339
|
const updatedContent: MemoryContent = {
|
|
166
340
|
...existingContent,
|
|
167
341
|
content: updates.content ?? existingContent.content,
|
|
@@ -169,41 +343,42 @@ export class DiskMemoryStore implements MemoryStore {
|
|
|
169
343
|
metadata:
|
|
170
344
|
updates.metadata !== undefined ? { ...updates.metadata } : existingContent.metadata,
|
|
171
345
|
}
|
|
172
|
-
|
|
173
|
-
await this.records.write(this.contentPath(id), updatedContent)
|
|
174
|
-
} catch {
|
|
175
|
-
this.log.warn('Failed to update memory content', { 'namzu.memory.id': id })
|
|
346
|
+
await this.records.write(this.contentPath(location, id), updatedContent)
|
|
176
347
|
}
|
|
177
|
-
}
|
|
178
348
|
|
|
179
|
-
|
|
180
|
-
|
|
349
|
+
const entries = this.index.allEntries().map((entry) => (entry.id === id ? updated : entry))
|
|
350
|
+
await this.writeIndex(location, entries)
|
|
351
|
+
this.index.rebuild([...entries])
|
|
352
|
+
|
|
353
|
+
this.log.info('Memory updated', { 'namzu.memory.id': id })
|
|
354
|
+
return updated
|
|
355
|
+
})
|
|
181
356
|
}
|
|
182
357
|
|
|
183
358
|
async delete(id: MemoryId): Promise<boolean> {
|
|
184
|
-
|
|
359
|
+
return this.withAuthoritativeIndex(async (location) => {
|
|
360
|
+
assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
|
|
361
|
+
if (!this.index.getEntry(id)) return false
|
|
185
362
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
363
|
+
try {
|
|
364
|
+
await unlink(this.contentPath(location, id))
|
|
365
|
+
} catch (error) {
|
|
366
|
+
if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error
|
|
367
|
+
}
|
|
368
|
+
const entries = this.index.allEntries().filter((entry) => entry.id !== id)
|
|
369
|
+
await this.writeIndex(location, entries)
|
|
370
|
+
this.index.rebuild([...entries])
|
|
191
371
|
|
|
192
|
-
|
|
193
|
-
|
|
372
|
+
this.log.info('Memory deleted', { 'namzu.memory.id': id })
|
|
373
|
+
return true
|
|
374
|
+
})
|
|
194
375
|
}
|
|
195
376
|
|
|
196
377
|
async list(params?: MemorySearchParams): Promise<MemorySearchResult> {
|
|
197
|
-
|
|
198
|
-
return this.index.search(params ?? {})
|
|
378
|
+
return this.withAuthoritativeIndex(async () => this.index.search(params ?? {}))
|
|
199
379
|
}
|
|
200
380
|
|
|
201
381
|
getIndex(): InMemoryMemoryIndex {
|
|
202
382
|
return this.index
|
|
203
383
|
}
|
|
204
|
-
|
|
205
|
-
private async persistIndex(): Promise<void> {
|
|
206
|
-
const entries = this.index.allEntries()
|
|
207
|
-
await this.indexRecords.write(this.indexPath, entries)
|
|
208
|
-
}
|
|
209
384
|
}
|
package/src/store/run/disk.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { appendFile, mkdir, readFile, readdir, unlink } from 'node:fs/promises'
|
|
2
2
|
import { join } from 'node:path'
|
|
3
3
|
import type { CheckpointId, IterationCheckpoint } from '../../types/hitl/index.js'
|
|
4
|
+
import type { Message } from '../../types/message/index.js'
|
|
4
5
|
import type {
|
|
5
6
|
AuditEvent,
|
|
6
7
|
PersistedRunEvent,
|
|
@@ -8,7 +9,12 @@ import type {
|
|
|
8
9
|
RunEvent,
|
|
9
10
|
RunStoreConfig,
|
|
10
11
|
} from '../../types/run/index.js'
|
|
11
|
-
import type {
|
|
12
|
+
import type {
|
|
13
|
+
CompletedToolRecord,
|
|
14
|
+
ReadRunEventsOptions,
|
|
15
|
+
RunMessageSnapshot,
|
|
16
|
+
RunStore,
|
|
17
|
+
} from '../../types/run/store.js'
|
|
12
18
|
import { atomicWriteFile } from '../../utils/atomic-write.js'
|
|
13
19
|
import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
|
|
14
20
|
import { type Logger, resolveLogger } from '../../utils/logger.js'
|
|
@@ -79,6 +85,10 @@ export class RunDiskStore implements RunStore {
|
|
|
79
85
|
return readRunEventsIn(this.requireInit(), options)
|
|
80
86
|
}
|
|
81
87
|
|
|
88
|
+
async readMessages(): Promise<RunMessageSnapshot> {
|
|
89
|
+
return readRunMessagesIn(this.requireInit())
|
|
90
|
+
}
|
|
91
|
+
|
|
82
92
|
async appendAuditEvent(event: AuditEvent): Promise<void> {
|
|
83
93
|
const dir = this.requireInit()
|
|
84
94
|
// One JSON object per line, exactly like `transcript.jsonl` — but its
|
|
@@ -204,9 +214,13 @@ export class RunDiskStore implements RunStore {
|
|
|
204
214
|
await atomicWriteJson(join(dir, 'run.json'), meta)
|
|
205
215
|
}
|
|
206
216
|
|
|
207
|
-
async writeMessages(run: Run): Promise<void> {
|
|
217
|
+
async writeMessages(run: Run, throughEventSeq: number): Promise<void> {
|
|
208
218
|
const dir = this.requireInit()
|
|
209
|
-
await atomicWriteJson(join(dir, 'messages.json'),
|
|
219
|
+
await atomicWriteJson(join(dir, 'messages.json'), {
|
|
220
|
+
format: 'namzu.run-message-snapshot.v1',
|
|
221
|
+
throughEventSeq,
|
|
222
|
+
messages: run.messages,
|
|
223
|
+
})
|
|
210
224
|
}
|
|
211
225
|
|
|
212
226
|
async writeReport(content: string): Promise<string> {
|
|
@@ -389,8 +403,15 @@ export async function readRunEventsIn(
|
|
|
389
403
|
}
|
|
390
404
|
|
|
391
405
|
const sinceSeq = options?.sinceSeq ?? 0
|
|
406
|
+
const strict = options?.integrity === 'strict'
|
|
407
|
+
if (strict && raw.length > 0 && !raw.endsWith('\n')) {
|
|
408
|
+
throw new Error(
|
|
409
|
+
`Invalid run transcript in ${join(runDir, 'transcript.jsonl')}: final record is not newline-terminated`,
|
|
410
|
+
)
|
|
411
|
+
}
|
|
392
412
|
const events: PersistedRunEvent[] = []
|
|
393
413
|
let position = 0
|
|
414
|
+
let previousSeq = 0
|
|
394
415
|
|
|
395
416
|
for (const line of raw.split('\n')) {
|
|
396
417
|
if (line.length === 0) continue
|
|
@@ -399,12 +420,31 @@ export async function readRunEventsIn(
|
|
|
399
420
|
let parsed: Record<string, unknown>
|
|
400
421
|
try {
|
|
401
422
|
parsed = JSON.parse(line) as Record<string, unknown>
|
|
402
|
-
} catch {
|
|
423
|
+
} catch (error) {
|
|
424
|
+
if (strict) {
|
|
425
|
+
throw new Error(
|
|
426
|
+
`Invalid run transcript in ${join(runDir, 'transcript.jsonl')}: record ${position} is not valid JSON`,
|
|
427
|
+
{ cause: error },
|
|
428
|
+
)
|
|
429
|
+
}
|
|
430
|
+
continue
|
|
431
|
+
}
|
|
432
|
+
if (parsed === null || typeof parsed !== 'object' || typeof parsed.type !== 'string') {
|
|
433
|
+
if (strict) {
|
|
434
|
+
throw new Error(
|
|
435
|
+
`Invalid run transcript in ${join(runDir, 'transcript.jsonl')}: record ${position} is not an event object`,
|
|
436
|
+
)
|
|
437
|
+
}
|
|
403
438
|
continue
|
|
404
439
|
}
|
|
405
|
-
if (parsed === null || typeof parsed !== 'object' || typeof parsed.type !== 'string') continue
|
|
406
440
|
|
|
407
441
|
const seq = typeof parsed.seq === 'number' ? parsed.seq : position
|
|
442
|
+
if (strict && (!Number.isSafeInteger(seq) || seq <= 0 || seq !== previousSeq + 1)) {
|
|
443
|
+
throw new Error(
|
|
444
|
+
`Invalid run transcript in ${join(runDir, 'transcript.jsonl')}: record ${position} has sequence ${String(seq)}, expected ${previousSeq + 1}`,
|
|
445
|
+
)
|
|
446
|
+
}
|
|
447
|
+
previousSeq = seq
|
|
408
448
|
if (seq <= sinceSeq) continue
|
|
409
449
|
|
|
410
450
|
events.push({
|
|
@@ -421,6 +461,57 @@ export async function readRunEventsIn(
|
|
|
421
461
|
return events
|
|
422
462
|
}
|
|
423
463
|
|
|
464
|
+
/**
|
|
465
|
+
* Read a run's surviving message snapshot without binding a store to it.
|
|
466
|
+
*
|
|
467
|
+
* Binding a {@link RunDiskStore} creates the directory, which would turn a
|
|
468
|
+
* missing run into an apparently empty one. This helper performs no writes.
|
|
469
|
+
*/
|
|
470
|
+
export async function readRunMessagesIn(runDir: string): Promise<RunMessageSnapshot> {
|
|
471
|
+
let raw: string
|
|
472
|
+
try {
|
|
473
|
+
raw = await readFile(join(runDir, 'messages.json'), 'utf-8')
|
|
474
|
+
} catch (err) {
|
|
475
|
+
if (isFileNotFound(err)) return { kind: 'unavailable', reason: 'not-persisted' }
|
|
476
|
+
throw err
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
let parsed: unknown
|
|
480
|
+
try {
|
|
481
|
+
parsed = JSON.parse(raw)
|
|
482
|
+
} catch {
|
|
483
|
+
throw new Error(
|
|
484
|
+
`Invalid run message snapshot in ${join(runDir, 'messages.json')}: invalid JSON`,
|
|
485
|
+
)
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// The pre-boundary format was the message array itself. Preserve access to
|
|
489
|
+
// those bytes, but do not manufacture the event-log boundary it never held.
|
|
490
|
+
if (Array.isArray(parsed)) {
|
|
491
|
+
return { kind: 'legacy-unverified', messages: parsed as Message[] }
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
if (
|
|
495
|
+
parsed === null ||
|
|
496
|
+
typeof parsed !== 'object' ||
|
|
497
|
+
(parsed as Record<string, unknown>).format !== 'namzu.run-message-snapshot.v1' ||
|
|
498
|
+
typeof (parsed as Record<string, unknown>).throughEventSeq !== 'number' ||
|
|
499
|
+
!Number.isSafeInteger((parsed as Record<string, unknown>).throughEventSeq) ||
|
|
500
|
+
((parsed as Record<string, unknown>).throughEventSeq as number) < 0 ||
|
|
501
|
+
!Array.isArray((parsed as Record<string, unknown>).messages)
|
|
502
|
+
) {
|
|
503
|
+
throw new Error(
|
|
504
|
+
`Invalid run message snapshot in ${join(runDir, 'messages.json')}: expected a versioned snapshot`,
|
|
505
|
+
)
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
return {
|
|
509
|
+
kind: 'available',
|
|
510
|
+
throughEventSeq: (parsed as Record<string, unknown>).throughEventSeq as number,
|
|
511
|
+
messages: (parsed as Record<string, unknown>).messages as Message[],
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
424
515
|
/**
|
|
425
516
|
* Terminate a transcript whose last line was cut off mid-write.
|
|
426
517
|
*
|