@namzu/sdk 0.1.7 → 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 +23 -5
- package/README.md +14 -9
- 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,14 @@
|
|
|
1
|
+
// Sub-barrel for the session-scoped persistence module (Convention #4).
|
|
2
|
+
//
|
|
3
|
+
// `SessionStore` replaces the legacy `ConversationStore`; messages are scoped
|
|
4
|
+
// to a `SessionId` (not a bare thread) and every accessor carries explicit
|
|
5
|
+
// `TenantId` per session-hierarchy.md §12.1. Concrete implementations live
|
|
6
|
+
// in sibling files; re-export them here so consumers import via
|
|
7
|
+
// `../store/session/index.js`.
|
|
8
|
+
|
|
9
|
+
export { InMemorySessionStore } from './memory.js'
|
|
10
|
+
export { DiskSessionStore } from './disk.js'
|
|
11
|
+
export type { DiskSessionStoreConfig } from './disk.js'
|
|
12
|
+
export type { SessionMessage } from './messages.js'
|
|
13
|
+
export { getAncestry, getChildren, orderChildren } from './linkage.js'
|
|
14
|
+
export type { LinkageView } from './linkage.js'
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linkage helpers for {@link SessionStore} — pure functions over raw store
|
|
3
|
+
* maps so they can be reused by both {@link InMemorySessionStore} and
|
|
4
|
+
* {@link DiskSessionStore}.
|
|
5
|
+
*
|
|
6
|
+
* See session-hierarchy.md §10.4 (Parent-Child Linkage) and §14.3 (drill
|
|
7
|
+
* primitive). Ancestry walks are cycle-guarded via visited-set; detection
|
|
8
|
+
* surfaces as {@link AncestryCycleError}.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { AncestryCycleError } from '../../session/errors.js'
|
|
12
|
+
import type { SubSession } from '../../session/hierarchy/sub-session.js'
|
|
13
|
+
import type { SessionId } from '../../types/ids/index.js'
|
|
14
|
+
import type { SubSessionId } from '../../types/session/ids.js'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Read shape required by the pure linkage helpers. Both in-memory and disk
|
|
18
|
+
* stores project their internal state into this view before delegating.
|
|
19
|
+
*/
|
|
20
|
+
export interface LinkageView {
|
|
21
|
+
findChildSubSessions(parentSessionId: SessionId): readonly SubSession[]
|
|
22
|
+
findParentSubSession(childSessionId: SessionId): SubSession | null
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Returns direct children of `sessionId` (one level). Pure over `view`.
|
|
27
|
+
*/
|
|
28
|
+
export function getChildren(view: LinkageView, sessionId: SessionId): readonly SubSession[] {
|
|
29
|
+
return view.findChildSubSessions(sessionId)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Walks parent sub-session links and returns the session id chain from root
|
|
34
|
+
* to `sessionId` inclusive. Guards against cycles via a visited-set — in
|
|
35
|
+
* a healthy store the invariant holds and the guard never fires; a cycle
|
|
36
|
+
* indicates corruption (session-hierarchy.md §4.5 enforces acyclicity on
|
|
37
|
+
* write).
|
|
38
|
+
*/
|
|
39
|
+
export function getAncestry(view: LinkageView, sessionId: SessionId): readonly SessionId[] {
|
|
40
|
+
const visited = new Set<SessionId>()
|
|
41
|
+
const chain: SessionId[] = []
|
|
42
|
+
let cursor: SessionId | null = sessionId
|
|
43
|
+
|
|
44
|
+
while (cursor !== null) {
|
|
45
|
+
if (visited.has(cursor)) {
|
|
46
|
+
throw new AncestryCycleError({
|
|
47
|
+
sessionId,
|
|
48
|
+
cyclePath: [...chain, cursor],
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
visited.add(cursor)
|
|
52
|
+
chain.push(cursor)
|
|
53
|
+
|
|
54
|
+
const parentEdge: SubSession | null = view.findParentSubSession(cursor)
|
|
55
|
+
cursor = parentEdge ? parentEdge.parentSessionId : null
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Reverse so the result is root-to-self, matching session-hierarchy.md §14.3.
|
|
59
|
+
return chain.reverse()
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Pairs {@link SubSession} children with a stable order (spawnedAt ascending,
|
|
64
|
+
* then id as a deterministic tiebreaker). Callers that need a different
|
|
65
|
+
* ordering can re-sort.
|
|
66
|
+
*/
|
|
67
|
+
export function orderChildren(children: readonly SubSession[]): readonly SubSession[] {
|
|
68
|
+
return [...children].sort((a, b) => {
|
|
69
|
+
const ta = a.spawnedAt.getTime()
|
|
70
|
+
const tb = b.spawnedAt.getTime()
|
|
71
|
+
if (ta !== tb) return ta - tb
|
|
72
|
+
return compareSubSessionId(a.id, b.id)
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function compareSubSessionId(a: SubSessionId, b: SubSessionId): number {
|
|
77
|
+
if (a < b) return -1
|
|
78
|
+
if (a > b) return 1
|
|
79
|
+
return 0
|
|
80
|
+
}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InMemorySessionStore — reference in-memory implementation of
|
|
3
|
+
* {@link SessionStore}.
|
|
4
|
+
*
|
|
5
|
+
* Every accessor takes explicit {@link TenantId} (Convention #17). Any
|
|
6
|
+
* accessor called with a tenantId that does not match the resource's owning
|
|
7
|
+
* tenant throws {@link TenantIsolationError} — there is no fallback
|
|
8
|
+
* (Convention #5 deny-by-default, session-hierarchy.md §12.2).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { TenantIsolationError } from '../../session/errors.js'
|
|
12
|
+
import type { Project } from '../../session/hierarchy/project.js'
|
|
13
|
+
import type { Session } from '../../session/hierarchy/session.js'
|
|
14
|
+
import type { SubSession } from '../../session/hierarchy/sub-session.js'
|
|
15
|
+
import { SessionAlreadySummarizedError } from '../../session/summary/ref.js'
|
|
16
|
+
import type { SessionSummaryRef } from '../../session/summary/ref.js'
|
|
17
|
+
import type { MessageId, SessionId, TenantId } from '../../types/ids/index.js'
|
|
18
|
+
import type { Message } from '../../types/message/index.js'
|
|
19
|
+
import type { ProjectId, SubSessionId } from '../../types/session/ids.js'
|
|
20
|
+
import type {
|
|
21
|
+
CreateProjectParams,
|
|
22
|
+
CreateSessionParams,
|
|
23
|
+
CreateSubSessionParams,
|
|
24
|
+
SessionStore,
|
|
25
|
+
SessionView,
|
|
26
|
+
} from '../../types/session/store.js'
|
|
27
|
+
import {
|
|
28
|
+
generateMessageId,
|
|
29
|
+
generateProjectId,
|
|
30
|
+
generateSessionId,
|
|
31
|
+
generateSubSessionId,
|
|
32
|
+
} from '../../utils/id.js'
|
|
33
|
+
import { getAncestry, getChildren, orderChildren } from './linkage.js'
|
|
34
|
+
import type { LinkageView } from './linkage.js'
|
|
35
|
+
import type { SessionMessage } from './messages.js'
|
|
36
|
+
|
|
37
|
+
interface ProjectRecord {
|
|
38
|
+
tenantId: TenantId
|
|
39
|
+
project: Project
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface SessionRecord {
|
|
43
|
+
tenantId: TenantId
|
|
44
|
+
session: Session
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface SubSessionRecord {
|
|
48
|
+
tenantId: TenantId
|
|
49
|
+
subSession: SubSession
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface SummaryRecord {
|
|
53
|
+
tenantId: TenantId
|
|
54
|
+
summary: SessionSummaryRef
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Non-terminal statuses from which {@link InMemorySessionStore.recordSummary}
|
|
59
|
+
* flips the owning session to `'idle'` as part of the atomic materialize +
|
|
60
|
+
* transition contract (session-hierarchy.md §8.1). Other statuses — already
|
|
61
|
+
* terminal or awaiting HITL — are left untouched.
|
|
62
|
+
*/
|
|
63
|
+
const SUMMARY_TERMINAL_FLIP_STATUSES: ReadonlySet<Session['status']> = new Set([
|
|
64
|
+
'active',
|
|
65
|
+
'locked',
|
|
66
|
+
'awaiting_merge',
|
|
67
|
+
])
|
|
68
|
+
|
|
69
|
+
export class InMemorySessionStore implements SessionStore {
|
|
70
|
+
private readonly projects = new Map<ProjectId, ProjectRecord>()
|
|
71
|
+
private readonly sessions = new Map<SessionId, SessionRecord>()
|
|
72
|
+
private readonly subSessions = new Map<SubSessionId, SubSessionRecord>()
|
|
73
|
+
private readonly messages = new Map<SessionId, SessionMessage[]>()
|
|
74
|
+
private readonly summaries = new Map<SessionId, SummaryRecord>()
|
|
75
|
+
|
|
76
|
+
// Project CRUD ------------------------------------------------------------
|
|
77
|
+
|
|
78
|
+
async createProject(params: CreateProjectParams, tenantId: TenantId): Promise<Project> {
|
|
79
|
+
if (params.tenantId !== tenantId) {
|
|
80
|
+
throw new TenantIsolationError({
|
|
81
|
+
requested: tenantId,
|
|
82
|
+
resource: `project(name=${params.name})`,
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
const now = new Date()
|
|
86
|
+
const project: Project = {
|
|
87
|
+
id: generateProjectId(),
|
|
88
|
+
tenantId,
|
|
89
|
+
name: params.name,
|
|
90
|
+
config: {
|
|
91
|
+
maxDelegationDepth: 4,
|
|
92
|
+
maxDelegationWidth: 8,
|
|
93
|
+
maxInterventionDepth: 10,
|
|
94
|
+
},
|
|
95
|
+
createdAt: now,
|
|
96
|
+
updatedAt: now,
|
|
97
|
+
}
|
|
98
|
+
this.projects.set(project.id, { tenantId, project })
|
|
99
|
+
return project
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async getProject(projectId: ProjectId, tenantId: TenantId): Promise<Project | null> {
|
|
103
|
+
const record = this.projects.get(projectId)
|
|
104
|
+
if (!record) return null
|
|
105
|
+
this.assertTenant(record.tenantId, tenantId, `project(${projectId})`)
|
|
106
|
+
return record.project
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Session CRUD ------------------------------------------------------------
|
|
110
|
+
|
|
111
|
+
async createSession(params: CreateSessionParams, tenantId: TenantId): Promise<Session> {
|
|
112
|
+
const projectRecord = this.projects.get(params.projectId)
|
|
113
|
+
if (!projectRecord) {
|
|
114
|
+
throw new Error(`Project ${params.projectId} not found`)
|
|
115
|
+
}
|
|
116
|
+
this.assertTenant(projectRecord.tenantId, tenantId, `project(${params.projectId})`)
|
|
117
|
+
|
|
118
|
+
const now = new Date()
|
|
119
|
+
const session: Session = {
|
|
120
|
+
id: generateSessionId(),
|
|
121
|
+
projectId: params.projectId,
|
|
122
|
+
tenantId,
|
|
123
|
+
status: 'idle',
|
|
124
|
+
currentActor: params.currentActor,
|
|
125
|
+
previousActors: [],
|
|
126
|
+
workspaceId: null,
|
|
127
|
+
ownerVersion: 0,
|
|
128
|
+
createdAt: now,
|
|
129
|
+
updatedAt: now,
|
|
130
|
+
}
|
|
131
|
+
this.sessions.set(session.id, { tenantId, session })
|
|
132
|
+
return session
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async getSession(sessionId: SessionId, tenantId: TenantId): Promise<Session | null> {
|
|
136
|
+
const record = this.sessions.get(sessionId)
|
|
137
|
+
if (!record) return null
|
|
138
|
+
this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
|
|
139
|
+
return record.session
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async updateSession(session: Session, tenantId: TenantId): Promise<void> {
|
|
143
|
+
const record = this.sessions.get(session.id)
|
|
144
|
+
if (!record) {
|
|
145
|
+
throw new Error(`Session ${session.id} not found`)
|
|
146
|
+
}
|
|
147
|
+
this.assertTenant(record.tenantId, tenantId, `session(${session.id})`)
|
|
148
|
+
if (session.tenantId !== tenantId) {
|
|
149
|
+
throw new TenantIsolationError({
|
|
150
|
+
requested: tenantId,
|
|
151
|
+
resource: `session(${session.id}) payload`,
|
|
152
|
+
})
|
|
153
|
+
}
|
|
154
|
+
this.sessions.set(session.id, { tenantId, session: { ...session, updatedAt: new Date() } })
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async deleteSession(sessionId: SessionId, tenantId: TenantId): Promise<void> {
|
|
158
|
+
const record = this.sessions.get(sessionId)
|
|
159
|
+
if (!record) return // Idempotent: missing = no-op.
|
|
160
|
+
this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
|
|
161
|
+
|
|
162
|
+
// Policy: reject if sub-sessions still attach to this session (either as
|
|
163
|
+
// parent or child). Callers must delete children first — Convention #5
|
|
164
|
+
// deny-by-default; no implicit cascade.
|
|
165
|
+
for (const subRecord of this.subSessions.values()) {
|
|
166
|
+
const { subSession } = subRecord
|
|
167
|
+
if (subSession.parentSessionId === sessionId || subSession.childSessionId === sessionId) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
`Session ${sessionId} has attached sub-sessions; delete them before deleting the session`,
|
|
170
|
+
)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
this.sessions.delete(sessionId)
|
|
175
|
+
this.messages.delete(sessionId)
|
|
176
|
+
this.summaries.delete(sessionId)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// SubSession CRUD ---------------------------------------------------------
|
|
180
|
+
|
|
181
|
+
async createSubSession(params: CreateSubSessionParams, tenantId: TenantId): Promise<SubSession> {
|
|
182
|
+
const parentRecord = this.sessions.get(params.parentSessionId)
|
|
183
|
+
if (!parentRecord) {
|
|
184
|
+
throw new Error(`Parent session ${params.parentSessionId} not found`)
|
|
185
|
+
}
|
|
186
|
+
this.assertTenant(parentRecord.tenantId, tenantId, `session(${params.parentSessionId})`)
|
|
187
|
+
|
|
188
|
+
const childRecord = this.sessions.get(params.childSessionId)
|
|
189
|
+
if (!childRecord) {
|
|
190
|
+
throw new Error(`Child session ${params.childSessionId} not found`)
|
|
191
|
+
}
|
|
192
|
+
this.assertTenant(childRecord.tenantId, tenantId, `session(${params.childSessionId})`)
|
|
193
|
+
|
|
194
|
+
const now = new Date()
|
|
195
|
+
const subSession: SubSession = {
|
|
196
|
+
id: generateSubSessionId(),
|
|
197
|
+
parentSessionId: params.parentSessionId,
|
|
198
|
+
childSessionId: params.childSessionId,
|
|
199
|
+
kind: params.kind,
|
|
200
|
+
status: 'pending',
|
|
201
|
+
spawnedBy: params.spawnedBy,
|
|
202
|
+
spawnedAt: now,
|
|
203
|
+
failureMode: params.failureMode ?? 'delegate',
|
|
204
|
+
completionMode: params.completionMode ?? 'summary_ref',
|
|
205
|
+
workspaceId: null,
|
|
206
|
+
updatedAt: now,
|
|
207
|
+
}
|
|
208
|
+
this.subSessions.set(subSession.id, { tenantId, subSession })
|
|
209
|
+
return subSession
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async getSubSession(subSessionId: SubSessionId, tenantId: TenantId): Promise<SubSession | null> {
|
|
213
|
+
const record = this.subSessions.get(subSessionId)
|
|
214
|
+
if (!record) return null
|
|
215
|
+
this.assertTenant(record.tenantId, tenantId, `sub-session(${subSessionId})`)
|
|
216
|
+
return record.subSession
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
async updateSubSession(subSession: SubSession, tenantId: TenantId): Promise<void> {
|
|
220
|
+
const record = this.subSessions.get(subSession.id)
|
|
221
|
+
if (!record) {
|
|
222
|
+
throw new Error(`SubSession ${subSession.id} not found`)
|
|
223
|
+
}
|
|
224
|
+
this.assertTenant(record.tenantId, tenantId, `sub-session(${subSession.id})`)
|
|
225
|
+
this.subSessions.set(subSession.id, {
|
|
226
|
+
tenantId,
|
|
227
|
+
subSession: { ...subSession, updatedAt: new Date() },
|
|
228
|
+
})
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
async deleteSubSession(subSessionId: SubSessionId, tenantId: TenantId): Promise<void> {
|
|
232
|
+
const record = this.subSessions.get(subSessionId)
|
|
233
|
+
if (!record) return // Idempotent: missing = no-op.
|
|
234
|
+
this.assertTenant(record.tenantId, tenantId, `sub-session(${subSessionId})`)
|
|
235
|
+
this.subSessions.delete(subSessionId)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Messages ----------------------------------------------------------------
|
|
239
|
+
|
|
240
|
+
async appendMessage(
|
|
241
|
+
sessionId: SessionId,
|
|
242
|
+
message: Message,
|
|
243
|
+
tenantId: TenantId,
|
|
244
|
+
): Promise<MessageId> {
|
|
245
|
+
const record = this.sessions.get(sessionId)
|
|
246
|
+
if (!record) {
|
|
247
|
+
throw new Error(`Session ${sessionId} not found`)
|
|
248
|
+
}
|
|
249
|
+
this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
|
|
250
|
+
|
|
251
|
+
const id = generateMessageId()
|
|
252
|
+
const entry: SessionMessage = {
|
|
253
|
+
id,
|
|
254
|
+
sessionId,
|
|
255
|
+
tenantId,
|
|
256
|
+
message,
|
|
257
|
+
at: new Date(),
|
|
258
|
+
}
|
|
259
|
+
const existing = this.messages.get(sessionId)
|
|
260
|
+
if (existing) {
|
|
261
|
+
existing.push(entry)
|
|
262
|
+
} else {
|
|
263
|
+
this.messages.set(sessionId, [entry])
|
|
264
|
+
}
|
|
265
|
+
return id
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async loadMessages(sessionId: SessionId, tenantId: TenantId): Promise<readonly Message[]> {
|
|
269
|
+
const record = this.sessions.get(sessionId)
|
|
270
|
+
if (!record) return []
|
|
271
|
+
this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
|
|
272
|
+
const entries = this.messages.get(sessionId) ?? []
|
|
273
|
+
return entries.map((e) => e.message)
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
async loadSessionMessages(
|
|
277
|
+
sessionId: SessionId,
|
|
278
|
+
tenantId: TenantId,
|
|
279
|
+
): Promise<readonly SessionMessage[]> {
|
|
280
|
+
const record = this.sessions.get(sessionId)
|
|
281
|
+
if (!record) return []
|
|
282
|
+
this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
|
|
283
|
+
const entries = this.messages.get(sessionId) ?? []
|
|
284
|
+
// Return a shallow copy so callers cannot mutate the internal log.
|
|
285
|
+
return entries.map((e) => ({ ...e }))
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Linkage -----------------------------------------------------------------
|
|
289
|
+
|
|
290
|
+
async getChildren(sessionId: SessionId, tenantId: TenantId): Promise<readonly SubSession[]> {
|
|
291
|
+
const record = this.sessions.get(sessionId)
|
|
292
|
+
if (!record) return []
|
|
293
|
+
this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
|
|
294
|
+
return orderChildren(getChildren(this.linkageView(tenantId), sessionId))
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
async getAncestry(sessionId: SessionId, tenantId: TenantId): Promise<readonly SessionId[]> {
|
|
298
|
+
const record = this.sessions.get(sessionId)
|
|
299
|
+
if (!record) return []
|
|
300
|
+
this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
|
|
301
|
+
return getAncestry(this.linkageView(tenantId), sessionId)
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
async drill(sessionId: SessionId, tenantId: TenantId): Promise<SessionView | null> {
|
|
305
|
+
const record = this.sessions.get(sessionId)
|
|
306
|
+
if (!record) return null
|
|
307
|
+
this.assertTenant(record.tenantId, tenantId, `session(${sessionId})`)
|
|
308
|
+
|
|
309
|
+
const view = this.linkageView(tenantId)
|
|
310
|
+
return {
|
|
311
|
+
session: record.session,
|
|
312
|
+
children: orderChildren(getChildren(view, sessionId)),
|
|
313
|
+
ancestry: getAncestry(view, sessionId),
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Summary (§4.7 / §8.1) ---------------------------------------------------
|
|
318
|
+
|
|
319
|
+
async recordSummary(
|
|
320
|
+
summary: SessionSummaryRef & { materializedBy: 'kernel' },
|
|
321
|
+
tenantId: TenantId,
|
|
322
|
+
): Promise<void> {
|
|
323
|
+
if (summary.tenantId !== tenantId) {
|
|
324
|
+
throw new TenantIsolationError({
|
|
325
|
+
requested: tenantId,
|
|
326
|
+
resource: `summary(${summary.id}) payload`,
|
|
327
|
+
})
|
|
328
|
+
}
|
|
329
|
+
const sessionRecord = this.sessions.get(summary.sessionRef)
|
|
330
|
+
if (!sessionRecord) {
|
|
331
|
+
throw new Error(`Session ${summary.sessionRef} not found`)
|
|
332
|
+
}
|
|
333
|
+
this.assertTenant(sessionRecord.tenantId, tenantId, `session(${summary.sessionRef})`)
|
|
334
|
+
|
|
335
|
+
// Atomic within the call: summary persist + session status flip commit
|
|
336
|
+
// together. An existing summary with the same id is the recovery path —
|
|
337
|
+
// idempotently replay the status flip without duplicating the record.
|
|
338
|
+
const existing = this.summaries.get(summary.sessionRef)
|
|
339
|
+
if (existing && existing.summary.id !== summary.id) {
|
|
340
|
+
throw new SessionAlreadySummarizedError({
|
|
341
|
+
sessionId: summary.sessionRef,
|
|
342
|
+
existingSummaryId: existing.summary.id,
|
|
343
|
+
})
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (!existing) {
|
|
347
|
+
this.summaries.set(summary.sessionRef, { tenantId, summary })
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if (SUMMARY_TERMINAL_FLIP_STATUSES.has(sessionRecord.session.status)) {
|
|
351
|
+
this.sessions.set(summary.sessionRef, {
|
|
352
|
+
tenantId,
|
|
353
|
+
session: {
|
|
354
|
+
...sessionRecord.session,
|
|
355
|
+
status: 'idle',
|
|
356
|
+
updatedAt: new Date(),
|
|
357
|
+
},
|
|
358
|
+
})
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
async getSummary(sessionId: SessionId, tenantId: TenantId): Promise<SessionSummaryRef | null> {
|
|
363
|
+
const record = this.summaries.get(sessionId)
|
|
364
|
+
if (!record) return null
|
|
365
|
+
this.assertTenant(record.tenantId, tenantId, `summary(${record.summary.id})`)
|
|
366
|
+
return record.summary
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Helpers -----------------------------------------------------------------
|
|
370
|
+
|
|
371
|
+
private assertTenant(actual: TenantId, requested: TenantId, resource: string): void {
|
|
372
|
+
if (actual !== requested) {
|
|
373
|
+
throw new TenantIsolationError({ requested, resource })
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
private linkageView(tenantId: TenantId): LinkageView {
|
|
378
|
+
return {
|
|
379
|
+
findChildSubSessions: (parentSessionId) => {
|
|
380
|
+
const matches: SubSession[] = []
|
|
381
|
+
for (const record of this.subSessions.values()) {
|
|
382
|
+
if (record.tenantId !== tenantId) continue
|
|
383
|
+
if (record.subSession.parentSessionId === parentSessionId) {
|
|
384
|
+
matches.push(record.subSession)
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return matches
|
|
388
|
+
},
|
|
389
|
+
findParentSubSession: (childSessionId) => {
|
|
390
|
+
for (const record of this.subSessions.values()) {
|
|
391
|
+
if (record.tenantId !== tenantId) continue
|
|
392
|
+
if (record.subSession.childSessionId === childSessionId) {
|
|
393
|
+
return record.subSession
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return null
|
|
397
|
+
},
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionMessage — the persistence record for a {@link Message} in the
|
|
3
|
+
* session hierarchy.
|
|
4
|
+
*
|
|
5
|
+
* Rename of the legacy `ConversationMessage` concept, scoped by
|
|
6
|
+
* {@link SessionId} and carrying {@link TenantId} for the Convention #17
|
|
7
|
+
* key tuple (session-hierarchy.md §12.1). The `message` field preserves the
|
|
8
|
+
* full Run-scoped `Message` payload verbatim; the wrapper only adds
|
|
9
|
+
* addressability + tenant isolation.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { MessageId, SessionId, TenantId } from '../../types/ids/index.js'
|
|
13
|
+
import type { Message } from '../../types/message/index.js'
|
|
14
|
+
|
|
15
|
+
export interface SessionMessage {
|
|
16
|
+
readonly id: MessageId
|
|
17
|
+
readonly sessionId: SessionId
|
|
18
|
+
readonly tenantId: TenantId
|
|
19
|
+
readonly message: Message
|
|
20
|
+
readonly at: Date
|
|
21
|
+
}
|
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, ThreadId } from '../ids/index.js'
|
|
2
|
+
import type { RunId, SessionId, TenantId, ThreadId } 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 } 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,37 @@ export interface BaseAgentConfig {
|
|
|
22
23
|
permissionMode?: PermissionMode
|
|
23
24
|
env?: Record<string, string>
|
|
24
25
|
|
|
26
|
+
/**
|
|
27
|
+
* @deprecated Use `projectId`. Kept as a migration-window mirror; when both
|
|
28
|
+
* are present `projectId` wins. See session-hierarchy.md §13.1.
|
|
29
|
+
*/
|
|
25
30
|
threadId?: ThreadId
|
|
26
31
|
|
|
32
|
+
/**
|
|
33
|
+
* Long-lived goal scope for the run. Required at runtime in 0.2.0 per
|
|
34
|
+
* session-hierarchy.md §12.1 — `{@link ReactiveAgent}`, `{@link
|
|
35
|
+
* SupervisorAgent}`, etc. reject configs missing this (`'X requires
|
|
36
|
+
* sessionId, projectId, and tenantId in config (§12.1)'`).
|
|
37
|
+
*
|
|
38
|
+
* Kept optional at the TYPE level during the 0.2.x migration window
|
|
39
|
+
* because {@link AgentManager} stamps this field AFTER `configBuilder`
|
|
40
|
+
* returns (manager/agent/lifecycle.ts:228–230). That stamping path is
|
|
41
|
+
* how every `@namzu/agents` configBuilder currently gets its tenant /
|
|
42
|
+
* session / project triple; flipping the type to required without first
|
|
43
|
+
* updating every {@link AgentFactoryOptions} consumer (which does not
|
|
44
|
+
* carry these fields) would be a gratuitous downstream break.
|
|
45
|
+
*
|
|
46
|
+
* Tightening to required is Phase 9 Known Delta #6. The type-level flip
|
|
47
|
+
* lands in 0.3.0 alongside `AgentFactoryOptions` gaining the triple.
|
|
48
|
+
*/
|
|
49
|
+
projectId?: ProjectId
|
|
50
|
+
|
|
51
|
+
/** Session under which the run executes. See `projectId` for the tightening plan. */
|
|
52
|
+
sessionId?: SessionId
|
|
53
|
+
|
|
54
|
+
/** Isolation boundary (Convention #17). See `projectId` for the tightening plan. */
|
|
55
|
+
tenantId?: TenantId
|
|
56
|
+
|
|
27
57
|
parentRunId?: RunId
|
|
28
58
|
|
|
29
59
|
depth?: number
|
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 } 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,17 @@ 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}. Phase 6 promotes
|
|
27
|
+
* `tenantId`, `sessionId`, `projectId`, and `parentActor` to required fields —
|
|
28
|
+
* the spawn path is the ingress point for the session hierarchy; callers must
|
|
29
|
+
* provide the full scoping set (session-hierarchy.md §12.1 required-callsite
|
|
30
|
+
* matrix).
|
|
31
|
+
*
|
|
32
|
+
* `threadId` was removed — `projectId` owns the root scope. The deprecated
|
|
33
|
+
* alias `type ThreadId = ProjectId` still compiles for consumers transitioning
|
|
34
|
+
* off the name, but the shape no longer exposes a separate slot.
|
|
35
|
+
*/
|
|
22
36
|
export interface AgentTaskContext {
|
|
23
37
|
parentRunId: RunId
|
|
24
38
|
|
|
@@ -32,7 +46,24 @@ export interface AgentTaskContext {
|
|
|
32
46
|
|
|
33
47
|
factoryOptions?: AgentFactoryOptions
|
|
34
48
|
|
|
35
|
-
|
|
49
|
+
/** Isolation boundary. Required per session-hierarchy.md §12.1. */
|
|
50
|
+
tenantId: TenantId
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Parent session under which any sub-agent spawn is recorded. Required
|
|
54
|
+
* in 0.2.0; a spawn cannot be attributed without it.
|
|
55
|
+
*/
|
|
56
|
+
sessionId: SessionId
|
|
57
|
+
|
|
58
|
+
/** Long-lived goal scope (replaces `threadId`). Required. */
|
|
59
|
+
projectId: ProjectId
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The actor invoking this task. Children built off this context stamp
|
|
63
|
+
* their own `parentActor: ActorRef` linking back via the actor chain
|
|
64
|
+
* (session-hierarchy.md §4.3 / §10.4).
|
|
65
|
+
*/
|
|
66
|
+
parentActor: ActorRef
|
|
36
67
|
}
|
|
37
68
|
|
|
38
69
|
export interface AgentTaskBudget {
|
|
@@ -66,6 +97,12 @@ export interface AgentTaskProgress {
|
|
|
66
97
|
recentActivities: string[]
|
|
67
98
|
}
|
|
68
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Options accepted by {@link AgentManager.sendMessage}. Phase 6 adds the
|
|
102
|
+
* required sub-session spawn scope (`parentSessionId`, `tenantId`, `projectId`,
|
|
103
|
+
* `parentActor`) so the manager can create a SubSession + child Session +
|
|
104
|
+
* WorkspaceRef triple atomically on every spawn.
|
|
105
|
+
*/
|
|
69
106
|
export interface SendMessageOptions {
|
|
70
107
|
agentId: string
|
|
71
108
|
|
|
@@ -77,6 +114,25 @@ export interface SendMessageOptions {
|
|
|
77
114
|
tokenBudget?: number
|
|
78
115
|
timeoutMs?: number
|
|
79
116
|
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Parent session under which the new sub-session is created. Capacity
|
|
120
|
+
* validation (depth + width) is applied against this session.
|
|
121
|
+
*/
|
|
122
|
+
parentSessionId: SessionId
|
|
123
|
+
|
|
124
|
+
tenantId: TenantId
|
|
125
|
+
|
|
126
|
+
projectId: ProjectId
|
|
127
|
+
|
|
128
|
+
/** The actor requesting the spawn — seeds the child's `parentActor`. */
|
|
129
|
+
parentActor: ActorRef
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Workspace backend to provision for the child session. Defaults to
|
|
133
|
+
* `git-worktree` — the MVP reference backend from Phase 3.
|
|
134
|
+
*/
|
|
135
|
+
workspaceBackend?: WorkspaceBackendKind
|
|
80
136
|
}
|
|
81
137
|
|
|
82
138
|
export interface AgentManagerConfig {
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import type { RunId, ThreadId } from '../ids/index.js'
|
|
2
2
|
import type { Message } from '../message/index.js'
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated Use `SessionStore` from `@namzu/sdk` (import via
|
|
6
|
+
* `types/session/store.ts` or the root barrel). `ConversationStore` is
|
|
7
|
+
* thread-scoped and does not carry the `tenantId` required by
|
|
8
|
+
* session-hierarchy.md §12.1. Scheduled for removal in 0.3.0; the one-
|
|
9
|
+
* version migration window follows session-hierarchy.md §13.1.
|
|
10
|
+
*/
|
|
4
11
|
export interface ConversationStore {
|
|
5
12
|
loadMessages(threadId: ThreadId): Message[]
|
|
6
13
|
|