@namzu/sdk 48.3.1 → 50.0.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 +542 -0
- package/README.md +137 -125
- package/dist/agents/QueryAgent.d.ts.map +1 -1
- package/dist/agents/QueryAgent.js +1 -0
- package/dist/agents/QueryAgent.js.map +1 -1
- package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/examples/SupervisorAgent.js +1 -0
- package/dist/agents/examples/SupervisorAgent.js.map +1 -1
- package/dist/agents/runAgent.d.ts +2 -0
- package/dist/agents/runAgent.d.ts.map +1 -1
- package/dist/agents/runAgent.js +1 -0
- package/dist/agents/runAgent.js.map +1 -1
- package/dist/authorization/shell-lexer.d.ts.map +1 -1
- package/dist/authorization/shell-lexer.js +16 -1
- package/dist/authorization/shell-lexer.js.map +1 -1
- package/dist/bridge/acp/permission.d.ts +8 -2
- package/dist/bridge/acp/permission.d.ts.map +1 -1
- package/dist/bridge/acp/permission.js +1 -0
- package/dist/bridge/acp/permission.js.map +1 -1
- package/dist/bridge/acp/server.d.ts +25 -1
- package/dist/bridge/acp/server.d.ts.map +1 -1
- package/dist/bridge/acp/server.js +205 -21
- package/dist/bridge/acp/server.js.map +1 -1
- package/dist/bridge/acp/tasks.d.ts +5 -0
- package/dist/bridge/acp/tasks.d.ts.map +1 -0
- package/dist/bridge/acp/tasks.js +19 -0
- package/dist/bridge/acp/tasks.js.map +1 -0
- package/dist/bridge/acp/update.d.ts.map +1 -1
- package/dist/bridge/acp/update.js +148 -13
- package/dist/bridge/acp/update.js.map +1 -1
- package/dist/config/registry.d.ts +2 -0
- package/dist/config/registry.d.ts.map +1 -1
- package/dist/config/registry.js +23 -3
- package/dist/config/registry.js.map +1 -1
- package/dist/config/runtime.d.ts +31 -31
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +11 -4
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/connector/mcp/client.d.ts.map +1 -1
- package/dist/connector/mcp/client.js +6 -3
- package/dist/connector/mcp/client.js.map +1 -1
- package/dist/connector/mcp/discovery.d.ts +9 -5
- package/dist/connector/mcp/discovery.d.ts.map +1 -1
- package/dist/connector/mcp/discovery.js +16 -8
- package/dist/connector/mcp/discovery.js.map +1 -1
- package/dist/connector/mcp/mcp-toolset.d.ts +3 -0
- package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -1
- package/dist/connector/mcp/mcp-toolset.js +20 -2
- package/dist/connector/mcp/mcp-toolset.js.map +1 -1
- package/dist/connector/mcp/reconnect.d.ts +2 -0
- package/dist/connector/mcp/reconnect.d.ts.map +1 -1
- package/dist/connector/mcp/reconnect.js +36 -5
- package/dist/connector/mcp/reconnect.js.map +1 -1
- package/dist/constants/acp/index.d.ts +3 -0
- package/dist/constants/acp/index.d.ts.map +1 -1
- package/dist/constants/acp/index.js +3 -0
- package/dist/constants/acp/index.js.map +1 -1
- package/dist/contracts/a2a.d.ts +80 -80
- package/dist/contracts/schemas.d.ts +2 -2
- package/dist/contracts/session/schemas.d.ts +10 -10
- package/dist/manager/agent/lifecycle.d.ts +11 -0
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +178 -3
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/plan/lifecycle.d.ts +7 -8
- package/dist/manager/plan/lifecycle.d.ts.map +1 -1
- package/dist/manager/plan/lifecycle.js +7 -8
- package/dist/manager/plan/lifecycle.js.map +1 -1
- package/dist/manager/resident/consumption.d.ts +8 -8
- package/dist/manager/resident/learning-cycle.d.ts +2 -2
- package/dist/manager/resident/learning-observation.d.ts +12 -12
- package/dist/manager/resident/learning.d.ts +82 -82
- package/dist/manager/resident/outbox.d.ts +8 -8
- package/dist/manager/resident/proposal.d.ts +2 -2
- package/dist/manager/resident/store.d.ts +10 -10
- package/dist/manager/session/attribution.d.ts +1 -0
- package/dist/manager/session/attribution.d.ts.map +1 -1
- package/dist/manager/session/attribution.js +9 -1
- package/dist/manager/session/attribution.js.map +1 -1
- package/dist/manager/session/streamed-message-identity.d.ts +6 -0
- package/dist/manager/session/streamed-message-identity.d.ts.map +1 -0
- package/dist/manager/session/streamed-message-identity.js +14 -0
- package/dist/manager/session/streamed-message-identity.js.map +1 -0
- package/dist/manager/session/turn-recorder.d.ts.map +1 -1
- package/dist/manager/session/turn-recorder.js +4 -3
- package/dist/manager/session/turn-recorder.js.map +1 -1
- package/dist/pals/activity/causality.d.ts +23 -0
- package/dist/pals/activity/causality.d.ts.map +1 -0
- package/dist/pals/activity/causality.js +205 -0
- package/dist/pals/activity/causality.js.map +1 -0
- package/dist/pals/activity/projection.d.ts +5 -0
- package/dist/pals/activity/projection.d.ts.map +1 -0
- package/dist/pals/activity/projection.js +79 -0
- package/dist/pals/activity/projection.js.map +1 -0
- package/dist/pals/activity/source.d.ts +16 -0
- package/dist/pals/activity/source.d.ts.map +1 -0
- package/dist/pals/activity/source.js +235 -0
- package/dist/pals/activity/source.js.map +1 -0
- package/dist/pals/activity/subscription-policy.d.ts +38 -0
- package/dist/pals/activity/subscription-policy.d.ts.map +1 -0
- package/dist/pals/activity/subscription-policy.js +183 -0
- package/dist/pals/activity/subscription-policy.js.map +1 -0
- package/dist/pals/activity/subscription-schema.d.ts +353 -0
- package/dist/pals/activity/subscription-schema.d.ts.map +1 -0
- package/dist/pals/activity/subscription-schema.js +24 -0
- package/dist/pals/activity/subscription-schema.js.map +1 -0
- package/dist/pals/activity/subscription-store.d.ts +25 -0
- package/dist/pals/activity/subscription-store.d.ts.map +1 -0
- package/dist/pals/activity/subscription-store.js +152 -0
- package/dist/pals/activity/subscription-store.js.map +1 -0
- package/dist/pals/activity/subscription-types.d.ts +42 -0
- package/dist/pals/activity/subscription-types.d.ts.map +1 -0
- package/dist/pals/activity/subscription-types.js +2 -0
- package/dist/pals/activity/subscription-types.js.map +1 -0
- package/dist/pals/activity/subscriptions.d.ts +32 -0
- package/dist/pals/activity/subscriptions.d.ts.map +1 -0
- package/dist/pals/activity/subscriptions.js +151 -0
- package/dist/pals/activity/subscriptions.js.map +1 -0
- package/dist/pals/activity/types.d.ts +77 -0
- package/dist/pals/activity/types.d.ts.map +1 -0
- package/dist/pals/activity/types.js +2 -0
- package/dist/pals/activity/types.js.map +1 -0
- package/dist/pals/channels/ingress.d.ts +9 -0
- package/dist/pals/channels/ingress.d.ts.map +1 -0
- package/dist/pals/channels/ingress.js +131 -0
- package/dist/pals/channels/ingress.js.map +1 -0
- package/dist/pals/channels/routes.d.ts +20 -0
- package/dist/pals/channels/routes.d.ts.map +1 -0
- package/dist/pals/channels/routes.js +111 -0
- package/dist/pals/channels/routes.js.map +1 -0
- package/dist/pals/channels/routing.d.ts +37 -0
- package/dist/pals/channels/routing.d.ts.map +1 -0
- package/dist/pals/channels/routing.js +150 -0
- package/dist/pals/channels/routing.js.map +1 -0
- package/dist/pals/channels/schema.d.ts +234 -0
- package/dist/pals/channels/schema.d.ts.map +1 -0
- package/dist/pals/channels/schema.js +94 -0
- package/dist/pals/channels/schema.js.map +1 -0
- package/dist/pals/channels/types.d.ts +115 -0
- package/dist/pals/channels/types.d.ts.map +1 -0
- package/dist/pals/channels/types.js +2 -0
- package/dist/pals/channels/types.js.map +1 -0
- package/dist/pals/communication/broker.d.ts +8 -0
- package/dist/pals/communication/broker.d.ts.map +1 -0
- package/dist/pals/communication/broker.js +121 -0
- package/dist/pals/communication/broker.js.map +1 -0
- package/dist/pals/communication/dispatch.d.ts +4 -0
- package/dist/pals/communication/dispatch.d.ts.map +1 -0
- package/dist/pals/communication/dispatch.js +57 -0
- package/dist/pals/communication/dispatch.js.map +1 -0
- package/dist/pals/communication/inbound.d.ts +9 -0
- package/dist/pals/communication/inbound.d.ts.map +1 -0
- package/dist/pals/communication/inbound.js +155 -0
- package/dist/pals/communication/inbound.js.map +1 -0
- package/dist/pals/communication/ingress-dispatch.d.ts +5 -0
- package/dist/pals/communication/ingress-dispatch.d.ts.map +1 -0
- package/dist/pals/communication/ingress-dispatch.js +51 -0
- package/dist/pals/communication/ingress-dispatch.js.map +1 -0
- package/dist/pals/communication/ingress-inbound.d.ts +9 -0
- package/dist/pals/communication/ingress-inbound.d.ts.map +1 -0
- package/dist/pals/communication/ingress-inbound.js +222 -0
- package/dist/pals/communication/ingress-inbound.js.map +1 -0
- package/dist/pals/communication/ingress-schema.d.ts +7829 -0
- package/dist/pals/communication/ingress-schema.d.ts.map +1 -0
- package/dist/pals/communication/ingress-schema.js +479 -0
- package/dist/pals/communication/ingress-schema.js.map +1 -0
- package/dist/pals/communication/ingress-types.d.ts +187 -0
- package/dist/pals/communication/ingress-types.d.ts.map +1 -0
- package/dist/pals/communication/ingress-types.js +73 -0
- package/dist/pals/communication/ingress-types.js.map +1 -0
- package/dist/pals/communication/operator.d.ts +75 -0
- package/dist/pals/communication/operator.d.ts.map +1 -0
- package/dist/pals/communication/operator.js +217 -0
- package/dist/pals/communication/operator.js.map +1 -0
- package/dist/pals/communication/policy.d.ts +41 -0
- package/dist/pals/communication/policy.d.ts.map +1 -0
- package/dist/pals/communication/policy.js +138 -0
- package/dist/pals/communication/policy.js.map +1 -0
- package/dist/pals/communication/schema.d.ts +2000 -0
- package/dist/pals/communication/schema.d.ts.map +1 -0
- package/dist/pals/communication/schema.js +170 -0
- package/dist/pals/communication/schema.js.map +1 -0
- package/dist/pals/communication/store.d.ts +61 -0
- package/dist/pals/communication/store.d.ts.map +1 -0
- package/dist/pals/communication/store.js +450 -0
- package/dist/pals/communication/store.js.map +1 -0
- package/dist/pals/communication/tools.d.ts +23 -0
- package/dist/pals/communication/tools.d.ts.map +1 -0
- package/dist/pals/communication/tools.js +107 -0
- package/dist/pals/communication/tools.js.map +1 -0
- package/dist/pals/communication/types.d.ts +168 -0
- package/dist/pals/communication/types.d.ts.map +1 -0
- package/dist/pals/communication/types.js +24 -0
- package/dist/pals/communication/types.js.map +1 -0
- package/dist/pals/communication/verify.d.ts +22 -0
- package/dist/pals/communication/verify.d.ts.map +1 -0
- package/dist/pals/communication/verify.js +142 -0
- package/dist/pals/communication/verify.js.map +1 -0
- package/dist/pals/lifecycle.d.ts +37 -0
- package/dist/pals/lifecycle.d.ts.map +1 -0
- package/dist/pals/lifecycle.js +22 -0
- package/dist/pals/lifecycle.js.map +1 -0
- package/dist/pals/prompt.d.ts +30 -0
- package/dist/pals/prompt.d.ts.map +1 -0
- package/dist/pals/prompt.js +65 -0
- package/dist/pals/prompt.js.map +1 -0
- package/dist/pals/reference-images.d.ts +44 -0
- package/dist/pals/reference-images.d.ts.map +1 -0
- package/dist/pals/reference-images.js +248 -0
- package/dist/pals/reference-images.js.map +1 -0
- package/dist/pals/runtime.d.ts +46 -0
- package/dist/pals/runtime.d.ts.map +1 -0
- package/dist/pals/runtime.js +624 -0
- package/dist/pals/runtime.js.map +1 -0
- package/dist/pals/store.d.ts +26 -0
- package/dist/pals/store.d.ts.map +1 -0
- package/dist/pals/store.js +334 -0
- package/dist/pals/store.js.map +1 -0
- package/dist/pals/types.d.ts +145 -0
- package/dist/pals/types.d.ts.map +1 -0
- package/dist/pals/types.js +2 -0
- package/dist/pals/types.js.map +1 -0
- package/dist/peers/envelope.js +1 -1
- package/dist/peers/envelope.js.map +1 -1
- package/dist/peers/protocol.d.ts +83 -83
- package/dist/peers/record.d.ts +10 -10
- package/dist/plugin/lifecycle.d.ts +14 -10
- package/dist/plugin/lifecycle.d.ts.map +1 -1
- package/dist/plugin/lifecycle.js +178 -41
- package/dist/plugin/lifecycle.js.map +1 -1
- package/dist/plugin/shell-hook.d.ts.map +1 -1
- package/dist/plugin/shell-hook.js +7 -2
- package/dist/plugin/shell-hook.js.map +1 -1
- package/dist/process/kill-tree.d.ts.map +1 -1
- package/dist/process/kill-tree.js +9 -1
- package/dist/process/kill-tree.js.map +1 -1
- package/dist/prompt/resident-learning.js +2 -2
- package/dist/prompt/resident-learning.js.map +1 -1
- package/dist/prompt/resident-step.d.ts +2 -2
- package/dist/prompt/resident-step.js +4 -4
- package/dist/prompt/resident-step.js.map +1 -1
- package/dist/provider/errors.d.ts +19 -0
- package/dist/provider/errors.d.ts.map +1 -1
- package/dist/provider/errors.js +123 -2
- package/dist/provider/errors.js.map +1 -1
- package/dist/public-runtime.d.ts +43 -15
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +37 -9
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +8 -3
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +8 -3
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +27 -7
- package/dist/public-types.d.ts.map +1 -1
- package/dist/registry/tool/presentation.d.ts +1 -0
- package/dist/registry/tool/presentation.d.ts.map +1 -1
- package/dist/registry/tool/presentation.js +9 -7
- package/dist/registry/tool/presentation.js.map +1 -1
- package/dist/registry/tool/screen.d.ts.map +1 -1
- package/dist/registry/tool/screen.js +33 -2
- package/dist/registry/tool/screen.js.map +1 -1
- package/dist/runtime/harness-session/index.d.ts +5 -0
- package/dist/runtime/harness-session/index.d.ts.map +1 -0
- package/dist/runtime/harness-session/index.js +928 -0
- package/dist/runtime/harness-session/index.js.map +1 -0
- package/dist/runtime/harness-session/journal.d.ts +37 -0
- package/dist/runtime/harness-session/journal.d.ts.map +1 -0
- package/dist/runtime/harness-session/journal.js +177 -0
- package/dist/runtime/harness-session/journal.js.map +1 -0
- package/dist/runtime/harness-session/saved-view.d.ts +8 -0
- package/dist/runtime/harness-session/saved-view.d.ts.map +1 -0
- package/dist/runtime/harness-session/saved-view.js +112 -0
- package/dist/runtime/harness-session/saved-view.js.map +1 -0
- package/dist/runtime/jobs/awaited-jobs.d.ts +2 -1
- package/dist/runtime/jobs/awaited-jobs.d.ts.map +1 -1
- package/dist/runtime/jobs/awaited-jobs.js +2 -1
- package/dist/runtime/jobs/awaited-jobs.js.map +1 -1
- package/dist/runtime/jobs/registry.d.ts +56 -1
- package/dist/runtime/jobs/registry.d.ts.map +1 -1
- package/dist/runtime/jobs/registry.js +377 -39
- package/dist/runtime/jobs/registry.js.map +1 -1
- package/dist/runtime/query/abandon-turn.d.ts +12 -1
- package/dist/runtime/query/abandon-turn.d.ts.map +1 -1
- package/dist/runtime/query/abandon-turn.js +3 -1
- package/dist/runtime/query/abandon-turn.js.map +1 -1
- package/dist/runtime/query/checkpoint.d.ts +4 -0
- package/dist/runtime/query/checkpoint.d.ts.map +1 -1
- package/dist/runtime/query/checkpoint.js +10 -0
- package/dist/runtime/query/checkpoint.js.map +1 -1
- package/dist/runtime/query/durable-inbound.d.ts +5 -0
- package/dist/runtime/query/durable-inbound.d.ts.map +1 -0
- package/dist/runtime/query/durable-inbound.js +89 -0
- package/dist/runtime/query/durable-inbound.js.map +1 -0
- package/dist/runtime/query/events.d.ts +4 -0
- package/dist/runtime/query/events.d.ts.map +1 -1
- package/dist/runtime/query/events.js +22 -5
- package/dist/runtime/query/events.js.map +1 -1
- package/dist/runtime/query/executor/tool-call-admission.d.ts +5 -1
- package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
- package/dist/runtime/query/executor/tool-call-admission.js +85 -13
- package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +41 -18
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +227 -114
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/index.d.ts +9 -0
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +41 -5
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts +18 -6
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +176 -75
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/outstanding-work.d.ts +9 -5
- package/dist/runtime/query/iteration/outstanding-work.d.ts.map +1 -1
- package/dist/runtime/query/iteration/outstanding-work.js +63 -6
- package/dist/runtime/query/iteration/outstanding-work.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +8 -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 +106 -17
- package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
- package/dist/runtime/query/iteration/step-shaping.d.ts +2 -0
- package/dist/runtime/query/iteration/step-shaping.d.ts.map +1 -1
- package/dist/runtime/query/iteration/step-shaping.js +5 -1
- package/dist/runtime/query/iteration/step-shaping.js.map +1 -1
- package/dist/runtime/query/observation-context.d.ts +2 -2
- package/dist/runtime/query/observation-context.d.ts.map +1 -1
- package/dist/runtime/query/observation-context.js +20 -13
- package/dist/runtime/query/observation-context.js.map +1 -1
- package/dist/runtime/query/prepare-turn.js +2 -2
- package/dist/runtime/query/prepare-turn.js.map +1 -1
- package/dist/runtime/query/prompt-cache.d.ts +1 -0
- package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
- package/dist/runtime/query/prompt-cache.js +2 -0
- package/dist/runtime/query/prompt-cache.js.map +1 -1
- package/dist/runtime/query/prompt.d.ts +2 -0
- package/dist/runtime/query/prompt.d.ts.map +1 -1
- package/dist/runtime/query/prompt.js +23 -1
- package/dist/runtime/query/prompt.js.map +1 -1
- package/dist/runtime/query/repeat-call.d.ts +12 -3
- package/dist/runtime/query/repeat-call.d.ts.map +1 -1
- package/dist/runtime/query/repeat-call.js +33 -10
- package/dist/runtime/query/repeat-call.js.map +1 -1
- package/dist/runtime/query/resume-pending.d.ts +5 -6
- package/dist/runtime/query/resume-pending.d.ts.map +1 -1
- package/dist/runtime/query/resume-pending.js +30 -3
- package/dist/runtime/query/resume-pending.js.map +1 -1
- package/dist/runtime/query/resume-session.js +1 -1
- package/dist/runtime/query/resume-session.js.map +1 -1
- package/dist/runtime/query/review-policy.d.ts +8 -1
- package/dist/runtime/query/review-policy.d.ts.map +1 -1
- package/dist/runtime/query/review-policy.js +6 -0
- package/dist/runtime/query/review-policy.js.map +1 -1
- package/dist/runtime/query/saved-presentation.d.ts +13 -0
- package/dist/runtime/query/saved-presentation.d.ts.map +1 -0
- package/dist/runtime/query/saved-presentation.js +63 -0
- package/dist/runtime/query/saved-presentation.js.map +1 -0
- package/dist/runtime/query/steering.d.ts +6 -9
- package/dist/runtime/query/steering.d.ts.map +1 -1
- package/dist/runtime/query/steering.js.map +1 -1
- package/dist/runtime/query/tool-executions.d.ts +7 -3
- package/dist/runtime/query/tool-executions.d.ts.map +1 -1
- package/dist/runtime/query/tool-executions.js +89 -9
- package/dist/runtime/query/tool-executions.js.map +1 -1
- package/dist/runtime/query/tooling.d.ts +3 -1
- package/dist/runtime/query/tooling.d.ts.map +1 -1
- package/dist/runtime/query/tooling.js +3 -0
- package/dist/runtime/query/tooling.js.map +1 -1
- package/dist/scheduler/completion-inbox.d.ts +25 -1
- package/dist/scheduler/completion-inbox.d.ts.map +1 -1
- package/dist/scheduler/completion-inbox.js +102 -8
- package/dist/scheduler/completion-inbox.js.map +1 -1
- package/dist/scheduler/delegating.d.ts.map +1 -1
- package/dist/scheduler/delegating.js +5 -0
- package/dist/scheduler/delegating.js.map +1 -1
- package/dist/scheduler/local.d.ts.map +1 -1
- package/dist/scheduler/local.js +2 -0
- package/dist/scheduler/local.js.map +1 -1
- package/dist/session/summary/materialize.d.ts +10 -6
- package/dist/session/summary/materialize.d.ts.map +1 -1
- package/dist/session/summary/materialize.js +41 -8
- package/dist/session/summary/materialize.js.map +1 -1
- package/dist/store/budget/ledger.d.ts +9 -0
- package/dist/store/budget/ledger.d.ts.map +1 -1
- package/dist/store/budget/ledger.js +58 -6
- package/dist/store/budget/ledger.js.map +1 -1
- package/dist/store/evidence/index-page.d.ts +12 -12
- package/dist/store/evidence/source-text.d.ts +4 -4
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/memory/disk.d.ts +7 -2
- package/dist/store/memory/disk.d.ts.map +1 -1
- package/dist/store/memory/disk.js +58 -5
- package/dist/store/memory/disk.js.map +1 -1
- package/dist/store/memory/index.d.ts +9 -0
- package/dist/store/memory/index.d.ts.map +1 -1
- package/dist/store/memory/index.js +43 -5
- package/dist/store/memory/index.js.map +1 -1
- package/dist/store/memory/markdown.d.ts +7 -2
- package/dist/store/memory/markdown.d.ts.map +1 -1
- package/dist/store/memory/markdown.js +33 -0
- package/dist/store/memory/markdown.js.map +1 -1
- package/dist/store/memory/memory.d.ts +7 -2
- package/dist/store/memory/memory.d.ts.map +1 -1
- package/dist/store/memory/memory.js +34 -0
- package/dist/store/memory/memory.js.map +1 -1
- package/dist/store/memory/revision.d.ts +16 -0
- package/dist/store/memory/revision.d.ts.map +1 -0
- package/dist/store/memory/revision.js +144 -0
- package/dist/store/memory/revision.js.map +1 -0
- package/dist/store/session/disk.d.ts +9 -4
- package/dist/store/session/disk.d.ts.map +1 -1
- package/dist/store/session/disk.js +57 -11
- package/dist/store/session/disk.js.map +1 -1
- package/dist/store/session/memory.d.ts +5 -3
- package/dist/store/session/memory.d.ts.map +1 -1
- package/dist/store/session/memory.js +24 -7
- package/dist/store/session/memory.js.map +1 -1
- package/dist/store/session-log/core.d.ts +26 -6
- package/dist/store/session-log/core.d.ts.map +1 -1
- package/dist/store/session-log/core.js +61 -8
- package/dist/store/session-log/core.js.map +1 -1
- package/dist/store/session-log/disk.d.ts +2 -2
- package/dist/store/session-log/disk.d.ts.map +1 -1
- package/dist/store/session-log/disk.js +1 -0
- package/dist/store/session-log/disk.js.map +1 -1
- package/dist/store/session-log/fold.d.ts +7 -0
- package/dist/store/session-log/fold.d.ts.map +1 -1
- package/dist/store/session-log/fold.js +21 -0
- package/dist/store/session-log/fold.js.map +1 -1
- package/dist/store/session-log/index.d.ts +5 -3
- package/dist/store/session-log/index.d.ts.map +1 -1
- package/dist/store/session-log/index.js +3 -1
- package/dist/store/session-log/index.js.map +1 -1
- package/dist/store/session-log/memory.d.ts +1 -1
- package/dist/store/session-log/memory.d.ts.map +1 -1
- package/dist/store/session-log/memory.js +1 -0
- package/dist/store/session-log/memory.js.map +1 -1
- package/dist/store/session-log/spill.d.ts +10 -3
- package/dist/store/session-log/spill.d.ts.map +1 -1
- package/dist/store/session-log/spill.js +70 -5
- package/dist/store/session-log/spill.js.map +1 -1
- package/dist/store/session-log/structured-result.d.ts +21 -0
- package/dist/store/session-log/structured-result.d.ts.map +1 -0
- package/dist/store/session-log/structured-result.js +67 -0
- package/dist/store/session-log/structured-result.js.map +1 -0
- package/dist/store/task/disk.d.ts +11 -0
- package/dist/store/task/disk.d.ts.map +1 -1
- package/dist/store/task/disk.js +41 -2
- package/dist/store/task/disk.js.map +1 -1
- package/dist/store/task/memory.d.ts.map +1 -1
- package/dist/store/task/memory.js +15 -3
- package/dist/store/task/memory.js.map +1 -1
- package/dist/tools/admit-facts.d.ts +13 -0
- package/dist/tools/admit-facts.d.ts.map +1 -0
- package/dist/tools/admit-facts.js +142 -0
- package/dist/tools/admit-facts.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts +4 -1
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +108 -22
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/browser.d.ts +10 -10
- package/dist/tools/builtins/computer-use.d.ts +90 -90
- package/dist/tools/builtins/edit.d.ts +17 -0
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +34 -0
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/file-write-result.d.ts.map +1 -1
- package/dist/tools/builtins/file-write-result.js +13 -0
- package/dist/tools/builtins/file-write-result.js.map +1 -1
- package/dist/tools/builtins/glob.d.ts.map +1 -1
- package/dist/tools/builtins/glob.js +12 -0
- package/dist/tools/builtins/glob.js.map +1 -1
- package/dist/tools/builtins/grep.d.ts.map +1 -1
- package/dist/tools/builtins/grep.js +14 -0
- package/dist/tools/builtins/grep.js.map +1 -1
- package/dist/tools/builtins/index.d.ts +2 -0
- package/dist/tools/builtins/index.d.ts.map +1 -1
- package/dist/tools/builtins/index.js +1 -0
- package/dist/tools/builtins/index.js.map +1 -1
- package/dist/tools/builtins/job.d.ts.map +1 -1
- package/dist/tools/builtins/job.js +4 -1
- package/dist/tools/builtins/job.js.map +1 -1
- package/dist/tools/builtins/lsp.d.ts +2 -2
- package/dist/tools/builtins/read-file.d.ts.map +1 -1
- package/dist/tools/builtins/read-file.js +49 -0
- package/dist/tools/builtins/read-file.js.map +1 -1
- package/dist/tools/builtins/view-image.d.ts +24 -0
- package/dist/tools/builtins/view-image.d.ts.map +1 -0
- package/dist/tools/builtins/view-image.js +385 -0
- package/dist/tools/builtins/view-image.js.map +1 -0
- package/dist/tools/builtins/wait-for-job-bounds.d.ts +8 -4
- package/dist/tools/builtins/wait-for-job-bounds.d.ts.map +1 -1
- package/dist/tools/builtins/wait-for-job-bounds.js +43 -8
- package/dist/tools/builtins/wait-for-job-bounds.js.map +1 -1
- package/dist/tools/builtins/wait-for-job.d.ts +3 -0
- package/dist/tools/builtins/wait-for-job.d.ts.map +1 -1
- package/dist/tools/builtins/wait-for-job.js +127 -15
- package/dist/tools/builtins/wait-for-job.js.map +1 -1
- package/dist/tools/builtins/write-file.d.ts.map +1 -1
- package/dist/tools/builtins/write-file.js +1 -0
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/command-shell.d.ts +37 -2
- package/dist/tools/command-shell.d.ts.map +1 -1
- package/dist/tools/command-shell.js +100 -3
- package/dist/tools/command-shell.js.map +1 -1
- package/dist/tools/coordinator/agent.d.ts +9 -19
- package/dist/tools/coordinator/agent.d.ts.map +1 -1
- package/dist/tools/coordinator/agent.js.map +1 -1
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +127 -67
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/coordinator/wait-with-idle-bound.d.ts +2 -0
- package/dist/tools/coordinator/wait-with-idle-bound.d.ts.map +1 -1
- package/dist/tools/coordinator/wait-with-idle-bound.js +1 -1
- package/dist/tools/coordinator/wait-with-idle-bound.js.map +1 -1
- package/dist/tools/defineTool.d.ts.map +1 -1
- package/dist/tools/defineTool.js +4 -0
- package/dist/tools/defineTool.js.map +1 -1
- package/dist/tools/failure-facts.d.ts +8 -0
- package/dist/tools/failure-facts.d.ts.map +1 -0
- package/dist/tools/failure-facts.js +24 -0
- package/dist/tools/failure-facts.js.map +1 -0
- package/dist/tools/host-output.d.ts +24 -0
- package/dist/tools/host-output.d.ts.map +1 -0
- package/dist/tools/host-output.js +117 -0
- package/dist/tools/host-output.js.map +1 -0
- package/dist/tools/memory/delete.d.ts.map +1 -1
- package/dist/tools/memory/delete.js +38 -3
- package/dist/tools/memory/delete.js.map +1 -1
- package/dist/tools/memory/read.d.ts.map +1 -1
- package/dist/tools/memory/read.js +38 -2
- package/dist/tools/memory/read.js.map +1 -1
- package/dist/tools/memory/search.d.ts.map +1 -1
- package/dist/tools/memory/search.js +38 -7
- package/dist/tools/memory/search.js.map +1 -1
- package/dist/tools/memory/update.d.ts.map +1 -1
- package/dist/tools/memory/update.js +30 -3
- package/dist/tools/memory/update.js.map +1 -1
- package/dist/tools/oem-code-pages.d.ts +8 -0
- package/dist/tools/oem-code-pages.d.ts.map +1 -0
- package/dist/tools/oem-code-pages.js +23 -0
- package/dist/tools/oem-code-pages.js.map +1 -0
- package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
- package/dist/tools/schedules/schedule-tool.js +35 -6
- package/dist/tools/schedules/schedule-tool.js.map +1 -1
- package/dist/tools/schedules/types.d.ts +23 -3
- package/dist/tools/schedules/types.d.ts.map +1 -1
- package/dist/tools/task/list.d.ts.map +1 -1
- package/dist/tools/task/list.js +14 -6
- package/dist/tools/task/list.js.map +1 -1
- package/dist/tools/task/present.d.ts.map +1 -1
- package/dist/tools/task/present.js +26 -6
- package/dist/tools/task/present.js.map +1 -1
- package/dist/tools/task/update.d.ts.map +1 -1
- package/dist/tools/task/update.js +12 -5
- package/dist/tools/task/update.js.map +1 -1
- package/dist/tools/text-window.d.ts +19 -0
- package/dist/tools/text-window.d.ts.map +1 -0
- package/dist/tools/text-window.js +83 -0
- package/dist/tools/text-window.js.map +1 -0
- package/dist/toolsets/manager.d.ts +24 -0
- package/dist/toolsets/manager.d.ts.map +1 -1
- package/dist/toolsets/manager.js +105 -2
- package/dist/toolsets/manager.js.map +1 -1
- package/dist/turn/memory-recall.d.ts +2 -0
- package/dist/turn/memory-recall.d.ts.map +1 -1
- package/dist/turn/memory-recall.js +3 -1
- package/dist/turn/memory-recall.js.map +1 -1
- package/dist/types/acp/index.d.ts +137 -1
- package/dist/types/acp/index.d.ts.map +1 -1
- package/dist/types/agent/base.d.ts +3 -0
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/manager.d.ts +8 -23
- package/dist/types/agent/manager.d.ts.map +1 -1
- package/dist/types/agent/scheduler.d.ts +10 -1
- package/dist/types/agent/scheduler.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +4 -0
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/authorization/index.d.ts +30 -30
- package/dist/types/connector/mcp.d.ts +7 -0
- package/dist/types/connector/mcp.d.ts.map +1 -1
- package/dist/types/errors/catalog.d.ts.map +1 -1
- package/dist/types/errors/catalog.js +4 -2
- package/dist/types/errors/catalog.js.map +1 -1
- package/dist/types/harness/schema.d.ts +354 -0
- package/dist/types/harness/schema.d.ts.map +1 -0
- package/dist/types/harness/schema.js +203 -0
- package/dist/types/harness/schema.js.map +1 -0
- package/dist/types/harness/session.d.ts +278 -0
- package/dist/types/harness/session.d.ts.map +1 -0
- package/dist/types/harness/session.js +2 -0
- package/dist/types/harness/session.js.map +1 -0
- package/dist/types/hitl/index.d.ts +12 -0
- package/dist/types/hitl/index.d.ts.map +1 -1
- package/dist/types/hitl/index.js.map +1 -1
- package/dist/types/job/index.d.ts +47 -0
- package/dist/types/job/index.d.ts.map +1 -0
- package/dist/types/job/index.js +2 -0
- package/dist/types/job/index.js.map +1 -0
- package/dist/types/memory/index.d.ts +29 -0
- package/dist/types/memory/index.d.ts.map +1 -1
- package/dist/types/memory/index.js +6 -0
- package/dist/types/memory/index.js.map +1 -1
- package/dist/types/message/inbound-delivery.d.ts +44 -0
- package/dist/types/message/inbound-delivery.d.ts.map +1 -0
- package/dist/types/message/inbound-delivery.js +14 -0
- package/dist/types/message/inbound-delivery.js.map +1 -0
- package/dist/types/message/index.d.ts +4 -1
- package/dist/types/message/index.d.ts.map +1 -1
- package/dist/types/message/index.js +5 -1
- package/dist/types/message/index.js.map +1 -1
- package/dist/types/plugin/index.d.ts +18 -8
- package/dist/types/plugin/index.d.ts.map +1 -1
- package/dist/types/plugin/index.js +5 -2
- package/dist/types/plugin/index.js.map +1 -1
- package/dist/types/sandbox/index.d.ts +39 -2
- package/dist/types/sandbox/index.d.ts.map +1 -1
- package/dist/types/sandbox/index.js.map +1 -1
- package/dist/types/session/checkpoint.d.ts +24 -17
- package/dist/types/session/checkpoint.d.ts.map +1 -1
- package/dist/types/session/checkpoint.js +1 -0
- package/dist/types/session/checkpoint.js.map +1 -1
- package/dist/types/session/events.d.ts +23 -1
- package/dist/types/session/events.d.ts.map +1 -1
- package/dist/types/session/events.js.map +1 -1
- package/dist/types/session/records.d.ts +1514 -565
- package/dist/types/session/records.d.ts.map +1 -1
- package/dist/types/session/records.js +89 -1
- package/dist/types/session/records.js.map +1 -1
- package/dist/types/session/step.d.ts +2 -0
- package/dist/types/session/step.d.ts.map +1 -1
- package/dist/types/session/step.js.map +1 -1
- package/dist/types/session/store.d.ts +19 -10
- package/dist/types/session/store.d.ts.map +1 -1
- package/dist/types/session/tool-execution.d.ts +6 -0
- package/dist/types/session/tool-execution.d.ts.map +1 -1
- package/dist/types/structured-output/index.d.ts +12 -2
- package/dist/types/structured-output/index.d.ts.map +1 -1
- package/dist/types/summary/ref.d.ts +3 -1
- package/dist/types/summary/ref.d.ts.map +1 -1
- package/dist/types/tool/index.d.ts +32 -4
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/types/tool/presentation.d.ts +106 -0
- package/dist/types/tool/presentation.d.ts.map +1 -1
- package/dist/utils/json-snapshot.d.ts +6 -2
- package/dist/utils/json-snapshot.d.ts.map +1 -1
- package/dist/utils/json-snapshot.js +19 -9
- package/dist/utils/json-snapshot.js.map +1 -1
- package/dist/utils/structured-result-json.d.ts +5 -0
- package/dist/utils/structured-result-json.d.ts.map +1 -0
- package/dist/utils/structured-result-json.js +10 -0
- package/dist/utils/structured-result-json.js.map +1 -0
- package/package.json +1 -1
- package/src/agents/QueryAgent.ts +1 -0
- package/src/agents/examples/SupervisorAgent.ts +1 -0
- package/src/agents/runAgent.ts +3 -0
- package/src/authorization/shell-lexer.ts +16 -1
- package/src/bridge/acp/permission.ts +17 -3
- package/src/bridge/acp/server.ts +271 -25
- package/src/bridge/acp/tasks.ts +23 -0
- package/src/bridge/acp/update.ts +167 -13
- package/src/config/registry.ts +24 -3
- package/src/connector/mcp/adapter.ts +16 -4
- package/src/connector/mcp/client.ts +6 -2
- package/src/connector/mcp/discovery.ts +29 -8
- package/src/connector/mcp/mcp-toolset.ts +25 -4
- package/src/connector/mcp/reconnect.ts +34 -4
- package/src/constants/acp/index.ts +4 -0
- package/src/manager/agent/lifecycle.ts +230 -3
- package/src/manager/plan/lifecycle.ts +11 -9
- package/src/manager/session/attribution.ts +12 -2
- package/src/manager/session/streamed-message-identity.ts +21 -0
- package/src/manager/session/turn-recorder.ts +4 -3
- package/src/pals/activity/causality.ts +261 -0
- package/src/pals/activity/projection.ts +89 -0
- package/src/pals/activity/source.ts +240 -0
- package/src/pals/activity/subscription-policy.ts +230 -0
- package/src/pals/activity/subscription-schema.ts +27 -0
- package/src/pals/activity/subscription-store.ts +172 -0
- package/src/pals/activity/subscription-types.ts +48 -0
- package/src/pals/activity/subscriptions.ts +209 -0
- package/src/pals/activity/types.ts +108 -0
- package/src/pals/channels/ingress.ts +153 -0
- package/src/pals/channels/routes.ts +118 -0
- package/src/pals/channels/routing.ts +197 -0
- package/src/pals/channels/schema.ts +108 -0
- package/src/pals/channels/types.ts +156 -0
- package/src/pals/communication/broker.ts +131 -0
- package/src/pals/communication/dispatch.ts +66 -0
- package/src/pals/communication/inbound.ts +193 -0
- package/src/pals/communication/ingress-dispatch.ts +63 -0
- package/src/pals/communication/ingress-inbound.ts +269 -0
- package/src/pals/communication/ingress-schema.ts +526 -0
- package/src/pals/communication/ingress-types.ts +336 -0
- package/src/pals/communication/operator.ts +315 -0
- package/src/pals/communication/policy.ts +174 -0
- package/src/pals/communication/schema.ts +173 -0
- package/src/pals/communication/store.ts +577 -0
- package/src/pals/communication/tools.ts +139 -0
- package/src/pals/communication/types.ts +227 -0
- package/src/pals/communication/verify.ts +220 -0
- package/src/pals/lifecycle.ts +54 -0
- package/src/pals/prompt.ts +101 -0
- package/src/pals/reference-images.ts +322 -0
- package/src/pals/runtime.ts +670 -0
- package/src/pals/store.ts +369 -0
- package/src/pals/types.ts +157 -0
- package/src/peers/envelope.ts +1 -1
- package/src/plugin/lifecycle.ts +217 -46
- package/src/plugin/shell-hook.ts +8 -2
- package/src/process/kill-tree.ts +10 -1
- package/src/prompt/resident-learning.ts +2 -2
- package/src/prompt/resident-step.ts +4 -4
- package/src/provider/errors.ts +135 -2
- package/src/public-runtime.ts +119 -12
- package/src/public-tools.ts +13 -1
- package/src/public-types.ts +69 -7
- package/src/registry/tool/presentation.ts +9 -4
- package/src/registry/tool/screen.ts +34 -2
- package/src/runtime/harness-session/index.ts +1125 -0
- package/src/runtime/harness-session/journal.ts +209 -0
- package/src/runtime/harness-session/saved-view.ts +122 -0
- package/src/runtime/jobs/awaited-jobs.ts +2 -1
- package/src/runtime/jobs/registry.ts +423 -50
- package/src/runtime/query/abandon-turn.ts +18 -2
- package/src/runtime/query/checkpoint.ts +11 -0
- package/src/runtime/query/durable-inbound.ts +101 -0
- package/src/runtime/query/events.ts +22 -5
- package/src/runtime/query/executor/tool-call-admission.ts +125 -32
- package/src/runtime/query/executor.ts +316 -130
- package/src/runtime/query/index.ts +48 -5
- package/src/runtime/query/iteration/index.ts +253 -114
- package/src/runtime/query/iteration/outstanding-work.ts +57 -7
- package/src/runtime/query/iteration/phases/context.ts +8 -0
- package/src/runtime/query/iteration/phases/tool-review.ts +124 -22
- package/src/runtime/query/iteration/step-shaping.ts +9 -1
- package/src/runtime/query/observation-context.ts +22 -16
- package/src/runtime/query/prepare-turn.ts +2 -2
- package/src/runtime/query/prompt-cache.ts +3 -0
- package/src/runtime/query/prompt.ts +32 -1
- package/src/runtime/query/repeat-call.ts +40 -10
- package/src/runtime/query/resume-pending.ts +60 -7
- package/src/runtime/query/resume-session.ts +1 -1
- package/src/runtime/query/review-policy.ts +23 -2
- package/src/runtime/query/saved-presentation.ts +70 -0
- package/src/runtime/query/steering.ts +6 -9
- package/src/runtime/query/tool-executions.ts +108 -9
- package/src/runtime/query/tooling.ts +6 -1
- package/src/scheduler/completion-inbox.ts +108 -7
- package/src/scheduler/delegating.ts +5 -0
- package/src/scheduler/local.ts +2 -0
- package/src/session/summary/materialize.ts +51 -9
- package/src/store/budget/ledger.ts +60 -5
- package/src/store/index.ts +1 -0
- package/src/store/memory/disk.ts +82 -7
- package/src/store/memory/index.ts +66 -7
- package/src/store/memory/markdown.ts +54 -2
- package/src/store/memory/memory.ts +52 -2
- package/src/store/memory/revision.ts +158 -0
- package/src/store/session/disk.ts +77 -10
- package/src/store/session/memory.ts +32 -7
- package/src/store/session-log/core.ts +118 -11
- package/src/store/session-log/disk.ts +9 -2
- package/src/store/session-log/fold.ts +22 -0
- package/src/store/session-log/index.ts +5 -0
- package/src/store/session-log/memory.ts +2 -1
- package/src/store/session-log/spill.ts +89 -6
- package/src/store/session-log/structured-result.ts +96 -0
- package/src/store/task/disk.ts +46 -2
- package/src/store/task/memory.ts +13 -3
- package/src/tools/admit-facts.ts +145 -0
- package/src/tools/builtins/bash.ts +132 -24
- package/src/tools/builtins/edit.ts +42 -0
- package/src/tools/builtins/file-write-result.ts +14 -0
- package/src/tools/builtins/glob.ts +12 -0
- package/src/tools/builtins/grep.ts +14 -0
- package/src/tools/builtins/index.ts +2 -0
- package/src/tools/builtins/job.ts +4 -1
- package/src/tools/builtins/read-file.ts +57 -0
- package/src/tools/builtins/view-image.ts +409 -0
- package/src/tools/builtins/wait-for-job-bounds.ts +45 -7
- package/src/tools/builtins/wait-for-job.ts +159 -36
- package/src/tools/builtins/write-file.ts +4 -2
- package/src/tools/command-shell.ts +132 -5
- package/src/tools/coordinator/agent.ts +9 -19
- package/src/tools/coordinator/index.ts +150 -75
- package/src/tools/coordinator/wait-with-idle-bound.ts +3 -1
- package/src/tools/defineTool.ts +4 -0
- package/src/tools/failure-facts.ts +24 -0
- package/src/tools/host-output.ts +136 -0
- package/src/tools/memory/delete.ts +33 -3
- package/src/tools/memory/read.ts +35 -2
- package/src/tools/memory/search.ts +38 -7
- package/src/tools/memory/update.ts +28 -3
- package/src/tools/oem-code-pages.ts +22 -0
- package/src/tools/schedules/schedule-tool.ts +38 -5
- package/src/tools/schedules/types.ts +23 -3
- package/src/tools/task/list.ts +15 -7
- package/src/tools/task/present.ts +37 -7
- package/src/tools/task/update.ts +12 -5
- package/src/tools/text-window.ts +87 -0
- package/src/toolsets/manager.ts +132 -2
- package/src/turn/memory-recall.ts +5 -1
- package/src/types/acp/index.ts +150 -4
- package/src/types/agent/base.ts +3 -0
- package/src/types/agent/manager.ts +8 -23
- package/src/types/agent/scheduler.ts +10 -1
- package/src/types/agent/task.ts +4 -0
- package/src/types/connector/mcp.ts +7 -0
- package/src/types/errors/catalog.ts +4 -2
- package/src/types/harness/schema.ts +203 -0
- package/src/types/harness/session.ts +306 -0
- package/src/types/hitl/index.ts +17 -1
- package/src/types/job/index.ts +42 -0
- package/src/types/memory/index.ts +43 -0
- package/src/types/message/inbound-delivery.ts +63 -0
- package/src/types/message/index.ts +8 -1
- package/src/types/plugin/index.ts +11 -6
- package/src/types/sandbox/index.ts +46 -0
- package/src/types/session/checkpoint.ts +4 -1
- package/src/types/session/events.ts +23 -1
- package/src/types/session/records.ts +114 -2
- package/src/types/session/step.ts +2 -0
- package/src/types/session/store.ts +23 -9
- package/src/types/session/tool-execution.ts +6 -0
- package/src/types/structured-output/index.ts +13 -2
- package/src/types/summary/ref.ts +3 -1
- package/src/types/tool/index.ts +39 -5
- package/src/types/tool/presentation.ts +121 -0
- package/src/utils/json-snapshot.ts +26 -9
- package/src/utils/structured-result-json.ts +10 -0
|
@@ -26,6 +26,56 @@ export function matchesMemoryIdentifier(text: string, identifiers: ReadonlySet<s
|
|
|
26
26
|
return false
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
interface MemoryScanSelection {
|
|
30
|
+
readonly entries: readonly MemoryIndexEntry[]
|
|
31
|
+
readonly truncated: boolean
|
|
32
|
+
readonly scannedCount: number
|
|
33
|
+
readonly nextScanOffset?: number
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Select a bounded, resumable snapshot of indexed candidates before reading any bodies. */
|
|
37
|
+
export function selectMemorySearchCandidates(
|
|
38
|
+
entries: readonly MemoryIndexEntry[],
|
|
39
|
+
params: MemorySearchParams,
|
|
40
|
+
): MemoryScanSelection {
|
|
41
|
+
if (
|
|
42
|
+
params.maxScanned !== undefined &&
|
|
43
|
+
(!Number.isSafeInteger(params.maxScanned) || params.maxScanned < 1)
|
|
44
|
+
) {
|
|
45
|
+
throw new RangeError('maxScanned must be a positive safe integer')
|
|
46
|
+
}
|
|
47
|
+
if (
|
|
48
|
+
params.scanOffset !== undefined &&
|
|
49
|
+
(!Number.isSafeInteger(params.scanOffset) || params.scanOffset < 0)
|
|
50
|
+
) {
|
|
51
|
+
throw new RangeError('scanOffset must be a nonnegative safe integer')
|
|
52
|
+
}
|
|
53
|
+
const query = terms(params.query ?? '')
|
|
54
|
+
if (params.query?.trim() && query.size === 0)
|
|
55
|
+
return { entries: [], truncated: false, scannedCount: 0 }
|
|
56
|
+
const bodySearch =
|
|
57
|
+
query.size > 0 ||
|
|
58
|
+
Boolean(params.requiredIdentifiers?.length) ||
|
|
59
|
+
params.maxScanned !== undefined ||
|
|
60
|
+
params.scanOffset !== undefined
|
|
61
|
+
if (!bodySearch) return { entries, truncated: false, scannedCount: 0 }
|
|
62
|
+
const ordered = [...entries].sort(
|
|
63
|
+
(a, b) => b.updatedAt - a.updatedAt || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0),
|
|
64
|
+
)
|
|
65
|
+
const start = params.scanOffset ?? 0
|
|
66
|
+
const selected = ordered.slice(
|
|
67
|
+
start,
|
|
68
|
+
params.maxScanned === undefined ? undefined : start + params.maxScanned,
|
|
69
|
+
)
|
|
70
|
+
const next = start + selected.length
|
|
71
|
+
return {
|
|
72
|
+
entries: selected,
|
|
73
|
+
truncated: next < ordered.length,
|
|
74
|
+
scannedCount: selected.length,
|
|
75
|
+
...(next < ordered.length ? { nextScanOffset: next } : {}),
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
29
79
|
/** Shared lexical ranking; a caller-owned index can omit body content. */
|
|
30
80
|
export function searchMemoryEntries(
|
|
31
81
|
entries: readonly MemoryIndexEntry[],
|
|
@@ -36,13 +86,13 @@ export function searchMemoryEntries(
|
|
|
36
86
|
const identifiers = new Set(
|
|
37
87
|
params.requiredIdentifiers?.map((id) => id.normalize('NFKC').toLowerCase()),
|
|
38
88
|
)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
89
|
+
const candidates = entries.filter(
|
|
90
|
+
(entry) =>
|
|
91
|
+
(!params.status || entry.status === params.status) &&
|
|
92
|
+
(!params.tags?.length || params.tags.every((tag) => entry.tags.includes(tag))),
|
|
93
|
+
)
|
|
94
|
+
const selection = selectMemorySearchCandidates(candidates, params)
|
|
95
|
+
const ranked = selection.entries
|
|
46
96
|
.filter(
|
|
47
97
|
(entry) =>
|
|
48
98
|
!identifiers.size ||
|
|
@@ -79,6 +129,15 @@ export function searchMemoryEntries(
|
|
|
79
129
|
return {
|
|
80
130
|
entries: ranked.slice(0, params.limit ?? ranked.length).map(({ entry }) => entry),
|
|
81
131
|
totalCount: ranked.length,
|
|
132
|
+
...(params.maxScanned !== undefined || params.scanOffset !== undefined
|
|
133
|
+
? {
|
|
134
|
+
truncated: selection.truncated,
|
|
135
|
+
scannedCount: selection.scannedCount,
|
|
136
|
+
...(selection.nextScanOffset !== undefined
|
|
137
|
+
? { nextScanOffset: selection.nextScanOffset }
|
|
138
|
+
: {}),
|
|
139
|
+
}
|
|
140
|
+
: {}),
|
|
82
141
|
}
|
|
83
142
|
}
|
|
84
143
|
|
|
@@ -5,15 +5,16 @@ import { dirname, join, resolve } from 'node:path'
|
|
|
5
5
|
import { NamzuError } from '../../types/errors/index.js'
|
|
6
6
|
import type { MemoryId } from '../../types/ids/index.js'
|
|
7
7
|
import type {
|
|
8
|
+
ConditionalMemoryStore,
|
|
8
9
|
CreateMemoryParams,
|
|
9
10
|
MemoryContent,
|
|
10
11
|
MemoryIndexEntry,
|
|
11
12
|
MemoryRecord,
|
|
12
13
|
MemorySearchParams,
|
|
13
14
|
MemorySearchResult,
|
|
14
|
-
MemoryStore,
|
|
15
15
|
MemoryType,
|
|
16
16
|
UpdateMemoryParams,
|
|
17
|
+
VersionedMemoryRecord,
|
|
17
18
|
} from '../../types/memory/index.js'
|
|
18
19
|
import { assertMemoryStatus, isMemoryType } from '../../types/memory/index.js'
|
|
19
20
|
import { atomicWriteFile } from '../../utils/atomic-write.js'
|
|
@@ -47,6 +48,7 @@ import {
|
|
|
47
48
|
acquireMemoryOperationLock,
|
|
48
49
|
validateMemoryLockTimeout,
|
|
49
50
|
} from './operation-lock.js'
|
|
51
|
+
import { MemoryRevisionConflictError, assertMemoryRevision, memoryRevision } from './revision.js'
|
|
50
52
|
|
|
51
53
|
/**
|
|
52
54
|
* Versioned like every other record this SDK persists. A memory file carries
|
|
@@ -296,7 +298,7 @@ function decodeMemoryFile(
|
|
|
296
298
|
* holds with {@link MemoryNameConflictError}, and derives a free one from the
|
|
297
299
|
* title when none is given.
|
|
298
300
|
*/
|
|
299
|
-
export class MarkdownMemoryStore implements
|
|
301
|
+
export class MarkdownMemoryStore implements ConditionalMemoryStore {
|
|
300
302
|
private readonly directory: string
|
|
301
303
|
private readonly log: Logger
|
|
302
304
|
private readonly lockTimeoutMs: number
|
|
@@ -587,6 +589,15 @@ export class MarkdownMemoryStore implements MemoryStore {
|
|
|
587
589
|
})
|
|
588
590
|
}
|
|
589
591
|
|
|
592
|
+
async getVersionedRecord(id: MemoryId): Promise<VersionedMemoryRecord | undefined> {
|
|
593
|
+
return this.withLoaded(async (_dir, loaded) => {
|
|
594
|
+
const memory = loaded.get(id)
|
|
595
|
+
if (!memory) return undefined
|
|
596
|
+
const record = structuredClone({ entry: memory.entry, content: memory.content })
|
|
597
|
+
return { ...record, revision: memoryRevision(record) }
|
|
598
|
+
})
|
|
599
|
+
}
|
|
600
|
+
|
|
590
601
|
/** The current record held under `name`, archived included, or `undefined`. */
|
|
591
602
|
async getByName(name: string): Promise<MemoryRecord | undefined> {
|
|
592
603
|
return this.withLoaded(async (_dir, loaded) => {
|
|
@@ -603,10 +614,35 @@ export class MarkdownMemoryStore implements MemoryStore {
|
|
|
603
614
|
}
|
|
604
615
|
|
|
605
616
|
async update(id: MemoryId, updates: UpdateMemoryParams): Promise<MemoryIndexEntry | undefined> {
|
|
617
|
+
return this.updateInternal(id, updates)
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
async updateIfRevision(
|
|
621
|
+
id: MemoryId,
|
|
622
|
+
updates: UpdateMemoryParams,
|
|
623
|
+
expectedRevision: string,
|
|
624
|
+
): Promise<MemoryIndexEntry> {
|
|
625
|
+
const updated = await this.updateInternal(id, updates, expectedRevision)
|
|
626
|
+
if (!updated) throw new MemoryRevisionConflictError(id)
|
|
627
|
+
return updated
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
private async updateInternal(
|
|
631
|
+
id: MemoryId,
|
|
632
|
+
updates: UpdateMemoryParams,
|
|
633
|
+
expectedRevision?: string,
|
|
634
|
+
): Promise<MemoryIndexEntry | undefined> {
|
|
606
635
|
if (updates.status !== undefined) assertMemoryStatus(updates.status)
|
|
607
636
|
assertOptionalMemoryFields(updates)
|
|
608
637
|
return this.mutate(async (dir, loaded) => {
|
|
609
638
|
const existing = loaded.get(id)
|
|
639
|
+
if (expectedRevision !== undefined) {
|
|
640
|
+
assertMemoryRevision(
|
|
641
|
+
id,
|
|
642
|
+
existing ? { entry: existing.entry, content: existing.content } : undefined,
|
|
643
|
+
expectedRevision,
|
|
644
|
+
)
|
|
645
|
+
}
|
|
610
646
|
if (!existing) return undefined
|
|
611
647
|
const entries = this.entries(loaded)
|
|
612
648
|
if (updates.name !== undefined) {
|
|
@@ -645,8 +681,24 @@ export class MarkdownMemoryStore implements MemoryStore {
|
|
|
645
681
|
}
|
|
646
682
|
|
|
647
683
|
async delete(id: MemoryId): Promise<boolean> {
|
|
684
|
+
return this.deleteInternal(id)
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
async deleteIfRevision(id: MemoryId, expectedRevision: string): Promise<void> {
|
|
688
|
+
const deleted = await this.deleteInternal(id, expectedRevision)
|
|
689
|
+
if (!deleted) throw new MemoryRevisionConflictError(id)
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
private async deleteInternal(id: MemoryId, expectedRevision?: string): Promise<boolean> {
|
|
648
693
|
return this.mutate(async (dir, loaded) => {
|
|
649
694
|
const existing = loaded.get(id)
|
|
695
|
+
if (expectedRevision !== undefined) {
|
|
696
|
+
assertMemoryRevision(
|
|
697
|
+
id,
|
|
698
|
+
existing ? { entry: existing.entry, content: existing.content } : undefined,
|
|
699
|
+
expectedRevision,
|
|
700
|
+
)
|
|
701
|
+
}
|
|
650
702
|
if (!existing) return false
|
|
651
703
|
try {
|
|
652
704
|
await unlink(existing.path)
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { MemoryId } from '../../types/ids/index.js'
|
|
2
2
|
import type {
|
|
3
|
+
ConditionalMemoryStore,
|
|
3
4
|
CreateMemoryParams,
|
|
4
5
|
MemoryContent,
|
|
5
6
|
MemoryIndexEntry,
|
|
6
7
|
MemoryRecord,
|
|
7
8
|
MemorySearchParams,
|
|
8
9
|
MemorySearchResult,
|
|
9
|
-
MemoryStore,
|
|
10
10
|
UpdateMemoryParams,
|
|
11
|
+
VersionedMemoryRecord,
|
|
11
12
|
} from '../../types/memory/index.js'
|
|
12
13
|
import { assertMemoryStatus } from '../../types/memory/index.js'
|
|
13
14
|
import { generateMemoryId } from '../../utils/id.js'
|
|
@@ -18,8 +19,9 @@ import {
|
|
|
18
19
|
nameHolder,
|
|
19
20
|
withOptionalFields,
|
|
20
21
|
} from './naming.js'
|
|
22
|
+
import { assertMemoryRevision, memoryRevision } from './revision.js'
|
|
21
23
|
|
|
22
|
-
export class InMemoryMemoryStore implements
|
|
24
|
+
export class InMemoryMemoryStore implements ConditionalMemoryStore {
|
|
23
25
|
private content = new Map<string, MemoryContent>()
|
|
24
26
|
private index = new InMemoryMemoryIndex()
|
|
25
27
|
|
|
@@ -70,10 +72,45 @@ export class InMemoryMemoryStore implements MemoryStore {
|
|
|
70
72
|
return entry && content ? structuredClone({ entry, content }) : undefined
|
|
71
73
|
}
|
|
72
74
|
|
|
75
|
+
async getVersionedRecord(id: MemoryId): Promise<VersionedMemoryRecord | undefined> {
|
|
76
|
+
const entry = this.index.getEntry(id)
|
|
77
|
+
const content = this.content.get(id)
|
|
78
|
+
if (!entry || !content) return undefined
|
|
79
|
+
const record = structuredClone({ entry, content })
|
|
80
|
+
return { ...record, revision: memoryRevision(record) }
|
|
81
|
+
}
|
|
82
|
+
|
|
73
83
|
async update(id: MemoryId, updates: UpdateMemoryParams): Promise<MemoryIndexEntry | undefined> {
|
|
84
|
+
return this.updateNow(id, updates)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async updateIfRevision(
|
|
88
|
+
id: MemoryId,
|
|
89
|
+
updates: UpdateMemoryParams,
|
|
90
|
+
expectedRevision: string,
|
|
91
|
+
): Promise<MemoryIndexEntry> {
|
|
92
|
+
// No await between the check and mutation: one in-memory operation turn.
|
|
93
|
+
const entry = this.updateNow(id, updates, expectedRevision)
|
|
94
|
+
if (!entry) throw new Error('A conditional memory update unexpectedly found no record.')
|
|
95
|
+
return entry
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private updateNow(
|
|
99
|
+
id: MemoryId,
|
|
100
|
+
updates: UpdateMemoryParams,
|
|
101
|
+
expectedRevision?: string,
|
|
102
|
+
): MemoryIndexEntry | undefined {
|
|
74
103
|
if (updates.status !== undefined) assertMemoryStatus(updates.status)
|
|
75
104
|
assertOptionalMemoryFields(updates)
|
|
76
105
|
const existing = this.index.getEntry(id)
|
|
106
|
+
if (expectedRevision !== undefined) {
|
|
107
|
+
const content = this.content.get(id)
|
|
108
|
+
assertMemoryRevision(
|
|
109
|
+
id,
|
|
110
|
+
existing && content ? { entry: existing, content } : undefined,
|
|
111
|
+
expectedRevision,
|
|
112
|
+
)
|
|
113
|
+
}
|
|
77
114
|
if (!existing) return undefined
|
|
78
115
|
if (updates.name !== undefined) {
|
|
79
116
|
const holder = nameHolder(this.index.allEntries(), updates.name, id)
|
|
@@ -118,6 +155,19 @@ export class InMemoryMemoryStore implements MemoryStore {
|
|
|
118
155
|
}
|
|
119
156
|
|
|
120
157
|
async delete(id: MemoryId): Promise<boolean> {
|
|
158
|
+
return this.deleteNow(id)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
async deleteIfRevision(id: MemoryId, expectedRevision: string): Promise<void> {
|
|
162
|
+
this.deleteNow(id, expectedRevision)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private deleteNow(id: MemoryId, expectedRevision?: string): boolean {
|
|
166
|
+
if (expectedRevision !== undefined) {
|
|
167
|
+
const entry = this.index.getEntry(id)
|
|
168
|
+
const content = this.content.get(id)
|
|
169
|
+
assertMemoryRevision(id, entry && content ? { entry, content } : undefined, expectedRevision)
|
|
170
|
+
}
|
|
121
171
|
const existed = this.index.remove(id)
|
|
122
172
|
this.content.delete(id)
|
|
123
173
|
return existed
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
|
+
import { NamzuError } from '../../types/errors/index.js'
|
|
3
|
+
import type { MemoryId } from '../../types/ids/index.js'
|
|
4
|
+
import type { MemoryRecord } from '../../types/memory/index.js'
|
|
5
|
+
|
|
6
|
+
/** A record can be read, but its metadata cannot be fingerprinted synchronously. */
|
|
7
|
+
export class MemoryRevisionUnavailableError extends Error {
|
|
8
|
+
constructor() {
|
|
9
|
+
super('This memory contains metadata that cannot be revision-checked.')
|
|
10
|
+
this.name = 'MemoryRevisionUnavailableError'
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Encode the same structured-clone snapshot `getRecord` returns. Type tags,
|
|
16
|
+
* object references and sorted plain-object keys preserve values JSON loses:
|
|
17
|
+
* BigInt, undefined, Map/Set contents, Date, typed arrays and cycles. Map and
|
|
18
|
+
* Set order is kept because it is observable. Unknown host objects (notably
|
|
19
|
+
* Blob, whose bytes need asynchronous reading) fail closed rather than hash as
|
|
20
|
+
* `{}` and allow a stale conditional write.
|
|
21
|
+
*/
|
|
22
|
+
function canonicalRecord(record: MemoryRecord): string {
|
|
23
|
+
let snapshot: MemoryRecord
|
|
24
|
+
try {
|
|
25
|
+
snapshot = structuredClone(record)
|
|
26
|
+
} catch {
|
|
27
|
+
throw new MemoryRevisionUnavailableError()
|
|
28
|
+
}
|
|
29
|
+
const seen = new WeakMap<object, number>()
|
|
30
|
+
let nextId = 0
|
|
31
|
+
|
|
32
|
+
function encode(value: unknown): unknown {
|
|
33
|
+
if (value === null) return ['null']
|
|
34
|
+
switch (typeof value) {
|
|
35
|
+
case 'undefined':
|
|
36
|
+
return ['undefined']
|
|
37
|
+
case 'string':
|
|
38
|
+
return ['string', value]
|
|
39
|
+
case 'boolean':
|
|
40
|
+
return ['boolean', value]
|
|
41
|
+
case 'bigint':
|
|
42
|
+
return ['bigint', value.toString()]
|
|
43
|
+
case 'number':
|
|
44
|
+
return ['number', Object.is(value, -0) ? '-0' : String(value)]
|
|
45
|
+
case 'function':
|
|
46
|
+
case 'symbol':
|
|
47
|
+
throw new MemoryRevisionUnavailableError()
|
|
48
|
+
case 'object':
|
|
49
|
+
break
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const object = value as object
|
|
53
|
+
const previous = seen.get(object)
|
|
54
|
+
if (previous !== undefined) return ['ref', previous]
|
|
55
|
+
const id = nextId++
|
|
56
|
+
seen.set(object, id)
|
|
57
|
+
if (Array.isArray(object)) {
|
|
58
|
+
return [
|
|
59
|
+
'array',
|
|
60
|
+
id,
|
|
61
|
+
object.length,
|
|
62
|
+
Object.keys(object)
|
|
63
|
+
.sort()
|
|
64
|
+
.map((key) => [key, encode((object as unknown as Record<string, unknown>)[key])]),
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
if (object instanceof Map) {
|
|
68
|
+
return ['map', id, [...object].map(([key, item]) => [encode(key), encode(item)])]
|
|
69
|
+
}
|
|
70
|
+
if (object instanceof Set) return ['set', id, [...object].map(encode)]
|
|
71
|
+
if (object instanceof Date) return ['date', id, encode(object.getTime())]
|
|
72
|
+
if (object instanceof RegExp)
|
|
73
|
+
return ['regexp', id, object.source, object.flags, object.lastIndex]
|
|
74
|
+
if (object instanceof ArrayBuffer) {
|
|
75
|
+
const buffer = object as ArrayBuffer & {
|
|
76
|
+
readonly maxByteLength?: number
|
|
77
|
+
readonly resizable?: boolean
|
|
78
|
+
}
|
|
79
|
+
return [
|
|
80
|
+
'array-buffer',
|
|
81
|
+
id,
|
|
82
|
+
buffer.byteLength,
|
|
83
|
+
buffer.maxByteLength,
|
|
84
|
+
buffer.resizable,
|
|
85
|
+
Buffer.from(buffer).toString('hex'),
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
if (ArrayBuffer.isView(object)) {
|
|
89
|
+
// A view exposes its entire backing buffer through `.buffer`, even
|
|
90
|
+
// when its visible slice is one byte. Structured cloning keeps that
|
|
91
|
+
// backing and preserves aliases between multiple views.
|
|
92
|
+
if (
|
|
93
|
+
(typeof SharedArrayBuffer !== 'undefined' && object.buffer instanceof SharedArrayBuffer) ||
|
|
94
|
+
(object.buffer instanceof ArrayBuffer &&
|
|
95
|
+
(object.buffer as ArrayBuffer & { readonly resizable?: boolean }).resizable === true)
|
|
96
|
+
)
|
|
97
|
+
throw new MemoryRevisionUnavailableError()
|
|
98
|
+
return [
|
|
99
|
+
'array-buffer-view',
|
|
100
|
+
id,
|
|
101
|
+
object.constructor.name,
|
|
102
|
+
object.byteOffset,
|
|
103
|
+
object.byteLength,
|
|
104
|
+
encode(object.buffer),
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
if (object instanceof Error) {
|
|
108
|
+
return ['error', id, object.name, object.message, object.stack, encode(object.cause)]
|
|
109
|
+
}
|
|
110
|
+
if (object instanceof Number || object instanceof String || object instanceof Boolean)
|
|
111
|
+
return ['boxed', id, object.constructor.name, encode(object.valueOf())]
|
|
112
|
+
if (typeof SharedArrayBuffer !== 'undefined' && object instanceof SharedArrayBuffer)
|
|
113
|
+
throw new MemoryRevisionUnavailableError()
|
|
114
|
+
const prototype = Object.getPrototypeOf(object)
|
|
115
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
116
|
+
throw new MemoryRevisionUnavailableError()
|
|
117
|
+
return [
|
|
118
|
+
'object',
|
|
119
|
+
id,
|
|
120
|
+
Object.keys(object as Record<string, unknown>)
|
|
121
|
+
.sort()
|
|
122
|
+
.map((key) => [key, encode((object as Record<string, unknown>)[key])]),
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return JSON.stringify(encode(snapshot))
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** A content-derived token; it includes metadata as well as the body. */
|
|
130
|
+
export function memoryRevision(record: MemoryRecord): string {
|
|
131
|
+
return `m2:${createHash('sha256').update(canonicalRecord(record)).digest('hex')}`
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** The record changed or disappeared after its revision was read. */
|
|
135
|
+
export class MemoryRevisionConflictError extends NamzuError {
|
|
136
|
+
readonly memoryId: MemoryId
|
|
137
|
+
|
|
138
|
+
constructor(memoryId: MemoryId) {
|
|
139
|
+
super({
|
|
140
|
+
code: 'storage_error',
|
|
141
|
+
message: `Memory ${memoryId} changed since it was read. Read it again before changing it.`,
|
|
142
|
+
details: { memoryId, reason: 'revision_conflict' },
|
|
143
|
+
retryable: false,
|
|
144
|
+
})
|
|
145
|
+
this.name = 'MemoryRevisionConflictError'
|
|
146
|
+
this.memoryId = memoryId
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function assertMemoryRevision(
|
|
151
|
+
id: MemoryId,
|
|
152
|
+
record: MemoryRecord | undefined,
|
|
153
|
+
expectedRevision: string,
|
|
154
|
+
): asserts record is MemoryRecord {
|
|
155
|
+
if (!record || memoryRevision(record) !== expectedRevision) {
|
|
156
|
+
throw new MemoryRevisionConflictError(id)
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
|
|
37
37
|
import { createHash } from 'node:crypto'
|
|
38
38
|
import { mkdir, rm } from 'node:fs/promises'
|
|
39
|
-
import { join } from 'node:path'
|
|
39
|
+
import { join, resolve } from 'node:path'
|
|
40
40
|
import {
|
|
41
41
|
ProjectRootPathTakenError,
|
|
42
42
|
StaleProjectError,
|
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
TenantIsolationError,
|
|
45
45
|
} from '../../session/errors.js'
|
|
46
46
|
import { SessionAlreadySummarizedError } from '../../session/summary/errors.js'
|
|
47
|
-
import type { SessionId, TenantId } from '../../types/ids/index.js'
|
|
47
|
+
import type { SessionId, TenantId, TurnId } from '../../types/ids/index.js'
|
|
48
48
|
import type { Project, ProjectStatus } from '../../types/project/entity.js'
|
|
49
49
|
import type { Session } from '../../types/session/entity.js'
|
|
50
50
|
import type { ProjectId, SubSessionId, SummaryId, TopicId } from '../../types/session/ids.js'
|
|
@@ -68,6 +68,7 @@ import {
|
|
|
68
68
|
asSessionId,
|
|
69
69
|
asSubSessionId,
|
|
70
70
|
asTopicId,
|
|
71
|
+
asTurnId,
|
|
71
72
|
generateProjectId,
|
|
72
73
|
generateSessionId,
|
|
73
74
|
generateSubSessionId,
|
|
@@ -237,6 +238,7 @@ interface PersistedSubSession {
|
|
|
237
238
|
interface PersistedSummary {
|
|
238
239
|
id: SummaryId
|
|
239
240
|
sessionRef: SessionId
|
|
241
|
+
turnRef?: TurnId
|
|
240
242
|
tenantId: TenantId
|
|
241
243
|
outcome: SessionSummaryOutcome
|
|
242
244
|
deliverables: readonly DeliverableRef[]
|
|
@@ -257,6 +259,10 @@ const SUMMARY_TERMINAL_FLIP_STATUSES: ReadonlySet<Session['status']> = new Set([
|
|
|
257
259
|
'awaiting_merge',
|
|
258
260
|
])
|
|
259
261
|
|
|
262
|
+
// Share the in-process writer guard across store instances addressing the same
|
|
263
|
+
// root. This is not a cross-process lease; external writers remain a host concern.
|
|
264
|
+
const sessionWriters = new Map<string, Promise<void>>()
|
|
265
|
+
|
|
260
266
|
/**
|
|
261
267
|
* Index of projectId → its directory path. Built lazily on lookup via
|
|
262
268
|
* {@link DiskSessionStore.resolveProjectDir}; populated by create / getProject.
|
|
@@ -276,6 +282,8 @@ interface SessionIndexEntry {
|
|
|
276
282
|
}
|
|
277
283
|
|
|
278
284
|
export class DiskSessionStore implements SessionStore {
|
|
285
|
+
readonly supportsInvocationSummaries: boolean = true
|
|
286
|
+
readonly supportsOwnerVersionCas: boolean = true
|
|
279
287
|
private readonly rootDir: string
|
|
280
288
|
private readonly projectIndex = new Map<ProjectId, ProjectIndexEntry>()
|
|
281
289
|
private readonly sessionIndex = new Map<SessionId, SessionIndexEntry>()
|
|
@@ -288,6 +296,24 @@ export class DiskSessionStore implements SessionStore {
|
|
|
288
296
|
this.rootDir = config.rootDir
|
|
289
297
|
}
|
|
290
298
|
|
|
299
|
+
private async withSessionWrite<T>(sessionId: SessionId, operation: () => Promise<T>): Promise<T> {
|
|
300
|
+
const key = resolve(this.rootDir, sessionId)
|
|
301
|
+
const previous = sessionWriters.get(key) ?? Promise.resolve()
|
|
302
|
+
let release = () => {}
|
|
303
|
+
const held = new Promise<void>((resolveWrite) => {
|
|
304
|
+
release = resolveWrite
|
|
305
|
+
})
|
|
306
|
+
const tail = previous.then(() => held)
|
|
307
|
+
sessionWriters.set(key, tail)
|
|
308
|
+
await previous
|
|
309
|
+
try {
|
|
310
|
+
return await operation()
|
|
311
|
+
} finally {
|
|
312
|
+
release()
|
|
313
|
+
if (sessionWriters.get(key) === tail) sessionWriters.delete(key)
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
291
317
|
// Project CRUD ------------------------------------------------------------
|
|
292
318
|
|
|
293
319
|
async createProject(params: CreateProjectParams, tenantId: TenantId): Promise<Project> {
|
|
@@ -654,6 +680,16 @@ export class DiskSessionStore implements SessionStore {
|
|
|
654
680
|
session: Session,
|
|
655
681
|
tenantId: TenantId,
|
|
656
682
|
expectedOwnerVersion?: number,
|
|
683
|
+
): Promise<void> {
|
|
684
|
+
await this.withSessionWrite(session.id, () =>
|
|
685
|
+
this.updateSessionUnlocked(session, tenantId, expectedOwnerVersion),
|
|
686
|
+
)
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
private async updateSessionUnlocked(
|
|
690
|
+
session: Session,
|
|
691
|
+
tenantId: TenantId,
|
|
692
|
+
expectedOwnerVersion?: number,
|
|
657
693
|
): Promise<void> {
|
|
658
694
|
const located = await this.locateSession(session.id)
|
|
659
695
|
if (!located) {
|
|
@@ -669,10 +705,8 @@ export class DiskSessionStore implements SessionStore {
|
|
|
669
705
|
if (existing) {
|
|
670
706
|
this.assertTenant(existing.tenantId, tenantId, `session(${session.id})`)
|
|
671
707
|
}
|
|
672
|
-
// Against
|
|
673
|
-
//
|
|
674
|
-
// processes can still both pass — see the contract note on
|
|
675
|
-
// `SessionStore.updateSession`. In one process it is the real lock.
|
|
708
|
+
// Against the stored version, under the shared in-process writer guard.
|
|
709
|
+
// Other processes can still both pass; see SessionStore.updateSession.
|
|
676
710
|
if (
|
|
677
711
|
expectedOwnerVersion !== undefined &&
|
|
678
712
|
existing !== null &&
|
|
@@ -862,11 +896,22 @@ export class DiskSessionStore implements SessionStore {
|
|
|
862
896
|
* leaves summary present + session still non-terminal — recovery replays
|
|
863
897
|
* the flip via {@link SessionSummaryMaterializer.recover}. Idempotent when
|
|
864
898
|
* the same summary is re-presented (recovery path); rejects a *different*
|
|
865
|
-
* summary
|
|
899
|
+
* summary at the same conversation or invocation key as {@link SessionAlreadySummarizedError}.
|
|
866
900
|
*/
|
|
867
901
|
async recordSummary(
|
|
868
902
|
summary: SessionSummaryRef & { materializedBy: 'kernel' },
|
|
869
903
|
tenantId: TenantId,
|
|
904
|
+
expectedOwnerVersion?: number,
|
|
905
|
+
): Promise<void> {
|
|
906
|
+
await this.withSessionWrite(summary.sessionRef, () =>
|
|
907
|
+
this.recordSummaryUnlocked(summary, tenantId, expectedOwnerVersion),
|
|
908
|
+
)
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
private async recordSummaryUnlocked(
|
|
912
|
+
summary: SessionSummaryRef & { materializedBy: 'kernel' },
|
|
913
|
+
tenantId: TenantId,
|
|
914
|
+
expectedOwnerVersion?: number,
|
|
870
915
|
): Promise<void> {
|
|
871
916
|
if (summary.tenantId !== tenantId) {
|
|
872
917
|
throw new TenantIsolationError({
|
|
@@ -884,8 +929,15 @@ export class DiskSessionStore implements SessionStore {
|
|
|
884
929
|
throw new Error(`Session ${summary.sessionRef} not found on disk`)
|
|
885
930
|
}
|
|
886
931
|
this.assertTenant(sessionRaw.tenantId, tenantId, `session(${summary.sessionRef})`)
|
|
932
|
+
if (expectedOwnerVersion !== undefined && sessionRaw.ownerVersion !== expectedOwnerVersion) {
|
|
933
|
+
throw new StaleSessionError({
|
|
934
|
+
sessionId: summary.sessionRef,
|
|
935
|
+
expectedVersion: expectedOwnerVersion,
|
|
936
|
+
actualVersion: sessionRaw.ownerVersion,
|
|
937
|
+
})
|
|
938
|
+
}
|
|
887
939
|
|
|
888
|
-
const summaryPath =
|
|
940
|
+
const summaryPath = summaryFile(located.path, summary.turnRef)
|
|
889
941
|
const existingRaw = await records.read<PersistedSummary>(summaryPath)
|
|
890
942
|
if (existingRaw) {
|
|
891
943
|
this.assertTenant(existingRaw.tenantId, tenantId, `summary(${existingRaw.id})`)
|
|
@@ -899,6 +951,8 @@ export class DiskSessionStore implements SessionStore {
|
|
|
899
951
|
// to the status flip so crash-between-writes is recovered.
|
|
900
952
|
} else {
|
|
901
953
|
// Step 1: persist summary.
|
|
954
|
+
if (summary.turnRef)
|
|
955
|
+
await mkdir(join(located.path, 'turn-summaries'), { recursive: true, mode: 0o700 })
|
|
902
956
|
await records.write(summaryPath, serializeSummary(summary))
|
|
903
957
|
}
|
|
904
958
|
|
|
@@ -913,10 +967,15 @@ export class DiskSessionStore implements SessionStore {
|
|
|
913
967
|
}
|
|
914
968
|
}
|
|
915
969
|
|
|
916
|
-
async getSummary(
|
|
970
|
+
async getSummary(
|
|
971
|
+
sessionId: SessionId,
|
|
972
|
+
tenantId: TenantId,
|
|
973
|
+
turnId?: TurnId,
|
|
974
|
+
): Promise<SessionSummaryRef | null> {
|
|
975
|
+
if (turnId !== undefined) asTurnId(turnId)
|
|
917
976
|
const located = await this.locateSession(sessionId)
|
|
918
977
|
if (!located) return null
|
|
919
|
-
const raw = await records.read<PersistedSummary>(
|
|
978
|
+
const raw = await records.read<PersistedSummary>(summaryFile(located.path, turnId))
|
|
920
979
|
if (!raw) return null
|
|
921
980
|
this.assertTenant(raw.tenantId, tenantId, `summary(${raw.id})`)
|
|
922
981
|
return deserializeSummary(raw)
|
|
@@ -1161,6 +1220,7 @@ function serializeSummary(s: SessionSummaryRef): PersistedSummary {
|
|
|
1161
1220
|
return {
|
|
1162
1221
|
id: s.id,
|
|
1163
1222
|
sessionRef: s.sessionRef,
|
|
1223
|
+
...(s.turnRef ? { turnRef: s.turnRef } : {}),
|
|
1164
1224
|
tenantId: s.tenantId,
|
|
1165
1225
|
outcome: s.outcome,
|
|
1166
1226
|
deliverables: s.deliverables,
|
|
@@ -1182,6 +1242,7 @@ function deserializeSummary(s: PersistedSummary): SessionSummaryRef {
|
|
|
1182
1242
|
return {
|
|
1183
1243
|
id: s.id,
|
|
1184
1244
|
sessionRef: s.sessionRef,
|
|
1245
|
+
...(s.turnRef ? { turnRef: asTurnId(s.turnRef) } : {}),
|
|
1185
1246
|
tenantId: s.tenantId,
|
|
1186
1247
|
outcome: s.outcome,
|
|
1187
1248
|
deliverables: s.deliverables,
|
|
@@ -1191,3 +1252,9 @@ function deserializeSummary(s: PersistedSummary): SessionSummaryRef {
|
|
|
1191
1252
|
materializedBy: 'kernel',
|
|
1192
1253
|
}
|
|
1193
1254
|
}
|
|
1255
|
+
|
|
1256
|
+
function summaryFile(directory: string, turnId?: TurnId): string {
|
|
1257
|
+
return turnId === undefined
|
|
1258
|
+
? join(directory, 'summary.json')
|
|
1259
|
+
: join(directory, 'turn-summaries', `${asTurnId(turnId)}.json`)
|
|
1260
|
+
}
|