@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.
- package/CHANGELOG.md +75 -0
- package/README.md +73 -14
- package/README.zh-CN.md +63 -13
- package/bin/orion +15 -4
- package/dist/cli.js +51 -172
- package/dist/cli.js.map +1 -1
- package/dist/commands/model-command-handlers.d.ts +2 -2
- package/dist/commands/model-command-handlers.d.ts.map +1 -1
- package/dist/commands/model-command-handlers.js +113 -32
- package/dist/commands/model-command-handlers.js.map +1 -1
- package/dist/commands/session-command-handlers.d.ts +1 -1
- package/dist/commands/session-command-handlers.d.ts.map +1 -1
- package/dist/commands/session-command-handlers.js +121 -16
- package/dist/commands/session-command-handlers.js.map +1 -1
- package/dist/commands/types.d.ts +14 -2
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/runtime/agent-loop.d.ts +2 -0
- package/dist/runtime/agent-loop.d.ts.map +1 -1
- package/dist/runtime/agent-loop.js +4 -3
- package/dist/runtime/agent-loop.js.map +1 -1
- package/dist/runtime/agent-runtime-controller.d.ts +32 -1
- package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
- package/dist/runtime/agent-runtime-controller.js +250 -31
- package/dist/runtime/agent-runtime-controller.js.map +1 -1
- package/dist/runtime/agent-runtime-runner.d.ts +3 -0
- package/dist/runtime/agent-runtime-runner.d.ts.map +1 -1
- package/dist/runtime/goal-runtime-coordinator.d.ts +6 -0
- package/dist/runtime/goal-runtime-coordinator.d.ts.map +1 -1
- package/dist/runtime/goal-runtime-coordinator.js +5 -0
- package/dist/runtime/goal-runtime-coordinator.js.map +1 -1
- package/dist/runtime/legacy-thread-materializer.d.ts +18 -0
- package/dist/runtime/legacy-thread-materializer.d.ts.map +1 -1
- package/dist/runtime/legacy-thread-materializer.js +27 -12
- package/dist/runtime/legacy-thread-materializer.js.map +1 -1
- package/dist/runtime/orion-runtime-v1.d.ts +3 -0
- package/dist/runtime/orion-runtime-v1.d.ts.map +1 -1
- package/dist/runtime/orion-runtime-v1.js +8 -1
- package/dist/runtime/orion-runtime-v1.js.map +1 -1
- package/dist/runtime/orion-session-runner.d.ts +7 -1
- package/dist/runtime/orion-session-runner.d.ts.map +1 -1
- package/dist/runtime/orion-session-runner.js +35 -3
- package/dist/runtime/orion-session-runner.js.map +1 -1
- package/dist/runtime/product-bootstrap.d.ts +22 -0
- package/dist/runtime/product-bootstrap.d.ts.map +1 -0
- package/dist/runtime/product-bootstrap.js +374 -0
- package/dist/runtime/product-bootstrap.js.map +1 -0
- package/dist/runtime/product-orion-runtime.d.ts +2 -1
- package/dist/runtime/product-orion-runtime.d.ts.map +1 -1
- package/dist/runtime/product-orion-runtime.js +114 -16
- package/dist/runtime/product-orion-runtime.js.map +1 -1
- package/dist/runtime/protocol/runtime-protocol-v1.d.ts +1 -1
- package/dist/runtime/protocol/runtime-protocol-v1.js +1 -1
- package/dist/runtime/protocol/runtime-protocol-v1.js.map +1 -1
- package/dist/runtime/release-receipts.d.ts +63 -2
- package/dist/runtime/release-receipts.d.ts.map +1 -1
- package/dist/runtime/release-receipts.js +298 -7
- package/dist/runtime/release-receipts.js.map +1 -1
- package/dist/runtime/session-history-recovery.d.ts +19 -0
- package/dist/runtime/session-history-recovery.d.ts.map +1 -0
- package/dist/runtime/session-history-recovery.js +45 -0
- package/dist/runtime/session-history-recovery.js.map +1 -0
- package/dist/runtime/step-snapshot.d.ts.map +1 -1
- package/dist/runtime/step-snapshot.js +22 -2
- package/dist/runtime/step-snapshot.js.map +1 -1
- package/dist/runtime/subagents/runtime-integration.d.ts +1 -1
- package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
- package/dist/runtime/subagents/runtime-integration.js +5 -2
- package/dist/runtime/subagents/runtime-integration.js.map +1 -1
- package/dist/runtime/thread-event-store.d.ts +27 -0
- package/dist/runtime/thread-event-store.d.ts.map +1 -1
- package/dist/runtime/thread-event-store.js +119 -17
- package/dist/runtime/thread-event-store.js.map +1 -1
- package/dist/runtime/thread-projection.d.ts +10 -0
- package/dist/runtime/thread-projection.d.ts.map +1 -1
- package/dist/runtime/thread-projection.js +40 -0
- package/dist/runtime/thread-projection.js.map +1 -1
- package/dist/runtime/thread-runtime.d.ts +3 -1
- package/dist/runtime/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/thread-runtime.js +6 -0
- package/dist/runtime/thread-runtime.js.map +1 -1
- package/dist/runtime/thread-session-view.d.ts +88 -0
- package/dist/runtime/thread-session-view.d.ts.map +1 -0
- package/dist/runtime/thread-session-view.js +327 -0
- package/dist/runtime/thread-session-view.js.map +1 -0
- package/dist/runtime/thread-ui-adapter.d.ts +4 -0
- package/dist/runtime/thread-ui-adapter.d.ts.map +1 -1
- package/dist/runtime/thread-ui-adapter.js +193 -5
- package/dist/runtime/thread-ui-adapter.js.map +1 -1
- package/dist/runtime/ui-events.d.ts +37 -0
- package/dist/runtime/ui-events.d.ts.map +1 -1
- package/dist/runtime/ui-events.js +1 -0
- package/dist/runtime/ui-events.js.map +1 -1
- package/dist/runtime/ui-view-model.d.ts +3 -0
- package/dist/runtime/ui-view-model.d.ts.map +1 -1
- package/dist/runtime/ui-view-model.js +10 -3
- package/dist/runtime/ui-view-model.js.map +1 -1
- package/dist/services/file-lock.d.ts.map +1 -1
- package/dist/services/file-lock.js +42 -17
- package/dist/services/file-lock.js.map +1 -1
- package/dist/services/global-config.d.ts +25 -0
- package/dist/services/global-config.d.ts.map +1 -1
- package/dist/services/global-config.js +373 -5
- package/dist/services/global-config.js.map +1 -1
- package/dist/services/session-storage.d.ts +67 -0
- package/dist/services/session-storage.d.ts.map +1 -1
- package/dist/services/session-storage.js +327 -61
- package/dist/services/session-storage.js.map +1 -1
- package/dist/services/settings-coordinator.d.ts +174 -0
- package/dist/services/settings-coordinator.d.ts.map +1 -0
- package/dist/services/settings-coordinator.js +605 -0
- package/dist/services/settings-coordinator.js.map +1 -0
- package/dist/services/settings-document-repository.d.ts +138 -0
- package/dist/services/settings-document-repository.d.ts.map +1 -0
- package/dist/services/settings-document-repository.js +551 -0
- package/dist/services/settings-document-repository.js.map +1 -0
- package/dist/terminal-ui/launch.d.ts.map +1 -1
- package/dist/terminal-ui/launch.js +7 -0
- package/dist/terminal-ui/launch.js.map +1 -1
- package/dist/tools/web.js +1 -1
- package/dist/tools/web.js.map +1 -1
- package/dist/tui-ui/chrome-view-model.d.ts.map +1 -1
- package/dist/tui-ui/chrome-view-model.js +21 -7
- package/dist/tui-ui/chrome-view-model.js.map +1 -1
- package/dist/tui-ui/launch.d.ts.map +1 -1
- package/dist/tui-ui/launch.js +13 -0
- package/dist/tui-ui/launch.js.map +1 -1
- package/dist/tui-ui/state.d.ts.map +1 -1
- package/dist/tui-ui/state.js +7 -0
- package/dist/tui-ui/state.js.map +1 -1
- package/dist/web/event-hub.d.ts +39 -0
- package/dist/web/event-hub.d.ts.map +1 -0
- package/dist/web/event-hub.js +263 -0
- package/dist/web/event-hub.js.map +1 -0
- package/dist/web/index.d.ts +6 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +28 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/launch.d.ts +9 -0
- package/dist/web/launch.d.ts.map +1 -0
- package/dist/web/launch.js +64 -0
- package/dist/web/launch.js.map +1 -0
- package/dist/web/protocol.d.ts +346 -0
- package/dist/web/protocol.d.ts.map +1 -0
- package/dist/web/protocol.js +348 -0
- package/dist/web/protocol.js.map +1 -0
- package/dist/web/server.d.ts +20 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +498 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/workbench-controller.d.ts +63 -0
- package/dist/web/workbench-controller.d.ts.map +1 -0
- package/dist/web/workbench-controller.js +774 -0
- package/dist/web/workbench-controller.js.map +1 -0
- package/dist/web-client/assets/index-BAEO71Gp.css +1 -0
- package/dist/web-client/assets/index-DSkFy7gM.js +13 -0
- package/dist/web-client/index.html +16 -0
- package/docs/architecture/v0.3.0-web-api.yaml +1309 -0
- package/docs/migration/v0.2.2-to-v0.3.0-settings.md +114 -0
- package/docs/migration/v0.2.2-to-v0.3.0.md +55 -0
- package/docs/orion.example.json +9 -2
- package/docs/plan/v0.3.0-node-runtime-compatibility-plan.md +57 -0
- package/docs/plan/v0.3.0-settings-integration-plan.md +740 -0
- package/docs/plan/v0.3.0-web-workbench-plan.md +325 -0
- package/docs/readme.md +12 -1
- package/npm-shrinkwrap.json +1777 -424
- 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":";;;AAiGA,0DAKC;AAGD,0DAiDC;AAOD,oFAiBC;AAGD,gEAKC;AAzLD,2BAAkC;AAClC,+BAA+B;AAC/B,6EAAoE;AAEpE,yEAIoC;AAwEpC,MAAa,sBAAuB,SAAQ,KAAK;IAG/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAG,mCAAmC,CAAC;QAIlD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAPD,wDAOC;AAED;;;;;;GAMG;AACH,SAAgB,uBAAuB,CACrC,WAAmB,EACnB,SAAiB;IAEjB,OAAO,uBAAuB,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC;AAC/D,CAAC;AAED,6FAA6F;AAC7F,SAAgB,uBAAuB,CACrC,WAAmB,EACnB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAC/D,+BAA+B,CAChC,CAAC;IACF,IAAI,QAAQ,CAAC;IACb,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,QAAQ,GAAG,IAAA,yDAA8B,EACvC,iBAAiB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAC1C,aAAa,CACd,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,kBAAkB,GAAG,IAAA,yDAA8B,EAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YAC3F,QAAQ,GAAG;gBACT,GAAG,kBAAkB;gBACrB,WAAW,EAAE;oBACX;wBACE,IAAI,EAAE,+BAAwC;wBAC9C,OAAO,EACL,6FAA6F;qBAChG;oBACD,GAAG,kBAAkB,CAAC,WAAW;iBAClC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAA,yDAA8B,EAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC;QACtB,GAAG,QAAQ,CAAC,OAAO;QACnB,YAAY,EAAE,QAAQ,CAAC,QAAQ;QAC/B,kBAAkB,EAAE,QAAQ,CAAC,MAAM;QACnC,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,QAAQ,CAAC,oBAAoB;YAC/B,CAAC,CAAC,EAAE,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB,EAAE;YACzD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI;QACJ,iBAAiB,EAAE,uBAAuB,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC;KACnF,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAgB,oCAAoC,CAClD,WAAmB,EACnB,SAAiB;IAEjB,MAAM,MAAM,GAAG,IAAA,iDAAoB,EAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAClF,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;IACjD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,IAAA,iBAAY,EAAC,IAAA,cAAO,EAAC,WAAW,CAAC,CAAC;QAC/C,SAAS;QACT,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ;QACpC,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,gBAAgB,EAAE,UAAU,CAAC,MAAM;QACnC,iBAAiB,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU;QAC/C,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAClF,SAAgB,0BAA0B,CACxC,WAAmB,EACnB,SAAiB;IAEjB,OAAO,sBAAsB,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC;AACxE,CAAC;AAED,SAAS,sBAAsB,CAC7B,WAAmB,EACnB,SAAiB,EACjB,qBAA8B;IAW9B,MAAM,MAAM,GAAG,IAAA,iDAAoB,EAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5D,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC9B,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3E,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACzB,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,uBAAuB,CACnF,KAAK,EACL,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,gBAAgB,EAC3B,qBAAqB,CACtB,CAAC;IACF,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,SAAS,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;SAChD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC9F,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,oBAAoB,GAAG,CAAC,GAAG,WAAW,CAAC;SAC1C,OAAO,EAAE;SACT,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,OAAO;QACL,OAAO,EAAE,UAAU,CAAC;YAClB,OAAO,EAAE,CAAC;YACV,SAAS;YACT,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,gBAAgB,EAAE,UAAU,CAAC,MAAM;YACnC,SAAS;YACT,SAAS;YACT,gBAAgB,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK;YACzC,YAAY,EAAE,kBAAkB,CAAC,MAAM;YACvC,kBAAkB;YAClB,SAAS,EAAE;gBACT,iBAAiB,EAAE,UAAU,CAAC,UAAU;gBACxC,cAAc,EAAE,aAAa,CAAC,cAAc;gBAC5C,GAAG,EAAE,aAAa,CAAC,GAAG;aACvB;SACF,CAAC;QACF,cAAc;QACd,KAAK;QACL,iBAAiB,EAAE,UAAU,CAAC,UAAU;QACxC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/F,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,WAAmB,EACnB,SAAiB,EACjB,QAIC,EACD,IAAyB;IAEzB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,IAAA,iBAAY,EAAC,IAAA,cAAO,EAAC,WAAW,CAAC,CAAC;QAC/C,SAAS;QACT,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ;QACnC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;QAC/B,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,gBAAgB;QACnD,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAC9D,OAAO,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAAuB,EACvB,aAAqB,EACrB,uBAA+B,EAC/B,qBAA8B;IAO9B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1C,IAAI,UAAU,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;YACtC,MAAM,IAAI,sBAAsB,CAC9B,UAAU,KAAK,CAAC,QAAQ,8CAA8C,CACvE,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,IAAI,UAAU,CAAC,MAAM,KAAK,uBAAuB,EAAE,CAAC;YACzF,MAAM,IAAI,sBAAsB,CAC9B,UAAU,KAAK,CAAC,QAAQ,mDAAmD,CAC5E,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,qBAAqB;YAC1C,CAAC,CAAC,KAAK,CAAC,6BAA6B,EAAE;YACvC,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,aAAa,GAAG,KAAK,CAAC,oBAAoB,EAAE,CAAC;QACnD,IACE,aAAa,CAAC,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM;YACrD,aAAa,CAAC,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EACrD,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,MAAM,IAAI,sBAAsB,CAC9B,UAAU,KAAK,CAAC,QAAQ,6DAA6D,CACtF,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAuB,EAAE,MAAc;IACxD,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,MAAM,GAA6B,EAAE,CAAC;IAC5C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,UAAU,GAAG,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,sBAAsB,CAC9B,UAAU,KAAK,CAAC,QAAQ,sBAAsB,UAAU,IAAI,MAAM,GAAG,CACtE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACrB,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC;IAC9C,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,sBAAsB,CAC9B,UAAU,KAAK,CAAC,QAAQ,oBAAoB,MAAM,CAAC,MAAM,IAAI,MAAM,UAAU,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,yBAAyB,CAChC,KAAiD,EACjD,MAAyC;IAEzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAAE,SAAS;QAC3D,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;SACxB,MAAM,CACL,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CACzF;SACA,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;SACzD,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,MAAM,MAAM,GAAG,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAuB;YAClC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;YACzD,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;SAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,4BAA4B,CACnC,OAA2B;IAE3B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1E,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;IACnC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzD,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;QACvD,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QACpF,CAAC,CAAC,SAAS,CAAC;IACd,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAmB;QACrC,GAAG,CAAC,OAAO,MAAM,CAAC,mBAAmB,KAAK,QAAQ;YAChD,CAAC,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,EAAE;YACrD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAA2B;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACxF,MAAM,IAAI,sBAAsB,CAAC,gCAAgC,KAAK,cAAc,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;YACjD,MAAM,IAAI,sBAAsB,CAAC,mCAAmC,KAAK,cAAc,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC/E,MAAM,IAAI,sBAAsB,CAAC,qCAAqC,KAAK,cAAc,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,+BAA+B,CAAC,OAAyC;IAChF,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,mBAAmB,IAAI,OAAO,CAAC,OAAO;QACvD,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,MAAM,GAAuC,EAAE,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IACE,CAAC,QAAQ,CAAC,IAAI,CAAC;YACf,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;YAC3B,IAAI,CAAC,IAAI,KAAK,UAAU;YACxB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;YACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAC3C,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;SAC3E,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA6B;IACxD,OAAO,CACL,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,gBAAgB;QACvC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,aAAa;QACpC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,kBAAkB;QACzC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,oBAAoB,CAC5C,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,MAAM,CAAC;AAC7F,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,UAAU,CAAI,KAAQ;IAC7B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC;YAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -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":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
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
|
|
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
|
|
672
|
+
return 'interrupted';
|
|
485
673
|
case 'item.indeterminate':
|
|
486
|
-
return
|
|
674
|
+
return 'indeterminate';
|
|
487
675
|
default:
|
|
488
676
|
throw new ThreadUiAdapterError(`${event.payload.type} is not an Item terminal event.`);
|
|
489
677
|
}
|