@namzu/sdk 0.2.0 → 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 +53 -2
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +3 -2
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +5 -2
- 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/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 +4 -3
- 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/contracts/api.d.ts +6 -38
- 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 -5
- 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/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/manager/agent/__tests__/lifecycle.test.js +27 -13
- package/dist/manager/agent/__tests__/lifecycle.test.js.map +1 -1
- package/dist/manager/agent/lifecycle.d.ts +9 -0
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +93 -31
- 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 +3 -1
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +5 -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/runtime/query/__tests__/context.test.js +8 -7
- package/dist/runtime/query/__tests__/context.test.js.map +1 -1
- 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 +12 -21
- package/dist/runtime/query/context.d.ts.map +1 -1
- package/dist/runtime/query/context.js +3 -1
- package/dist/runtime/query/context.js.map +1 -1
- package/dist/runtime/query/index.d.ts +13 -15
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +1 -0
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/session/__tests__/integration/_fixtures.d.ts +11 -4
- package/dist/session/__tests__/integration/_fixtures.d.ts.map +1 -1
- package/dist/session/__tests__/integration/_fixtures.js +23 -6
- package/dist/session/__tests__/integration/_fixtures.js.map +1 -1
- 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.js +13 -6
- package/dist/session/__tests__/integration/capacity-caps.test.js.map +1 -1
- package/dist/session/__tests__/integration/e2e-spawn.test.js +14 -2
- package/dist/session/__tests__/integration/e2e-spawn.test.js.map +1 -1
- package/dist/session/__tests__/integration/event-stream-ordering.test.js +14 -7
- package/dist/session/__tests__/integration/event-stream-ordering.test.js.map +1 -1
- package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js +26 -14
- package/dist/session/__tests__/integration/handoff-broadcast-e2e.test.js.map +1 -1
- package/dist/session/__tests__/integration/handoff-illegal-transition.test.js +30 -20
- package/dist/session/__tests__/integration/handoff-illegal-transition.test.js.map +1 -1
- package/dist/session/__tests__/integration/handoff-single-e2e.test.js +25 -9
- package/dist/session/__tests__/integration/handoff-single-e2e.test.js.map +1 -1
- package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js +11 -10
- package/dist/session/__tests__/integration/hierarchy-lifecycle.test.js.map +1 -1
- package/dist/session/__tests__/integration/prev-artifact-dag.test.js +5 -4
- package/dist/session/__tests__/integration/prev-artifact-dag.test.js.map +1 -1
- package/dist/session/__tests__/integration/retention-archive.test.js +3 -2
- package/dist/session/__tests__/integration/retention-archive.test.js.map +1 -1
- 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.js +2 -1
- package/dist/session/__tests__/integration/summary-materialization-e2e.test.js.map +1 -1
- package/dist/session/__tests__/integration/tenant-isolation.test.js +14 -5
- package/dist/session/__tests__/integration/tenant-isolation.test.js.map +1 -1
- package/dist/session/errors.d.ts +79 -0
- package/dist/session/errors.d.ts.map +1 -1
- package/dist/session/errors.js +57 -0
- package/dist/session/errors.js.map +1 -1
- package/dist/session/handoff/__tests__/broadcast.test.js +49 -31
- package/dist/session/handoff/__tests__/broadcast.test.js.map +1 -1
- package/dist/session/handoff/__tests__/capacity.test.js +21 -18
- package/dist/session/handoff/__tests__/capacity.test.js.map +1 -1
- package/dist/session/handoff/__tests__/single.test.js +39 -30
- package/dist/session/handoff/__tests__/single.test.js.map +1 -1
- package/dist/session/handoff/assignment.d.ts +13 -1
- package/dist/session/handoff/assignment.d.ts.map +1 -1
- package/dist/session/handoff/broadcast.d.ts +7 -0
- package/dist/session/handoff/broadcast.d.ts.map +1 -1
- package/dist/session/handoff/broadcast.js +16 -1
- package/dist/session/handoff/broadcast.js.map +1 -1
- package/dist/session/handoff/single.d.ts +7 -0
- package/dist/session/handoff/single.d.ts.map +1 -1
- package/dist/session/handoff/single.js +13 -1
- package/dist/session/handoff/single.js.map +1 -1
- package/dist/session/hierarchy/__tests__/session.test.js +2 -0
- package/dist/session/hierarchy/__tests__/session.test.js.map +1 -1
- package/dist/session/hierarchy/index.d.ts +1 -0
- package/dist/session/hierarchy/index.d.ts.map +1 -1
- package/dist/session/hierarchy/index.js.map +1 -1
- package/dist/session/hierarchy/session.d.ts +15 -3
- package/dist/session/hierarchy/session.d.ts.map +1 -1
- package/dist/session/hierarchy/session.js.map +1 -1
- 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/migration/id-prefix.d.ts +8 -13
- package/dist/session/migration/id-prefix.d.ts.map +1 -1
- package/dist/session/migration/id-prefix.js +8 -13
- package/dist/session/migration/id-prefix.js.map +1 -1
- package/dist/session/retention/__tests__/archive.test.js +3 -2
- package/dist/session/retention/__tests__/archive.test.js.map +1 -1
- package/dist/session/summary/__tests__/materialize.test.js +4 -3
- package/dist/session/summary/__tests__/materialize.test.js.map +1 -1
- 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.js +32 -5
- package/dist/store/session/__tests__/disk.test.js.map +1 -1
- package/dist/store/session/__tests__/memory.test.js +50 -9
- package/dist/store/session/__tests__/memory.test.js.map +1 -1
- package/dist/store/session/disk.d.ts +2 -1
- package/dist/store/session/disk.d.ts.map +1 -1
- package/dist/store/session/disk.js +61 -0
- package/dist/store/session/disk.js.map +1 -1
- package/dist/store/session/index.d.ts.map +1 -1
- package/dist/store/session/index.js +3 -4
- package/dist/store/session/index.js.map +1 -1
- package/dist/store/session/memory.d.ts +2 -1
- package/dist/store/session/memory.d.ts.map +1 -1
- package/dist/store/session/memory.js +13 -0
- package/dist/store/session/memory.js.map +1 -1
- 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/types/agent/base.d.ts +17 -21
- 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 +18 -11
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/ids/index.d.ts +5 -9
- package/dist/types/ids/index.d.ts.map +1 -1
- package/dist/types/ids/index.js +4 -4
- package/dist/types/ids/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 +6 -5
- package/dist/types/run/config.d.ts.map +1 -1
- package/dist/types/run/metadata.d.ts +5 -18
- package/dist/types/run/metadata.d.ts.map +1 -1
- package/dist/types/session/ids.d.ts +4 -13
- package/dist/types/session/ids.d.ts.map +1 -1
- package/dist/types/session/ids.js +3 -6
- package/dist/types/session/ids.js.map +1 -1
- package/dist/types/session/index.d.ts +1 -1
- package/dist/types/session/index.d.ts.map +1 -1
- package/dist/types/session/store.d.ts +32 -10
- package/dist/types/session/store.d.ts.map +1 -1
- package/dist/types/session/store.js +3 -8
- package/dist/types/session/store.js.map +1 -1
- 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 +1 -12
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +3 -23
- package/dist/utils/id.js.map +1 -1
- package/package.json +6 -11
- package/src/agents/ReactiveAgent.ts +3 -2
- package/src/agents/SupervisorAgent.ts +5 -2
- package/src/bridge/a2a/index.ts +0 -1
- package/src/bridge/a2a/message.ts +0 -32
- package/src/bridge/a2a/task.ts +8 -7
- package/src/contracts/api.ts +6 -42
- package/src/contracts/ids.ts +1 -1
- package/src/contracts/index.ts +2 -8
- package/src/contracts/schemas.ts +1 -8
- package/src/index.ts +0 -4
- package/src/manager/agent/__tests__/lifecycle.test.ts +34 -13
- package/src/manager/agent/lifecycle.ts +114 -35
- package/src/manager/index.ts +3 -0
- package/src/manager/run/persistence.ts +7 -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/runtime/query/__tests__/context.test.ts +9 -8
- package/src/runtime/query/context-cache.ts +4 -4
- package/src/runtime/query/context.ts +15 -22
- package/src/runtime/query/index.ts +15 -16
- package/src/session/__tests__/integration/_fixtures.ts +36 -8
- package/src/session/__tests__/integration/archive-gate.test.ts +288 -0
- package/src/session/__tests__/integration/capacity-caps.test.ts +13 -6
- package/src/session/__tests__/integration/e2e-spawn.test.ts +20 -2
- package/src/session/__tests__/integration/event-stream-ordering.test.ts +14 -7
- package/src/session/__tests__/integration/handoff-broadcast-e2e.test.ts +39 -13
- package/src/session/__tests__/integration/handoff-illegal-transition.test.ts +54 -19
- package/src/session/__tests__/integration/handoff-single-e2e.test.ts +40 -9
- package/src/session/__tests__/integration/hierarchy-lifecycle.test.ts +13 -10
- package/src/session/__tests__/integration/prev-artifact-dag.test.ts +12 -5
- package/src/session/__tests__/integration/retention-archive.test.ts +5 -3
- package/src/session/__tests__/integration/spawn-rollback.test.ts +313 -0
- package/src/session/__tests__/integration/summary-materialization-e2e.test.ts +4 -2
- package/src/session/__tests__/integration/tenant-isolation.test.ts +16 -6
- package/src/session/errors.ts +89 -0
- package/src/session/handoff/__tests__/broadcast.test.ts +56 -28
- package/src/session/handoff/__tests__/capacity.test.ts +26 -20
- package/src/session/handoff/__tests__/single.test.ts +45 -28
- package/src/session/handoff/assignment.ts +13 -1
- package/src/session/handoff/broadcast.ts +26 -1
- package/src/session/handoff/single.ts +23 -1
- package/src/session/hierarchy/__tests__/session.test.ts +9 -1
- package/src/session/hierarchy/index.ts +1 -0
- package/src/session/hierarchy/session.ts +15 -3
- package/src/session/hierarchy/thread.ts +55 -0
- package/src/session/migration/id-prefix.ts +8 -13
- package/src/session/retention/__tests__/archive.test.ts +5 -3
- package/src/session/summary/__tests__/materialize.test.ts +6 -4
- package/src/store/index.ts +0 -3
- package/src/store/session/__tests__/disk.test.ts +57 -6
- package/src/store/session/__tests__/memory.test.ts +84 -9
- package/src/store/session/disk.ts +57 -1
- package/src/store/session/index.ts +3 -4
- package/src/store/session/memory.ts +13 -1
- 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 +17 -21
- package/src/types/agent/factory.ts +8 -3
- package/src/types/agent/task.ts +19 -11
- package/src/types/ids/index.ts +8 -15
- package/src/types/rag/retrieval.ts +4 -3
- package/src/types/run/config.ts +6 -5
- package/src/types/run/metadata.ts +5 -18
- package/src/types/session/ids.ts +4 -15
- package/src/types/session/index.ts +1 -2
- package/src/types/session/store.ts +34 -11
- package/src/types/thread/index.ts +5 -0
- package/src/types/thread/store.ts +92 -0
- package/src/utils/id.ts +3 -24
- package/dist/store/conversation/memory.d.ts +0 -43
- package/dist/store/conversation/memory.d.ts.map +0 -1
- package/dist/store/conversation/memory.js +0 -108
- package/dist/store/conversation/memory.js.map +0 -1
- package/dist/types/conversation/index.d.ts +0 -14
- 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 -144
- package/src/types/conversation/index.ts +0 -15
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration — AgentManager.provisionSpawn compensating rollback.
|
|
3
|
+
*
|
|
4
|
+
* Covers Codex SPAWN-ROLLBACK critique (ses_001-hierarchy-redesign Phase 2
|
|
5
|
+
* adversarial review, 2026-04-18). Without the try/catch wrapper around the
|
|
6
|
+
* createSession → updateSession → createSubSession → workspace.create
|
|
7
|
+
* mutation block, a failure after createSession leaves an `active` child
|
|
8
|
+
* session with no subsession edge — invisible to the parent, but counted
|
|
9
|
+
* against `maxDelegationWidth` and visible to SessionStore.listSessions
|
|
10
|
+
* consumers (archive/delete flows in ThreadManager).
|
|
11
|
+
*
|
|
12
|
+
* Failure modes exercised:
|
|
13
|
+
* A. Workspace driver throws on create. Subsession exists; must flip to
|
|
14
|
+
* 'failed' for audit. Child session must be hard-deleted.
|
|
15
|
+
* B. Subsession insert fails (store injection). No subsession recorded.
|
|
16
|
+
* Child session must be hard-deleted.
|
|
17
|
+
*
|
|
18
|
+
* Assertions in both cases:
|
|
19
|
+
* - sendMessage rejects with the underlying error.
|
|
20
|
+
* - SessionStore.listSessions(threadId) returns no row with the child id.
|
|
21
|
+
* - Parent session remains untouched (status, currentActor).
|
|
22
|
+
* - Fan-out cap reclaims the slot (next spawn succeeds up to the same
|
|
23
|
+
* width).
|
|
24
|
+
*/
|
|
25
|
+
import { describe, expect, it } from 'vitest';
|
|
26
|
+
import { EMPTY_TOKEN_USAGE } from '../../../constants/limits.js';
|
|
27
|
+
import { AgentManager } from '../../../manager/agent/lifecycle.js';
|
|
28
|
+
import { ThreadManager } from '../../../manager/thread/lifecycle.js';
|
|
29
|
+
import { AgentRegistry } from '../../../registry/agent/definitions.js';
|
|
30
|
+
import { InMemorySessionStore } from '../../../store/session/memory.js';
|
|
31
|
+
import { InMemoryThreadStore } from '../../../store/thread/memory.js';
|
|
32
|
+
import { createAssistantMessage } from '../../../types/message/index.js';
|
|
33
|
+
import { ZERO_COST } from '../../../utils/cost.js';
|
|
34
|
+
import { DefaultCapacityValidator } from '../../handoff/capacity.js';
|
|
35
|
+
import { SessionSummaryMaterializer } from '../../summary/materialize.js';
|
|
36
|
+
import { WorkspaceBackendRegistry } from '../../workspace/registry.js';
|
|
37
|
+
const tenant = 'tnt_alpha';
|
|
38
|
+
const capabilities = {
|
|
39
|
+
supportsTools: false,
|
|
40
|
+
supportsStreaming: false,
|
|
41
|
+
supportsConcurrency: false,
|
|
42
|
+
supportsSubAgents: false,
|
|
43
|
+
};
|
|
44
|
+
function buildAgent(id) {
|
|
45
|
+
return {
|
|
46
|
+
type: 'reactive',
|
|
47
|
+
metadata: {
|
|
48
|
+
type: 'reactive',
|
|
49
|
+
id,
|
|
50
|
+
name: id,
|
|
51
|
+
version: '1.0.0',
|
|
52
|
+
category: 'test',
|
|
53
|
+
description: id,
|
|
54
|
+
capabilities,
|
|
55
|
+
},
|
|
56
|
+
run: async (_input, _config) => ({
|
|
57
|
+
runId: 'run_child',
|
|
58
|
+
status: 'completed',
|
|
59
|
+
usage: { ...EMPTY_TOKEN_USAGE },
|
|
60
|
+
cost: { ...ZERO_COST },
|
|
61
|
+
iterations: 1,
|
|
62
|
+
durationMs: 1,
|
|
63
|
+
messages: [createAssistantMessage('child did the work')],
|
|
64
|
+
result: 'child did the work',
|
|
65
|
+
}),
|
|
66
|
+
cancel: async () => undefined,
|
|
67
|
+
getCapabilities: () => capabilities,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function buildDefinition(agent) {
|
|
71
|
+
return {
|
|
72
|
+
info: {
|
|
73
|
+
id: agent.metadata.id,
|
|
74
|
+
name: agent.metadata.name,
|
|
75
|
+
version: agent.metadata.version,
|
|
76
|
+
category: agent.metadata.category,
|
|
77
|
+
description: agent.metadata.description,
|
|
78
|
+
tools: [],
|
|
79
|
+
defaults: { model: 'test', tokenBudget: 1_000 },
|
|
80
|
+
},
|
|
81
|
+
typedAgent: agent,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
class FailingWorkspaceDriver {
|
|
85
|
+
kind = 'git-worktree';
|
|
86
|
+
createCalls = 0;
|
|
87
|
+
async create(_params) {
|
|
88
|
+
this.createCalls += 1;
|
|
89
|
+
throw new Error('synthetic workspace backend failure');
|
|
90
|
+
}
|
|
91
|
+
async branch(_source, _params) {
|
|
92
|
+
throw new Error('unused in this test');
|
|
93
|
+
}
|
|
94
|
+
async dispose(_ref) {
|
|
95
|
+
/* no-op */
|
|
96
|
+
}
|
|
97
|
+
async inspect(_ref) {
|
|
98
|
+
throw new Error('unused in this test');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
describe('provisionSpawn compensating rollback', () => {
|
|
102
|
+
it('workspace driver failure — deletes child session, marks subsession failed, leaves no orphan', async () => {
|
|
103
|
+
const store = new InMemorySessionStore();
|
|
104
|
+
const threadStore = new InMemoryThreadStore();
|
|
105
|
+
const project = await store.createProject({ tenantId: tenant, name: 'rollback-project' }, tenant);
|
|
106
|
+
const thread = await threadStore.createThread({ projectId: project.id, title: 'rollback-topic' }, tenant);
|
|
107
|
+
const userActor = {
|
|
108
|
+
kind: 'user',
|
|
109
|
+
userId: 'usr_root',
|
|
110
|
+
tenantId: tenant,
|
|
111
|
+
};
|
|
112
|
+
const parentSession = await store.createSession({ threadId: thread.id, projectId: project.id, currentActor: userActor }, tenant);
|
|
113
|
+
await store.updateSession({ ...parentSession, status: 'active' }, tenant);
|
|
114
|
+
let summaryCounter = 0;
|
|
115
|
+
const materializer = new SessionSummaryMaterializer({
|
|
116
|
+
store,
|
|
117
|
+
generateSummaryId: () => `sum_test_${++summaryCounter}`,
|
|
118
|
+
});
|
|
119
|
+
const registry = new AgentRegistry();
|
|
120
|
+
registry.register(buildDefinition(buildAgent('worker')));
|
|
121
|
+
const workspaceRegistry = new WorkspaceBackendRegistry();
|
|
122
|
+
const failingDriver = new FailingWorkspaceDriver();
|
|
123
|
+
workspaceRegistry.register(failingDriver);
|
|
124
|
+
const threadManager = new ThreadManager({ threadStore, sessionStore: store });
|
|
125
|
+
const manager = new AgentManager(registry, undefined, {
|
|
126
|
+
sessionStore: store,
|
|
127
|
+
summaryMaterializer: materializer,
|
|
128
|
+
workspaceRegistry,
|
|
129
|
+
capacity: new DefaultCapacityValidator(store),
|
|
130
|
+
threadManager,
|
|
131
|
+
});
|
|
132
|
+
const taskContext = {
|
|
133
|
+
parentRunId: 'run_parent',
|
|
134
|
+
parentAgentId: 'supervisor',
|
|
135
|
+
parentAbortController: new AbortController(),
|
|
136
|
+
depth: 0,
|
|
137
|
+
budgetTracker: { total: 100_000, remaining: 100_000 },
|
|
138
|
+
tenantId: tenant,
|
|
139
|
+
threadId: thread.id,
|
|
140
|
+
sessionId: parentSession.id,
|
|
141
|
+
projectId: project.id,
|
|
142
|
+
parentActor: userActor,
|
|
143
|
+
};
|
|
144
|
+
const options = {
|
|
145
|
+
agentId: 'worker',
|
|
146
|
+
input: { messages: [], workingDirectory: '/tmp' },
|
|
147
|
+
parentSessionId: parentSession.id,
|
|
148
|
+
tenantId: tenant,
|
|
149
|
+
projectId: project.id,
|
|
150
|
+
parentActor: userActor,
|
|
151
|
+
workspaceBackend: 'git-worktree',
|
|
152
|
+
};
|
|
153
|
+
await expect(manager.sendMessage(options, taskContext)).rejects.toThrow('synthetic workspace backend failure');
|
|
154
|
+
expect(failingDriver.createCalls).toBe(1);
|
|
155
|
+
// Child session is gone — archive/delete flows and fan-out caps see
|
|
156
|
+
// zero child attached to the thread beyond the parent.
|
|
157
|
+
const sessionsOnThread = await store.listSessions(thread.id, tenant);
|
|
158
|
+
expect(sessionsOnThread.map((s) => s.id)).toEqual([parentSession.id]);
|
|
159
|
+
// Parent session is untouched.
|
|
160
|
+
const refetchedParent = await store.getSession(parentSession.id, tenant);
|
|
161
|
+
expect(refetchedParent?.status).toBe('active');
|
|
162
|
+
expect(refetchedParent?.currentActor).toEqual(userActor);
|
|
163
|
+
// No subsession breadcrumb — `subsession_spawned` never fired
|
|
164
|
+
// (provisionSpawn aborted before buildSpawnRecord), so nothing is
|
|
165
|
+
// expecting an audit row. Leaving a `status: 'failed'` record would
|
|
166
|
+
// dangle with no corresponding emission.
|
|
167
|
+
const subsessions = await store.getChildren(parentSession.id, tenant);
|
|
168
|
+
expect(subsessions).toHaveLength(0);
|
|
169
|
+
});
|
|
170
|
+
it('repeated rollback does not accumulate orphan sessions or subsessions', async () => {
|
|
171
|
+
const store = new InMemorySessionStore();
|
|
172
|
+
const threadStore = new InMemoryThreadStore();
|
|
173
|
+
const project = await store.createProject({
|
|
174
|
+
tenantId: tenant,
|
|
175
|
+
name: 'rollback-repeat-project',
|
|
176
|
+
}, tenant);
|
|
177
|
+
const thread = await threadStore.createThread({ projectId: project.id, title: 'rollback-width-topic' }, tenant);
|
|
178
|
+
const userActor = {
|
|
179
|
+
kind: 'user',
|
|
180
|
+
userId: 'usr_root',
|
|
181
|
+
tenantId: tenant,
|
|
182
|
+
};
|
|
183
|
+
const parentSession = await store.createSession({ threadId: thread.id, projectId: project.id, currentActor: userActor }, tenant);
|
|
184
|
+
await store.updateSession({ ...parentSession, status: 'active' }, tenant);
|
|
185
|
+
let summaryCounter = 0;
|
|
186
|
+
const materializer = new SessionSummaryMaterializer({
|
|
187
|
+
store,
|
|
188
|
+
generateSummaryId: () => `sum_test_${++summaryCounter}`,
|
|
189
|
+
});
|
|
190
|
+
const registry = new AgentRegistry();
|
|
191
|
+
registry.register(buildDefinition(buildAgent('worker')));
|
|
192
|
+
const workspaceRegistry = new WorkspaceBackendRegistry();
|
|
193
|
+
workspaceRegistry.register(new FailingWorkspaceDriver());
|
|
194
|
+
const threadManager = new ThreadManager({ threadStore, sessionStore: store });
|
|
195
|
+
const manager = new AgentManager(registry, undefined, {
|
|
196
|
+
sessionStore: store,
|
|
197
|
+
summaryMaterializer: materializer,
|
|
198
|
+
workspaceRegistry,
|
|
199
|
+
capacity: new DefaultCapacityValidator(store),
|
|
200
|
+
threadManager,
|
|
201
|
+
});
|
|
202
|
+
const taskContext = {
|
|
203
|
+
parentRunId: 'run_parent',
|
|
204
|
+
parentAgentId: 'supervisor',
|
|
205
|
+
parentAbortController: new AbortController(),
|
|
206
|
+
depth: 0,
|
|
207
|
+
budgetTracker: { total: 100_000, remaining: 100_000 },
|
|
208
|
+
tenantId: tenant,
|
|
209
|
+
threadId: thread.id,
|
|
210
|
+
sessionId: parentSession.id,
|
|
211
|
+
projectId: project.id,
|
|
212
|
+
parentActor: userActor,
|
|
213
|
+
};
|
|
214
|
+
const options = {
|
|
215
|
+
agentId: 'worker',
|
|
216
|
+
input: { messages: [], workingDirectory: '/tmp' },
|
|
217
|
+
parentSessionId: parentSession.id,
|
|
218
|
+
tenantId: tenant,
|
|
219
|
+
projectId: project.id,
|
|
220
|
+
parentActor: userActor,
|
|
221
|
+
workspaceBackend: 'git-worktree',
|
|
222
|
+
};
|
|
223
|
+
// Two consecutive failing spawns. Without rollback, two orphan
|
|
224
|
+
// `active` child sessions would accumulate; with rollback, each
|
|
225
|
+
// attempt cleans up after itself and the store stays at { parent }.
|
|
226
|
+
await expect(manager.sendMessage(options, taskContext)).rejects.toThrow('synthetic workspace backend failure');
|
|
227
|
+
await expect(manager.sendMessage(options, taskContext)).rejects.toThrow('synthetic workspace backend failure');
|
|
228
|
+
// Still no child session under the thread.
|
|
229
|
+
const sessionsOnThread = await store.listSessions(thread.id, tenant);
|
|
230
|
+
expect(sessionsOnThread.map((s) => s.id)).toEqual([parentSession.id]);
|
|
231
|
+
// No lingering subsession rows — both attempts rolled back cleanly.
|
|
232
|
+
const subsessions = await store.getChildren(parentSession.id, tenant);
|
|
233
|
+
expect(subsessions).toHaveLength(0);
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
//# sourceMappingURL=spawn-rollback.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn-rollback.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/spawn-rollback.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,9 +19,10 @@ import { InMemorySessionStore } from '../../../store/session/memory.js';
|
|
|
19
19
|
import { SessionSummaryMaterializer } from '../../summary/materialize.js';
|
|
20
20
|
import { SessionAlreadySummarizedError } from '../../summary/ref.js';
|
|
21
21
|
import { DEFAULT_TENANT, agentActor } from './_fixtures.js';
|
|
22
|
+
const TEST_THREAD_ID = 'thd_test';
|
|
22
23
|
async function seedActive(store) {
|
|
23
24
|
const project = await store.createProject({ tenantId: DEFAULT_TENANT, name: 'summary' }, DEFAULT_TENANT);
|
|
24
|
-
const session = await store.createSession({ projectId: project.id, currentActor: agentActor('agt_worker') }, DEFAULT_TENANT);
|
|
25
|
+
const session = await store.createSession({ threadId: TEST_THREAD_ID, projectId: project.id, currentActor: agentActor('agt_worker') }, DEFAULT_TENANT);
|
|
25
26
|
await store.updateSession({ ...session, status: 'active' }, DEFAULT_TENANT);
|
|
26
27
|
return { project, session: { ...session, status: 'active' } };
|
|
27
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary-materialization-e2e.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/summary-materialization-e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAGvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3D,KAAK,UAAU,UAAU,CAAC,KAA2B;IACpD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CACxC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,EAC7C,cAAc,CACd,CAAA;IACD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CACxC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"summary-materialization-e2e.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/summary-materialization-e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAGvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3D,MAAM,cAAc,GAAG,UAAsB,CAAA;AAE7C,KAAK,UAAU,UAAU,CAAC,KAA2B;IACpD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CACxC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,EAC7C,cAAc,CACd,CAAA;IACD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CACxC,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,EAC3F,cAAc,CACd,CAAA;IACD,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAA;IAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAiB,EAAE,EAAE,CAAA;AACvE,CAAC;AAED,SAAS,OAAO;IACf,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAe,CAAA;AACnD,CAAC;AAED,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IAC1D,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC;YAC9C,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,MAAM;YACpB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CAAA;QAEF,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACjE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACnC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE7C,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACnE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC7F,sEAAsE;QACtE,uEAAuE;QACvE,qEAAqE;QACrE,wDAAwD;QACxD,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QAEF,MAAM,YAAY,CAAC,WAAW,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,EAAE;YAChB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CAAA;QAEF,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACtD,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC;YAC5C,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC;SAC5C,CAAC,CAAA;QACF,sEAAsE;QACtE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACzC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QAEF,MAAM,YAAY,CAAC,WAAW,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,OAAO;YACrB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CAAA;QAEF,MAAM,MAAM,CACX,YAAY,CAAC,WAAW,CAAC;YACxB,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,QAAQ;YACtB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CACF,CAAC,OAAO,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;QAC1G,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QAEF,sEAAsE;QACtE,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,qBAAqB;QACrB,MAAM,YAAY,CAAC,WAAW,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,EAAE;YAChB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QAC9D,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;QAChD,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAA;QAEvE,oEAAoE;QACpE,kBAAkB;QAClB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACxE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAEhC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACnE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAErC,mEAAmE;QACnE,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACzE,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAC1C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACpE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;QAC5G,uDAAuD;QACvD,oEAAoE;QACpE,qEAAqE;QACrE,oEAAoE;QACpE,mEAAmE;QACnE,wDAAwD;QACxD,kEAAkE;QAClE,iEAAiE;QACjE,8CAA8C;QAC9C,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QACF,MAAM,YAAY,CAAC,WAAW,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,EAAE;YAChB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CAAA;QAEF,gEAAgE;QAChE,mEAAmE;QACnE,sEAAsE;QACtE,oEAAoE;QACpE,0BAA0B;QAC1B,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAClB;YACC,EAAE,EAAE,UAAuB;YAC3B,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YAChC,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,QAAQ;YACtB,YAAY,EAAE,EAAE;YAChB,EAAE,EAAE,IAAI,IAAI,EAAE;YACd,cAAc,EAAE,QAAQ;SACxB,EACD,cAAc,CACd,CACD,CAAC,OAAO,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,YAAY,GAAG,IAAI,0BAA0B,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,OAAO,EAAE;SAC5B,CAAC,CAAA;QAEF,MAAM,MAAM,CACX,YAAY,CAAC,WAAW,CAAC;YACxB,SAAS,EAAE,WAAwB;YACnC,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YACrC,YAAY,EAAE,EAAE;YAChB,oBAAoB,EAAE,EAAE;YACxB,YAAY,EAAE,EAAE;SAChB,CAAC,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -15,11 +15,12 @@ import { InMemorySessionStore } from '../../../store/session/memory.js';
|
|
|
15
15
|
import { createUserMessage } from '../../../types/message/index.js';
|
|
16
16
|
import { TenantIsolationError } from '../../errors.js';
|
|
17
17
|
import { DEFAULT_TENANT, OTHER_TENANT, agentActor, userActor } from './_fixtures.js';
|
|
18
|
+
const TEST_THREAD_ID = 'thd_test';
|
|
18
19
|
async function seedTenantAResources() {
|
|
19
20
|
const store = new InMemorySessionStore();
|
|
20
21
|
const project = await store.createProject({ tenantId: DEFAULT_TENANT, name: 'tenA' }, DEFAULT_TENANT);
|
|
21
|
-
const parent = await store.createSession({ projectId: project.id, currentActor: userActor('usr_a') }, DEFAULT_TENANT);
|
|
22
|
-
const child = await store.createSession({ projectId: project.id, currentActor: agentActor('agt_a') }, DEFAULT_TENANT);
|
|
22
|
+
const parent = await store.createSession({ threadId: TEST_THREAD_ID, projectId: project.id, currentActor: userActor('usr_a') }, DEFAULT_TENANT);
|
|
23
|
+
const child = await store.createSession({ threadId: TEST_THREAD_ID, projectId: project.id, currentActor: agentActor('agt_a') }, DEFAULT_TENANT);
|
|
23
24
|
const sub = await store.createSubSession({
|
|
24
25
|
parentSessionId: parent.id,
|
|
25
26
|
childSessionId: child.id,
|
|
@@ -128,7 +129,11 @@ describe('Integration — tenant isolation', () => {
|
|
|
128
129
|
});
|
|
129
130
|
it('createSession with project owned by another tenant → TenantIsolationError', async () => {
|
|
130
131
|
const { store, project } = await seedTenantAResources();
|
|
131
|
-
await expect(store.createSession({
|
|
132
|
+
await expect(store.createSession({
|
|
133
|
+
threadId: TEST_THREAD_ID,
|
|
134
|
+
projectId: project.id,
|
|
135
|
+
currentActor: userActor('usr_intruder', OTHER_TENANT),
|
|
136
|
+
}, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
132
137
|
});
|
|
133
138
|
it('tenant denormalization: Session, SubSession records carry tenantId explicitly', async () => {
|
|
134
139
|
const { store, parent, sub } = await seedTenantAResources();
|
|
@@ -149,7 +154,11 @@ describe('Integration — tenant isolation', () => {
|
|
|
149
154
|
const { store, parent } = await seedTenantAResources();
|
|
150
155
|
// Create a session in OTHER_TENANT with its own project.
|
|
151
156
|
const otherProject = await store.createProject({ tenantId: OTHER_TENANT, name: 'other' }, OTHER_TENANT);
|
|
152
|
-
const otherChild = await store.createSession({
|
|
157
|
+
const otherChild = await store.createSession({
|
|
158
|
+
threadId: TEST_THREAD_ID,
|
|
159
|
+
projectId: otherProject.id,
|
|
160
|
+
currentActor: userActor('usr_other', OTHER_TENANT),
|
|
161
|
+
}, OTHER_TENANT);
|
|
153
162
|
await expect(store.createSubSession({
|
|
154
163
|
parentSessionId: parent.id, // DEFAULT_TENANT
|
|
155
164
|
childSessionId: otherChild.id, // OTHER_TENANT
|
|
@@ -166,7 +175,7 @@ describe('Integration — tenant isolation', () => {
|
|
|
166
175
|
// Parent has a sub-session attached → deleteSession would fail anyway,
|
|
167
176
|
// but the tenant guard fires first. Use a standalone session.
|
|
168
177
|
const project = (await store.createProject({ tenantId: DEFAULT_TENANT, name: 'del' }, DEFAULT_TENANT)).id;
|
|
169
|
-
const lonely = await store.createSession({ projectId: project, currentActor: userActor('usr_lonely') }, DEFAULT_TENANT);
|
|
178
|
+
const lonely = await store.createSession({ threadId: TEST_THREAD_ID, projectId: project, currentActor: userActor('usr_lonely') }, DEFAULT_TENANT);
|
|
170
179
|
await expect(store.deleteSession(lonely.id, OTHER_TENANT)).rejects.toBeInstanceOf(TenantIsolationError);
|
|
171
180
|
});
|
|
172
181
|
it('missing sub-session returns null for correct tenant (not a leak channel)', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-isolation.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/tenant-isolation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEpF,KAAK,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CACxC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,EAC1C,cAAc,CACd,CAAA;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,CACvC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"tenant-isolation.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/integration/tenant-isolation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEpF,MAAM,cAAc,GAAG,UAAsB,CAAA;AAE7C,KAAK,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CACxC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,EAC1C,cAAc,CACd,CAAA;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,CACvC,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,EACrF,cAAc,CACd,CAAA;IACD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,aAAa,CACtC,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,EACtF,cAAc,CACd,CAAA;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,CACvC;QACC,eAAe,EAAE,MAAM,CAAC,EAAE;QAC1B,cAAc,EAAE,KAAK,CAAC,EAAE;QACxB,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC;KAC7B,EACD,cAAc,CACd,CAAA;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;AAC9C,CAAC;AAED,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACvD,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC9E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC7E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACnD,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC7E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,YAAY,CAAC,CAClE,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAC7D,MAAM,MAAM,CACX,KAAK,CAAC,gBAAgB,CACrB;YACC,eAAe,EAAE,MAAM,CAAC,EAAE;YAC1B,cAAc,EAAE,KAAK,CAAC,EAAE;YACxB,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC;SAClD,EACD,YAAY,CACZ,CACD,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACrD,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAC1E,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACrD,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAA;QAC/E,MAAM,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CACrF,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACrD,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAA;QAC/E,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC9E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8GAA8G,EAAE,KAAK,IAAI,EAAE;QAC7H,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAChG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAC9G,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAC9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,CAC7B,mBAAwD,EACxD,YAAY,CACZ,CAAA;QACD,uEAAuE;QACvE,mEAAmE;QACnE,iEAAiE;QACjE,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC9E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC9E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,sEAAsE;QACtE,2CAA2C;QAC3C,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAClB;YACC,EAAE,EAAE,cAA2B;YAC/B,UAAU,EAAE,MAAM,CAAC,EAAE;YACrB,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YAChC,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,EAAE,EAAE,IAAI,IAAI,EAAE;YACd,cAAc,EAAE,QAAQ;SACxB,EACD,cAAc,CACd,CACD,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACtD,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAA;QAC1E,MAAM,KAAK,CAAC,aAAa,CACxB;YACC,EAAE,EAAE,QAAqB;YACzB,UAAU,EAAE,MAAM,CAAC,EAAE;YACrB,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;YAChC,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,EAAE,EAAE,IAAI,IAAI,EAAE;YACd,cAAc,EAAE,QAAQ;SACxB,EACD,cAAc,CACd,CAAA;QAED,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC7E,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;QACxC,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,cAAc,CAAC,CACjF,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACvD,MAAM,MAAM,CACX,KAAK,CAAC,aAAa,CAClB;YACC,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,YAAY,EAAE,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC;SACrD,EACD,YAAY,CACZ,CACD,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAC3D,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACxE,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAErD,sEAAsE;QACtE,oEAAoE;QACpE,yEAAyE;QACzE,uEAAuE;QACvE,uCAAuC;QACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QAClE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uGAAuG,EAAE,KAAK,IAAI,EAAE;QACtH,mEAAmE;QACnE,wEAAwE;QACxE,+CAA+C;QAC/C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAEtD,yDAAyD;QACzD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,aAAa,CAC7C,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,EACzC,YAAY,CACZ,CAAA;QACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,aAAa,CAC3C;YACC,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,YAAY,CAAC,EAAE;YAC1B,YAAY,EAAE,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC;SAClD,EACD,YAAY,CACZ,CAAA;QAED,MAAM,MAAM,CACX,KAAK,CAAC,gBAAgB,CACrB;YACC,eAAe,EAAE,MAAM,CAAC,EAAE,EAAE,iBAAiB;YAC7C,cAAc,EAAE,UAAU,CAAC,EAAE,EAAE,eAAe;YAC9C,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC;SAC7B,EACD,cAAc,CACd,CACD,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACnD,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAChF,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAC9C,uEAAuE;QACvE,8DAA8D;QAC9D,MAAM,OAAO,GAAc,CAC1B,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,cAAc,CAAC,CACpF,CAAC,EAAE,CAAA;QACJ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,CACvC,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,EAAE,EACvF,cAAc,CACd,CAAA;QACD,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAChF,oBAAoB,CACpB,CAAA;IACF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QAC9C,iEAAiE;QACjE,gEAAgE;QAChE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,mBAAmC,EAAE,cAAc,CAAC,CAAA;QAC9F,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
package/dist/session/errors.d.ts
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* (Convention #5: deny-by-default, fail fast).
|
|
8
8
|
*/
|
|
9
9
|
import type { SessionId, TenantId } from '../types/ids/index.js';
|
|
10
|
+
import type { ThreadId } from '../types/session/ids.js';
|
|
11
|
+
import type { SessionStatus } from './hierarchy/session.js';
|
|
10
12
|
import type { WorkspaceBackendKind } from './workspace/driver.js';
|
|
11
13
|
/**
|
|
12
14
|
* Raised by {@link SessionStore} accessors when the supplied {@link TenantId}
|
|
@@ -57,4 +59,81 @@ export declare class WorkspaceBackendError extends Error {
|
|
|
57
59
|
cause?: unknown;
|
|
58
60
|
});
|
|
59
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Raised by {@link import('../types/thread/store.js').ThreadStore.updateThread}
|
|
64
|
+
* when the supplied {@link Thread.ownerVersion} does not match the persisted
|
|
65
|
+
* record. The caller must re-read via `getThread`, re-apply its intended
|
|
66
|
+
* mutation on top of the fresh record, and retry. Mirrors the Session
|
|
67
|
+
* handoff CAS pattern (§6.1).
|
|
68
|
+
*/
|
|
69
|
+
export declare class StaleThreadError extends Error {
|
|
70
|
+
readonly details: {
|
|
71
|
+
threadId: ThreadId;
|
|
72
|
+
expectedVersion: number;
|
|
73
|
+
actualVersion: number;
|
|
74
|
+
};
|
|
75
|
+
constructor(details: {
|
|
76
|
+
threadId: ThreadId;
|
|
77
|
+
expectedVersion: number;
|
|
78
|
+
actualVersion: number;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Raised by the spawn path (and any caller that enforces the open-thread
|
|
83
|
+
* precondition) when a Thread is in `'archived'` state and would-be mutations
|
|
84
|
+
* require it to be `'open'`. Convention #5: deny-by-default — archival is a
|
|
85
|
+
* hard read-only boundary.
|
|
86
|
+
*/
|
|
87
|
+
export declare class ThreadClosedError extends Error {
|
|
88
|
+
readonly details: {
|
|
89
|
+
threadId: ThreadId;
|
|
90
|
+
op: string;
|
|
91
|
+
};
|
|
92
|
+
constructor(details: {
|
|
93
|
+
threadId: ThreadId;
|
|
94
|
+
op: string;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Raised by {@link import('../manager/thread/lifecycle.js').ThreadManager.archive}
|
|
99
|
+
* and `.delete` when the Thread's session-presence precondition is violated:
|
|
100
|
+
*
|
|
101
|
+
* - `op: 'archive'` — at least one Session under the Thread is in a
|
|
102
|
+
* non-terminal state (`active | locked | awaiting_hitl | awaiting_merge`).
|
|
103
|
+
* The caller must first quiesce those sessions (let them reach `idle`,
|
|
104
|
+
* `failed`, or `archived`) before flipping the Thread to archived.
|
|
105
|
+
* - `op: 'delete'` — the Thread still has at least one attached Session.
|
|
106
|
+
* Callers must either archive + tombstone those sessions (`deleteSession`)
|
|
107
|
+
* before calling `deleteThread`, or accept that deletion is not yet safe.
|
|
108
|
+
*
|
|
109
|
+
* `blockingSessions` carries the first {@link THREAD_NOT_EMPTY_SAMPLE_LIMIT}
|
|
110
|
+
* offenders with their current status so operator tooling can surface an
|
|
111
|
+
* actionable list without unbounded error payloads on large threads.
|
|
112
|
+
* `totalBlockingSessions` holds the full count even when the sample is
|
|
113
|
+
* truncated. Convention #5: deny-by-default — no implicit cascade, no silent
|
|
114
|
+
* no-op.
|
|
115
|
+
*/
|
|
116
|
+
export declare const THREAD_NOT_EMPTY_SAMPLE_LIMIT = 50;
|
|
117
|
+
export declare class ThreadNotEmptyError extends Error {
|
|
118
|
+
readonly details: {
|
|
119
|
+
threadId: ThreadId;
|
|
120
|
+
tenantId: TenantId;
|
|
121
|
+
op: 'archive' | 'delete';
|
|
122
|
+
blockingSessions: ReadonlyArray<{
|
|
123
|
+
sessionId: SessionId;
|
|
124
|
+
status: SessionStatus;
|
|
125
|
+
}>;
|
|
126
|
+
totalBlockingSessions: number;
|
|
127
|
+
};
|
|
128
|
+
constructor(details: {
|
|
129
|
+
threadId: ThreadId;
|
|
130
|
+
tenantId: TenantId;
|
|
131
|
+
op: 'archive' | 'delete';
|
|
132
|
+
blockingSessions: ReadonlyArray<{
|
|
133
|
+
sessionId: SessionId;
|
|
134
|
+
status: SessionStatus;
|
|
135
|
+
}>;
|
|
136
|
+
totalBlockingSessions: number;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
60
139
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEjE;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,OAAO,EAAE;QACjB,SAAS,EAAE,QAAQ,CAAA;QACnB,QAAQ,EAAE,MAAM,CAAA;KAChB,CAAA;gBAEW,OAAO,EAAE;QAAE,SAAS,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAK9D;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,OAAO,EAAE;QACjB,SAAS,EAAE,SAAS,CAAA;QACpB,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;KAC/B,CAAA;gBAEW,OAAO,EAAE;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;KAAE;CAO9E;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE;QACjB,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,oBAAoB,CAAA;QAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;KACf,CAAA;gBAEW,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,oBAAoB,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKhF"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEjE;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,OAAO,EAAE;QACjB,SAAS,EAAE,QAAQ,CAAA;QACnB,QAAQ,EAAE,MAAM,CAAA;KAChB,CAAA;gBAEW,OAAO,EAAE;QAAE,SAAS,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAK9D;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,OAAO,EAAE;QACjB,SAAS,EAAE,SAAS,CAAA;QACpB,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;KAC/B,CAAA;gBAEW,OAAO,EAAE;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;KAAE;CAO9E;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE;QACjB,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,oBAAoB,CAAA;QAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;KACf,CAAA;gBAEW,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,oBAAoB,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKhF;AAED;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,EAAE,QAAQ,CAAA;QAClB,eAAe,EAAE,MAAM,CAAA;QACvB,aAAa,EAAE,MAAM,CAAA;KACrB,CAAA;gBAEW,OAAO,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;CAO3F;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,EAAE,QAAQ,CAAA;QAClB,EAAE,EAAE,MAAM,CAAA;KACV,CAAA;gBAEW,OAAO,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;CAKvD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,6BAA6B,KAAK,CAAA;AAE/C,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,OAAO,EAAE;QACjB,QAAQ,EAAE,QAAQ,CAAA;QAClB,QAAQ,EAAE,QAAQ,CAAA;QAClB,EAAE,EAAE,SAAS,GAAG,QAAQ,CAAA;QACxB,gBAAgB,EAAE,aAAa,CAAC;YAAE,SAAS,EAAE,SAAS,CAAC;YAAC,MAAM,EAAE,aAAa,CAAA;SAAE,CAAC,CAAA;QAChF,qBAAqB,EAAE,MAAM,CAAA;KAC7B,CAAA;gBAEW,OAAO,EAAE;QACpB,QAAQ,EAAE,QAAQ,CAAA;QAClB,QAAQ,EAAE,QAAQ,CAAA;QAClB,EAAE,EAAE,SAAS,GAAG,QAAQ,CAAA;QACxB,gBAAgB,EAAE,aAAa,CAAC;YAAE,SAAS,EAAE,SAAS,CAAC;YAAC,MAAM,EAAE,aAAa,CAAA;SAAE,CAAC,CAAA;QAChF,qBAAqB,EAAE,MAAM,CAAA;KAC7B;CAOD"}
|
package/dist/session/errors.js
CHANGED
|
@@ -47,4 +47,61 @@ export class WorkspaceBackendError extends Error {
|
|
|
47
47
|
this.details = details;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Raised by {@link import('../types/thread/store.js').ThreadStore.updateThread}
|
|
52
|
+
* when the supplied {@link Thread.ownerVersion} does not match the persisted
|
|
53
|
+
* record. The caller must re-read via `getThread`, re-apply its intended
|
|
54
|
+
* mutation on top of the fresh record, and retry. Mirrors the Session
|
|
55
|
+
* handoff CAS pattern (§6.1).
|
|
56
|
+
*/
|
|
57
|
+
export class StaleThreadError extends Error {
|
|
58
|
+
details;
|
|
59
|
+
constructor(details) {
|
|
60
|
+
super(`Stale Thread ${details.threadId}: expected ownerVersion=${details.expectedVersion}, actual=${details.actualVersion}`);
|
|
61
|
+
this.name = 'StaleThreadError';
|
|
62
|
+
this.details = details;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Raised by the spawn path (and any caller that enforces the open-thread
|
|
67
|
+
* precondition) when a Thread is in `'archived'` state and would-be mutations
|
|
68
|
+
* require it to be `'open'`. Convention #5: deny-by-default — archival is a
|
|
69
|
+
* hard read-only boundary.
|
|
70
|
+
*/
|
|
71
|
+
export class ThreadClosedError extends Error {
|
|
72
|
+
details;
|
|
73
|
+
constructor(details) {
|
|
74
|
+
super(`Thread ${details.threadId} is archived; operation '${details.op}' rejected`);
|
|
75
|
+
this.name = 'ThreadClosedError';
|
|
76
|
+
this.details = details;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Raised by {@link import('../manager/thread/lifecycle.js').ThreadManager.archive}
|
|
81
|
+
* and `.delete` when the Thread's session-presence precondition is violated:
|
|
82
|
+
*
|
|
83
|
+
* - `op: 'archive'` — at least one Session under the Thread is in a
|
|
84
|
+
* non-terminal state (`active | locked | awaiting_hitl | awaiting_merge`).
|
|
85
|
+
* The caller must first quiesce those sessions (let them reach `idle`,
|
|
86
|
+
* `failed`, or `archived`) before flipping the Thread to archived.
|
|
87
|
+
* - `op: 'delete'` — the Thread still has at least one attached Session.
|
|
88
|
+
* Callers must either archive + tombstone those sessions (`deleteSession`)
|
|
89
|
+
* before calling `deleteThread`, or accept that deletion is not yet safe.
|
|
90
|
+
*
|
|
91
|
+
* `blockingSessions` carries the first {@link THREAD_NOT_EMPTY_SAMPLE_LIMIT}
|
|
92
|
+
* offenders with their current status so operator tooling can surface an
|
|
93
|
+
* actionable list without unbounded error payloads on large threads.
|
|
94
|
+
* `totalBlockingSessions` holds the full count even when the sample is
|
|
95
|
+
* truncated. Convention #5: deny-by-default — no implicit cascade, no silent
|
|
96
|
+
* no-op.
|
|
97
|
+
*/
|
|
98
|
+
export const THREAD_NOT_EMPTY_SAMPLE_LIMIT = 50;
|
|
99
|
+
export class ThreadNotEmptyError extends Error {
|
|
100
|
+
details;
|
|
101
|
+
constructor(details) {
|
|
102
|
+
super(`Thread ${details.threadId} ${details.op} blocked: ${details.totalBlockingSessions} session(s) still attached`);
|
|
103
|
+
this.name = 'ThreadNotEmptyError';
|
|
104
|
+
this.details = details;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
50
107
|
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACrC,OAAO,CAGf;IAED,YAAY,OAAkD;QAC7D,KAAK,CAAC,+BAA+B,OAAO,CAAC,SAAS,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QACtF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACnC,OAAO,CAGf;IAED,YAAY,OAAkE;QAC7E,KAAK,CACJ,uCAAuC,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAC7F,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACtC,OAAO,CAIf;IAED,YAAY,OAAoE;QAC/E,KAAK,CAAC,qBAAqB,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;QAClE,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;;;GAMG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACjC,OAAO,CAIf;IAED,YAAY,OAA+E;QAC1F,KAAK,CACJ,gBAAgB,OAAO,CAAC,QAAQ,2BAA2B,OAAO,CAAC,eAAe,YAAY,OAAO,CAAC,aAAa,EAAE,CACrH,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAClC,OAAO,CAGf;IAED,YAAY,OAA2C;QACtD,KAAK,CAAC,UAAU,OAAO,CAAC,QAAQ,4BAA4B,OAAO,CAAC,EAAE,YAAY,CAAC,CAAA;QACnF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAA;AAE/C,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACpC,OAAO,CAMf;IAED,YAAY,OAMX;QACA,KAAK,CACJ,UAAU,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,aAAa,OAAO,CAAC,qBAAqB,4BAA4B,CAC9G,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACvB,CAAC;CACD"}
|