@gencode/uni 0.3.1 → 0.4.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 (73) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +104 -0
  3. package/dist/shared/src/index.d.ts +1 -1
  4. package/dist/shared/src/index.d.ts.map +1 -1
  5. package/dist/shared/src/index.js.map +1 -1
  6. package/dist/shared/src/session.d.ts +13 -0
  7. package/dist/shared/src/session.d.ts.map +1 -1
  8. package/dist/uni/src/artifacts/accumulator.d.ts +17 -0
  9. package/dist/uni/src/artifacts/accumulator.d.ts.map +1 -0
  10. package/dist/uni/src/artifacts/accumulator.js +73 -0
  11. package/dist/uni/src/artifacts/accumulator.js.map +1 -0
  12. package/dist/uni/src/artifacts/parser.d.ts +14 -0
  13. package/dist/uni/src/artifacts/parser.d.ts.map +1 -0
  14. package/dist/uni/src/artifacts/parser.js +151 -0
  15. package/dist/uni/src/artifacts/parser.js.map +1 -0
  16. package/dist/uni/src/artifacts/stream-filter.d.ts +16 -0
  17. package/dist/uni/src/artifacts/stream-filter.d.ts.map +1 -0
  18. package/dist/uni/src/artifacts/stream-filter.js +93 -0
  19. package/dist/uni/src/artifacts/stream-filter.js.map +1 -0
  20. package/dist/uni/src/artifacts/tool-inference.d.ts +11 -0
  21. package/dist/uni/src/artifacts/tool-inference.d.ts.map +1 -0
  22. package/dist/uni/src/artifacts/tool-inference.js +257 -0
  23. package/dist/uni/src/artifacts/tool-inference.js.map +1 -0
  24. package/dist/uni/src/events/normalizer.d.ts.map +1 -1
  25. package/dist/uni/src/events/normalizer.js +8 -1
  26. package/dist/uni/src/events/normalizer.js.map +1 -1
  27. package/dist/uni/src/events/provider-events.d.ts.map +1 -1
  28. package/dist/uni/src/events/provider-events.js +353 -56
  29. package/dist/uni/src/events/provider-events.js.map +1 -1
  30. package/dist/uni/src/program.d.ts.map +1 -1
  31. package/dist/uni/src/program.js +8 -4
  32. package/dist/uni/src/program.js.map +1 -1
  33. package/dist/uni/src/providers/claude-code.d.ts.map +1 -1
  34. package/dist/uni/src/providers/claude-code.js +6 -2
  35. package/dist/uni/src/providers/claude-code.js.map +1 -1
  36. package/dist/uni/src/providers/codex.d.ts.map +1 -1
  37. package/dist/uni/src/providers/codex.js +13 -7
  38. package/dist/uni/src/providers/codex.js.map +1 -1
  39. package/dist/uni/src/providers/opencode.d.ts.map +1 -1
  40. package/dist/uni/src/providers/opencode.js +6 -2
  41. package/dist/uni/src/providers/opencode.js.map +1 -1
  42. package/dist/uni/src/providers/pi.d.ts.map +1 -1
  43. package/dist/uni/src/providers/pi.js +14 -5
  44. package/dist/uni/src/providers/pi.js.map +1 -1
  45. package/dist/uni/src/providers/provider-state.d.ts +10 -0
  46. package/dist/uni/src/providers/provider-state.d.ts.map +1 -0
  47. package/dist/uni/src/providers/provider-state.js +50 -0
  48. package/dist/uni/src/providers/provider-state.js.map +1 -0
  49. package/dist/uni/src/providers/spawned-provider.d.ts.map +1 -1
  50. package/dist/uni/src/providers/spawned-provider.js +36 -4
  51. package/dist/uni/src/providers/spawned-provider.js.map +1 -1
  52. package/dist/uni/src/run.d.ts.map +1 -1
  53. package/dist/uni/src/run.js +852 -336
  54. package/dist/uni/src/run.js.map +1 -1
  55. package/dist/uni/src/session/artifact-operation-store.d.ts +66 -0
  56. package/dist/uni/src/session/artifact-operation-store.d.ts.map +1 -0
  57. package/dist/uni/src/session/artifact-operation-store.js +370 -0
  58. package/dist/uni/src/session/artifact-operation-store.js.map +1 -0
  59. package/dist/uni/src/session/context-store.d.ts +37 -0
  60. package/dist/uni/src/session/context-store.d.ts.map +1 -0
  61. package/dist/uni/src/session/context-store.js +222 -0
  62. package/dist/uni/src/session/context-store.js.map +1 -0
  63. package/dist/uni/src/session/session-store.d.ts +57 -2
  64. package/dist/uni/src/session/session-store.d.ts.map +1 -1
  65. package/dist/uni/src/session/session-store.js +484 -15
  66. package/dist/uni/src/session/session-store.js.map +1 -1
  67. package/dist/uni/src/transcript/turn-accumulator.d.ts +57 -0
  68. package/dist/uni/src/transcript/turn-accumulator.d.ts.map +1 -0
  69. package/dist/uni/src/transcript/turn-accumulator.js +136 -0
  70. package/dist/uni/src/transcript/turn-accumulator.js.map +1 -0
  71. package/dist/uni/src/types.d.ts +25 -1
  72. package/dist/uni/src/types.d.ts.map +1 -1
  73. package/package.json +2 -2
@@ -1,36 +1,505 @@
1
+ import { randomUUID } from "node:crypto";
1
2
  import fs from "node:fs/promises";
2
3
  import path from "node:path";
3
- const DEFAULT_SESSION_STORE_NAME = "sessions";
4
- function sessionsDir(dataDir, storeName) {
5
- return path.join(dataDir, ".aimax", storeName?.trim() || DEFAULT_SESSION_STORE_NAME);
4
+ export const DEFAULT_UNI_SESSION_STORE_NAME = "sessions";
5
+ const transcriptAppendQueues = new Map();
6
+ const MAX_PROVIDER_STATE_FILES = 10_000;
7
+ const MAX_PROVIDER_EVIDENCE_BYTES = 1_000_000;
8
+ export class UniSessionError extends Error {
9
+ code;
10
+ constructor(code, message) {
11
+ super(message);
12
+ this.code = code;
13
+ this.name = "UniSessionError";
14
+ }
6
15
  }
7
- function sessionDir(dataDir, sessionId, storeName) {
8
- return path.join(sessionsDir(dataDir, storeName), sessionId);
16
+ export function normalizeUniSessionStoreName(storeName) {
17
+ const normalized = storeName?.trim() || DEFAULT_UNI_SESSION_STORE_NAME;
18
+ if (!/^[A-Za-z0-9_-]+$/.test(normalized)) {
19
+ throw new UniSessionError("invalid_session", `Invalid session store name: ${String(storeName)}`);
20
+ }
21
+ return normalized;
9
22
  }
10
- async function ensureSessionDir(dataDir, sessionId, storeName) {
11
- const dir = sessionDir(dataDir, sessionId, storeName);
23
+ function normalizeLogicalSessionId(sessionId) {
24
+ const normalized = sessionId.trim();
25
+ if (!normalized
26
+ || normalized === "."
27
+ || normalized === ".."
28
+ || normalized.includes("/")
29
+ || normalized.includes("\\")
30
+ || path.isAbsolute(normalized)) {
31
+ throw new UniSessionError("invalid_session", `Invalid logical session ID: ${sessionId}`);
32
+ }
33
+ return normalized;
34
+ }
35
+ export function uniSessionsDir(dataDir, storeName) {
36
+ return path.join(dataDir, ".aimax", normalizeUniSessionStoreName(storeName));
37
+ }
38
+ export function uniSessionDir(dataDir, sessionId, storeName) {
39
+ return path.join(uniSessionsDir(dataDir, storeName), normalizeLogicalSessionId(sessionId));
40
+ }
41
+ export function uniMetadataPath(dataDir, sessionId, storeName) {
42
+ return path.join(uniSessionDir(dataDir, sessionId, storeName), "session.json");
43
+ }
44
+ export function uniChannelPath(dataDir, sessionId, storeName) {
45
+ return path.join(uniSessionDir(dataDir, sessionId, storeName), ".channel");
46
+ }
47
+ export function uniTranscriptPath(dataDir, sessionId, storeName) {
48
+ return path.join(uniSessionDir(dataDir, sessionId, storeName), "transcript.jsonl");
49
+ }
50
+ export function uniContextPath(dataDir, sessionId, storeName) {
51
+ return path.join(uniSessionDir(dataDir, sessionId, storeName), "context.json");
52
+ }
53
+ export function uniToolResultsDir(dataDir, sessionId, storeName) {
54
+ return path.join(uniSessionDir(dataDir, sessionId, storeName), "tool-results");
55
+ }
56
+ export async function ensureUniSessionDir(dataDir, sessionId, storeName) {
57
+ const dir = uniSessionDir(dataDir, sessionId, storeName);
12
58
  await fs.mkdir(dir, { recursive: true });
13
59
  return dir;
14
60
  }
61
+ export async function atomicWriteUniFile(filePath, content) {
62
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
63
+ const temporaryPath = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${process.pid}.${randomUUID()}.tmp`);
64
+ try {
65
+ await fs.writeFile(temporaryPath, content, "utf8");
66
+ await fs.rename(temporaryPath, filePath);
67
+ }
68
+ finally {
69
+ await fs.rm(temporaryPath, { force: true }).catch(() => undefined);
70
+ }
71
+ }
15
72
  export async function saveUniSessionMetadata(dataDir, metadata, storeName) {
16
- const dir = await ensureSessionDir(dataDir, metadata.id, storeName);
17
- const filePath = path.join(dir, "session.json");
18
- await fs.writeFile(filePath, JSON.stringify(metadata, null, 2), "utf-8");
73
+ const filePath = uniMetadataPath(dataDir, metadata.id, storeName);
74
+ await atomicWriteUniFile(filePath, `${JSON.stringify(metadata, null, 2)}\n`);
75
+ }
76
+ export async function loadUniSessionMetadata(dataDir, sessionId, storeName) {
77
+ try {
78
+ const parsed = JSON.parse(await fs.readFile(uniMetadataPath(dataDir, sessionId, storeName), "utf8"));
79
+ if (typeof parsed.id !== "string"
80
+ || typeof parsed.title !== "string"
81
+ || typeof parsed.channel !== "string"
82
+ || typeof parsed.createdAt !== "string"
83
+ || typeof parsed.updatedAt !== "string") {
84
+ return null;
85
+ }
86
+ const runtimeBinding = parseRuntimeBinding(parsed.runtimeBinding);
87
+ if (parsed.runtimeBinding !== undefined && !runtimeBinding) {
88
+ return null;
89
+ }
90
+ return {
91
+ ...parsed,
92
+ ...(runtimeBinding ? { runtimeBinding } : {}),
93
+ };
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ function parseRuntimeBinding(value) {
100
+ if (value === undefined) {
101
+ return undefined;
102
+ }
103
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
104
+ return undefined;
105
+ }
106
+ const record = value;
107
+ if (record.engine !== "uni"
108
+ || typeof record.runtimeAgent !== "string"
109
+ || !record.runtimeAgent.trim()
110
+ || record.runtimeAgent !== record.runtimeAgent.trim()) {
111
+ return undefined;
112
+ }
113
+ if (record.providerSessionId !== undefined) {
114
+ if (typeof record.providerSessionId !== "string"
115
+ || !record.providerSessionId.trim()
116
+ || record.providerSessionId !== record.providerSessionId.trim()) {
117
+ return undefined;
118
+ }
119
+ }
120
+ return {
121
+ engine: "uni",
122
+ runtimeAgent: record.runtimeAgent,
123
+ ...(typeof record.providerSessionId === "string"
124
+ ? { providerSessionId: record.providerSessionId }
125
+ : {}),
126
+ };
127
+ }
128
+ export async function updateUniSessionMetadata(dataDir, sessionId, updates, storeName) {
129
+ const existing = await loadUniSessionMetadata(dataDir, sessionId, storeName);
130
+ if (!existing) {
131
+ throw new UniSessionError("invalid_session", `Session metadata is missing or invalid: ${sessionId}`);
132
+ }
133
+ const updated = {
134
+ ...existing,
135
+ ...updates,
136
+ id: existing.id,
137
+ createdAt: existing.createdAt,
138
+ updatedAt: nextUniUpdatedAt(existing.updatedAt),
139
+ };
140
+ await saveUniSessionMetadata(dataDir, updated, storeName);
141
+ return updated;
142
+ }
143
+ function nextUniUpdatedAt(previous) {
144
+ const previousMs = Date.parse(previous);
145
+ const nextMs = Number.isFinite(previousMs)
146
+ ? Math.max(Date.now(), previousMs + 1)
147
+ : Date.now();
148
+ return new Date(nextMs).toISOString();
149
+ }
150
+ export async function ensureUniChannelFile(dataDir, sessionId, channel, storeName) {
151
+ const filePath = uniChannelPath(dataDir, sessionId, storeName);
152
+ try {
153
+ await fs.access(filePath);
154
+ }
155
+ catch {
156
+ await atomicWriteUniFile(filePath, channel);
157
+ }
158
+ }
159
+ export async function ensureUniTranscriptFile(dataDir, sessionId, storeName) {
160
+ await ensureUniSessionDir(dataDir, sessionId, storeName);
161
+ const handle = await fs.open(uniTranscriptPath(dataDir, sessionId, storeName), "a");
162
+ await handle.close();
163
+ }
164
+ export async function appendUniTranscriptEntries(dataDir, sessionId, entries, storeName) {
165
+ if (entries.length === 0) {
166
+ await ensureUniTranscriptFile(dataDir, sessionId, storeName);
167
+ return;
168
+ }
169
+ const filePath = uniTranscriptPath(dataDir, sessionId, storeName);
170
+ const previous = transcriptAppendQueues.get(filePath) ?? Promise.resolve();
171
+ const next = previous.catch(() => undefined).then(async () => {
172
+ await ensureUniSessionDir(dataDir, sessionId, storeName);
173
+ await fs.appendFile(filePath, entries.map((entry) => JSON.stringify(entry)).join("\n") + "\n", "utf8");
174
+ });
175
+ transcriptAppendQueues.set(filePath, next);
176
+ try {
177
+ await next;
178
+ }
179
+ finally {
180
+ if (transcriptAppendQueues.get(filePath) === next) {
181
+ transcriptAppendQueues.delete(filePath);
182
+ }
183
+ }
19
184
  }
20
185
  export async function appendUniTranscriptEntry(dataDir, sessionId, entry, storeName) {
21
- const dir = await ensureSessionDir(dataDir, sessionId, storeName);
22
- const filePath = path.join(dir, "transcript.jsonl");
23
- const line = JSON.stringify(entry) + "\n";
24
- await fs.appendFile(filePath, line, "utf-8");
186
+ await appendUniTranscriptEntries(dataDir, sessionId, [entry], storeName);
187
+ }
188
+ export async function loadUniTranscript(dataDir, sessionId, storeName) {
189
+ return (await readUniTranscriptState(dataDir, sessionId, storeName)).entries;
190
+ }
191
+ async function readUniTranscriptState(dataDir, sessionId, storeName) {
192
+ let raw;
193
+ try {
194
+ raw = await fs.readFile(uniTranscriptPath(dataDir, sessionId, storeName), "utf8");
195
+ }
196
+ catch {
197
+ return { entries: [], malformed: false, hasContent: false };
198
+ }
199
+ const entries = [];
200
+ let malformed = false;
201
+ for (const line of raw.split("\n")) {
202
+ if (!line.trim())
203
+ continue;
204
+ try {
205
+ const parsed = JSON.parse(line);
206
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
207
+ entries.push(parsed);
208
+ }
209
+ }
210
+ catch {
211
+ malformed = true;
212
+ }
213
+ }
214
+ return { entries, malformed, hasContent: raw.trim().length > 0 };
215
+ }
216
+ export async function countUniTranscriptEntries(dataDir, sessionId, storeName) {
217
+ return (await loadUniTranscript(dataDir, sessionId, storeName)).length;
25
218
  }
26
219
  export function buildUniSessionMetadata(params) {
27
220
  const now = new Date().toISOString();
28
221
  return {
29
- id: params.sessionId,
222
+ id: normalizeLogicalSessionId(params.sessionId),
30
223
  title: params.title,
31
224
  channel: params.channel,
32
225
  createdAt: now,
33
226
  updatedAt: now,
227
+ runtimeBinding: params.runtimeAgent
228
+ ? {
229
+ engine: "uni",
230
+ runtimeAgent: params.runtimeAgent,
231
+ providerSessionId: params.providerSessionId,
232
+ }
233
+ : undefined,
234
+ };
235
+ }
236
+ export async function prepareUniSession(options) {
237
+ const logicalSessionId = normalizeLogicalSessionId(options.logicalSessionId);
238
+ const metadataFile = uniMetadataPath(options.dataDir, logicalSessionId, options.storeName);
239
+ const metadataFileExists = await pathExists(metadataFile);
240
+ const existing = await loadUniSessionMetadata(options.dataDir, logicalSessionId, options.storeName);
241
+ const transcriptState = await readUniTranscriptState(options.dataDir, logicalSessionId, options.storeName);
242
+ const existingTranscriptCount = transcriptState.entries.length;
243
+ if (!existing) {
244
+ if (metadataFileExists || transcriptState.hasContent) {
245
+ throw new UniSessionError("not_uni_session", `Session ${logicalSessionId} is not a recognizable Uni session; refusing automatic migration`);
246
+ }
247
+ const metadata = buildUniSessionMetadata({
248
+ sessionId: logicalSessionId,
249
+ title: options.title,
250
+ channel: options.channel,
251
+ runtimeAgent: options.runtimeAgent,
252
+ });
253
+ await ensureUniSessionDir(options.dataDir, logicalSessionId, options.storeName);
254
+ await ensureUniChannelFile(options.dataDir, logicalSessionId, options.channel, options.storeName);
255
+ await ensureUniTranscriptFile(options.dataDir, logicalSessionId, options.storeName);
256
+ await saveUniSessionMetadata(options.dataDir, metadata, options.storeName);
257
+ return {
258
+ logicalSessionId,
259
+ metadata,
260
+ isNew: true,
261
+ migratedLegacy: false,
262
+ existingTranscriptEntryCount: 0,
263
+ };
264
+ }
265
+ if (existing.id !== logicalSessionId) {
266
+ throw new UniSessionError("invalid_session", `Session metadata ID does not match logical session ${logicalSessionId}`);
267
+ }
268
+ if (existing.runtimeBinding) {
269
+ assertRuntimeBinding(existing.runtimeBinding, options.runtimeAgent, logicalSessionId);
270
+ await ensureUniChannelFile(options.dataDir, logicalSessionId, existing.channel, options.storeName);
271
+ await ensureUniTranscriptFile(options.dataDir, logicalSessionId, options.storeName);
272
+ if (!existing.runtimeBinding.providerSessionId) {
273
+ const verified = await hasExactProviderSessionEvidence(logicalSessionId, options.providerStateRoots ?? [], options.runtimeAgent);
274
+ if (verified) {
275
+ const repaired = await bindUniProviderSession({
276
+ dataDir: options.dataDir,
277
+ logicalSessionId,
278
+ runtimeAgent: options.runtimeAgent,
279
+ providerSessionId: logicalSessionId,
280
+ storeName: options.storeName,
281
+ });
282
+ return {
283
+ logicalSessionId,
284
+ providerSessionId: logicalSessionId,
285
+ metadata: repaired,
286
+ isNew: false,
287
+ migratedLegacy: true,
288
+ existingTranscriptEntryCount: existingTranscriptCount,
289
+ };
290
+ }
291
+ throw new UniSessionError("legacy_unresolved", `Legacy Uni session ${logicalSessionId} has an unresolved provider session mapping; resume is refused`);
292
+ }
293
+ return {
294
+ logicalSessionId,
295
+ providerSessionId: existing.runtimeBinding.providerSessionId,
296
+ metadata: existing,
297
+ isNew: false,
298
+ migratedLegacy: false,
299
+ existingTranscriptEntryCount: existingTranscriptCount,
300
+ };
301
+ }
302
+ const legacyRuntimeAgent = transcriptState.malformed
303
+ ? null
304
+ : detectLegacyUniRuntimeAgent(transcriptState.entries);
305
+ if (!legacyRuntimeAgent) {
306
+ throw new UniSessionError("not_uni_session", `Session ${logicalSessionId} is not a recognizable legacy Uni session; refusing automatic migration`);
307
+ }
308
+ if (legacyRuntimeAgent !== options.runtimeAgent) {
309
+ throw new UniSessionError("runtime_mismatch", `Logical session ${logicalSessionId} is bound to runtimeAgent ${legacyRuntimeAgent}, not ${options.runtimeAgent}`);
310
+ }
311
+ await ensureUniChannelFile(options.dataDir, logicalSessionId, existing.channel, options.storeName);
312
+ const verified = await hasExactProviderSessionEvidence(logicalSessionId, options.providerStateRoots ?? [], options.runtimeAgent);
313
+ const migratedMetadata = {
314
+ ...existing,
315
+ runtimeBinding: {
316
+ engine: "uni",
317
+ runtimeAgent: legacyRuntimeAgent,
318
+ providerSessionId: verified ? logicalSessionId : undefined,
319
+ },
320
+ updatedAt: new Date().toISOString(),
321
+ };
322
+ await saveUniSessionMetadata(options.dataDir, migratedMetadata, options.storeName);
323
+ if (!verified) {
324
+ throw new UniSessionError("legacy_unresolved", `Legacy Uni session ${logicalSessionId} has an unresolved provider session mapping; resume is refused`);
325
+ }
326
+ return {
327
+ logicalSessionId,
328
+ providerSessionId: logicalSessionId,
329
+ metadata: migratedMetadata,
330
+ isNew: false,
331
+ migratedLegacy: true,
332
+ existingTranscriptEntryCount: existingTranscriptCount,
34
333
  };
35
334
  }
335
+ export async function bindUniProviderSession(params) {
336
+ const providerSessionId = params.providerSessionId.trim();
337
+ if (!providerSessionId) {
338
+ throw new UniSessionError("invalid_session", "Provider session ID must not be empty");
339
+ }
340
+ const metadata = await loadUniSessionMetadata(params.dataDir, params.logicalSessionId, params.storeName);
341
+ if (!metadata?.runtimeBinding) {
342
+ throw new UniSessionError("invalid_session", `Session metadata has no Uni runtime binding: ${params.logicalSessionId}`);
343
+ }
344
+ assertRuntimeBinding(metadata.runtimeBinding, params.runtimeAgent, params.logicalSessionId);
345
+ const boundProviderSessionId = metadata.runtimeBinding.providerSessionId;
346
+ if (boundProviderSessionId && boundProviderSessionId !== providerSessionId) {
347
+ throw new UniSessionError("provider_binding_conflict", `Provider session binding conflict for logical session ${params.logicalSessionId}`);
348
+ }
349
+ if (boundProviderSessionId === providerSessionId) {
350
+ return metadata;
351
+ }
352
+ return updateUniSessionMetadata(params.dataDir, params.logicalSessionId, {
353
+ runtimeBinding: {
354
+ ...metadata.runtimeBinding,
355
+ providerSessionId,
356
+ },
357
+ }, params.storeName);
358
+ }
359
+ function assertRuntimeBinding(binding, runtimeAgent, logicalSessionId) {
360
+ if (binding.engine !== "uni") {
361
+ throw new UniSessionError("not_uni_session", `Session ${logicalSessionId} is not owned by the Uni runtime`);
362
+ }
363
+ if (binding.runtimeAgent !== runtimeAgent) {
364
+ throw new UniSessionError("runtime_mismatch", `Logical session ${logicalSessionId} is bound to runtimeAgent ${binding.runtimeAgent}, not ${runtimeAgent}`);
365
+ }
366
+ }
367
+ function detectLegacyUniRuntimeAgent(entries) {
368
+ if (entries.length === 0) {
369
+ return null;
370
+ }
371
+ const runtimeAgents = entries.map((entry) => {
372
+ const value = entry.runtimeAgent;
373
+ return typeof value === "string" && value.trim() ? value.trim() : null;
374
+ });
375
+ if (runtimeAgents.some((value) => value === null)) {
376
+ return null;
377
+ }
378
+ const unique = new Set(runtimeAgents);
379
+ return unique.size === 1 ? [...unique][0] ?? null : null;
380
+ }
381
+ async function hasExactProviderSessionEvidence(providerSessionId, roots, runtimeAgent) {
382
+ let visitedFiles = 0;
383
+ const visit = async (candidatePath) => {
384
+ let stat;
385
+ try {
386
+ stat = await fs.lstat(candidatePath);
387
+ }
388
+ catch {
389
+ return false;
390
+ }
391
+ if (stat.isSymbolicLink()) {
392
+ return false;
393
+ }
394
+ if (stat.isDirectory()) {
395
+ const entries = await fs.readdir(candidatePath, { withFileTypes: true });
396
+ for (const entry of entries) {
397
+ if (visitedFiles >= MAX_PROVIDER_STATE_FILES)
398
+ return false;
399
+ if (entry.isSymbolicLink())
400
+ continue;
401
+ if (await visit(path.join(candidatePath, entry.name)))
402
+ return true;
403
+ }
404
+ return false;
405
+ }
406
+ if (!stat.isFile() || visitedFiles >= MAX_PROVIDER_STATE_FILES) {
407
+ return false;
408
+ }
409
+ visitedFiles += 1;
410
+ const supportedEvidenceFile = /\.(?:json|jsonl|ndjson)$/i.test(candidatePath);
411
+ if (!supportedEvidenceFile) {
412
+ return false;
413
+ }
414
+ const isJsonDocument = /\.json$/i.test(candidatePath);
415
+ if (isJsonDocument && stat.size > MAX_PROVIDER_EVIDENCE_BYTES) {
416
+ return false;
417
+ }
418
+ try {
419
+ const raw = await readProviderEvidence(candidatePath, stat.size);
420
+ const lines = isJsonDocument ? [raw] : raw.split("\n");
421
+ if (stat.size > MAX_PROVIDER_EVIDENCE_BYTES) {
422
+ lines.pop();
423
+ }
424
+ for (const line of lines) {
425
+ if (!line.trim())
426
+ continue;
427
+ try {
428
+ if (containsProviderSessionEvidence(JSON.parse(line), providerSessionId, runtimeAgent)) {
429
+ return true;
430
+ }
431
+ }
432
+ catch {
433
+ // Native indexes can contain malformed trailing lines; ignore them.
434
+ }
435
+ }
436
+ }
437
+ catch {
438
+ return false;
439
+ }
440
+ return false;
441
+ };
442
+ for (const root of roots) {
443
+ if (root.trim() && await visit(path.resolve(root))) {
444
+ return true;
445
+ }
446
+ }
447
+ return false;
448
+ }
449
+ async function readProviderEvidence(filePath, size) {
450
+ if (size <= MAX_PROVIDER_EVIDENCE_BYTES) {
451
+ return await fs.readFile(filePath, "utf8");
452
+ }
453
+ const handle = await fs.open(filePath, "r");
454
+ try {
455
+ const buffer = Buffer.alloc(MAX_PROVIDER_EVIDENCE_BYTES);
456
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
457
+ return buffer.toString("utf8", 0, bytesRead);
458
+ }
459
+ finally {
460
+ await handle.close();
461
+ }
462
+ }
463
+ function containsProviderSessionEvidence(value, sessionId, runtimeAgent) {
464
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
465
+ return false;
466
+ }
467
+ const record = value;
468
+ const type = typeof record.type === "string" ? record.type : undefined;
469
+ const part = record.part && typeof record.part === "object" && !Array.isArray(record.part)
470
+ ? record.part
471
+ : undefined;
472
+ const payload = record.payload && typeof record.payload === "object" && !Array.isArray(record.payload)
473
+ ? record.payload
474
+ : undefined;
475
+ switch (runtimeAgent) {
476
+ case "claude-code":
477
+ return type === "system"
478
+ && record.subtype === "init"
479
+ && (record.session_id === sessionId || record.sessionId === sessionId);
480
+ case "codex":
481
+ return (type === "session_meta" && payload?.id === sessionId)
482
+ || (type === "thread.started" && (record.thread_id === sessionId || record.threadId === sessionId));
483
+ case "opencode":
484
+ return ["session", "chat", "step_start"].includes(type ?? "")
485
+ && (record.id === sessionId
486
+ || record.sessionID === sessionId
487
+ || record.sessionId === sessionId
488
+ || part?.sessionID === sessionId
489
+ || part?.sessionId === sessionId);
490
+ case "pi":
491
+ return type === "session" && record.id === sessionId;
492
+ default:
493
+ return false;
494
+ }
495
+ }
496
+ async function pathExists(filePath) {
497
+ try {
498
+ await fs.access(filePath);
499
+ return true;
500
+ }
501
+ catch {
502
+ return false;
503
+ }
504
+ }
36
505
  //# sourceMappingURL=session-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../../../src/session/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,0BAA0B,GAAG,UAAU,CAAC;AAE9C,SAAS,WAAW,CAAC,OAAe,EAAE,SAAkB;IACtD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,0BAA0B,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,SAAiB,EAAE,SAAkB;IACxE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAe,EAAE,SAAiB,EAAE,SAAkB;IACpF,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,GAAG,CAAC;AACb,CAAC;AAiCD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,QAAyB,EACzB,SAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAe,EACf,SAAiB,EACjB,KAAyB,EACzB,SAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAIvC;IACC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,SAAS;QACpB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../../../src/session/session-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { ArtifactRecord } from "@gencode/shared";
2
+ import type { UniTranscriptEntry } from "../session/session-store.js";
3
+ import type { UniRuntimeAgent } from "../types.js";
4
+ type ToolStart = {
5
+ toolCallId: string;
6
+ name: string;
7
+ input: unknown;
8
+ };
9
+ type ToolEnd = {
10
+ toolCallId: string;
11
+ name: string;
12
+ output: string;
13
+ isError: boolean;
14
+ };
15
+ export type UniTurnAccumulatorOptions = {
16
+ runtimeAgent: UniRuntimeAgent;
17
+ messageId?: string;
18
+ now?: () => string;
19
+ };
20
+ export type UniTurnFinalization = {
21
+ fallbackContent?: string;
22
+ /** Use the provider's terminal text as authoritative when it was explicitly returned. */
23
+ forceFallbackContent?: boolean;
24
+ fallbackThinking?: string;
25
+ usage?: {
26
+ input: number;
27
+ output: number;
28
+ total: number;
29
+ };
30
+ durationMs: number;
31
+ error?: string;
32
+ artifacts?: ArtifactRecord[];
33
+ };
34
+ /**
35
+ * Accumulates one Uni provider turn without inventing provider facts.
36
+ * Only tool calls that have an observed start and end are persisted.
37
+ */
38
+ export declare class UniTurnAccumulator {
39
+ private readonly runtimeAgent;
40
+ private readonly messageId?;
41
+ private readonly now;
42
+ private content;
43
+ private thinking;
44
+ private readonly tools;
45
+ private readonly toolIndices;
46
+ private readonly completedToolIds;
47
+ constructor(options: UniTurnAccumulatorOptions);
48
+ addText(text: string): void;
49
+ addThinking(text: string): void;
50
+ hasCompletedToolBatch(): boolean;
51
+ startTool(event: ToolStart): boolean;
52
+ endTool(event: ToolEnd): boolean;
53
+ flushToolBatch(): UniTranscriptEntry[];
54
+ finalize(params: UniTurnFinalization): UniTranscriptEntry[];
55
+ }
56
+ export {};
57
+ //# sourceMappingURL=turn-accumulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-accumulator.d.ts","sourceRoot":"","sources":["../../../../src/transcript/turn-accumulator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AASF,MAAM,MAAM,yBAAyB,GAAG;IACtC,YAAY,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AAEF;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;gBAE1C,OAAO,EAAE,yBAAyB;IAM9C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,qBAAqB,IAAI,OAAO;IAIhC,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAcpC,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAiBhC,cAAc,IAAI,kBAAkB,EAAE;IA4CtC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,GAAG,kBAAkB,EAAE;CAsB5D"}