@orion-agents/orion-code 0.3.0 → 0.3.1
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 +42 -0
- package/README.md +24 -8
- package/README.zh-CN.md +23 -9
- package/dist/core/tool-artifacts.d.ts +2 -0
- package/dist/core/tool-artifacts.d.ts.map +1 -1
- package/dist/core/tool-artifacts.js +27 -1
- package/dist/core/tool-artifacts.js.map +1 -1
- package/dist/runtime/agent-runtime-controller.js +1 -2
- package/dist/runtime/agent-runtime-controller.js.map +1 -1
- package/dist/runtime/agent-runtime-protocol.d.ts +4 -0
- package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
- package/dist/runtime/agent-runtime-protocol.js.map +1 -1
- package/dist/runtime/durable-tool-receipt-reader.d.ts +32 -0
- package/dist/runtime/durable-tool-receipt-reader.d.ts.map +1 -0
- package/dist/runtime/durable-tool-receipt-reader.js +130 -0
- package/dist/runtime/durable-tool-receipt-reader.js.map +1 -0
- package/dist/runtime/legacy-thread-materializer.d.ts +14 -1
- package/dist/runtime/legacy-thread-materializer.d.ts.map +1 -1
- package/dist/runtime/legacy-thread-materializer.js +44 -5
- package/dist/runtime/legacy-thread-materializer.js.map +1 -1
- package/dist/runtime/release-receipts.d.ts +6 -3
- package/dist/runtime/release-receipts.d.ts.map +1 -1
- package/dist/runtime/release-receipts.js +47 -4
- package/dist/runtime/release-receipts.js.map +1 -1
- package/dist/runtime/thread-event-store.d.ts +62 -9
- package/dist/runtime/thread-event-store.d.ts.map +1 -1
- package/dist/runtime/thread-event-store.js +363 -31
- package/dist/runtime/thread-event-store.js.map +1 -1
- package/dist/runtime/thread-session-index.d.ts +84 -0
- package/dist/runtime/thread-session-index.d.ts.map +1 -0
- package/dist/runtime/thread-session-index.js +503 -0
- package/dist/runtime/thread-session-index.js.map +1 -0
- package/dist/runtime/thread-session-view.d.ts +31 -13
- package/dist/runtime/thread-session-view.d.ts.map +1 -1
- package/dist/runtime/thread-session-view.js +116 -61
- package/dist/runtime/thread-session-view.js.map +1 -1
- package/dist/runtime/thread-ui-adapter.d.ts.map +1 -1
- package/dist/runtime/thread-ui-adapter.js +18 -58
- package/dist/runtime/thread-ui-adapter.js.map +1 -1
- package/dist/runtime/tool-detail-repository.d.ts.map +1 -1
- package/dist/runtime/tool-detail-repository.js +23 -19
- package/dist/runtime/tool-detail-repository.js.map +1 -1
- package/dist/runtime/tool-receipt-validator.d.ts +21 -0
- package/dist/runtime/tool-receipt-validator.d.ts.map +1 -0
- package/dist/runtime/tool-receipt-validator.js +157 -0
- package/dist/runtime/tool-receipt-validator.js.map +1 -0
- package/dist/services/redaction.d.ts +4 -0
- package/dist/services/redaction.d.ts.map +1 -1
- package/dist/services/redaction.js +63 -0
- package/dist/services/redaction.js.map +1 -1
- package/dist/services/session-index.d.ts +16 -0
- package/dist/services/session-index.d.ts.map +1 -1
- package/dist/services/session-index.js +45 -36
- package/dist/services/session-index.js.map +1 -1
- package/dist/services/session-storage.d.ts.map +1 -1
- package/dist/services/session-storage.js +3 -6
- package/dist/services/session-storage.js.map +1 -1
- package/dist/services/workspace-registry.d.ts +42 -0
- package/dist/services/workspace-registry.d.ts.map +1 -0
- package/dist/services/workspace-registry.js +222 -0
- package/dist/services/workspace-registry.js.map +1 -0
- package/dist/web/errors.d.ts +6 -0
- package/dist/web/errors.d.ts.map +1 -0
- package/dist/web/errors.js +13 -0
- package/dist/web/errors.js.map +1 -0
- package/dist/web/event-hub.d.ts +4 -0
- package/dist/web/event-hub.d.ts.map +1 -1
- package/dist/web/event-hub.js +71 -11
- package/dist/web/event-hub.js.map +1 -1
- package/dist/web/file-read-service.d.ts +55 -0
- package/dist/web/file-read-service.d.ts.map +1 -0
- package/dist/web/file-read-service.js +399 -0
- package/dist/web/file-read-service.js.map +1 -0
- package/dist/web/git-read-model-service.d.ts +77 -0
- package/dist/web/git-read-model-service.d.ts.map +1 -0
- package/dist/web/git-read-model-service.js +631 -0
- package/dist/web/git-read-model-service.js.map +1 -0
- package/dist/web/protocol.d.ts +63 -1
- package/dist/web/protocol.d.ts.map +1 -1
- package/dist/web/protocol.js +22 -1
- package/dist/web/protocol.js.map +1 -1
- package/dist/web/review-service.d.ts +38 -0
- package/dist/web/review-service.d.ts.map +1 -0
- package/dist/web/review-service.js +74 -0
- package/dist/web/review-service.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +273 -27
- package/dist/web/server.js.map +1 -1
- package/dist/web/terminal-manager.d.ts +155 -0
- package/dist/web/terminal-manager.d.ts.map +1 -0
- package/dist/web/terminal-manager.js +728 -0
- package/dist/web/terminal-manager.js.map +1 -0
- package/dist/web/terminal-server.d.ts +8 -0
- package/dist/web/terminal-server.d.ts.map +1 -0
- package/dist/web/terminal-server.js +275 -0
- package/dist/web/terminal-server.js.map +1 -0
- package/dist/web/workbench-controller.d.ts +48 -12
- package/dist/web/workbench-controller.d.ts.map +1 -1
- package/dist/web/workbench-controller.js +651 -158
- package/dist/web/workbench-controller.js.map +1 -1
- package/dist/web-client/assets/DiffViewer-DpKoD07C.js +5 -0
- package/dist/web-client/assets/FilesPanel-BkoLmgjR.js +2 -0
- package/dist/web-client/assets/GitPanel-D20StcdG.js +1 -0
- package/dist/web-client/assets/ReviewPanel-3MVWbMQV.js +1 -0
- package/dist/web-client/assets/TerminalPanel-BLQ592Fb.js +21 -0
- package/dist/web-client/assets/TerminalPanel-DLuoa74B.css +1 -0
- package/dist/web-client/assets/index-BkIDl_xk.js +16 -0
- package/dist/web-client/assets/index-DXMpnWE8.css +1 -0
- package/dist/web-client/index.html +2 -2
- package/docs/architecture/v0.3.0-web-api.yaml +44 -13
- package/docs/architecture/v0.3.1-web-api.yaml +2290 -0
- package/docs/migration/v0.3.0-to-v0.3.1.md +88 -0
- package/docs/plan/v0.3.0-web-workbench-plan.md +58 -7
- package/docs/plan/v0.3.1-web-workbench-professional-shell-plan.md +848 -0
- package/docs/readme.md +10 -0
- package/docs/test/v0.3.1-web-workbench-e2e-plan.md +140 -0
- package/npm-shrinkwrap.json +185 -354
- package/package.json +16 -4
- package/dist/web-client/assets/index-BAEO71Gp.css +0 -1
- package/dist/web-client/assets/index-DSkFy7gM.js +0 -13
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ThreadSessionIndexError = void 0;
|
|
4
|
+
exports.buildThreadSessionIndexV1 = buildThreadSessionIndexV1;
|
|
5
|
+
exports.advanceThreadSessionIndexV1 = advanceThreadSessionIndexV1;
|
|
6
|
+
exports.loadThreadSessionIndexManifestV1 = loadThreadSessionIndexManifestV1;
|
|
7
|
+
exports.loadThreadSessionIndexedPageV1 = loadThreadSessionIndexedPageV1;
|
|
8
|
+
exports.projectTranscriptMessages = projectTranscriptMessages;
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
const atomic_write_1 = require("../services/atomic-write");
|
|
12
|
+
const canonical_1 = require("./protocol/canonical");
|
|
13
|
+
const TRANSCRIPT_PAGE_ITEMS = 100;
|
|
14
|
+
const MAX_MANIFEST_PAGES = 100000;
|
|
15
|
+
class ThreadSessionIndexError extends Error {
|
|
16
|
+
constructor(code, message) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.name = 'ThreadSessionIndexError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.ThreadSessionIndexError = ThreadSessionIndexError;
|
|
23
|
+
function buildThreadSessionIndexV1(input) {
|
|
24
|
+
const previous = readManifest(manifestPath(input.rootDir, input.threadId), input.threadId);
|
|
25
|
+
const messages = projectTranscriptMessages(input.projection.items, input.events);
|
|
26
|
+
const pages = [];
|
|
27
|
+
for (let start = 0; start < messages.length; start += TRANSCRIPT_PAGE_ITEMS) {
|
|
28
|
+
pages.push(writeImmutablePage(input.rootDir, input.threadId, start, messages.slice(start, start + TRANSCRIPT_PAGE_ITEMS)));
|
|
29
|
+
}
|
|
30
|
+
const commits = latestAuthorityCommits(input.projection);
|
|
31
|
+
const manifest = createManifest({
|
|
32
|
+
generation: (previous?.generation ?? 0) + 1,
|
|
33
|
+
threadId: input.threadId,
|
|
34
|
+
head: input.head,
|
|
35
|
+
startedAt: input.events[0]?.timestamp ?? 0,
|
|
36
|
+
updatedAt: input.events.at(-1)?.timestamp ?? 0,
|
|
37
|
+
messageCount: messages.length,
|
|
38
|
+
pages,
|
|
39
|
+
...commits,
|
|
40
|
+
});
|
|
41
|
+
writeManifest(input.rootDir, manifest);
|
|
42
|
+
return manifest;
|
|
43
|
+
}
|
|
44
|
+
/** Advance the derived index only when it exactly matches the pre-commit head. */
|
|
45
|
+
function advanceThreadSessionIndexV1(input) {
|
|
46
|
+
const current = readManifest(manifestPath(input.rootDir, input.threadId), input.threadId);
|
|
47
|
+
if (!current || !manifestMatchesHead(current, input.previousHead))
|
|
48
|
+
return false;
|
|
49
|
+
const orderedItems = orderedTranscriptItems(input.projection.items);
|
|
50
|
+
const messages = projectTranscriptMessages(input.projection.items, input.committedEvents);
|
|
51
|
+
const committedTerminalItemIds = new Set(input.committedEvents
|
|
52
|
+
.filter(event => event.itemId && isItemTerminalEvent(event))
|
|
53
|
+
.map(event => event.itemId));
|
|
54
|
+
const appendedItems = orderedItems.slice(current.messageCount);
|
|
55
|
+
if (orderedItems.length !== current.messageCount + messages.length ||
|
|
56
|
+
appendedItems.length !== messages.length ||
|
|
57
|
+
appendedItems.some(item => !committedTerminalItemIds.has(item.itemId))) {
|
|
58
|
+
// A message that started before the indexed tail may complete later. It
|
|
59
|
+
// belongs inside the existing order, so blindly appending would publish a
|
|
60
|
+
// transcript that disagrees with the authoritative startedSeq ordering.
|
|
61
|
+
// Leave the old manifest stale and let the next snapshot rebuild once.
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const pages = [...current.pages];
|
|
65
|
+
let messageCount = current.messageCount;
|
|
66
|
+
for (let start = 0; start < messages.length; start += TRANSCRIPT_PAGE_ITEMS) {
|
|
67
|
+
const chunk = messages.slice(start, start + TRANSCRIPT_PAGE_ITEMS);
|
|
68
|
+
pages.push(writeImmutablePage(input.rootDir, input.threadId, messageCount, chunk));
|
|
69
|
+
messageCount += chunk.length;
|
|
70
|
+
}
|
|
71
|
+
const nextCommits = latestAuthorityCommits(input.projection, input.committedEvents);
|
|
72
|
+
const manifest = createManifest({
|
|
73
|
+
generation: current.generation + 1,
|
|
74
|
+
threadId: input.threadId,
|
|
75
|
+
head: input.nextHead,
|
|
76
|
+
startedAt: current.startedAt,
|
|
77
|
+
updatedAt: input.nextHead.lastEventTimestamp,
|
|
78
|
+
messageCount,
|
|
79
|
+
pages,
|
|
80
|
+
latestTurnCommit: nextCommits.latestTurnCommit ?? current.latestTurnCommit,
|
|
81
|
+
latestPlanTurnCommit: nextCommits.latestPlanTurnCommit ?? current.latestPlanTurnCommit,
|
|
82
|
+
});
|
|
83
|
+
writeManifest(input.rootDir, manifest);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
function loadThreadSessionIndexManifestV1(rootDir, threadId, head) {
|
|
87
|
+
const manifest = readManifest(manifestPath(rootDir, threadId), threadId);
|
|
88
|
+
return manifest && manifestMatchesHead(manifest, head) ? manifest : undefined;
|
|
89
|
+
}
|
|
90
|
+
function loadThreadSessionIndexedPageV1(input) {
|
|
91
|
+
const pageSize = input.pageSize ?? 50;
|
|
92
|
+
if (!Number.isSafeInteger(pageSize) || pageSize < 1 || pageSize > TRANSCRIPT_PAGE_ITEMS) {
|
|
93
|
+
throw new ThreadSessionIndexError('ORION_THREAD_SESSION_CURSOR_INVALID', 'Transcript pageSize must be an integer from 1 through 100.');
|
|
94
|
+
}
|
|
95
|
+
const manifest = loadThreadSessionIndexManifestV1(input.rootDir, input.threadId, input.head);
|
|
96
|
+
if (!manifest)
|
|
97
|
+
return undefined;
|
|
98
|
+
const end = input.cursor ? decodeCursor(input.cursor, manifest) : manifest.messageCount;
|
|
99
|
+
const offset = Math.max(0, end - pageSize);
|
|
100
|
+
const items = [];
|
|
101
|
+
for (const pointer of manifest.pages) {
|
|
102
|
+
if (pointer.end <= offset || pointer.start >= end)
|
|
103
|
+
continue;
|
|
104
|
+
const page = readPage(input.rootDir, input.threadId, pointer);
|
|
105
|
+
const from = Math.max(offset, pointer.start) - pointer.start;
|
|
106
|
+
const to = Math.min(end, pointer.end) - pointer.start;
|
|
107
|
+
items.push(...page.items.slice(from, to));
|
|
108
|
+
}
|
|
109
|
+
if (items.length !== end - offset) {
|
|
110
|
+
throw indexCorrupt('Transcript page manifest did not cover the requested range.');
|
|
111
|
+
}
|
|
112
|
+
return deepFreeze({
|
|
113
|
+
manifest,
|
|
114
|
+
items,
|
|
115
|
+
offset,
|
|
116
|
+
nextCursor: offset > 0 ? encodeCursor(manifest, offset) : null,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function projectTranscriptMessages(items, events) {
|
|
120
|
+
const timestamps = new Map();
|
|
121
|
+
for (const event of events) {
|
|
122
|
+
if (!event.itemId || !isItemTerminalEvent(event))
|
|
123
|
+
continue;
|
|
124
|
+
timestamps.set(event.itemId, event.timestamp);
|
|
125
|
+
}
|
|
126
|
+
return orderedTranscriptItems(items)
|
|
127
|
+
.filter(item => timestamps.has(item.itemId))
|
|
128
|
+
.map(item => {
|
|
129
|
+
const legacy = parseLegacyTranscriptReceipt(item.receipt);
|
|
130
|
+
if (legacy)
|
|
131
|
+
return legacy;
|
|
132
|
+
return {
|
|
133
|
+
role: item.role,
|
|
134
|
+
content: item.content ?? item.summary ?? item.error ?? '',
|
|
135
|
+
timestamp: timestamps.get(item.itemId) ?? 0,
|
|
136
|
+
};
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
function orderedTranscriptItems(items) {
|
|
140
|
+
return Object.values(items)
|
|
141
|
+
.filter(item => item.kind === 'message' && item.status !== 'started' && isMessageRole(item.role))
|
|
142
|
+
.sort((left, right) => left.startedSeq - right.startedSeq);
|
|
143
|
+
}
|
|
144
|
+
function createManifest(input) {
|
|
145
|
+
const content = {
|
|
146
|
+
version: 1,
|
|
147
|
+
generation: input.generation,
|
|
148
|
+
threadId: input.threadId,
|
|
149
|
+
cursor: input.head.cursor,
|
|
150
|
+
projectionDigest: input.head.projectionDigest,
|
|
151
|
+
lastEventTimestamp: input.head.lastEventTimestamp,
|
|
152
|
+
lastRecordHash: input.head.lastRecordHash,
|
|
153
|
+
log: { ...input.head.log },
|
|
154
|
+
startedAt: input.startedAt,
|
|
155
|
+
updatedAt: input.updatedAt,
|
|
156
|
+
messageCount: input.messageCount,
|
|
157
|
+
pages: input.pages.map(page => ({ ...page })),
|
|
158
|
+
...(input.latestTurnCommit ? { latestTurnCommit: { ...input.latestTurnCommit } } : {}),
|
|
159
|
+
...(input.latestPlanTurnCommit
|
|
160
|
+
? { latestPlanTurnCommit: { ...input.latestPlanTurnCommit } }
|
|
161
|
+
: {}),
|
|
162
|
+
};
|
|
163
|
+
return deepFreeze({ ...content, digest: (0, canonical_1.digestRuntimeValue)(content) });
|
|
164
|
+
}
|
|
165
|
+
function latestAuthorityCommits(projection, events) {
|
|
166
|
+
const committedTurns = events
|
|
167
|
+
? new Set(events
|
|
168
|
+
.filter(event => event.payload.type === 'turn.committed' && event.turnId)
|
|
169
|
+
.map(event => event.turnId))
|
|
170
|
+
: undefined;
|
|
171
|
+
const commits = Object.values(projection.turns)
|
|
172
|
+
.filter(turn => !committedTurns || committedTurns.has(turn.turnId))
|
|
173
|
+
.flatMap(turn => (turn.commit ? [{ seq: turn.commit.seq, receipt: turn.commit.receipt }] : []))
|
|
174
|
+
.sort((left, right) => left.seq - right.seq);
|
|
175
|
+
const latestTurnCommit = commits.at(-1);
|
|
176
|
+
const latestPlanTurnCommit = [...commits]
|
|
177
|
+
.reverse()
|
|
178
|
+
.find(commit => turnCommitContainsPlan(commit.receipt));
|
|
179
|
+
return {
|
|
180
|
+
...(latestTurnCommit ? { latestTurnCommit } : {}),
|
|
181
|
+
...(latestPlanTurnCommit ? { latestPlanTurnCommit } : {}),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function writeImmutablePage(rootDir, threadId, start, items) {
|
|
185
|
+
const end = start + items.length;
|
|
186
|
+
const content = {
|
|
187
|
+
version: 1,
|
|
188
|
+
threadId,
|
|
189
|
+
start,
|
|
190
|
+
end,
|
|
191
|
+
items: items.map(item => structuredClone(item)),
|
|
192
|
+
};
|
|
193
|
+
const page = deepFreeze({ ...content, digest: (0, canonical_1.digestRuntimeValue)(content) });
|
|
194
|
+
const file = `${threadId}.${start}-${end}.${page.digest}.page.v1.json`;
|
|
195
|
+
const dir = pagesDir(rootDir, threadId);
|
|
196
|
+
ensurePrivateDirectory(dir);
|
|
197
|
+
const path = (0, path_1.join)(dir, file);
|
|
198
|
+
const existing = readStoredPage(path, threadId);
|
|
199
|
+
if (!existing || existing.digest !== page.digest) {
|
|
200
|
+
(0, atomic_write_1.atomicWriteFileSync)(path, `${(0, canonical_1.canonicalRuntimeJson)(page)}\n`, { mode: 0o600, fsync: true });
|
|
201
|
+
fsyncDirectory(dir);
|
|
202
|
+
}
|
|
203
|
+
return { start, end, file, digest: page.digest };
|
|
204
|
+
}
|
|
205
|
+
function writeManifest(rootDir, manifest) {
|
|
206
|
+
ensurePrivateDirectory(rootDir);
|
|
207
|
+
(0, atomic_write_1.atomicWriteFileSync)(manifestPath(rootDir, manifest.threadId), `${(0, canonical_1.canonicalRuntimeJson)(manifest)}\n`, { mode: 0o600, fsync: true });
|
|
208
|
+
fsyncDirectory(rootDir);
|
|
209
|
+
}
|
|
210
|
+
function readManifest(path, threadId) {
|
|
211
|
+
const value = readRegularJson(path);
|
|
212
|
+
if (!isRecord(value))
|
|
213
|
+
return null;
|
|
214
|
+
const { digest: _digest, ...content } = value;
|
|
215
|
+
void _digest;
|
|
216
|
+
if (value.version !== 1 ||
|
|
217
|
+
value.threadId !== threadId ||
|
|
218
|
+
!positiveSafeInteger(value.generation) ||
|
|
219
|
+
!nonNegativeSafeInteger(value.cursor) ||
|
|
220
|
+
typeof value.projectionDigest !== 'string' ||
|
|
221
|
+
!nonNegativeSafeInteger(value.lastEventTimestamp) ||
|
|
222
|
+
(value.lastRecordHash !== null && !isSha256(value.lastRecordHash)) ||
|
|
223
|
+
!isLogIdentity(value.log) ||
|
|
224
|
+
!nonNegativeSafeInteger(value.startedAt) ||
|
|
225
|
+
!nonNegativeSafeInteger(value.updatedAt) ||
|
|
226
|
+
!nonNegativeSafeInteger(value.messageCount) ||
|
|
227
|
+
!Array.isArray(value.pages) ||
|
|
228
|
+
value.pages.length > MAX_MANIFEST_PAGES ||
|
|
229
|
+
typeof value.digest !== 'string' ||
|
|
230
|
+
(0, canonical_1.digestRuntimeValue)(content) !== value.digest) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
let nextStart = 0;
|
|
234
|
+
for (const page of value.pages) {
|
|
235
|
+
if (!isPagePointer(page, nextStart))
|
|
236
|
+
return null;
|
|
237
|
+
nextStart = page.end;
|
|
238
|
+
}
|
|
239
|
+
if (nextStart !== value.messageCount)
|
|
240
|
+
return null;
|
|
241
|
+
if (value.latestTurnCommit !== undefined && !isTurnCommit(value.latestTurnCommit))
|
|
242
|
+
return null;
|
|
243
|
+
if (value.latestPlanTurnCommit !== undefined && !isTurnCommit(value.latestPlanTurnCommit)) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
return deepFreeze(value);
|
|
247
|
+
}
|
|
248
|
+
function readPage(rootDir, threadId, pointer) {
|
|
249
|
+
if ((0, path_1.basename)(pointer.file) !== pointer.file)
|
|
250
|
+
throw indexCorrupt('Transcript page path escaped.');
|
|
251
|
+
const page = readStoredPage((0, path_1.join)(pagesDir(rootDir, threadId), pointer.file), threadId);
|
|
252
|
+
if (!page ||
|
|
253
|
+
page.start !== pointer.start ||
|
|
254
|
+
page.end !== pointer.end ||
|
|
255
|
+
page.digest !== pointer.digest) {
|
|
256
|
+
throw indexCorrupt('Transcript page failed its manifest binding.');
|
|
257
|
+
}
|
|
258
|
+
return page;
|
|
259
|
+
}
|
|
260
|
+
function readStoredPage(path, threadId) {
|
|
261
|
+
const value = readRegularJson(path);
|
|
262
|
+
if (!isRecord(value))
|
|
263
|
+
return null;
|
|
264
|
+
const { digest: _digest, ...content } = value;
|
|
265
|
+
void _digest;
|
|
266
|
+
if (value.version !== 1 ||
|
|
267
|
+
value.threadId !== threadId ||
|
|
268
|
+
!nonNegativeSafeInteger(value.start) ||
|
|
269
|
+
!nonNegativeSafeInteger(value.end) ||
|
|
270
|
+
value.end <= value.start ||
|
|
271
|
+
!Array.isArray(value.items) ||
|
|
272
|
+
value.items.length !== value.end - value.start ||
|
|
273
|
+
value.items.length > TRANSCRIPT_PAGE_ITEMS ||
|
|
274
|
+
value.items.some(item => !isTranscriptMessage(item)) ||
|
|
275
|
+
typeof value.digest !== 'string' ||
|
|
276
|
+
(0, canonical_1.digestRuntimeValue)(content) !== value.digest) {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
return deepFreeze(value);
|
|
280
|
+
}
|
|
281
|
+
function manifestMatchesHead(manifest, head) {
|
|
282
|
+
return (manifest.cursor === head.cursor &&
|
|
283
|
+
manifest.projectionDigest === head.projectionDigest &&
|
|
284
|
+
manifest.lastEventTimestamp === head.lastEventTimestamp &&
|
|
285
|
+
manifest.lastRecordHash === head.lastRecordHash &&
|
|
286
|
+
sameLogIdentity(manifest.log, head.log));
|
|
287
|
+
}
|
|
288
|
+
function encodeCursor(manifest, end) {
|
|
289
|
+
return Buffer.from((0, canonical_1.canonicalRuntimeJson)({
|
|
290
|
+
version: 1,
|
|
291
|
+
kind: 'thread-transcript',
|
|
292
|
+
threadId: manifest.threadId,
|
|
293
|
+
revision: manifest.digest,
|
|
294
|
+
end,
|
|
295
|
+
})).toString('base64url');
|
|
296
|
+
}
|
|
297
|
+
function decodeCursor(cursor, manifest) {
|
|
298
|
+
if (!cursor || cursor.length > 1024)
|
|
299
|
+
throw cursorInvalid();
|
|
300
|
+
let value;
|
|
301
|
+
try {
|
|
302
|
+
value = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
throw cursorInvalid();
|
|
306
|
+
}
|
|
307
|
+
if (!isRecord(value) ||
|
|
308
|
+
value.version !== 1 ||
|
|
309
|
+
value.kind !== 'thread-transcript' ||
|
|
310
|
+
value.threadId !== manifest.threadId ||
|
|
311
|
+
!nonNegativeSafeInteger(value.end) ||
|
|
312
|
+
value.end > manifest.messageCount ||
|
|
313
|
+
typeof value.revision !== 'string') {
|
|
314
|
+
throw cursorInvalid();
|
|
315
|
+
}
|
|
316
|
+
if (value.revision !== manifest.digest) {
|
|
317
|
+
throw new ThreadSessionIndexError('ORION_THREAD_SESSION_CURSOR_STALE', 'Transcript changed after this page cursor was issued.');
|
|
318
|
+
}
|
|
319
|
+
return value.end;
|
|
320
|
+
}
|
|
321
|
+
function parseLegacyTranscriptReceipt(receipt) {
|
|
322
|
+
if (!receipt)
|
|
323
|
+
return undefined;
|
|
324
|
+
let parsed;
|
|
325
|
+
try {
|
|
326
|
+
parsed = JSON.parse(receipt);
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
return undefined;
|
|
330
|
+
}
|
|
331
|
+
if (!isRecord(parsed) || !isRecord(parsed.legacyRecord))
|
|
332
|
+
return undefined;
|
|
333
|
+
const record = parsed.legacyRecord;
|
|
334
|
+
if (!isMessageRole(record.role) || typeof record.content !== 'string')
|
|
335
|
+
return undefined;
|
|
336
|
+
if (!Number.isFinite(record.timestamp))
|
|
337
|
+
return undefined;
|
|
338
|
+
const toolCalls = parseToolCalls(record.tool_calls);
|
|
339
|
+
const appliedSkills = Array.isArray(record.appliedSkills)
|
|
340
|
+
? record.appliedSkills.filter((value) => typeof value === 'string')
|
|
341
|
+
: undefined;
|
|
342
|
+
return {
|
|
343
|
+
role: record.role,
|
|
344
|
+
content: record.content,
|
|
345
|
+
timestamp: record.timestamp,
|
|
346
|
+
...(typeof record.modelVisibleContent === 'string'
|
|
347
|
+
? { modelVisibleContent: record.modelVisibleContent }
|
|
348
|
+
: {}),
|
|
349
|
+
...(typeof record.toolCallId === 'string' ? { toolCallId: record.toolCallId } : {}),
|
|
350
|
+
...(toolCalls ? { tool_calls: toolCalls } : {}),
|
|
351
|
+
...(appliedSkills ? { appliedSkills } : {}),
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
function parseToolCalls(value) {
|
|
355
|
+
if (value === undefined || !Array.isArray(value))
|
|
356
|
+
return undefined;
|
|
357
|
+
const result = [];
|
|
358
|
+
for (const item of value) {
|
|
359
|
+
if (!isRecord(item) ||
|
|
360
|
+
typeof item.id !== 'string' ||
|
|
361
|
+
item.type !== 'function' ||
|
|
362
|
+
!isRecord(item.function) ||
|
|
363
|
+
typeof item.function.name !== 'string' ||
|
|
364
|
+
typeof item.function.arguments !== 'string') {
|
|
365
|
+
return undefined;
|
|
366
|
+
}
|
|
367
|
+
result.push({
|
|
368
|
+
id: item.id,
|
|
369
|
+
type: 'function',
|
|
370
|
+
function: { name: item.function.name, arguments: item.function.arguments },
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
return result;
|
|
374
|
+
}
|
|
375
|
+
function isTranscriptMessage(value) {
|
|
376
|
+
if (!isRecord(value) ||
|
|
377
|
+
!isMessageRole(value.role) ||
|
|
378
|
+
typeof value.content !== 'string' ||
|
|
379
|
+
!nonNegativeSafeInteger(value.timestamp)) {
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
if (value.modelVisibleContent !== undefined && typeof value.modelVisibleContent !== 'string') {
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
if (value.toolCallId !== undefined && typeof value.toolCallId !== 'string')
|
|
386
|
+
return false;
|
|
387
|
+
if (value.appliedSkills !== undefined) {
|
|
388
|
+
if (!Array.isArray(value.appliedSkills) ||
|
|
389
|
+
value.appliedSkills.some(item => typeof item !== 'string')) {
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return value.tool_calls === undefined || parseToolCalls(value.tool_calls) !== undefined;
|
|
394
|
+
}
|
|
395
|
+
function isPagePointer(value, expectedStart) {
|
|
396
|
+
return (isRecord(value) &&
|
|
397
|
+
value.start === expectedStart &&
|
|
398
|
+
nonNegativeSafeInteger(value.end) &&
|
|
399
|
+
value.end > expectedStart &&
|
|
400
|
+
value.end - expectedStart <= TRANSCRIPT_PAGE_ITEMS &&
|
|
401
|
+
typeof value.file === 'string' &&
|
|
402
|
+
(0, path_1.basename)(value.file) === value.file &&
|
|
403
|
+
isSha256(value.digest));
|
|
404
|
+
}
|
|
405
|
+
function isTurnCommit(value) {
|
|
406
|
+
return isRecord(value) && positiveSafeInteger(value.seq) && typeof value.receipt === 'string';
|
|
407
|
+
}
|
|
408
|
+
function isLogIdentity(value) {
|
|
409
|
+
return (isRecord(value) &&
|
|
410
|
+
nonNegativeSafeInteger(value.bytes) &&
|
|
411
|
+
['device', 'inode', 'mtimeNs', 'ctimeNs'].every(key => typeof value[key] === 'string' && /^\d+$/.test(value[key])));
|
|
412
|
+
}
|
|
413
|
+
function sameLogIdentity(left, right) {
|
|
414
|
+
return (left.bytes === right.bytes &&
|
|
415
|
+
left.device === right.device &&
|
|
416
|
+
left.inode === right.inode &&
|
|
417
|
+
left.mtimeNs === right.mtimeNs &&
|
|
418
|
+
left.ctimeNs === right.ctimeNs);
|
|
419
|
+
}
|
|
420
|
+
function turnCommitContainsPlan(receipt) {
|
|
421
|
+
try {
|
|
422
|
+
const parsed = JSON.parse(receipt);
|
|
423
|
+
return typeof parsed.planReceipt === 'string' && parsed.planReceipt.length > 0;
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
function isItemTerminalEvent(event) {
|
|
430
|
+
return (event.payload.type === 'item.completed' ||
|
|
431
|
+
event.payload.type === 'item.failed' ||
|
|
432
|
+
event.payload.type === 'item.interrupted' ||
|
|
433
|
+
event.payload.type === 'item.indeterminate');
|
|
434
|
+
}
|
|
435
|
+
function isMessageRole(value) {
|
|
436
|
+
return value === 'system' || value === 'user' || value === 'assistant' || value === 'tool';
|
|
437
|
+
}
|
|
438
|
+
function readRegularJson(path) {
|
|
439
|
+
let fd;
|
|
440
|
+
try {
|
|
441
|
+
fd = (0, fs_1.openSync)(path, fs_1.constants.O_RDONLY | (typeof fs_1.constants.O_NOFOLLOW === 'number' ? fs_1.constants.O_NOFOLLOW : 0));
|
|
442
|
+
if (!(0, fs_1.fstatSync)(fd).isFile())
|
|
443
|
+
return undefined;
|
|
444
|
+
return JSON.parse((0, fs_1.readFileSync)(fd, 'utf8'));
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
return undefined;
|
|
448
|
+
}
|
|
449
|
+
finally {
|
|
450
|
+
if (fd !== undefined)
|
|
451
|
+
(0, fs_1.closeSync)(fd);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
function manifestPath(rootDir, threadId) {
|
|
455
|
+
return (0, path_1.join)(rootDir, `${threadId}.session-index.v1.json`);
|
|
456
|
+
}
|
|
457
|
+
function pagesDir(rootDir, threadId) {
|
|
458
|
+
return (0, path_1.join)(rootDir, `${threadId}.transcript-pages.v1`);
|
|
459
|
+
}
|
|
460
|
+
function ensurePrivateDirectory(path) {
|
|
461
|
+
(0, fs_1.mkdirSync)(path, { recursive: true, mode: 0o700 });
|
|
462
|
+
}
|
|
463
|
+
function fsyncDirectory(path) {
|
|
464
|
+
let fd;
|
|
465
|
+
try {
|
|
466
|
+
fd = (0, fs_1.openSync)(path, 'r');
|
|
467
|
+
(0, fs_1.fsyncSync)(fd);
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
// Atomic rename + file fsync remains the portable minimum.
|
|
471
|
+
}
|
|
472
|
+
finally {
|
|
473
|
+
if (fd !== undefined)
|
|
474
|
+
(0, fs_1.closeSync)(fd);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
function positiveSafeInteger(value) {
|
|
478
|
+
return Number.isSafeInteger(value) && value > 0;
|
|
479
|
+
}
|
|
480
|
+
function nonNegativeSafeInteger(value) {
|
|
481
|
+
return Number.isSafeInteger(value) && value >= 0;
|
|
482
|
+
}
|
|
483
|
+
function isSha256(value) {
|
|
484
|
+
return typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);
|
|
485
|
+
}
|
|
486
|
+
function cursorInvalid() {
|
|
487
|
+
return new ThreadSessionIndexError('ORION_THREAD_SESSION_CURSOR_INVALID', 'Transcript page cursor is invalid.');
|
|
488
|
+
}
|
|
489
|
+
function indexCorrupt(message) {
|
|
490
|
+
return new ThreadSessionIndexError('ORION_THREAD_SESSION_INDEX_CORRUPT', message);
|
|
491
|
+
}
|
|
492
|
+
function isRecord(value) {
|
|
493
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
494
|
+
}
|
|
495
|
+
function deepFreeze(value) {
|
|
496
|
+
if (value && typeof value === 'object' && !Object.isFrozen(value)) {
|
|
497
|
+
Object.freeze(value);
|
|
498
|
+
for (const nested of Object.values(value))
|
|
499
|
+
deepFreeze(nested);
|
|
500
|
+
}
|
|
501
|
+
return value;
|
|
502
|
+
}
|
|
503
|
+
//# sourceMappingURL=thread-session-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-session-index.js","sourceRoot":"","sources":["../../src/runtime/thread-session-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,8 @@
|
|
|
1
1
|
import type { Message } from '../services/llm';
|
|
2
2
|
import { type SessionHistoryRecoveryDiagnosticV1, type SessionHistoryResolvedSourceV1 } from './session-history-recovery';
|
|
3
3
|
import { ThreadEventStore, type ThreadReadModelHeadV1 } from './thread-event-store';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
readonly content: string;
|
|
7
|
-
readonly timestamp: number;
|
|
8
|
-
readonly modelVisibleContent?: string;
|
|
9
|
-
readonly toolCallId?: string;
|
|
10
|
-
readonly tool_calls?: NonNullable<Message['tool_calls']>;
|
|
11
|
-
readonly appliedSkills?: readonly string[];
|
|
12
|
-
}
|
|
13
|
-
export interface ThreadSessionTurnCommitV1 {
|
|
14
|
-
readonly seq: number;
|
|
15
|
-
readonly receipt: string;
|
|
16
|
-
}
|
|
4
|
+
import { type ThreadSessionTranscriptMessageV1, type ThreadSessionTurnCommitV1 } from './thread-session-index';
|
|
5
|
+
export type { ThreadSessionTranscriptMessageV1, ThreadSessionTurnCommitV1, } from './thread-session-index';
|
|
17
6
|
/** Metadata/transcript projection that never needs to decode model history. */
|
|
18
7
|
export interface ThreadSessionSummaryV1 {
|
|
19
8
|
readonly version: 1;
|
|
@@ -63,6 +52,29 @@ export interface OpenThreadSessionViewV1 {
|
|
|
63
52
|
readonly view: ThreadSessionViewV1;
|
|
64
53
|
readonly runtimeActivation: ThreadSessionRuntimeActivationV1;
|
|
65
54
|
}
|
|
55
|
+
export interface ThreadSessionSnapshotPageV1 {
|
|
56
|
+
readonly version: 1;
|
|
57
|
+
readonly sessionId: string;
|
|
58
|
+
readonly threadId: string;
|
|
59
|
+
readonly cursor: number;
|
|
60
|
+
readonly projectionDigest: string;
|
|
61
|
+
readonly startedAt: number;
|
|
62
|
+
readonly updatedAt: number;
|
|
63
|
+
readonly historySizeBytes: number;
|
|
64
|
+
readonly messageCount: number;
|
|
65
|
+
readonly transcript: {
|
|
66
|
+
readonly items: readonly ThreadSessionTranscriptMessageV1[];
|
|
67
|
+
readonly offset: number;
|
|
68
|
+
readonly nextCursor: string | null;
|
|
69
|
+
};
|
|
70
|
+
readonly readModel: {
|
|
71
|
+
readonly cutoverGeneration: number;
|
|
72
|
+
readonly lastRecordHash: string | null;
|
|
73
|
+
readonly log: ThreadReadModelHeadV1['log'];
|
|
74
|
+
};
|
|
75
|
+
readonly latestTurnCommit?: ThreadSessionTurnCommitV1;
|
|
76
|
+
readonly latestPlanTurnCommit?: ThreadSessionTurnCommitV1;
|
|
77
|
+
}
|
|
66
78
|
export declare class ThreadSessionViewError extends Error {
|
|
67
79
|
readonly code = "ORION_THREAD_SESSION_VIEW_INVALID";
|
|
68
80
|
constructor(message: string);
|
|
@@ -85,4 +97,10 @@ export declare function openThreadSessionViewV1(projectPath: string, sessionId:
|
|
|
85
97
|
export declare function openThreadSessionRuntimeActivationV1(projectPath: string, sessionId: string): ThreadSessionRuntimeActivationV1 | undefined;
|
|
86
98
|
/** Load list/picker metadata without allowing model-history damage to fan out. */
|
|
87
99
|
export declare function loadThreadSessionSummaryV1(projectPath: string, sessionId: string): ThreadSessionSummaryV1 | undefined;
|
|
100
|
+
/**
|
|
101
|
+
* Load one revision-bound transcript page without materializing the complete
|
|
102
|
+
* projection/history. A missing or stale derived index is rebuilt once from
|
|
103
|
+
* the authoritative Thread and then reused by later processes.
|
|
104
|
+
*/
|
|
105
|
+
export declare function loadThreadSessionSnapshotPageV1(projectPath: string, sessionId: string, cursor?: string, pageSize?: number): ThreadSessionSnapshotPageV1 | undefined;
|
|
88
106
|
//# sourceMappingURL=thread-session-view.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-session-view.d.ts","sourceRoot":"","sources":["../../src/runtime/thread-session-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"thread-session-view.d.ts","sourceRoot":"","sources":["../../src/runtime/thread-session-view.ts"],"names":[],"mappings":"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"}
|