@namzu/sdk 0.1.8 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +69 -2
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +5 -2
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/RouterAgent.d.ts.map +1 -1
- package/dist/agents/RouterAgent.js +3 -0
- package/dist/agents/RouterAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +21 -5
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/bridge/a2a/index.d.ts +1 -1
- package/dist/bridge/a2a/index.d.ts.map +1 -1
- package/dist/bridge/a2a/index.js +1 -1
- package/dist/bridge/a2a/index.js.map +1 -1
- package/dist/bridge/a2a/mapper.d.ts.map +1 -1
- package/dist/bridge/a2a/mapper.js +6 -0
- package/dist/bridge/a2a/mapper.js.map +1 -1
- package/dist/bridge/a2a/message.d.ts +0 -2
- package/dist/bridge/a2a/message.d.ts.map +1 -1
- package/dist/bridge/a2a/message.js +0 -26
- package/dist/bridge/a2a/message.js.map +1 -1
- package/dist/bridge/a2a/task.d.ts +5 -4
- package/dist/bridge/a2a/task.d.ts.map +1 -1
- package/dist/bridge/a2a/task.js +4 -4
- package/dist/bridge/a2a/task.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +6 -0
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/constants/a2a/index.d.ts +2 -2
- package/dist/constants/a2a/index.d.ts.map +1 -1
- package/dist/constants/a2a/index.js.map +1 -1
- package/dist/contracts/api.d.ts +14 -27
- package/dist/contracts/api.d.ts.map +1 -1
- package/dist/contracts/ids.d.ts +1 -1
- package/dist/contracts/ids.d.ts.map +1 -1
- package/dist/contracts/index.d.ts +3 -3
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/schemas.d.ts +1 -31
- package/dist/contracts/schemas.d.ts.map +1 -1
- package/dist/contracts/schemas.js +1 -7
- package/dist/contracts/schemas.js.map +1 -1
- package/dist/gateway/local.d.ts.map +1 -1
- package/dist/gateway/local.js +6 -0
- package/dist/gateway/local.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/manager/agent/__tests__/lifecycle.test.d.ts +2 -0
- package/dist/manager/agent/__tests__/lifecycle.test.d.ts.map +1 -0
- package/dist/manager/agent/__tests__/lifecycle.test.js +316 -0
- package/dist/manager/agent/__tests__/lifecycle.test.js.map +1 -0
- package/dist/manager/agent/lifecycle.d.ts +67 -3
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +375 -14
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/index.d.ts +2 -0
- package/dist/manager/index.d.ts.map +1 -1
- package/dist/manager/index.js +1 -0
- package/dist/manager/index.js.map +1 -1
- package/dist/manager/run/persistence.d.ts +10 -1
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +20 -0
- package/dist/manager/run/persistence.js.map +1 -1
- package/dist/manager/thread/__tests__/lifecycle.test.d.ts +2 -0
- package/dist/manager/thread/__tests__/lifecycle.test.d.ts.map +1 -0
- package/dist/manager/thread/__tests__/lifecycle.test.js +216 -0
- package/dist/manager/thread/__tests__/lifecycle.test.js.map +1 -0
- package/dist/manager/thread/lifecycle.d.ts +105 -0
- package/dist/manager/thread/lifecycle.d.ts.map +1 -0
- package/dist/manager/thread/lifecycle.js +186 -0
- package/dist/manager/thread/lifecycle.js.map +1 -0
- package/dist/rag/retriever.js +2 -2
- package/dist/run/reporter.d.ts.map +1 -1
- package/dist/run/reporter.js +25 -0
- package/dist/run/reporter.js.map +1 -1
- package/dist/runtime/query/__tests__/context.test.d.ts +2 -0
- package/dist/runtime/query/__tests__/context.test.d.ts.map +1 -0
- package/dist/runtime/query/__tests__/context.test.js +85 -0
- package/dist/runtime/query/__tests__/context.test.js.map +1 -0
- package/dist/runtime/query/context-cache.d.ts +3 -3
- package/dist/runtime/query/context-cache.d.ts.map +1 -1
- package/dist/runtime/query/context-cache.js +2 -2
- package/dist/runtime/query/context-cache.js.map +1 -1
- package/dist/runtime/query/context.d.ts +45 -1
- package/dist/runtime/query/context.d.ts.map +1 -1
- package/dist/runtime/query/context.js +50 -8
- package/dist/runtime/query/context.js.map +1 -1
- package/dist/runtime/query/events.d.ts.map +1 -1
- package/dist/runtime/query/events.js +8 -0
- package/dist/runtime/query/events.js.map +1 -1
- package/dist/runtime/query/index.d.ts +22 -1
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +11 -0
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/session/__tests__/integration/_fixtures.d.ts +122 -0
- package/dist/session/__tests__/integration/_fixtures.d.ts.map +1 -0
- package/dist/session/__tests__/integration/_fixtures.js +215 -0
- package/dist/session/__tests__/integration/_fixtures.js.map +1 -0
- package/dist/session/__tests__/integration/archive-gate.test.d.ts +15 -0
- package/dist/session/__tests__/integration/archive-gate.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/archive-gate.test.js +214 -0
- package/dist/session/__tests__/integration/archive-gate.test.js.map +1 -0
- package/dist/session/__tests__/integration/capacity-caps.test.d.ts +13 -0
- package/dist/session/__tests__/integration/capacity-caps.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/capacity-caps.test.js +123 -0
- package/dist/session/__tests__/integration/capacity-caps.test.js.map +1 -0
- package/dist/session/__tests__/integration/e2e-spawn.test.d.ts +18 -0
- package/dist/session/__tests__/integration/e2e-spawn.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/e2e-spawn.test.js +238 -0
- package/dist/session/__tests__/integration/e2e-spawn.test.js.map +1 -0
- package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts +15 -0
- package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/event-stream-ordering.test.js +330 -0
- package/dist/session/__tests__/integration/event-stream-ordering.test.js.map +1 -0
- package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts +12 -0
- package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js +182 -0
- package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js.map +1 -0
- package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts +18 -0
- package/dist/session/__tests__/integration/handoff-illegal-transition.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/handoff-illegal-transition.test.js +156 -0
- package/dist/session/__tests__/integration/handoff-illegal-transition.test.js.map +1 -0
- package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts +15 -0
- package/dist/session/__tests__/integration/handoff-single-e2e.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/handoff-single-e2e.test.js +179 -0
- package/dist/session/__tests__/integration/handoff-single-e2e.test.js.map +1 -0
- package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts +12 -0
- package/dist/session/__tests__/integration/hierarchy-lifecycle.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js +158 -0
- package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js.map +1 -0
- package/dist/session/__tests__/integration/migration-filesystem.test.d.ts +11 -0
- package/dist/session/__tests__/integration/migration-filesystem.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/migration-filesystem.test.js +140 -0
- package/dist/session/__tests__/integration/migration-filesystem.test.js.map +1 -0
- package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts +13 -0
- package/dist/session/__tests__/integration/migration-id-prefix.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/migration-id-prefix.test.js +84 -0
- package/dist/session/__tests__/integration/migration-id-prefix.test.js.map +1 -0
- package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts +14 -0
- package/dist/session/__tests__/integration/prev-artifact-dag.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/prev-artifact-dag.test.js +242 -0
- package/dist/session/__tests__/integration/prev-artifact-dag.test.js.map +1 -0
- package/dist/session/__tests__/integration/retention-archive.test.d.ts +12 -0
- package/dist/session/__tests__/integration/retention-archive.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/retention-archive.test.js +187 -0
- package/dist/session/__tests__/integration/retention-archive.test.js.map +1 -0
- package/dist/session/__tests__/integration/spawn-rollback.test.d.ts +26 -0
- package/dist/session/__tests__/integration/spawn-rollback.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/spawn-rollback.test.js +236 -0
- package/dist/session/__tests__/integration/spawn-rollback.test.js.map +1 -0
- package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts +18 -0
- package/dist/session/__tests__/integration/summary-materialization-e2e.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/summary-materialization-e2e.test.js +201 -0
- package/dist/session/__tests__/integration/summary-materialization-e2e.test.js.map +1 -0
- package/dist/session/__tests__/integration/tenant-isolation.test.d.ts +14 -0
- package/dist/session/__tests__/integration/tenant-isolation.test.d.ts.map +1 -0
- package/dist/session/__tests__/integration/tenant-isolation.test.js +189 -0
- package/dist/session/__tests__/integration/tenant-isolation.test.js.map +1 -0
- package/dist/session/errors.d.ts +139 -0
- package/dist/session/errors.d.ts.map +1 -0
- package/dist/session/errors.js +107 -0
- package/dist/session/errors.js.map +1 -0
- package/dist/session/events/index.d.ts +4 -0
- package/dist/session/events/index.d.ts.map +1 -0
- package/dist/session/events/index.js +8 -0
- package/dist/session/events/index.js.map +1 -0
- package/dist/session/events/schema-version.d.ts +13 -0
- package/dist/session/events/schema-version.d.ts.map +1 -0
- package/dist/session/events/schema-version.js +12 -0
- package/dist/session/events/schema-version.js.map +1 -0
- package/dist/session/events/types.d.ts +64 -0
- package/dist/session/events/types.d.ts.map +1 -0
- package/dist/session/events/types.js +2 -0
- package/dist/session/events/types.js.map +1 -0
- package/dist/session/handoff/__tests__/broadcast.test.d.ts +2 -0
- package/dist/session/handoff/__tests__/broadcast.test.d.ts.map +1 -0
- package/dist/session/handoff/__tests__/broadcast.test.js +261 -0
- package/dist/session/handoff/__tests__/broadcast.test.js.map +1 -0
- package/dist/session/handoff/__tests__/capacity.test.d.ts +2 -0
- package/dist/session/handoff/__tests__/capacity.test.d.ts.map +1 -0
- package/dist/session/handoff/__tests__/capacity.test.js +103 -0
- package/dist/session/handoff/__tests__/capacity.test.js.map +1 -0
- package/dist/session/handoff/__tests__/single.test.d.ts +2 -0
- package/dist/session/handoff/__tests__/single.test.d.ts.map +1 -0
- package/dist/session/handoff/__tests__/single.test.js +239 -0
- package/dist/session/handoff/__tests__/single.test.js.map +1 -0
- package/dist/session/handoff/assignment.d.ts +71 -0
- package/dist/session/handoff/assignment.d.ts.map +1 -0
- package/dist/session/handoff/assignment.js +11 -0
- package/dist/session/handoff/assignment.js.map +1 -0
- package/dist/session/handoff/broadcast.d.ts +54 -0
- package/dist/session/handoff/broadcast.d.ts.map +1 -0
- package/dist/session/handoff/broadcast.js +311 -0
- package/dist/session/handoff/broadcast.js.map +1 -0
- package/dist/session/handoff/capacity.d.ts +66 -0
- package/dist/session/handoff/capacity.d.ts.map +1 -0
- package/dist/session/handoff/capacity.js +60 -0
- package/dist/session/handoff/capacity.js.map +1 -0
- package/dist/session/handoff/events.d.ts +66 -0
- package/dist/session/handoff/events.d.ts.map +1 -0
- package/dist/session/handoff/events.js +13 -0
- package/dist/session/handoff/events.js.map +1 -0
- package/dist/session/handoff/index.d.ts +12 -0
- package/dist/session/handoff/index.d.ts.map +1 -0
- package/dist/session/handoff/index.js +9 -0
- package/dist/session/handoff/index.js.map +1 -0
- package/dist/session/handoff/single.d.ts +69 -0
- package/dist/session/handoff/single.d.ts.map +1 -0
- package/dist/session/handoff/single.js +229 -0
- package/dist/session/handoff/single.js.map +1 -0
- package/dist/session/handoff/version.d.ts +52 -0
- package/dist/session/handoff/version.d.ts.map +1 -0
- package/dist/session/handoff/version.js +36 -0
- package/dist/session/handoff/version.js.map +1 -0
- package/dist/session/hierarchy/__tests__/session.test.d.ts +2 -0
- package/dist/session/hierarchy/__tests__/session.test.d.ts.map +1 -0
- package/dist/session/hierarchy/__tests__/session.test.js +69 -0
- package/dist/session/hierarchy/__tests__/session.test.js.map +1 -0
- package/dist/session/hierarchy/actor.d.ts +26 -0
- package/dist/session/hierarchy/actor.d.ts.map +1 -0
- package/dist/session/hierarchy/actor.js +2 -0
- package/dist/session/hierarchy/actor.js.map +1 -0
- package/dist/session/hierarchy/index.d.ts +9 -0
- package/dist/session/hierarchy/index.d.ts.map +1 -0
- package/dist/session/hierarchy/index.js +4 -0
- package/dist/session/hierarchy/index.js.map +1 -0
- package/dist/session/hierarchy/lineage.d.ts +15 -0
- package/dist/session/hierarchy/lineage.d.ts.map +1 -0
- package/dist/session/hierarchy/lineage.js +2 -0
- package/dist/session/hierarchy/lineage.js.map +1 -0
- package/dist/session/hierarchy/project.d.ts +40 -0
- package/dist/session/hierarchy/project.d.ts.map +1 -0
- package/dist/session/hierarchy/project.js +2 -0
- package/dist/session/hierarchy/project.js.map +1 -0
- package/dist/session/hierarchy/session.d.ts +71 -0
- package/dist/session/hierarchy/session.d.ts.map +1 -0
- package/dist/session/hierarchy/session.js +51 -0
- package/dist/session/hierarchy/session.js.map +1 -0
- package/dist/session/hierarchy/sub-session.d.ts +76 -0
- package/dist/session/hierarchy/sub-session.d.ts.map +1 -0
- package/dist/session/hierarchy/sub-session.js +2 -0
- package/dist/session/hierarchy/sub-session.js.map +1 -0
- package/dist/session/hierarchy/tenant.d.ts +13 -0
- package/dist/session/hierarchy/tenant.d.ts.map +1 -0
- package/dist/session/hierarchy/tenant.js +2 -0
- package/dist/session/hierarchy/tenant.js.map +1 -0
- package/dist/session/hierarchy/thread.d.ts +54 -0
- package/dist/session/hierarchy/thread.d.ts.map +1 -0
- package/dist/session/hierarchy/thread.js +2 -0
- package/dist/session/hierarchy/thread.js.map +1 -0
- package/dist/session/index.d.ts +10 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +15 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/intervention/__tests__/prev-artifact.test.d.ts +2 -0
- package/dist/session/intervention/__tests__/prev-artifact.test.d.ts.map +1 -0
- package/dist/session/intervention/__tests__/prev-artifact.test.js +179 -0
- package/dist/session/intervention/__tests__/prev-artifact.test.js.map +1 -0
- package/dist/session/intervention/index.d.ts +3 -0
- package/dist/session/intervention/index.d.ts.map +1 -0
- package/dist/session/intervention/index.js +8 -0
- package/dist/session/intervention/index.js.map +1 -0
- package/dist/session/intervention/prev-artifact.d.ts +103 -0
- package/dist/session/intervention/prev-artifact.d.ts.map +1 -0
- package/dist/session/intervention/prev-artifact.js +112 -0
- package/dist/session/intervention/prev-artifact.js.map +1 -0
- package/dist/session/migration/__tests__/filesystem.test.d.ts +2 -0
- package/dist/session/migration/__tests__/filesystem.test.d.ts.map +1 -0
- package/dist/session/migration/__tests__/filesystem.test.js +188 -0
- package/dist/session/migration/__tests__/filesystem.test.js.map +1 -0
- package/dist/session/migration/__tests__/id-prefix.test.d.ts +2 -0
- package/dist/session/migration/__tests__/id-prefix.test.d.ts.map +1 -0
- package/dist/session/migration/__tests__/id-prefix.test.js +83 -0
- package/dist/session/migration/__tests__/id-prefix.test.js.map +1 -0
- package/dist/session/migration/__tests__/marker.test.d.ts +2 -0
- package/dist/session/migration/__tests__/marker.test.d.ts.map +1 -0
- package/dist/session/migration/__tests__/marker.test.js +75 -0
- package/dist/session/migration/__tests__/marker.test.js.map +1 -0
- package/dist/session/migration/errors.d.ts +26 -0
- package/dist/session/migration/errors.d.ts.map +1 -0
- package/dist/session/migration/errors.js +22 -0
- package/dist/session/migration/errors.js.map +1 -0
- package/dist/session/migration/filesystem.d.ts +94 -0
- package/dist/session/migration/filesystem.d.ts.map +1 -0
- package/dist/session/migration/filesystem.js +319 -0
- package/dist/session/migration/filesystem.js.map +1 -0
- package/dist/session/migration/id-prefix.d.ts +93 -0
- package/dist/session/migration/id-prefix.d.ts.map +1 -0
- package/dist/session/migration/id-prefix.js +111 -0
- package/dist/session/migration/id-prefix.js.map +1 -0
- package/dist/session/migration/index.d.ts +8 -0
- package/dist/session/migration/index.d.ts.map +1 -0
- package/dist/session/migration/index.js +8 -0
- package/dist/session/migration/index.js.map +1 -0
- package/dist/session/migration/marker.d.ts +57 -0
- package/dist/session/migration/marker.d.ts.map +1 -0
- package/dist/session/migration/marker.js +111 -0
- package/dist/session/migration/marker.js.map +1 -0
- package/dist/session/retention/__tests__/archive.test.d.ts +2 -0
- package/dist/session/retention/__tests__/archive.test.d.ts.map +1 -0
- package/dist/session/retention/__tests__/archive.test.js +253 -0
- package/dist/session/retention/__tests__/archive.test.js.map +1 -0
- package/dist/session/retention/__tests__/disk-backend.test.d.ts +2 -0
- package/dist/session/retention/__tests__/disk-backend.test.d.ts.map +1 -0
- package/dist/session/retention/__tests__/disk-backend.test.js +154 -0
- package/dist/session/retention/__tests__/disk-backend.test.js.map +1 -0
- package/dist/session/retention/archive-backend-ref.d.ts +18 -0
- package/dist/session/retention/archive-backend-ref.d.ts.map +1 -0
- package/dist/session/retention/archive-backend-ref.js +2 -0
- package/dist/session/retention/archive-backend-ref.js.map +1 -0
- package/dist/session/retention/archive.d.ts +130 -0
- package/dist/session/retention/archive.d.ts.map +1 -0
- package/dist/session/retention/archive.js +203 -0
- package/dist/session/retention/archive.js.map +1 -0
- package/dist/session/retention/backend.d.ts +101 -0
- package/dist/session/retention/backend.d.ts.map +1 -0
- package/dist/session/retention/backend.js +15 -0
- package/dist/session/retention/backend.js.map +1 -0
- package/dist/session/retention/disk-backend.d.ts +59 -0
- package/dist/session/retention/disk-backend.d.ts.map +1 -0
- package/dist/session/retention/disk-backend.js +236 -0
- package/dist/session/retention/disk-backend.js.map +1 -0
- package/dist/session/retention/index.d.ts +9 -0
- package/dist/session/retention/index.d.ts.map +1 -0
- package/dist/session/retention/index.js +6 -0
- package/dist/session/retention/index.js.map +1 -0
- package/dist/session/retention/policy.d.ts +49 -0
- package/dist/session/retention/policy.d.ts.map +1 -0
- package/dist/session/retention/policy.js +21 -0
- package/dist/session/retention/policy.js.map +1 -0
- package/dist/session/summary/__tests__/materialize.test.d.ts +2 -0
- package/dist/session/summary/__tests__/materialize.test.d.ts.map +1 -0
- package/dist/session/summary/__tests__/materialize.test.js +270 -0
- package/dist/session/summary/__tests__/materialize.test.js.map +1 -0
- package/dist/session/summary/deliverable.d.ts +74 -0
- package/dist/session/summary/deliverable.d.ts.map +1 -0
- package/dist/session/summary/deliverable.js +20 -0
- package/dist/session/summary/deliverable.js.map +1 -0
- package/dist/session/summary/index.d.ts +6 -0
- package/dist/session/summary/index.d.ts.map +1 -0
- package/dist/session/summary/index.js +9 -0
- package/dist/session/summary/index.js.map +1 -0
- package/dist/session/summary/materialize.d.ts +82 -0
- package/dist/session/summary/materialize.d.ts.map +1 -0
- package/dist/session/summary/materialize.js +117 -0
- package/dist/session/summary/materialize.js.map +1 -0
- package/dist/session/summary/ref.d.ts +91 -0
- package/dist/session/summary/ref.d.ts.map +1 -0
- package/dist/session/summary/ref.js +51 -0
- package/dist/session/summary/ref.js.map +1 -0
- package/dist/session/workspace/__tests__/git-worktree.test.d.ts +2 -0
- package/dist/session/workspace/__tests__/git-worktree.test.d.ts.map +1 -0
- package/dist/session/workspace/__tests__/git-worktree.test.js +244 -0
- package/dist/session/workspace/__tests__/git-worktree.test.js.map +1 -0
- package/dist/session/workspace/__tests__/path-builder.test.d.ts +2 -0
- package/dist/session/workspace/__tests__/path-builder.test.d.ts.map +1 -0
- package/dist/session/workspace/__tests__/path-builder.test.js +37 -0
- package/dist/session/workspace/__tests__/path-builder.test.js.map +1 -0
- package/dist/session/workspace/driver.d.ts +55 -0
- package/dist/session/workspace/driver.d.ts.map +1 -0
- package/dist/session/workspace/driver.js +12 -0
- package/dist/session/workspace/driver.js.map +1 -0
- package/dist/session/workspace/git-worktree.d.ts +65 -0
- package/dist/session/workspace/git-worktree.d.ts.map +1 -0
- package/dist/session/workspace/git-worktree.js +156 -0
- package/dist/session/workspace/git-worktree.js.map +1 -0
- package/dist/session/workspace/index.d.ts +8 -0
- package/dist/session/workspace/index.d.ts.map +1 -0
- package/dist/session/workspace/index.js +7 -0
- package/dist/session/workspace/index.js.map +1 -0
- package/dist/session/workspace/path-builder.d.ts +50 -0
- package/dist/session/workspace/path-builder.d.ts.map +1 -0
- package/dist/session/workspace/path-builder.js +50 -0
- package/dist/session/workspace/path-builder.js.map +1 -0
- package/dist/session/workspace/ref.d.ts +46 -0
- package/dist/session/workspace/ref.d.ts.map +1 -0
- package/dist/session/workspace/ref.js +11 -0
- package/dist/session/workspace/ref.js.map +1 -0
- package/dist/session/workspace/registry.d.ts +26 -0
- package/dist/session/workspace/registry.d.ts.map +1 -0
- package/dist/session/workspace/registry.js +35 -0
- package/dist/session/workspace/registry.js.map +1 -0
- package/dist/store/index.d.ts +0 -2
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +0 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/session/__tests__/disk.test.d.ts +2 -0
- package/dist/store/session/__tests__/disk.test.d.ts.map +1 -0
- package/dist/store/session/__tests__/disk.test.js +267 -0
- package/dist/store/session/__tests__/disk.test.js.map +1 -0
- package/dist/store/session/__tests__/memory.test.d.ts +2 -0
- package/dist/store/session/__tests__/memory.test.d.ts.map +1 -0
- package/dist/store/session/__tests__/memory.test.js +258 -0
- package/dist/store/session/__tests__/memory.test.js.map +1 -0
- package/dist/store/session/disk.d.ts +86 -0
- package/dist/store/session/disk.d.ts.map +1 -0
- package/dist/store/session/disk.js +818 -0
- package/dist/store/session/disk.js.map +1 -0
- package/dist/store/session/index.d.ts +7 -0
- package/dist/store/session/index.d.ts.map +1 -0
- package/dist/store/session/index.js +10 -0
- package/dist/store/session/index.js.map +1 -0
- package/dist/store/session/linkage.d.ts +38 -0
- package/dist/store/session/linkage.d.ts.map +1 -0
- package/dist/store/session/linkage.js +64 -0
- package/dist/store/session/linkage.js.map +1 -0
- package/dist/store/session/memory.d.ts +49 -0
- package/dist/store/session/memory.d.ts.map +1 -0
- package/dist/store/session/memory.js +335 -0
- package/dist/store/session/memory.js.map +1 -0
- package/dist/store/session/messages.d.ts +20 -0
- package/dist/store/session/messages.d.ts.map +1 -0
- package/dist/store/session/messages.js +12 -0
- package/dist/store/session/messages.js.map +1 -0
- package/dist/store/thread/disk.d.ts +41 -0
- package/dist/store/thread/disk.d.ts.map +1 -0
- package/dist/store/thread/disk.js +229 -0
- package/dist/store/thread/disk.js.map +1 -0
- package/dist/store/thread/index.d.ts +4 -0
- package/dist/store/thread/index.d.ts.map +1 -0
- package/dist/store/thread/index.js +6 -0
- package/dist/store/thread/index.js.map +1 -0
- package/dist/store/thread/memory.d.ts +23 -0
- package/dist/store/thread/memory.d.ts.map +1 -0
- package/dist/store/thread/memory.js +90 -0
- package/dist/store/thread/memory.js.map +1 -0
- package/dist/tools/builtins/__tests__/structuredOutput.example.d.ts +1 -1
- package/dist/types/agent/base.d.ts +24 -1
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/factory.d.ts +8 -2
- package/dist/types/agent/factory.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +57 -2
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/agent/task.js.map +1 -1
- package/dist/types/ids/index.d.ts +22 -3
- package/dist/types/ids/index.d.ts.map +1 -1
- package/dist/types/ids/index.js +8 -1
- package/dist/types/ids/index.js.map +1 -1
- package/dist/types/invocation/__tests__/state.test.js +36 -29
- package/dist/types/invocation/__tests__/state.test.js.map +1 -1
- package/dist/types/invocation/index.d.ts +20 -4
- package/dist/types/invocation/index.d.ts.map +1 -1
- package/dist/types/invocation/index.js +10 -7
- package/dist/types/invocation/index.js.map +1 -1
- package/dist/types/rag/retrieval.d.ts +4 -3
- package/dist/types/rag/retrieval.d.ts.map +1 -1
- package/dist/types/run/config.d.ts +12 -1
- package/dist/types/run/config.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +26 -1
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/index.d.ts.map +1 -1
- package/dist/types/run/index.js +8 -0
- package/dist/types/run/index.js.map +1 -1
- package/dist/types/run/metadata.d.ts +12 -2
- package/dist/types/run/metadata.d.ts.map +1 -1
- package/dist/types/run/status.d.ts +26 -0
- package/dist/types/run/status.d.ts.map +1 -0
- package/dist/types/run/status.js +2 -0
- package/dist/types/run/status.js.map +1 -0
- package/dist/types/session/ids.d.ts +9 -0
- package/dist/types/session/ids.d.ts.map +1 -0
- package/dist/types/session/ids.js +9 -0
- package/dist/types/session/ids.js.map +1 -0
- package/dist/types/session/index.d.ts +3 -0
- package/dist/types/session/index.d.ts.map +1 -0
- package/dist/types/session/index.js +5 -0
- package/dist/types/session/index.js.map +1 -0
- package/dist/types/session/store.d.ts +210 -0
- package/dist/types/session/store.d.ts.map +1 -0
- package/dist/types/session/store.js +9 -0
- package/dist/types/session/store.js.map +1 -0
- package/dist/types/thread/index.d.ts +2 -0
- package/dist/types/thread/index.d.ts.map +1 -0
- package/dist/types/thread/index.js +5 -0
- package/dist/types/thread/index.js.map +1 -0
- package/dist/types/thread/store.d.ts +86 -0
- package/dist/types/thread/store.d.ts.map +1 -0
- package/dist/types/thread/store.js +22 -0
- package/dist/types/thread/store.js.map +1 -0
- package/dist/utils/id.d.ts +8 -2
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +22 -4
- package/dist/utils/id.js.map +1 -1
- package/package.json +6 -11
- package/src/agents/ReactiveAgent.ts +7 -2
- package/src/agents/RouterAgent.ts +5 -0
- package/src/agents/SupervisorAgent.ts +29 -6
- package/src/bridge/a2a/index.ts +0 -1
- package/src/bridge/a2a/mapper.ts +7 -0
- package/src/bridge/a2a/message.ts +0 -32
- package/src/bridge/a2a/task.ts +9 -8
- package/src/bridge/sse/mapper.ts +8 -1
- package/src/constants/a2a/index.ts +2 -2
- package/src/contracts/api.ts +14 -30
- package/src/contracts/ids.ts +1 -1
- package/src/contracts/index.ts +3 -7
- package/src/contracts/schemas.ts +1 -8
- package/src/gateway/local.ts +6 -0
- package/src/index.ts +14 -4
- package/src/manager/agent/__tests__/lifecycle.test.ts +473 -0
- package/src/manager/agent/lifecycle.ts +515 -21
- package/src/manager/index.ts +3 -0
- package/src/manager/run/persistence.ts +26 -1
- package/src/manager/thread/__tests__/lifecycle.test.ts +286 -0
- package/src/manager/thread/lifecycle.ts +217 -0
- package/src/rag/retriever.ts +2 -2
- package/src/run/reporter.ts +28 -0
- package/src/runtime/query/__tests__/context.test.ts +102 -0
- package/src/runtime/query/context-cache.ts +4 -4
- package/src/runtime/query/context.ts +98 -9
- package/src/runtime/query/events.ts +8 -0
- package/src/runtime/query/index.ts +38 -1
- package/src/session/__tests__/integration/_fixtures.ts +310 -0
- package/src/session/__tests__/integration/archive-gate.test.ts +288 -0
- package/src/session/__tests__/integration/capacity-caps.test.ts +171 -0
- package/src/session/__tests__/integration/e2e-spawn.test.ts +296 -0
- package/src/session/__tests__/integration/event-stream-ordering.test.ts +410 -0
- package/src/session/__tests__/integration/handoff-broadcast-e2e.test.ts +271 -0
- package/src/session/__tests__/integration/handoff-illegal-transition.test.ts +214 -0
- package/src/session/__tests__/integration/handoff-single-e2e.test.ts +251 -0
- package/src/session/__tests__/integration/hierarchy-lifecycle.test.ts +240 -0
- package/src/session/__tests__/integration/migration-filesystem.test.ts +209 -0
- package/src/session/__tests__/integration/migration-id-prefix.test.ts +101 -0
- package/src/session/__tests__/integration/prev-artifact-dag.test.ts +325 -0
- package/src/session/__tests__/integration/retention-archive.test.ts +233 -0
- package/src/session/__tests__/integration/spawn-rollback.test.ts +313 -0
- package/src/session/__tests__/integration/summary-materialization-e2e.test.ts +239 -0
- package/src/session/__tests__/integration/tenant-isolation.test.ts +292 -0
- package/src/session/errors.ts +159 -0
- package/src/session/events/index.ts +16 -0
- package/src/session/events/schema-version.ts +13 -0
- package/src/session/events/types.ts +71 -0
- package/src/session/handoff/__tests__/broadcast.test.ts +378 -0
- package/src/session/handoff/__tests__/capacity.test.ts +129 -0
- package/src/session/handoff/__tests__/single.test.ts +333 -0
- package/src/session/handoff/assignment.ts +74 -0
- package/src/session/handoff/broadcast.ts +406 -0
- package/src/session/handoff/capacity.ts +121 -0
- package/src/session/handoff/events.ts +72 -0
- package/src/session/handoff/index.ts +29 -0
- package/src/session/handoff/single.ts +310 -0
- package/src/session/handoff/version.ts +59 -0
- package/src/session/hierarchy/__tests__/session.test.ts +100 -0
- package/src/session/hierarchy/actor.ts +17 -0
- package/src/session/hierarchy/index.ts +18 -0
- package/src/session/hierarchy/lineage.ts +15 -0
- package/src/session/hierarchy/project.ts +41 -0
- package/src/session/hierarchy/session.ts +109 -0
- package/src/session/hierarchy/sub-session.ts +92 -0
- package/src/session/hierarchy/tenant.ts +13 -0
- package/src/session/hierarchy/thread.ts +55 -0
- package/src/session/index.ts +15 -0
- package/src/session/intervention/__tests__/prev-artifact.test.ts +234 -0
- package/src/session/intervention/index.ts +16 -0
- package/src/session/intervention/prev-artifact.ts +180 -0
- package/src/session/migration/__tests__/filesystem.test.ts +263 -0
- package/src/session/migration/__tests__/id-prefix.test.ts +101 -0
- package/src/session/migration/__tests__/marker.test.ts +84 -0
- package/src/session/migration/errors.ts +23 -0
- package/src/session/migration/filesystem.ts +401 -0
- package/src/session/migration/id-prefix.ts +141 -0
- package/src/session/migration/index.ts +38 -0
- package/src/session/migration/marker.ts +131 -0
- package/src/session/retention/__tests__/archive.test.ts +318 -0
- package/src/session/retention/__tests__/disk-backend.test.ts +180 -0
- package/src/session/retention/archive-backend-ref.ts +17 -0
- package/src/session/retention/archive.ts +281 -0
- package/src/session/retention/backend.ts +107 -0
- package/src/session/retention/disk-backend.ts +304 -0
- package/src/session/retention/index.ts +16 -0
- package/src/session/retention/policy.ts +53 -0
- package/src/session/summary/__tests__/materialize.test.ts +343 -0
- package/src/session/summary/deliverable.ts +84 -0
- package/src/session/summary/index.ts +31 -0
- package/src/session/summary/materialize.ts +169 -0
- package/src/session/summary/ref.ts +104 -0
- package/src/session/workspace/__tests__/git-worktree.test.ts +258 -0
- package/src/session/workspace/__tests__/path-builder.test.ts +51 -0
- package/src/session/workspace/driver.ts +60 -0
- package/src/session/workspace/git-worktree.ts +209 -0
- package/src/session/workspace/index.ts +25 -0
- package/src/session/workspace/path-builder.ts +71 -0
- package/src/session/workspace/ref.ts +50 -0
- package/src/session/workspace/registry.ts +42 -0
- package/src/store/index.ts +0 -3
- package/src/store/session/__tests__/disk.test.ts +397 -0
- package/src/store/session/__tests__/memory.test.ts +402 -0
- package/src/store/session/disk.ts +976 -0
- package/src/store/session/index.ts +13 -0
- package/src/store/session/linkage.ts +80 -0
- package/src/store/session/memory.ts +412 -0
- package/src/store/session/messages.ts +21 -0
- package/src/store/thread/disk.ts +261 -0
- package/src/store/thread/index.ts +7 -0
- package/src/store/thread/memory.ts +104 -0
- package/src/types/agent/base.ts +27 -1
- package/src/types/agent/factory.ts +8 -3
- package/src/types/agent/task.ts +66 -2
- package/src/types/ids/index.ts +34 -3
- package/src/types/invocation/__tests__/state.test.ts +37 -29
- package/src/types/invocation/index.ts +26 -10
- package/src/types/rag/retrieval.ts +4 -3
- package/src/types/run/config.ts +13 -1
- package/src/types/run/events.ts +36 -1
- package/src/types/run/index.ts +8 -0
- package/src/types/run/metadata.ts +12 -2
- package/src/types/run/status.ts +33 -0
- package/src/types/session/ids.ts +23 -0
- package/src/types/session/index.ts +27 -0
- package/src/types/session/store.ts +252 -0
- package/src/types/thread/index.ts +5 -0
- package/src/types/thread/store.ts +92 -0
- package/src/utils/id.ts +34 -4
- package/dist/store/conversation/memory.d.ts +0 -21
- package/dist/store/conversation/memory.d.ts.map +0 -1
- package/dist/store/conversation/memory.js +0 -86
- package/dist/store/conversation/memory.js.map +0 -1
- package/dist/types/conversation/index.d.ts +0 -7
- package/dist/types/conversation/index.d.ts.map +0 -1
- package/dist/types/conversation/index.js +0 -2
- package/dist/types/conversation/index.js.map +0 -1
- package/src/store/conversation/memory.ts +0 -121
- package/src/types/conversation/index.ts +0 -8
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branded lookup identifier for an archived sub-session in a pluggable
|
|
3
|
+
* {@link ArchiveBackend}. Produced by
|
|
4
|
+
* {@link ArchiveBackend.store} on a successful archival write and consumed by
|
|
5
|
+
* {@link ArchiveBackend.restore} to re-hydrate the bundle.
|
|
6
|
+
*
|
|
7
|
+
* Follows Convention #2 (`<prefix>_<opaque>` template literal brand). Prefix
|
|
8
|
+
* chosen as `arc_` to match the `archive` domain — short, unambiguous, and
|
|
9
|
+
* distinct from every existing prefix (`prj_`, `ses_`, `sub_`, `sum_`, …).
|
|
10
|
+
*
|
|
11
|
+
* The string after the prefix is opaque — backend-specific. A disk backend
|
|
12
|
+
* embeds it in a directory path; an object-store backend may encode a key;
|
|
13
|
+
* callers MUST NOT parse or pattern-match beyond the brand check.
|
|
14
|
+
*
|
|
15
|
+
* See session-hierarchy.md §12.3 Retention and Archival.
|
|
16
|
+
*/
|
|
17
|
+
export type ArchiveBackendRef = `arc_${string}`;
|
|
18
|
+
//# sourceMappingURL=archive-backend-ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-backend-ref.d.ts","sourceRoot":"","sources":["../../../src/session/retention/archive-backend-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,MAAM,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-backend-ref.js","sourceRoot":"","sources":["../../../src/session/retention/archive-backend-ref.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArchivalManager — on-demand archival primitive for sub-sessions. Pattern
|
|
3
|
+
* doc §12.3 (Retention and Archival).
|
|
4
|
+
*
|
|
5
|
+
* Convention #9 (Registry + Manager + Store): Manager-shape with explicit
|
|
6
|
+
* deps for the {@link SessionStore}, {@link WorkspaceBackendRegistry}, and a
|
|
7
|
+
* pluggable {@link ArchiveBackend}. Convention #5 deny-by-default: absent
|
|
8
|
+
* backend → {@link ArchiveNotConfiguredError} on every `archive()` call.
|
|
9
|
+
*
|
|
10
|
+
* Atomic invariant (pattern doc §12.3):
|
|
11
|
+
*
|
|
12
|
+
* 1. Read sub-session + owning session + messages + optional summary
|
|
13
|
+
* 2. backend.store(bundle) — archive durability confirmed
|
|
14
|
+
* 3. Flip sub-session to `status: 'archived'` + attach archiveRef/archivedAt
|
|
15
|
+
* 4. Workspace driver dispose (idempotent)
|
|
16
|
+
*
|
|
17
|
+
* Step 2 is the durability boundary: if the process crashes between step 2
|
|
18
|
+
* and step 3, the archive exists but the live record is still non-archived
|
|
19
|
+
* — recovery is to re-invoke `archive()`, which sees a non-terminal status
|
|
20
|
+
* and replays. Step 3 is the single point of no return.
|
|
21
|
+
*
|
|
22
|
+
* A completed archive leaves the sub-session in-place with `status:
|
|
23
|
+
* 'archived'` + an attached `archiveRef`. Pattern doc §12.3 calls this the
|
|
24
|
+
* tombstone: `SessionStore.drill` still finds it through the normal linkage
|
|
25
|
+
* path, so the archive is navigable without a parallel index.
|
|
26
|
+
*/
|
|
27
|
+
import type { SubSessionId, TenantId } from '../../types/ids/index.js';
|
|
28
|
+
import type { WorkspaceId } from '../../types/session/ids.js';
|
|
29
|
+
import type { SessionStore } from '../../types/session/store.js';
|
|
30
|
+
import type { WorkspaceRef } from '../workspace/ref.js';
|
|
31
|
+
import type { WorkspaceBackendRegistry } from '../workspace/registry.js';
|
|
32
|
+
import type { ArchiveBackend, SubSessionTombstone } from './backend.js';
|
|
33
|
+
/**
|
|
34
|
+
* Raised when {@link ArchivalManager.archive} or {@link ArchivalManager.restore}
|
|
35
|
+
* is invoked against a project whose retention policy does not supply an
|
|
36
|
+
* {@link ArchiveBackend}. Convention #5 — explicit error rather than silent
|
|
37
|
+
* no-op.
|
|
38
|
+
*/
|
|
39
|
+
export declare class ArchiveNotConfiguredError extends Error {
|
|
40
|
+
constructor();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Raised when {@link ArchivalManager.archive} targets a sub-session that is
|
|
44
|
+
* not eligible for archival. The three reasons map to pattern doc §12.3
|
|
45
|
+
* (archival only applies to idle / merged / rejected / failed sub-sessions).
|
|
46
|
+
*/
|
|
47
|
+
export declare class SubSessionNotArchivableError extends Error {
|
|
48
|
+
readonly details: {
|
|
49
|
+
readonly subSessionId: SubSessionId;
|
|
50
|
+
readonly reason: 'not_idle' | 'already_archived' | 'missing';
|
|
51
|
+
};
|
|
52
|
+
constructor(details: {
|
|
53
|
+
subSessionId: SubSessionId;
|
|
54
|
+
reason: 'not_idle' | 'already_archived' | 'missing';
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Raised when {@link ArchivalManager.restore} is called against a
|
|
59
|
+
* sub-session that is not currently archived. Distinct from
|
|
60
|
+
* {@link SubSessionNotArchivableError} because the semantics are inverted:
|
|
61
|
+
* restore requires an archived record, archive rejects one.
|
|
62
|
+
*/
|
|
63
|
+
export declare class SubSessionNotArchivedError extends Error {
|
|
64
|
+
readonly details: {
|
|
65
|
+
readonly subSessionId: SubSessionId;
|
|
66
|
+
readonly reason: 'not_archived' | 'missing' | 'missing_archive_ref';
|
|
67
|
+
};
|
|
68
|
+
constructor(details: {
|
|
69
|
+
subSessionId: SubSessionId;
|
|
70
|
+
reason: 'not_archived' | 'missing' | 'missing_archive_ref';
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Lookup callback resolving a live {@link WorkspaceRef} from the id stored
|
|
75
|
+
* on a {@link SubSession}. Injected by the caller because Phase 8 does not
|
|
76
|
+
* ship a dedicated workspace store — the ref typically lives in a handoff
|
|
77
|
+
* assignment or is held by the agent lifecycle manager. Return `null` when
|
|
78
|
+
* the ref is unknown or already disposed; the manager archives without
|
|
79
|
+
* workspace data in that case (the disk backend allows it).
|
|
80
|
+
*/
|
|
81
|
+
export type WorkspaceResolver = (workspaceId: WorkspaceId, tenantId: TenantId) => Promise<WorkspaceRef | null>;
|
|
82
|
+
export interface ArchivalManagerDeps {
|
|
83
|
+
readonly sessionStore: SessionStore;
|
|
84
|
+
readonly workspaceRegistry: WorkspaceBackendRegistry;
|
|
85
|
+
/**
|
|
86
|
+
* Archive backend. Absent = archival disabled for this manager
|
|
87
|
+
* (`archive()`/`restore()` throw {@link ArchiveNotConfiguredError}).
|
|
88
|
+
*/
|
|
89
|
+
readonly archiveBackend?: ArchiveBackend;
|
|
90
|
+
/**
|
|
91
|
+
* Optional workspace resolver. When absent, `archive()` skips workspace
|
|
92
|
+
* snapshotting (only the ref would be captured) and workspace disposal
|
|
93
|
+
* (nothing to dispose). This is the conservative default and matches
|
|
94
|
+
* pattern doc §7.1 (lazy workspace provisioning).
|
|
95
|
+
*/
|
|
96
|
+
readonly workspaceResolver?: WorkspaceResolver;
|
|
97
|
+
/**
|
|
98
|
+
* Optional logger hook for `sub_session.archived` emission. Pattern doc
|
|
99
|
+
* §12.3 requires the event; full event-bus wiring is a platform concern
|
|
100
|
+
* (a later phase of the roadmap). Phase 8 ships the log seam so tests
|
|
101
|
+
* can observe without the bus.
|
|
102
|
+
*/
|
|
103
|
+
readonly onArchived?: (tombstone: SubSessionTombstone) => void;
|
|
104
|
+
readonly onRestored?: (subSessionId: SubSessionId, tenantId: TenantId) => void;
|
|
105
|
+
}
|
|
106
|
+
export declare class ArchivalManager {
|
|
107
|
+
private readonly deps;
|
|
108
|
+
constructor(deps: ArchivalManagerDeps);
|
|
109
|
+
/**
|
|
110
|
+
* Archive an eligible sub-session. See module header for the atomic
|
|
111
|
+
* invariant and recovery semantics.
|
|
112
|
+
*
|
|
113
|
+
* Returns the {@link SubSessionTombstone} shape — the same identity +
|
|
114
|
+
* archive fields the store now carries on the live record.
|
|
115
|
+
*/
|
|
116
|
+
archive(subSessionId: SubSessionId, tenantId: TenantId): Promise<SubSessionTombstone>;
|
|
117
|
+
/**
|
|
118
|
+
* Reverse of {@link archive}. Reads the tombstone, invokes
|
|
119
|
+
* `backend.restore`, then flips the sub-session back to `idle`. Does NOT
|
|
120
|
+
* re-materialize the workspace — the caller decides whether to
|
|
121
|
+
* re-provision via a {@link WorkspaceBackendDriver}.
|
|
122
|
+
*
|
|
123
|
+
* The restored `ArchiveInput` bundle is NOT returned here because the
|
|
124
|
+
* concrete pattern in Phase 8 is "flip status and make navigable again";
|
|
125
|
+
* consumers that need the bundle itself can call the backend directly.
|
|
126
|
+
*/
|
|
127
|
+
restore(subSessionId: SubSessionId, tenantId: TenantId): Promise<void>;
|
|
128
|
+
private requireBackend;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=archive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/session/retention/archive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAa,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAEvE;;;;;GAKG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;;CAKnD;AAED;;;;GAIG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;IACtD,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;QACnC,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,CAAA;KAC5D,CAAA;gBAEW,OAAO,EAAE;QACpB,YAAY,EAAE,YAAY,CAAA;QAC1B,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,CAAA;KACnD;CAKD;AAED;;;;;GAKG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IACpD,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;QACnC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,qBAAqB,CAAA;KACnE,CAAA;gBAEW,OAAO,EAAE;QACpB,YAAY,EAAE,YAAY,CAAA;QAC1B,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,qBAAqB,CAAA;KAC1D;CAKD;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC/B,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,KACd,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;AAejC,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,iBAAiB,EAAE,wBAAwB,CAAA;IACpD;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAA;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAC9D,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAA;CAC9E;AAED,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;gBAE9B,IAAI,EAAE,mBAAmB;IAIrC;;;;;;OAMG;IACG,OAAO,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+E3F;;;;;;;;;OASG;IACG,OAAO,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B5E,OAAO,CAAC,cAAc;CAKtB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArchivalManager — on-demand archival primitive for sub-sessions. Pattern
|
|
3
|
+
* doc §12.3 (Retention and Archival).
|
|
4
|
+
*
|
|
5
|
+
* Convention #9 (Registry + Manager + Store): Manager-shape with explicit
|
|
6
|
+
* deps for the {@link SessionStore}, {@link WorkspaceBackendRegistry}, and a
|
|
7
|
+
* pluggable {@link ArchiveBackend}. Convention #5 deny-by-default: absent
|
|
8
|
+
* backend → {@link ArchiveNotConfiguredError} on every `archive()` call.
|
|
9
|
+
*
|
|
10
|
+
* Atomic invariant (pattern doc §12.3):
|
|
11
|
+
*
|
|
12
|
+
* 1. Read sub-session + owning session + messages + optional summary
|
|
13
|
+
* 2. backend.store(bundle) — archive durability confirmed
|
|
14
|
+
* 3. Flip sub-session to `status: 'archived'` + attach archiveRef/archivedAt
|
|
15
|
+
* 4. Workspace driver dispose (idempotent)
|
|
16
|
+
*
|
|
17
|
+
* Step 2 is the durability boundary: if the process crashes between step 2
|
|
18
|
+
* and step 3, the archive exists but the live record is still non-archived
|
|
19
|
+
* — recovery is to re-invoke `archive()`, which sees a non-terminal status
|
|
20
|
+
* and replays. Step 3 is the single point of no return.
|
|
21
|
+
*
|
|
22
|
+
* A completed archive leaves the sub-session in-place with `status:
|
|
23
|
+
* 'archived'` + an attached `archiveRef`. Pattern doc §12.3 calls this the
|
|
24
|
+
* tombstone: `SessionStore.drill` still finds it through the normal linkage
|
|
25
|
+
* path, so the archive is navigable without a parallel index.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Raised when {@link ArchivalManager.archive} or {@link ArchivalManager.restore}
|
|
29
|
+
* is invoked against a project whose retention policy does not supply an
|
|
30
|
+
* {@link ArchiveBackend}. Convention #5 — explicit error rather than silent
|
|
31
|
+
* no-op.
|
|
32
|
+
*/
|
|
33
|
+
export class ArchiveNotConfiguredError extends Error {
|
|
34
|
+
constructor() {
|
|
35
|
+
super('Retention archival not configured for this project (Convention #5: deny-by-default)');
|
|
36
|
+
this.name = 'ArchiveNotConfiguredError';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Raised when {@link ArchivalManager.archive} targets a sub-session that is
|
|
41
|
+
* not eligible for archival. The three reasons map to pattern doc §12.3
|
|
42
|
+
* (archival only applies to idle / merged / rejected / failed sub-sessions).
|
|
43
|
+
*/
|
|
44
|
+
export class SubSessionNotArchivableError extends Error {
|
|
45
|
+
details;
|
|
46
|
+
constructor(details) {
|
|
47
|
+
super(`Sub-session ${details.subSessionId} not archivable: ${details.reason}`);
|
|
48
|
+
this.name = 'SubSessionNotArchivableError';
|
|
49
|
+
this.details = details;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Raised when {@link ArchivalManager.restore} is called against a
|
|
54
|
+
* sub-session that is not currently archived. Distinct from
|
|
55
|
+
* {@link SubSessionNotArchivableError} because the semantics are inverted:
|
|
56
|
+
* restore requires an archived record, archive rejects one.
|
|
57
|
+
*/
|
|
58
|
+
export class SubSessionNotArchivedError extends Error {
|
|
59
|
+
details;
|
|
60
|
+
constructor(details) {
|
|
61
|
+
super(`Sub-session ${details.subSessionId} cannot be restored: ${details.reason}`);
|
|
62
|
+
this.name = 'SubSessionNotArchivedError';
|
|
63
|
+
this.details = details;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Sub-session statuses eligible for archival. Pattern doc §12.3 speaks of
|
|
68
|
+
* "idle" broadly; we honor the enumerated terminal-like states. Anything
|
|
69
|
+
* else (active / pending / in-flight merge) rejects with
|
|
70
|
+
* `'not_idle'`.
|
|
71
|
+
*/
|
|
72
|
+
const ARCHIVABLE_STATUSES = new Set([
|
|
73
|
+
'idle',
|
|
74
|
+
'merged',
|
|
75
|
+
'merge_rejected',
|
|
76
|
+
'failed',
|
|
77
|
+
]);
|
|
78
|
+
export class ArchivalManager {
|
|
79
|
+
deps;
|
|
80
|
+
constructor(deps) {
|
|
81
|
+
this.deps = deps;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Archive an eligible sub-session. See module header for the atomic
|
|
85
|
+
* invariant and recovery semantics.
|
|
86
|
+
*
|
|
87
|
+
* Returns the {@link SubSessionTombstone} shape — the same identity +
|
|
88
|
+
* archive fields the store now carries on the live record.
|
|
89
|
+
*/
|
|
90
|
+
async archive(subSessionId, tenantId) {
|
|
91
|
+
const backend = this.requireBackend();
|
|
92
|
+
// 1. Resolve + validate sub-session.
|
|
93
|
+
const sub = await this.deps.sessionStore.getSubSession(subSessionId, tenantId);
|
|
94
|
+
if (!sub) {
|
|
95
|
+
throw new SubSessionNotArchivableError({ subSessionId, reason: 'missing' });
|
|
96
|
+
}
|
|
97
|
+
if (sub.status === 'archived') {
|
|
98
|
+
throw new SubSessionNotArchivableError({ subSessionId, reason: 'already_archived' });
|
|
99
|
+
}
|
|
100
|
+
if (!ARCHIVABLE_STATUSES.has(sub.status)) {
|
|
101
|
+
throw new SubSessionNotArchivableError({ subSessionId, reason: 'not_idle' });
|
|
102
|
+
}
|
|
103
|
+
// 2. Load owning child session bundle (messages + optional summary).
|
|
104
|
+
// Phase 9 Known Delta #7: uses `loadSessionMessages` for full-fidelity
|
|
105
|
+
// round-trip (original MessageId + timestamp preserved). Previously
|
|
106
|
+
// the Phase 8 archivalmanager synthesized `msg_restored_N` IDs from the
|
|
107
|
+
// payload-only `loadMessages` return — that lossy reshape is gone.
|
|
108
|
+
const childSessionId = sub.childSessionId;
|
|
109
|
+
const messages = await this.deps.sessionStore.loadSessionMessages(childSessionId, tenantId);
|
|
110
|
+
const summaryRefOrNull = await this.deps.sessionStore.getSummary(childSessionId, tenantId);
|
|
111
|
+
const summaryRef = summaryRefOrNull ?? undefined;
|
|
112
|
+
// 3. Resolve optional live workspace ref.
|
|
113
|
+
let workspace;
|
|
114
|
+
if (sub.workspaceId && this.deps.workspaceResolver) {
|
|
115
|
+
const resolved = await this.deps.workspaceResolver(sub.workspaceId, tenantId);
|
|
116
|
+
if (resolved)
|
|
117
|
+
workspace = resolved;
|
|
118
|
+
}
|
|
119
|
+
// 4. Durability boundary: persist the archive bundle.
|
|
120
|
+
const bundleOut = await backend.store({
|
|
121
|
+
subSessionId: sub.id,
|
|
122
|
+
sessionId: childSessionId,
|
|
123
|
+
tenantId,
|
|
124
|
+
...(workspace !== undefined && { workspace }),
|
|
125
|
+
...(summaryRef !== undefined && { summaryRef }),
|
|
126
|
+
messages,
|
|
127
|
+
});
|
|
128
|
+
// 5. Point-of-no-return: flip sub-session to archived + attach ref.
|
|
129
|
+
const archived = {
|
|
130
|
+
...sub,
|
|
131
|
+
status: 'archived',
|
|
132
|
+
archiveRef: bundleOut.archiveRef,
|
|
133
|
+
archivedAt: bundleOut.archivedAt,
|
|
134
|
+
};
|
|
135
|
+
await this.deps.sessionStore.updateSubSession(archived, tenantId);
|
|
136
|
+
// 6. Dispose the workspace (idempotent — driver contract tolerates
|
|
137
|
+
// already-disposed refs; a missing ref is a no-op).
|
|
138
|
+
if (workspace) {
|
|
139
|
+
try {
|
|
140
|
+
const driver = this.deps.workspaceRegistry.get(workspace.meta.backend);
|
|
141
|
+
await driver.dispose(workspace);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Idempotent — a secondary failure here must not unwind the
|
|
145
|
+
// already-committed archive. Pattern doc §12.3: workspace
|
|
146
|
+
// disposal is a cleanup operation, not part of the atomic
|
|
147
|
+
// archive envelope.
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const tombstone = {
|
|
151
|
+
subSessionId: sub.id,
|
|
152
|
+
sessionId: childSessionId,
|
|
153
|
+
tenantId,
|
|
154
|
+
...(sub.summaryRef !== undefined && { summaryRef: sub.summaryRef }),
|
|
155
|
+
archiveRef: bundleOut.archiveRef,
|
|
156
|
+
archivedAt: bundleOut.archivedAt,
|
|
157
|
+
};
|
|
158
|
+
this.deps.onArchived?.(tombstone);
|
|
159
|
+
return tombstone;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Reverse of {@link archive}. Reads the tombstone, invokes
|
|
163
|
+
* `backend.restore`, then flips the sub-session back to `idle`. Does NOT
|
|
164
|
+
* re-materialize the workspace — the caller decides whether to
|
|
165
|
+
* re-provision via a {@link WorkspaceBackendDriver}.
|
|
166
|
+
*
|
|
167
|
+
* The restored `ArchiveInput` bundle is NOT returned here because the
|
|
168
|
+
* concrete pattern in Phase 8 is "flip status and make navigable again";
|
|
169
|
+
* consumers that need the bundle itself can call the backend directly.
|
|
170
|
+
*/
|
|
171
|
+
async restore(subSessionId, tenantId) {
|
|
172
|
+
const backend = this.requireBackend();
|
|
173
|
+
const sub = await this.deps.sessionStore.getSubSession(subSessionId, tenantId);
|
|
174
|
+
if (!sub) {
|
|
175
|
+
throw new SubSessionNotArchivedError({ subSessionId, reason: 'missing' });
|
|
176
|
+
}
|
|
177
|
+
if (sub.status !== 'archived') {
|
|
178
|
+
throw new SubSessionNotArchivedError({ subSessionId, reason: 'not_archived' });
|
|
179
|
+
}
|
|
180
|
+
if (!sub.archiveRef) {
|
|
181
|
+
throw new SubSessionNotArchivedError({ subSessionId, reason: 'missing_archive_ref' });
|
|
182
|
+
}
|
|
183
|
+
// Validate the archive ref by invoking the backend — this surfaces
|
|
184
|
+
// ArchiveNotFoundError up the stack if the bundle is missing or
|
|
185
|
+
// corrupt, rather than silently un-archiving an orphaned record.
|
|
186
|
+
await backend.restore(sub.archiveRef);
|
|
187
|
+
const restored = {
|
|
188
|
+
...sub,
|
|
189
|
+
status: 'idle',
|
|
190
|
+
archiveRef: undefined,
|
|
191
|
+
archivedAt: undefined,
|
|
192
|
+
};
|
|
193
|
+
await this.deps.sessionStore.updateSubSession(restored, tenantId);
|
|
194
|
+
this.deps.onRestored?.(subSessionId, tenantId);
|
|
195
|
+
}
|
|
196
|
+
requireBackend() {
|
|
197
|
+
const backend = this.deps.archiveBackend;
|
|
198
|
+
if (!backend)
|
|
199
|
+
throw new ArchiveNotConfiguredError();
|
|
200
|
+
return backend;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/session/retention/archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArchiveBackend — pluggable archival contract. See session-hierarchy.md
|
|
3
|
+
* §12.3 Retention and Archival.
|
|
4
|
+
*
|
|
5
|
+
* Convention #10 (Provider abstraction): interface lives here; concrete
|
|
6
|
+
* implementations (disk, s3, glacier, …) live in sibling files. Phase 8 ships
|
|
7
|
+
* the reference disk impl (`disk-backend.ts`); production deployments plug
|
|
8
|
+
* their own over the same surface.
|
|
9
|
+
*
|
|
10
|
+
* Convention #9 (Registry + Manager + Store): {@link ArchivalManager} is the
|
|
11
|
+
* Manager; this `ArchiveBackend` is the Provider slot it drives; the live
|
|
12
|
+
* `SessionStore` is the Store it mutates.
|
|
13
|
+
*/
|
|
14
|
+
import type { SessionMessage } from '../../store/session/messages.js';
|
|
15
|
+
import type { SessionId, SubSessionId, TenantId } from '../../types/ids/index.js';
|
|
16
|
+
import type { SummaryId } from '../../types/session/ids.js';
|
|
17
|
+
import type { SessionSummaryRef } from '../summary/ref.js';
|
|
18
|
+
import type { WorkspaceRef } from '../workspace/ref.js';
|
|
19
|
+
import type { ArchiveBackendRef } from './archive-backend-ref.js';
|
|
20
|
+
/**
|
|
21
|
+
* Output of a successful {@link ArchiveBackend.store} call. `archiveRef` is
|
|
22
|
+
* the opaque lookup key used by {@link ArchiveBackend.restore} to rehydrate
|
|
23
|
+
* the bundle.
|
|
24
|
+
*/
|
|
25
|
+
export interface ArchiveOutput {
|
|
26
|
+
readonly archiveRef: ArchiveBackendRef;
|
|
27
|
+
readonly archivedAt: Date;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Bundle handed to {@link ArchiveBackend.store} (and returned by
|
|
31
|
+
* {@link ArchiveBackend.restore}). Captures the minimum surface needed to
|
|
32
|
+
* re-hydrate a sub-session in the future — sub-session metadata plus the
|
|
33
|
+
* owning session's messages and optional summary.
|
|
34
|
+
*/
|
|
35
|
+
export interface ArchiveInput {
|
|
36
|
+
readonly subSessionId: SubSessionId;
|
|
37
|
+
/**
|
|
38
|
+
* The session the sub-session owns. Each sub-session wraps exactly one
|
|
39
|
+
* child {@link Session} (pattern doc §4.4); the archived bundle captures
|
|
40
|
+
* that session's messages and summary.
|
|
41
|
+
*/
|
|
42
|
+
readonly sessionId: SessionId;
|
|
43
|
+
readonly tenantId: TenantId;
|
|
44
|
+
/**
|
|
45
|
+
* Present when the sub-session had a provisioned workspace at archive
|
|
46
|
+
* time. Absent for sub-sessions that never materialized one (pattern doc
|
|
47
|
+
* §7.1 allows lazy workspace provisioning).
|
|
48
|
+
*/
|
|
49
|
+
readonly workspace?: WorkspaceRef;
|
|
50
|
+
readonly summaryRef?: SessionSummaryRef;
|
|
51
|
+
/**
|
|
52
|
+
* Full message log for the owning session. Captured at archive time;
|
|
53
|
+
* append-only discipline (pattern doc §13.4) means this is a complete
|
|
54
|
+
* snapshot, not a partial view.
|
|
55
|
+
*/
|
|
56
|
+
readonly messages: readonly SessionMessage[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Pluggable archival backend. Implementations MUST write atomically
|
|
60
|
+
* (Convention #8 — write-tmp-rename per file) and MUST produce a unique
|
|
61
|
+
* {@link ArchiveBackendRef} per call. Concurrent `store` calls with
|
|
62
|
+
* overlapping input are a caller error — the Manager serializes per
|
|
63
|
+
* sub-session.
|
|
64
|
+
*/
|
|
65
|
+
export interface ArchiveBackend {
|
|
66
|
+
/** Discriminator. Free-form; reference impl uses `'disk'`. */
|
|
67
|
+
readonly kind: string;
|
|
68
|
+
/**
|
|
69
|
+
* Persist the bundle. Returns the lookup ref consumers embed in the
|
|
70
|
+
* sub-session tombstone (§12.3). Must be atomic at the bundle level —
|
|
71
|
+
* post-success, a restore sees the full bundle or throws.
|
|
72
|
+
*/
|
|
73
|
+
store(input: ArchiveInput): Promise<ArchiveOutput>;
|
|
74
|
+
/**
|
|
75
|
+
* Reverse of {@link store}. Throws when the ref does not resolve or when
|
|
76
|
+
* the bundle is corrupt. Does NOT re-materialize the workspace on disk —
|
|
77
|
+
* callers decide whether to re-provision via a
|
|
78
|
+
* {@link WorkspaceBackendDriver}.
|
|
79
|
+
*/
|
|
80
|
+
restore(archiveRef: ArchiveBackendRef): Promise<ArchiveInput>;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The in-store marker a sub-session becomes after archival. Replaces the
|
|
84
|
+
* live record in-slot (see pattern doc §12.3): the sub-session's status
|
|
85
|
+
* flips to `'archived'` and `archiveRef` + `archivedAt` are attached. This
|
|
86
|
+
* way `SessionStore.drill` still finds it via the normal linkage path — the
|
|
87
|
+
* tombstone is navigable without a parallel index.
|
|
88
|
+
*
|
|
89
|
+
* Fields are a subset of {@link SubSession} — the identity columns plus the
|
|
90
|
+
* archive pointer — extracted here so consumers can destructure a tombstone
|
|
91
|
+
* view without carrying the full live-record shape.
|
|
92
|
+
*/
|
|
93
|
+
export interface SubSessionTombstone {
|
|
94
|
+
readonly subSessionId: SubSessionId;
|
|
95
|
+
readonly sessionId: SessionId;
|
|
96
|
+
readonly tenantId: TenantId;
|
|
97
|
+
readonly summaryRef?: SummaryId;
|
|
98
|
+
readonly archiveRef: ArchiveBackendRef;
|
|
99
|
+
readonly archivedAt: Date;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/session/retention/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAEjE;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAA;IACtC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAA;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,YAAY,CAAA;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;IACvC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;CAC5C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC9B,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAElD;;;;;OAKG;IACH,OAAO,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CAC7D;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAA;IACtC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAA;CACzB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArchiveBackend — pluggable archival contract. See session-hierarchy.md
|
|
3
|
+
* §12.3 Retention and Archival.
|
|
4
|
+
*
|
|
5
|
+
* Convention #10 (Provider abstraction): interface lives here; concrete
|
|
6
|
+
* implementations (disk, s3, glacier, …) live in sibling files. Phase 8 ships
|
|
7
|
+
* the reference disk impl (`disk-backend.ts`); production deployments plug
|
|
8
|
+
* their own over the same surface.
|
|
9
|
+
*
|
|
10
|
+
* Convention #9 (Registry + Manager + Store): {@link ArchivalManager} is the
|
|
11
|
+
* Manager; this `ArchiveBackend` is the Provider slot it drives; the live
|
|
12
|
+
* `SessionStore` is the Store it mutates.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../../src/session/retention/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DiskArchiveBackend — reference filesystem-backed {@link ArchiveBackend}.
|
|
3
|
+
*
|
|
4
|
+
* Convention #8 (atomic writes): every file lands via write-tmp-rename; the
|
|
5
|
+
* final `archive.json` marker is written LAST so a crash mid-bundle leaves
|
|
6
|
+
* the directory visible but UN-marked, and `restore` treats such a bundle
|
|
7
|
+
* as missing. This mirrors the Phase 5 materializer's "marker-last"
|
|
8
|
+
* invariant.
|
|
9
|
+
*
|
|
10
|
+
* Layout:
|
|
11
|
+
*
|
|
12
|
+
* {rootDir}/archive/{arc_<opaque>}/
|
|
13
|
+
* subsession.json # Identity + metadata
|
|
14
|
+
* summary.json # SessionSummaryRef (optional — present iff input.summaryRef)
|
|
15
|
+
* messages.jsonl # One SessionMessage per line (append-style, serialized once)
|
|
16
|
+
* workspace.json # WorkspaceRef (optional — present iff input.workspace)
|
|
17
|
+
* archive.json # Marker — final write; presence = bundle committed
|
|
18
|
+
*
|
|
19
|
+
* Workspace directory contents are NOT archived — we persist the
|
|
20
|
+
* {@link WorkspaceRef} only. The pattern doc §12.3 explicitly allows this:
|
|
21
|
+
* the ref is the re-hydration handle; the worktree itself is disposed at
|
|
22
|
+
* archive time via the caller's {@link WorkspaceBackendDriver}, not copied
|
|
23
|
+
* into the archive bundle. This is a Phase 8 interpretation — see the
|
|
24
|
+
* roadmap deliverable report for rationale (tar bundling deferred).
|
|
25
|
+
*
|
|
26
|
+
* See session-hierarchy.md §12.3.
|
|
27
|
+
*/
|
|
28
|
+
import type { ArchiveBackendRef } from './archive-backend-ref.js';
|
|
29
|
+
import type { ArchiveBackend, ArchiveInput, ArchiveOutput } from './backend.js';
|
|
30
|
+
/**
|
|
31
|
+
* Raised when {@link DiskArchiveBackend.restore} cannot resolve the supplied
|
|
32
|
+
* ref — either the directory is missing, or the `archive.json` marker is
|
|
33
|
+
* absent (crash-mid-write signal).
|
|
34
|
+
*/
|
|
35
|
+
export declare class ArchiveNotFoundError extends Error {
|
|
36
|
+
readonly details: {
|
|
37
|
+
archiveRef: ArchiveBackendRef;
|
|
38
|
+
reason: 'missing' | 'incomplete';
|
|
39
|
+
};
|
|
40
|
+
constructor(details: {
|
|
41
|
+
archiveRef: ArchiveBackendRef;
|
|
42
|
+
reason: 'missing' | 'incomplete';
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Config for {@link DiskArchiveBackend}. `rootDir` is absolute — bundles land
|
|
47
|
+
* under `{rootDir}/archive/`.
|
|
48
|
+
*/
|
|
49
|
+
export interface DiskArchiveBackendConfig {
|
|
50
|
+
readonly rootDir: string;
|
|
51
|
+
}
|
|
52
|
+
export declare class DiskArchiveBackend implements ArchiveBackend {
|
|
53
|
+
readonly kind = "disk";
|
|
54
|
+
private readonly rootDir;
|
|
55
|
+
constructor(config: DiskArchiveBackendConfig);
|
|
56
|
+
store(input: ArchiveInput): Promise<ArchiveOutput>;
|
|
57
|
+
restore(archiveRef: ArchiveBackendRef): Promise<ArchiveInput>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=disk-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disk-backend.d.ts","sourceRoot":"","sources":["../../../src/session/retention/disk-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE/E;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,OAAO,EAAE;QAAE,UAAU,EAAE,iBAAiB,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,YAAY,CAAA;KAAE,CAAA;gBAEzE,OAAO,EAAE;QAAE,UAAU,EAAE,iBAAiB,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,YAAY,CAAA;KAAE;CAKxF;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACxB;AA6BD,qBAAa,kBAAmB,YAAW,cAAc;IACxD,QAAQ,CAAC,IAAI,UAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;gBAEpB,MAAM,EAAE,wBAAwB;IAItC,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAsDlD,OAAO,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;CA4DnE"}
|