@excitedjs/agent-runtime-claude-code 0.5.0-beta.168 → 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 (94) hide show
  1. package/README.md +41 -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 +9 -4
  12. package/dist/provider.js.map +1 -1
  13. package/dist/rpc.d.ts +14 -1
  14. package/dist/rpc.d.ts.map +1 -1
  15. package/dist/rpc.js +194 -53
  16. package/dist/rpc.js.map +1 -1
  17. package/dist/runtime-deps.d.ts +29 -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-turn.d.ts +7 -0
  26. package/dist/runtime-turn.d.ts.map +1 -0
  27. package/dist/runtime-turn.js +21 -0
  28. package/dist/runtime-turn.js.map +1 -0
  29. package/dist/runtime.d.ts +30 -131
  30. package/dist/runtime.d.ts.map +1 -1
  31. package/dist/runtime.js +258 -225
  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 +1 -1
  46. package/dist/stream.d.ts.map +1 -1
  47. package/dist/stream.js +21 -1
  48. package/dist/stream.js.map +1 -1
  49. package/dist/supervisor.d.ts.map +1 -1
  50. package/dist/supervisor.js +63 -10
  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 +44 -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 +7 -0
  93. package/dist/types.d.ts.map +1 -1
  94. package/package.json +3 -3
@@ -0,0 +1,8 @@
1
+ import { type TranscriptScanBudget } from '@excitedjs/dreamux-utils';
2
+ export type ClaudeTranscriptBudget = TranscriptScanBudget;
3
+ export declare function createClaudeTranscriptBudget(input?: {
4
+ maxEntries?: number;
5
+ maxElapsedMs?: number;
6
+ now?: () => number;
7
+ }): ClaudeTranscriptBudget;
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,sBAAsB,GAAG,oBAAoB,CAAC;AAE1D,wBAAgB,4BAA4B,CAAC,KAAK,GAAE;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACf,GAAG,sBAAsB,CAS9B"}
@@ -0,0 +1,9 @@
1
+ import { createTranscriptScanBudget, } from '@excitedjs/dreamux-utils';
2
+ import { ClaudeTranscriptError } from './error.js';
3
+ export function createClaudeTranscriptBudget(input = {}) {
4
+ return createTranscriptScanBudget({
5
+ ...input,
6
+ limitError: () => new ClaudeTranscriptError('scan_unsupported', 'Claude Code 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,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAInD,MAAM,UAAU,4BAA4B,CAAC,QAIzC,EAAE;IACJ,OAAO,0BAA0B,CAAC;QAChC,GAAG,KAAK;QACR,UAAU,EAAE,GAAG,EAAE,CACf,IAAI,qBAAqB,CACvB,kBAAkB,EAClB,kEAAkE,CACnE;KACJ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface ClaudeCompletionEntry {
2
+ value: Record<string, unknown>;
3
+ }
4
+ export declare function hasAssistantWithoutHumanBoundary(entries: readonly ClaudeCompletionEntry[]): boolean;
5
+ export declare function hasCompletionEvidence(entries: readonly ClaudeCompletionEntry[]): boolean;
6
+ export declare function hasOpenTail(entries: readonly ClaudeCompletionEntry[]): boolean;
7
+ export declare function isHumanPrompt(value: Record<string, unknown>): boolean;
8
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/transcript/completion.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,SAAS,qBAAqB,EAAE,GACxC,OAAO,CAUT;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GACxC,OAAO,CAET;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,SAAS,qBAAqB,EAAE,GACxC,OAAO,CAOT;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAYrE"}
@@ -0,0 +1,44 @@
1
+ export function hasAssistantWithoutHumanBoundary(entries) {
2
+ return (entries.some((entry) => entry.value['type'] === 'assistant' &&
3
+ entry.value['isSidechain'] !== true &&
4
+ entry.value['isMeta'] !== true) &&
5
+ !entries.some((entry) => isHumanPrompt(entry.value)));
6
+ }
7
+ export function hasCompletionEvidence(entries) {
8
+ return entries.some((entry) => isCompletionMarker(entry.value));
9
+ }
10
+ export function hasOpenTail(entries) {
11
+ let open = false;
12
+ for (const entry of entries) {
13
+ if (isHumanPrompt(entry.value))
14
+ open = true;
15
+ if (isCompletionMarker(entry.value))
16
+ open = false;
17
+ }
18
+ return open;
19
+ }
20
+ export function isHumanPrompt(value) {
21
+ if (value['type'] !== 'user' ||
22
+ value['isSidechain'] === true ||
23
+ value['isMeta'] === true) {
24
+ return false;
25
+ }
26
+ const content = recordValue(value['message'])?.['content'];
27
+ if (typeof content === 'string')
28
+ return content !== '';
29
+ if (!Array.isArray(content))
30
+ return false;
31
+ return content.some((entry) => recordValue(entry)?.['type'] === 'text');
32
+ }
33
+ function isCompletionMarker(value) {
34
+ return (value['type'] === 'system' &&
35
+ value['subtype'] === 'turn_duration' &&
36
+ value['isSidechain'] !== true &&
37
+ value['isMeta'] !== true);
38
+ }
39
+ function recordValue(value) {
40
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
41
+ ? value
42
+ : null;
43
+ }
44
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/transcript/completion.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,gCAAgC,CAC9C,OAAyC;IAEzC,OAAO,CACL,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,WAAW;QACnC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI;QACnC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CACjC;QACD,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAAyC;IAEzC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAyC;IAEzC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC;QAC5C,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,IAAI,GAAG,KAAK,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAA8B;IAC1D,IACE,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM;QACxB,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI;QAC7B,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,EACxB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,KAAK,EAAE,CAAC;IACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA8B;IACxD,OAAO,CACL,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ;QAC1B,KAAK,CAAC,SAAS,CAAC,KAAK,eAAe;QACpC,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI;QAC7B,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CACzB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { transcriptDigest } from '@excitedjs/dreamux-utils';
2
+ interface ClaudeCursorEnvelope {
3
+ v: 1;
4
+ p: 'claude';
5
+ fp: string;
6
+ gen: string;
7
+ pos: number;
8
+ bd: string;
9
+ rw: number;
10
+ rp: number | null;
11
+ rd: string | null;
12
+ }
13
+ export declare function claudeQueryFingerprint(includeTools: boolean): string;
14
+ export declare function encodeClaudeCursor(input: {
15
+ fingerprint: string;
16
+ generation: string;
17
+ position: number;
18
+ boundaryDigest: string;
19
+ rewriteWatermark: number;
20
+ rewritePosition: number | null;
21
+ rewriteDigest: string | null;
22
+ }): string;
23
+ export declare function decodeClaudeCursor(cursor: string, expectedFingerprint: string): ClaudeCursorEnvelope;
24
+ export { transcriptDigest as digest };
25
+ //# 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,UAAU,oBAAoB;IAC5B,CAAC,EAAE,CAAC,CAAC;IACL,CAAC,EAAE,QAAQ,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAEpE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,MAAM,CAaT;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,MAAM,GAC1B,oBAAoB,CA0BtB;AA2BD,OAAO,EAAE,gBAAgB,IAAI,MAAM,EAAE,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { isTranscriptDigest, transcriptDigest, } from '@excitedjs/dreamux-utils';
2
+ import { ClaudeTranscriptError } from './error.js';
3
+ export function claudeQueryFingerprint(includeTools) {
4
+ return transcriptDigest(JSON.stringify({ include_tools: includeTools }));
5
+ }
6
+ export function encodeClaudeCursor(input) {
7
+ const envelope = {
8
+ v: 1,
9
+ p: 'claude',
10
+ fp: input.fingerprint,
11
+ gen: input.generation,
12
+ pos: input.position,
13
+ bd: input.boundaryDigest,
14
+ rw: input.rewriteWatermark,
15
+ rp: input.rewritePosition,
16
+ rd: input.rewriteDigest,
17
+ };
18
+ return Buffer.from(JSON.stringify(envelope), 'utf8').toString('base64url');
19
+ }
20
+ export function decodeClaudeCursor(cursor, expectedFingerprint) {
21
+ let value;
22
+ try {
23
+ const decoded = Buffer.from(cursor, 'base64url');
24
+ if (decoded.length === 0 || decoded.length > 3072)
25
+ throw new Error('size');
26
+ value = JSON.parse(decoded.toString('utf8'));
27
+ }
28
+ catch (error) {
29
+ throw new ClaudeTranscriptError('cursor_invalid', 'Claude Code transcript cursor is invalid', { cause: error });
30
+ }
31
+ if (!isEnvelope(value)) {
32
+ throw new ClaudeTranscriptError('cursor_invalid', 'Claude Code transcript cursor is invalid');
33
+ }
34
+ if (value.fp !== expectedFingerprint) {
35
+ throw new ClaudeTranscriptError('cursor_query_mismatch', 'Claude Code transcript cursor belongs to a different query');
36
+ }
37
+ return value;
38
+ }
39
+ function isEnvelope(value) {
40
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
41
+ return false;
42
+ }
43
+ const record = value;
44
+ return (Object.keys(record).length === 9 &&
45
+ record['v'] === 1 &&
46
+ record['p'] === 'claude' &&
47
+ isTranscriptDigest(record['fp']) &&
48
+ isTranscriptDigest(record['gen']) &&
49
+ Number.isSafeInteger(record['pos']) &&
50
+ record['pos'] >= 0 &&
51
+ isTranscriptDigest(record['bd']) &&
52
+ Number.isSafeInteger(record['rw']) &&
53
+ record['rw'] >= 0 &&
54
+ (record['rp'] === null ||
55
+ (Number.isSafeInteger(record['rp']) &&
56
+ record['rp'] >= 0)) &&
57
+ (record['rd'] === null || isTranscriptDigest(record['rd'])) &&
58
+ ((record['rp'] === null && record['rd'] === null) ||
59
+ (record['rp'] !== null && record['rd'] !== null)));
60
+ }
61
+ export { transcriptDigest as digest };
62
+ //# 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 ClaudeTranscriptError 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,qBACX,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 ClaudeTranscriptError 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,qBACX,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,2 @@
1
+ export declare function claudeNativePathHash(value: string): string;
2
+ //# sourceMappingURL=native-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-hash.d.ts","sourceRoot":"","sources":["../../src/transcript/native-hash.ts"],"names":[],"mappings":"AAQA,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,79 @@
1
+ const MASK_64 = (1n << 64n) - 1n;
2
+ const SECRET = [
3
+ 0xa0761d6478bd642fn,
4
+ 0xe7037ed1a0b428dbn,
5
+ 0x8ebc6af09c88c6e3n,
6
+ 0x589965cc75374cc3n,
7
+ ];
8
+ export function claudeNativePathHash(value) {
9
+ return wyhash(new TextEncoder().encode(value), 0n).toString(36);
10
+ }
11
+ function wyhash(input, seed) {
12
+ let state = uint64(seed) ^ mix(uint64(seed) ^ SECRET[0], SECRET[1]);
13
+ let left;
14
+ let right;
15
+ const length = input.length;
16
+ if (length <= 16) {
17
+ if (length >= 4) {
18
+ const end = length - 4;
19
+ const quarter = (length >> 3) << 2;
20
+ left = (read(input, 0, 4) << 32n) | read(input, quarter, 4);
21
+ right =
22
+ (read(input, end, 4) << 32n) |
23
+ read(input, end - quarter, 4);
24
+ }
25
+ else if (length > 0) {
26
+ left =
27
+ (BigInt(input[0]) << 16n) |
28
+ (BigInt(input[length >> 1]) << 8n) |
29
+ BigInt(input[length - 1]);
30
+ right = 0n;
31
+ }
32
+ else {
33
+ left = 0n;
34
+ right = 0n;
35
+ }
36
+ }
37
+ else {
38
+ const lanes = [state, state, state];
39
+ let offset = 0;
40
+ while (offset + 48 < length) {
41
+ for (let lane = 0; lane < lanes.length; lane += 1) {
42
+ lanes[lane] = mix(read(input, offset + 16 * lane, 8) ^ SECRET[lane + 1], read(input, offset + 16 * lane + 8, 8) ^ lanes[lane]);
43
+ }
44
+ offset += 48;
45
+ }
46
+ lanes[0] = lanes[0] ^ lanes[1] ^ lanes[2];
47
+ while (offset + 16 < length) {
48
+ lanes[0] = mix(read(input, offset, 8) ^ SECRET[1], read(input, offset + 8, 8) ^ lanes[0]);
49
+ offset += 16;
50
+ }
51
+ left = read(input, length - 16, 8);
52
+ right = read(input, length - 8, 8);
53
+ state = lanes[0];
54
+ }
55
+ const product = multiply(left ^ SECRET[1], right ^ state);
56
+ return mix(product.low ^ SECRET[0] ^ BigInt(length), product.high ^ SECRET[1]);
57
+ }
58
+ function read(input, offset, length) {
59
+ let value = 0n;
60
+ for (let index = 0; index < length; index += 1) {
61
+ value |= BigInt(input[offset + index] ?? 0) << BigInt(index * 8);
62
+ }
63
+ return uint64(value);
64
+ }
65
+ function mix(left, right) {
66
+ const product = multiply(left, right);
67
+ return product.low ^ product.high;
68
+ }
69
+ function multiply(left, right) {
70
+ const product = uint64(left) * uint64(right);
71
+ return {
72
+ low: uint64(product),
73
+ high: uint64(product >> 64n),
74
+ };
75
+ }
76
+ function uint64(value) {
77
+ return value & MASK_64;
78
+ }
79
+ //# sourceMappingURL=native-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-hash.js","sourceRoot":"","sources":["../../src/transcript/native-hash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type FileHandle } from 'node:fs/promises';
2
+ export interface ClaudeOpenedTranscript {
3
+ handle: FileHandle;
4
+ path: string;
5
+ size: number;
6
+ dev: number | bigint;
7
+ ino: number | bigint;
8
+ }
9
+ export declare function openClaudeTranscript(candidate: string, canonicalRoot: string): Promise<ClaudeOpenedTranscript>;
10
+ export declare function validateClaudeSessionEvidence(opened: ClaudeOpenedTranscript, expectedSessionId: string, options?: {
11
+ maxReadChunkBytes?: number;
12
+ }): Promise<void>;
13
+ //# 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;AASnE,MAAM,WAAW,sBAAsB;IACrC,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;AAID,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,sBAAsB,CAAC,CA4DjC;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,sBAAsB,EAC9B,iBAAiB,EAAE,MAAM,EACzB,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
@@ -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":"AAKA,MAAM,UAAU,2BAA2B,CACzC,OAA0B,EAC1B,KAAwB;IAExB,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,KAAK;SACF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;SAChD,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CACnD,CAAC;IACF,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC1D,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IAEpD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpD,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI;YAAE,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxD,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACvB,YAAY,CAAC,mBAAmB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACtD,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;YAAE,SAAS;QAC3C,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC1D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,YAAY,CAAC,sBAAsB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,SAAS,KAAK,IAAI,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS;QACnE,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE/B,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,mBAAmB,CAClC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAC9C,CAAC;QACF,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,IAAI,IAAI,KAAK,IAAI;gBAAE,SAAS;YAC5B,KAAK,MAAM,MAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC5D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;oBAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;QACrE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACrC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9C,IAAI,IAAI,KAAK,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,UAAU,GACd,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAClE,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CACzB,KAA4B;IAE5B,OAAO,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAa;IAEb,OAAO,CACL,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,WAAW;QACnC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI;QACnC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAa;IAEb,IACE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM;QAC9B,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI;QACnC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,EAC9B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACjE,OAAO,CACL,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,CACxE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAA0B;IAE1B,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACvC,MAAM,cAAc,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3E,OAAO,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAa;IACnD,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,KAA4B;IAC7C,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,MAAM,CACb,KAA4B,EAC5B,IAAyB;IAEzB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,YAAY,CACnB,GAAwB,EACxB,GAAS,EACT,KAAa;IAEb,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,OAAO,KAAK,SAAS;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;;QAC5C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC"}
@@ -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"}