@namzu/sdk 0.1.8 → 0.2.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 +16 -0
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +5 -3
- 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 +18 -5
- package/dist/agents/SupervisorAgent.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/task.d.ts +2 -2
- package/dist/bridge/a2a/task.d.ts.map +1 -1
- 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 +22 -3
- package/dist/contracts/api.d.ts.map +1 -1
- package/dist/contracts/index.d.ts +3 -1
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.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 +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- 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 +302 -0
- package/dist/manager/agent/__tests__/lifecycle.test.js.map +1 -0
- package/dist/manager/agent/lifecycle.d.ts +58 -3
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +311 -12
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/run/persistence.d.ts +8 -1
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +15 -0
- package/dist/manager/run/persistence.js.map +1 -1
- 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 +84 -0
- package/dist/runtime/query/__tests__/context.test.js.map +1 -0
- package/dist/runtime/query/context.d.ts +55 -2
- package/dist/runtime/query/context.d.ts.map +1 -1
- package/dist/runtime/query/context.js +48 -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 +25 -2
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +11 -1
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/session/__tests__/integration/_fixtures.d.ts +115 -0
- package/dist/session/__tests__/integration/_fixtures.d.ts.map +1 -0
- package/dist/session/__tests__/integration/_fixtures.js +198 -0
- package/dist/session/__tests__/integration/_fixtures.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 +116 -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 +226 -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 +323 -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 +170 -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 +146 -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 +163 -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 +157 -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 +241 -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 +186 -0
- package/dist/session/__tests__/integration/retention-archive.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 +200 -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 +180 -0
- package/dist/session/__tests__/integration/tenant-isolation.test.js.map +1 -0
- package/dist/session/errors.d.ts +60 -0
- package/dist/session/errors.d.ts.map +1 -0
- package/dist/session/errors.js +50 -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 +243 -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 +100 -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 +230 -0
- package/dist/session/handoff/__tests__/single.test.js.map +1 -0
- package/dist/session/handoff/assignment.d.ts +59 -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 +47 -0
- package/dist/session/handoff/broadcast.d.ts.map +1 -0
- package/dist/session/handoff/broadcast.js +296 -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 +62 -0
- package/dist/session/handoff/single.d.ts.map +1 -0
- package/dist/session/handoff/single.js +217 -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 +67 -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 +8 -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 +59 -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/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 +98 -0
- package/dist/session/migration/id-prefix.d.ts.map +1 -0
- package/dist/session/migration/id-prefix.js +116 -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 +252 -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 +269 -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/conversation/memory.d.ts +22 -0
- package/dist/store/conversation/memory.d.ts.map +1 -1
- package/dist/store/conversation/memory.js +22 -0
- package/dist/store/conversation/memory.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 +240 -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 +217 -0
- package/dist/store/session/__tests__/memory.test.js.map +1 -0
- package/dist/store/session/disk.d.ts +85 -0
- package/dist/store/session/disk.d.ts.map +1 -0
- package/dist/store/session/disk.js +757 -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 +11 -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 +48 -0
- package/dist/store/session/memory.d.ts.map +1 -0
- package/dist/store/session/memory.js +322 -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/tools/builtins/__tests__/structuredOutput.example.d.ts +1 -1
- package/dist/types/agent/base.d.ts +28 -1
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +50 -2
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/agent/task.js.map +1 -1
- package/dist/types/conversation/index.d.ts +7 -0
- package/dist/types/conversation/index.d.ts.map +1 -1
- package/dist/types/ids/index.d.ts +26 -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/run/config.d.ts +11 -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 +24 -1
- 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 +18 -0
- package/dist/types/session/ids.d.ts.map +1 -0
- package/dist/types/session/ids.js +12 -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 +188 -0
- package/dist/types/session/store.d.ts.map +1 -0
- package/dist/types/session/store.js +14 -0
- package/dist/types/session/store.js.map +1 -0
- package/dist/utils/id.d.ts +18 -1
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +42 -4
- package/dist/utils/id.js.map +1 -1
- package/package.json +1 -1
- package/src/agents/ReactiveAgent.ts +7 -3
- package/src/agents/RouterAgent.ts +5 -0
- package/src/agents/SupervisorAgent.ts +26 -6
- package/src/bridge/a2a/mapper.ts +7 -0
- package/src/bridge/a2a/task.ts +2 -2
- package/src/bridge/sse/mapper.ts +8 -1
- package/src/constants/a2a/index.ts +2 -2
- package/src/contracts/api.ts +23 -3
- package/src/contracts/index.ts +2 -0
- package/src/gateway/local.ts +6 -0
- package/src/index.ts +14 -0
- package/src/manager/agent/__tests__/lifecycle.test.ts +452 -0
- package/src/manager/agent/lifecycle.ts +434 -19
- package/src/manager/run/persistence.ts +20 -1
- package/src/run/reporter.ts +28 -0
- package/src/runtime/query/__tests__/context.test.ts +101 -0
- package/src/runtime/query/context.ts +106 -10
- package/src/runtime/query/events.ts +8 -0
- package/src/runtime/query/index.ts +41 -3
- package/src/session/__tests__/integration/_fixtures.ts +282 -0
- package/src/session/__tests__/integration/capacity-caps.test.ts +164 -0
- package/src/session/__tests__/integration/e2e-spawn.test.ts +278 -0
- package/src/session/__tests__/integration/event-stream-ordering.test.ts +403 -0
- package/src/session/__tests__/integration/handoff-broadcast-e2e.test.ts +245 -0
- package/src/session/__tests__/integration/handoff-illegal-transition.test.ts +179 -0
- package/src/session/__tests__/integration/handoff-single-e2e.test.ts +220 -0
- package/src/session/__tests__/integration/hierarchy-lifecycle.test.ts +237 -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 +318 -0
- package/src/session/__tests__/integration/retention-archive.test.ts +231 -0
- package/src/session/__tests__/integration/summary-materialization-e2e.test.ts +237 -0
- package/src/session/__tests__/integration/tenant-isolation.test.ts +282 -0
- package/src/session/errors.ts +70 -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 +350 -0
- package/src/session/handoff/__tests__/capacity.test.ts +123 -0
- package/src/session/handoff/__tests__/single.test.ts +316 -0
- package/src/session/handoff/assignment.ts +62 -0
- package/src/session/handoff/broadcast.ts +381 -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 +288 -0
- package/src/session/handoff/version.ts +59 -0
- package/src/session/hierarchy/__tests__/session.test.ts +92 -0
- package/src/session/hierarchy/actor.ts +17 -0
- package/src/session/hierarchy/index.ts +17 -0
- package/src/session/hierarchy/lineage.ts +15 -0
- package/src/session/hierarchy/project.ts +41 -0
- package/src/session/hierarchy/session.ts +97 -0
- package/src/session/hierarchy/sub-session.ts +92 -0
- package/src/session/hierarchy/tenant.ts +13 -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 +146 -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 +316 -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 +341 -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/conversation/memory.ts +23 -0
- package/src/store/session/__tests__/disk.test.ts +346 -0
- package/src/store/session/__tests__/memory.test.ts +327 -0
- package/src/store/session/disk.ts +920 -0
- package/src/store/session/index.ts +14 -0
- package/src/store/session/linkage.ts +80 -0
- package/src/store/session/memory.ts +400 -0
- package/src/store/session/messages.ts +21 -0
- package/src/types/agent/base.ts +31 -1
- package/src/types/agent/task.ts +58 -2
- package/src/types/conversation/index.ts +7 -0
- package/src/types/ids/index.ts +41 -3
- package/src/types/invocation/__tests__/state.test.ts +37 -29
- package/src/types/invocation/index.ts +26 -10
- package/src/types/run/config.ts +12 -1
- package/src/types/run/events.ts +36 -1
- package/src/types/run/index.ts +8 -0
- package/src/types/run/metadata.ts +24 -1
- package/src/types/run/status.ts +33 -0
- package/src/types/session/ids.ts +34 -0
- package/src/types/session/index.ts +28 -0
- package/src/types/session/store.ts +229 -0
- package/src/utils/id.ts +55 -4
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration — SessionSummaryMaterializer + SessionStore atomic transition,
|
|
3
|
+
* plus the crash-recovery path.
|
|
4
|
+
*
|
|
5
|
+
* Covers roadmap §5 invariants: §8.1 (summary kernel-owned, no agent-callable
|
|
6
|
+
* emission surface), §8.1 atomic with terminal transition, recovery path
|
|
7
|
+
* when the status-flip lost to a mid-flight crash. `SessionAlreadySummarizedError`
|
|
8
|
+
* on concurrent re-materialize.
|
|
9
|
+
*
|
|
10
|
+
* The kernel-ownership assertion is expressed both structurally (the
|
|
11
|
+
* `materializedBy: 'kernel'` brand on the persisted record) and by routing
|
|
12
|
+
* every successful materialize through the Materializer — no test below calls
|
|
13
|
+
* `store.recordSummary` directly, and the compile-time type narrows the
|
|
14
|
+
* argument to `& { materializedBy: 'kernel' }` so an agent-constructed payload
|
|
15
|
+
* would fail typecheck (not just runtime validation).
|
|
16
|
+
*/
|
|
17
|
+
import { describe, expect, it } from 'vitest';
|
|
18
|
+
import { InMemorySessionStore } from '../../../store/session/memory.js';
|
|
19
|
+
import { SessionSummaryMaterializer } from '../../summary/materialize.js';
|
|
20
|
+
import { SessionAlreadySummarizedError } from '../../summary/ref.js';
|
|
21
|
+
import { DEFAULT_TENANT, agentActor } from './_fixtures.js';
|
|
22
|
+
async function seedActive(store) {
|
|
23
|
+
const project = await store.createProject({ tenantId: DEFAULT_TENANT, name: 'summary' }, DEFAULT_TENANT);
|
|
24
|
+
const session = await store.createSession({ projectId: project.id, currentActor: agentActor('agt_worker') }, DEFAULT_TENANT);
|
|
25
|
+
await store.updateSession({ ...session, status: 'active' }, DEFAULT_TENANT);
|
|
26
|
+
return { project, session: { ...session, status: 'active' } };
|
|
27
|
+
}
|
|
28
|
+
function makeGen() {
|
|
29
|
+
let n = 0;
|
|
30
|
+
return () => `sum_materialize_${++n}`;
|
|
31
|
+
}
|
|
32
|
+
describe('Integration — summary materialization E2E', () => {
|
|
33
|
+
it('Materializer writes summary + flips session active→idle atomically', async () => {
|
|
34
|
+
const store = new InMemorySessionStore();
|
|
35
|
+
const { session } = await seedActive(store);
|
|
36
|
+
const materializer = new SessionSummaryMaterializer({
|
|
37
|
+
store,
|
|
38
|
+
generateSummaryId: makeGen(),
|
|
39
|
+
});
|
|
40
|
+
const summary = await materializer.materialize({
|
|
41
|
+
sessionId: session.id,
|
|
42
|
+
tenantId: DEFAULT_TENANT,
|
|
43
|
+
finalOutcome: { status: 'succeeded' },
|
|
44
|
+
agentSummary: 'done',
|
|
45
|
+
declaredDeliverables: [],
|
|
46
|
+
keyDecisions: [],
|
|
47
|
+
});
|
|
48
|
+
// Persisted.
|
|
49
|
+
const stored = await store.getSummary(session.id, DEFAULT_TENANT);
|
|
50
|
+
expect(stored?.id).toBe(summary.id);
|
|
51
|
+
expect(stored?.materializedBy).toBe('kernel');
|
|
52
|
+
// Status atomically flipped.
|
|
53
|
+
const reloaded = await store.getSession(session.id, DEFAULT_TENANT);
|
|
54
|
+
expect(reloaded?.status).toBe('idle');
|
|
55
|
+
});
|
|
56
|
+
it('§8.1 atomicity invariant: no external observer sees terminal without summary', async () => {
|
|
57
|
+
// With InMemorySessionStore the two writes happen inside a single Map
|
|
58
|
+
// method call — there is no observable mid-state. We assert by reading
|
|
59
|
+
// both resources immediately after a single awaited materialize: the
|
|
60
|
+
// terminal status and the summary are visible together.
|
|
61
|
+
const store = new InMemorySessionStore();
|
|
62
|
+
const { session } = await seedActive(store);
|
|
63
|
+
const materializer = new SessionSummaryMaterializer({
|
|
64
|
+
store,
|
|
65
|
+
generateSummaryId: makeGen(),
|
|
66
|
+
});
|
|
67
|
+
await materializer.materialize({
|
|
68
|
+
sessionId: session.id,
|
|
69
|
+
tenantId: DEFAULT_TENANT,
|
|
70
|
+
finalOutcome: { status: 'succeeded' },
|
|
71
|
+
agentSummary: '',
|
|
72
|
+
declaredDeliverables: [],
|
|
73
|
+
keyDecisions: [],
|
|
74
|
+
});
|
|
75
|
+
const [finalSession, finalSummary] = await Promise.all([
|
|
76
|
+
store.getSession(session.id, DEFAULT_TENANT),
|
|
77
|
+
store.getSummary(session.id, DEFAULT_TENANT),
|
|
78
|
+
]);
|
|
79
|
+
// Atomic pairing: idle status AND persisted summary present together.
|
|
80
|
+
expect(finalSession?.status).toBe('idle');
|
|
81
|
+
expect(finalSummary).not.toBeNull();
|
|
82
|
+
});
|
|
83
|
+
it('concurrent re-materialize rejects with SessionAlreadySummarizedError', async () => {
|
|
84
|
+
const store = new InMemorySessionStore();
|
|
85
|
+
const { session } = await seedActive(store);
|
|
86
|
+
const materializer = new SessionSummaryMaterializer({
|
|
87
|
+
store,
|
|
88
|
+
generateSummaryId: makeGen(),
|
|
89
|
+
});
|
|
90
|
+
await materializer.materialize({
|
|
91
|
+
sessionId: session.id,
|
|
92
|
+
tenantId: DEFAULT_TENANT,
|
|
93
|
+
finalOutcome: { status: 'succeeded' },
|
|
94
|
+
agentSummary: 'first',
|
|
95
|
+
declaredDeliverables: [],
|
|
96
|
+
keyDecisions: [],
|
|
97
|
+
});
|
|
98
|
+
await expect(materializer.materialize({
|
|
99
|
+
sessionId: session.id,
|
|
100
|
+
tenantId: DEFAULT_TENANT,
|
|
101
|
+
finalOutcome: { status: 'succeeded' },
|
|
102
|
+
agentSummary: 'second',
|
|
103
|
+
declaredDeliverables: [],
|
|
104
|
+
keyDecisions: [],
|
|
105
|
+
})).rejects.toBeInstanceOf(SessionAlreadySummarizedError);
|
|
106
|
+
});
|
|
107
|
+
it('crash recovery: summary persisted + session still active → recover() replays idempotently', async () => {
|
|
108
|
+
const store = new InMemorySessionStore();
|
|
109
|
+
const { session } = await seedActive(store);
|
|
110
|
+
const materializer = new SessionSummaryMaterializer({
|
|
111
|
+
store,
|
|
112
|
+
generateSummaryId: makeGen(),
|
|
113
|
+
});
|
|
114
|
+
// Materialize once (happy path writes both). Then simulate a crash by
|
|
115
|
+
// forcing the session status back to `active` while the summary record
|
|
116
|
+
// stays intact — mimicking summary.json landing but session.json being
|
|
117
|
+
// lost to a mid-write power failure (see session/summary/materialize.ts
|
|
118
|
+
// `recover()` docs).
|
|
119
|
+
await materializer.materialize({
|
|
120
|
+
sessionId: session.id,
|
|
121
|
+
tenantId: DEFAULT_TENANT,
|
|
122
|
+
finalOutcome: { status: 'succeeded' },
|
|
123
|
+
agentSummary: '',
|
|
124
|
+
declaredDeliverables: [],
|
|
125
|
+
keyDecisions: [],
|
|
126
|
+
});
|
|
127
|
+
const mid = await store.getSession(session.id, DEFAULT_TENANT);
|
|
128
|
+
if (!mid)
|
|
129
|
+
throw new Error('mid session missing');
|
|
130
|
+
await store.updateSession({ ...mid, status: 'active' }, DEFAULT_TENANT);
|
|
131
|
+
// Recovery call re-triggers the store's flip path without minting a
|
|
132
|
+
// new summary id.
|
|
133
|
+
const recovered = await materializer.recover(session.id, DEFAULT_TENANT);
|
|
134
|
+
expect(recovered).not.toBeNull();
|
|
135
|
+
const reloaded = await store.getSession(session.id, DEFAULT_TENANT);
|
|
136
|
+
expect(reloaded?.status).toBe('idle');
|
|
137
|
+
// Second recover call with session already idle: still idempotent.
|
|
138
|
+
const recovered2 = await materializer.recover(session.id, DEFAULT_TENANT);
|
|
139
|
+
expect(recovered2?.id).toBe(recovered?.id);
|
|
140
|
+
const reloaded2 = await store.getSession(session.id, DEFAULT_TENANT);
|
|
141
|
+
expect(reloaded2?.status).toBe('idle');
|
|
142
|
+
});
|
|
143
|
+
it('agent cannot construct SessionSummaryRef directly: recordSummary rejects non-kernel payload', async () => {
|
|
144
|
+
// The SessionStore contract narrows `recordSummary` to
|
|
145
|
+
// `SessionSummaryRef & { materializedBy: 'kernel' }`. Agents cannot
|
|
146
|
+
// type-construct a brand literal of `'kernel'` without going through
|
|
147
|
+
// the Materializer (see session/summary/ref.ts module header). Even
|
|
148
|
+
// attempting to cast into the shape and call directly would bypass
|
|
149
|
+
// the materialize ordering (status-check, length-check,
|
|
150
|
+
// already-exists guard). This test exercises the runtime guard: a
|
|
151
|
+
// second kernel-branded record for an already-summarized session
|
|
152
|
+
// rejects with SessionAlreadySummarizedError.
|
|
153
|
+
const store = new InMemorySessionStore();
|
|
154
|
+
const { session } = await seedActive(store);
|
|
155
|
+
const materializer = new SessionSummaryMaterializer({
|
|
156
|
+
store,
|
|
157
|
+
generateSummaryId: makeGen(),
|
|
158
|
+
});
|
|
159
|
+
await materializer.materialize({
|
|
160
|
+
sessionId: session.id,
|
|
161
|
+
tenantId: DEFAULT_TENANT,
|
|
162
|
+
finalOutcome: { status: 'succeeded' },
|
|
163
|
+
agentSummary: '',
|
|
164
|
+
declaredDeliverables: [],
|
|
165
|
+
keyDecisions: [],
|
|
166
|
+
});
|
|
167
|
+
// Direct call with a fabricated "kernel" ref payload — rejected
|
|
168
|
+
// because a summary already exists (store guard). The kernel-brand
|
|
169
|
+
// check at the type layer prevents naive agent-side construction; the
|
|
170
|
+
// runtime guard here catches store-level re-entry (materialize goes
|
|
171
|
+
// through the same path).
|
|
172
|
+
await expect(store.recordSummary({
|
|
173
|
+
id: 'sum_fake',
|
|
174
|
+
sessionRef: session.id,
|
|
175
|
+
tenantId: DEFAULT_TENANT,
|
|
176
|
+
outcome: { status: 'succeeded' },
|
|
177
|
+
deliverables: [],
|
|
178
|
+
agentSummary: 'forged',
|
|
179
|
+
keyDecisions: [],
|
|
180
|
+
at: new Date(),
|
|
181
|
+
materializedBy: 'kernel',
|
|
182
|
+
}, DEFAULT_TENANT)).rejects.toBeInstanceOf(SessionAlreadySummarizedError);
|
|
183
|
+
});
|
|
184
|
+
it('missing session: materialize throws a not-found error', async () => {
|
|
185
|
+
const store = new InMemorySessionStore();
|
|
186
|
+
const materializer = new SessionSummaryMaterializer({
|
|
187
|
+
store,
|
|
188
|
+
generateSummaryId: makeGen(),
|
|
189
|
+
});
|
|
190
|
+
await expect(materializer.materialize({
|
|
191
|
+
sessionId: 'ses_never',
|
|
192
|
+
tenantId: DEFAULT_TENANT,
|
|
193
|
+
finalOutcome: { status: 'succeeded' },
|
|
194
|
+
agentSummary: '',
|
|
195
|
+
declaredDeliverables: [],
|
|
196
|
+
keyDecisions: [],
|
|
197
|
+
})).rejects.toThrow(/not found/);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=summary-materialization-e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary-materialization-e2e.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/summary-materialization-e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAGvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3D,KAAK,UAAU,UAAU,CAAC,KAA2B;IACpD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CACxC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,EAC7C,cAAc,CACd,CAAA;IACD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CACxC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,EACjE,cAAc,CACd,CAAA;IACD,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAA;IAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAiB,EAAE,EAAE,CAAA;AACvE,CAAC;AAED,SAAS,OAAO;IACf,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAe,CAAA;AACnD,CAAC;AAED,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IAC1D,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC;YAC9C,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,MAAM;YACpB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CAAA;QAEF,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACjE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACnC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE7C,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACnE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC7F,sEAAsE;QACtE,uEAAuE;QACvE,qEAAqE;QACrE,wDAAwD;QACxD,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QAEF,MAAM,YAAY,CAAC,WAAW,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,EAAE;YAChB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CAAA;QAEF,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACtD,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC;YAC5C,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC;SAC5C,CAAC,CAAA;QACF,sEAAsE;QACtE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACzC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QAEF,MAAM,YAAY,CAAC,WAAW,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,OAAO;YACrB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CAAA;QAEF,MAAM,MAAM,CACX,YAAY,CAAC,WAAW,CAAC;YACxB,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,QAAQ;YACtB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CACF,CAAC,OAAO,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;QAC1G,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QAEF,sEAAsE;QACtE,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,qBAAqB;QACrB,MAAM,YAAY,CAAC,WAAW,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,EAAE;YAChB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QAC9D,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;QAChD,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAA;QAEvE,oEAAoE;QACpE,kBAAkB;QAClB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACxE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAEhC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACnE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAErC,mEAAmE;QACnE,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACzE,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAC1C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACpE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;QAC5G,uDAAuD;QACvD,oEAAoE;QACpE,qEAAqE;QACrE,oEAAoE;QACpE,mEAAmE;QACnE,wDAAwD;QACxD,kEAAkE;QAClE,iEAAiE;QACjE,8CAA8C;QAC9C,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QACF,MAAM,YAAY,CAAC,WAAW,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,EAAE;YAChB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CAAA;QAEF,gEAAgE;QAChE,mEAAmE;QACnE,sEAAsE;QACtE,oEAAoE;QACpE,0BAA0B;QAC1B,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAClB;YACC,EAAE,EAAE,UAAuB;YAC3B,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YAChC,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,QAAQ;YACtB,YAAY,EAAE,EAAE;YAChB,EAAE,EAAE,IAAI,IAAI,EAAE;YACd,cAAc,EAAE,QAAQ;SACxB,EACD,cAAc,CACd,CACD,CAAC,OAAO,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QAEF,MAAM,MAAM,CACX,YAAY,CAAC,WAAW,CAAC;YACxB,SAAS,EAAE,WAAwB;YACnC,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,EAAE;YAChB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration — multi-tenant isolation enforcement at every store accessor
|
|
3
|
+
* and cross-store boundary.
|
|
4
|
+
*
|
|
5
|
+
* Covers roadmap §5 invariants: §12 `tenantId` denormalized on every
|
|
6
|
+
* persisted entity, §12.2 cross-tenant rejection (TenantIsolationError at
|
|
7
|
+
* every accessor), broadcast handoff rejecting when recipient tenant
|
|
8
|
+
* differs.
|
|
9
|
+
*
|
|
10
|
+
* Every assertion here crosses a kernel boundary with a mismatched tenantId
|
|
11
|
+
* and checks that the SDK rejects rather than silently re-scoping.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=tenant-isolation.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-isolation.test.d.ts","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/tenant-isolation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration — multi-tenant isolation enforcement at every store accessor
|
|
3
|
+
* and cross-store boundary.
|
|
4
|
+
*
|
|
5
|
+
* Covers roadmap §5 invariants: §12 `tenantId` denormalized on every
|
|
6
|
+
* persisted entity, §12.2 cross-tenant rejection (TenantIsolationError at
|
|
7
|
+
* every accessor), broadcast handoff rejecting when recipient tenant
|
|
8
|
+
* differs.
|
|
9
|
+
*
|
|
10
|
+
* Every assertion here crosses a kernel boundary with a mismatched tenantId
|
|
11
|
+
* and checks that the SDK rejects rather than silently re-scoping.
|
|
12
|
+
*/
|
|
13
|
+
import { describe, expect, it } from 'vitest';
|
|
14
|
+
import { InMemorySessionStore } from '../../../store/session/memory.js';
|
|
15
|
+
import { createUserMessage } from '../../../types/message/index.js';
|
|
16
|
+
import { TenantIsolationError } from '../../errors.js';
|
|
17
|
+
import { DEFAULT_TENANT, OTHER_TENANT, agentActor, userActor } from './_fixtures.js';
|
|
18
|
+
async function seedTenantAResources() {
|
|
19
|
+
const store = new InMemorySessionStore();
|
|
20
|
+
const project = await store.createProject({ tenantId: DEFAULT_TENANT, name: 'tenA' }, DEFAULT_TENANT);
|
|
21
|
+
const parent = await store.createSession({ projectId: project.id, currentActor: userActor('usr_a') }, DEFAULT_TENANT);
|
|
22
|
+
const child = await store.createSession({ projectId: project.id, currentActor: agentActor('agt_a') }, DEFAULT_TENANT);
|
|
23
|
+
const sub = await store.createSubSession({
|
|
24
|
+
parentSessionId: parent.id,
|
|
25
|
+
childSessionId: child.id,
|
|
26
|
+
kind: 'agent_spawn',
|
|
27
|
+
spawnedBy: userActor('usr_a'),
|
|
28
|
+
}, DEFAULT_TENANT);
|
|
29
|
+
return { store, project, parent, child, sub };
|
|
30
|
+
}
|
|
31
|
+
describe('Integration — tenant isolation', () => {
|
|
32
|
+
it('getProject with wrong tenantId → TenantIsolationError', async () => {
|
|
33
|
+
const { store, project } = await seedTenantAResources();
|
|
34
|
+
await expect(store.getProject(project.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
35
|
+
});
|
|
36
|
+
it('getSession with wrong tenantId → TenantIsolationError', async () => {
|
|
37
|
+
const { store, parent } = await seedTenantAResources();
|
|
38
|
+
await expect(store.getSession(parent.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
39
|
+
});
|
|
40
|
+
it('getSubSession with wrong tenantId → TenantIsolationError', async () => {
|
|
41
|
+
const { store, sub } = await seedTenantAResources();
|
|
42
|
+
await expect(store.getSubSession(sub.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
43
|
+
});
|
|
44
|
+
it('updateSession with wrong tenantId → TenantIsolationError', async () => {
|
|
45
|
+
const { store, parent } = await seedTenantAResources();
|
|
46
|
+
await expect(store.updateSession({ ...parent, status: 'active' }, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
47
|
+
});
|
|
48
|
+
it('createSubSession from a session owned by another tenant → TenantIsolationError', async () => {
|
|
49
|
+
const { store, parent, child } = await seedTenantAResources();
|
|
50
|
+
await expect(store.createSubSession({
|
|
51
|
+
parentSessionId: parent.id,
|
|
52
|
+
childSessionId: child.id,
|
|
53
|
+
kind: 'agent_spawn',
|
|
54
|
+
spawnedBy: userActor('usr_intruder', OTHER_TENANT),
|
|
55
|
+
}, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
56
|
+
});
|
|
57
|
+
it('appendMessage with wrong tenantId → TenantIsolationError', async () => {
|
|
58
|
+
const { store, child } = await seedTenantAResources();
|
|
59
|
+
await expect(store.appendMessage(child.id, createUserMessage('intruder'), OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
60
|
+
});
|
|
61
|
+
it('loadSessionMessages cross-tenant → TenantIsolationError', async () => {
|
|
62
|
+
const { store, child } = await seedTenantAResources();
|
|
63
|
+
await store.appendMessage(child.id, createUserMessage('legit'), DEFAULT_TENANT);
|
|
64
|
+
await expect(store.loadSessionMessages(child.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
65
|
+
});
|
|
66
|
+
it('loadMessages cross-tenant → TenantIsolationError', async () => {
|
|
67
|
+
const { store, child } = await seedTenantAResources();
|
|
68
|
+
await store.appendMessage(child.id, createUserMessage('legit'), DEFAULT_TENANT);
|
|
69
|
+
await expect(store.loadMessages(child.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
70
|
+
});
|
|
71
|
+
it('drill(sessionId, OTHER_TENANT) on an existing session → TenantIsolationError (pattern doc §12.2 hard reject)', async () => {
|
|
72
|
+
const { store, parent } = await seedTenantAResources();
|
|
73
|
+
// Existing session owned by DEFAULT_TENANT, caller supplies OTHER_TENANT.
|
|
74
|
+
// Pattern doc §12 specifies hard reject — no silent null masking.
|
|
75
|
+
await expect(store.drill(parent.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
76
|
+
});
|
|
77
|
+
it('drill on a missing session returns null (deny-by-default surface without leaking tenant info)', async () => {
|
|
78
|
+
const { store } = await seedTenantAResources();
|
|
79
|
+
const view = await store.drill('ses_never_existed', OTHER_TENANT);
|
|
80
|
+
// Missing session for the queried tenant returns null (Convention #5).
|
|
81
|
+
// The tenant check is conditional on the resource existing; absent
|
|
82
|
+
// resources don't leak tenant info via a thrown isolation error.
|
|
83
|
+
expect(view).toBeNull();
|
|
84
|
+
});
|
|
85
|
+
it('getChildren cross-tenant → TenantIsolationError', async () => {
|
|
86
|
+
const { store, parent } = await seedTenantAResources();
|
|
87
|
+
await expect(store.getChildren(parent.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
88
|
+
});
|
|
89
|
+
it('getAncestry cross-tenant → TenantIsolationError', async () => {
|
|
90
|
+
const { store, parent } = await seedTenantAResources();
|
|
91
|
+
await expect(store.getAncestry(parent.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
92
|
+
});
|
|
93
|
+
it('recordSummary with mismatched payload tenantId → TenantIsolationError', async () => {
|
|
94
|
+
const { store, parent } = await seedTenantAResources();
|
|
95
|
+
// Attempt to record a summary whose payload tenantId differs from the
|
|
96
|
+
// caller tenantId — runtime guard rejects.
|
|
97
|
+
await expect(store.recordSummary({
|
|
98
|
+
id: 'sum_intruder',
|
|
99
|
+
sessionRef: parent.id,
|
|
100
|
+
tenantId: OTHER_TENANT,
|
|
101
|
+
outcome: { status: 'succeeded' },
|
|
102
|
+
deliverables: [],
|
|
103
|
+
agentSummary: '',
|
|
104
|
+
keyDecisions: [],
|
|
105
|
+
at: new Date(),
|
|
106
|
+
materializedBy: 'kernel',
|
|
107
|
+
}, DEFAULT_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
108
|
+
});
|
|
109
|
+
it('getSummary cross-tenant → TenantIsolationError when a summary exists', async () => {
|
|
110
|
+
const { store, parent } = await seedTenantAResources();
|
|
111
|
+
await store.updateSession({ ...parent, status: 'active' }, DEFAULT_TENANT);
|
|
112
|
+
await store.recordSummary({
|
|
113
|
+
id: 'sum_ok',
|
|
114
|
+
sessionRef: parent.id,
|
|
115
|
+
tenantId: DEFAULT_TENANT,
|
|
116
|
+
outcome: { status: 'succeeded' },
|
|
117
|
+
deliverables: [],
|
|
118
|
+
agentSummary: '',
|
|
119
|
+
keyDecisions: [],
|
|
120
|
+
at: new Date(),
|
|
121
|
+
materializedBy: 'kernel',
|
|
122
|
+
}, DEFAULT_TENANT);
|
|
123
|
+
await expect(store.getSummary(parent.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
124
|
+
});
|
|
125
|
+
it('createProject with params.tenantId ≠ caller tenantId → TenantIsolationError (deep check)', async () => {
|
|
126
|
+
const store = new InMemorySessionStore();
|
|
127
|
+
await expect(store.createProject({ tenantId: OTHER_TENANT, name: 'mismatch' }, DEFAULT_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
128
|
+
});
|
|
129
|
+
it('createSession with project owned by another tenant → TenantIsolationError', async () => {
|
|
130
|
+
const { store, project } = await seedTenantAResources();
|
|
131
|
+
await expect(store.createSession({ projectId: project.id, currentActor: userActor('usr_intruder', OTHER_TENANT) }, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
132
|
+
});
|
|
133
|
+
it('tenant denormalization: Session, SubSession records carry tenantId explicitly', async () => {
|
|
134
|
+
const { store, parent, sub } = await seedTenantAResources();
|
|
135
|
+
const parentReloaded = await store.getSession(parent.id, DEFAULT_TENANT);
|
|
136
|
+
expect(parentReloaded?.tenantId).toBe(DEFAULT_TENANT);
|
|
137
|
+
// SubSession record itself does not carry tenantId in its shape — the
|
|
138
|
+
// isolation is stored via the parent record tuple (subSessions map:
|
|
139
|
+
// { tenantId, subSession }). Getting it via the correct tenant succeeds;
|
|
140
|
+
// via the wrong tenant rejects — already covered above. This test just
|
|
141
|
+
// confirms the successful access path.
|
|
142
|
+
const reloaded = await store.getSubSession(sub.id, DEFAULT_TENANT);
|
|
143
|
+
expect(reloaded?.id).toBe(sub.id);
|
|
144
|
+
});
|
|
145
|
+
it('broadcast-style cross-tenant attempt: cannot createSubSession linking parents owned by another tenant', async () => {
|
|
146
|
+
// Pattern doc §12 requires recipient & source to share tenant. The
|
|
147
|
+
// store-level guard here catches the shape violation — createSubSession
|
|
148
|
+
// refuses to link parent/child across tenants.
|
|
149
|
+
const { store, parent } = await seedTenantAResources();
|
|
150
|
+
// Create a session in OTHER_TENANT with its own project.
|
|
151
|
+
const otherProject = await store.createProject({ tenantId: OTHER_TENANT, name: 'other' }, OTHER_TENANT);
|
|
152
|
+
const otherChild = await store.createSession({ projectId: otherProject.id, currentActor: userActor('usr_other', OTHER_TENANT) }, OTHER_TENANT);
|
|
153
|
+
await expect(store.createSubSession({
|
|
154
|
+
parentSessionId: parent.id, // DEFAULT_TENANT
|
|
155
|
+
childSessionId: otherChild.id, // OTHER_TENANT
|
|
156
|
+
kind: 'agent_spawn',
|
|
157
|
+
spawnedBy: userActor('usr_a'),
|
|
158
|
+
}, DEFAULT_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
159
|
+
});
|
|
160
|
+
it('deleteSubSession cross-tenant → TenantIsolationError', async () => {
|
|
161
|
+
const { store, sub } = await seedTenantAResources();
|
|
162
|
+
await expect(store.deleteSubSession(sub.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
163
|
+
});
|
|
164
|
+
it('deleteSession cross-tenant → TenantIsolationError', async () => {
|
|
165
|
+
const { store } = await seedTenantAResources();
|
|
166
|
+
// Parent has a sub-session attached → deleteSession would fail anyway,
|
|
167
|
+
// but the tenant guard fires first. Use a standalone session.
|
|
168
|
+
const project = (await store.createProject({ tenantId: DEFAULT_TENANT, name: 'del' }, DEFAULT_TENANT)).id;
|
|
169
|
+
const lonely = await store.createSession({ projectId: project, currentActor: userActor('usr_lonely') }, DEFAULT_TENANT);
|
|
170
|
+
await expect(store.deleteSession(lonely.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
171
|
+
});
|
|
172
|
+
it('missing sub-session returns null for correct tenant (not a leak channel)', async () => {
|
|
173
|
+
const { store } = await seedTenantAResources();
|
|
174
|
+
// Missing id via correct tenant → null, not thrown. Confirms the
|
|
175
|
+
// missing-resource fast-path doesn't pre-empt the tenant check.
|
|
176
|
+
const missing = await store.getSubSession('sub_never_existed', DEFAULT_TENANT);
|
|
177
|
+
expect(missing).toBeNull();
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=tenant-isolation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-isolation.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/tenant-isolation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed errors for the session hierarchy module.
|
|
3
|
+
*
|
|
4
|
+
* See session-hierarchy.md §12.2 (cross-tenant rejection), §6.2 (workspace
|
|
5
|
+
* backend operation failures), §4.5 (intervention DAG). Each error carries a
|
|
6
|
+
* structured `details` payload so consumers can route without string parsing
|
|
7
|
+
* (Convention #5: deny-by-default, fail fast).
|
|
8
|
+
*/
|
|
9
|
+
import type { SessionId, TenantId } from '../types/ids/index.js';
|
|
10
|
+
import type { WorkspaceBackendKind } from './workspace/driver.js';
|
|
11
|
+
/**
|
|
12
|
+
* Raised by {@link SessionStore} accessors when the supplied {@link TenantId}
|
|
13
|
+
* does not match the tenant owning the target resource. Convention #17:
|
|
14
|
+
* cross-tenant access is a hard error at the kernel boundary — there is no
|
|
15
|
+
* escape hatch. See session-hierarchy.md §12.2.
|
|
16
|
+
*/
|
|
17
|
+
export declare class TenantIsolationError extends Error {
|
|
18
|
+
readonly details: {
|
|
19
|
+
requested: TenantId;
|
|
20
|
+
resource: string;
|
|
21
|
+
};
|
|
22
|
+
constructor(details: {
|
|
23
|
+
requested: TenantId;
|
|
24
|
+
resource: string;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Raised by {@link SessionStore.getAncestry} / {@link SessionStore.drill}
|
|
29
|
+
* when walking parent sub-session links encounters a revisit. Indicates store
|
|
30
|
+
* corruption — the write path enforces acyclicity (session-hierarchy.md §4.5).
|
|
31
|
+
*/
|
|
32
|
+
export declare class AncestryCycleError extends Error {
|
|
33
|
+
readonly details: {
|
|
34
|
+
sessionId: SessionId;
|
|
35
|
+
cyclePath: readonly SessionId[];
|
|
36
|
+
};
|
|
37
|
+
constructor(details: {
|
|
38
|
+
sessionId: SessionId;
|
|
39
|
+
cyclePath: readonly SessionId[];
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Raised by {@link WorkspaceBackendDriver} implementations on any I/O or
|
|
44
|
+
* invariant failure. Wraps the underlying cause; callers can match on
|
|
45
|
+
* `details.op` + `details.kind` for routing (Convention #0: no silent
|
|
46
|
+
* fallbacks — surface the failure). See session-hierarchy.md §6.2 / §7.
|
|
47
|
+
*/
|
|
48
|
+
export declare class WorkspaceBackendError extends Error {
|
|
49
|
+
readonly details: {
|
|
50
|
+
op: string;
|
|
51
|
+
kind: WorkspaceBackendKind;
|
|
52
|
+
cause?: unknown;
|
|
53
|
+
};
|
|
54
|
+
constructor(details: {
|
|
55
|
+
op: string;
|
|
56
|
+
kind: WorkspaceBackendKind;
|
|
57
|
+
cause?: unknown;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEjE;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,OAAO,EAAE;QACjB,SAAS,EAAE,QAAQ,CAAA;QACnB,QAAQ,EAAE,MAAM,CAAA;KAChB,CAAA;gBAEW,OAAO,EAAE;QAAE,SAAS,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAK9D;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,OAAO,EAAE;QACjB,SAAS,EAAE,SAAS,CAAA;QACpB,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;KAC/B,CAAA;gBAEW,OAAO,EAAE;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;KAAE;CAO9E;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE;QACjB,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,oBAAoB,CAAA;QAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;KACf,CAAA;gBAEW,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,oBAAoB,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKhF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed errors for the session hierarchy module.
|
|
3
|
+
*
|
|
4
|
+
* See session-hierarchy.md §12.2 (cross-tenant rejection), §6.2 (workspace
|
|
5
|
+
* backend operation failures), §4.5 (intervention DAG). Each error carries a
|
|
6
|
+
* structured `details` payload so consumers can route without string parsing
|
|
7
|
+
* (Convention #5: deny-by-default, fail fast).
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Raised by {@link SessionStore} accessors when the supplied {@link TenantId}
|
|
11
|
+
* does not match the tenant owning the target resource. Convention #17:
|
|
12
|
+
* cross-tenant access is a hard error at the kernel boundary — there is no
|
|
13
|
+
* escape hatch. See session-hierarchy.md §12.2.
|
|
14
|
+
*/
|
|
15
|
+
export class TenantIsolationError extends Error {
|
|
16
|
+
details;
|
|
17
|
+
constructor(details) {
|
|
18
|
+
super(`Tenant isolation violation: ${details.requested} accessed ${details.resource}`);
|
|
19
|
+
this.name = 'TenantIsolationError';
|
|
20
|
+
this.details = details;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Raised by {@link SessionStore.getAncestry} / {@link SessionStore.drill}
|
|
25
|
+
* when walking parent sub-session links encounters a revisit. Indicates store
|
|
26
|
+
* corruption — the write path enforces acyclicity (session-hierarchy.md §4.5).
|
|
27
|
+
*/
|
|
28
|
+
export class AncestryCycleError extends Error {
|
|
29
|
+
details;
|
|
30
|
+
constructor(details) {
|
|
31
|
+
super(`Ancestry cycle detected starting at ${details.sessionId}: ${details.cyclePath.join(' -> ')}`);
|
|
32
|
+
this.name = 'AncestryCycleError';
|
|
33
|
+
this.details = details;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Raised by {@link WorkspaceBackendDriver} implementations on any I/O or
|
|
38
|
+
* invariant failure. Wraps the underlying cause; callers can match on
|
|
39
|
+
* `details.op` + `details.kind` for routing (Convention #0: no silent
|
|
40
|
+
* fallbacks — surface the failure). See session-hierarchy.md §6.2 / §7.
|
|
41
|
+
*/
|
|
42
|
+
export class WorkspaceBackendError extends Error {
|
|
43
|
+
details;
|
|
44
|
+
constructor(details) {
|
|
45
|
+
super(`Workspace backend ${details.kind} failed on ${details.op}`);
|
|
46
|
+
this.name = 'WorkspaceBackendError';
|
|
47
|
+
this.details = details;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACrC,OAAO,CAGf;IAED,YAAY,OAAkD;QAC7D,KAAK,CAAC,+BAA+B,OAAO,CAAC,SAAS,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QACtF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACnC,OAAO,CAGf;IAED,YAAY,OAAkE;QAC7E,KAAK,CACJ,uCAAuC,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAC7F,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACtC,OAAO,CAIf;IAED,YAAY,OAAoE;QAC/E,KAAK,CAAC,qBAAqB,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;QAClE,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { RUN_EVENT_SCHEMA_VERSION } from './schema-version.js';
|
|
2
|
+
export type { RunEventSchemaVersion } from './schema-version.js';
|
|
3
|
+
export type { SubsessionSpawnedEvent, SubsessionMessagedEvent, SubsessionIdledEvent, SubsessionLifecycleEvent, } from './types.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/session/events/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,YAAY,EACX,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,GACxB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Sub-barrel for session-hierarchy run-event surface.
|
|
2
|
+
// Convention #4: concrete types live in sibling files; re-export them here.
|
|
3
|
+
//
|
|
4
|
+
// Phase 2 scope is limited to the sub-session lifecycle variants that are
|
|
5
|
+
// spliced into `RunEvent`. A dedicated `SessionHierarchyEvent` top-level
|
|
6
|
+
// union lands in a later phase (see session-hierarchy.md §10.2).
|
|
7
|
+
export { RUN_EVENT_SCHEMA_VERSION } from './schema-version.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/session/events/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,4EAA4E;AAC5E,EAAE;AACF,0EAA0E;AAC1E,yEAAyE;AACzE,iEAAiE;AAEjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunEvent envelope schema version. Bumped on breaking envelope change.
|
|
3
|
+
*
|
|
4
|
+
* - v1: pre-0.2.0 (implicit; untagged events are treated as v1 by consumers).
|
|
5
|
+
* - v2: 0.2.0+ — adds `schemaVersion`, `lineage`, and sub-session lifecycle
|
|
6
|
+
* events.
|
|
7
|
+
*
|
|
8
|
+
* See session-hierarchy.md §10.1 (Event-schema evolution contract) and
|
|
9
|
+
* §13.3.2 (`schemaVersion` back-compat).
|
|
10
|
+
*/
|
|
11
|
+
export declare const RUN_EVENT_SCHEMA_VERSION: 2;
|
|
12
|
+
export type RunEventSchemaVersion = typeof RUN_EVENT_SCHEMA_VERSION;
|
|
13
|
+
//# sourceMappingURL=schema-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-version.d.ts","sourceRoot":"","sources":["../../../src/session/events/schema-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAA;AAElD,MAAM,MAAM,qBAAqB,GAAG,OAAO,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunEvent envelope schema version. Bumped on breaking envelope change.
|
|
3
|
+
*
|
|
4
|
+
* - v1: pre-0.2.0 (implicit; untagged events are treated as v1 by consumers).
|
|
5
|
+
* - v2: 0.2.0+ — adds `schemaVersion`, `lineage`, and sub-session lifecycle
|
|
6
|
+
* events.
|
|
7
|
+
*
|
|
8
|
+
* See session-hierarchy.md §10.1 (Event-schema evolution contract) and
|
|
9
|
+
* §13.3.2 (`schemaVersion` back-compat).
|
|
10
|
+
*/
|
|
11
|
+
export const RUN_EVENT_SCHEMA_VERSION = 2;
|
|
12
|
+
//# sourceMappingURL=schema-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-version.js","sourceRoot":"","sources":["../../../src/session/events/schema-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAU,CAAA"}
|