@excitedjs/agent-runtime-codex 0.3.5-beta.167 → 1.0.0-beta.169

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 (56) hide show
  1. package/README.md +37 -1
  2. package/dist/events.d.ts +2 -0
  3. package/dist/events.d.ts.map +1 -1
  4. package/dist/events.js +40 -42
  5. package/dist/events.js.map +1 -1
  6. package/dist/provider.d.ts +3 -0
  7. package/dist/provider.d.ts.map +1 -1
  8. package/dist/provider.js +5 -3
  9. package/dist/provider.js.map +1 -1
  10. package/dist/rpc.d.ts +1 -0
  11. package/dist/rpc.d.ts.map +1 -1
  12. package/dist/rpc.js +9 -1
  13. package/dist/rpc.js.map +1 -1
  14. package/dist/runtime.d.ts +14 -7
  15. package/dist/runtime.d.ts.map +1 -1
  16. package/dist/runtime.js +241 -80
  17. package/dist/runtime.js.map +1 -1
  18. package/dist/supervisor.d.ts +7 -0
  19. package/dist/supervisor.d.ts.map +1 -1
  20. package/dist/supervisor.js +99 -43
  21. package/dist/supervisor.js.map +1 -1
  22. package/dist/transcript/budget.d.ts +8 -0
  23. package/dist/transcript/budget.d.ts.map +1 -0
  24. package/dist/transcript/budget.js +9 -0
  25. package/dist/transcript/budget.js.map +1 -0
  26. package/dist/transcript/cursor.d.ts +23 -0
  27. package/dist/transcript/cursor.d.ts.map +1 -0
  28. package/dist/transcript/cursor.js +57 -0
  29. package/dist/transcript/cursor.js.map +1 -0
  30. package/dist/transcript/error.d.ts +9 -0
  31. package/dist/transcript/error.d.ts.map +1 -0
  32. package/dist/transcript/error.js +9 -0
  33. package/dist/transcript/error.js.map +1 -0
  34. package/dist/transcript/opened-file.d.ts +10 -0
  35. package/dist/transcript/opened-file.d.ts.map +1 -0
  36. package/dist/transcript/opened-file.js +61 -0
  37. package/dist/transcript/opened-file.js.map +1 -0
  38. package/dist/transcript/path.d.ts +28 -0
  39. package/dist/transcript/path.d.ts.map +1 -0
  40. package/dist/transcript/path.js +422 -0
  41. package/dist/transcript/path.js.map +1 -0
  42. package/dist/transcript/projection.d.ts +6 -0
  43. package/dist/transcript/projection.d.ts.map +1 -0
  44. package/dist/transcript/projection.js +170 -0
  45. package/dist/transcript/projection.js.map +1 -0
  46. package/dist/transcript/reader.d.ts +7 -0
  47. package/dist/transcript/reader.d.ts.map +1 -0
  48. package/dist/transcript/reader.js +401 -0
  49. package/dist/transcript/reader.js.map +1 -0
  50. package/dist/turn-manager.d.ts +12 -16
  51. package/dist/turn-manager.d.ts.map +1 -1
  52. package/dist/turn-manager.js +157 -151
  53. package/dist/turn-manager.js.map +1 -1
  54. package/dist/types.d.ts +2 -0
  55. package/dist/types.d.ts.map +1 -1
  56. package/package.json +3 -3
@@ -22,6 +22,9 @@ export class CodexProcess {
22
22
  cwd;
23
23
  supervisor = null;
24
24
  _pid = null;
25
+ startTask = null;
26
+ reapTask = null;
27
+ reapRequested = false;
25
28
  reaped = false;
26
29
  exitHandlers = [];
27
30
  constructor(opts) {
@@ -37,9 +40,21 @@ export class CodexProcess {
37
40
  }
38
41
  /** Spawn the daemon and resolve once its listen socket is bound. */
39
42
  async start() {
40
- if (this.supervisor !== null) {
43
+ if (this.supervisor !== null || this.startTask !== null) {
41
44
  throw new Error('CodexProcess.start: already started');
42
45
  }
46
+ this.assertStartAllowed();
47
+ const task = this.startProcess();
48
+ this.startTask = task;
49
+ try {
50
+ await task;
51
+ }
52
+ finally {
53
+ if (this.startTask === task)
54
+ this.startTask = null;
55
+ }
56
+ }
57
+ async startProcess() {
43
58
  const binPath = this.opts.binPath ?? (process.env['CODEX_HOST_CODEX_BIN'] || 'codex');
44
59
  const args = [
45
60
  'app-server',
@@ -66,58 +81,91 @@ export class CodexProcess {
66
81
  // so they cannot be garbage-collected — and thus closed out from under the
67
82
  // child — between open and spawn. They are closed once the child owns the
68
83
  // inherited fds, matching the previous openSync/closeSync timing.
69
- const stdoutHandle = await open(this.opts.stdoutLogPath, 'a', 0o600);
70
- const stderrHandle = await open(this.opts.stderrLogPath, 'a', 0o600);
71
- const supervisor = new SupervisedChild({
72
- kind: 'spawn',
73
- command: binPath,
74
- args,
75
- options: {
76
- cwd: this.opts.cwd,
77
- env: this.opts.env ?? process.env,
78
- stdio: ['ignore', stdoutHandle.fd, stderrHandle.fd],
79
- },
80
- });
81
- supervisor.onError(() => {
82
- /* daemon-side error, can no longer affect this process */
83
- });
84
- supervisor.onExit((exit) => {
85
- if (this.reaped)
86
- return;
87
- for (const handler of this.exitHandlers) {
84
+ const logHandles = [];
85
+ try {
86
+ const stdoutHandle = await open(this.opts.stdoutLogPath, 'a', 0o600);
87
+ logHandles.push(stdoutHandle);
88
+ const stderrHandle = await open(this.opts.stderrLogPath, 'a', 0o600);
89
+ logHandles.push(stderrHandle);
90
+ this.assertStartAllowed();
91
+ const supervisor = new SupervisedChild({
92
+ kind: 'spawn',
93
+ command: binPath,
94
+ args,
95
+ options: {
96
+ cwd: this.opts.cwd,
97
+ env: this.opts.env ?? process.env,
98
+ stdio: ['ignore', stdoutHandle.fd, stderrHandle.fd],
99
+ },
100
+ });
101
+ supervisor.onError(() => {
102
+ /* daemon-side error, can no longer affect this process */
103
+ });
104
+ supervisor.onExit((exit) => {
105
+ if (this.reapRequested || this.reaped)
106
+ return;
107
+ for (const handler of this.exitHandlers) {
108
+ try {
109
+ handler(exit);
110
+ }
111
+ catch {
112
+ /* exit observers must not poison process event dispatch */
113
+ }
114
+ }
115
+ });
116
+ // Publish termination authority before the spawn await. A concurrent
117
+ // reap waits for this start task and can never miss a late child.
118
+ this.supervisor = supervisor;
119
+ try {
120
+ const child = await supervisor.start();
121
+ this.assertStartAllowed();
122
+ const pid = child.pid;
123
+ this._pid = pid;
124
+ await waitForSocket(this.opts.socketPath, pid, this.opts.readyTimeoutMs ?? 10000);
125
+ this.assertStartAllowed();
126
+ }
127
+ catch (error) {
88
128
  try {
89
- handler(exit);
129
+ await this.terminateSpawnedProcess();
90
130
  }
91
- catch {
92
- /* exit observers must not poison process event dispatch */
131
+ catch (stopError) {
132
+ throw new AggregateError([error, stopError], 'Codex process start failed and termination could not be proved');
93
133
  }
134
+ throw error;
94
135
  }
95
- });
96
- let child;
97
- try {
98
- child = await supervisor.start();
99
136
  }
100
137
  finally {
101
- await stdoutHandle.close();
102
- await stderrHandle.close();
103
- }
104
- const pid = child.pid;
105
- this.supervisor = supervisor;
106
- this._pid = pid;
107
- try {
108
- await waitForSocket(this.opts.socketPath, pid, this.opts.readyTimeoutMs ?? 10000);
109
- }
110
- catch (e) {
111
- await this.reap();
112
- throw e;
138
+ // The child already inherited these descriptors. Parent-side close
139
+ // errors cannot make a successfully supervised child unowned.
140
+ await Promise.all(logHandles.map((handle) => handle.close().catch(() => undefined)));
113
141
  }
114
142
  }
115
143
  /** SIGTERM → 1s wait → SIGKILL group. Idempotent. */
116
- async reap() {
144
+ reap() {
117
145
  if (this.reaped)
118
- return;
146
+ return Promise.resolve();
147
+ if (this.reapTask !== null)
148
+ return this.reapTask;
149
+ this.reapRequested = true;
150
+ const task = this.reapProcess();
151
+ this.reapTask = task;
152
+ void task.catch(() => {
153
+ if (this.reapTask === task)
154
+ this.reapTask = null;
155
+ });
156
+ return task;
157
+ }
158
+ async reapProcess() {
159
+ // If no supervisor has been published, `reapRequested` is itself the
160
+ // fence: every later pre-spawn seam checks it before creating a child. Do
161
+ // not join an arbitrary filesystem/startup wait that owns no process yet.
162
+ if (this.supervisor !== null)
163
+ await this.terminateSpawnedProcess();
119
164
  this.reaped = true;
120
- await this.supervisor?.stop();
165
+ }
166
+ async terminateSpawnedProcess() {
167
+ const supervisor = this.supervisor;
168
+ await supervisor?.stop();
121
169
  try {
122
170
  await rm(this.opts.socketPath, { force: true });
123
171
  }
@@ -129,7 +177,15 @@ export class CodexProcess {
129
177
  // flows over the socket, so they are usually empty (issue #182 logs stage).
130
178
  await removeEmptyLogFile(this.opts.stdoutLogPath);
131
179
  await removeEmptyLogFile(this.opts.stderrLogPath);
132
- this.supervisor = null;
180
+ if (this.supervisor === supervisor) {
181
+ this.supervisor = null;
182
+ this._pid = null;
183
+ }
184
+ }
185
+ assertStartAllowed() {
186
+ if (this.reapRequested || this.reaped) {
187
+ throw new Error('CodexProcess.start: stopped during start');
188
+ }
133
189
  }
134
190
  }
135
191
  async function waitForSocket(path, pid, timeoutMs) {
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type TranscriptScanBudget } from '@excitedjs/dreamux-utils';
2
+ export type CodexTranscriptBudget = TranscriptScanBudget;
3
+ export declare function createCodexTranscriptBudget(input?: {
4
+ maxEntries?: number;
5
+ maxElapsedMs?: number;
6
+ now?: () => number;
7
+ }): CodexTranscriptBudget;
8
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/transcript/budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAIlC,MAAM,MAAM,qBAAqB,GAAG,oBAAoB,CAAC;AAEzD,wBAAgB,2BAA2B,CAAC,KAAK,GAAE;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACf,GAAG,qBAAqB,CAS7B"}
@@ -0,0 +1,9 @@
1
+ import { createTranscriptScanBudget, } from '@excitedjs/dreamux-utils';
2
+ import { CodexTranscriptError } from './error.js';
3
+ export function createCodexTranscriptBudget(input = {}) {
4
+ return createTranscriptScanBudget({
5
+ ...input,
6
+ limitError: () => new CodexTranscriptError('scan_unsupported', 'Codex transcript discovery exceeded its bounded scan limit'),
7
+ });
8
+ }
9
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/transcript/budget.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,GAE3B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAIlD,MAAM,UAAU,2BAA2B,CAAC,QAIxC,EAAE;IACJ,OAAO,0BAA0B,CAAC;QAChC,GAAG,KAAK;QACR,UAAU,EAAE,GAAG,EAAE,CACf,IAAI,oBAAoB,CACtB,kBAAkB,EAClB,4DAA4D,CAC7D;KACJ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { transcriptDigest } from '@excitedjs/dreamux-utils';
2
+ export interface CodexCursorPosition {
3
+ segment: number;
4
+ offset: number;
5
+ }
6
+ interface CodexCursorEnvelope {
7
+ v: 1;
8
+ p: 'codex';
9
+ fp: string;
10
+ gen: string;
11
+ pos: CodexCursorPosition;
12
+ bd: string;
13
+ }
14
+ export declare function codexQueryFingerprint(includeTools: boolean): string;
15
+ export declare function encodeCodexCursor(input: {
16
+ fingerprint: string;
17
+ generation: string;
18
+ position: CodexCursorPosition;
19
+ boundaryDigest: string;
20
+ }): string;
21
+ export declare function decodeCodexCursor(cursor: string, expectedFingerprint: string): CodexCursorEnvelope;
22
+ export { transcriptDigest as digest };
23
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/transcript/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAIlC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,mBAAmB;IAC3B,CAAC,EAAE,CAAC,CAAC;IACL,CAAC,EAAE,OAAO,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,mBAAmB,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAEnE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAUT;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,MAAM,GAC1B,mBAAmB,CA0BrB;AAyBD,OAAO,EAAE,gBAAgB,IAAI,MAAM,EAAE,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { isTranscriptDigest, transcriptDigest, } from '@excitedjs/dreamux-utils';
2
+ import { CodexTranscriptError } from './error.js';
3
+ export function codexQueryFingerprint(includeTools) {
4
+ return transcriptDigest(JSON.stringify({ include_tools: includeTools }));
5
+ }
6
+ export function encodeCodexCursor(input) {
7
+ const envelope = {
8
+ v: 1,
9
+ p: 'codex',
10
+ fp: input.fingerprint,
11
+ gen: input.generation,
12
+ pos: input.position,
13
+ bd: input.boundaryDigest,
14
+ };
15
+ return Buffer.from(JSON.stringify(envelope), 'utf8').toString('base64url');
16
+ }
17
+ export function decodeCodexCursor(cursor, expectedFingerprint) {
18
+ let value;
19
+ try {
20
+ const decoded = Buffer.from(cursor, 'base64url');
21
+ if (decoded.length === 0 || decoded.length > 3072)
22
+ throw new Error('size');
23
+ value = JSON.parse(decoded.toString('utf8'));
24
+ }
25
+ catch (error) {
26
+ throw new CodexTranscriptError('cursor_invalid', 'Codex transcript cursor is invalid', { cause: error });
27
+ }
28
+ if (!isCursorEnvelope(value)) {
29
+ throw new CodexTranscriptError('cursor_invalid', 'Codex transcript cursor is invalid');
30
+ }
31
+ if (value.fp !== expectedFingerprint) {
32
+ throw new CodexTranscriptError('cursor_query_mismatch', 'Codex transcript cursor belongs to a different query');
33
+ }
34
+ return value;
35
+ }
36
+ function isCursorEnvelope(value) {
37
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
38
+ return false;
39
+ }
40
+ const record = value;
41
+ const position = record['pos'];
42
+ return (Object.keys(record).length === 6 &&
43
+ record['v'] === 1 &&
44
+ record['p'] === 'codex' &&
45
+ isTranscriptDigest(record['fp']) &&
46
+ isTranscriptDigest(record['gen']) &&
47
+ isTranscriptDigest(record['bd']) &&
48
+ position !== null &&
49
+ typeof position === 'object' &&
50
+ !Array.isArray(position) &&
51
+ Number.isInteger(position['segment']) &&
52
+ position['segment'] >= 0 &&
53
+ Number.isSafeInteger(position['offset']) &&
54
+ position['offset'] >= 0);
55
+ }
56
+ export { transcriptDigest as digest };
57
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/transcript/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AgentRuntimeTranscriptError } from '@excitedjs/dreamux-types';
2
+ export declare class CodexTranscriptError extends Error implements AgentRuntimeTranscriptError {
3
+ readonly reason: AgentRuntimeTranscriptError['reason'];
4
+ readonly name = "AgentRuntimeTranscriptError";
5
+ constructor(reason: AgentRuntimeTranscriptError['reason'], message: string, options?: {
6
+ cause?: unknown;
7
+ });
8
+ }
9
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/transcript/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E,qBAAa,oBACX,SAAQ,KACR,YAAW,2BAA2B;IAKpC,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC,QAAQ,CAAC;IAHxD,QAAQ,CAAC,IAAI,iCAAiC;gBAGnC,MAAM,EAAE,2BAA2B,CAAC,QAAQ,CAAC,EACtD,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAIpC"}
@@ -0,0 +1,9 @@
1
+ export class CodexTranscriptError extends Error {
2
+ reason;
3
+ name = 'AgentRuntimeTranscriptError';
4
+ constructor(reason, message, options = {}) {
5
+ super(message, options);
6
+ this.reason = reason;
7
+ }
8
+ }
9
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/transcript/error.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,oBACX,SAAQ,KAAK;IAMF;IAHF,IAAI,GAAG,6BAA6B,CAAC;IAE9C,YACW,MAA6C,EACtD,OAAe,EACf,UAA+B,EAAE;QAEjC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAJf,WAAM,GAAN,MAAM,CAAuC;IAKxD,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import { type FileHandle } from 'node:fs/promises';
2
+ export interface CodexOpenedTranscript {
3
+ handle: FileHandle;
4
+ path: string;
5
+ size: number;
6
+ dev: number | bigint;
7
+ ino: number | bigint;
8
+ }
9
+ export declare function openCodexTranscript(candidate: string, canonicalRoots: readonly string[]): Promise<CodexOpenedTranscript>;
10
+ //# sourceMappingURL=opened-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opened-file.d.ts","sourceRoot":"","sources":["../../src/transcript/opened-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACtB;AAED,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,SAAS,MAAM,EAAE,GAChC,OAAO,CAAC,qBAAqB,CAAC,CA4DhC"}
@@ -0,0 +1,61 @@
1
+ import { constants } from 'node:fs';
2
+ import { open, realpath } from 'node:fs/promises';
3
+ import { isPathWithin } from '@excitedjs/dreamux-utils';
4
+ import { CodexTranscriptError } from './error.js';
5
+ export async function openCodexTranscript(candidate, canonicalRoots) {
6
+ let handle;
7
+ try {
8
+ handle = await open(candidate, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
9
+ }
10
+ catch (error) {
11
+ throw classifyOpenError(error);
12
+ }
13
+ try {
14
+ const [opened, canonicalPath] = await Promise.all([
15
+ handle.stat(),
16
+ realpath(candidate),
17
+ ]);
18
+ if (!opened.isFile()) {
19
+ throw new CodexTranscriptError('invalid', 'Codex transcript is not a regular file');
20
+ }
21
+ if (!canonicalRoots.some((root) => isPathWithin(root, canonicalPath))) {
22
+ throw new CodexTranscriptError('locator_outside_root', 'Codex transcript locator is outside the native transcript roots');
23
+ }
24
+ const current = await open(canonicalPath, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0)).catch((error) => {
25
+ throw classifyOpenError(error);
26
+ });
27
+ try {
28
+ const currentStat = await current.stat();
29
+ if (opened.dev !== currentStat.dev || opened.ino !== currentStat.ino) {
30
+ throw new CodexTranscriptError('unreadable', 'Codex transcript changed while opening');
31
+ }
32
+ }
33
+ finally {
34
+ await current.close();
35
+ }
36
+ return {
37
+ handle,
38
+ path: canonicalPath,
39
+ size: opened.size,
40
+ dev: opened.dev,
41
+ ino: opened.ino,
42
+ };
43
+ }
44
+ catch (error) {
45
+ await handle.close().catch(() => undefined);
46
+ if (error instanceof CodexTranscriptError)
47
+ throw error;
48
+ throw new CodexTranscriptError('unreadable', 'Codex transcript is unreadable', { cause: error });
49
+ }
50
+ }
51
+ function classifyOpenError(error) {
52
+ const code = error.code;
53
+ if (code === 'ENOENT') {
54
+ return new CodexTranscriptError('not_found', 'Codex transcript is unavailable', { cause: error });
55
+ }
56
+ if (code === 'ELOOP') {
57
+ return new CodexTranscriptError('locator_outside_root', 'Codex transcript locator is outside the native transcript roots', { cause: error });
58
+ }
59
+ return new CodexTranscriptError('unreadable', 'Codex transcript is unreadable', { cause: error });
60
+ }
61
+ //# sourceMappingURL=opened-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opened-file.js","sourceRoot":"","sources":["../../src/transcript/opened-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { DreamuxEnvironment } from '@excitedjs/dreamux-types';
2
+ import { type CodexTranscriptBudget } from './budget.js';
3
+ import { type CodexOpenedTranscript } from './opened-file.js';
4
+ export interface CodexTranscriptRoots {
5
+ home: string;
6
+ sessions: string;
7
+ archived: string;
8
+ }
9
+ export interface CodexValidatedTranscript {
10
+ path: string;
11
+ root: string;
12
+ sessionId: string;
13
+ rolloutId: string;
14
+ historyBase: CodexHistoryBase | null;
15
+ dev: number | bigint;
16
+ ino: number | bigint;
17
+ }
18
+ export interface CodexHistoryBase {
19
+ rolloutId: string;
20
+ endByteOffset: number;
21
+ }
22
+ export declare function resolveCodexTranscriptRoots(env?: DreamuxEnvironment): Promise<CodexTranscriptRoots>;
23
+ export declare function validateCodexThreadPath(candidate: string, expectedSessionId: string, roots: CodexTranscriptRoots): Promise<CodexValidatedTranscript>;
24
+ export declare function validateCodexTranscriptLocator(candidate: string, expectedSessionId: string, roots: CodexTranscriptRoots): Promise<CodexValidatedTranscript>;
25
+ export declare function locateCodexTranscript(locator: string | null | undefined, expectedSessionId: string, roots: CodexTranscriptRoots, budget?: CodexTranscriptBudget): Promise<CodexValidatedTranscript>;
26
+ export declare function findCodexRolloutById(roots: CodexTranscriptRoots, rolloutId: string, budget?: CodexTranscriptBudget): Promise<CodexValidatedTranscript>;
27
+ export declare function readCodexTranscriptText(opened: CodexOpenedTranscript, maxDecodedBytes: number): Promise<string>;
28
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/transcript/path.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,kBAAkB,CAAC;AAM1B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,2BAA2B,CAC/C,GAAG,GAAE,kBAAgC,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAuC/B;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,wBAAwB,CAAC,CAoCnC;AAED,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,wBAAwB,CAAC,CAMnC;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,oBAAoB,EAC3B,MAAM,GAAE,qBAAqD,GAC5D,OAAO,CAAC,wBAAwB,CAAC,CA4CnC;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,oBAAoB,EAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,qBAAqD,GAC5D,OAAO,CAAC,wBAAwB,CAAC,CA2BnC;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,qBAAqB,EAC7B,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAwCjB"}