@namzu/cli 12.1.0 → 14.0.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.
Files changed (237) hide show
  1. package/README.md +35 -2
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +119 -60
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/acp.d.ts +24 -8
  6. package/dist/commands/acp.d.ts.map +1 -1
  7. package/dist/commands/acp.js +221 -80
  8. package/dist/commands/acp.js.map +1 -1
  9. package/dist/commands/drain.d.ts.map +1 -1
  10. package/dist/commands/drain.js +45 -9
  11. package/dist/commands/drain.js.map +1 -1
  12. package/dist/commands/login.d.ts +2 -0
  13. package/dist/commands/login.d.ts.map +1 -1
  14. package/dist/commands/login.js +79 -21
  15. package/dist/commands/login.js.map +1 -1
  16. package/dist/commands/prior-messages.d.ts +11 -0
  17. package/dist/commands/prior-messages.d.ts.map +1 -0
  18. package/dist/commands/prior-messages.js +280 -0
  19. package/dist/commands/prior-messages.js.map +1 -0
  20. package/dist/commands/resume.d.ts.map +1 -1
  21. package/dist/commands/resume.js +21 -19
  22. package/dist/commands/resume.js.map +1 -1
  23. package/dist/commands/run-stream.d.ts +5 -3
  24. package/dist/commands/run-stream.d.ts.map +1 -1
  25. package/dist/commands/run-stream.js +66 -62
  26. package/dist/commands/run-stream.js.map +1 -1
  27. package/dist/commands/run.d.ts.map +1 -1
  28. package/dist/commands/run.js +50 -37
  29. package/dist/commands/run.js.map +1 -1
  30. package/dist/config/debug.d.ts +55 -0
  31. package/dist/config/debug.d.ts.map +1 -0
  32. package/dist/config/debug.js +126 -0
  33. package/dist/config/debug.js.map +1 -0
  34. package/dist/config/load.d.ts +88 -4
  35. package/dist/config/load.d.ts.map +1 -1
  36. package/dist/config/load.js +386 -56
  37. package/dist/config/load.js.map +1 -1
  38. package/dist/config/schema.d.ts +87 -5
  39. package/dist/config/schema.d.ts.map +1 -1
  40. package/dist/config/schema.js +5 -5
  41. package/dist/config/schema.js.map +1 -1
  42. package/dist/config/trusted-project-context.d.ts +11 -0
  43. package/dist/config/trusted-project-context.d.ts.map +1 -0
  44. package/dist/config/trusted-project-context.js +28 -0
  45. package/dist/config/trusted-project-context.js.map +1 -0
  46. package/dist/context/project-path.d.ts +3 -0
  47. package/dist/context/project-path.d.ts.map +1 -0
  48. package/dist/context/project-path.js +16 -0
  49. package/dist/context/project-path.js.map +1 -0
  50. package/dist/context/project-tracker.d.ts +30 -0
  51. package/dist/context/project-tracker.d.ts.map +1 -0
  52. package/dist/context/project-tracker.js +217 -0
  53. package/dist/context/project-tracker.js.map +1 -0
  54. package/dist/context/sandbox.d.ts +29 -9
  55. package/dist/context/sandbox.d.ts.map +1 -1
  56. package/dist/context/sandbox.js +8 -0
  57. package/dist/context/sandbox.js.map +1 -1
  58. package/dist/doctor/checks/credentials.d.ts.map +1 -1
  59. package/dist/doctor/checks/credentials.js +7 -1
  60. package/dist/doctor/checks/credentials.js.map +1 -1
  61. package/dist/exit-codes.d.ts +5 -4
  62. package/dist/exit-codes.d.ts.map +1 -1
  63. package/dist/exit-codes.js +5 -4
  64. package/dist/exit-codes.js.map +1 -1
  65. package/dist/index.d.ts +2 -2
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +2 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/integrations/clipboard/text.d.ts +43 -0
  70. package/dist/integrations/clipboard/text.d.ts.map +1 -0
  71. package/dist/integrations/clipboard/text.js +43 -0
  72. package/dist/integrations/clipboard/text.js.map +1 -0
  73. package/dist/integrations/mcp/servers.d.ts +9 -0
  74. package/dist/integrations/mcp/servers.d.ts.map +1 -1
  75. package/dist/integrations/mcp/servers.js +11 -4
  76. package/dist/integrations/mcp/servers.js.map +1 -1
  77. package/dist/integrations/notifications/terminal.d.ts +32 -0
  78. package/dist/integrations/notifications/terminal.d.ts.map +1 -0
  79. package/dist/integrations/notifications/terminal.js +46 -0
  80. package/dist/integrations/notifications/terminal.js.map +1 -0
  81. package/dist/integrations/plugins/runtime.d.ts +17 -0
  82. package/dist/integrations/plugins/runtime.d.ts.map +1 -0
  83. package/dist/integrations/plugins/runtime.js +100 -0
  84. package/dist/integrations/plugins/runtime.js.map +1 -0
  85. package/dist/integrations/providers/codex-device-login.d.ts +27 -0
  86. package/dist/integrations/providers/codex-device-login.d.ts.map +1 -0
  87. package/dist/integrations/providers/codex-device-login.js +195 -0
  88. package/dist/integrations/providers/codex-device-login.js.map +1 -0
  89. package/dist/integrations/providers/codex-oauth.d.ts +10 -0
  90. package/dist/integrations/providers/codex-oauth.d.ts.map +1 -0
  91. package/dist/integrations/providers/codex-oauth.js +95 -0
  92. package/dist/integrations/providers/codex-oauth.js.map +1 -0
  93. package/dist/integrations/providers/credential-store.d.ts +40 -4
  94. package/dist/integrations/providers/credential-store.d.ts.map +1 -1
  95. package/dist/integrations/providers/credential-store.js +236 -18
  96. package/dist/integrations/providers/credential-store.js.map +1 -1
  97. package/dist/integrations/providers/discover.d.ts +25 -13
  98. package/dist/integrations/providers/discover.d.ts.map +1 -1
  99. package/dist/integrations/providers/discover.js +98 -44
  100. package/dist/integrations/providers/discover.js.map +1 -1
  101. package/dist/integrations/providers/harness-credentials.d.ts +36 -0
  102. package/dist/integrations/providers/harness-credentials.d.ts.map +1 -0
  103. package/dist/integrations/providers/harness-credentials.js +146 -0
  104. package/dist/integrations/providers/harness-credentials.js.map +1 -0
  105. package/dist/integrations/providers/identity.d.ts +8 -15
  106. package/dist/integrations/providers/identity.d.ts.map +1 -1
  107. package/dist/integrations/providers/identity.js +8 -15
  108. package/dist/integrations/providers/identity.js.map +1 -1
  109. package/dist/integrations/providers/index.d.ts +7 -4
  110. package/dist/integrations/providers/index.d.ts.map +1 -1
  111. package/dist/integrations/providers/index.js +6 -3
  112. package/dist/integrations/providers/index.js.map +1 -1
  113. package/dist/integrations/providers/keychain.d.ts +0 -13
  114. package/dist/integrations/providers/keychain.d.ts.map +1 -1
  115. package/dist/integrations/providers/keychain.js +0 -76
  116. package/dist/integrations/providers/keychain.js.map +1 -1
  117. package/dist/integrations/providers/oauth.d.ts +46 -17
  118. package/dist/integrations/providers/oauth.d.ts.map +1 -1
  119. package/dist/integrations/providers/oauth.js +175 -45
  120. package/dist/integrations/providers/oauth.js.map +1 -1
  121. package/dist/integrations/providers/register.d.ts.map +1 -1
  122. package/dist/integrations/providers/register.js +9 -1
  123. package/dist/integrations/providers/register.js.map +1 -1
  124. package/dist/integrations/providers/registry.d.ts +8 -1
  125. package/dist/integrations/providers/registry.d.ts.map +1 -1
  126. package/dist/integrations/providers/registry.js +29 -0
  127. package/dist/integrations/providers/registry.js.map +1 -1
  128. package/dist/integrations/providers/subscription-login.d.ts +2 -0
  129. package/dist/integrations/providers/subscription-login.d.ts.map +1 -1
  130. package/dist/integrations/providers/subscription-login.js +117 -14
  131. package/dist/integrations/providers/subscription-login.js.map +1 -1
  132. package/dist/integrations/sessions/store.d.ts +111 -1
  133. package/dist/integrations/sessions/store.d.ts.map +1 -1
  134. package/dist/integrations/sessions/store.js +400 -7
  135. package/dist/integrations/sessions/store.js.map +1 -1
  136. package/dist/integrations/sessions/transcript-export.d.ts +25 -0
  137. package/dist/integrations/sessions/transcript-export.d.ts.map +1 -0
  138. package/dist/integrations/sessions/transcript-export.js +441 -0
  139. package/dist/integrations/sessions/transcript-export.js.map +1 -0
  140. package/dist/integrations/sessions/turn-evidence.d.ts +138 -0
  141. package/dist/integrations/sessions/turn-evidence.d.ts.map +1 -0
  142. package/dist/integrations/sessions/turn-evidence.js +506 -0
  143. package/dist/integrations/sessions/turn-evidence.js.map +1 -0
  144. package/dist/integrations/subagents/runtime.d.ts +7 -12
  145. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  146. package/dist/integrations/subagents/runtime.js +19 -10
  147. package/dist/integrations/subagents/runtime.js.map +1 -1
  148. package/dist/integrations/trust/store.d.ts.map +1 -1
  149. package/dist/integrations/trust/store.js +27 -13
  150. package/dist/integrations/trust/store.js.map +1 -1
  151. package/dist/permissions/canonical-project.d.ts +9 -0
  152. package/dist/permissions/canonical-project.d.ts.map +1 -0
  153. package/dist/permissions/canonical-project.js +13 -0
  154. package/dist/permissions/canonical-project.js.map +1 -0
  155. package/dist/permissions/checks.d.ts +65 -0
  156. package/dist/permissions/checks.d.ts.map +1 -0
  157. package/dist/permissions/checks.js +122 -0
  158. package/dist/permissions/checks.js.map +1 -0
  159. package/dist/permissions/headless-trust.d.ts +9 -5
  160. package/dist/permissions/headless-trust.d.ts.map +1 -1
  161. package/dist/permissions/headless-trust.js +18 -4
  162. package/dist/permissions/headless-trust.js.map +1 -1
  163. package/dist/permissions/rules.d.ts +16 -7
  164. package/dist/permissions/rules.d.ts.map +1 -1
  165. package/dist/permissions/rules.js +78 -13
  166. package/dist/permissions/rules.js.map +1 -1
  167. package/dist/tui/App.d.ts +5 -2
  168. package/dist/tui/App.d.ts.map +1 -1
  169. package/dist/tui/App.js +1621 -196
  170. package/dist/tui/App.js.map +1 -1
  171. package/dist/tui/Composer.d.ts +14 -3
  172. package/dist/tui/Composer.d.ts.map +1 -1
  173. package/dist/tui/Composer.js +53 -15
  174. package/dist/tui/Composer.js.map +1 -1
  175. package/dist/tui/EditPromptPicker.d.ts +8 -0
  176. package/dist/tui/EditPromptPicker.d.ts.map +1 -0
  177. package/dist/tui/EditPromptPicker.js +18 -0
  178. package/dist/tui/EditPromptPicker.js.map +1 -0
  179. package/dist/tui/LiveActivity.d.ts.map +1 -1
  180. package/dist/tui/LiveActivity.js +2 -1
  181. package/dist/tui/LiveActivity.js.map +1 -1
  182. package/dist/tui/Markdown.d.ts.map +1 -1
  183. package/dist/tui/Markdown.js +2 -1
  184. package/dist/tui/Markdown.js.map +1 -1
  185. package/dist/tui/PermissionOverlay.d.ts.map +1 -1
  186. package/dist/tui/PermissionOverlay.js +7 -1
  187. package/dist/tui/PermissionOverlay.js.map +1 -1
  188. package/dist/tui/Picker.d.ts +8 -6
  189. package/dist/tui/Picker.d.ts.map +1 -1
  190. package/dist/tui/Picker.js +145 -18
  191. package/dist/tui/Picker.js.map +1 -1
  192. package/dist/tui/ResumePicker.d.ts.map +1 -1
  193. package/dist/tui/ResumePicker.js +1 -1
  194. package/dist/tui/ResumePicker.js.map +1 -1
  195. package/dist/tui/Transcript.d.ts +4 -2
  196. package/dist/tui/Transcript.d.ts.map +1 -1
  197. package/dist/tui/Transcript.js +31 -5
  198. package/dist/tui/Transcript.js.map +1 -1
  199. package/dist/tui/agent.d.ts +123 -19
  200. package/dist/tui/agent.d.ts.map +1 -1
  201. package/dist/tui/agent.js +757 -144
  202. package/dist/tui/agent.js.map +1 -1
  203. package/dist/tui/compact-transcript.d.ts +24 -0
  204. package/dist/tui/compact-transcript.d.ts.map +1 -0
  205. package/dist/tui/compact-transcript.js +46 -0
  206. package/dist/tui/compact-transcript.js.map +1 -0
  207. package/dist/tui/conversation-history.d.ts +33 -0
  208. package/dist/tui/conversation-history.d.ts.map +1 -0
  209. package/dist/tui/conversation-history.js +42 -0
  210. package/dist/tui/conversation-history.js.map +1 -0
  211. package/dist/tui/edit-prompts.d.ts +23 -0
  212. package/dist/tui/edit-prompts.d.ts.map +1 -0
  213. package/dist/tui/edit-prompts.js +35 -0
  214. package/dist/tui/edit-prompts.js.map +1 -0
  215. package/dist/tui/live-window.d.ts +3 -1
  216. package/dist/tui/live-window.d.ts.map +1 -1
  217. package/dist/tui/live-window.js +20 -8
  218. package/dist/tui/live-window.js.map +1 -1
  219. package/dist/tui/login-prompt.d.ts +5 -0
  220. package/dist/tui/login-prompt.d.ts.map +1 -1
  221. package/dist/tui/login-prompt.js +14 -0
  222. package/dist/tui/login-prompt.js.map +1 -1
  223. package/dist/tui/slashCommands.d.ts +178 -9
  224. package/dist/tui/slashCommands.d.ts.map +1 -1
  225. package/dist/tui/slashCommands.js +340 -16
  226. package/dist/tui/slashCommands.js.map +1 -1
  227. package/dist/tui/terminal-display.d.ts +12 -0
  228. package/dist/tui/terminal-display.d.ts.map +1 -0
  229. package/dist/tui/terminal-display.js +65 -0
  230. package/dist/tui/terminal-display.js.map +1 -0
  231. package/dist/tui/types.d.ts +14 -2
  232. package/dist/tui/types.d.ts.map +1 -1
  233. package/dist/tui/workspace-diff.d.ts +40 -0
  234. package/dist/tui/workspace-diff.d.ts.map +1 -0
  235. package/dist/tui/workspace-diff.js +101 -0
  236. package/dist/tui/workspace-diff.js.map +1 -0
  237. package/package.json +8 -8
@@ -0,0 +1,506 @@
1
+ /**
2
+ * Durable correlation between one CLI conversation and the SDK runs that
3
+ * carried its turns.
4
+ *
5
+ * The SDK already owns run events and the verified survivor snapshot. This
6
+ * file deliberately does not copy either. It records the fact the SDK cannot
7
+ * infer: which exact user message the operator submitted as this turn, and
8
+ * which caller-chosen run id was reserved for it before execution began.
9
+ */
10
+ import { randomUUID } from 'node:crypto';
11
+ import { open, readFile } from 'node:fs/promises';
12
+ import { join } from 'node:path';
13
+ import { isDeepStrictEqual } from 'node:util';
14
+ import { DefaultPathBuilder, asGoalId, asProjectId, asRunId, asSessionId, isProjectInstructionMessageSource, } from '@namzu/sdk';
15
+ const FORMAT = 'namzu.cli-turn-evidence.v1';
16
+ const FILE = 'turns.jsonl';
17
+ export class ConversationEvidenceCorruptionError extends Error {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = 'ConversationEvidenceCorruptionError';
21
+ }
22
+ }
23
+ export class DiskConversationEvidence {
24
+ paths;
25
+ projectId;
26
+ now;
27
+ tail = Promise.resolve();
28
+ constructor(options) {
29
+ this.paths = new DefaultPathBuilder(options.root);
30
+ this.projectId = options.projectId;
31
+ this.now = options.now ?? Date.now;
32
+ }
33
+ async recordOrigin(sessionId, origin) {
34
+ return await this.serialize(async () => {
35
+ const record = {
36
+ format: FORMAT,
37
+ type: 'conversation_started',
38
+ projectId: this.projectId,
39
+ sessionId,
40
+ recordedAt: this.now(),
41
+ origin,
42
+ };
43
+ const path = this.path(sessionId);
44
+ let handle;
45
+ try {
46
+ handle = await open(path, 'wx', 0o600);
47
+ await handle.writeFile(`${JSON.stringify(record)}\n`, 'utf-8');
48
+ await handle.sync();
49
+ }
50
+ finally {
51
+ await handle?.close();
52
+ }
53
+ const readBack = await this.readUnlocked(sessionId);
54
+ if (readBack.kind !== 'available' || !isDeepStrictEqual(readBack.origin, record)) {
55
+ throw new Error(`Conversation origin was not durably verified in ${path}.`);
56
+ }
57
+ });
58
+ }
59
+ async recordTurnStarted(input) {
60
+ return await this.serialize(async () => {
61
+ const before = await this.requireAvailable(input.sessionId);
62
+ if (before.turns.some((turn) => turn.started.runId === input.runId)) {
63
+ throw new ConversationEvidenceCorruptionError(`Run ${input.runId} is already bound in conversation ${input.sessionId}.`);
64
+ }
65
+ const record = {
66
+ format: FORMAT,
67
+ type: 'turn_started',
68
+ projectId: this.projectId,
69
+ sessionId: input.sessionId,
70
+ turnId: `turn_${randomUUID().replaceAll('-', '')}`,
71
+ runId: input.runId,
72
+ recordedAt: this.now(),
73
+ displayText: input.displayText,
74
+ user: input.user,
75
+ };
76
+ await this.append(input.sessionId, record);
77
+ const readBack = await this.requireAvailable(input.sessionId);
78
+ const persisted = readBack.turns.find((turn) => turn.started.turnId === record.turnId)?.started;
79
+ if (!isDeepStrictEqual(persisted, record)) {
80
+ throw new Error(`Turn ${record.turnId} was not durably verified before run ${record.runId}.`);
81
+ }
82
+ return record;
83
+ });
84
+ }
85
+ async recordTurnSettled(input) {
86
+ return await this.serialize(async () => {
87
+ const before = await this.requireAvailable(input.sessionId);
88
+ const turn = before.turns.find((candidate) => candidate.started.turnId === input.turnId);
89
+ if (!turn || turn.started.runId !== input.runId) {
90
+ throw new ConversationEvidenceCorruptionError(`Turn ${input.turnId} is not bound to run ${input.runId} in conversation ${input.sessionId}.`);
91
+ }
92
+ if (turn.settled) {
93
+ throw new ConversationEvidenceCorruptionError(`Turn ${input.turnId} already has a settlement record.`);
94
+ }
95
+ const record = {
96
+ format: FORMAT,
97
+ type: 'turn_settled',
98
+ projectId: this.projectId,
99
+ sessionId: input.sessionId,
100
+ turnId: input.turnId,
101
+ runId: input.runId,
102
+ recordedAt: this.now(),
103
+ outcome: input.outcome,
104
+ assistantText: input.assistantText,
105
+ };
106
+ await this.append(input.sessionId, record);
107
+ const readBack = await this.requireAvailable(input.sessionId);
108
+ const persisted = readBack.turns.find((candidate) => candidate.started.turnId === record.turnId)?.settled;
109
+ if (!isDeepStrictEqual(persisted, record)) {
110
+ throw new Error(`Settlement for turn ${record.turnId} was not durably verified.`);
111
+ }
112
+ return record;
113
+ });
114
+ }
115
+ async read(sessionId) {
116
+ await this.tail;
117
+ return await this.readUnlocked(sessionId);
118
+ }
119
+ /** Resolve and verify the immutable turn sequence visible to one conversation. */
120
+ async resolveLineage(sessionId) {
121
+ await this.tail;
122
+ const resolved = await this.resolveReferencesUnlocked(sessionId, new Set());
123
+ if (resolved.kind === 'unavailable')
124
+ return resolved;
125
+ const current = await this.readUnlocked(sessionId);
126
+ if (current.kind !== 'available') {
127
+ return {
128
+ kind: 'unavailable',
129
+ detail: `conversation ${sessionId} has no origin record`,
130
+ };
131
+ }
132
+ const cache = new Map([[sessionId, current]]);
133
+ const turns = [];
134
+ for (const reference of resolved.references) {
135
+ let owner = cache.get(reference.sessionId);
136
+ if (!owner) {
137
+ owner = await this.readUnlocked(reference.sessionId);
138
+ cache.set(reference.sessionId, owner);
139
+ }
140
+ if (owner.kind !== 'available') {
141
+ throw new ConversationEvidenceCorruptionError(`Fork lineage for conversation ${sessionId} names missing conversation ${reference.sessionId}.`);
142
+ }
143
+ const evidence = owner.turns.find((turn) => turn.started.turnId === reference.turnId);
144
+ if (!evidence) {
145
+ throw new ConversationEvidenceCorruptionError(`Fork lineage for conversation ${sessionId} names missing local turn ${reference.turnId} in ${reference.sessionId}.`);
146
+ }
147
+ turns.push({ reference, evidence });
148
+ }
149
+ return {
150
+ kind: 'available',
151
+ origin: current.origin,
152
+ localTurns: current.turns,
153
+ turns,
154
+ };
155
+ }
156
+ async serialize(operation) {
157
+ const result = this.tail.then(operation);
158
+ this.tail = result.then(() => undefined, () => undefined);
159
+ return await result;
160
+ }
161
+ path(sessionId) {
162
+ return join(this.paths.sessionDir(this.projectId, sessionId), FILE);
163
+ }
164
+ async append(sessionId, record) {
165
+ const path = this.path(sessionId);
166
+ let handle;
167
+ try {
168
+ handle = await open(path, 'a', 0o600);
169
+ await handle.writeFile(`${JSON.stringify(record)}\n`, 'utf-8');
170
+ await handle.sync();
171
+ }
172
+ finally {
173
+ await handle?.close();
174
+ }
175
+ }
176
+ async requireAvailable(sessionId) {
177
+ const evidence = await this.readUnlocked(sessionId);
178
+ if (evidence.kind !== 'available') {
179
+ throw new ConversationEvidenceCorruptionError(`Conversation ${sessionId} has no origin record.`);
180
+ }
181
+ return evidence;
182
+ }
183
+ async readUnlocked(sessionId) {
184
+ const path = this.path(sessionId);
185
+ let raw;
186
+ try {
187
+ raw = await readFile(path, 'utf-8');
188
+ }
189
+ catch (error) {
190
+ if (isMissing(error))
191
+ return { kind: 'not-recorded' };
192
+ throw error;
193
+ }
194
+ if (raw.length === 0 || !raw.endsWith('\n')) {
195
+ throw new ConversationEvidenceCorruptionError(`Conversation evidence in ${path} is empty or has a torn final record.`);
196
+ }
197
+ const records = raw
198
+ .slice(0, -1)
199
+ .split('\n')
200
+ .map((line, index) => parseRecord(line, index + 1, path, this.projectId, sessionId));
201
+ const origin = records[0];
202
+ if (origin?.type !== 'conversation_started') {
203
+ throw new ConversationEvidenceCorruptionError(`Conversation evidence in ${path} does not start with its origin.`);
204
+ }
205
+ if (records.slice(1).some((record) => record.type === 'conversation_started')) {
206
+ throw new ConversationEvidenceCorruptionError(`Conversation evidence in ${path} contains more than one origin.`);
207
+ }
208
+ const turns = [];
209
+ const byTurn = new Map();
210
+ const runIds = new Set();
211
+ for (const record of records.slice(1)) {
212
+ if (record.type === 'turn_started') {
213
+ if (byTurn.has(record.turnId) || runIds.has(record.runId)) {
214
+ throw new ConversationEvidenceCorruptionError(`Conversation evidence in ${path} reuses turn ${record.turnId} or run ${record.runId}.`);
215
+ }
216
+ const turn = { started: record };
217
+ turns.push(turn);
218
+ byTurn.set(record.turnId, turn);
219
+ runIds.add(record.runId);
220
+ continue;
221
+ }
222
+ if (record.type === 'turn_settled') {
223
+ const turn = byTurn.get(record.turnId);
224
+ if (!turn || turn.started.runId !== record.runId || turn.settled) {
225
+ throw new ConversationEvidenceCorruptionError(`Conversation evidence in ${path} has an orphan, mismatched, or duplicate settlement for turn ${record.turnId}.`);
226
+ }
227
+ turn.settled = record;
228
+ }
229
+ }
230
+ return { kind: 'available', origin, turns };
231
+ }
232
+ async resolveReferencesUnlocked(sessionId, visiting) {
233
+ if (visiting.has(sessionId)) {
234
+ throw new ConversationEvidenceCorruptionError(`Fork lineage contains a cycle through conversation ${sessionId}.`);
235
+ }
236
+ visiting.add(sessionId);
237
+ try {
238
+ const evidence = await this.readUnlocked(sessionId);
239
+ if (evidence.kind !== 'available') {
240
+ return {
241
+ kind: 'unavailable',
242
+ detail: `conversation ${sessionId} has no origin record`,
243
+ };
244
+ }
245
+ const local = evidence.turns.map((turn) => ({
246
+ sessionId,
247
+ turnId: turn.started.turnId,
248
+ }));
249
+ const origin = evidence.origin.origin;
250
+ if (origin.kind === 'new')
251
+ return { kind: 'available', references: local };
252
+ if (origin.kind === 'fork-unresolved') {
253
+ return {
254
+ kind: 'unavailable',
255
+ detail: `conversation ${sessionId} has an unresolved copied prefix from ${origin.sourceSessionId}`,
256
+ };
257
+ }
258
+ const source = await this.resolveReferencesUnlocked(origin.sourceSessionId, visiting);
259
+ if (source.kind === 'unavailable')
260
+ return source;
261
+ if (origin.turns.length > source.references.length ||
262
+ origin.turns.some((reference, index) => !sameReference(reference, source.references[index]))) {
263
+ throw new ConversationEvidenceCorruptionError(`Fork lineage for conversation ${sessionId} is not a prefix of source ${origin.sourceSessionId}.`);
264
+ }
265
+ return { kind: 'available', references: [...origin.turns, ...local] };
266
+ }
267
+ finally {
268
+ visiting.delete(sessionId);
269
+ }
270
+ }
271
+ }
272
+ function parseRecord(line, lineNumber, path, projectId, sessionId) {
273
+ let value;
274
+ try {
275
+ value = JSON.parse(line);
276
+ }
277
+ catch (error) {
278
+ throw new ConversationEvidenceCorruptionError(`Conversation evidence in ${path} has invalid JSON at line ${lineNumber}: ${error instanceof Error ? error.message : String(error)}`);
279
+ }
280
+ if (!isObject(value) || value.format !== FORMAT) {
281
+ throw new ConversationEvidenceCorruptionError(`Conversation evidence in ${path} has an unsupported record at line ${lineNumber}.`);
282
+ }
283
+ let recordProjectId;
284
+ let recordSessionId;
285
+ try {
286
+ recordProjectId = asProjectId(requiredString(value.projectId, 'projectId'));
287
+ recordSessionId = asSessionId(requiredString(value.sessionId, 'sessionId'));
288
+ }
289
+ catch (error) {
290
+ throw invalidRecord(path, lineNumber, error);
291
+ }
292
+ if (recordProjectId !== projectId || recordSessionId !== sessionId) {
293
+ throw new ConversationEvidenceCorruptionError(`Conversation evidence in ${path} is attributed to a different project or session at line ${lineNumber}.`);
294
+ }
295
+ const recordedAt = requiredTimestamp(value.recordedAt);
296
+ switch (value.type) {
297
+ case 'conversation_started':
298
+ return {
299
+ format: FORMAT,
300
+ type: 'conversation_started',
301
+ projectId: recordProjectId,
302
+ sessionId: recordSessionId,
303
+ recordedAt,
304
+ origin: parseOrigin(value.origin, path, lineNumber, recordSessionId),
305
+ };
306
+ case 'turn_started': {
307
+ let runId;
308
+ try {
309
+ runId = asRunId(requiredString(value.runId, 'runId'));
310
+ }
311
+ catch (error) {
312
+ throw invalidRecord(path, lineNumber, error);
313
+ }
314
+ const turnId = requiredString(value.turnId, 'turnId');
315
+ if (!/^turn_[a-z0-9]+$/.test(turnId))
316
+ throw invalidRecord(path, lineNumber, 'turnId');
317
+ return {
318
+ format: FORMAT,
319
+ type: 'turn_started',
320
+ projectId: recordProjectId,
321
+ sessionId: recordSessionId,
322
+ turnId,
323
+ runId,
324
+ recordedAt,
325
+ displayText: requiredString(value.displayText, 'displayText'),
326
+ user: parseUserMessage(value.user, path, lineNumber),
327
+ };
328
+ }
329
+ case 'turn_settled': {
330
+ let runId;
331
+ try {
332
+ runId = asRunId(requiredString(value.runId, 'runId'));
333
+ }
334
+ catch (error) {
335
+ throw invalidRecord(path, lineNumber, error);
336
+ }
337
+ const turnId = requiredString(value.turnId, 'turnId');
338
+ if (!/^turn_[a-z0-9]+$/.test(turnId))
339
+ throw invalidRecord(path, lineNumber, 'turnId');
340
+ const outcome = value.outcome;
341
+ if (!['completed', 'stopped', 'failed', 'cancelled'].includes(String(outcome))) {
342
+ throw invalidRecord(path, lineNumber, 'outcome');
343
+ }
344
+ return {
345
+ format: FORMAT,
346
+ type: 'turn_settled',
347
+ projectId: recordProjectId,
348
+ sessionId: recordSessionId,
349
+ turnId,
350
+ runId,
351
+ recordedAt,
352
+ outcome: outcome,
353
+ assistantText: requiredString(value.assistantText, 'assistantText'),
354
+ };
355
+ }
356
+ default:
357
+ throw new ConversationEvidenceCorruptionError(`Conversation evidence in ${path} has unknown record type ${String(value.type)} at line ${lineNumber}.`);
358
+ }
359
+ }
360
+ function parseOrigin(value, path, line, sessionId) {
361
+ if (!isObject(value))
362
+ throw invalidRecord(path, line, 'origin');
363
+ if (value.kind === 'new')
364
+ return { kind: 'new' };
365
+ if (value.kind !== 'fork' && value.kind !== 'fork-unresolved') {
366
+ throw invalidRecord(path, line, 'origin.kind');
367
+ }
368
+ let sourceSessionId;
369
+ try {
370
+ sourceSessionId = asSessionId(requiredString(value.sourceSessionId, 'sourceSessionId'));
371
+ }
372
+ catch (error) {
373
+ throw invalidRecord(path, line, error);
374
+ }
375
+ if (!Number.isSafeInteger(value.copiedMessages) || Number(value.copiedMessages) < 0) {
376
+ throw invalidRecord(path, line, 'copiedMessages');
377
+ }
378
+ if (sourceSessionId === sessionId)
379
+ throw invalidRecord(path, line, 'sourceSessionId');
380
+ if (value.kind === 'fork') {
381
+ if (!Array.isArray(value.turns))
382
+ throw invalidRecord(path, line, 'turns');
383
+ const seen = new Set();
384
+ const turns = value.turns.map((entry) => {
385
+ if (!isObject(entry))
386
+ throw invalidRecord(path, line, 'turn reference');
387
+ let owner;
388
+ try {
389
+ owner = asSessionId(requiredString(entry.sessionId, 'turn.sessionId'));
390
+ }
391
+ catch (error) {
392
+ throw invalidRecord(path, line, error);
393
+ }
394
+ const turnId = requiredString(entry.turnId, 'turn.turnId');
395
+ if (!/^turn_[a-z0-9]+$/.test(turnId))
396
+ throw invalidRecord(path, line, 'turn.turnId');
397
+ const key = `${owner}\0${turnId}`;
398
+ if (seen.has(key))
399
+ throw invalidRecord(path, line, 'duplicate turn reference');
400
+ seen.add(key);
401
+ return { sessionId: owner, turnId };
402
+ });
403
+ return {
404
+ kind: 'fork',
405
+ sourceSessionId,
406
+ copiedMessages: Number(value.copiedMessages),
407
+ turns,
408
+ };
409
+ }
410
+ return {
411
+ kind: 'fork-unresolved',
412
+ sourceSessionId,
413
+ copiedMessages: Number(value.copiedMessages),
414
+ };
415
+ }
416
+ function parseUserMessage(value, path, line) {
417
+ if (!isObject(value) || value.role !== 'user' || typeof value.content !== 'string') {
418
+ throw invalidRecord(path, line, 'user');
419
+ }
420
+ if (value.timestamp !== undefined && !Number.isFinite(value.timestamp)) {
421
+ throw invalidRecord(path, line, 'user.timestamp');
422
+ }
423
+ if (value.attachments !== undefined) {
424
+ if (!Array.isArray(value.attachments))
425
+ throw invalidRecord(path, line, 'user.attachments');
426
+ for (const attachment of value.attachments)
427
+ validateAttachment(attachment, path, line);
428
+ }
429
+ if (value.source !== undefined) {
430
+ if (isObject(value.source) && value.source.type === 'project-instructions') {
431
+ if (!isProjectInstructionMessageSource(value.source)) {
432
+ throw invalidRecord(path, line, 'user.source');
433
+ }
434
+ }
435
+ else if (!isObject(value.source) ||
436
+ value.source.type !== 'goal-round' ||
437
+ typeof value.source.goalId !== 'string' ||
438
+ typeof value.source.objective !== 'string' ||
439
+ !Number.isSafeInteger(value.source.goalRevision) ||
440
+ Number(value.source.goalRevision) < 1 ||
441
+ !Number.isSafeInteger(value.source.round) ||
442
+ Number(value.source.round) < 1 ||
443
+ !Number.isSafeInteger(value.source.maxGoalRounds) ||
444
+ Number(value.source.maxGoalRounds) < 1) {
445
+ throw invalidRecord(path, line, 'user.source');
446
+ }
447
+ else {
448
+ try {
449
+ asGoalId(value.source.goalId);
450
+ }
451
+ catch {
452
+ throw invalidRecord(path, line, 'user.source.goalId');
453
+ }
454
+ }
455
+ }
456
+ return value;
457
+ }
458
+ function validateAttachment(value, path, line) {
459
+ if (!isObject(value) || typeof value.mediaType !== 'string') {
460
+ throw invalidRecord(path, line, 'attachment');
461
+ }
462
+ if (value.type === 'stored') {
463
+ if (typeof value.ref !== 'string' ||
464
+ (value.kind !== 'image' && value.kind !== 'document') ||
465
+ (value.name !== undefined && typeof value.name !== 'string') ||
466
+ (value.citations !== undefined && typeof value.citations !== 'boolean')) {
467
+ throw invalidRecord(path, line, 'stored attachment');
468
+ }
469
+ return;
470
+ }
471
+ if (typeof value.data !== 'string')
472
+ throw invalidRecord(path, line, 'inline attachment');
473
+ if (value.type === 'document') {
474
+ if ((value.name !== undefined && typeof value.name !== 'string') ||
475
+ (value.citations !== undefined && typeof value.citations !== 'boolean')) {
476
+ throw invalidRecord(path, line, 'document attachment');
477
+ }
478
+ return;
479
+ }
480
+ if (value.type !== undefined && value.type !== 'image') {
481
+ throw invalidRecord(path, line, 'attachment.type');
482
+ }
483
+ }
484
+ function requiredString(value, field) {
485
+ if (typeof value !== 'string')
486
+ throw new TypeError(`${field} must be a string`);
487
+ return value;
488
+ }
489
+ function requiredTimestamp(value) {
490
+ if (!Number.isFinite(value) || Number(value) < 0)
491
+ throw new TypeError('recordedAt must be a timestamp');
492
+ return Number(value);
493
+ }
494
+ function invalidRecord(path, line, detail) {
495
+ return new ConversationEvidenceCorruptionError(`Conversation evidence in ${path} has an invalid record at line ${line}: ${detail instanceof Error ? detail.message : String(detail)}.`);
496
+ }
497
+ function isObject(value) {
498
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
499
+ }
500
+ function sameReference(left, right) {
501
+ return left.sessionId === right?.sessionId && left.turnId === right?.turnId;
502
+ }
503
+ function isMissing(error) {
504
+ return isObject(error) && error.code === 'ENOENT';
505
+ }
506
+ //# sourceMappingURL=turn-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-evidence.js","sourceRoot":"","sources":["../../../src/integrations/sessions/turn-evidence.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@
11
11
  * store backs the AgentManager, so sub-agent bookkeeping never touches the
12
12
  * CLI's on-disk `/resume` conversation store.
13
13
  */
14
- import { type AuthorizationGateConfig, type LLMProvider, type RunEvent, type TaskScheduler, type ToolDefinition, type ToolRegistryContract } from '@namzu/sdk';
14
+ import { type AuthorizationGateConfig, type LLMProvider, type ProjectInstructionContext, type RunEvent, type SandboxProvider, type TaskScheduler, type ToolDefinition, type ToolRegistryContract } from '@namzu/sdk';
15
15
  export declare const GENERAL_PURPOSE_SUBAGENT = "general-purpose";
16
16
  export interface SubagentRuntimeOptions {
17
17
  readonly cwd: string;
@@ -21,17 +21,12 @@ export interface SubagentRuntimeOptions {
21
21
  /** Build the sub-agent's tool registry (its own working set). */
22
22
  readonly buildTools: () => ToolRegistryContract;
23
23
  readonly authorizationGate?: AuthorizationGateConfig;
24
- /**
25
- * The project's own instruction block, already composed, or absent when the
26
- * working directory declares none.
27
- *
28
- * A sub-agent runs in the same directory and writes the same code as the
29
- * parent that dispatched it, so the project's standing policy applies to it
30
- * identically. Omitting it would produce the shape where the rules hold
31
- * until the moment work is delegated, and the delegating turn cannot tell:
32
- * the child reports success either way.
33
- */
34
- readonly projectInstructions?: string;
24
+ /** Use the same execution boundary the parent session reports. */
25
+ readonly sandboxProvider?: SandboxProvider;
26
+ /** Bound child teardown with the parent's operator-selected value. */
27
+ readonly sandboxTeardownTimeoutMs?: number;
28
+ /** A fresh drain cursor over the session's shared project-policy state. */
29
+ readonly projectInstructionContext?: () => ProjectInstructionContext;
35
30
  /**
36
31
  * Produces the "where and when" block for a child, at the moment the child
37
32
  * is built rather than once for the session.
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/integrations/subagents/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAMN,KAAK,uBAAuB,EAO5B,KAAK,WAAW,EAIhB,KAAK,QAAQ,EAEb,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EASzB,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,wBAAwB,oBAAoB,CAAA;AAczD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,QAAQ,CAAC,aAAa,EAAE,MAAM,WAAW,CAAA;IACzC,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,oBAAoB,CAAA;IAC/C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,uBAAuB,CAAA;IACpD;;;;;;;;;OASG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC;;;;;;;;OAQG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAChD,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CAC5C;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3C;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,eAAe,CAAC,CA4J1B"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/integrations/subagents/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAMN,KAAK,uBAAuB,EAO5B,KAAK,WAAW,EAEhB,KAAK,yBAAyB,EAG9B,KAAK,QAAQ,EACb,KAAK,eAAe,EAEpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EASzB,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,wBAAwB,oBAAoB,CAAA;AAczD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,QAAQ,CAAC,aAAa,EAAE,MAAM,WAAW,CAAA;IACzC,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,oBAAoB,CAAA;IAC/C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,uBAAuB,CAAA;IACpD,kEAAkE;IAClE,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAA;IAC1C,sEAAsE;IACtE,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAA;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,yBAAyB,CAAA;IACpE;;;;;;;;OAQG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAChD,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CAC5C;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3C;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAmK1B"}
@@ -32,7 +32,11 @@ export async function createSubagentRuntime(opts) {
32
32
  const tenantId = asTenantId('tnt_namzu-cli');
33
33
  const store = new InMemorySessionStore();
34
34
  const topicStore = new InMemoryTopicStore();
35
- const userActor = { kind: 'user', userId: asUserId('usr_namzu'), tenantId };
35
+ const userActor = {
36
+ kind: 'user',
37
+ userId: asUserId('usr_namzu'),
38
+ tenantId,
39
+ };
36
40
  const project = await store.createProject({ tenantId, name: 'namzu-cli' }, tenantId);
37
41
  const thread = await topicStore.createTopic({ projectId: project.id, title: 'namzu-cli' }, tenantId);
38
42
  // No workspace gate here, and that is a finding rather than an omission.
@@ -57,13 +61,13 @@ export async function createSubagentRuntime(opts) {
57
61
  });
58
62
  const registry = new AgentRegistry();
59
63
  registry.register(buildDefinition(GENERAL_PURPOSE_SUBAGENT, 'A general-purpose sub-agent.', SUBAGENT_PROMPT, opts));
60
- const threadManager = new TopicManager({ topicStore, sessionStore: store });
64
+ const topicManager = new TopicManager({ topicStore, sessionStore: store });
61
65
  const manager = new AgentManager(registry, undefined, {
62
66
  sessionStore: store,
63
67
  summaryMaterializer: materializer,
64
68
  workspaceRegistry: new WorkspaceBackendRegistry(),
65
69
  capacity: new DefaultCapacityValidator(store),
66
- threadManager,
70
+ topicManager,
67
71
  });
68
72
  const taskContext = {
69
73
  parentRunId: asRunId('run_namzu-cli'),
@@ -149,7 +153,10 @@ export async function createSubagentRuntime(opts) {
149
153
  error: `Sub-agent ${agentId} ${completed.state}: ${completed.result?.lastError ?? resultText ?? '(no detail)'}`,
150
154
  };
151
155
  }
152
- return { success: true, output: resultText || '(sub-agent returned no text)' };
156
+ return {
157
+ success: true,
158
+ output: resultText || '(sub-agent returned no text)',
159
+ };
153
160
  }
154
161
  finally {
155
162
  // A per-call dynamic specialist is single-use — drop its definition
@@ -178,12 +185,7 @@ function buildDefinition(id, description, systemPrompt, opts) {
178
185
  // A specialist persona is layered on top of the anti-fabrication base so a
179
186
  // dynamic role can't opt out of the "don't invent results" guardrails.
180
187
  //
181
- // The project's instructions go last, after both, for the same reason they
182
- // go after the identity block on the parent: they are text read off the
183
- // working directory, and the rules they must not be able to rewrite are
184
- // established before they are read.
185
188
  const base = systemPrompt === SUBAGENT_PROMPT ? SUBAGENT_PROMPT : `${systemPrompt}\n\n${SUBAGENT_PROMPT}`;
186
- const prompt = opts.projectInstructions ? `${base}\n\n${opts.projectInstructions}` : base;
187
189
  return {
188
190
  info: {
189
191
  id,
@@ -210,8 +212,15 @@ function buildDefinition(id, description, systemPrompt, opts) {
210
212
  maxIterations: 40,
211
213
  provider: opts.buildProvider(),
212
214
  tools: opts.buildTools(),
213
- systemPrompt: environment ? `${prompt}\n\n${environment}` : prompt,
215
+ systemPrompt: environment ? `${base}\n\n${environment}` : base,
216
+ ...(opts.projectInstructionContext
217
+ ? { projectInstructionContext: opts.projectInstructionContext() }
218
+ : {}),
214
219
  ...(opts.authorizationGate ? { authorizationGate: opts.authorizationGate } : {}),
220
+ ...(opts.sandboxProvider ? { sandboxProvider: opts.sandboxProvider } : {}),
221
+ ...(opts.sandboxTeardownTimeoutMs !== undefined
222
+ ? { sandboxTeardownTimeoutMs: opts.sandboxTeardownTimeoutMs }
223
+ : {}),
215
224
  };
216
225
  },
217
226
  };