@paraharness/claude 0.0.0-stage → 0.2.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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +63 -2
  3. package/dist/builders/claude-account-seat-builder.d.ts +44 -0
  4. package/dist/builders/claude-account-seat-builder.d.ts.map +1 -0
  5. package/dist/builders/claude-account-seat-builder.js +2 -0
  6. package/dist/builders/claude-account-seat-builder.js.map +1 -0
  7. package/dist/builders/claude-model-builder.d.ts +52 -0
  8. package/dist/builders/claude-model-builder.d.ts.map +1 -0
  9. package/dist/builders/claude-model-builder.js +2 -0
  10. package/dist/builders/claude-model-builder.js.map +1 -0
  11. package/dist/builders/claude-model-options.d.ts +13 -0
  12. package/dist/builders/claude-model-options.d.ts.map +1 -0
  13. package/dist/builders/claude-model-options.js +2 -0
  14. package/dist/builders/claude-model-options.js.map +1 -0
  15. package/dist/builders/claude-namespace-contract.d.ts +49 -0
  16. package/dist/builders/claude-namespace-contract.d.ts.map +1 -0
  17. package/dist/builders/claude-namespace-contract.js +2 -0
  18. package/dist/builders/claude-namespace-contract.js.map +1 -0
  19. package/dist/builders/claude-namespace.d.ts +4 -0
  20. package/dist/builders/claude-namespace.d.ts.map +1 -0
  21. package/dist/builders/claude-namespace.js +9 -0
  22. package/dist/builders/claude-namespace.js.map +1 -0
  23. package/dist/builders/create-claude-account-seat-builder.d.ts +18 -0
  24. package/dist/builders/create-claude-account-seat-builder.d.ts.map +1 -0
  25. package/dist/builders/create-claude-account-seat-builder.js +44 -0
  26. package/dist/builders/create-claude-account-seat-builder.js.map +1 -0
  27. package/dist/builders/create-claude-model-builder.d.ts +19 -0
  28. package/dist/builders/create-claude-model-builder.d.ts.map +1 -0
  29. package/dist/builders/create-claude-model-builder.js +49 -0
  30. package/dist/builders/create-claude-model-builder.js.map +1 -0
  31. package/dist/driver/claude-executors.constants.d.ts +4 -0
  32. package/dist/driver/claude-executors.constants.d.ts.map +1 -0
  33. package/dist/driver/claude-executors.constants.js +4 -0
  34. package/dist/driver/claude-executors.constants.js.map +1 -0
  35. package/dist/driver/claude-http-request.d.ts +23 -0
  36. package/dist/driver/claude-http-request.d.ts.map +1 -0
  37. package/dist/driver/claude-http-request.js +2 -0
  38. package/dist/driver/claude-http-request.js.map +1 -0
  39. package/dist/driver/claude-http-response.d.ts +19 -0
  40. package/dist/driver/claude-http-response.d.ts.map +1 -0
  41. package/dist/driver/claude-http-response.js +2 -0
  42. package/dist/driver/claude-http-response.js.map +1 -0
  43. package/dist/driver/claude-http-transport.d.ts +24 -0
  44. package/dist/driver/claude-http-transport.d.ts.map +1 -0
  45. package/dist/driver/claude-http-transport.js +2 -0
  46. package/dist/driver/claude-http-transport.js.map +1 -0
  47. package/dist/driver/claude-model-driver.d.ts +71 -0
  48. package/dist/driver/claude-model-driver.d.ts.map +1 -0
  49. package/dist/driver/claude-model-driver.js +105 -0
  50. package/dist/driver/claude-model-driver.js.map +1 -0
  51. package/dist/driver/create-claude-executors.d.ts +14 -0
  52. package/dist/driver/create-claude-executors.d.ts.map +1 -0
  53. package/dist/driver/create-claude-executors.js +20 -0
  54. package/dist/driver/create-claude-executors.js.map +1 -0
  55. package/dist/driver/default-claude-http-transport.constants.d.ts +14 -0
  56. package/dist/driver/default-claude-http-transport.constants.d.ts.map +1 -0
  57. package/dist/driver/default-claude-http-transport.constants.js +38 -0
  58. package/dist/driver/default-claude-http-transport.constants.js.map +1 -0
  59. package/dist/driver/internal/build-claude-paired-fork-tool-frame.d.ts +14 -0
  60. package/dist/driver/internal/build-claude-paired-fork-tool-frame.d.ts.map +1 -0
  61. package/dist/driver/internal/build-claude-paired-fork-tool-frame.js +56 -0
  62. package/dist/driver/internal/build-claude-paired-fork-tool-frame.js.map +1 -0
  63. package/dist/driver/internal/build-claude-user-frame.d.ts +26 -0
  64. package/dist/driver/internal/build-claude-user-frame.d.ts.map +1 -0
  65. package/dist/driver/internal/build-claude-user-frame.js +29 -0
  66. package/dist/driver/internal/build-claude-user-frame.js.map +1 -0
  67. package/dist/driver/internal/claude-append-tool-result-notes.d.ts +28 -0
  68. package/dist/driver/internal/claude-append-tool-result-notes.d.ts.map +1 -0
  69. package/dist/driver/internal/claude-append-tool-result-notes.js +124 -0
  70. package/dist/driver/internal/claude-append-tool-result-notes.js.map +1 -0
  71. package/dist/driver/internal/claude-prepare-fork.d.ts +14 -0
  72. package/dist/driver/internal/claude-prepare-fork.d.ts.map +1 -0
  73. package/dist/driver/internal/claude-prepare-fork.js +59 -0
  74. package/dist/driver/internal/claude-prepare-fork.js.map +1 -0
  75. package/dist/driver/internal/claude-seat-auth.d.ts +14 -0
  76. package/dist/driver/internal/claude-seat-auth.d.ts.map +1 -0
  77. package/dist/driver/internal/claude-seat-auth.js +2 -0
  78. package/dist/driver/internal/claude-seat-auth.js.map +1 -0
  79. package/dist/driver/internal/claude-wire-converter.d.ts +27 -0
  80. package/dist/driver/internal/claude-wire-converter.d.ts.map +1 -0
  81. package/dist/driver/internal/claude-wire-converter.js +83 -0
  82. package/dist/driver/internal/claude-wire-converter.js.map +1 -0
  83. package/dist/driver/internal/compute-anthropic-turn-usage.d.ts +12 -0
  84. package/dist/driver/internal/compute-anthropic-turn-usage.d.ts.map +1 -0
  85. package/dist/driver/internal/compute-anthropic-turn-usage.js +27 -0
  86. package/dist/driver/internal/compute-anthropic-turn-usage.js.map +1 -0
  87. package/dist/driver/internal/create-anthropic-sdk-fetch.d.ts +23 -0
  88. package/dist/driver/internal/create-anthropic-sdk-fetch.d.ts.map +1 -0
  89. package/dist/driver/internal/create-anthropic-sdk-fetch.js +21 -0
  90. package/dist/driver/internal/create-anthropic-sdk-fetch.js.map +1 -0
  91. package/dist/driver/internal/decode-frame-to-anthropic-message.d.ts +14 -0
  92. package/dist/driver/internal/decode-frame-to-anthropic-message.d.ts.map +1 -0
  93. package/dist/driver/internal/decode-frame-to-anthropic-message.js +29 -0
  94. package/dist/driver/internal/decode-frame-to-anthropic-message.js.map +1 -0
  95. package/dist/driver/internal/extract-anthropic-content-blocks.d.ts +12 -0
  96. package/dist/driver/internal/extract-anthropic-content-blocks.d.ts.map +1 -0
  97. package/dist/driver/internal/extract-anthropic-content-blocks.js +36 -0
  98. package/dist/driver/internal/extract-anthropic-content-blocks.js.map +1 -0
  99. package/dist/driver/internal/extract-claude-response-body.d.ts +29 -0
  100. package/dist/driver/internal/extract-claude-response-body.d.ts.map +1 -0
  101. package/dist/driver/internal/extract-claude-response-body.js +36 -0
  102. package/dist/driver/internal/extract-claude-response-body.js.map +1 -0
  103. package/dist/driver/internal/extract-oauth-token-from-config-dir.d.ts +12 -0
  104. package/dist/driver/internal/extract-oauth-token-from-config-dir.d.ts.map +1 -0
  105. package/dist/driver/internal/extract-oauth-token-from-config-dir.js +99 -0
  106. package/dist/driver/internal/extract-oauth-token-from-config-dir.js.map +1 -0
  107. package/dist/driver/internal/extracted-anthropic-content-blocks.d.ts +15 -0
  108. package/dist/driver/internal/extracted-anthropic-content-blocks.d.ts.map +1 -0
  109. package/dist/driver/internal/extracted-anthropic-content-blocks.js +2 -0
  110. package/dist/driver/internal/extracted-anthropic-content-blocks.js.map +1 -0
  111. package/dist/driver/internal/format-claude-fork-prompt-text.d.ts +12 -0
  112. package/dist/driver/internal/format-claude-fork-prompt-text.d.ts.map +1 -0
  113. package/dist/driver/internal/format-claude-fork-prompt-text.js +20 -0
  114. package/dist/driver/internal/format-claude-fork-prompt-text.js.map +1 -0
  115. package/dist/driver/internal/parse-claude-retry-after-reset-at-ms.d.ts +11 -0
  116. package/dist/driver/internal/parse-claude-retry-after-reset-at-ms.d.ts.map +1 -0
  117. package/dist/driver/internal/parse-claude-retry-after-reset-at-ms.js +22 -0
  118. package/dist/driver/internal/parse-claude-retry-after-reset-at-ms.js.map +1 -0
  119. package/dist/driver/internal/project-canonical-to-anthropic-message.d.ts +13 -0
  120. package/dist/driver/internal/project-canonical-to-anthropic-message.d.ts.map +1 -0
  121. package/dist/driver/internal/project-canonical-to-anthropic-message.js +80 -0
  122. package/dist/driver/internal/project-canonical-to-anthropic-message.js.map +1 -0
  123. package/dist/driver/internal/resolve-anthropic-sdk-base-url.d.ts +11 -0
  124. package/dist/driver/internal/resolve-anthropic-sdk-base-url.d.ts.map +1 -0
  125. package/dist/driver/internal/resolve-anthropic-sdk-base-url.js +19 -0
  126. package/dist/driver/internal/resolve-anthropic-sdk-base-url.js.map +1 -0
  127. package/dist/driver/internal/resolve-anthropic-wire-tools.d.ts +13 -0
  128. package/dist/driver/internal/resolve-anthropic-wire-tools.d.ts.map +1 -0
  129. package/dist/driver/internal/resolve-anthropic-wire-tools.js +25 -0
  130. package/dist/driver/internal/resolve-anthropic-wire-tools.js.map +1 -0
  131. package/dist/driver/internal/resolve-claude-seat-auth.d.ts +28 -0
  132. package/dist/driver/internal/resolve-claude-seat-auth.d.ts.map +1 -0
  133. package/dist/driver/internal/resolve-claude-seat-auth.js +85 -0
  134. package/dist/driver/internal/resolve-claude-seat-auth.js.map +1 -0
  135. package/dist/driver/internal/send-claude-messages-via-sdk.d.ts +15 -0
  136. package/dist/driver/internal/send-claude-messages-via-sdk.d.ts.map +1 -0
  137. package/dist/driver/internal/send-claude-messages-via-sdk.js +98 -0
  138. package/dist/driver/internal/send-claude-messages-via-sdk.js.map +1 -0
  139. package/dist/driver/internal/slice-claude-parent-chain.d.ts +12 -0
  140. package/dist/driver/internal/slice-claude-parent-chain.d.ts.map +1 -0
  141. package/dist/driver/internal/slice-claude-parent-chain.js +23 -0
  142. package/dist/driver/internal/slice-claude-parent-chain.js.map +1 -0
  143. package/dist/driver/internal/transform-claude-fork-frame.d.ts +27 -0
  144. package/dist/driver/internal/transform-claude-fork-frame.d.ts.map +1 -0
  145. package/dist/driver/internal/transform-claude-fork-frame.js +61 -0
  146. package/dist/driver/internal/transform-claude-fork-frame.js.map +1 -0
  147. package/dist/index.d.ts +16 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +8 -0
  150. package/dist/index.js.map +1 -0
  151. package/package.json +64 -3
@@ -0,0 +1,71 @@
1
+ import type { AppendToolResultNotesOptions, ClaudeModelNode, ForkContext, ModelDriver, ModelTurnRequest, ModelTurnResponse, PrepareForkTarget, RuntimeDriverContext, WireFrameRecord } from '@paraharness/core';
2
+ import type { ClaudeHttpTransport } from './claude-http-transport.js';
3
+ /**
4
+ * Runtime `ModelDriver` implementation for the Anthropic `/v1/messages` HTTP protocol (`@paraharness/claude`).
5
+ *
6
+ * Resolves CLI subscription `configDir` OAuth tokens and `EnvRef` API keys at turn invocation time,
7
+ * preserves `thinking` blocks and cryptographic `signature` fields in `rawWireFrame`, enforces native
8
+ * `output_config.format` JSON-schema structured output, and prepares KV-cache-preserving forks.
9
+ */
10
+ export declare class ClaudeModelDriver implements ModelDriver {
11
+ /** Primary vendor identifier (`'anthropic'`). */
12
+ readonly vendorId: "anthropic";
13
+ /** Vendor alias matching `vendorId` (`'anthropic'`). */
14
+ readonly vendor: "anthropic";
15
+ /** Underlying HTTP transport used to dispatch `/v1/messages` requests. */
16
+ private readonly transport;
17
+ /** Optional passive `ClaudeModelNode` bound to this driver instance. */
18
+ private readonly modelNode;
19
+ /** Optional runtime driver context providing `resolveEnv` for symbolic `EnvRef` keys. */
20
+ private readonly driverCtx;
21
+ /**
22
+ * Initializes a `ClaudeModelDriver` with an HTTP transport, optional `ClaudeModelNode`, and runtime context.
23
+ *
24
+ * Defers all credential and environment variable lookups until `invokeTurn()` is executed.
25
+ *
26
+ * @param {ClaudeHttpTransport} [transport=defaultClaudeHttpTransport] - HTTP transport for `/v1/messages`.
27
+ * @param {ClaudeModelNode | undefined} [modelNode] - Optional bound `ClaudeModelNode`.
28
+ * @param {RuntimeDriverContext | undefined} [driverCtx] - Optional runtime driver context.
29
+ */
30
+ constructor(transport?: ClaudeHttpTransport, modelNode?: ClaudeModelNode, driverCtx?: RuntimeDriverContext);
31
+ /**
32
+ * Invokes a single Anthropic `/v1/messages` turn over `req.history` and returns the raw wire frame and canonical projection.
33
+ *
34
+ * Validates HTTP status codes before parsing `bodyText` so non-JSON error payloads (`502 Bad Gateway`) never crash
35
+ * with `SyntaxError`, and propagates HTTP `429` rate-limit responses with `{ status: 429, resetAtMs }`.
36
+ *
37
+ * @param {ModelTurnRequest} req - Turn request payload, wire prefix, and structured output schema.
38
+ *
39
+ * @returns {Promise<ModelTurnResponse>} Raw wire response, canonical message, structured output, and usage metrics.
40
+ *
41
+ * @throws {Error} On HTTP `429` rate limits, non-2xx statuses, aborted signals, or `outputSchema` validation failures.
42
+ */
43
+ invokeTurn(req: ModelTurnRequest): Promise<ModelTurnResponse>;
44
+ /**
45
+ * Synthesizes the initial `WireFrameRecord[]` chain for a downward fork or cross-model escalation.
46
+ *
47
+ * Preserves byte-identical `rawWireFrame` payloads with `cache_control: { type: 'ephemeral' }` when
48
+ * `target.substituteTombstones === false`, and re-projects `CanonicalMessage` frames with compacted
49
+ * tombstones when `target.substituteTombstones === true`.
50
+ *
51
+ * @param {ForkContext} ctx - Fork lineage, history mode, and assistant turn-batch pairing metadata.
52
+ * @param {PrepareForkTarget} target - Target model configuration and tombstone substitution flag.
53
+ *
54
+ * @returns {Promise<readonly WireFrameRecord[]>} Synthesized wire frame chain to persist in `LedgerStore`.
55
+ */
56
+ prepareFork(ctx: ForkContext, target: PrepareForkTarget): Promise<readonly WireFrameRecord[]>;
57
+ /**
58
+ * Appends synchronization or recovery notes in-place to an Anthropic `role: 'tool'` or `role: 'user'` frame.
59
+ *
60
+ * Updates both `rawWireFrame` and `frame.canonical` without breaking conversation role alternation.
61
+ *
62
+ * @param {WireFrameRecord} frame - Existing `tool` or `user` wire frame record.
63
+ * @param {readonly string[]} notes - Synchronization note strings to append.
64
+ * @param {string | undefined} targetCallId - Optional tool `callId` to target on a `tool` frame.
65
+ * @param {AppendToolResultNotesOptions | undefined} opts - Optional error status override.
66
+ *
67
+ * @returns {Promise<WireFrameRecord>} Updated wire frame record to persist via `LedgerStore.replaceMessageFrame()`.
68
+ */
69
+ appendToolResultNotes(frame: WireFrameRecord, notes: readonly string[], targetCallId?: string, opts?: AppendToolResultNotesOptions): Promise<WireFrameRecord>;
70
+ }
71
+ //# sourceMappingURL=claude-model-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-model-driver.d.ts","sourceRoot":"","sources":["../../src/driver/claude-model-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,eAAe,EACf,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AActE;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAG,WAAW,CAAU;IAEzC,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAG,WAAW,CAAU;IAEvC,0EAA0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAEhD,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAE7D;;;;;;;;OAQG;gBAED,SAAS,GAAE,mBAAgD,EAC3D,SAAS,CAAC,EAAE,eAAe,EAC3B,SAAS,CAAC,EAAE,oBAAoB;IAOlC;;;;;;;;;;;OAWG;IACG,UAAU,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwBnE;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;IAI7F;;;;;;;;;;;OAWG;IACH,qBAAqB,CACnB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,YAAY,CAAC,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,4BAA4B,GAClC,OAAO,CAAC,eAAe,CAAC;CAK5B"}
@@ -0,0 +1,105 @@
1
+ import { ANTHROPIC_MESSAGES_ENDPOINT, defaultClaudeHttpTransport, } from './default-claude-http-transport.constants.js';
2
+ import { claudeAppendToolResultNotes } from './internal/claude-append-tool-result-notes.js';
3
+ import { claudePrepareFork } from './internal/claude-prepare-fork.js';
4
+ import { buildAnthropicMessagesRequest, parseAnthropicMessagesResponse, } from './internal/claude-wire-converter.js';
5
+ import { extractClaudeResponseBody } from './internal/extract-claude-response-body.js';
6
+ import { resolveClaudeSeatAuth } from './internal/resolve-claude-seat-auth.js';
7
+ /**
8
+ * Runtime `ModelDriver` implementation for the Anthropic `/v1/messages` HTTP protocol (`@paraharness/claude`).
9
+ *
10
+ * Resolves CLI subscription `configDir` OAuth tokens and `EnvRef` API keys at turn invocation time,
11
+ * preserves `thinking` blocks and cryptographic `signature` fields in `rawWireFrame`, enforces native
12
+ * `output_config.format` JSON-schema structured output, and prepares KV-cache-preserving forks.
13
+ */
14
+ export class ClaudeModelDriver {
15
+ /** Primary vendor identifier (`'anthropic'`). */
16
+ vendorId = 'anthropic';
17
+ /** Vendor alias matching `vendorId` (`'anthropic'`). */
18
+ vendor = 'anthropic';
19
+ /** Underlying HTTP transport used to dispatch `/v1/messages` requests. */
20
+ transport;
21
+ /** Optional passive `ClaudeModelNode` bound to this driver instance. */
22
+ modelNode;
23
+ /** Optional runtime driver context providing `resolveEnv` for symbolic `EnvRef` keys. */
24
+ driverCtx;
25
+ /**
26
+ * Initializes a `ClaudeModelDriver` with an HTTP transport, optional `ClaudeModelNode`, and runtime context.
27
+ *
28
+ * Defers all credential and environment variable lookups until `invokeTurn()` is executed.
29
+ *
30
+ * @param {ClaudeHttpTransport} [transport=defaultClaudeHttpTransport] - HTTP transport for `/v1/messages`.
31
+ * @param {ClaudeModelNode | undefined} [modelNode] - Optional bound `ClaudeModelNode`.
32
+ * @param {RuntimeDriverContext | undefined} [driverCtx] - Optional runtime driver context.
33
+ */
34
+ constructor(transport = defaultClaudeHttpTransport, modelNode, driverCtx) {
35
+ this.transport = transport;
36
+ this.modelNode = modelNode;
37
+ this.driverCtx = driverCtx;
38
+ }
39
+ /**
40
+ * Invokes a single Anthropic `/v1/messages` turn over `req.history` and returns the raw wire frame and canonical projection.
41
+ *
42
+ * Validates HTTP status codes before parsing `bodyText` so non-JSON error payloads (`502 Bad Gateway`) never crash
43
+ * with `SyntaxError`, and propagates HTTP `429` rate-limit responses with `{ status: 429, resetAtMs }`.
44
+ *
45
+ * @param {ModelTurnRequest} req - Turn request payload, wire prefix, and structured output schema.
46
+ *
47
+ * @returns {Promise<ModelTurnResponse>} Raw wire response, canonical message, structured output, and usage metrics.
48
+ *
49
+ * @throws {Error} On HTTP `429` rate limits, non-2xx statuses, aborted signals, or `outputSchema` validation failures.
50
+ */
51
+ async invokeTurn(req) {
52
+ req.signal?.throwIfAborted();
53
+ const auth = resolveClaudeSeatAuth({
54
+ accountConfig: req.accountConfig,
55
+ modelNode: this.modelNode,
56
+ driverCtx: this.driverCtx,
57
+ });
58
+ const body = buildAnthropicMessagesRequest(req);
59
+ const response = await this.transport.sendMessagesRequest({
60
+ url: ANTHROPIC_MESSAGES_ENDPOINT,
61
+ headers: auth.headers,
62
+ body,
63
+ seatId: auth.seatId,
64
+ authSource: auth.authSource,
65
+ signal: req.signal,
66
+ });
67
+ const responseBody = extractClaudeResponseBody({
68
+ response,
69
+ modelId: req.modelId,
70
+ seatId: auth.seatId,
71
+ });
72
+ return parseAnthropicMessagesResponse(responseBody, req);
73
+ }
74
+ /**
75
+ * Synthesizes the initial `WireFrameRecord[]` chain for a downward fork or cross-model escalation.
76
+ *
77
+ * Preserves byte-identical `rawWireFrame` payloads with `cache_control: { type: 'ephemeral' }` when
78
+ * `target.substituteTombstones === false`, and re-projects `CanonicalMessage` frames with compacted
79
+ * tombstones when `target.substituteTombstones === true`.
80
+ *
81
+ * @param {ForkContext} ctx - Fork lineage, history mode, and assistant turn-batch pairing metadata.
82
+ * @param {PrepareForkTarget} target - Target model configuration and tombstone substitution flag.
83
+ *
84
+ * @returns {Promise<readonly WireFrameRecord[]>} Synthesized wire frame chain to persist in `LedgerStore`.
85
+ */
86
+ prepareFork(ctx, target) {
87
+ return Promise.resolve(claudePrepareFork(ctx, target));
88
+ }
89
+ /**
90
+ * Appends synchronization or recovery notes in-place to an Anthropic `role: 'tool'` or `role: 'user'` frame.
91
+ *
92
+ * Updates both `rawWireFrame` and `frame.canonical` without breaking conversation role alternation.
93
+ *
94
+ * @param {WireFrameRecord} frame - Existing `tool` or `user` wire frame record.
95
+ * @param {readonly string[]} notes - Synchronization note strings to append.
96
+ * @param {string | undefined} targetCallId - Optional tool `callId` to target on a `tool` frame.
97
+ * @param {AppendToolResultNotesOptions | undefined} opts - Optional error status override.
98
+ *
99
+ * @returns {Promise<WireFrameRecord>} Updated wire frame record to persist via `LedgerStore.replaceMessageFrame()`.
100
+ */
101
+ appendToolResultNotes(frame, notes, targetCallId, opts) {
102
+ return Promise.resolve(claudeAppendToolResultNotes({ frame, notes, targetCallId, opts }));
103
+ }
104
+ }
105
+ //# sourceMappingURL=claude-model-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-model-driver.js","sourceRoot":"","sources":["../../src/driver/claude-model-driver.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAE/E;;;;;;GAMG;AACH,MAAM,OAAO,iBAAiB;IAC5B,iDAAiD;IACxC,QAAQ,GAAG,WAAoB,CAAC;IAEzC,wDAAwD;IAC/C,MAAM,GAAG,WAAoB,CAAC;IAEvC,0EAA0E;IACzD,SAAS,CAAsB;IAEhD,wEAAwE;IACvD,SAAS,CAA8B;IAExD,yFAAyF;IACxE,SAAS,CAAmC;IAE7D;;;;;;;;OAQG;IACH,YACE,YAAiC,0BAA0B,EAC3D,SAA2B,EAC3B,SAAgC;QAEhC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,UAAU,CAAC,GAAqB;QACpC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,qBAAqB,CAAC;YACjC,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,6BAA6B,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;YACxD,GAAG,EAAE,2BAA2B;YAChC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI;YACJ,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,yBAAyB,CAAC;YAC7C,QAAQ;YACR,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,OAAO,8BAA8B,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,GAAgB,EAAE,MAAyB;QACrD,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;;;;;;OAWG;IACH,qBAAqB,CACnB,KAAsB,EACtB,KAAwB,EACxB,YAAqB,EACrB,IAAmC;QAEnC,OAAO,OAAO,CAAC,OAAO,CACpB,2BAA2B,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAClE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { RuntimeExecutorRegistrySlice } from '@paraharness/core';
2
+ import type { ClaudeHttpTransport } from './claude-http-transport.js';
3
+ /**
4
+ * Creates a `RuntimeExecutorRegistrySlice` registering `ClaudeModelDriver` for `'claude:model'` AST nodes.
5
+ *
6
+ * Accepts an optional custom `ClaudeHttpTransport` for deterministic testing while defaulting to
7
+ * `defaultClaudeHttpTransport` in production.
8
+ *
9
+ * @param {ClaudeHttpTransport} [transport=defaultClaudeHttpTransport] - HTTP transport used by `ClaudeModelDriver`.
10
+ *
11
+ * @returns {RuntimeExecutorRegistrySlice} Frozen executor registry slice with `models['claude:model']`.
12
+ */
13
+ export declare function createClaudeExecutors(transport?: ClaudeHttpTransport): RuntimeExecutorRegistrySlice;
14
+ //# sourceMappingURL=create-claude-executors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-claude-executors.d.ts","sourceRoot":"","sources":["../../src/driver/create-claude-executors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,4BAA4B,EAC7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAItE;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,GAAE,mBAAgD,GAC1D,4BAA4B,CAO9B"}
@@ -0,0 +1,20 @@
1
+ import { ClaudeModelDriver } from './claude-model-driver.js';
2
+ import { defaultClaudeHttpTransport } from './default-claude-http-transport.constants.js';
3
+ /**
4
+ * Creates a `RuntimeExecutorRegistrySlice` registering `ClaudeModelDriver` for `'claude:model'` AST nodes.
5
+ *
6
+ * Accepts an optional custom `ClaudeHttpTransport` for deterministic testing while defaulting to
7
+ * `defaultClaudeHttpTransport` in production.
8
+ *
9
+ * @param {ClaudeHttpTransport} [transport=defaultClaudeHttpTransport] - HTTP transport used by `ClaudeModelDriver`.
10
+ *
11
+ * @returns {RuntimeExecutorRegistrySlice} Frozen executor registry slice with `models['claude:model']`.
12
+ */
13
+ export function createClaudeExecutors(transport = defaultClaudeHttpTransport) {
14
+ return Object.freeze({
15
+ models: Object.freeze({
16
+ 'claude:model': (node, ctx) => new ClaudeModelDriver(transport, node, ctx),
17
+ }),
18
+ });
19
+ }
20
+ //# sourceMappingURL=create-claude-executors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-claude-executors.js","sourceRoot":"","sources":["../../src/driver/create-claude-executors.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAE1F;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAiC,0BAA0B;IAE3D,OAAO,MAAM,CAAC,MAAM,CAA+B;QACjD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YACpB,cAAc,EAAE,CAAC,IAAqB,EAAE,GAAyB,EAAqB,EAAE,CACtF,IAAI,iBAAiB,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC;SAC9C,CAAC;KACH,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ClaudeHttpTransport } from './claude-http-transport.js';
2
+ /** Default Anthropic Messages API HTTPS endpoint URL. */
3
+ export declare const ANTHROPIC_MESSAGES_ENDPOINT = "https://api.anthropic.com/v1/messages";
4
+ /** Default Anthropic API version header value. */
5
+ export declare const ANTHROPIC_API_VERSION = "2023-06-01";
6
+ /** Default `max_tokens` ceiling sent on Anthropic `/v1/messages` requests. */
7
+ export declare const DEFAULT_CLAUDE_MAX_TOKENS = 16384;
8
+ /** Extended thinking token budgets keyed by reasoning effort level (`'low' | 'medium' | 'high'`). */
9
+ export declare const CLAUDE_THINKING_BUDGETS: Readonly<Record<'low' | 'medium' | 'high', number>>;
10
+ /** Candidate credential filenames searched inside a Claude CLI `configDir`. */
11
+ export declare const CLAUDE_CREDENTIAL_FILENAMES: readonly string[];
12
+ /** Default `@anthropic-ai/sdk`-backed HTTP transport implementation for Anthropic `/v1/messages`. */
13
+ export declare const defaultClaudeHttpTransport: ClaudeHttpTransport;
14
+ //# sourceMappingURL=default-claude-http-transport.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-claude-http-transport.constants.d.ts","sourceRoot":"","sources":["../../src/driver/default-claude-http-transport.constants.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,yDAAyD;AACzD,eAAO,MAAM,2BAA2B,0CAA0C,CAAC;AAEnF,kDAAkD;AAClD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,qGAAqG;AACrG,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,GAAG,MAAM,EAAE,MAAM,CAAC,CAKpF,CAAC;AAEL,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAKvD,CAAC;AAEH,qGAAqG;AACrG,eAAO,MAAM,0BAA0B,EAAE,mBAevC,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { sendClaudeMessagesViaSdk } from './internal/send-claude-messages-via-sdk.js';
2
+ /** Default Anthropic Messages API HTTPS endpoint URL. */
3
+ export const ANTHROPIC_MESSAGES_ENDPOINT = 'https://api.anthropic.com/v1/messages';
4
+ /** Default Anthropic API version header value. */
5
+ export const ANTHROPIC_API_VERSION = '2023-06-01';
6
+ /** Default `max_tokens` ceiling sent on Anthropic `/v1/messages` requests. */
7
+ export const DEFAULT_CLAUDE_MAX_TOKENS = 16_384;
8
+ /** Extended thinking token budgets keyed by reasoning effort level (`'low' | 'medium' | 'high'`). */
9
+ export const CLAUDE_THINKING_BUDGETS = Object.freeze({
10
+ low: 2_048,
11
+ medium: 8_192,
12
+ high: 16_384,
13
+ });
14
+ /** Candidate credential filenames searched inside a Claude CLI `configDir`. */
15
+ export const CLAUDE_CREDENTIAL_FILENAMES = Object.freeze([
16
+ '.credentials.json',
17
+ 'credentials.json',
18
+ 'oauth.json',
19
+ 'auth.json',
20
+ ]);
21
+ /** Default `@anthropic-ai/sdk`-backed HTTP transport implementation for Anthropic `/v1/messages`. */
22
+ export const defaultClaudeHttpTransport = Object.freeze({
23
+ /**
24
+ * Dispatches a `/v1/messages` POST request via the official `@anthropic-ai/sdk` client.
25
+ *
26
+ * Forwards `request` directly to `sendClaudeMessagesViaSdk()`.
27
+ *
28
+ * @param {ClaudeHttpRequest} request - Wire-formatted Anthropic `/v1/messages` request.
29
+ *
30
+ * @returns {Promise<ClaudeHttpResponse>} HTTP status, parsed body, and optional `resetAtMs`.
31
+ *
32
+ * @throws {Error} If `request.signal` is aborted or a network transport exception occurs.
33
+ */
34
+ sendMessagesRequest(request) {
35
+ return sendClaudeMessagesViaSdk(request);
36
+ },
37
+ });
38
+ //# sourceMappingURL=default-claude-http-transport.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-claude-http-transport.constants.js","sourceRoot":"","sources":["../../src/driver/default-claude-http-transport.constants.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAEtF,yDAAyD;AACzD,MAAM,CAAC,MAAM,2BAA2B,GAAG,uCAAuC,CAAC;AAEnF,kDAAkD;AAClD,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAElD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,qGAAqG;AACrG,MAAM,CAAC,MAAM,uBAAuB,GAClC,MAAM,CAAC,MAAM,CAAC;IACZ,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,MAAM;CACb,CAAC,CAAC;AAEL,+EAA+E;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GAAsB,MAAM,CAAC,MAAM,CAAC;IAC1E,mBAAmB;IACnB,kBAAkB;IAClB,YAAY;IACZ,WAAW;CACZ,CAAC,CAAC;AAEH,qGAAqG;AACrG,MAAM,CAAC,MAAM,0BAA0B,GAAwB,MAAM,CAAC,MAAM,CAAsB;IAChG;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,OAA0B;QAC5C,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ForkContext, WireFrameRecord } from '@paraharness/core';
2
+ /**
3
+ * Synthesizes a single `role: 'tool'` `WireFrameRecord` pairing all `1..k` `toolCalls` on `forkPointFrame`.
4
+ *
5
+ * Maps preceding `(1..m)` calls from `ctx.precedingCompletedResults`, `ctx.forkCallId` to the child role
6
+ * context and task prompt, and all other calls in `(1..k)` to `"[Dispatched/Deferred in parent turn]"`.
7
+ *
8
+ * @param {ForkContext} ctx - Fork context carrying `forkCallId` and `precedingCompletedResults`.
9
+ * @param {WireFrameRecord} forkPointFrame - Assistant turn frame containing `toolCalls` `(1..k)`.
10
+ *
11
+ * @returns {WireFrameRecord} Synthesized `tool_result` wire frame pairing all `1..k` tool calls.
12
+ */
13
+ export declare function buildClaudePairedForkToolFrame(ctx: ForkContext, forkPointFrame: WireFrameRecord): WireFrameRecord;
14
+ //# sourceMappingURL=build-claude-paired-fork-tool-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-claude-paired-fork-tool-frame.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/build-claude-paired-fork-tool-frame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAEX,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,WAAW,EAChB,cAAc,EAAE,eAAe,GAC9B,eAAe,CA+CjB"}
@@ -0,0 +1,56 @@
1
+ import { projectCanonicalToAnthropicMessage } from './project-canonical-to-anthropic-message.js';
2
+ import { formatClaudeForkPromptText } from './format-claude-fork-prompt-text.js';
3
+ /**
4
+ * Synthesizes a single `role: 'tool'` `WireFrameRecord` pairing all `1..k` `toolCalls` on `forkPointFrame`.
5
+ *
6
+ * Maps preceding `(1..m)` calls from `ctx.precedingCompletedResults`, `ctx.forkCallId` to the child role
7
+ * context and task prompt, and all other calls in `(1..k)` to `"[Dispatched/Deferred in parent turn]"`.
8
+ *
9
+ * @param {ForkContext} ctx - Fork context carrying `forkCallId` and `precedingCompletedResults`.
10
+ * @param {WireFrameRecord} forkPointFrame - Assistant turn frame containing `toolCalls` `(1..k)`.
11
+ *
12
+ * @returns {WireFrameRecord} Synthesized `tool_result` wire frame pairing all `1..k` tool calls.
13
+ */
14
+ export function buildClaudePairedForkToolFrame(ctx, forkPointFrame) {
15
+ const precedingByCallId = new Map();
16
+ for (const precedingEntry of ctx.precedingCompletedResults ?? []) {
17
+ precedingByCallId.set(precedingEntry.callId, precedingEntry);
18
+ }
19
+ const combinedPrompt = formatClaudeForkPromptText(ctx);
20
+ const forkCallText = combinedPrompt.length > 0 ? combinedPrompt : '[Forked child session]';
21
+ const toolResults = [];
22
+ for (const call of forkPointFrame.canonical.toolCalls ?? []) {
23
+ const preceding = precedingByCallId.get(call.id);
24
+ if (preceding !== undefined) {
25
+ toolResults.push(Object.freeze({
26
+ callId: call.id,
27
+ content: preceding.content,
28
+ isError: Boolean(preceding.isError),
29
+ }));
30
+ }
31
+ else {
32
+ const content = call.id === ctx.forkCallId ? forkCallText : '[Dispatched/Deferred in parent turn]';
33
+ toolResults.push(Object.freeze({
34
+ callId: call.id,
35
+ content,
36
+ isError: false,
37
+ }));
38
+ }
39
+ }
40
+ const canonical = Object.freeze({
41
+ role: 'tool',
42
+ visibleText: '',
43
+ toolCalls: undefined,
44
+ toolResults: Object.freeze(toolResults),
45
+ });
46
+ return Object.freeze({
47
+ messageId: `${forkPointFrame.messageId}:fork-tools:${ctx.forkCallId ?? 'batch'}`,
48
+ parentMessageId: forkPointFrame.messageId,
49
+ vendorId: 'anthropic',
50
+ rawWireFrame: new TextEncoder().encode(JSON.stringify(projectCanonicalToAnthropicMessage(canonical))),
51
+ canonical,
52
+ prefixDigest: ctx.wirePrefix?.systemDigest ?? forkPointFrame.prefixDigest,
53
+ compactedTombstones: undefined,
54
+ });
55
+ }
56
+ //# sourceMappingURL=build-claude-paired-fork-tool-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-claude-paired-fork-tool-frame.js","sourceRoot":"","sources":["../../../src/driver/internal/build-claude-paired-fork-tool-frame.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kCAAkC,EAAE,MAAM,6CAA6C,CAAC;AACjG,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,8BAA8B,CAC5C,GAAgB,EAChB,cAA+B;IAE/B,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAwC,CAAC;IAC1E,KAAK,MAAM,cAAc,IAAI,GAAG,CAAC,yBAAyB,IAAI,EAAE,EAAE,CAAC;QACjE,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,cAAc,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,wBAAwB,CAAC;IAC3F,MAAM,WAAW,GAA0B,EAAE,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,WAAW,CAAC,IAAI,CACd,MAAM,CAAC,MAAM,CAAsB;gBACjC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;aACpC,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GACX,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,sCAAsC,CAAC;YACrF,WAAW,CAAC,IAAI,CACd,MAAM,CAAC,MAAM,CAAsB;gBACjC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO;gBACP,OAAO,EAAE,KAAK;aACf,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAmB;QAChD,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,SAAS;QACpB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;KACxC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAkB;QACpC,SAAS,EAAE,GAAG,cAAc,CAAC,SAAS,eAAe,GAAG,CAAC,UAAU,IAAI,OAAO,EAAE;QAChF,eAAe,EAAE,cAAc,CAAC,SAAS;QACzC,QAAQ,EAAE,WAAW;QACrB,YAAY,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CACpC,IAAI,CAAC,SAAS,CAAC,kCAAkC,CAAC,SAAS,CAAC,CAAC,CAC9D;QACD,SAAS;QACT,YAAY,EAAE,GAAG,CAAC,UAAU,EAAE,YAAY,IAAI,cAAc,CAAC,YAAY;QACzE,mBAAmB,EAAE,SAAS;KAC/B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { WireFrameRecord } from '@paraharness/core';
2
+ /**
3
+ * Parameters for constructing an Anthropic `role: 'user'` `WireFrameRecord` via `buildClaudeUserFrame()`.
4
+ *
5
+ * Supplies the message lineage identifiers and user prompt text content.
6
+ */
7
+ export interface BuildClaudeUserFrameParams {
8
+ /** Unique message frame identifier. */
9
+ readonly messageId: string;
10
+ /** Preceding message frame identifier, or `null` for Turn 0. */
11
+ readonly parentMessageId: string | null;
12
+ /** User prompt text content. */
13
+ readonly text: string;
14
+ }
15
+ /**
16
+ * Constructs a `role: 'user'` `WireFrameRecord` seeded with `params.text` for Turn-0 or fork-point context injection.
17
+ *
18
+ * Encodes both the Anthropic `{ role: 'user', content: [{ type: 'text', text }] }` wire JSON and
19
+ * the canonical user message representation.
20
+ *
21
+ * @param {BuildClaudeUserFrameParams} params - Message ID, parent message ID, and user prompt text.
22
+ *
23
+ * @returns {WireFrameRecord} Frozen user `WireFrameRecord` for Anthropic `/v1/messages`.
24
+ */
25
+ export declare function buildClaudeUserFrame(params: BuildClaudeUserFrameParams): WireFrameRecord;
26
+ //# sourceMappingURL=build-claude-user-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-claude-user-frame.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/build-claude-user-frame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG3E;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,uCAAuC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,eAAe,CAkBxF"}
@@ -0,0 +1,29 @@
1
+ import { projectCanonicalToAnthropicMessage } from './project-canonical-to-anthropic-message.js';
2
+ /**
3
+ * Constructs a `role: 'user'` `WireFrameRecord` seeded with `params.text` for Turn-0 or fork-point context injection.
4
+ *
5
+ * Encodes both the Anthropic `{ role: 'user', content: [{ type: 'text', text }] }` wire JSON and
6
+ * the canonical user message representation.
7
+ *
8
+ * @param {BuildClaudeUserFrameParams} params - Message ID, parent message ID, and user prompt text.
9
+ *
10
+ * @returns {WireFrameRecord} Frozen user `WireFrameRecord` for Anthropic `/v1/messages`.
11
+ */
12
+ export function buildClaudeUserFrame(params) {
13
+ const canonical = Object.freeze({
14
+ role: 'user',
15
+ visibleText: params.text,
16
+ toolCalls: undefined,
17
+ toolResults: undefined,
18
+ });
19
+ return Object.freeze({
20
+ messageId: params.messageId,
21
+ parentMessageId: params.parentMessageId,
22
+ vendorId: 'anthropic',
23
+ rawWireFrame: new TextEncoder().encode(JSON.stringify(projectCanonicalToAnthropicMessage(canonical))),
24
+ canonical,
25
+ prefixDigest: 'fork-seed',
26
+ compactedTombstones: undefined,
27
+ });
28
+ }
29
+ //# sourceMappingURL=build-claude-user-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-claude-user-frame.js","sourceRoot":"","sources":["../../../src/driver/internal/build-claude-user-frame.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kCAAkC,EAAE,MAAM,6CAA6C,CAAC;AAgBjG;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAkC;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAmB;QAChD,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,SAAS,EAAE,SAAS;QACpB,WAAW,EAAE,SAAS;KACvB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAkB;QACpC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,QAAQ,EAAE,WAAW;QACrB,YAAY,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CACpC,IAAI,CAAC,SAAS,CAAC,kCAAkC,CAAC,SAAS,CAAC,CAAC,CAC9D;QACD,SAAS;QACT,YAAY,EAAE,WAAW;QACzB,mBAAmB,EAAE,SAAS;KAC/B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { AppendToolResultNotesOptions, WireFrameRecord } from '@paraharness/core';
2
+ /**
3
+ * Parameters for appending synchronization or recovery notes to an Anthropic `WireFrameRecord`.
4
+ *
5
+ * Supplies the target frame, note strings, optional `targetCallId`, and optional error flag override.
6
+ */
7
+ export interface ClaudeAppendToolResultNotesParams {
8
+ /** Existing `tool` or `user` wire frame record to update. */
9
+ readonly frame: WireFrameRecord;
10
+ /** Synchronization or recovery note strings to append. */
11
+ readonly notes: readonly string[];
12
+ /** Optional tool `callId` to target on a `role: 'tool'` frame. */
13
+ readonly targetCallId: string | undefined;
14
+ /** Optional error status override (`{ isError?: boolean }`). */
15
+ readonly opts: AppendToolResultNotesOptions | undefined;
16
+ }
17
+ /**
18
+ * Appends synchronization or recovery notes in-place to an Anthropic `tool` or `user` `WireFrameRecord`.
19
+ *
20
+ * Updates both `frame.canonical` and `frame.rawWireFrame`, targeting `targetCallId` (or the last
21
+ * `tool_result` block) on `role: 'tool'` frames and setting `is_error: true` when `opts?.isError === true`.
22
+ *
23
+ * @param {ClaudeAppendToolResultNotesParams} params - Frame, notes, optional target `callId`, and options.
24
+ *
25
+ * @returns {WireFrameRecord} Updated wire frame record with appended notes.
26
+ */
27
+ export declare function claudeAppendToolResultNotes(params: ClaudeAppendToolResultNotesParams): WireFrameRecord;
28
+ //# sourceMappingURL=claude-append-tool-result-notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-append-tool-result-notes.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/claude-append-tool-result-notes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAG5B,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAG3B;;;;GAIG;AACH,MAAM,WAAW,iCAAiC;IAChD,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,4BAA4B,GAAG,SAAS,CAAC;CACzD;AA2HD;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,iCAAiC,GACxC,eAAe,CAkBjB"}
@@ -0,0 +1,124 @@
1
+ import { projectCanonicalToAnthropicMessage } from './project-canonical-to-anthropic-message.js';
2
+ /**
3
+ * Resolves the index of the `CanonicalToolResult` entry targeted by `targetCallId` (defaulting to the last entry).
4
+ *
5
+ * Falls back to `results.length - 1` when `targetCallId` is `undefined` or does not match an entry.
6
+ *
7
+ * @param {readonly CanonicalToolResult[]} results - Existing tool result array on the frame.
8
+ * @param {string | undefined} targetCallId - Optional tool `callId` to locate.
9
+ *
10
+ * @returns {number} Target index inside `results`.
11
+ */
12
+ function findClaudeTargetToolResultIndex(results, targetCallId) {
13
+ if (targetCallId === undefined) {
14
+ return results.length - 1;
15
+ }
16
+ for (let idx = 0; idx < results.length; idx += 1) {
17
+ if (results[idx]?.callId === targetCallId) {
18
+ return idx;
19
+ }
20
+ }
21
+ return results.length - 1;
22
+ }
23
+ /**
24
+ * Appends `suffix` to a single `CanonicalToolResult` entry and applies `opts?.isError` when present.
25
+ *
26
+ * Returns a new frozen `CanonicalToolResult` with the updated content and error flag.
27
+ *
28
+ * @param {CanonicalToolResult} toolResult - Original tool result entry.
29
+ * @param {string} suffix - Joined note string to append.
30
+ * @param {AppendToolResultNotesOptions | undefined} opts - Optional error status override.
31
+ *
32
+ * @returns {CanonicalToolResult} Updated frozen tool result entry.
33
+ */
34
+ function appendSuffixToClaudeToolResult(toolResult, suffix, opts) {
35
+ const nextContent = toolResult.content.length > 0 ? `${toolResult.content}\n${suffix}` : suffix;
36
+ const nextError = opts?.isError !== undefined ? opts.isError : toolResult.isError;
37
+ return Object.freeze({
38
+ callId: toolResult.callId,
39
+ content: nextContent,
40
+ isError: nextError,
41
+ });
42
+ }
43
+ /**
44
+ * Rebuilds a `CanonicalToolResult[]` array with `suffix` appended to the entry matching `params.targetCallId` (or the last entry).
45
+ *
46
+ * Returns a frozen `CanonicalToolResult[]` array preserving all non-targeted tool results unchanged.
47
+ *
48
+ * @param {readonly CanonicalToolResult[]} results - Existing tool result array on the frame.
49
+ * @param {string} suffix - Joined synchronization note string to append.
50
+ * @param {ClaudeAppendToolResultNotesParams} params - Frame, notes, optional target `callId`, and options.
51
+ *
52
+ * @returns {readonly CanonicalToolResult[]} Frozen updated tool result array.
53
+ */
54
+ function rebuildClaudeToolResultsWithSuffix(results, suffix, params) {
55
+ const targetIdx = findClaudeTargetToolResultIndex(results, params.targetCallId);
56
+ const updatedResults = [];
57
+ for (let idx = 0; idx < results.length; idx += 1) {
58
+ const toolResult = results[idx];
59
+ if (toolResult !== undefined) {
60
+ updatedResults.push(idx === targetIdx
61
+ ? appendSuffixToClaudeToolResult(toolResult, suffix, params.opts)
62
+ : toolResult);
63
+ }
64
+ }
65
+ return Object.freeze(updatedResults);
66
+ }
67
+ /**
68
+ * Projects an updated `CanonicalMessage` with `suffix` appended to either the targeted `tool` result or the `user` visible text.
69
+ *
70
+ * Preserves all non-targeted `CanonicalMessage` fields in a fixed monomorphic property order.
71
+ *
72
+ * @param {ClaudeAppendToolResultNotesParams} params - Frame, notes, optional target `callId`, and options.
73
+ * @param {string} suffix - Joined synchronization note string to append.
74
+ *
75
+ * @returns {CanonicalMessage} Frozen updated canonical message.
76
+ */
77
+ function appendNotesToClaudeCanonicalMessage(params, suffix) {
78
+ const { frame } = params;
79
+ if (frame.canonical.role === 'tool' && frame.canonical.toolResults !== undefined) {
80
+ return Object.freeze({
81
+ role: frame.canonical.role,
82
+ visibleText: frame.canonical.visibleText,
83
+ toolCalls: frame.canonical.toolCalls,
84
+ toolResults: rebuildClaudeToolResultsWithSuffix(frame.canonical.toolResults, suffix, params),
85
+ });
86
+ }
87
+ const nextText = frame.canonical.visibleText.length > 0
88
+ ? `${frame.canonical.visibleText}\n${suffix}`
89
+ : suffix;
90
+ return Object.freeze({
91
+ role: 'user',
92
+ visibleText: nextText,
93
+ toolCalls: frame.canonical.toolCalls,
94
+ toolResults: frame.canonical.toolResults,
95
+ });
96
+ }
97
+ /**
98
+ * Appends synchronization or recovery notes in-place to an Anthropic `tool` or `user` `WireFrameRecord`.
99
+ *
100
+ * Updates both `frame.canonical` and `frame.rawWireFrame`, targeting `targetCallId` (or the last
101
+ * `tool_result` block) on `role: 'tool'` frames and setting `is_error: true` when `opts?.isError === true`.
102
+ *
103
+ * @param {ClaudeAppendToolResultNotesParams} params - Frame, notes, optional target `callId`, and options.
104
+ *
105
+ * @returns {WireFrameRecord} Updated wire frame record with appended notes.
106
+ */
107
+ export function claudeAppendToolResultNotes(params) {
108
+ const { frame, notes } = params;
109
+ if (notes.length === 0) {
110
+ return frame;
111
+ }
112
+ const canonical = appendNotesToClaudeCanonicalMessage(params, notes.join('\n'));
113
+ const rawWireFrame = new TextEncoder().encode(JSON.stringify(projectCanonicalToAnthropicMessage(canonical)));
114
+ return Object.freeze({
115
+ messageId: frame.messageId,
116
+ parentMessageId: frame.parentMessageId,
117
+ vendorId: frame.vendorId,
118
+ rawWireFrame,
119
+ canonical,
120
+ prefixDigest: frame.prefixDigest,
121
+ compactedTombstones: frame.compactedTombstones,
122
+ });
123
+ }
124
+ //# sourceMappingURL=claude-append-tool-result-notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-append-tool-result-notes.js","sourceRoot":"","sources":["../../../src/driver/internal/claude-append-tool-result-notes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ForkContext, PrepareForkTarget, WireFrameRecord } from '@paraharness/core';
2
+ /**
3
+ * Synthesizes the initial `WireFrameRecord[]` chain for an Anthropic downward fork or cross-model escalation.
4
+ *
5
+ * Handles `'shared-prefix-only'` clean starts, `'clone-transcript'` with `substituteTombstones` (`false` vs `true`),
6
+ * and full-turn `(1..k)` `tool_result` pairing whenever `ctx.forkCallId` is set on an assistant tool-call turn.
7
+ *
8
+ * @param {ForkContext} ctx - Fork lineage, history mode, and assistant turn-batch metadata.
9
+ * @param {PrepareForkTarget} target - Target model configuration and `substituteTombstones` flag.
10
+ *
11
+ * @returns {readonly WireFrameRecord[]} Synthesized wire frame chain to persist in `LedgerStore`.
12
+ */
13
+ export declare function claudePrepareFork(ctx: ForkContext, target: PrepareForkTarget): readonly WireFrameRecord[];
14
+ //# sourceMappingURL=claude-prepare-fork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-prepare-fork.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/claude-prepare-fork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOzF;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,iBAAiB,GACxB,SAAS,eAAe,EAAE,CAgD5B"}