@orion-agents/orion-code 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.
Files changed (170) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +73 -14
  3. package/README.zh-CN.md +63 -13
  4. package/bin/orion +15 -4
  5. package/dist/cli.js +51 -172
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/model-command-handlers.d.ts +2 -2
  8. package/dist/commands/model-command-handlers.d.ts.map +1 -1
  9. package/dist/commands/model-command-handlers.js +113 -32
  10. package/dist/commands/model-command-handlers.js.map +1 -1
  11. package/dist/commands/session-command-handlers.d.ts +1 -1
  12. package/dist/commands/session-command-handlers.d.ts.map +1 -1
  13. package/dist/commands/session-command-handlers.js +121 -16
  14. package/dist/commands/session-command-handlers.js.map +1 -1
  15. package/dist/commands/types.d.ts +14 -2
  16. package/dist/commands/types.d.ts.map +1 -1
  17. package/dist/commands/types.js +1 -1
  18. package/dist/commands/types.js.map +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.js +1 -1
  21. package/dist/runtime/agent-loop.d.ts +2 -0
  22. package/dist/runtime/agent-loop.d.ts.map +1 -1
  23. package/dist/runtime/agent-loop.js +4 -3
  24. package/dist/runtime/agent-loop.js.map +1 -1
  25. package/dist/runtime/agent-runtime-controller.d.ts +32 -1
  26. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  27. package/dist/runtime/agent-runtime-controller.js +250 -31
  28. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  29. package/dist/runtime/agent-runtime-runner.d.ts +3 -0
  30. package/dist/runtime/agent-runtime-runner.d.ts.map +1 -1
  31. package/dist/runtime/goal-runtime-coordinator.d.ts +6 -0
  32. package/dist/runtime/goal-runtime-coordinator.d.ts.map +1 -1
  33. package/dist/runtime/goal-runtime-coordinator.js +5 -0
  34. package/dist/runtime/goal-runtime-coordinator.js.map +1 -1
  35. package/dist/runtime/legacy-thread-materializer.d.ts +18 -0
  36. package/dist/runtime/legacy-thread-materializer.d.ts.map +1 -1
  37. package/dist/runtime/legacy-thread-materializer.js +27 -12
  38. package/dist/runtime/legacy-thread-materializer.js.map +1 -1
  39. package/dist/runtime/orion-runtime-v1.d.ts +3 -0
  40. package/dist/runtime/orion-runtime-v1.d.ts.map +1 -1
  41. package/dist/runtime/orion-runtime-v1.js +8 -1
  42. package/dist/runtime/orion-runtime-v1.js.map +1 -1
  43. package/dist/runtime/orion-session-runner.d.ts +7 -1
  44. package/dist/runtime/orion-session-runner.d.ts.map +1 -1
  45. package/dist/runtime/orion-session-runner.js +35 -3
  46. package/dist/runtime/orion-session-runner.js.map +1 -1
  47. package/dist/runtime/product-bootstrap.d.ts +22 -0
  48. package/dist/runtime/product-bootstrap.d.ts.map +1 -0
  49. package/dist/runtime/product-bootstrap.js +374 -0
  50. package/dist/runtime/product-bootstrap.js.map +1 -0
  51. package/dist/runtime/product-orion-runtime.d.ts +2 -1
  52. package/dist/runtime/product-orion-runtime.d.ts.map +1 -1
  53. package/dist/runtime/product-orion-runtime.js +114 -16
  54. package/dist/runtime/product-orion-runtime.js.map +1 -1
  55. package/dist/runtime/protocol/runtime-protocol-v1.d.ts +1 -1
  56. package/dist/runtime/protocol/runtime-protocol-v1.js +1 -1
  57. package/dist/runtime/protocol/runtime-protocol-v1.js.map +1 -1
  58. package/dist/runtime/release-receipts.d.ts +63 -2
  59. package/dist/runtime/release-receipts.d.ts.map +1 -1
  60. package/dist/runtime/release-receipts.js +298 -7
  61. package/dist/runtime/release-receipts.js.map +1 -1
  62. package/dist/runtime/session-history-recovery.d.ts +19 -0
  63. package/dist/runtime/session-history-recovery.d.ts.map +1 -0
  64. package/dist/runtime/session-history-recovery.js +45 -0
  65. package/dist/runtime/session-history-recovery.js.map +1 -0
  66. package/dist/runtime/step-snapshot.d.ts.map +1 -1
  67. package/dist/runtime/step-snapshot.js +22 -2
  68. package/dist/runtime/step-snapshot.js.map +1 -1
  69. package/dist/runtime/subagents/runtime-integration.d.ts +1 -1
  70. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
  71. package/dist/runtime/subagents/runtime-integration.js +5 -2
  72. package/dist/runtime/subagents/runtime-integration.js.map +1 -1
  73. package/dist/runtime/thread-event-store.d.ts +27 -0
  74. package/dist/runtime/thread-event-store.d.ts.map +1 -1
  75. package/dist/runtime/thread-event-store.js +119 -17
  76. package/dist/runtime/thread-event-store.js.map +1 -1
  77. package/dist/runtime/thread-projection.d.ts +10 -0
  78. package/dist/runtime/thread-projection.d.ts.map +1 -1
  79. package/dist/runtime/thread-projection.js +40 -0
  80. package/dist/runtime/thread-projection.js.map +1 -1
  81. package/dist/runtime/thread-runtime.d.ts +3 -1
  82. package/dist/runtime/thread-runtime.d.ts.map +1 -1
  83. package/dist/runtime/thread-runtime.js +6 -0
  84. package/dist/runtime/thread-runtime.js.map +1 -1
  85. package/dist/runtime/thread-session-view.d.ts +88 -0
  86. package/dist/runtime/thread-session-view.d.ts.map +1 -0
  87. package/dist/runtime/thread-session-view.js +327 -0
  88. package/dist/runtime/thread-session-view.js.map +1 -0
  89. package/dist/runtime/thread-ui-adapter.d.ts +4 -0
  90. package/dist/runtime/thread-ui-adapter.d.ts.map +1 -1
  91. package/dist/runtime/thread-ui-adapter.js +193 -5
  92. package/dist/runtime/thread-ui-adapter.js.map +1 -1
  93. package/dist/runtime/ui-events.d.ts +37 -0
  94. package/dist/runtime/ui-events.d.ts.map +1 -1
  95. package/dist/runtime/ui-events.js +1 -0
  96. package/dist/runtime/ui-events.js.map +1 -1
  97. package/dist/runtime/ui-view-model.d.ts +3 -0
  98. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  99. package/dist/runtime/ui-view-model.js +10 -3
  100. package/dist/runtime/ui-view-model.js.map +1 -1
  101. package/dist/services/file-lock.d.ts.map +1 -1
  102. package/dist/services/file-lock.js +42 -17
  103. package/dist/services/file-lock.js.map +1 -1
  104. package/dist/services/global-config.d.ts +25 -0
  105. package/dist/services/global-config.d.ts.map +1 -1
  106. package/dist/services/global-config.js +373 -5
  107. package/dist/services/global-config.js.map +1 -1
  108. package/dist/services/session-storage.d.ts +67 -0
  109. package/dist/services/session-storage.d.ts.map +1 -1
  110. package/dist/services/session-storage.js +327 -61
  111. package/dist/services/session-storage.js.map +1 -1
  112. package/dist/services/settings-coordinator.d.ts +174 -0
  113. package/dist/services/settings-coordinator.d.ts.map +1 -0
  114. package/dist/services/settings-coordinator.js +605 -0
  115. package/dist/services/settings-coordinator.js.map +1 -0
  116. package/dist/services/settings-document-repository.d.ts +138 -0
  117. package/dist/services/settings-document-repository.d.ts.map +1 -0
  118. package/dist/services/settings-document-repository.js +551 -0
  119. package/dist/services/settings-document-repository.js.map +1 -0
  120. package/dist/terminal-ui/launch.d.ts.map +1 -1
  121. package/dist/terminal-ui/launch.js +7 -0
  122. package/dist/terminal-ui/launch.js.map +1 -1
  123. package/dist/tools/web.js +1 -1
  124. package/dist/tools/web.js.map +1 -1
  125. package/dist/tui-ui/chrome-view-model.d.ts.map +1 -1
  126. package/dist/tui-ui/chrome-view-model.js +21 -7
  127. package/dist/tui-ui/chrome-view-model.js.map +1 -1
  128. package/dist/tui-ui/launch.d.ts.map +1 -1
  129. package/dist/tui-ui/launch.js +13 -0
  130. package/dist/tui-ui/launch.js.map +1 -1
  131. package/dist/tui-ui/state.d.ts.map +1 -1
  132. package/dist/tui-ui/state.js +7 -0
  133. package/dist/tui-ui/state.js.map +1 -1
  134. package/dist/web/event-hub.d.ts +39 -0
  135. package/dist/web/event-hub.d.ts.map +1 -0
  136. package/dist/web/event-hub.js +263 -0
  137. package/dist/web/event-hub.js.map +1 -0
  138. package/dist/web/index.d.ts +6 -0
  139. package/dist/web/index.d.ts.map +1 -0
  140. package/dist/web/index.js +28 -0
  141. package/dist/web/index.js.map +1 -0
  142. package/dist/web/launch.d.ts +9 -0
  143. package/dist/web/launch.d.ts.map +1 -0
  144. package/dist/web/launch.js +64 -0
  145. package/dist/web/launch.js.map +1 -0
  146. package/dist/web/protocol.d.ts +346 -0
  147. package/dist/web/protocol.d.ts.map +1 -0
  148. package/dist/web/protocol.js +348 -0
  149. package/dist/web/protocol.js.map +1 -0
  150. package/dist/web/server.d.ts +20 -0
  151. package/dist/web/server.d.ts.map +1 -0
  152. package/dist/web/server.js +498 -0
  153. package/dist/web/server.js.map +1 -0
  154. package/dist/web/workbench-controller.d.ts +63 -0
  155. package/dist/web/workbench-controller.d.ts.map +1 -0
  156. package/dist/web/workbench-controller.js +774 -0
  157. package/dist/web/workbench-controller.js.map +1 -0
  158. package/dist/web-client/assets/index-BAEO71Gp.css +1 -0
  159. package/dist/web-client/assets/index-DSkFy7gM.js +13 -0
  160. package/dist/web-client/index.html +16 -0
  161. package/docs/architecture/v0.3.0-web-api.yaml +1309 -0
  162. package/docs/migration/v0.2.2-to-v0.3.0-settings.md +114 -0
  163. package/docs/migration/v0.2.2-to-v0.3.0.md +55 -0
  164. package/docs/orion.example.json +9 -2
  165. package/docs/plan/v0.3.0-node-runtime-compatibility-plan.md +57 -0
  166. package/docs/plan/v0.3.0-settings-integration-plan.md +740 -0
  167. package/docs/plan/v0.3.0-web-workbench-plan.md +325 -0
  168. package/docs/readme.md +12 -1
  169. package/npm-shrinkwrap.json +1777 -424
  170. package/package.json +33 -9
@@ -0,0 +1,327 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThreadSessionViewError = void 0;
4
+ exports.loadThreadSessionViewV1 = loadThreadSessionViewV1;
5
+ exports.openThreadSessionViewV1 = openThreadSessionViewV1;
6
+ exports.openThreadSessionRuntimeActivationV1 = openThreadSessionRuntimeActivationV1;
7
+ exports.loadThreadSessionSummaryV1 = loadThreadSessionSummaryV1;
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const legacy_thread_materializer_1 = require("./legacy-thread-materializer");
11
+ const session_history_recovery_1 = require("./session-history-recovery");
12
+ class ThreadSessionViewError extends Error {
13
+ constructor(message) {
14
+ super(message);
15
+ this.code = 'ORION_THREAD_SESSION_VIEW_INVALID';
16
+ this.name = 'ThreadSessionViewError';
17
+ }
18
+ }
19
+ exports.ThreadSessionViewError = ThreadSessionViewError;
20
+ /**
21
+ * Resolve a Session identity through the cutover index and project its Thread
22
+ * facts without writing a legacy JSONL mirror. The cutover index remains the
23
+ * sole generation switch. Invalid authoritative model history is recovered
24
+ * from durable transcript facts with explicit diagnostics; invalid Thread
25
+ * identity, replay, or projection data still fails closed.
26
+ */
27
+ function loadThreadSessionViewV1(projectPath, sessionId) {
28
+ return openThreadSessionViewV1(projectPath, sessionId)?.view;
29
+ }
30
+ /** Capture the restore view and retain its already-verified Store for Runtime activation. */
31
+ function openThreadSessionViewV1(projectPath, sessionId) {
32
+ const captured = captureThreadSessionV1(projectPath, sessionId, true);
33
+ if (!captured)
34
+ return undefined;
35
+ const transcriptHistory = captured.summary.transcriptMessages.map(transcriptMessageToModelMessage);
36
+ let recovery;
37
+ if (captured.durableHistory) {
38
+ try {
39
+ recovery = (0, session_history_recovery_1.normalizeSessionModelHistoryV1)(parseModelHistory(captured.durableHistory), 'turn_commit');
40
+ }
41
+ catch {
42
+ const transcriptRecovery = (0, session_history_recovery_1.normalizeSessionModelHistoryV1)(transcriptHistory, 'transcript');
43
+ recovery = {
44
+ ...transcriptRecovery,
45
+ diagnostics: [
46
+ {
47
+ code: 'authoritative_history_invalid',
48
+ message: 'The authoritative model history was invalid; Orion recovered from durable transcript facts.',
49
+ },
50
+ ...transcriptRecovery.diagnostics,
51
+ ],
52
+ };
53
+ }
54
+ }
55
+ else {
56
+ recovery = (0, session_history_recovery_1.normalizeSessionModelHistoryV1)(transcriptHistory, 'transcript');
57
+ }
58
+ const view = deepFreeze({
59
+ ...captured.summary,
60
+ modelHistory: recovery.messages,
61
+ modelHistorySource: recovery.source,
62
+ diagnostics: recovery.diagnostics,
63
+ ...(captured.latestTurnCommit ? { latestTurnCommit: captured.latestTurnCommit } : {}),
64
+ ...(captured.latestPlanTurnCommit
65
+ ? { latestPlanTurnCommit: captured.latestPlanTurnCommit }
66
+ : {}),
67
+ });
68
+ return Object.freeze({
69
+ view,
70
+ runtimeActivation: createRuntimeActivation(projectPath, sessionId, captured, view),
71
+ });
72
+ }
73
+ /**
74
+ * Open only the verified Runtime hand-off. This is used after an atomic legacy
75
+ * cutover, where the provider history was already captured from the legacy
76
+ * source and rebuilding the complete transcript view would be duplicate work.
77
+ */
78
+ function openThreadSessionRuntimeActivationV1(projectPath, sessionId) {
79
+ const opened = (0, legacy_thread_materializer_1.openSessionStorageV1)(projectPath, sessionId);
80
+ if (opened.resolution.kind === 'legacy' || !('store' in opened))
81
+ return undefined;
82
+ const projection = opened.store.loadProjection();
83
+ return Object.freeze({
84
+ version: 1,
85
+ projectPath: (0, fs_1.realpathSync)((0, path_1.resolve)(projectPath)),
86
+ sessionId,
87
+ threadId: opened.resolution.threadId,
88
+ cursor: projection.cursor,
89
+ projectionDigest: projection.digest,
90
+ cutoverGeneration: opened.resolution.generation,
91
+ store: opened.store,
92
+ });
93
+ }
94
+ /** Load list/picker metadata without allowing model-history damage to fan out. */
95
+ function loadThreadSessionSummaryV1(projectPath, sessionId) {
96
+ return captureThreadSessionV1(projectPath, sessionId, false)?.summary;
97
+ }
98
+ function captureThreadSessionV1(projectPath, sessionId, includeDurableHistory) {
99
+ const opened = (0, legacy_thread_materializer_1.openSessionStorageV1)(projectPath, sessionId);
100
+ const { resolution } = opened;
101
+ if (resolution.kind === 'legacy' || !('store' in opened))
102
+ return undefined;
103
+ const { store } = opened;
104
+ const { projection, events, durableHistory, readModelHead } = captureStableThreadView(store, resolution.cursor, resolution.projectionDigest, includeDurableHistory);
105
+ const transcriptMessages = projectTranscriptMessages(projection.items, events);
106
+ const startedAt = events[0]?.timestamp ?? 0;
107
+ const updatedAt = events.at(-1)?.timestamp ?? startedAt;
108
+ const turnCommits = Object.values(projection.turns)
109
+ .flatMap(turn => (turn.commit ? [{ seq: turn.commit.seq, receipt: turn.commit.receipt }] : []))
110
+ .sort((left, right) => left.seq - right.seq);
111
+ const latestTurnCommit = turnCommits.at(-1);
112
+ const latestPlanTurnCommit = [...turnCommits]
113
+ .reverse()
114
+ .find(commit => turnCommitContainsPlan(commit.receipt));
115
+ return {
116
+ summary: deepFreeze({
117
+ version: 1,
118
+ sessionId,
119
+ threadId: resolution.threadId,
120
+ cursor: projection.cursor,
121
+ projectionDigest: projection.digest,
122
+ startedAt,
123
+ updatedAt,
124
+ historySizeBytes: readModelHead.log.bytes,
125
+ messageCount: transcriptMessages.length,
126
+ transcriptMessages,
127
+ readModel: {
128
+ cutoverGeneration: resolution.generation,
129
+ lastRecordHash: readModelHead.lastRecordHash,
130
+ log: readModelHead.log,
131
+ },
132
+ }),
133
+ durableHistory,
134
+ store,
135
+ cutoverGeneration: resolution.generation,
136
+ ...(latestTurnCommit ? { latestTurnCommit: Object.freeze(latestTurnCommit) } : {}),
137
+ ...(latestPlanTurnCommit ? { latestPlanTurnCommit: Object.freeze(latestPlanTurnCommit) } : {}),
138
+ };
139
+ }
140
+ function createRuntimeActivation(projectPath, sessionId, captured, view) {
141
+ return Object.freeze({
142
+ version: 1,
143
+ projectPath: (0, fs_1.realpathSync)((0, path_1.resolve)(projectPath)),
144
+ sessionId,
145
+ threadId: captured.summary.threadId,
146
+ cursor: captured.summary.cursor,
147
+ projectionDigest: captured.summary.projectionDigest,
148
+ cutoverGeneration: captured.cutoverGeneration,
149
+ store: captured.store,
150
+ view,
151
+ });
152
+ }
153
+ function turnCommitContainsPlan(receipt) {
154
+ try {
155
+ const parsed = JSON.parse(receipt);
156
+ return typeof parsed.planReceipt === 'string' && parsed.planReceipt.length > 0;
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ }
162
+ function captureStableThreadView(store, minimumCursor, minimumProjectionDigest, includeDurableHistory) {
163
+ for (let attempt = 0; attempt < 3; attempt += 1) {
164
+ const projection = store.loadProjection();
165
+ if (projection.cursor < minimumCursor) {
166
+ throw new ThreadSessionViewError(`Thread ${store.threadId} moved behind its cutover resolution cursor.`);
167
+ }
168
+ if (projection.cursor === minimumCursor && projection.digest !== minimumProjectionDigest) {
169
+ throw new ThreadSessionViewError(`Thread ${store.threadId} projection changed without advancing its cursor.`);
170
+ }
171
+ const events = replayAll(store, projection.cursor);
172
+ const durableHistory = includeDurableHistory
173
+ ? store.loadAuthoritativeModelHistory()
174
+ : undefined;
175
+ const readModelHead = store.captureReadModelHead();
176
+ if (readModelHead.projection.cursor === projection.cursor &&
177
+ readModelHead.projection.digest === projection.digest) {
178
+ return { projection, events, durableHistory, readModelHead };
179
+ }
180
+ }
181
+ throw new ThreadSessionViewError(`Thread ${store.threadId} remained active while its Session view was being captured.`);
182
+ }
183
+ function replayAll(store, cursor) {
184
+ if (cursor === 0)
185
+ return [];
186
+ const events = [];
187
+ let nextCursor = 0;
188
+ while (nextCursor < cursor) {
189
+ const replay = store.replay(nextCursor);
190
+ const page = replay.events.filter(event => event.seq <= cursor);
191
+ if (page.length === 0) {
192
+ throw new ThreadSessionViewError(`Thread ${store.threadId} replay stopped at ${nextCursor}/${cursor}.`);
193
+ }
194
+ events.push(...page);
195
+ nextCursor = page.at(-1)?.seq ?? nextCursor;
196
+ }
197
+ if (events.length !== cursor) {
198
+ throw new ThreadSessionViewError(`Thread ${store.threadId} replay returned ${events.length}/${cursor} events.`);
199
+ }
200
+ return events;
201
+ }
202
+ function projectTranscriptMessages(items, events) {
203
+ const timestamps = new Map();
204
+ for (const event of events) {
205
+ if (!event.itemId || !isItemTerminalEvent(event))
206
+ continue;
207
+ timestamps.set(event.itemId, event.timestamp);
208
+ }
209
+ return Object.values(items)
210
+ .filter(item => item.kind === 'message' && item.status !== 'started' && isMessageRole(item.role))
211
+ .sort((left, right) => left.startedSeq - right.startedSeq)
212
+ .map(item => {
213
+ const legacy = parseLegacyTranscriptReceipt(item.receipt);
214
+ if (legacy)
215
+ return legacy;
216
+ return {
217
+ role: item.role,
218
+ content: item.content ?? item.summary ?? item.error ?? '',
219
+ timestamp: timestamps.get(item.itemId) ?? 0,
220
+ };
221
+ });
222
+ }
223
+ function parseLegacyTranscriptReceipt(receipt) {
224
+ if (!receipt)
225
+ return undefined;
226
+ let parsed;
227
+ try {
228
+ parsed = JSON.parse(receipt);
229
+ }
230
+ catch {
231
+ return undefined;
232
+ }
233
+ if (!isRecord(parsed) || !isRecord(parsed.legacyRecord))
234
+ return undefined;
235
+ const record = parsed.legacyRecord;
236
+ if (!isMessageRole(record.role) || typeof record.content !== 'string')
237
+ return undefined;
238
+ if (!Number.isFinite(record.timestamp))
239
+ return undefined;
240
+ const toolCalls = parseToolCalls(record.tool_calls);
241
+ const appliedSkills = Array.isArray(record.appliedSkills)
242
+ ? record.appliedSkills.filter((value) => typeof value === 'string')
243
+ : undefined;
244
+ return {
245
+ role: record.role,
246
+ content: record.content,
247
+ timestamp: record.timestamp,
248
+ ...(typeof record.modelVisibleContent === 'string'
249
+ ? { modelVisibleContent: record.modelVisibleContent }
250
+ : {}),
251
+ ...(typeof record.toolCallId === 'string' ? { toolCallId: record.toolCallId } : {}),
252
+ ...(toolCalls ? { tool_calls: toolCalls } : {}),
253
+ ...(appliedSkills ? { appliedSkills } : {}),
254
+ };
255
+ }
256
+ function parseModelHistory(history) {
257
+ return history.map((value, index) => {
258
+ if (!isRecord(value) || !isMessageRole(value.role) || typeof value.content !== 'string') {
259
+ throw new ThreadSessionViewError(`Thread model history message ${index} is invalid.`);
260
+ }
261
+ const toolCalls = parseToolCalls(value.tool_calls);
262
+ if (value.tool_calls !== undefined && !toolCalls) {
263
+ throw new ThreadSessionViewError(`Thread model history tool_calls ${index} is invalid.`);
264
+ }
265
+ if (value.tool_call_id !== undefined && typeof value.tool_call_id !== 'string') {
266
+ throw new ThreadSessionViewError(`Thread model history tool_call_id ${index} is invalid.`);
267
+ }
268
+ return {
269
+ role: value.role,
270
+ content: value.content,
271
+ ...(toolCalls ? { tool_calls: toolCalls } : {}),
272
+ ...(typeof value.tool_call_id === 'string' ? { tool_call_id: value.tool_call_id } : {}),
273
+ };
274
+ });
275
+ }
276
+ function transcriptMessageToModelMessage(message) {
277
+ return {
278
+ role: message.role,
279
+ content: message.modelVisibleContent ?? message.content,
280
+ ...(message.tool_calls ? { tool_calls: structuredClone(message.tool_calls) } : {}),
281
+ ...(message.toolCallId ? { tool_call_id: message.toolCallId } : {}),
282
+ };
283
+ }
284
+ function parseToolCalls(value) {
285
+ if (value === undefined)
286
+ return undefined;
287
+ if (!Array.isArray(value))
288
+ return undefined;
289
+ const result = [];
290
+ for (const item of value) {
291
+ if (!isRecord(item) ||
292
+ typeof item.id !== 'string' ||
293
+ item.type !== 'function' ||
294
+ !isRecord(item.function) ||
295
+ typeof item.function.name !== 'string' ||
296
+ typeof item.function.arguments !== 'string') {
297
+ return undefined;
298
+ }
299
+ result.push({
300
+ id: item.id,
301
+ type: 'function',
302
+ function: { name: item.function.name, arguments: item.function.arguments },
303
+ });
304
+ }
305
+ return result;
306
+ }
307
+ function isItemTerminalEvent(event) {
308
+ return (event.payload.type === 'item.completed' ||
309
+ event.payload.type === 'item.failed' ||
310
+ event.payload.type === 'item.interrupted' ||
311
+ event.payload.type === 'item.indeterminate');
312
+ }
313
+ function isMessageRole(value) {
314
+ return value === 'system' || value === 'user' || value === 'assistant' || value === 'tool';
315
+ }
316
+ function isRecord(value) {
317
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
318
+ }
319
+ function deepFreeze(value) {
320
+ if (value && typeof value === 'object' && !Object.isFrozen(value)) {
321
+ Object.freeze(value);
322
+ for (const nested of Object.values(value))
323
+ deepFreeze(nested);
324
+ }
325
+ return value;
326
+ }
327
+ //# sourceMappingURL=thread-session-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-session-view.js","sourceRoot":"","sources":["../../src/runtime/thread-session-view.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,7 @@ export declare class ThreadUiAdapterV1 implements AgentRuntimeRunnerV1 {
47
47
  private readonly mode;
48
48
  private readonly initialReplayTarget;
49
49
  private readonly presentations;
50
+ private readonly toolReceiptFacts;
50
51
  private cursorValue;
51
52
  private initialReplayComplete;
52
53
  private closed;
@@ -64,9 +65,12 @@ export declare class ThreadUiAdapterV1 implements AgentRuntimeRunnerV1 {
64
65
  private replayInitialHistory;
65
66
  private replayRequired;
66
67
  private project;
68
+ private projectLatestGoalState;
69
+ private projectGoalCommit;
67
70
  private startItem;
68
71
  private updateItem;
69
72
  private finishItem;
73
+ private rememberToolReceipt;
70
74
  private ensurePresentation;
71
75
  private resolveMode;
72
76
  private projectCompletedPlanMode;
@@ -1 +1 @@
1
- {"version":3,"file":"thread-ui-adapter.d.ts","sourceRoot":"","sources":["../../src/runtime/thread-ui-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thread-ui-adapter.d.ts","sourceRoot":"","sources":["../../src/runtime/thread-ui-adapter.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ThreadUiAdmissionError = exports.ThreadUiAdapterError = exports.ThreadUiAdapterV1 = exports.THREAD_UI_ADAPTER_VERSION = void 0;
4
4
  const agent_runtime_protocol_1 = require("./agent-runtime-protocol");
5
+ const goal_runtime_coordinator_1 = require("./goal-runtime-coordinator");
6
+ const canonical_1 = require("./protocol/canonical");
5
7
  const runtime_protocol_v1_1 = require("./protocol/runtime-protocol-v1");
8
+ const turn_commit_1 = require("./turn-commit");
6
9
  exports.THREAD_UI_ADAPTER_VERSION = 1;
7
10
  /**
8
11
  * Transitional projection from the durable Thread runtime to existing UI
@@ -14,6 +17,7 @@ class ThreadUiAdapterV1 {
14
17
  constructor(options) {
15
18
  this.version = exports.THREAD_UI_ADAPTER_VERSION;
16
19
  this.presentations = new Map();
20
+ this.toolReceiptFacts = new Map();
17
21
  this.initialReplayComplete = false;
18
22
  this.closed = false;
19
23
  if (Boolean(options.eventSink) === Boolean(options.uiEventSink)) {
@@ -35,6 +39,8 @@ class ThreadUiAdapterV1 {
35
39
  // Subscribe at the current edge first. Historical replay is projected
36
40
  // separately, so commits that arrive after construction cannot be missed.
37
41
  this.consumer = this.runtime.subscribe(this.consumerId, liveCursor, options.buffer);
42
+ if (cursor === liveCursor)
43
+ this.projectLatestGoalState();
38
44
  }
39
45
  async runInput(input, options = {}) {
40
46
  const text = input.trim();
@@ -90,6 +96,7 @@ class ThreadUiAdapterV1 {
90
96
  this.runtime.unsubscribe(this.consumerId);
91
97
  this.runtime.close(reason);
92
98
  this.presentations.clear();
99
+ this.toolReceiptFacts.clear();
93
100
  }
94
101
  snapshot() {
95
102
  return Object.freeze({
@@ -258,13 +265,59 @@ class ThreadUiAdapterV1 {
258
265
  case 'thread.started':
259
266
  case 'thread.resumed':
260
267
  case 'thread.forked':
261
- case 'turn.committed':
262
268
  case 'step.snapshot':
263
269
  case 'capability.receipt':
270
+ return;
264
271
  case 'tool.receipt':
272
+ this.rememberToolReceipt(event);
273
+ return;
274
+ case 'turn.committed':
275
+ this.projectGoalCommit(event.payload.data.receipt);
265
276
  return;
266
277
  }
267
278
  }
279
+ projectLatestGoalState() {
280
+ const latest = Object.values(this.runtime.getProjection().turns)
281
+ .flatMap(turn => (turn.commit ? [turn.commit] : []))
282
+ .sort((left, right) => right.seq - left.seq)[0];
283
+ if (latest)
284
+ this.projectGoalCommit(latest.receipt);
285
+ }
286
+ projectGoalCommit(receipt) {
287
+ const persistence = (0, goal_runtime_coordinator_1.readGoalRuntimePersistenceV2)((0, turn_commit_1.parseTurnCommitV1)(receipt));
288
+ if (persistence.state?.status === 'completed') {
289
+ this.emit({
290
+ type: 'goal_event',
291
+ event: {
292
+ type: 'goal_cleared',
293
+ goalId: persistence.state.goalId,
294
+ reason: 'completion_auto_exit',
295
+ },
296
+ });
297
+ return;
298
+ }
299
+ if (persistence.state) {
300
+ this.emit({
301
+ type: 'goal_event',
302
+ event: {
303
+ type: 'goal_updated',
304
+ goal: goalUiSnapshot(persistence.state),
305
+ reason: 'durable_turn_commit',
306
+ },
307
+ });
308
+ return;
309
+ }
310
+ if (persistence.tombstone) {
311
+ this.emit({
312
+ type: 'goal_event',
313
+ event: {
314
+ type: 'goal_cleared',
315
+ goalId: persistence.tombstone.goalId ?? 'cleared-goal',
316
+ reason: persistence.tombstone.reason,
317
+ },
318
+ });
319
+ }
320
+ }
268
321
  startItem(event) {
269
322
  if (event.payload.type !== 'item.started' || !event.itemId) {
270
323
  throw new ThreadUiAdapterError('item.started is missing its item identity.');
@@ -325,7 +378,12 @@ class ThreadUiAdapterV1 {
325
378
  if (!presentation.content && terminal.summary)
326
379
  presentation.content = terminal.summary;
327
380
  if (isToolItem(presentation.kind)) {
328
- const success = event.payload.type === 'item.completed';
381
+ const durableReceiptFact = this.toolReceiptFacts.get(presentation.itemId);
382
+ const receipt = terminal.receipt && durableReceiptFact
383
+ ? validateDurableToolReceipt(event, presentation, terminal.receipt, durableReceiptFact)
384
+ : undefined;
385
+ this.toolReceiptFacts.delete(presentation.itemId);
386
+ const success = receipt?.success ?? event.payload.type === 'item.completed';
329
387
  this.emit({
330
388
  type: 'tool_finished',
331
389
  event: {
@@ -340,6 +398,13 @@ class ThreadUiAdapterV1 {
340
398
  ...(presentation.content
341
399
  ? { outputBytes: Buffer.byteLength(presentation.content, 'utf8') }
342
400
  : {}),
401
+ ...(receipt
402
+ ? {
403
+ authorization: projectToolAuthorization(receipt),
404
+ executionPolicyDigest: receipt.executionPolicyDigest,
405
+ receiptDigest: receipt.digest,
406
+ }
407
+ : {}),
343
408
  },
344
409
  });
345
410
  }
@@ -356,6 +421,15 @@ class ThreadUiAdapterV1 {
356
421
  }
357
422
  this.presentations.delete(presentation.itemId);
358
423
  }
424
+ rememberToolReceipt(event) {
425
+ if (event.payload.type !== 'tool.receipt')
426
+ return;
427
+ const fact = event.payload.data;
428
+ if (event.itemId && event.itemId !== fact.invocationId) {
429
+ throw new ThreadUiAdapterError('Durable tool receipt identity does not match its Item.');
430
+ }
431
+ this.toolReceiptFacts.set(fact.invocationId, Object.freeze({ ...fact }));
432
+ }
359
433
  ensurePresentation(event) {
360
434
  if (!event.itemId)
361
435
  throw new ThreadUiAdapterError(`${event.payload.type} has no itemId.`);
@@ -413,6 +487,24 @@ class ThreadUiAdapterV1 {
413
487
  }
414
488
  }
415
489
  exports.ThreadUiAdapterV1 = ThreadUiAdapterV1;
490
+ function goalUiSnapshot(state) {
491
+ return {
492
+ goalId: state.goalId,
493
+ revision: state.generation,
494
+ objective: state.objective,
495
+ status: state.status === 'completed'
496
+ ? 'complete'
497
+ : state.status === 'failed'
498
+ ? 'blocked'
499
+ : state.status,
500
+ tokenBudget: state.budget.maxTokens,
501
+ tokensUsed: state.tokensUsed,
502
+ timeUsedMs: state.elapsedMs,
503
+ continuationCount: state.continuationCount,
504
+ updatedAt: state.updatedAt,
505
+ ...(state.lastStopDecision ? { stopReason: state.lastStopDecision.reason.message } : {}),
506
+ };
507
+ }
416
508
  class ThreadUiAdapterError extends Error {
417
509
  constructor(message) {
418
510
  super(message);
@@ -477,13 +569,109 @@ function terminalItemData(event) {
477
569
  return {
478
570
  content: event.payload.data.content,
479
571
  summary: event.payload.data.summary,
572
+ receipt: event.payload.data.receipt,
480
573
  };
481
574
  case 'item.failed':
482
- return { error: event.payload.data.error };
575
+ return { error: event.payload.data.error, receipt: event.payload.data.receipt };
576
+ case 'item.interrupted':
577
+ return {
578
+ error: event.payload.data.reason || 'Item interrupted.',
579
+ receipt: event.payload.data.receipt,
580
+ };
581
+ case 'item.indeterminate':
582
+ return { error: event.payload.data.reason, receipt: event.payload.data.receipt };
583
+ default:
584
+ throw new ThreadUiAdapterError(`${event.payload.type} is not an Item terminal event.`);
585
+ }
586
+ }
587
+ function validateDurableToolReceipt(event, presentation, receiptJson, fact) {
588
+ let parsed;
589
+ try {
590
+ parsed = JSON.parse(receiptJson);
591
+ }
592
+ catch {
593
+ throw new ThreadUiAdapterError('Durable ToolInvocationReceipt is not valid JSON.');
594
+ }
595
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
596
+ throw new ThreadUiAdapterError('Durable ToolInvocationReceipt is not an object.');
597
+ }
598
+ const { digest, ...content } = parsed;
599
+ const expectedTerminal = terminalReceiptStatus(event);
600
+ if (parsed.version !== 1 ||
601
+ typeof digest !== 'string' ||
602
+ !digest ||
603
+ (0, canonical_1.digestRuntimeValue)(content) !== digest ||
604
+ parsed.invocationId !== presentation.itemId ||
605
+ parsed.invocationId !== event.itemId ||
606
+ parsed.threadId !== event.threadId ||
607
+ parsed.turnId !== event.turnId ||
608
+ parsed.stepId !== event.stepId ||
609
+ parsed.toolName !== presentation.name ||
610
+ parsed.terminal !== expectedTerminal ||
611
+ typeof parsed.success !== 'boolean' ||
612
+ typeof parsed.executionPolicyDigest !== 'string' ||
613
+ !parsed.executionPolicyDigest) {
614
+ throw new ThreadUiAdapterError('Durable ToolInvocationReceipt failed integrity validation.');
615
+ }
616
+ if (fact.invocationId !== parsed.invocationId ||
617
+ fact.terminal !== parsed.terminal ||
618
+ fact.success !== parsed.success ||
619
+ fact.outputDigest !== parsed.outputDigest ||
620
+ fact.receiptDigest !== parsed.digest ||
621
+ fact.intentDigest !== parsed.intentDigest) {
622
+ throw new ThreadUiAdapterError('Durable tool receipt event does not match its canonical receipt.');
623
+ }
624
+ return parsed;
625
+ }
626
+ /**
627
+ * Project presentation provenance only after the canonical receipt and its
628
+ * separate durable `tool.receipt` fact have both passed validation.
629
+ */
630
+ function projectToolAuthorization(receipt) {
631
+ const policy = receipt.policy;
632
+ const approval = receipt.approval;
633
+ if (!policy) {
634
+ return {
635
+ approved: false,
636
+ behavior: 'deny',
637
+ source: 'tool_policy',
638
+ reason: receipt.result.error ??
639
+ `Tool invocation stopped during the ${receipt.terminalPhase} authorization phase.`,
640
+ };
641
+ }
642
+ return {
643
+ behavior: policy.behavior,
644
+ approved: policy.behavior === 'allow' || (policy.behavior === 'ask' && approval?.approved === true),
645
+ source: normalizeToolAuthorizationSource(policy.behavior, policy.source, approval?.source, approval?.approved),
646
+ ...(approval?.reason || policy.reason ? { reason: approval?.reason ?? policy.reason } : {}),
647
+ };
648
+ }
649
+ function normalizeToolAuthorizationSource(behavior, policySource, approvalSource, approvalApproved) {
650
+ if (approvalSource === 'user')
651
+ return 'user';
652
+ if (approvalSource === 'authority')
653
+ return approvalApproved ? 'config_allow' : 'config_deny';
654
+ if (approvalSource === 'unavailable')
655
+ return 'missing_confirmation';
656
+ if (policySource.startsWith('allowlist:')) {
657
+ return behavior === 'allow'
658
+ ? 'allowlist_allow'
659
+ : behavior === 'deny'
660
+ ? 'allowlist_deny'
661
+ : 'allowlist_ask';
662
+ }
663
+ return 'tool_policy';
664
+ }
665
+ function terminalReceiptStatus(event) {
666
+ switch (event.payload.type) {
667
+ case 'item.completed':
668
+ return 'completed';
669
+ case 'item.failed':
670
+ return 'failed';
483
671
  case 'item.interrupted':
484
- return { error: event.payload.data.reason || 'Item interrupted.' };
672
+ return 'interrupted';
485
673
  case 'item.indeterminate':
486
- return { error: event.payload.data.reason };
674
+ return 'indeterminate';
487
675
  default:
488
676
  throw new ThreadUiAdapterError(`${event.payload.type} is not an Item terminal event.`);
489
677
  }