@excitedjs/agent-runtime-claude-code 0.5.0-beta.168 → 0.5.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 (94) hide show
  1. package/README.md +43 -1
  2. package/dist/args.d.ts +2 -0
  3. package/dist/args.d.ts.map +1 -1
  4. package/dist/args.js +5 -0
  5. package/dist/args.js.map +1 -1
  6. package/dist/index.d.ts +2 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/provider.d.ts +5 -0
  10. package/dist/provider.d.ts.map +1 -1
  11. package/dist/provider.js +10 -4
  12. package/dist/provider.js.map +1 -1
  13. package/dist/rpc.d.ts +79 -6
  14. package/dist/rpc.d.ts.map +1 -1
  15. package/dist/rpc.js +329 -57
  16. package/dist/rpc.js.map +1 -1
  17. package/dist/runtime-deps.d.ts +30 -0
  18. package/dist/runtime-deps.d.ts.map +1 -0
  19. package/dist/runtime-deps.js +2 -0
  20. package/dist/runtime-deps.js.map +1 -0
  21. package/dist/runtime-session.d.ts +13 -0
  22. package/dist/runtime-session.d.ts.map +1 -0
  23. package/dist/runtime-session.js +41 -0
  24. package/dist/runtime-session.js.map +1 -0
  25. package/dist/runtime-submissions.d.ts +34 -0
  26. package/dist/runtime-submissions.d.ts.map +1 -0
  27. package/dist/runtime-submissions.js +200 -0
  28. package/dist/runtime-submissions.js.map +1 -0
  29. package/dist/runtime.d.ts +33 -131
  30. package/dist/runtime.d.ts.map +1 -1
  31. package/dist/runtime.js +286 -268
  32. package/dist/runtime.js.map +1 -1
  33. package/dist/skill-adapter.d.ts +11 -1
  34. package/dist/skill-adapter.d.ts.map +1 -1
  35. package/dist/skill-adapter.js +60 -7
  36. package/dist/skill-adapter.js.map +1 -1
  37. package/dist/skill-materializer.d.ts +6 -0
  38. package/dist/skill-materializer.d.ts.map +1 -0
  39. package/dist/skill-materializer.js +45 -0
  40. package/dist/skill-materializer.js.map +1 -0
  41. package/dist/source-reservation.d.ts +6 -0
  42. package/dist/source-reservation.d.ts.map +1 -0
  43. package/dist/source-reservation.js +48 -0
  44. package/dist/source-reservation.js.map +1 -0
  45. package/dist/stream.d.ts +3 -1
  46. package/dist/stream.d.ts.map +1 -1
  47. package/dist/stream.js +48 -1
  48. package/dist/stream.js.map +1 -1
  49. package/dist/supervisor.d.ts.map +1 -1
  50. package/dist/supervisor.js +68 -14
  51. package/dist/supervisor.js.map +1 -1
  52. package/dist/transcript/budget.d.ts +8 -0
  53. package/dist/transcript/budget.d.ts.map +1 -0
  54. package/dist/transcript/budget.js +9 -0
  55. package/dist/transcript/budget.js.map +1 -0
  56. package/dist/transcript/completion.d.ts +8 -0
  57. package/dist/transcript/completion.d.ts.map +1 -0
  58. package/dist/transcript/completion.js +57 -0
  59. package/dist/transcript/completion.js.map +1 -0
  60. package/dist/transcript/cursor.d.ts +25 -0
  61. package/dist/transcript/cursor.d.ts.map +1 -0
  62. package/dist/transcript/cursor.js +62 -0
  63. package/dist/transcript/cursor.js.map +1 -0
  64. package/dist/transcript/error.d.ts +9 -0
  65. package/dist/transcript/error.d.ts.map +1 -0
  66. package/dist/transcript/error.js +9 -0
  67. package/dist/transcript/error.js.map +1 -0
  68. package/dist/transcript/native-hash.d.ts +2 -0
  69. package/dist/transcript/native-hash.d.ts.map +1 -0
  70. package/dist/transcript/native-hash.js +79 -0
  71. package/dist/transcript/native-hash.js.map +1 -0
  72. package/dist/transcript/opened-file.d.ts +13 -0
  73. package/dist/transcript/opened-file.d.ts.map +1 -0
  74. package/dist/transcript/opened-file.js +110 -0
  75. package/dist/transcript/opened-file.js.map +1 -0
  76. package/dist/transcript/parallel-tools.d.ts +6 -0
  77. package/dist/transcript/parallel-tools.d.ts.map +1 -0
  78. package/dist/transcript/parallel-tools.js +123 -0
  79. package/dist/transcript/parallel-tools.js.map +1 -0
  80. package/dist/transcript/path.d.ts +25 -0
  81. package/dist/transcript/path.d.ts.map +1 -0
  82. package/dist/transcript/path.js +253 -0
  83. package/dist/transcript/path.js.map +1 -0
  84. package/dist/transcript/reader.d.ts +7 -0
  85. package/dist/transcript/reader.d.ts.map +1 -0
  86. package/dist/transcript/reader.js +476 -0
  87. package/dist/transcript/reader.js.map +1 -0
  88. package/dist/transcript/rewrites.d.ts +5 -0
  89. package/dist/transcript/rewrites.d.ts.map +1 -0
  90. package/dist/transcript/rewrites.js +65 -0
  91. package/dist/transcript/rewrites.js.map +1 -0
  92. package/dist/types.d.ts +33 -3
  93. package/dist/types.d.ts.map +1 -1
  94. package/package.json +4 -3
@@ -0,0 +1,110 @@
1
+ import { constants } from 'node:fs';
2
+ import { open, realpath } from 'node:fs/promises';
3
+ import { isPathWithin, readTranscriptBytesAt, } from '@excitedjs/dreamux-utils';
4
+ import { ClaudeTranscriptError } from './error.js';
5
+ const MAX_METADATA_BYTES = 1_048_576;
6
+ export async function openClaudeTranscript(candidate, canonicalRoot) {
7
+ let handle;
8
+ try {
9
+ handle = await open(candidate, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
10
+ }
11
+ catch (error) {
12
+ throw classifyOpenError(error);
13
+ }
14
+ try {
15
+ const [opened, canonicalPath] = await Promise.all([
16
+ handle.stat(),
17
+ realpath(candidate),
18
+ ]);
19
+ if (!opened.isFile()) {
20
+ throw new ClaudeTranscriptError('invalid', 'Claude Code transcript is not a regular file');
21
+ }
22
+ if (!isPathWithin(canonicalRoot, canonicalPath)) {
23
+ throw new ClaudeTranscriptError('locator_outside_root', 'Claude Code transcript locator is outside the native transcript root');
24
+ }
25
+ const current = await open(canonicalPath, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0)).catch((error) => {
26
+ throw classifyOpenError(error);
27
+ });
28
+ try {
29
+ const currentStat = await current.stat();
30
+ if (opened.dev !== currentStat.dev || opened.ino !== currentStat.ino) {
31
+ throw new ClaudeTranscriptError('unreadable', 'Claude Code transcript changed while opening');
32
+ }
33
+ }
34
+ finally {
35
+ await current.close();
36
+ }
37
+ return {
38
+ handle,
39
+ path: canonicalPath,
40
+ size: opened.size,
41
+ dev: opened.dev,
42
+ ino: opened.ino,
43
+ };
44
+ }
45
+ catch (error) {
46
+ await handle.close().catch(() => undefined);
47
+ if (error instanceof ClaudeTranscriptError)
48
+ throw error;
49
+ throw new ClaudeTranscriptError('unreadable', 'Claude Code transcript is unreadable', { cause: error });
50
+ }
51
+ }
52
+ export async function validateClaudeSessionEvidence(opened, expectedSessionId, options = {}) {
53
+ const length = Math.min(opened.size, MAX_METADATA_BYTES + 1);
54
+ const data = await readTranscriptBytesAt(opened.handle, 0, length, {
55
+ ...(options.maxReadChunkBytes !== undefined
56
+ ? { maxChunkBytes: options.maxReadChunkBytes }
57
+ : {}),
58
+ });
59
+ let cursor = 0;
60
+ while (cursor < data.length) {
61
+ const newline = data.indexOf(0x0a, cursor);
62
+ if (newline < 0) {
63
+ if (opened.size > MAX_METADATA_BYTES) {
64
+ throw new ClaudeTranscriptError('invalid', 'Claude Code transcript metadata record is oversized');
65
+ }
66
+ break;
67
+ }
68
+ const raw = data.subarray(cursor, newline).toString('utf8');
69
+ const value = parseRecord(raw);
70
+ if (value === null && raw.trim() !== '') {
71
+ throw new ClaudeTranscriptError('invalid', 'Claude Code transcript contains invalid native metadata');
72
+ }
73
+ const sessionId = stringValue(value?.['sessionId']);
74
+ if (sessionId !== null) {
75
+ if (sessionId !== expectedSessionId) {
76
+ throw new ClaudeTranscriptError('session_mismatch', 'Claude Code transcript does not belong to the selected session');
77
+ }
78
+ return;
79
+ }
80
+ cursor = newline + 1;
81
+ }
82
+ throw new ClaudeTranscriptError('invalid', 'Claude Code transcript has no authoritative session metadata');
83
+ }
84
+ function classifyOpenError(error) {
85
+ const code = error.code;
86
+ if (code === 'ENOENT') {
87
+ return new ClaudeTranscriptError('not_found', 'Claude Code transcript is unavailable', { cause: error });
88
+ }
89
+ if (code === 'ELOOP') {
90
+ return new ClaudeTranscriptError('locator_outside_root', 'Claude Code transcript locator is outside the native transcript root', { cause: error });
91
+ }
92
+ return new ClaudeTranscriptError('unreadable', 'Claude Code transcript is unreadable', { cause: error });
93
+ }
94
+ function parseRecord(value) {
95
+ try {
96
+ const parsed = JSON.parse(value);
97
+ return parsed !== null &&
98
+ typeof parsed === 'object' &&
99
+ !Array.isArray(parsed)
100
+ ? parsed
101
+ : null;
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ }
107
+ function stringValue(value) {
108
+ return typeof value === 'string' && value !== '' ? value : null;
109
+ }
110
+ //# 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,6 @@
1
+ export interface ClaudeTranscriptEntry {
2
+ start: number;
3
+ value: Record<string, unknown>;
4
+ }
5
+ export declare function recoverParallelToolBranches<TEntry extends ClaudeTranscriptEntry>(entries: readonly TEntry[], chain: readonly TEntry[]): TEntry[];
6
+ //# sourceMappingURL=parallel-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-tools.d.ts","sourceRoot":"","sources":["../../src/transcript/parallel-tools.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,wBAAgB,2BAA2B,CAAC,MAAM,SAAS,qBAAqB,EAC9E,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,MAAM,EAAE,CAuEV"}
@@ -0,0 +1,123 @@
1
+ export function recoverParallelToolBranches(entries, chain) {
2
+ const seen = new Set(chain
3
+ .map((entry) => stringValue(entry.value['uuid']))
4
+ .filter((uuid) => uuid !== null));
5
+ const chainAssistants = chain.filter(isEligibleAssistant);
6
+ if (chainAssistants.length === 0)
7
+ return [...chain];
8
+ const anchorByMessageId = new Map();
9
+ for (const assistant of chainAssistants) {
10
+ const messageId = assistantMessageId(assistant);
11
+ if (messageId !== null)
12
+ anchorByMessageId.set(messageId, assistant);
13
+ }
14
+ const siblingsByMessageId = new Map();
15
+ const toolResultsByAssistant = new Map();
16
+ for (const entry of entries) {
17
+ if (isEligibleAssistant(entry)) {
18
+ const messageId = assistantMessageId(entry);
19
+ if (messageId !== null) {
20
+ pushMapValue(siblingsByMessageId, messageId, entry);
21
+ }
22
+ continue;
23
+ }
24
+ if (!isEligibleToolResult(entry))
25
+ continue;
26
+ const parentUuid = stringValue(entry.value['parentUuid']);
27
+ if (parentUuid !== null) {
28
+ pushMapValue(toolResultsByAssistant, parentUuid, entry);
29
+ }
30
+ }
31
+ const processedGroups = new Set();
32
+ const inserts = new Map();
33
+ for (const assistant of chainAssistants) {
34
+ const messageId = assistantMessageId(assistant);
35
+ if (messageId === null || processedGroups.has(messageId))
36
+ continue;
37
+ processedGroups.add(messageId);
38
+ const group = siblingsByMessageId.get(messageId) ?? [assistant];
39
+ const siblings = stableTimestampSort(group.filter((entry) => !isSeen(entry, seen)));
40
+ const toolResults = [];
41
+ for (const member of group) {
42
+ const uuid = stringValue(member.value['uuid']);
43
+ if (uuid === null)
44
+ continue;
45
+ for (const result of toolResultsByAssistant.get(uuid) ?? []) {
46
+ if (!isSeen(result, seen))
47
+ toolResults.push(result);
48
+ }
49
+ }
50
+ const recovered = [...siblings, ...stableTimestampSort(toolResults)];
51
+ if (recovered.length === 0)
52
+ continue;
53
+ for (const entry of recovered) {
54
+ const uuid = stringValue(entry.value['uuid']);
55
+ if (uuid !== null)
56
+ seen.add(uuid);
57
+ }
58
+ const anchor = anchorByMessageId.get(messageId);
59
+ const anchorUuid = anchor === undefined ? null : stringValue(anchor.value['uuid']);
60
+ if (anchorUuid !== null)
61
+ inserts.set(anchorUuid, recovered);
62
+ }
63
+ if (inserts.size === 0)
64
+ return [...chain];
65
+ const result = [];
66
+ for (const entry of chain) {
67
+ result.push(entry);
68
+ const uuid = stringValue(entry.value['uuid']);
69
+ if (uuid !== null)
70
+ result.push(...(inserts.get(uuid) ?? []));
71
+ }
72
+ return result;
73
+ }
74
+ function assistantMessageId(entry) {
75
+ return stringValue(recordValue(entry.value['message'])?.['id']);
76
+ }
77
+ function isEligibleAssistant(entry) {
78
+ return (entry.value['type'] === 'assistant' &&
79
+ entry.value['isSidechain'] !== true &&
80
+ entry.value['isMeta'] !== true);
81
+ }
82
+ function isEligibleToolResult(entry) {
83
+ if (entry.value['type'] !== 'user' ||
84
+ entry.value['isSidechain'] === true ||
85
+ entry.value['isMeta'] === true) {
86
+ return false;
87
+ }
88
+ const content = recordValue(entry.value['message'])?.['content'];
89
+ return (Array.isArray(content) &&
90
+ content.some((block) => recordValue(block)?.['type'] === 'tool_result'));
91
+ }
92
+ function stableTimestampSort(entries) {
93
+ return [...entries].sort((left, right) => {
94
+ const timestampOrder = compareCodeUnits(timestamp(left), timestamp(right));
95
+ return timestampOrder !== 0 ? timestampOrder : left.start - right.start;
96
+ });
97
+ }
98
+ function compareCodeUnits(left, right) {
99
+ return left < right ? -1 : left > right ? 1 : 0;
100
+ }
101
+ function timestamp(entry) {
102
+ return stringValue(entry.value['timestamp']) ?? '';
103
+ }
104
+ function isSeen(entry, seen) {
105
+ const uuid = stringValue(entry.value['uuid']);
106
+ return uuid !== null && seen.has(uuid);
107
+ }
108
+ function pushMapValue(map, key, value) {
109
+ const entries = map.get(key);
110
+ if (entries === undefined)
111
+ map.set(key, [value]);
112
+ else
113
+ entries.push(value);
114
+ }
115
+ function recordValue(value) {
116
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
117
+ ? value
118
+ : null;
119
+ }
120
+ function stringValue(value) {
121
+ return typeof value === 'string' && value !== '' ? value : null;
122
+ }
123
+ //# sourceMappingURL=parallel-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-tools.js","sourceRoot":"","sources":["../../src/transcript/parallel-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { DreamuxEnvironment } from '@excitedjs/dreamux-types';
2
+ import { type ClaudeTranscriptBudget } from './budget.js';
3
+ export interface ClaudeTranscriptRoots {
4
+ configHome: string;
5
+ projects: string;
6
+ }
7
+ export interface ClaudeValidatedTranscript {
8
+ path: string;
9
+ root: string;
10
+ size: number;
11
+ dev: number | bigint;
12
+ ino: number | bigint;
13
+ }
14
+ export declare function claudeTranscriptRoots(env?: DreamuxEnvironment, runtimeCwd?: string): ClaudeTranscriptRoots;
15
+ export declare function deriveClaudeTranscriptPath(sessionId: string, cwd: string, env?: DreamuxEnvironment): Promise<string>;
16
+ export declare function locateClaudeTranscript(input: {
17
+ sessionId: string;
18
+ cwd: string;
19
+ locator?: string | null;
20
+ env?: DreamuxEnvironment;
21
+ budget?: ClaudeTranscriptBudget;
22
+ worktreePaths?: readonly string[];
23
+ }): Promise<ClaudeValidatedTranscript>;
24
+ export declare function validateClaudeTranscriptPath(candidate: string, sessionId: string, roots: ClaudeTranscriptRoots): Promise<ClaudeValidatedTranscript>;
25
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/transcript/path.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AAYrB,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,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,wBAAgB,qBAAqB,CACnC,GAAG,GAAE,kBAAgC,EACrC,UAAU,SAAgB,GACzB,qBAAqB,CAUvB;AAED,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,kBAAgC,GACpC,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,CAAC,EAAE,kBAAkB,CAAC;IACzB,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAiDrC;AAED,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,yBAAyB,CAAC,CA+BpC"}
@@ -0,0 +1,253 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { opendir, realpath } from 'node:fs/promises';
3
+ import { dirname, isAbsolute, join, relative, resolve, } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import { isPathWithin } from '@excitedjs/dreamux-utils';
6
+ import { createClaudeTranscriptBudget, } from './budget.js';
7
+ import { ClaudeTranscriptError } from './error.js';
8
+ import { claudeNativePathHash } from './native-hash.js';
9
+ import { openClaudeTranscript, validateClaudeSessionEvidence, } from './opened-file.js';
10
+ const MAX_SANITIZED_LENGTH = 200;
11
+ const SESSION_FILENAME = /^[0-9a-f]{8}-[0-9a-f-]{27}\.jsonl$/i;
12
+ const execFileAsync = promisify(execFile);
13
+ export function claudeTranscriptRoots(env = process.env, runtimeCwd = process.cwd()) {
14
+ const configured = env['CLAUDE_CONFIG_DIR'];
15
+ const configHome = (configured === undefined || configured === ''
16
+ ? join(requireHome(env), '.claude')
17
+ : isAbsolute(configured)
18
+ ? configured
19
+ : resolve(runtimeCwd, configured)).normalize('NFC');
20
+ return { configHome, projects: join(configHome, 'projects') };
21
+ }
22
+ export async function deriveClaudeTranscriptPath(sessionId, cwd, env = process.env) {
23
+ assertSessionId(sessionId);
24
+ const roots = claudeTranscriptRoots(env, cwd);
25
+ const canonicalCwd = await canonicalRuntimeCwd(cwd);
26
+ const path = join(roots.projects, sanitizePath(canonicalCwd.normalize('NFC')), `${sessionId}.jsonl`);
27
+ return canonicalProspectivePath(path, roots.projects);
28
+ }
29
+ export async function locateClaudeTranscript(input) {
30
+ assertSessionId(input.sessionId);
31
+ const budget = input.budget ?? createClaudeTranscriptBudget();
32
+ const roots = claudeTranscriptRoots(input.env, input.cwd);
33
+ if (input.locator !== null && input.locator !== undefined) {
34
+ try {
35
+ return await validateClaudeTranscriptPath(input.locator, input.sessionId, roots);
36
+ }
37
+ catch (error) {
38
+ if (!(error instanceof ClaudeTranscriptError) ||
39
+ error.reason !== 'not_found') {
40
+ throw error;
41
+ }
42
+ }
43
+ }
44
+ const candidates = await discoveryCandidates({
45
+ roots,
46
+ sessionId: input.sessionId,
47
+ cwd: input.cwd,
48
+ env: input.env,
49
+ budget,
50
+ worktreePaths: input.worktreePaths,
51
+ });
52
+ for (const candidate of candidates) {
53
+ try {
54
+ return await validateClaudeTranscriptPath(candidate, input.sessionId, roots);
55
+ }
56
+ catch (error) {
57
+ if (error instanceof ClaudeTranscriptError &&
58
+ error.reason === 'not_found') {
59
+ continue;
60
+ }
61
+ throw error;
62
+ }
63
+ }
64
+ throw new ClaudeTranscriptError('not_found', 'Claude Code transcript is unavailable');
65
+ }
66
+ export async function validateClaudeTranscriptPath(candidate, sessionId, roots) {
67
+ if (!isAbsolute(candidate) ||
68
+ !SESSION_FILENAME.test(candidate.split(/[\\/]/).at(-1) ?? '') ||
69
+ !candidate.endsWith(`${sessionId}.jsonl`)) {
70
+ throw new ClaudeTranscriptError('invalid', 'Claude Code transcript locator is not a native session path');
71
+ }
72
+ const canonicalProjects = await canonicalExistingRoot(roots.projects);
73
+ const opened = await openClaudeTranscript(candidate, canonicalProjects);
74
+ try {
75
+ if (opened.size === 0) {
76
+ throw new ClaudeTranscriptError('not_found', 'Claude Code transcript is unavailable');
77
+ }
78
+ await validateClaudeSessionEvidence(opened, sessionId);
79
+ return {
80
+ path: opened.path,
81
+ root: canonicalProjects,
82
+ size: opened.size,
83
+ dev: opened.dev,
84
+ ino: opened.ino,
85
+ };
86
+ }
87
+ finally {
88
+ await opened.handle.close();
89
+ }
90
+ }
91
+ function sanitizePath(name) {
92
+ const sanitized = name.replace(/[^a-zA-Z0-9]/g, '-');
93
+ if (sanitized.length <= MAX_SANITIZED_LENGTH)
94
+ return sanitized;
95
+ return (`${sanitized.slice(0, MAX_SANITIZED_LENGTH)}-` +
96
+ claudeNativePathHash(name));
97
+ }
98
+ async function discoveryCandidates(input) {
99
+ const result = [];
100
+ const seen = new Set();
101
+ let projectDirectories = null;
102
+ const readProjects = () => {
103
+ projectDirectories ??= readProjectDirectories(input.roots, input.budget);
104
+ return projectDirectories;
105
+ };
106
+ const pushProjectCandidates = async (cwd) => {
107
+ const canonical = await canonicalRuntimeCwd(cwd);
108
+ const exact = await deriveClaudeTranscriptPath(input.sessionId, canonical, input.env);
109
+ pushUnique(result, seen, exact);
110
+ const sanitized = sanitizePath(canonical.normalize('NFC'));
111
+ if (sanitized.length <= MAX_SANITIZED_LENGTH)
112
+ return;
113
+ const prefix = sanitized.slice(0, MAX_SANITIZED_LENGTH) + '-';
114
+ const entries = await readProjects();
115
+ for (const entry of entries) {
116
+ if (entry.startsWith(prefix)) {
117
+ pushUnique(result, seen, join(input.roots.projects, entry, `${input.sessionId}.jsonl`));
118
+ }
119
+ }
120
+ };
121
+ await pushProjectCandidates(input.cwd);
122
+ const worktrees = input.worktreePaths ?? (await discoverWorktreePaths(input.cwd));
123
+ for (const worktree of worktrees) {
124
+ input.budget.inspect();
125
+ if (resolve(worktree) !== resolve(input.cwd)) {
126
+ await pushProjectCandidates(worktree);
127
+ }
128
+ }
129
+ const projects = await readProjects();
130
+ for (const project of projects) {
131
+ pushUnique(result, seen, join(input.roots.projects, project, `${input.sessionId}.jsonl`));
132
+ }
133
+ return result;
134
+ }
135
+ async function readProjectDirectories(roots, budget) {
136
+ let directory;
137
+ try {
138
+ directory = await opendir(roots.projects);
139
+ }
140
+ catch (error) {
141
+ if (error.code === 'ENOENT')
142
+ return [];
143
+ throw new ClaudeTranscriptError('unreadable', 'Claude Code transcript root is unreadable', { cause: error });
144
+ }
145
+ const entries = [];
146
+ try {
147
+ for await (const entry of directory) {
148
+ budget.inspect();
149
+ if (entry.isDirectory())
150
+ entries.push(entry.name);
151
+ }
152
+ }
153
+ catch (error) {
154
+ if (error instanceof ClaudeTranscriptError)
155
+ throw error;
156
+ if (error.code === 'ENOENT')
157
+ return entries;
158
+ throw new ClaudeTranscriptError('unreadable', 'Claude Code transcript root is unreadable', { cause: error });
159
+ }
160
+ return entries;
161
+ }
162
+ async function discoverWorktreePaths(cwd) {
163
+ try {
164
+ const { stdout } = await execFileAsync('git', [
165
+ '-c',
166
+ 'core.hooksPath=/dev/null',
167
+ '-c',
168
+ 'core.fsmonitor=',
169
+ 'worktree',
170
+ 'list',
171
+ '--porcelain',
172
+ ], { cwd, timeout: 5_000, windowsHide: true });
173
+ return stdout
174
+ .split('\n')
175
+ .filter((line) => line.startsWith('worktree '))
176
+ .map((line) => line.slice('worktree '.length));
177
+ }
178
+ catch {
179
+ return [];
180
+ }
181
+ }
182
+ async function canonicalProspectivePath(candidate, root) {
183
+ const [canonicalCandidate, canonicalRoot] = await Promise.all([
184
+ canonicalizeProspectivePath(candidate),
185
+ canonicalizeProspectivePath(root),
186
+ ]);
187
+ if (!isPathWithin(canonicalRoot, canonicalCandidate)) {
188
+ throw new ClaudeTranscriptError('locator_outside_root', 'Claude Code transcript locator is outside the native transcript root');
189
+ }
190
+ return canonicalCandidate;
191
+ }
192
+ async function canonicalRuntimeCwd(cwd) {
193
+ try {
194
+ return await realpath(cwd);
195
+ }
196
+ catch (error) {
197
+ if (error.code === 'ENOENT') {
198
+ return resolve(cwd);
199
+ }
200
+ throw new ClaudeTranscriptError('unreadable', 'Claude Code runtime cwd is unreadable', { cause: error });
201
+ }
202
+ }
203
+ async function canonicalizeProspectivePath(path) {
204
+ const absolutePath = resolve(path);
205
+ let ancestor = absolutePath;
206
+ while (true) {
207
+ try {
208
+ const canonicalAncestor = await realpath(ancestor);
209
+ return resolve(canonicalAncestor, relative(ancestor, absolutePath));
210
+ }
211
+ catch (error) {
212
+ const code = error.code;
213
+ if (code !== 'ENOENT') {
214
+ throw new ClaudeTranscriptError('unreadable', 'Claude Code transcript path is unreadable', { cause: error });
215
+ }
216
+ }
217
+ const parent = dirname(ancestor);
218
+ if (parent === ancestor) {
219
+ throw new ClaudeTranscriptError('not_found', 'Claude Code transcript root is unavailable');
220
+ }
221
+ ancestor = parent;
222
+ }
223
+ }
224
+ async function canonicalExistingRoot(root) {
225
+ try {
226
+ return await realpath(root);
227
+ }
228
+ catch (error) {
229
+ if (error.code === 'ENOENT') {
230
+ throw new ClaudeTranscriptError('not_found', 'Claude Code transcript root is unavailable', { cause: error });
231
+ }
232
+ throw new ClaudeTranscriptError('unreadable', 'Claude Code transcript root is unreadable', { cause: error });
233
+ }
234
+ }
235
+ function pushUnique(result, seen, value) {
236
+ if (seen.has(value))
237
+ return;
238
+ seen.add(value);
239
+ result.push(value);
240
+ }
241
+ function assertSessionId(sessionId) {
242
+ if (!/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(sessionId)) {
243
+ throw new ClaudeTranscriptError('invalid', 'Claude Code session id is invalid');
244
+ }
245
+ }
246
+ function requireHome(env) {
247
+ const home = env['HOME'];
248
+ if (home === undefined || home === '') {
249
+ throw new ClaudeTranscriptError('not_found', 'Claude Code config home is unavailable');
250
+ }
251
+ return home;
252
+ }
253
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/transcript/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AgentRuntimeTranscriptContext, AgentRuntimeTranscriptPage, AgentRuntimeTranscriptQuery } from '@excitedjs/dreamux-types';
2
+ import type { DispatcherClaudeCodeConfig } from '../config.js';
3
+ export declare function readClaudeTranscript(query: AgentRuntimeTranscriptQuery, context: AgentRuntimeTranscriptContext<DispatcherClaudeCodeConfig>, testHooks?: {
4
+ afterLocate?: () => void | Promise<void>;
5
+ maxReadChunkBytes?: number;
6
+ }): Promise<AgentRuntimeTranscriptPage>;
7
+ //# sourceMappingURL=reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/transcript/reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAE5B,MAAM,0BAA0B,CAAC;AAQlC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAuD/D,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,2BAA2B,EAClC,OAAO,EAAE,6BAA6B,CAAC,0BAA0B,CAAC,EAClE,SAAS,GAAE;IACT,WAAW,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACvB,GACL,OAAO,CAAC,0BAA0B,CAAC,CAkIrC"}