@namzu/sdk 0.1.8 → 0.3.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 +69 -2
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +5 -2
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/RouterAgent.d.ts.map +1 -1
- package/dist/agents/RouterAgent.js +3 -0
- package/dist/agents/RouterAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +21 -5
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/bridge/a2a/index.d.ts +1 -1
- package/dist/bridge/a2a/index.d.ts.map +1 -1
- package/dist/bridge/a2a/index.js +1 -1
- package/dist/bridge/a2a/index.js.map +1 -1
- package/dist/bridge/a2a/mapper.d.ts.map +1 -1
- package/dist/bridge/a2a/mapper.js +6 -0
- package/dist/bridge/a2a/mapper.js.map +1 -1
- package/dist/bridge/a2a/message.d.ts +0 -2
- package/dist/bridge/a2a/message.d.ts.map +1 -1
- package/dist/bridge/a2a/message.js +0 -26
- package/dist/bridge/a2a/message.js.map +1 -1
- package/dist/bridge/a2a/task.d.ts +5 -4
- package/dist/bridge/a2a/task.d.ts.map +1 -1
- package/dist/bridge/a2a/task.js +4 -4
- package/dist/bridge/a2a/task.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +6 -0
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/constants/a2a/index.d.ts +2 -2
- package/dist/constants/a2a/index.d.ts.map +1 -1
- package/dist/constants/a2a/index.js.map +1 -1
- package/dist/contracts/api.d.ts +14 -27
- package/dist/contracts/api.d.ts.map +1 -1
- package/dist/contracts/ids.d.ts +1 -1
- package/dist/contracts/ids.d.ts.map +1 -1
- package/dist/contracts/index.d.ts +3 -3
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/schemas.d.ts +1 -31
- package/dist/contracts/schemas.d.ts.map +1 -1
- package/dist/contracts/schemas.js +1 -7
- package/dist/contracts/schemas.js.map +1 -1
- package/dist/gateway/local.d.ts.map +1 -1
- package/dist/gateway/local.js +6 -0
- package/dist/gateway/local.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/manager/agent/__tests__/lifecycle.test.d.ts +2 -0
- package/dist/manager/agent/__tests__/lifecycle.test.d.ts.map +1 -0
- package/dist/manager/agent/__tests__/lifecycle.test.js +316 -0
- package/dist/manager/agent/__tests__/lifecycle.test.js.map +1 -0
- package/dist/manager/agent/lifecycle.d.ts +67 -3
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +375 -14
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/index.d.ts +2 -0
- package/dist/manager/index.d.ts.map +1 -1
- package/dist/manager/index.js +1 -0
- package/dist/manager/index.js.map +1 -1
- package/dist/manager/run/persistence.d.ts +10 -1
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +20 -0
- package/dist/manager/run/persistence.js.map +1 -1
- package/dist/manager/thread/__tests__/lifecycle.test.d.ts +2 -0
- package/dist/manager/thread/__tests__/lifecycle.test.d.ts.map +1 -0
- package/dist/manager/thread/__tests__/lifecycle.test.js +216 -0
- package/dist/manager/thread/__tests__/lifecycle.test.js.map +1 -0
- package/dist/manager/thread/lifecycle.d.ts +105 -0
- package/dist/manager/thread/lifecycle.d.ts.map +1 -0
- package/dist/manager/thread/lifecycle.js +186 -0
- package/dist/manager/thread/lifecycle.js.map +1 -0
- package/dist/rag/retriever.js +2 -2
- package/dist/run/reporter.d.ts.map +1 -1
- package/dist/run/reporter.js +25 -0
- package/dist/run/reporter.js.map +1 -1
- package/dist/runtime/query/__tests__/context.test.d.ts +2 -0
- package/dist/runtime/query/__tests__/context.test.d.ts.map +1 -0
- package/dist/runtime/query/__tests__/context.test.js +85 -0
- package/dist/runtime/query/__tests__/context.test.js.map +1 -0
- package/dist/runtime/query/context-cache.d.ts +3 -3
- package/dist/runtime/query/context-cache.d.ts.map +1 -1
- package/dist/runtime/query/context-cache.js +2 -2
- package/dist/runtime/query/context-cache.js.map +1 -1
- package/dist/runtime/query/context.d.ts +45 -1
- package/dist/runtime/query/context.d.ts.map +1 -1
- package/dist/runtime/query/context.js +50 -8
- package/dist/runtime/query/context.js.map +1 -1
- package/dist/runtime/query/events.d.ts.map +1 -1
- package/dist/runtime/query/events.js +8 -0
- package/dist/runtime/query/events.js.map +1 -1
- package/dist/runtime/query/index.d.ts +22 -1
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +11 -0
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/session/__tests__/integration/_fixtures.d.ts +122 -0
- package/dist/session/__tests__/integration/_fixtures.d.ts.map +1 -0
- package/dist/session/__tests__/integration/_fixtures.js +215 -0
- package/dist/session/__tests__/integration/_fixtures.js.map +1 -0
- package/dist/session/__tests__/integration/archive-gate.test.d.ts +15 -0
- package/dist/session/__tests__/integration/archive-gate.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/archive-gate.test.js +214 -0
- package/dist/session/__tests__/integration/archive-gate.test.js.map +1 -0
- package/dist/session/__tests__/integration/capacity-caps.test.d.ts +13 -0
- package/dist/session/__tests__/integration/capacity-caps.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/capacity-caps.test.js +123 -0
- package/dist/session/__tests__/integration/capacity-caps.test.js.map +1 -0
- package/dist/session/__tests__/integration/e2e-spawn.test.d.ts +18 -0
- package/dist/session/__tests__/integration/e2e-spawn.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/e2e-spawn.test.js +238 -0
- package/dist/session/__tests__/integration/e2e-spawn.test.js.map +1 -0
- package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts +15 -0
- package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/event-stream-ordering.test.js +330 -0
- package/dist/session/__tests__/integration/event-stream-ordering.test.js.map +1 -0
- package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts +12 -0
- package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js +182 -0
- package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js.map +1 -0
- package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts +18 -0
- package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/handoff-illegal-transition.test.js +156 -0
- package/dist/session/__tests__/integration/handoff-illegal-transition.test.js.map +1 -0
- package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts +15 -0
- package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/handoff-single-e2e.test.js +179 -0
- package/dist/session/__tests__/integration/handoff-single-e2e.test.js.map +1 -0
- package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts +12 -0
- package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js +158 -0
- package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js.map +1 -0
- package/dist/session/__tests__/integration/migration-filesystem.test.d.ts +11 -0
- package/dist/session/__tests__/integration/migration-filesystem.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/migration-filesystem.test.js +140 -0
- package/dist/session/__tests__/integration/migration-filesystem.test.js.map +1 -0
- package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts +13 -0
- package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/migration-id-prefix.test.js +84 -0
- package/dist/session/__tests__/integration/migration-id-prefix.test.js.map +1 -0
- package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts +14 -0
- package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/prev-artifact-dag.test.js +242 -0
- package/dist/session/__tests__/integration/prev-artifact-dag.test.js.map +1 -0
- package/dist/session/__tests__/integration/retention-archive.test.d.ts +12 -0
- package/dist/session/__tests__/integration/retention-archive.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/retention-archive.test.js +187 -0
- package/dist/session/__tests__/integration/retention-archive.test.js.map +1 -0
- package/dist/session/__tests__/integration/spawn-rollback.test.d.ts +26 -0
- package/dist/session/__tests__/integration/spawn-rollback.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/spawn-rollback.test.js +236 -0
- package/dist/session/__tests__/integration/spawn-rollback.test.js.map +1 -0
- package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts +18 -0
- package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/summary-materialization-e2e.test.js +201 -0
- package/dist/session/__tests__/integration/summary-materialization-e2e.test.js.map +1 -0
- package/dist/session/__tests__/integration/tenant-isolation.test.d.ts +14 -0
- package/dist/session/__tests__/integration/tenant-isolation.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/tenant-isolation.test.js +189 -0
- package/dist/session/__tests__/integration/tenant-isolation.test.js.map +1 -0
- package/dist/session/errors.d.ts +139 -0
- package/dist/session/errors.d.ts.map +1 -0
- package/dist/session/errors.js +107 -0
- package/dist/session/errors.js.map +1 -0
- package/dist/session/events/index.d.ts +4 -0
- package/dist/session/events/index.d.ts.map +1 -0
- package/dist/session/events/index.js +8 -0
- package/dist/session/events/index.js.map +1 -0
- package/dist/session/events/schema-version.d.ts +13 -0
- package/dist/session/events/schema-version.d.ts.map +1 -0
- package/dist/session/events/schema-version.js +12 -0
- package/dist/session/events/schema-version.js.map +1 -0
- package/dist/session/events/types.d.ts +64 -0
- package/dist/session/events/types.d.ts.map +1 -0
- package/dist/session/events/types.js +2 -0
- package/dist/session/events/types.js.map +1 -0
- package/dist/session/handoff/__tests__/broadcast.test.d.ts +2 -0
- package/dist/session/handoff/__tests__/broadcast.test.d.ts.map +1 -0
- package/dist/session/handoff/__tests__/broadcast.test.js +261 -0
- package/dist/session/handoff/__tests__/broadcast.test.js.map +1 -0
- package/dist/session/handoff/__tests__/capacity.test.d.ts +2 -0
- package/dist/session/handoff/__tests__/capacity.test.d.ts.map +1 -0
- package/dist/session/handoff/__tests__/capacity.test.js +103 -0
- package/dist/session/handoff/__tests__/capacity.test.js.map +1 -0
- package/dist/session/handoff/__tests__/single.test.d.ts +2 -0
- package/dist/session/handoff/__tests__/single.test.d.ts.map +1 -0
- package/dist/session/handoff/__tests__/single.test.js +239 -0
- package/dist/session/handoff/__tests__/single.test.js.map +1 -0
- package/dist/session/handoff/assignment.d.ts +71 -0
- package/dist/session/handoff/assignment.d.ts.map +1 -0
- package/dist/session/handoff/assignment.js +11 -0
- package/dist/session/handoff/assignment.js.map +1 -0
- package/dist/session/handoff/broadcast.d.ts +54 -0
- package/dist/session/handoff/broadcast.d.ts.map +1 -0
- package/dist/session/handoff/broadcast.js +311 -0
- package/dist/session/handoff/broadcast.js.map +1 -0
- package/dist/session/handoff/capacity.d.ts +66 -0
- package/dist/session/handoff/capacity.d.ts.map +1 -0
- package/dist/session/handoff/capacity.js +60 -0
- package/dist/session/handoff/capacity.js.map +1 -0
- package/dist/session/handoff/events.d.ts +66 -0
- package/dist/session/handoff/events.d.ts.map +1 -0
- package/dist/session/handoff/events.js +13 -0
- package/dist/session/handoff/events.js.map +1 -0
- package/dist/session/handoff/index.d.ts +12 -0
- package/dist/session/handoff/index.d.ts.map +1 -0
- package/dist/session/handoff/index.js +9 -0
- package/dist/session/handoff/index.js.map +1 -0
- package/dist/session/handoff/single.d.ts +69 -0
- package/dist/session/handoff/single.d.ts.map +1 -0
- package/dist/session/handoff/single.js +229 -0
- package/dist/session/handoff/single.js.map +1 -0
- package/dist/session/handoff/version.d.ts +52 -0
- package/dist/session/handoff/version.d.ts.map +1 -0
- package/dist/session/handoff/version.js +36 -0
- package/dist/session/handoff/version.js.map +1 -0
- package/dist/session/hierarchy/__tests__/session.test.d.ts +2 -0
- package/dist/session/hierarchy/__tests__/session.test.d.ts.map +1 -0
- package/dist/session/hierarchy/__tests__/session.test.js +69 -0
- package/dist/session/hierarchy/__tests__/session.test.js.map +1 -0
- package/dist/session/hierarchy/actor.d.ts +26 -0
- package/dist/session/hierarchy/actor.d.ts.map +1 -0
- package/dist/session/hierarchy/actor.js +2 -0
- package/dist/session/hierarchy/actor.js.map +1 -0
- package/dist/session/hierarchy/index.d.ts +9 -0
- package/dist/session/hierarchy/index.d.ts.map +1 -0
- package/dist/session/hierarchy/index.js +4 -0
- package/dist/session/hierarchy/index.js.map +1 -0
- package/dist/session/hierarchy/lineage.d.ts +15 -0
- package/dist/session/hierarchy/lineage.d.ts.map +1 -0
- package/dist/session/hierarchy/lineage.js +2 -0
- package/dist/session/hierarchy/lineage.js.map +1 -0
- package/dist/session/hierarchy/project.d.ts +40 -0
- package/dist/session/hierarchy/project.d.ts.map +1 -0
- package/dist/session/hierarchy/project.js +2 -0
- package/dist/session/hierarchy/project.js.map +1 -0
- package/dist/session/hierarchy/session.d.ts +71 -0
- package/dist/session/hierarchy/session.d.ts.map +1 -0
- package/dist/session/hierarchy/session.js +51 -0
- package/dist/session/hierarchy/session.js.map +1 -0
- package/dist/session/hierarchy/sub-session.d.ts +76 -0
- package/dist/session/hierarchy/sub-session.d.ts.map +1 -0
- package/dist/session/hierarchy/sub-session.js +2 -0
- package/dist/session/hierarchy/sub-session.js.map +1 -0
- package/dist/session/hierarchy/tenant.d.ts +13 -0
- package/dist/session/hierarchy/tenant.d.ts.map +1 -0
- package/dist/session/hierarchy/tenant.js +2 -0
- package/dist/session/hierarchy/tenant.js.map +1 -0
- package/dist/session/hierarchy/thread.d.ts +54 -0
- package/dist/session/hierarchy/thread.d.ts.map +1 -0
- package/dist/session/hierarchy/thread.js +2 -0
- package/dist/session/hierarchy/thread.js.map +1 -0
- package/dist/session/index.d.ts +10 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +15 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/intervention/__tests__/prev-artifact.test.d.ts +2 -0
- package/dist/session/intervention/__tests__/prev-artifact.test.d.ts.map +1 -0
- package/dist/session/intervention/__tests__/prev-artifact.test.js +179 -0
- package/dist/session/intervention/__tests__/prev-artifact.test.js.map +1 -0
- package/dist/session/intervention/index.d.ts +3 -0
- package/dist/session/intervention/index.d.ts.map +1 -0
- package/dist/session/intervention/index.js +8 -0
- package/dist/session/intervention/index.js.map +1 -0
- package/dist/session/intervention/prev-artifact.d.ts +103 -0
- package/dist/session/intervention/prev-artifact.d.ts.map +1 -0
- package/dist/session/intervention/prev-artifact.js +112 -0
- package/dist/session/intervention/prev-artifact.js.map +1 -0
- package/dist/session/migration/__tests__/filesystem.test.d.ts +2 -0
- package/dist/session/migration/__tests__/filesystem.test.d.ts.map +1 -0
- package/dist/session/migration/__tests__/filesystem.test.js +188 -0
- package/dist/session/migration/__tests__/filesystem.test.js.map +1 -0
- package/dist/session/migration/__tests__/id-prefix.test.d.ts +2 -0
- package/dist/session/migration/__tests__/id-prefix.test.d.ts.map +1 -0
- package/dist/session/migration/__tests__/id-prefix.test.js +83 -0
- package/dist/session/migration/__tests__/id-prefix.test.js.map +1 -0
- package/dist/session/migration/__tests__/marker.test.d.ts +2 -0
- package/dist/session/migration/__tests__/marker.test.d.ts.map +1 -0
- package/dist/session/migration/__tests__/marker.test.js +75 -0
- package/dist/session/migration/__tests__/marker.test.js.map +1 -0
- package/dist/session/migration/errors.d.ts +26 -0
- package/dist/session/migration/errors.d.ts.map +1 -0
- package/dist/session/migration/errors.js +22 -0
- package/dist/session/migration/errors.js.map +1 -0
- package/dist/session/migration/filesystem.d.ts +94 -0
- package/dist/session/migration/filesystem.d.ts.map +1 -0
- package/dist/session/migration/filesystem.js +319 -0
- package/dist/session/migration/filesystem.js.map +1 -0
- package/dist/session/migration/id-prefix.d.ts +93 -0
- package/dist/session/migration/id-prefix.d.ts.map +1 -0
- package/dist/session/migration/id-prefix.js +111 -0
- package/dist/session/migration/id-prefix.js.map +1 -0
- package/dist/session/migration/index.d.ts +8 -0
- package/dist/session/migration/index.d.ts.map +1 -0
- package/dist/session/migration/index.js +8 -0
- package/dist/session/migration/index.js.map +1 -0
- package/dist/session/migration/marker.d.ts +57 -0
- package/dist/session/migration/marker.d.ts.map +1 -0
- package/dist/session/migration/marker.js +111 -0
- package/dist/session/migration/marker.js.map +1 -0
- package/dist/session/retention/__tests__/archive.test.d.ts +2 -0
- package/dist/session/retention/__tests__/archive.test.d.ts.map +1 -0
- package/dist/session/retention/__tests__/archive.test.js +253 -0
- package/dist/session/retention/__tests__/archive.test.js.map +1 -0
- package/dist/session/retention/__tests__/disk-backend.test.d.ts +2 -0
- package/dist/session/retention/__tests__/disk-backend.test.d.ts.map +1 -0
- package/dist/session/retention/__tests__/disk-backend.test.js +154 -0
- package/dist/session/retention/__tests__/disk-backend.test.js.map +1 -0
- package/dist/session/retention/archive-backend-ref.d.ts +18 -0
- package/dist/session/retention/archive-backend-ref.d.ts.map +1 -0
- package/dist/session/retention/archive-backend-ref.js +2 -0
- package/dist/session/retention/archive-backend-ref.js.map +1 -0
- package/dist/session/retention/archive.d.ts +130 -0
- package/dist/session/retention/archive.d.ts.map +1 -0
- package/dist/session/retention/archive.js +203 -0
- package/dist/session/retention/archive.js.map +1 -0
- package/dist/session/retention/backend.d.ts +101 -0
- package/dist/session/retention/backend.d.ts.map +1 -0
- package/dist/session/retention/backend.js +15 -0
- package/dist/session/retention/backend.js.map +1 -0
- package/dist/session/retention/disk-backend.d.ts +59 -0
- package/dist/session/retention/disk-backend.d.ts.map +1 -0
- package/dist/session/retention/disk-backend.js +236 -0
- package/dist/session/retention/disk-backend.js.map +1 -0
- package/dist/session/retention/index.d.ts +9 -0
- package/dist/session/retention/index.d.ts.map +1 -0
- package/dist/session/retention/index.js +6 -0
- package/dist/session/retention/index.js.map +1 -0
- package/dist/session/retention/policy.d.ts +49 -0
- package/dist/session/retention/policy.d.ts.map +1 -0
- package/dist/session/retention/policy.js +21 -0
- package/dist/session/retention/policy.js.map +1 -0
- package/dist/session/summary/__tests__/materialize.test.d.ts +2 -0
- package/dist/session/summary/__tests__/materialize.test.d.ts.map +1 -0
- package/dist/session/summary/__tests__/materialize.test.js +270 -0
- package/dist/session/summary/__tests__/materialize.test.js.map +1 -0
- package/dist/session/summary/deliverable.d.ts +74 -0
- package/dist/session/summary/deliverable.d.ts.map +1 -0
- package/dist/session/summary/deliverable.js +20 -0
- package/dist/session/summary/deliverable.js.map +1 -0
- package/dist/session/summary/index.d.ts +6 -0
- package/dist/session/summary/index.d.ts.map +1 -0
- package/dist/session/summary/index.js +9 -0
- package/dist/session/summary/index.js.map +1 -0
- package/dist/session/summary/materialize.d.ts +82 -0
- package/dist/session/summary/materialize.d.ts.map +1 -0
- package/dist/session/summary/materialize.js +117 -0
- package/dist/session/summary/materialize.js.map +1 -0
- package/dist/session/summary/ref.d.ts +91 -0
- package/dist/session/summary/ref.d.ts.map +1 -0
- package/dist/session/summary/ref.js +51 -0
- package/dist/session/summary/ref.js.map +1 -0
- package/dist/session/workspace/__tests__/git-worktree.test.d.ts +2 -0
- package/dist/session/workspace/__tests__/git-worktree.test.d.ts.map +1 -0
- package/dist/session/workspace/__tests__/git-worktree.test.js +244 -0
- package/dist/session/workspace/__tests__/git-worktree.test.js.map +1 -0
- package/dist/session/workspace/__tests__/path-builder.test.d.ts +2 -0
- package/dist/session/workspace/__tests__/path-builder.test.d.ts.map +1 -0
- package/dist/session/workspace/__tests__/path-builder.test.js +37 -0
- package/dist/session/workspace/__tests__/path-builder.test.js.map +1 -0
- package/dist/session/workspace/driver.d.ts +55 -0
- package/dist/session/workspace/driver.d.ts.map +1 -0
- package/dist/session/workspace/driver.js +12 -0
- package/dist/session/workspace/driver.js.map +1 -0
- package/dist/session/workspace/git-worktree.d.ts +65 -0
- package/dist/session/workspace/git-worktree.d.ts.map +1 -0
- package/dist/session/workspace/git-worktree.js +156 -0
- package/dist/session/workspace/git-worktree.js.map +1 -0
- package/dist/session/workspace/index.d.ts +8 -0
- package/dist/session/workspace/index.d.ts.map +1 -0
- package/dist/session/workspace/index.js +7 -0
- package/dist/session/workspace/index.js.map +1 -0
- package/dist/session/workspace/path-builder.d.ts +50 -0
- package/dist/session/workspace/path-builder.d.ts.map +1 -0
- package/dist/session/workspace/path-builder.js +50 -0
- package/dist/session/workspace/path-builder.js.map +1 -0
- package/dist/session/workspace/ref.d.ts +46 -0
- package/dist/session/workspace/ref.d.ts.map +1 -0
- package/dist/session/workspace/ref.js +11 -0
- package/dist/session/workspace/ref.js.map +1 -0
- package/dist/session/workspace/registry.d.ts +26 -0
- package/dist/session/workspace/registry.d.ts.map +1 -0
- package/dist/session/workspace/registry.js +35 -0
- package/dist/session/workspace/registry.js.map +1 -0
- package/dist/store/index.d.ts +0 -2
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +0 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/session/__tests__/disk.test.d.ts +2 -0
- package/dist/store/session/__tests__/disk.test.d.ts.map +1 -0
- package/dist/store/session/__tests__/disk.test.js +267 -0
- package/dist/store/session/__tests__/disk.test.js.map +1 -0
- package/dist/store/session/__tests__/memory.test.d.ts +2 -0
- package/dist/store/session/__tests__/memory.test.d.ts.map +1 -0
- package/dist/store/session/__tests__/memory.test.js +258 -0
- package/dist/store/session/__tests__/memory.test.js.map +1 -0
- package/dist/store/session/disk.d.ts +86 -0
- package/dist/store/session/disk.d.ts.map +1 -0
- package/dist/store/session/disk.js +818 -0
- package/dist/store/session/disk.js.map +1 -0
- package/dist/store/session/index.d.ts +7 -0
- package/dist/store/session/index.d.ts.map +1 -0
- package/dist/store/session/index.js +10 -0
- package/dist/store/session/index.js.map +1 -0
- package/dist/store/session/linkage.d.ts +38 -0
- package/dist/store/session/linkage.d.ts.map +1 -0
- package/dist/store/session/linkage.js +64 -0
- package/dist/store/session/linkage.js.map +1 -0
- package/dist/store/session/memory.d.ts +49 -0
- package/dist/store/session/memory.d.ts.map +1 -0
- package/dist/store/session/memory.js +335 -0
- package/dist/store/session/memory.js.map +1 -0
- package/dist/store/session/messages.d.ts +20 -0
- package/dist/store/session/messages.d.ts.map +1 -0
- package/dist/store/session/messages.js +12 -0
- package/dist/store/session/messages.js.map +1 -0
- package/dist/store/thread/disk.d.ts +41 -0
- package/dist/store/thread/disk.d.ts.map +1 -0
- package/dist/store/thread/disk.js +229 -0
- package/dist/store/thread/disk.js.map +1 -0
- package/dist/store/thread/index.d.ts +4 -0
- package/dist/store/thread/index.d.ts.map +1 -0
- package/dist/store/thread/index.js +6 -0
- package/dist/store/thread/index.js.map +1 -0
- package/dist/store/thread/memory.d.ts +23 -0
- package/dist/store/thread/memory.d.ts.map +1 -0
- package/dist/store/thread/memory.js +90 -0
- package/dist/store/thread/memory.js.map +1 -0
- package/dist/tools/builtins/__tests__/structuredOutput.example.d.ts +1 -1
- package/dist/types/agent/base.d.ts +24 -1
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/factory.d.ts +8 -2
- package/dist/types/agent/factory.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +57 -2
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/agent/task.js.map +1 -1
- package/dist/types/ids/index.d.ts +22 -3
- package/dist/types/ids/index.d.ts.map +1 -1
- package/dist/types/ids/index.js +8 -1
- package/dist/types/ids/index.js.map +1 -1
- package/dist/types/invocation/__tests__/state.test.js +36 -29
- package/dist/types/invocation/__tests__/state.test.js.map +1 -1
- package/dist/types/invocation/index.d.ts +20 -4
- package/dist/types/invocation/index.d.ts.map +1 -1
- package/dist/types/invocation/index.js +10 -7
- package/dist/types/invocation/index.js.map +1 -1
- package/dist/types/rag/retrieval.d.ts +4 -3
- package/dist/types/rag/retrieval.d.ts.map +1 -1
- package/dist/types/run/config.d.ts +12 -1
- package/dist/types/run/config.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +26 -1
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/index.d.ts.map +1 -1
- package/dist/types/run/index.js +8 -0
- package/dist/types/run/index.js.map +1 -1
- package/dist/types/run/metadata.d.ts +12 -2
- package/dist/types/run/metadata.d.ts.map +1 -1
- package/dist/types/run/status.d.ts +26 -0
- package/dist/types/run/status.d.ts.map +1 -0
- package/dist/types/run/status.js +2 -0
- package/dist/types/run/status.js.map +1 -0
- package/dist/types/session/ids.d.ts +9 -0
- package/dist/types/session/ids.d.ts.map +1 -0
- package/dist/types/session/ids.js +9 -0
- package/dist/types/session/ids.js.map +1 -0
- package/dist/types/session/index.d.ts +3 -0
- package/dist/types/session/index.d.ts.map +1 -0
- package/dist/types/session/index.js +5 -0
- package/dist/types/session/index.js.map +1 -0
- package/dist/types/session/store.d.ts +210 -0
- package/dist/types/session/store.d.ts.map +1 -0
- package/dist/types/session/store.js +9 -0
- package/dist/types/session/store.js.map +1 -0
- package/dist/types/thread/index.d.ts +2 -0
- package/dist/types/thread/index.d.ts.map +1 -0
- package/dist/types/thread/index.js +5 -0
- package/dist/types/thread/index.js.map +1 -0
- package/dist/types/thread/store.d.ts +86 -0
- package/dist/types/thread/store.d.ts.map +1 -0
- package/dist/types/thread/store.js +22 -0
- package/dist/types/thread/store.js.map +1 -0
- package/dist/utils/id.d.ts +8 -2
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +22 -4
- package/dist/utils/id.js.map +1 -1
- package/package.json +6 -11
- package/src/agents/ReactiveAgent.ts +7 -2
- package/src/agents/RouterAgent.ts +5 -0
- package/src/agents/SupervisorAgent.ts +29 -6
- package/src/bridge/a2a/index.ts +0 -1
- package/src/bridge/a2a/mapper.ts +7 -0
- package/src/bridge/a2a/message.ts +0 -32
- package/src/bridge/a2a/task.ts +9 -8
- package/src/bridge/sse/mapper.ts +8 -1
- package/src/constants/a2a/index.ts +2 -2
- package/src/contracts/api.ts +14 -30
- package/src/contracts/ids.ts +1 -1
- package/src/contracts/index.ts +3 -7
- package/src/contracts/schemas.ts +1 -8
- package/src/gateway/local.ts +6 -0
- package/src/index.ts +14 -4
- package/src/manager/agent/__tests__/lifecycle.test.ts +473 -0
- package/src/manager/agent/lifecycle.ts +515 -21
- package/src/manager/index.ts +3 -0
- package/src/manager/run/persistence.ts +26 -1
- package/src/manager/thread/__tests__/lifecycle.test.ts +286 -0
- package/src/manager/thread/lifecycle.ts +217 -0
- package/src/rag/retriever.ts +2 -2
- package/src/run/reporter.ts +28 -0
- package/src/runtime/query/__tests__/context.test.ts +102 -0
- package/src/runtime/query/context-cache.ts +4 -4
- package/src/runtime/query/context.ts +98 -9
- package/src/runtime/query/events.ts +8 -0
- package/src/runtime/query/index.ts +38 -1
- package/src/session/__tests__/integration/_fixtures.ts +310 -0
- package/src/session/__tests__/integration/archive-gate.test.ts +288 -0
- package/src/session/__tests__/integration/capacity-caps.test.ts +171 -0
- package/src/session/__tests__/integration/e2e-spawn.test.ts +296 -0
- package/src/session/__tests__/integration/event-stream-ordering.test.ts +410 -0
- package/src/session/__tests__/integration/handoff-broadcast-e2e.test.ts +271 -0
- package/src/session/__tests__/integration/handoff-illegal-transition.test.ts +214 -0
- package/src/session/__tests__/integration/handoff-single-e2e.test.ts +251 -0
- package/src/session/__tests__/integration/hierarchy-lifecycle.test.ts +240 -0
- package/src/session/__tests__/integration/migration-filesystem.test.ts +209 -0
- package/src/session/__tests__/integration/migration-id-prefix.test.ts +101 -0
- package/src/session/__tests__/integration/prev-artifact-dag.test.ts +325 -0
- package/src/session/__tests__/integration/retention-archive.test.ts +233 -0
- package/src/session/__tests__/integration/spawn-rollback.test.ts +313 -0
- package/src/session/__tests__/integration/summary-materialization-e2e.test.ts +239 -0
- package/src/session/__tests__/integration/tenant-isolation.test.ts +292 -0
- package/src/session/errors.ts +159 -0
- package/src/session/events/index.ts +16 -0
- package/src/session/events/schema-version.ts +13 -0
- package/src/session/events/types.ts +71 -0
- package/src/session/handoff/__tests__/broadcast.test.ts +378 -0
- package/src/session/handoff/__tests__/capacity.test.ts +129 -0
- package/src/session/handoff/__tests__/single.test.ts +333 -0
- package/src/session/handoff/assignment.ts +74 -0
- package/src/session/handoff/broadcast.ts +406 -0
- package/src/session/handoff/capacity.ts +121 -0
- package/src/session/handoff/events.ts +72 -0
- package/src/session/handoff/index.ts +29 -0
- package/src/session/handoff/single.ts +310 -0
- package/src/session/handoff/version.ts +59 -0
- package/src/session/hierarchy/__tests__/session.test.ts +100 -0
- package/src/session/hierarchy/actor.ts +17 -0
- package/src/session/hierarchy/index.ts +18 -0
- package/src/session/hierarchy/lineage.ts +15 -0
- package/src/session/hierarchy/project.ts +41 -0
- package/src/session/hierarchy/session.ts +109 -0
- package/src/session/hierarchy/sub-session.ts +92 -0
- package/src/session/hierarchy/tenant.ts +13 -0
- package/src/session/hierarchy/thread.ts +55 -0
- package/src/session/index.ts +15 -0
- package/src/session/intervention/__tests__/prev-artifact.test.ts +234 -0
- package/src/session/intervention/index.ts +16 -0
- package/src/session/intervention/prev-artifact.ts +180 -0
- package/src/session/migration/__tests__/filesystem.test.ts +263 -0
- package/src/session/migration/__tests__/id-prefix.test.ts +101 -0
- package/src/session/migration/__tests__/marker.test.ts +84 -0
- package/src/session/migration/errors.ts +23 -0
- package/src/session/migration/filesystem.ts +401 -0
- package/src/session/migration/id-prefix.ts +141 -0
- package/src/session/migration/index.ts +38 -0
- package/src/session/migration/marker.ts +131 -0
- package/src/session/retention/__tests__/archive.test.ts +318 -0
- package/src/session/retention/__tests__/disk-backend.test.ts +180 -0
- package/src/session/retention/archive-backend-ref.ts +17 -0
- package/src/session/retention/archive.ts +281 -0
- package/src/session/retention/backend.ts +107 -0
- package/src/session/retention/disk-backend.ts +304 -0
- package/src/session/retention/index.ts +16 -0
- package/src/session/retention/policy.ts +53 -0
- package/src/session/summary/__tests__/materialize.test.ts +343 -0
- package/src/session/summary/deliverable.ts +84 -0
- package/src/session/summary/index.ts +31 -0
- package/src/session/summary/materialize.ts +169 -0
- package/src/session/summary/ref.ts +104 -0
- package/src/session/workspace/__tests__/git-worktree.test.ts +258 -0
- package/src/session/workspace/__tests__/path-builder.test.ts +51 -0
- package/src/session/workspace/driver.ts +60 -0
- package/src/session/workspace/git-worktree.ts +209 -0
- package/src/session/workspace/index.ts +25 -0
- package/src/session/workspace/path-builder.ts +71 -0
- package/src/session/workspace/ref.ts +50 -0
- package/src/session/workspace/registry.ts +42 -0
- package/src/store/index.ts +0 -3
- package/src/store/session/__tests__/disk.test.ts +397 -0
- package/src/store/session/__tests__/memory.test.ts +402 -0
- package/src/store/session/disk.ts +976 -0
- package/src/store/session/index.ts +13 -0
- package/src/store/session/linkage.ts +80 -0
- package/src/store/session/memory.ts +412 -0
- package/src/store/session/messages.ts +21 -0
- package/src/store/thread/disk.ts +261 -0
- package/src/store/thread/index.ts +7 -0
- package/src/store/thread/memory.ts +104 -0
- package/src/types/agent/base.ts +27 -1
- package/src/types/agent/factory.ts +8 -3
- package/src/types/agent/task.ts +66 -2
- package/src/types/ids/index.ts +34 -3
- package/src/types/invocation/__tests__/state.test.ts +37 -29
- package/src/types/invocation/index.ts +26 -10
- package/src/types/rag/retrieval.ts +4 -3
- package/src/types/run/config.ts +13 -1
- package/src/types/run/events.ts +36 -1
- package/src/types/run/index.ts +8 -0
- package/src/types/run/metadata.ts +12 -2
- package/src/types/run/status.ts +33 -0
- package/src/types/session/ids.ts +23 -0
- package/src/types/session/index.ts +27 -0
- package/src/types/session/store.ts +252 -0
- package/src/types/thread/index.ts +5 -0
- package/src/types/thread/store.ts +92 -0
- package/src/utils/id.ts +34 -4
- package/dist/store/conversation/memory.d.ts +0 -21
- package/dist/store/conversation/memory.d.ts.map +0 -1
- package/dist/store/conversation/memory.js +0 -86
- package/dist/store/conversation/memory.js.map +0 -1
- package/dist/types/conversation/index.d.ts +0 -7
- package/dist/types/conversation/index.d.ts.map +0 -1
- package/dist/types/conversation/index.js +0 -2
- package/dist/types/conversation/index.js.map +0 -1
- package/src/store/conversation/memory.ts +0 -121
- package/src/types/conversation/index.ts +0 -8
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DiskThreadStore — filesystem-backed implementation of {@link ThreadStore}.
|
|
3
|
+
*
|
|
4
|
+
* Every mutation is write-tmp-rename (Convention #8). Layout uses the Phase 2
|
|
5
|
+
* intermediate shape:
|
|
6
|
+
*
|
|
7
|
+
* {rootDir}/projects/{projectId}/threads/{threadId}/
|
|
8
|
+
* thread.json
|
|
9
|
+
*
|
|
10
|
+
* Sessions stay under `projects/{projectId}/sessions/{sessionId}/...` rather
|
|
11
|
+
* than nesting under `threads/{threadId}/` — the denormalized `threadId` on
|
|
12
|
+
* each session record (Phase 2.4 decision) makes thread-scoped queries
|
|
13
|
+
* addressable without path-level nesting, and keeps Project-scoped consumers
|
|
14
|
+
* (handoff, retention, archival) a single-directory scan. Phase 6 collapses
|
|
15
|
+
* `projects/{projectId}/` to `.namzu/` as part of `namzu init` folder binding.
|
|
16
|
+
*
|
|
17
|
+
* Tenant scoping is enforced through the JSON payload (`tenantId` field on
|
|
18
|
+
* every record), not the path — cross-tenant reads reject with
|
|
19
|
+
* {@link TenantIsolationError} (Convention #17).
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { mkdir, readFile, readdir, rename, rm, unlink, writeFile } from 'node:fs/promises'
|
|
23
|
+
import { join } from 'node:path'
|
|
24
|
+
import { StaleThreadError, TenantIsolationError } from '../../session/errors.js'
|
|
25
|
+
import type { Thread, ThreadStatus } from '../../session/hierarchy/thread.js'
|
|
26
|
+
import type { TenantId } from '../../types/ids/index.js'
|
|
27
|
+
import type { ProjectId, ThreadId } from '../../types/session/ids.js'
|
|
28
|
+
import type { CreateThreadParams, ThreadStore } from '../../types/thread/store.js'
|
|
29
|
+
import { generateThreadId } from '../../utils/id.js'
|
|
30
|
+
|
|
31
|
+
/** Config for {@link DiskThreadStore}. `rootDir` is absolute. */
|
|
32
|
+
export interface DiskThreadStoreConfig {
|
|
33
|
+
rootDir: string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface PersistedThread {
|
|
37
|
+
id: ThreadId
|
|
38
|
+
projectId: ProjectId
|
|
39
|
+
tenantId: TenantId
|
|
40
|
+
title: string
|
|
41
|
+
status: ThreadStatus
|
|
42
|
+
ownerVersion: number
|
|
43
|
+
createdAt: string
|
|
44
|
+
updatedAt: string
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Index of threadId → (projectId, path). Lazy; populated on create / lookup. */
|
|
48
|
+
interface ThreadIndexEntry {
|
|
49
|
+
threadId: ThreadId
|
|
50
|
+
projectId: ProjectId
|
|
51
|
+
path: string
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export class DiskThreadStore implements ThreadStore {
|
|
55
|
+
private readonly rootDir: string
|
|
56
|
+
private readonly threadIndex = new Map<ThreadId, ThreadIndexEntry>()
|
|
57
|
+
|
|
58
|
+
constructor(config: DiskThreadStoreConfig) {
|
|
59
|
+
this.rootDir = config.rootDir
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async createThread(params: CreateThreadParams, tenantId: TenantId): Promise<Thread> {
|
|
63
|
+
const now = new Date()
|
|
64
|
+
const thread: Thread = {
|
|
65
|
+
id: generateThreadId(),
|
|
66
|
+
projectId: params.projectId,
|
|
67
|
+
tenantId,
|
|
68
|
+
title: params.title,
|
|
69
|
+
status: 'open',
|
|
70
|
+
ownerVersion: 0,
|
|
71
|
+
createdAt: now,
|
|
72
|
+
updatedAt: now,
|
|
73
|
+
}
|
|
74
|
+
const dir = join(this.rootDir, 'projects', params.projectId, 'threads', thread.id)
|
|
75
|
+
await mkdir(dir, { recursive: true })
|
|
76
|
+
await atomicWriteJson(join(dir, 'thread.json'), serializeThread(thread))
|
|
77
|
+
this.threadIndex.set(thread.id, {
|
|
78
|
+
threadId: thread.id,
|
|
79
|
+
projectId: params.projectId,
|
|
80
|
+
path: dir,
|
|
81
|
+
})
|
|
82
|
+
return thread
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async getThread(threadId: ThreadId, tenantId: TenantId): Promise<Thread | null> {
|
|
86
|
+
const located = await this.locateThread(threadId)
|
|
87
|
+
if (!located) return null
|
|
88
|
+
const raw = await readJson<PersistedThread>(join(located.path, 'thread.json'))
|
|
89
|
+
if (!raw) return null
|
|
90
|
+
this.assertTenant(raw.tenantId, tenantId, `thread(${threadId})`)
|
|
91
|
+
return deserializeThread(raw)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async updateThread(thread: Thread, tenantId: TenantId): Promise<void> {
|
|
95
|
+
if (thread.tenantId !== tenantId) {
|
|
96
|
+
throw new TenantIsolationError({
|
|
97
|
+
requested: tenantId,
|
|
98
|
+
resource: `thread(${thread.id}) payload`,
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
const located = await this.locateThread(thread.id)
|
|
102
|
+
if (!located) {
|
|
103
|
+
throw new Error(`Thread ${thread.id} not found`)
|
|
104
|
+
}
|
|
105
|
+
const existing = await readJson<PersistedThread>(join(located.path, 'thread.json'))
|
|
106
|
+
if (!existing) {
|
|
107
|
+
throw new Error(`Thread ${thread.id} not found`)
|
|
108
|
+
}
|
|
109
|
+
this.assertTenant(existing.tenantId, tenantId, `thread(${thread.id})`)
|
|
110
|
+
|
|
111
|
+
// CAS on ownerVersion. On mismatch, caller must re-read + re-apply +
|
|
112
|
+
// retry. No silent overwrite (Convention #0).
|
|
113
|
+
if (thread.ownerVersion !== existing.ownerVersion) {
|
|
114
|
+
throw new StaleThreadError({
|
|
115
|
+
threadId: thread.id,
|
|
116
|
+
expectedVersion: thread.ownerVersion,
|
|
117
|
+
actualVersion: existing.ownerVersion,
|
|
118
|
+
})
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const updated: Thread = {
|
|
122
|
+
...thread,
|
|
123
|
+
ownerVersion: existing.ownerVersion + 1,
|
|
124
|
+
updatedAt: new Date(),
|
|
125
|
+
}
|
|
126
|
+
await atomicWriteJson(join(located.path, 'thread.json'), serializeThread(updated))
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async deleteThread(threadId: ThreadId, tenantId: TenantId): Promise<void> {
|
|
130
|
+
const located = await this.locateThread(threadId)
|
|
131
|
+
if (!located) return // Idempotent: missing = no-op.
|
|
132
|
+
const existing = await readJson<PersistedThread>(join(located.path, 'thread.json'))
|
|
133
|
+
if (!existing) return
|
|
134
|
+
this.assertTenant(existing.tenantId, tenantId, `thread(${threadId})`)
|
|
135
|
+
|
|
136
|
+
// The store does NOT enforce "no attached sessions" here — that is a
|
|
137
|
+
// cross-store precondition owned by ThreadManager. This keeps the
|
|
138
|
+
// boundary clean; ThreadStore has no awareness of SessionStore layout.
|
|
139
|
+
await rm(located.path, { recursive: true, force: true })
|
|
140
|
+
this.threadIndex.delete(threadId)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async listThreads(projectId: ProjectId, tenantId: TenantId): Promise<readonly Thread[]> {
|
|
144
|
+
const threadsDir = join(this.rootDir, 'projects', projectId, 'threads')
|
|
145
|
+
let entries: string[]
|
|
146
|
+
try {
|
|
147
|
+
entries = await readdir(threadsDir)
|
|
148
|
+
} catch (err) {
|
|
149
|
+
const code = (err as NodeJS.ErrnoException).code
|
|
150
|
+
if (code === 'ENOENT') return []
|
|
151
|
+
throw err
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const results: Thread[] = []
|
|
155
|
+
for (const entry of entries) {
|
|
156
|
+
if (!entry.startsWith('thd_')) continue
|
|
157
|
+
const path = join(threadsDir, entry)
|
|
158
|
+
const raw = await readJson<PersistedThread>(join(path, 'thread.json'))
|
|
159
|
+
if (!raw) continue
|
|
160
|
+
// Cross-tenant records in the same directory are skipped silently —
|
|
161
|
+
// the listing is scoped to the caller's tenant. Mismatch is not an
|
|
162
|
+
// isolation violation because the caller never requested the record.
|
|
163
|
+
if (raw.tenantId !== tenantId) continue
|
|
164
|
+
results.push(deserializeThread(raw))
|
|
165
|
+
this.threadIndex.set(raw.id, { threadId: raw.id, projectId, path })
|
|
166
|
+
}
|
|
167
|
+
results.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())
|
|
168
|
+
return results
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private async locateThread(threadId: ThreadId): Promise<ThreadIndexEntry | null> {
|
|
172
|
+
const cached = this.threadIndex.get(threadId)
|
|
173
|
+
if (cached) return cached
|
|
174
|
+
|
|
175
|
+
// Walk projects/* looking for the thread dir. Cost is bounded by number
|
|
176
|
+
// of projects (usually 1) × number of threads per project.
|
|
177
|
+
const projectsDir = join(this.rootDir, 'projects')
|
|
178
|
+
let projectDirs: string[]
|
|
179
|
+
try {
|
|
180
|
+
projectDirs = await readdir(projectsDir)
|
|
181
|
+
} catch (err) {
|
|
182
|
+
const code = (err as NodeJS.ErrnoException).code
|
|
183
|
+
if (code === 'ENOENT') return null
|
|
184
|
+
throw err
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
for (const rawProject of projectDirs) {
|
|
188
|
+
if (!rawProject.startsWith('prj_')) continue
|
|
189
|
+
const threadPath = join(projectsDir, rawProject, 'threads', threadId)
|
|
190
|
+
const raw = await readJson<PersistedThread>(join(threadPath, 'thread.json'))
|
|
191
|
+
if (raw?.id === threadId) {
|
|
192
|
+
const entry: ThreadIndexEntry = {
|
|
193
|
+
threadId,
|
|
194
|
+
projectId: rawProject as ProjectId,
|
|
195
|
+
path: threadPath,
|
|
196
|
+
}
|
|
197
|
+
this.threadIndex.set(threadId, entry)
|
|
198
|
+
return entry
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return null
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private assertTenant(owning: TenantId, requested: TenantId, resource: string): void {
|
|
205
|
+
if (owning !== requested) {
|
|
206
|
+
throw new TenantIsolationError({ requested, resource })
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Serialization -----------------------------------------------------------
|
|
212
|
+
|
|
213
|
+
function serializeThread(thread: Thread): PersistedThread {
|
|
214
|
+
return {
|
|
215
|
+
id: thread.id,
|
|
216
|
+
projectId: thread.projectId,
|
|
217
|
+
tenantId: thread.tenantId,
|
|
218
|
+
title: thread.title,
|
|
219
|
+
status: thread.status,
|
|
220
|
+
ownerVersion: thread.ownerVersion,
|
|
221
|
+
createdAt: thread.createdAt.toISOString(),
|
|
222
|
+
updatedAt: thread.updatedAt.toISOString(),
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function deserializeThread(raw: PersistedThread): Thread {
|
|
227
|
+
return {
|
|
228
|
+
id: raw.id,
|
|
229
|
+
projectId: raw.projectId,
|
|
230
|
+
tenantId: raw.tenantId,
|
|
231
|
+
title: raw.title,
|
|
232
|
+
status: raw.status,
|
|
233
|
+
ownerVersion: raw.ownerVersion,
|
|
234
|
+
createdAt: new Date(raw.createdAt),
|
|
235
|
+
updatedAt: new Date(raw.updatedAt),
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// FS helpers -----------------------------------------------------------------
|
|
240
|
+
|
|
241
|
+
async function readJson<T>(path: string): Promise<T | null> {
|
|
242
|
+
try {
|
|
243
|
+
const raw = await readFile(path, 'utf-8')
|
|
244
|
+
return JSON.parse(raw) as T
|
|
245
|
+
} catch (err) {
|
|
246
|
+
const code = (err as NodeJS.ErrnoException).code
|
|
247
|
+
if (code === 'ENOENT') return null
|
|
248
|
+
throw err
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
async function atomicWriteJson(filePath: string, value: unknown): Promise<void> {
|
|
253
|
+
const tempPath = `${filePath}.tmp`
|
|
254
|
+
try {
|
|
255
|
+
await writeFile(tempPath, JSON.stringify(value, null, 2), 'utf-8')
|
|
256
|
+
await rename(tempPath, filePath)
|
|
257
|
+
} catch (err) {
|
|
258
|
+
await unlink(tempPath).catch(() => undefined)
|
|
259
|
+
throw err
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Sub-barrel for the Thread persistence module (Convention #4).
|
|
2
|
+
// Concrete implementations live in sibling files; re-export them here so
|
|
3
|
+
// consumers import via `../store/thread/index.js`.
|
|
4
|
+
|
|
5
|
+
export { InMemoryThreadStore } from './memory.js'
|
|
6
|
+
export { DiskThreadStore } from './disk.js'
|
|
7
|
+
export type { DiskThreadStoreConfig } from './disk.js'
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InMemoryThreadStore — reference in-memory implementation of
|
|
3
|
+
* {@link ThreadStore}.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the write-time CAS contract of the disk store: every
|
|
6
|
+
* `updateThread` compares the supplied `ownerVersion` against the persisted
|
|
7
|
+
* copy and rejects with `StaleThreadError` on mismatch. Convention #17:
|
|
8
|
+
* cross-tenant access throws `TenantIsolationError` with no fallback.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { StaleThreadError, TenantIsolationError } from '../../session/errors.js'
|
|
12
|
+
import type { Thread } from '../../session/hierarchy/thread.js'
|
|
13
|
+
import type { TenantId } from '../../types/ids/index.js'
|
|
14
|
+
import type { ProjectId, ThreadId } from '../../types/session/ids.js'
|
|
15
|
+
import type { CreateThreadParams, ThreadStore } from '../../types/thread/store.js'
|
|
16
|
+
import { generateThreadId } from '../../utils/id.js'
|
|
17
|
+
|
|
18
|
+
interface ThreadRecord {
|
|
19
|
+
tenantId: TenantId
|
|
20
|
+
thread: Thread
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class InMemoryThreadStore implements ThreadStore {
|
|
24
|
+
private readonly threads = new Map<ThreadId, ThreadRecord>()
|
|
25
|
+
|
|
26
|
+
async createThread(params: CreateThreadParams, tenantId: TenantId): Promise<Thread> {
|
|
27
|
+
const now = new Date()
|
|
28
|
+
const thread: Thread = {
|
|
29
|
+
id: generateThreadId(),
|
|
30
|
+
projectId: params.projectId,
|
|
31
|
+
tenantId,
|
|
32
|
+
title: params.title,
|
|
33
|
+
status: 'open',
|
|
34
|
+
ownerVersion: 0,
|
|
35
|
+
createdAt: now,
|
|
36
|
+
updatedAt: now,
|
|
37
|
+
}
|
|
38
|
+
this.threads.set(thread.id, { tenantId, thread })
|
|
39
|
+
return thread
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async getThread(threadId: ThreadId, tenantId: TenantId): Promise<Thread | null> {
|
|
43
|
+
const record = this.threads.get(threadId)
|
|
44
|
+
if (!record) return null
|
|
45
|
+
this.assertTenant(record.tenantId, tenantId, `thread(${threadId})`)
|
|
46
|
+
return record.thread
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async updateThread(thread: Thread, tenantId: TenantId): Promise<void> {
|
|
50
|
+
if (thread.tenantId !== tenantId) {
|
|
51
|
+
throw new TenantIsolationError({
|
|
52
|
+
requested: tenantId,
|
|
53
|
+
resource: `thread(${thread.id}) payload`,
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
const existing = this.threads.get(thread.id)
|
|
57
|
+
if (!existing) {
|
|
58
|
+
throw new Error(`Thread ${thread.id} not found`)
|
|
59
|
+
}
|
|
60
|
+
this.assertTenant(existing.tenantId, tenantId, `thread(${thread.id})`)
|
|
61
|
+
|
|
62
|
+
// CAS on ownerVersion — supplied version must match persisted exactly.
|
|
63
|
+
// Any drift means another writer already advanced the record; the caller
|
|
64
|
+
// must re-read + re-apply + retry.
|
|
65
|
+
if (thread.ownerVersion !== existing.thread.ownerVersion) {
|
|
66
|
+
throw new StaleThreadError({
|
|
67
|
+
threadId: thread.id,
|
|
68
|
+
expectedVersion: thread.ownerVersion,
|
|
69
|
+
actualVersion: existing.thread.ownerVersion,
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const updated: Thread = {
|
|
74
|
+
...thread,
|
|
75
|
+
ownerVersion: existing.thread.ownerVersion + 1,
|
|
76
|
+
updatedAt: new Date(),
|
|
77
|
+
}
|
|
78
|
+
this.threads.set(thread.id, { tenantId, thread: updated })
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async deleteThread(threadId: ThreadId, tenantId: TenantId): Promise<void> {
|
|
82
|
+
const record = this.threads.get(threadId)
|
|
83
|
+
if (!record) return // Idempotent: missing = no-op.
|
|
84
|
+
this.assertTenant(record.tenantId, tenantId, `thread(${threadId})`)
|
|
85
|
+
this.threads.delete(threadId)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async listThreads(projectId: ProjectId, tenantId: TenantId): Promise<readonly Thread[]> {
|
|
89
|
+
const matches: Thread[] = []
|
|
90
|
+
for (const { tenantId: ownerTenant, thread } of this.threads.values()) {
|
|
91
|
+
if (ownerTenant !== tenantId) continue
|
|
92
|
+
if (thread.projectId !== projectId) continue
|
|
93
|
+
matches.push(thread)
|
|
94
|
+
}
|
|
95
|
+
matches.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())
|
|
96
|
+
return matches
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private assertTenant(owning: TenantId, requested: TenantId, resource: string): void {
|
|
100
|
+
if (owning !== requested) {
|
|
101
|
+
throw new TenantIsolationError({ requested, resource })
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
package/src/types/agent/base.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { AgentStatus, CostInfo, TokenUsage } from '../common/index.js'
|
|
2
|
-
import type { RunId,
|
|
2
|
+
import type { RunId, SessionId, TenantId } from '../ids/index.js'
|
|
3
3
|
import type { InvocationState } from '../invocation/index.js'
|
|
4
4
|
import type { Message } from '../message/index.js'
|
|
5
5
|
import type { PermissionMode } from '../permission/index.js'
|
|
6
6
|
import type { StopReason } from '../run/stop-reason.js'
|
|
7
|
+
import type { ProjectId, ThreadId } from '../session/ids.js'
|
|
7
8
|
import type { TaskStore } from '../task/index.js'
|
|
8
9
|
import type { ToolAvailability } from '../tool/index.js'
|
|
9
10
|
|
|
@@ -22,8 +23,33 @@ export interface BaseAgentConfig {
|
|
|
22
23
|
permissionMode?: PermissionMode
|
|
23
24
|
env?: Record<string, string>
|
|
24
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Long-lived goal scope for the run. Required at runtime — agents reject
|
|
28
|
+
* configs missing this (`'X requires sessionId, projectId, and tenantId
|
|
29
|
+
* in config'`).
|
|
30
|
+
*
|
|
31
|
+
* Kept optional at the TYPE level because {@link AgentManager} stamps
|
|
32
|
+
* this field AFTER `configBuilder` returns (manager/agent/lifecycle.ts).
|
|
33
|
+
* Tightening to required is a separate task alongside
|
|
34
|
+
* `AgentFactoryOptions` carrying the triple.
|
|
35
|
+
*/
|
|
36
|
+
projectId?: ProjectId
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Topic the run belongs to. Optional at the TYPE level for the same
|
|
40
|
+
* reason as `projectId` — {@link AgentManager} stamps this field after
|
|
41
|
+
* `configBuilder` returns so `configBuilder` implementations do not
|
|
42
|
+
* need to be updated before this tightens. Tightening to required
|
|
43
|
+
* lands with the `AgentFactoryOptions` triple refactor.
|
|
44
|
+
*/
|
|
25
45
|
threadId?: ThreadId
|
|
26
46
|
|
|
47
|
+
/** Session under which the run executes. See `projectId` for the tightening plan. */
|
|
48
|
+
sessionId?: SessionId
|
|
49
|
+
|
|
50
|
+
/** Isolation boundary (Convention #17). See `projectId` for the tightening plan. */
|
|
51
|
+
tenantId?: TenantId
|
|
52
|
+
|
|
27
53
|
parentRunId?: RunId
|
|
28
54
|
|
|
29
55
|
depth?: number
|
|
@@ -14,7 +14,14 @@ export interface AgentDefinition {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export interface AgentFactoryOptions {
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* API key for providers that authenticate via key (OpenAI, Anthropic,
|
|
19
|
+
* OpenRouter). Optional because BYO-provider flows (Bedrock IAM, custom
|
|
20
|
+
* `ProviderRegistry.create(...)`) resolve credentials outside this object.
|
|
21
|
+
* `configBuilder` implementations should treat an absent `apiKey` as the
|
|
22
|
+
* BYO signal and use the provider passed via the agent config instead.
|
|
23
|
+
*/
|
|
24
|
+
apiKey?: string
|
|
18
25
|
model?: string
|
|
19
26
|
workingDirectory?: string
|
|
20
27
|
tokenBudget?: number
|
|
@@ -39,8 +46,6 @@ export interface AgentFactoryOptions {
|
|
|
39
46
|
|
|
40
47
|
taskRouter?: TaskRouterConfig
|
|
41
48
|
|
|
42
|
-
threadId?: string
|
|
43
|
-
|
|
44
49
|
runId?: string
|
|
45
50
|
|
|
46
51
|
parentRunId?: string
|
package/src/types/agent/task.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import type { ActorRef } from '../../session/hierarchy/actor.js'
|
|
2
|
+
import type { WorkspaceBackendKind } from '../../session/workspace/ref.js'
|
|
1
3
|
import type { TokenUsage } from '../common/index.js'
|
|
2
|
-
import type { RunId, TaskId,
|
|
4
|
+
import type { RunId, SessionId, TaskId, TenantId } from '../ids/index.js'
|
|
3
5
|
import type { Message } from '../message/index.js'
|
|
4
6
|
import type { RunEventListener } from '../run/events.js'
|
|
7
|
+
import type { ProjectId, ThreadId } from '../session/ids.js'
|
|
5
8
|
import type { AgentInput, BaseAgentConfig, BaseAgentResult } from './base.js'
|
|
6
9
|
import type { Agent } from './core.js'
|
|
7
10
|
import type { AgentFactoryOptions } from './factory.js'
|
|
@@ -19,6 +22,12 @@ export function isTerminalAgentTaskState(state: AgentTaskState): boolean {
|
|
|
19
22
|
return state === 'completed' || state === 'failed' || state === 'canceled' || state === 'rejected'
|
|
20
23
|
}
|
|
21
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Context carried into {@link AgentManager.sendMessage}. `tenantId`,
|
|
27
|
+
* `threadId`, `sessionId`, `projectId`, and `parentActor` are required —
|
|
28
|
+
* the spawn path is the ingress point for the session hierarchy; callers
|
|
29
|
+
* must provide the full scoping set.
|
|
30
|
+
*/
|
|
22
31
|
export interface AgentTaskContext {
|
|
23
32
|
parentRunId: RunId
|
|
24
33
|
|
|
@@ -32,7 +41,37 @@ export interface AgentTaskContext {
|
|
|
32
41
|
|
|
33
42
|
factoryOptions?: AgentFactoryOptions
|
|
34
43
|
|
|
35
|
-
|
|
44
|
+
/** Isolation boundary. Required per session-hierarchy.md §12.1. */
|
|
45
|
+
tenantId: TenantId
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Topic the current task belongs to. Required in 0.3.0 — spawn copies
|
|
49
|
+
* this onto the child session without a second ThreadStore round-trip,
|
|
50
|
+
* and gates creation on {@link ThreadManager.requireOpen}. Children
|
|
51
|
+
* inherit the parent's `threadId` verbatim; cross-thread spawn is
|
|
52
|
+
* forbidden by design (a delegated sub-agent stays on the same topic).
|
|
53
|
+
*/
|
|
54
|
+
threadId: ThreadId
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Parent session under which any sub-agent spawn is recorded. Required
|
|
58
|
+
* in 0.2.0; a spawn cannot be attributed without it.
|
|
59
|
+
*/
|
|
60
|
+
sessionId: SessionId
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Long-lived goal scope. Required. Denormalized from the owning Thread
|
|
64
|
+
* (see {@link Thread}) — structurally immutable per Phase 2.4 decision
|
|
65
|
+
* (sessions never cross threads, threads never cross projects).
|
|
66
|
+
*/
|
|
67
|
+
projectId: ProjectId
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The actor invoking this task. Children built off this context stamp
|
|
71
|
+
* their own `parentActor: ActorRef` linking back via the actor chain
|
|
72
|
+
* (session-hierarchy.md §4.3 / §10.4).
|
|
73
|
+
*/
|
|
74
|
+
parentActor: ActorRef
|
|
36
75
|
}
|
|
37
76
|
|
|
38
77
|
export interface AgentTaskBudget {
|
|
@@ -66,6 +105,12 @@ export interface AgentTaskProgress {
|
|
|
66
105
|
recentActivities: string[]
|
|
67
106
|
}
|
|
68
107
|
|
|
108
|
+
/**
|
|
109
|
+
* Options accepted by {@link AgentManager.sendMessage}. Phase 6 adds the
|
|
110
|
+
* required sub-session spawn scope (`parentSessionId`, `tenantId`, `projectId`,
|
|
111
|
+
* `parentActor`) so the manager can create a SubSession + child Session +
|
|
112
|
+
* WorkspaceRef triple atomically on every spawn.
|
|
113
|
+
*/
|
|
69
114
|
export interface SendMessageOptions {
|
|
70
115
|
agentId: string
|
|
71
116
|
|
|
@@ -77,6 +122,25 @@ export interface SendMessageOptions {
|
|
|
77
122
|
tokenBudget?: number
|
|
78
123
|
timeoutMs?: number
|
|
79
124
|
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Parent session under which the new sub-session is created. Capacity
|
|
128
|
+
* validation (depth + width) is applied against this session.
|
|
129
|
+
*/
|
|
130
|
+
parentSessionId: SessionId
|
|
131
|
+
|
|
132
|
+
tenantId: TenantId
|
|
133
|
+
|
|
134
|
+
projectId: ProjectId
|
|
135
|
+
|
|
136
|
+
/** The actor requesting the spawn — seeds the child's `parentActor`. */
|
|
137
|
+
parentActor: ActorRef
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Workspace backend to provision for the child session. Defaults to
|
|
141
|
+
* `git-worktree` — the MVP reference backend from Phase 3.
|
|
142
|
+
*/
|
|
143
|
+
workspaceBackend?: WorkspaceBackendKind
|
|
80
144
|
}
|
|
81
145
|
|
|
82
146
|
export interface AgentManagerConfig {
|
package/src/types/ids/index.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
export type ThreadId = `thd_${string}`
|
|
2
1
|
export type RunId = `run_${string}`
|
|
3
2
|
export type MessageId = `msg_${string}`
|
|
4
|
-
export type SessionId = `
|
|
3
|
+
export type SessionId = `ses_${string}`
|
|
5
4
|
export type ToolCallId = `call_${string}`
|
|
6
5
|
export type ActivityId = `act_${string}`
|
|
7
6
|
export type TaskId = `task_${string}`
|
|
@@ -11,7 +10,7 @@ export type DocumentId = `doc_${string}`
|
|
|
11
10
|
export type ChunkId = `chk_${string}`
|
|
12
11
|
export type ConnectorId = `conn_${string}`
|
|
13
12
|
export type ConnectorInstanceId = `ci_${string}`
|
|
14
|
-
export type TenantId = `
|
|
13
|
+
export type TenantId = `tnt_${string}`
|
|
15
14
|
export type CredentialId = `cred_${string}`
|
|
16
15
|
export type ExecutionContextId = `ectx_${string}`
|
|
17
16
|
export type MCPServerId = `mcp_${string}`
|
|
@@ -26,3 +25,35 @@ export type EmergencySaveId = `esave_${string}`
|
|
|
26
25
|
export type MemoryId = `mem_${string}`
|
|
27
26
|
export type PluginId = `plg_${string}`
|
|
28
27
|
export type SandboxId = `sbx_${string}`
|
|
28
|
+
|
|
29
|
+
// Actor identifiers (Session Hierarchy §4.3). Branded so actor refs cannot be
|
|
30
|
+
// constructed from bare strings.
|
|
31
|
+
export type UserId = `usr_${string}`
|
|
32
|
+
export type AgentId = `agt_${string}`
|
|
33
|
+
|
|
34
|
+
// Shared-store placeholder refs (Session Hierarchy §4.2 / §3.2). Full shapes
|
|
35
|
+
// land in later phases; kept here as opaque branded IDs so ProjectConfig can
|
|
36
|
+
// reference them today.
|
|
37
|
+
export type MemoryStoreRef = `mms_${string}`
|
|
38
|
+
export type VaultRef = `vlt_${string}`
|
|
39
|
+
export type KnowledgeBaseRef = `kbs_${string}`
|
|
40
|
+
|
|
41
|
+
// Session hierarchy IDs. Convention #2 branded IDs; prefixes mandated by the
|
|
42
|
+
// five-layer hierarchy (Project → Thread → Session → SubSession → Run). The
|
|
43
|
+
// `types/session/ids.ts` barrel re-exports these for co-location ergonomics.
|
|
44
|
+
export type ProjectId = `prj_${string}`
|
|
45
|
+
export type ThreadId = `thd_${string}`
|
|
46
|
+
export type SubSessionId = `sub_${string}`
|
|
47
|
+
export type HandoffId = `hof_${string}`
|
|
48
|
+
export type WorkspaceId = `wsp_${string}`
|
|
49
|
+
export type SummaryId = `sum_${string}`
|
|
50
|
+
export type DeliverableId = `del_${string}`
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Sentinel {@link TenantId} for legacy pre-0.2.0 runs rehomed by the
|
|
54
|
+
* boot-time filesystem migration. Consumers with strict tenant enforcement
|
|
55
|
+
* should either tag these records on first access or reject them until a
|
|
56
|
+
* real tenant is assigned — the kernel surfaces the sentinel but does not
|
|
57
|
+
* prescribe policy (Convention #17).
|
|
58
|
+
*/
|
|
59
|
+
export const UNKNOWN_TENANT_ID = 'tnt_unknown_legacy' as TenantId
|