@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 @@
|
|
|
1
|
+
{"version":3,"file":"prev-artifact.js","sourceRoot":"","sources":["../../../src/session/intervention/prev-artifact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAqBH;;;;GAIG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACtC,OAAO,CAGf;IAED,YAAY,OAGX;QACA,KAAK,CACJ,qCAAqC,OAAO,CAAC,iBAAiB,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACnG,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAC1C,OAAO,CAIf;IAED,YAAY,OAAqE;QAChF,KAAK,CACJ,4BAA4B,OAAO,CAAC,KAAK,kBAAkB,OAAO,CAAC,KAAK,OAAO,OAAO,CAAC,YAAY,EAAE,CACrG,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAkBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,MAA+B,EAC/B,aAA2B,EAC3B,iBAAiC,EACjC,QAAgB;IAEhB,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,yBAAyB,CAAC;YACnC,YAAY,EAAE,aAAa;YAC3B,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,QAAQ;SACf,CAAC,CAAA;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,iBAAiB,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAClD,OAAO,EAAE,CAAA;IACV,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAe,CAAC,aAAa,CAAC,CAAC,CAAA;IACtD,MAAM,KAAK,GAAmB,EAAE,CAAA;IAEhC,IAAI,UAAU,GAA+B,iBAAiB,CAAA;IAE9D,OAAO,UAAU,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,UAAU,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC3C,+CAA+C;YAC/C,OAAO,KAAK,CAAA;QACb,CAAC;QAED,wEAAwE;QACxE,kEAAkE;QAClE,wEAAwE;QACxE,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QACpE,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,mEAAmE;YACnE,yCAAyC;YACzC,OAAO,KAAK,CAAA;QACb,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,qBAAqB,CAAC;gBAC/B,iBAAiB,EAAE,aAAa;gBAChC,SAAS,EAAE,CAAC,GAAG,KAAK,EAAE,YAAY,CAAC,YAAY,CAAC;aAChD,CAAC,CAAA;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;QACtC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;QAErC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,yBAAyB,CAAC;gBACnC,YAAY,EAAE,aAAa;gBAC3B,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,KAAK,EAAE,QAAQ;aACf,CAAC,CAAA;QACH,CAAC;QAED,UAAU,GAAG,YAAY,CAAC,eAAe,CAAA;IAC1C,CAAC;IAED,OAAO,KAAK,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.test.d.ts","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/filesystem.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { chmod, mkdir, mkdtemp, readFile, rm, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { UNKNOWN_TENANT_ID } from '../../../types/ids/index.js';
|
|
6
|
+
import { FilesystemMigrationError } from '../errors.js';
|
|
7
|
+
import { DefaultFilesystemMigrator, LEGACY_DEFAULT_PROJECT_PREFIX, LEGACY_DEFAULT_SESSION_ID, MARKER_REL_PATH, MIGRATION_VERSION, } from '../filesystem.js';
|
|
8
|
+
import { acquireMigrationLock, writeMarker } from '../marker.js';
|
|
9
|
+
function collectingSink() {
|
|
10
|
+
const events = [];
|
|
11
|
+
return {
|
|
12
|
+
events,
|
|
13
|
+
sink: {
|
|
14
|
+
emit(ev) {
|
|
15
|
+
events.push(ev);
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
async function seedLegacyThread(root, thread, runs) {
|
|
21
|
+
for (const run of runs) {
|
|
22
|
+
const dir = join(root, 'threads', thread, 'runs', run);
|
|
23
|
+
await mkdir(dir, { recursive: true });
|
|
24
|
+
await writeFile(join(dir, 'run.json'), JSON.stringify({ id: run }), 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function pathExists(p) {
|
|
28
|
+
try {
|
|
29
|
+
await stat(p);
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
describe('DefaultFilesystemMigrator.migrate', () => {
|
|
37
|
+
let root;
|
|
38
|
+
beforeEach(async () => {
|
|
39
|
+
root = await mkdtemp(join(tmpdir(), 'namzu-fsmig-'));
|
|
40
|
+
});
|
|
41
|
+
afterEach(async () => {
|
|
42
|
+
// chmod first in case a test left 000 perms on a directory.
|
|
43
|
+
await chmod(root, 0o755).catch(() => undefined);
|
|
44
|
+
await rm(root, { recursive: true, force: true });
|
|
45
|
+
});
|
|
46
|
+
it('cold boot with a single legacy thread: migrates, emits event, writes marker', async () => {
|
|
47
|
+
await seedLegacyThread(root, 'thd_abc', ['run_xyz']);
|
|
48
|
+
const { events, sink } = collectingSink();
|
|
49
|
+
const migrator = new DefaultFilesystemMigrator(sink);
|
|
50
|
+
const result = await migrator.migrate(root);
|
|
51
|
+
expect(result.kind).toBe('migrated');
|
|
52
|
+
expect(result.migratedThreads).toEqual([
|
|
53
|
+
{ legacyThreadId: 'thd_abc', newProjectId: `${LEGACY_DEFAULT_PROJECT_PREFIX}abc` },
|
|
54
|
+
]);
|
|
55
|
+
// New layout exists.
|
|
56
|
+
const newRunDir = join(root, 'projects', `${LEGACY_DEFAULT_PROJECT_PREFIX}abc`, 'sessions', LEGACY_DEFAULT_SESSION_ID, 'runs', 'run_xyz');
|
|
57
|
+
expect(await pathExists(newRunDir)).toBe(true);
|
|
58
|
+
expect(await pathExists(join(newRunDir, 'run.json'))).toBe(true);
|
|
59
|
+
// Legacy path moved (runs/ sub-tree renamed).
|
|
60
|
+
expect(await pathExists(join(root, 'threads', 'thd_abc', 'runs'))).toBe(false);
|
|
61
|
+
// Marker landed.
|
|
62
|
+
const markerRaw = await readFile(join(root, MARKER_REL_PATH), 'utf-8');
|
|
63
|
+
const markerParsed = JSON.parse(markerRaw);
|
|
64
|
+
expect(markerParsed.version).toBe(MIGRATION_VERSION);
|
|
65
|
+
expect(markerParsed.migratedThreads).toHaveLength(1);
|
|
66
|
+
// Event emitted with accurate result.
|
|
67
|
+
expect(events).toHaveLength(1);
|
|
68
|
+
expect(events[0]?.type).toBe('filesystem.migrated');
|
|
69
|
+
expect(events[0]?.result.kind).toBe('migrated');
|
|
70
|
+
});
|
|
71
|
+
it('warm boot with an existing marker short-circuits to already_migrated', async () => {
|
|
72
|
+
await writeMarker(join(root, MARKER_REL_PATH), {
|
|
73
|
+
version: MIGRATION_VERSION,
|
|
74
|
+
at: new Date(),
|
|
75
|
+
migratedThreads: [],
|
|
76
|
+
});
|
|
77
|
+
await seedLegacyThread(root, 'thd_stillhere', ['run_ignored']);
|
|
78
|
+
const { events, sink } = collectingSink();
|
|
79
|
+
const migrator = new DefaultFilesystemMigrator(sink);
|
|
80
|
+
const result = await migrator.migrate(root);
|
|
81
|
+
expect(result.kind).toBe('already_migrated');
|
|
82
|
+
expect(events).toHaveLength(0);
|
|
83
|
+
// No migration happened — legacy path untouched.
|
|
84
|
+
expect(await pathExists(join(root, 'threads', 'thd_stillhere', 'runs', 'run_ignored'))).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
it('cold boot with neither legacy nor marker writes a marker and returns noop_no_legacy', async () => {
|
|
87
|
+
const { events, sink } = collectingSink();
|
|
88
|
+
const migrator = new DefaultFilesystemMigrator(sink);
|
|
89
|
+
const result = await migrator.migrate(root);
|
|
90
|
+
expect(result.kind).toBe('noop_no_legacy');
|
|
91
|
+
expect(events).toHaveLength(0);
|
|
92
|
+
expect(await pathExists(join(root, MARKER_REL_PATH))).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it('cooperates with a concurrent migrator: main marker lands → already_migrated', async () => {
|
|
95
|
+
await seedLegacyThread(root, 'thd_abc', ['run_1']);
|
|
96
|
+
// Pre-seed the tmp lock to simulate another boot mid-migration.
|
|
97
|
+
await acquireMigrationLock(join(root, '.migration', 'v0.2.0.tmp'));
|
|
98
|
+
// Now write the main marker as the "winner" would. The loser must
|
|
99
|
+
// see this on the re-check after waiting and return already_migrated.
|
|
100
|
+
await writeMarker(join(root, MARKER_REL_PATH), {
|
|
101
|
+
version: MIGRATION_VERSION,
|
|
102
|
+
at: new Date(),
|
|
103
|
+
migratedThreads: [
|
|
104
|
+
{ legacyThreadId: 'thd_abc', newProjectId: `${LEGACY_DEFAULT_PROJECT_PREFIX}abc` },
|
|
105
|
+
],
|
|
106
|
+
});
|
|
107
|
+
// Because readMarker is checked FIRST (before lock contention), this
|
|
108
|
+
// actually returns already_migrated on step 1. That is the correct
|
|
109
|
+
// semantics: the main marker is the single source of truth.
|
|
110
|
+
const migrator = new DefaultFilesystemMigrator();
|
|
111
|
+
const result = await migrator.migrate(root);
|
|
112
|
+
expect(result.kind).toBe('already_migrated');
|
|
113
|
+
});
|
|
114
|
+
it('migrates multiple legacy threads in one pass with marker listing all', async () => {
|
|
115
|
+
await seedLegacyThread(root, 'thd_a', ['run_a1', 'run_a2']);
|
|
116
|
+
await seedLegacyThread(root, 'thd_b', ['run_b1']);
|
|
117
|
+
await seedLegacyThread(root, 'thd_c', ['run_c1']);
|
|
118
|
+
const migrator = new DefaultFilesystemMigrator();
|
|
119
|
+
const result = await migrator.migrate(root);
|
|
120
|
+
expect(result.kind).toBe('migrated');
|
|
121
|
+
expect(result.migratedThreads).toHaveLength(3);
|
|
122
|
+
const ids = result.migratedThreads.map((m) => m.legacyThreadId).sort();
|
|
123
|
+
expect(ids).toEqual(['thd_a', 'thd_b', 'thd_c']);
|
|
124
|
+
// Marker content mirrors result.
|
|
125
|
+
const markerRaw = await readFile(join(root, MARKER_REL_PATH), 'utf-8');
|
|
126
|
+
const markerParsed = JSON.parse(markerRaw);
|
|
127
|
+
expect(markerParsed.migratedThreads).toHaveLength(3);
|
|
128
|
+
});
|
|
129
|
+
it('synthesized project.json has _legacy: true and tenantId: UNKNOWN_TENANT_ID', async () => {
|
|
130
|
+
await seedLegacyThread(root, 'thd_tenantcheck', ['run_0']);
|
|
131
|
+
const migrator = new DefaultFilesystemMigrator();
|
|
132
|
+
await migrator.migrate(root);
|
|
133
|
+
const projectJsonPath = join(root, 'projects', `${LEGACY_DEFAULT_PROJECT_PREFIX}tenantcheck`, 'project.json');
|
|
134
|
+
const parsed = JSON.parse(await readFile(projectJsonPath, 'utf-8'));
|
|
135
|
+
expect(parsed._legacy).toBe(true);
|
|
136
|
+
expect(parsed.tenantId).toBe(UNKNOWN_TENANT_ID);
|
|
137
|
+
expect(parsed.id).toBe(`${LEGACY_DEFAULT_PROJECT_PREFIX}tenantcheck`);
|
|
138
|
+
expect(parsed.config).toMatchObject({
|
|
139
|
+
maxDelegationDepth: 4,
|
|
140
|
+
maxDelegationWidth: 8,
|
|
141
|
+
maxInterventionDepth: 10,
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
it('synthesized session.json is idle and flagged _legacy', async () => {
|
|
145
|
+
await seedLegacyThread(root, 'thd_sescheck', ['run_0']);
|
|
146
|
+
const migrator = new DefaultFilesystemMigrator();
|
|
147
|
+
await migrator.migrate(root);
|
|
148
|
+
const sessionJsonPath = join(root, 'projects', `${LEGACY_DEFAULT_PROJECT_PREFIX}sescheck`, 'sessions', LEGACY_DEFAULT_SESSION_ID, 'session.json');
|
|
149
|
+
const parsed = JSON.parse(await readFile(sessionJsonPath, 'utf-8'));
|
|
150
|
+
expect(parsed.id).toBe(LEGACY_DEFAULT_SESSION_ID);
|
|
151
|
+
expect(parsed.status).toBe('idle');
|
|
152
|
+
expect(parsed.tenantId).toBe(UNKNOWN_TENANT_ID);
|
|
153
|
+
expect(parsed._legacy).toBe(true);
|
|
154
|
+
});
|
|
155
|
+
it('idempotent: two successive migrate() calls produce the same end-state', async () => {
|
|
156
|
+
await seedLegacyThread(root, 'thd_idem', ['run_1']);
|
|
157
|
+
const migrator = new DefaultFilesystemMigrator();
|
|
158
|
+
const first = await migrator.migrate(root);
|
|
159
|
+
const second = await migrator.migrate(root);
|
|
160
|
+
expect(first.kind).toBe('migrated');
|
|
161
|
+
expect(second.kind).toBe('already_migrated');
|
|
162
|
+
expect(second.migratedThreads).toHaveLength(0);
|
|
163
|
+
// End state still valid.
|
|
164
|
+
const newRunDir = join(root, 'projects', `${LEGACY_DEFAULT_PROJECT_PREFIX}idem`, 'sessions', LEGACY_DEFAULT_SESSION_ID, 'runs', 'run_1');
|
|
165
|
+
expect(await pathExists(newRunDir)).toBe(true);
|
|
166
|
+
});
|
|
167
|
+
it('error path: unwritable marker directory surfaces FilesystemMigrationError', async () => {
|
|
168
|
+
// Make the rootDir read-only so write_marker fails on the noop branch
|
|
169
|
+
// (simplest repro — no legacy threads needed).
|
|
170
|
+
await chmod(root, 0o555);
|
|
171
|
+
const migrator = new DefaultFilesystemMigrator();
|
|
172
|
+
try {
|
|
173
|
+
await migrator.migrate(root);
|
|
174
|
+
expect.fail('expected migrate() to throw');
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
expect(err).toBeInstanceOf(FilesystemMigrationError);
|
|
178
|
+
const details = err.details;
|
|
179
|
+
expect(details.op).toBe('write_marker');
|
|
180
|
+
expect(details.path).toContain('v0.2.0');
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
// restore perms so afterEach can clean up
|
|
184
|
+
await chmod(root, 0o755).catch(() => undefined);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
//# sourceMappingURL=filesystem.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.test.js","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/filesystem.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-prefix.test.d.ts","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/id-prefix.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import { NOOP_MIGRATION_WARNING_SINK, StalePrefixError, __resetSeenLegacyForTests, acceptLegacyThreadId, rejectLegacyPrefix, } from '../id-prefix.js';
|
|
3
|
+
function collectingSink() {
|
|
4
|
+
const emitted = [];
|
|
5
|
+
return {
|
|
6
|
+
emitted,
|
|
7
|
+
sink: {
|
|
8
|
+
emit(w) {
|
|
9
|
+
emitted.push(w);
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
describe('acceptLegacyThreadId', () => {
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
__resetSeenLegacyForTests();
|
|
17
|
+
});
|
|
18
|
+
it('coerces thd_* to prj_* and emits a warning on first encounter', () => {
|
|
19
|
+
const { emitted, sink } = collectingSink();
|
|
20
|
+
const result = acceptLegacyThreadId('thd_abc', sink);
|
|
21
|
+
expect(result).toBe('prj_abc');
|
|
22
|
+
expect(emitted).toHaveLength(1);
|
|
23
|
+
expect(emitted[0]?.kind).toBe('id_prefix_legacy_read');
|
|
24
|
+
expect(emitted[0]?.legacyId).toBe('thd_abc');
|
|
25
|
+
expect(emitted[0]?.normalizedId).toBe('prj_abc');
|
|
26
|
+
expect(emitted[0]?.emittedOncePerProcess).toBe(true);
|
|
27
|
+
expect(emitted[0]?.at).toBeInstanceOf(Date);
|
|
28
|
+
});
|
|
29
|
+
it('does NOT re-emit a warning for the same legacy id on a second call', () => {
|
|
30
|
+
const { emitted, sink } = collectingSink();
|
|
31
|
+
acceptLegacyThreadId('thd_abc', sink);
|
|
32
|
+
acceptLegacyThreadId('thd_abc', sink);
|
|
33
|
+
acceptLegacyThreadId('thd_abc', sink);
|
|
34
|
+
expect(emitted).toHaveLength(1);
|
|
35
|
+
});
|
|
36
|
+
it('emits distinct warnings for distinct legacy ids', () => {
|
|
37
|
+
const { emitted, sink } = collectingSink();
|
|
38
|
+
acceptLegacyThreadId('thd_abc', sink);
|
|
39
|
+
acceptLegacyThreadId('thd_xyz', sink);
|
|
40
|
+
expect(emitted).toHaveLength(2);
|
|
41
|
+
expect(emitted.map((w) => w.legacyId).sort()).toEqual(['thd_abc', 'thd_xyz']);
|
|
42
|
+
});
|
|
43
|
+
it('returns prj_* ids unchanged and emits no warning', () => {
|
|
44
|
+
const { emitted, sink } = collectingSink();
|
|
45
|
+
const result = acceptLegacyThreadId('prj_keepme', sink);
|
|
46
|
+
expect(result).toBe('prj_keepme');
|
|
47
|
+
expect(emitted).toHaveLength(0);
|
|
48
|
+
});
|
|
49
|
+
it('rejects unknown prefixes with StalePrefixError', () => {
|
|
50
|
+
const { sink } = collectingSink();
|
|
51
|
+
expect(() => acceptLegacyThreadId('xyz_nope', sink)).toThrowError(StalePrefixError);
|
|
52
|
+
});
|
|
53
|
+
it('StalePrefixError carries structured details for unknown prefixes', () => {
|
|
54
|
+
const { sink } = collectingSink();
|
|
55
|
+
try {
|
|
56
|
+
acceptLegacyThreadId('xyz_nope', sink);
|
|
57
|
+
expect.fail('expected throw');
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
expect(err).toBeInstanceOf(StalePrefixError);
|
|
61
|
+
expect(err.details.rawId).toBe('xyz_nope');
|
|
62
|
+
expect(err.details.kind).toBe('unknown_prefix');
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
it('NOOP_MIGRATION_WARNING_SINK swallows warnings without error', () => {
|
|
66
|
+
expect(() => acceptLegacyThreadId('thd_noop', NOOP_MIGRATION_WARNING_SINK)).not.toThrow();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('rejectLegacyPrefix', () => {
|
|
70
|
+
it('throws StalePrefixError for thd_* input', () => {
|
|
71
|
+
expect(() => rejectLegacyPrefix('thd_abc')).toThrowError(StalePrefixError);
|
|
72
|
+
});
|
|
73
|
+
it('accepts prj_* input without throwing', () => {
|
|
74
|
+
expect(() => rejectLegacyPrefix('prj_abc')).not.toThrow();
|
|
75
|
+
});
|
|
76
|
+
it('accepts non-thread prefixes without throwing (writer guard is scoped)', () => {
|
|
77
|
+
// The guard is specifically for thd_* re-emission; unrelated prefixes
|
|
78
|
+
// are a concern for their own parse functions.
|
|
79
|
+
expect(() => rejectLegacyPrefix('ses_abc')).not.toThrow();
|
|
80
|
+
expect(() => rejectLegacyPrefix('run_abc')).not.toThrow();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=id-prefix.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-prefix.test.js","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/id-prefix.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEzD,OAAO,EACN,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,GAClB,MAAM,iBAAiB,CAAA;AAGxB,SAAS,cAAc;IACtB,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,OAAO;QACN,OAAO;QACP,IAAI,EAAE;YACL,IAAI,CAAC,CAAC;gBACL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,CAAC;SACD;KACD,CAAA;AACF,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACf,yBAAyB,EAAE,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACxE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QAC1C,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAsB,CAAC,CAAA;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QACtD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC7E,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QAC1C,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QAC1C,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC/B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC3D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QAC1C,MAAM,MAAM,GAAG,oBAAoB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAyB,CAAC,CAAA;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC3E,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAA;QACjC,IAAI,CAAC;YACJ,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;YACtC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAA;YAC5C,MAAM,CAAE,GAAwB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAChE,MAAM,CAAE,GAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACtE,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC1F,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAChF,sEAAsE;QACtE,+CAA+C;QAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC1D,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.test.d.ts","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/marker.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { acquireMigrationLock, readMarker, releaseMigrationLock, writeMarker } from '../marker.js';
|
|
6
|
+
describe('migration marker I/O', () => {
|
|
7
|
+
let root;
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
root = await mkdtemp(join(tmpdir(), 'namzu-marker-'));
|
|
10
|
+
});
|
|
11
|
+
afterEach(async () => {
|
|
12
|
+
await rm(root, { recursive: true, force: true });
|
|
13
|
+
});
|
|
14
|
+
it('readMarker returns null when the file is missing', async () => {
|
|
15
|
+
const result = await readMarker(join(root, 'missing.json'));
|
|
16
|
+
expect(result).toBeNull();
|
|
17
|
+
});
|
|
18
|
+
it('readMarker parses a valid JSON marker', async () => {
|
|
19
|
+
const path = join(root, 'v0.2.0');
|
|
20
|
+
const at = new Date('2026-04-17T00:00:00.000Z');
|
|
21
|
+
await writeMarker(path, {
|
|
22
|
+
version: '0.2.0',
|
|
23
|
+
at,
|
|
24
|
+
migratedThreads: [{ legacyThreadId: 'thd_abc', newProjectId: 'prj_legacy_abc' }],
|
|
25
|
+
});
|
|
26
|
+
const result = await readMarker(path);
|
|
27
|
+
expect(result).not.toBeNull();
|
|
28
|
+
expect(result?.version).toBe('0.2.0');
|
|
29
|
+
expect(result?.at.toISOString()).toBe('2026-04-17T00:00:00.000Z');
|
|
30
|
+
expect(result?.migratedThreads).toEqual([
|
|
31
|
+
{ legacyThreadId: 'thd_abc', newProjectId: 'prj_legacy_abc' },
|
|
32
|
+
]);
|
|
33
|
+
});
|
|
34
|
+
it('readMarker returns null on corrupt JSON (retry-safe)', async () => {
|
|
35
|
+
const path = join(root, 'corrupt.json');
|
|
36
|
+
await writeFile(path, '{ not valid json', 'utf-8');
|
|
37
|
+
const result = await readMarker(path);
|
|
38
|
+
expect(result).toBeNull();
|
|
39
|
+
});
|
|
40
|
+
it('writeMarker atomically writes via tmp-rename (no partial content)', async () => {
|
|
41
|
+
const path = join(root, 'v0.2.0');
|
|
42
|
+
await writeMarker(path, {
|
|
43
|
+
version: '0.2.0',
|
|
44
|
+
at: new Date(),
|
|
45
|
+
migratedThreads: [],
|
|
46
|
+
});
|
|
47
|
+
const content = await readFile(path, 'utf-8');
|
|
48
|
+
const parsed = JSON.parse(content);
|
|
49
|
+
expect(parsed.version).toBe('0.2.0');
|
|
50
|
+
});
|
|
51
|
+
it('acquireMigrationLock succeeds on first call and throws EEXIST on the second', async () => {
|
|
52
|
+
const lockPath = join(root, 'v0.2.0.tmp');
|
|
53
|
+
await acquireMigrationLock(lockPath);
|
|
54
|
+
let caught = null;
|
|
55
|
+
try {
|
|
56
|
+
await acquireMigrationLock(lockPath);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
caught = err;
|
|
60
|
+
}
|
|
61
|
+
expect(caught).not.toBeNull();
|
|
62
|
+
expect(caught?.code).toBe('EEXIST');
|
|
63
|
+
});
|
|
64
|
+
it('releaseMigrationLock tolerates a missing file (idempotent)', async () => {
|
|
65
|
+
const lockPath = join(root, 'never-existed.tmp');
|
|
66
|
+
await expect(releaseMigrationLock(lockPath)).resolves.toBeUndefined();
|
|
67
|
+
});
|
|
68
|
+
it('releaseMigrationLock clears the lock so re-acquire succeeds', async () => {
|
|
69
|
+
const lockPath = join(root, 'v0.2.0.tmp');
|
|
70
|
+
await acquireMigrationLock(lockPath);
|
|
71
|
+
await releaseMigrationLock(lockPath);
|
|
72
|
+
await expect(acquireMigrationLock(lockPath)).resolves.toBeUndefined();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=marker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.test.js","sourceRoot":"","sources":["../../../../src/session/migration/__tests__/marker.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed errors for the migration module.
|
|
3
|
+
*
|
|
4
|
+
* See session-hierarchy.md §13.4.1. Structured `details` payload lets
|
|
5
|
+
* consumers route failures without string parsing (Convention #5: fail
|
|
6
|
+
* fast, surface cause, no silent swallowing).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Raised when any filesystem step during the boot-time v0.2.0 re-layout
|
|
10
|
+
* fails (enumerate, rename, synthesize project.json, write marker).
|
|
11
|
+
* `op` is a short stable tag so consumers can dashboard on failure mode;
|
|
12
|
+
* `cause` carries the underlying `Error` for stack preservation.
|
|
13
|
+
*/
|
|
14
|
+
export declare class FilesystemMigrationError extends Error {
|
|
15
|
+
readonly details: {
|
|
16
|
+
op: string;
|
|
17
|
+
path: string;
|
|
18
|
+
cause?: unknown;
|
|
19
|
+
};
|
|
20
|
+
constructor(details: {
|
|
21
|
+
op: string;
|
|
22
|
+
path: string;
|
|
23
|
+
cause?: unknown;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/session/migration/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IAClD,QAAQ,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;gBAEnD,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKlE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed errors for the migration module.
|
|
3
|
+
*
|
|
4
|
+
* See session-hierarchy.md §13.4.1. Structured `details` payload lets
|
|
5
|
+
* consumers route failures without string parsing (Convention #5: fail
|
|
6
|
+
* fast, surface cause, no silent swallowing).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Raised when any filesystem step during the boot-time v0.2.0 re-layout
|
|
10
|
+
* fails (enumerate, rename, synthesize project.json, write marker).
|
|
11
|
+
* `op` is a short stable tag so consumers can dashboard on failure mode;
|
|
12
|
+
* `cause` carries the underlying `Error` for stack preservation.
|
|
13
|
+
*/
|
|
14
|
+
export class FilesystemMigrationError extends Error {
|
|
15
|
+
details;
|
|
16
|
+
constructor(details) {
|
|
17
|
+
super(`Filesystem migration failed at ${details.op} on ${details.path}`);
|
|
18
|
+
this.name = 'FilesystemMigrationError';
|
|
19
|
+
this.details = details;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/session/migration/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;GAKG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACzC,OAAO,CAA+C;IAE/D,YAAY,OAAsD;QACjE,KAAK,CAAC,kCAAkC,OAAO,CAAC,EAAE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boot-time filesystem re-layout — `.namzu/threads/{thd_X}/` →
|
|
3
|
+
* `.namzu/projects/{prj_legacy_<X>}/sessions/ses_legacy_default/runs/...`.
|
|
4
|
+
*
|
|
5
|
+
* Trigger: first {@link RunContextFactory.build} call per process. The
|
|
6
|
+
* factory invokes {@link DefaultFilesystemMigrator.migrate} before resolving
|
|
7
|
+
* any path so legacy runs are never orphaned by the new layout.
|
|
8
|
+
*
|
|
9
|
+
* See session-hierarchy.md §13.4.1 for the detection / trigger / atomicity
|
|
10
|
+
* contract. Concurrency model:
|
|
11
|
+
*
|
|
12
|
+
* 1. Main marker present → short-circuit `already_migrated`. Idempotent.
|
|
13
|
+
* 2. Legacy `.namzu/threads/` absent → write the main marker and return
|
|
14
|
+
* `noop_no_legacy`. This plants the marker on fresh installs so the
|
|
15
|
+
* `threads/` detection branch is only ever entered once.
|
|
16
|
+
* 3. Legacy layout detected → acquire the `.tmp` lock via `wx`; on
|
|
17
|
+
* EEXIST another boot is mid-migration. The loser waits 100ms and
|
|
18
|
+
* re-checks the main marker — cooperating, not competing. Roadmap
|
|
19
|
+
* Risk #4 mitigation.
|
|
20
|
+
* 4. Per-legacy-thread: rename the whole `runs/` subtree in a single
|
|
21
|
+
* `fs.rename` call (cross-OS atomic on the same filesystem; different
|
|
22
|
+
* filesystems fall back to copy-then-unlink via Node's default — a
|
|
23
|
+
* known limitation documented below).
|
|
24
|
+
* 5. Synthesize `project.json` + `session.json` via write-tmp-rename
|
|
25
|
+
* (Convention #8) so partial crashes leave no half-serialised state.
|
|
26
|
+
* 6. Write main marker last — presence of the marker is the canonical
|
|
27
|
+
* "migration done" signal.
|
|
28
|
+
*
|
|
29
|
+
* Known limitations:
|
|
30
|
+
* - Cross-filesystem moves: Node's `fs.rename` rejects with `EXDEV` when
|
|
31
|
+
* source and target live on different filesystems. This migrator does
|
|
32
|
+
* NOT fall back to copy-then-unlink; the error surfaces as
|
|
33
|
+
* {@link FilesystemMigrationError} with op `'rename_runs'`. Consumers
|
|
34
|
+
* running `.namzu/threads` and `.namzu/projects` on different mounts
|
|
35
|
+
* must migrate manually (documented INTERP flag).
|
|
36
|
+
* - `UNKNOWN_TENANT_ID`: legacy threads have no tenant denormalisation on
|
|
37
|
+
* disk. The synthesised project.json carries the sentinel so consumers
|
|
38
|
+
* know these are legacy-rehomed and can either tag-then-retain or
|
|
39
|
+
* reject until a real tenant is assigned (policy is consumer-owned).
|
|
40
|
+
*/
|
|
41
|
+
import type { ProjectId, SessionId } from '../../types/session/ids.js';
|
|
42
|
+
/**
|
|
43
|
+
* Sentinel SessionId used for legacy pre-0.2.0 runs that pre-date the
|
|
44
|
+
* Session entity. Every migrated thread collapses into this single session
|
|
45
|
+
* so consumers can still address the runs through the new layout.
|
|
46
|
+
*/
|
|
47
|
+
export declare const LEGACY_DEFAULT_SESSION_ID: SessionId;
|
|
48
|
+
/** Prefix for projects synthesised from legacy `thd_*` folders. */
|
|
49
|
+
export declare const LEGACY_DEFAULT_PROJECT_PREFIX = "prj_legacy_";
|
|
50
|
+
/** Marker version string persisted at `.migration/v0.2.0`. */
|
|
51
|
+
export declare const MIGRATION_VERSION = "0.2.0";
|
|
52
|
+
/** Marker file path relative to rootDir. */
|
|
53
|
+
export declare const MARKER_REL_PATH: string;
|
|
54
|
+
/** In-flight lock file path relative to rootDir. */
|
|
55
|
+
export declare const LOCK_REL_PATH: string;
|
|
56
|
+
/**
|
|
57
|
+
* Result of a migration attempt. `kind` discriminates the three outcomes;
|
|
58
|
+
* `migratedThreads` is only non-empty for `kind: 'migrated'`. Sinks and
|
|
59
|
+
* callers can switch on `kind` without string parsing.
|
|
60
|
+
*/
|
|
61
|
+
export interface FilesystemMigrationResult {
|
|
62
|
+
kind: 'migrated' | 'already_migrated' | 'noop_no_legacy';
|
|
63
|
+
migratedThreads: readonly {
|
|
64
|
+
legacyThreadId: string;
|
|
65
|
+
newProjectId: ProjectId;
|
|
66
|
+
}[];
|
|
67
|
+
markerPath: string;
|
|
68
|
+
at: Date;
|
|
69
|
+
}
|
|
70
|
+
/** Event emitted on successful migration (`kind === 'migrated'` only). */
|
|
71
|
+
export interface FilesystemMigrationEvent {
|
|
72
|
+
type: 'filesystem.migrated';
|
|
73
|
+
result: FilesystemMigrationResult;
|
|
74
|
+
}
|
|
75
|
+
/** Sink contract — one `emit` method. */
|
|
76
|
+
export interface FilesystemMigrationSink {
|
|
77
|
+
emit(event: FilesystemMigrationEvent): void;
|
|
78
|
+
}
|
|
79
|
+
export declare const NOOP_FILESYSTEM_MIGRATION_SINK: FilesystemMigrationSink;
|
|
80
|
+
/** Interface so consumers can inject a stub migrator in tests. */
|
|
81
|
+
export interface FilesystemMigrator {
|
|
82
|
+
migrate(rootDir: string): Promise<FilesystemMigrationResult>;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Default implementation. Migration is driven by the contract documented in
|
|
86
|
+
* the module header — readers should trace concerns to this comment rather
|
|
87
|
+
* than re-deriving from code.
|
|
88
|
+
*/
|
|
89
|
+
export declare class DefaultFilesystemMigrator implements FilesystemMigrator {
|
|
90
|
+
private readonly sink;
|
|
91
|
+
constructor(sink?: FilesystemMigrationSink);
|
|
92
|
+
migrate(rootDir: string): Promise<FilesystemMigrationResult>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../src/session/migration/filesystem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAItE;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAA2B,SAAS,CAAA;AAE1E,mEAAmE;AACnE,eAAO,MAAM,6BAA6B,gBAAgB,CAAA;AAE1D,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,UAAU,CAAA;AAExC,4CAA4C;AAC5C,eAAO,MAAM,eAAe,QAA+B,CAAA;AAE3D,oDAAoD;AACpD,eAAO,MAAM,aAAa,QAAmC,CAAA;AAK7D;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACzC,IAAI,EAAE,UAAU,GAAG,kBAAkB,GAAG,gBAAgB,CAAA;IACxD,eAAe,EAAE,SAAS;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,SAAS,CAAA;KAAE,EAAE,CAAA;IAC/E,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,IAAI,CAAA;CACR;AAED,0EAA0E;AAC1E,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,MAAM,EAAE,yBAAyB,CAAA;CACjC;AAED,yCAAyC;AACzC,MAAM,WAAW,uBAAuB;IACvC,IAAI,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI,CAAA;CAC3C;AAED,eAAO,MAAM,8BAA8B,EAAE,uBAE5C,CAAA;AAED,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IAClC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAA;CAC5D;AAyCD;;;;GAIG;AACH,qBAAa,yBAA0B,YAAW,kBAAkB;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,GAAE,uBAAwD;IAErF,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;CA0NlE"}
|