@paraharness/claude 0.0.0-stage → 0.1.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 +48 -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 @@
1
+ {"version":3,"file":"extract-oauth-token-from-config-dir.js","sourceRoot":"","sources":["../../../src/driver/internal/extract-oauth-token-from-config-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAE5F;;;;;;;;GAQG;AACH,SAAS,yBAAyB,CAAC,SAAiB;IAClD,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,4BAA4B,CAAC,WAAmB;IACvD,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,QAAQ,IAAI,2BAA2B,EAAE,CAAC;QACnD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,6BAA6B,CAAC,OAAe;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsC,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAkD,CAAC;QACxF,MAAM,KAAK,GACT,MAAM,EAAE,CAAC,aAAa,CAAC;YACvB,MAAM,CAAC,aAAa,CAAC;YACrB,MAAM,CAAC,cAAc,CAAC;YACtB,MAAM,CAAC,YAAY,CAAC;YACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,8BAA8B,CAAC,SAAiB;IAC9D,MAAM,WAAW,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,cAAc,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;IACjE,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { CanonicalToolCall } from '@paraharness/core';
2
+ /**
3
+ * Extracted content blocks, visible text, and canonical tool calls from an Anthropic `/v1/messages` response.
4
+ *
5
+ * Returned by `extractAnthropicContentBlocks()` and consumed by `parseAnthropicMessagesResponse()`.
6
+ */
7
+ export interface ExtractedAnthropicContentBlocks {
8
+ /** Raw `content` array returned by `/v1/messages` (preserving `thinking` + `signature` blocks). */
9
+ readonly rawContent: readonly Readonly<Record<string, unknown>>[];
10
+ /** Concatenated visible text from `{ type: 'text' }` blocks. */
11
+ readonly visibleText: string;
12
+ /** Extracted canonical tool call descriptors from `{ type: 'tool_use' }` blocks. */
13
+ readonly toolCalls: readonly CanonicalToolCall[];
14
+ }
15
+ //# sourceMappingURL=extracted-anthropic-content-blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extracted-anthropic-content-blocks.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/extracted-anthropic-content-blocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,WAAW,+BAA+B;IAC9C,mGAAmG;IACnG,QAAQ,CAAC,UAAU,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IAClE,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extracted-anthropic-content-blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extracted-anthropic-content-blocks.js","sourceRoot":"","sources":["../../../src/driver/internal/extracted-anthropic-content-blocks.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { ForkContext } from '@paraharness/core';
2
+ /**
3
+ * Formats the combined child role context and task prompt text for a forked Claude child session.
4
+ *
5
+ * Joins `ctx.childRoleContextFrameText` and `ctx.childTaskPromptText` with a blank line when both are present.
6
+ *
7
+ * @param {ForkContext} ctx - Fork preparation context carrying child role context and task prompt text.
8
+ *
9
+ * @returns {string} Combined prompt text, or `''` when neither is present.
10
+ */
11
+ export declare function formatClaudeForkPromptText(ctx: ForkContext): string;
12
+ //# sourceMappingURL=format-claude-fork-prompt-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-claude-fork-prompt-text.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/format-claude-fork-prompt-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CASnE"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Formats the combined child role context and task prompt text for a forked Claude child session.
3
+ *
4
+ * Joins `ctx.childRoleContextFrameText` and `ctx.childTaskPromptText` with a blank line when both are present.
5
+ *
6
+ * @param {ForkContext} ctx - Fork preparation context carrying child role context and task prompt text.
7
+ *
8
+ * @returns {string} Combined prompt text, or `''` when neither is present.
9
+ */
10
+ export function formatClaudeForkPromptText(ctx) {
11
+ const parts = [];
12
+ if (ctx.childRoleContextFrameText !== undefined && ctx.childRoleContextFrameText.length > 0) {
13
+ parts.push(ctx.childRoleContextFrameText);
14
+ }
15
+ if (ctx.childTaskPromptText !== undefined && ctx.childTaskPromptText.length > 0) {
16
+ parts.push(ctx.childTaskPromptText);
17
+ }
18
+ return parts.join('\n\n');
19
+ }
20
+ //# sourceMappingURL=format-claude-fork-prompt-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-claude-fork-prompt-text.js","sourceRoot":"","sources":["../../../src/driver/internal/format-claude-fork-prompt-text.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAAgB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,GAAG,CAAC,yBAAyB,KAAK,SAAS,IAAI,GAAG,CAAC,yBAAyB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5F,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,GAAG,CAAC,mBAAmB,KAAK,SAAS,IAAI,GAAG,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Parses an HTTP `retry-after` header value in seconds into an epoch timestamp in milliseconds.
3
+ *
4
+ * Returns `undefined` when the header is absent, empty, or not a finite number.
5
+ *
6
+ * @param {string | null | undefined} retryAfterHeader - Raw `retry-after` header string.
7
+ *
8
+ * @returns {number | undefined} Epoch timestamp in milliseconds when the rate-limit window resets.
9
+ */
10
+ export declare function parseClaudeRetryAfterResetAtMs(retryAfterHeader: string | null | undefined): number | undefined;
11
+ //# sourceMappingURL=parse-claude-retry-after-reset-at-ms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-claude-retry-after-reset-at-ms.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/parse-claude-retry-after-reset-at-ms.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAC5C,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,MAAM,GAAG,SAAS,CAapB"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Parses an HTTP `retry-after` header value in seconds into an epoch timestamp in milliseconds.
3
+ *
4
+ * Returns `undefined` when the header is absent, empty, or not a finite number.
5
+ *
6
+ * @param {string | null | undefined} retryAfterHeader - Raw `retry-after` header string.
7
+ *
8
+ * @returns {number | undefined} Epoch timestamp in milliseconds when the rate-limit window resets.
9
+ */
10
+ export function parseClaudeRetryAfterResetAtMs(retryAfterHeader) {
11
+ if (retryAfterHeader === null ||
12
+ retryAfterHeader === undefined ||
13
+ retryAfterHeader.trim().length === 0) {
14
+ return undefined;
15
+ }
16
+ const seconds = Number(retryAfterHeader);
17
+ if (!Number.isFinite(seconds)) {
18
+ return undefined;
19
+ }
20
+ return Date.now() + seconds * 1_000;
21
+ }
22
+ //# sourceMappingURL=parse-claude-retry-after-reset-at-ms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-claude-retry-after-reset-at-ms.js","sourceRoot":"","sources":["../../../src/driver/internal/parse-claude-retry-after-reset-at-ms.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,8BAA8B,CAC5C,gBAA2C;IAE3C,IACE,gBAAgB,KAAK,IAAI;QACzB,gBAAgB,KAAK,SAAS;QAC9B,gBAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EACpC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC;AACtC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { CanonicalMessage } from '@paraharness/core';
2
+ /**
3
+ * Projects a vendor-neutral `CanonicalMessage` into an Anthropic `/v1/messages` wire message object.
4
+ *
5
+ * Omits `{ type: 'text' }` blocks on `assistant` messages whenever `canonical.visibleText === ''`
6
+ * and `canonical.toolCalls` is non-empty so Anthropic never rejects empty text blocks.
7
+ *
8
+ * @param {CanonicalMessage} canonical - Vendor-neutral canonical message to project.
9
+ *
10
+ * @returns {Readonly<Record<string, unknown>>} Anthropic wire message with `role` and `content` array.
11
+ */
12
+ export declare function projectCanonicalToAnthropicMessage(canonical: CanonicalMessage): Readonly<Record<string, unknown>>;
13
+ //# sourceMappingURL=project-canonical-to-anthropic-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-canonical-to-anthropic-message.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/project-canonical-to-anthropic-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,mBAAmB,CAAC;AAgE/E;;;;;;;;;GASG;AACH,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,gBAAgB,GAC1B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAenC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Projects a single `CanonicalToolResult` into an Anthropic `tool_result` content block.
3
+ *
4
+ * Sets `is_error: true` only when `toolResult.isError` is `true`.
5
+ *
6
+ * @param {CanonicalToolResult} toolResult - Canonical tool execution result entry.
7
+ *
8
+ * @returns {Readonly<Record<string, unknown>>} Frozen Anthropic `tool_result` block.
9
+ */
10
+ function buildAnthropicToolResultBlock(toolResult) {
11
+ if (toolResult.isError) {
12
+ return Object.freeze({
13
+ type: 'tool_result',
14
+ tool_use_id: toolResult.callId,
15
+ content: toolResult.content,
16
+ is_error: true,
17
+ });
18
+ }
19
+ return Object.freeze({
20
+ type: 'tool_result',
21
+ tool_use_id: toolResult.callId,
22
+ content: toolResult.content,
23
+ });
24
+ }
25
+ /**
26
+ * Projects an `assistant` `CanonicalMessage` into an Anthropic `{ role: 'assistant', content }` wire object.
27
+ *
28
+ * Omits `{ type: 'text' }` blocks whenever `canonical.visibleText === ''` and `canonical.toolCalls`
29
+ * is non-empty so Anthropic never rejects empty text blocks.
30
+ *
31
+ * @param {CanonicalMessage} canonical - Assistant canonical message.
32
+ *
33
+ * @returns {Readonly<Record<string, unknown>>} Frozen Anthropic assistant message object.
34
+ */
35
+ function projectAnthropicAssistantMessage(canonical) {
36
+ const blocks = [];
37
+ const hasToolCalls = (canonical.toolCalls?.length ?? 0) > 0;
38
+ if (canonical.visibleText.length > 0 || !hasToolCalls) {
39
+ blocks.push(Object.freeze({ type: 'text', text: canonical.visibleText }));
40
+ }
41
+ for (const call of canonical.toolCalls ?? []) {
42
+ const parsedInput = call.argsJson.trim().length > 0
43
+ ? JSON.parse(call.argsJson)
44
+ : {};
45
+ blocks.push(Object.freeze({
46
+ type: 'tool_use',
47
+ id: call.id,
48
+ name: call.name,
49
+ input: parsedInput,
50
+ }));
51
+ }
52
+ return Object.freeze({ role: 'assistant', content: Object.freeze(blocks) });
53
+ }
54
+ /**
55
+ * Projects a vendor-neutral `CanonicalMessage` into an Anthropic `/v1/messages` wire message object.
56
+ *
57
+ * Omits `{ type: 'text' }` blocks on `assistant` messages whenever `canonical.visibleText === ''`
58
+ * and `canonical.toolCalls` is non-empty so Anthropic never rejects empty text blocks.
59
+ *
60
+ * @param {CanonicalMessage} canonical - Vendor-neutral canonical message to project.
61
+ *
62
+ * @returns {Readonly<Record<string, unknown>>} Anthropic wire message with `role` and `content` array.
63
+ */
64
+ export function projectCanonicalToAnthropicMessage(canonical) {
65
+ if (canonical.role === 'tool') {
66
+ const blocks = [];
67
+ for (const toolResult of canonical.toolResults ?? []) {
68
+ blocks.push(buildAnthropicToolResultBlock(toolResult));
69
+ }
70
+ return Object.freeze({ role: 'user', content: Object.freeze(blocks) });
71
+ }
72
+ if (canonical.role === 'assistant') {
73
+ return projectAnthropicAssistantMessage(canonical);
74
+ }
75
+ return Object.freeze({
76
+ role: 'user',
77
+ content: Object.freeze([Object.freeze({ type: 'text', text: canonical.visibleText })]),
78
+ });
79
+ }
80
+ //# sourceMappingURL=project-canonical-to-anthropic-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-canonical-to-anthropic-message.js","sourceRoot":"","sources":["../../../src/driver/internal/project-canonical-to-anthropic-message.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,SAAS,6BAA6B,CACpC,UAA+B;IAE/B,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,UAAU,CAAC,MAAM;YAC9B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,UAAU,CAAC,MAAM;QAC9B,OAAO,EAAE,UAAU,CAAC,OAAO;KAC5B,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,gCAAgC,CACvC,SAA2B;IAE3B,MAAM,MAAM,GAAwC,EAAE,CAAC;IACvD,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5D,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,WAAW,GACf,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC7B,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAuC;YAClE,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,UAAU;YAChB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,WAAW;SACnB,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kCAAkC,CAChD,SAA2B;IAE3B,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAwC,EAAE,CAAC;QACvD,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,UAAU,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,gCAAgC,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;KACvF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Derives the base URL passed to `new Anthropic({ baseURL })` from a `/v1/messages` endpoint URL.
3
+ *
4
+ * Strips a trailing `/v1/messages` or `/messages` path segment so `client.post('/v1/messages')` resolves cleanly.
5
+ *
6
+ * @param {string} endpointUrl - Full Anthropic `/v1/messages` endpoint URL.
7
+ *
8
+ * @returns {string} Normalized base URL for the `@anthropic-ai/sdk` client.
9
+ */
10
+ export declare function resolveAnthropicSdkBaseUrl(endpointUrl: string): string;
11
+ //# sourceMappingURL=resolve-anthropic-sdk-base-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-anthropic-sdk-base-url.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/resolve-anthropic-sdk-base-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQtE"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Derives the base URL passed to `new Anthropic({ baseURL })` from a `/v1/messages` endpoint URL.
3
+ *
4
+ * Strips a trailing `/v1/messages` or `/messages` path segment so `client.post('/v1/messages')` resolves cleanly.
5
+ *
6
+ * @param {string} endpointUrl - Full Anthropic `/v1/messages` endpoint URL.
7
+ *
8
+ * @returns {string} Normalized base URL for the `@anthropic-ai/sdk` client.
9
+ */
10
+ export function resolveAnthropicSdkBaseUrl(endpointUrl) {
11
+ if (endpointUrl.endsWith('/v1/messages')) {
12
+ return endpointUrl.slice(0, -'/v1/messages'.length);
13
+ }
14
+ if (endpointUrl.endsWith('/messages')) {
15
+ return endpointUrl.slice(0, -'/messages'.length);
16
+ }
17
+ return endpointUrl;
18
+ }
19
+ //# sourceMappingURL=resolve-anthropic-sdk-base-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-anthropic-sdk-base-url.js","sourceRoot":"","sources":["../../../src/driver/internal/resolve-anthropic-sdk-base-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAC5D,IAAI,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACzC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ModelTurnRequest } from '@paraharness/core';
2
+ /**
3
+ * Resolves the wire tool schemas for `req` from `CompiledWirePrefix` or `req.wireToolSchemas`.
4
+ *
5
+ * Preserves identical tool definitions across both `'auto'` and `'none'` tool-choice turns so
6
+ * Anthropic's KV prefix cache remains valid during epistemic flush turns.
7
+ *
8
+ * @param {ModelTurnRequest} req - Turn request containing `wirePrefix`, `roleKey`, and `wireToolSchemas`.
9
+ *
10
+ * @returns {readonly Readonly<Record<string, unknown>>[]} Anthropic wire tool descriptors.
11
+ */
12
+ export declare function resolveAnthropicWireTools(req: ModelTurnRequest): readonly Readonly<Record<string, unknown>>[];
13
+ //# sourceMappingURL=resolve-anthropic-wire-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-anthropic-wire-tools.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/resolve-anthropic-wire-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,mBAAmB,CAAC;AAE1E;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,gBAAgB,GACpB,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAgB9C"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Resolves the wire tool schemas for `req` from `CompiledWirePrefix` or `req.wireToolSchemas`.
3
+ *
4
+ * Preserves identical tool definitions across both `'auto'` and `'none'` tool-choice turns so
5
+ * Anthropic's KV prefix cache remains valid during epistemic flush turns.
6
+ *
7
+ * @param {ModelTurnRequest} req - Turn request containing `wirePrefix`, `roleKey`, and `wireToolSchemas`.
8
+ *
9
+ * @returns {readonly Readonly<Record<string, unknown>>[]} Anthropic wire tool descriptors.
10
+ */
11
+ export function resolveAnthropicWireTools(req) {
12
+ const byRole = req.wirePrefix?.wireToolSchemasByRoleKey;
13
+ const roleTools = req.roleKey !== undefined ? byRole?.[req.roleKey] : undefined;
14
+ const schemas = roleTools ?? byRole?.['*'] ?? req.wireToolSchemas ?? [];
15
+ const tools = [];
16
+ for (const schema of schemas) {
17
+ tools.push(Object.freeze({
18
+ name: schema.name,
19
+ description: schema.description,
20
+ input_schema: schema.inputJsonSchema,
21
+ }));
22
+ }
23
+ return Object.freeze(tools);
24
+ }
25
+ //# sourceMappingURL=resolve-anthropic-wire-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-anthropic-wire-tools.js","sourceRoot":"","sources":["../../../src/driver/internal/resolve-anthropic-wire-tools.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CACvC,GAAqB;IAErB,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,EAAE,wBAAwB,CAAC;IACxD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,MAAM,OAAO,GACX,SAAS,IAAI,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;IAC1D,MAAM,KAAK,GAAwC,EAAE,CAAC;IACtD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,eAAe;SACrC,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { ClaudeModelNode, RuntimeDriverContext } from '@paraharness/core';
2
+ import type { ClaudeSeatAuth } from './claude-seat-auth.js';
3
+ /**
4
+ * Parameters for resolving Anthropic seat credentials via `resolveClaudeSeatAuth()`.
5
+ *
6
+ * Supplies the turn-level `accountConfig`, the bound `ClaudeModelNode`, and the optional
7
+ * `RuntimeDriverContext` used to resolve symbolic `EnvRef` keys.
8
+ */
9
+ export interface ResolveClaudeSeatAuthParams {
10
+ /** Optional seat configuration passed on `ModelTurnRequest.accountConfig`. */
11
+ readonly accountConfig: unknown;
12
+ /** Optional bound `ClaudeModelNode` carrying an `accountPool`. */
13
+ readonly modelNode: ClaudeModelNode | undefined;
14
+ /** Optional runtime driver context providing `resolveEnv`. */
15
+ readonly driverCtx: RuntimeDriverContext | undefined;
16
+ }
17
+ /**
18
+ * Resolves Anthropic authentication headers and seat metadata for a single turn invocation.
19
+ *
20
+ * Prioritizes OAuth credentials extracted from `seat.configDir` and falls back to `seat.apiKey`
21
+ * (or the model pool's fallback seat `apiKey`) resolved via `params.driverCtx?.resolveEnv`.
22
+ *
23
+ * @param {ResolveClaudeSeatAuthParams} params - Seat configuration, model node, and runtime driver context.
24
+ *
25
+ * @returns {ClaudeSeatAuth} Resolved `seatId`, `authSource`, and HTTP `headers`.
26
+ */
27
+ export declare function resolveClaudeSeatAuth(params: ResolveClaudeSeatAuthParams): ClaudeSeatAuth;
28
+ //# sourceMappingURL=resolve-claude-seat-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-claude-seat-auth.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/resolve-claude-seat-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EACf,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC1C,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,SAAS,CAAC;IAChD,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,SAAS,CAAC;CACtD;AA8CD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,2BAA2B,GAAG,cAAc,CAmCzF"}
@@ -0,0 +1,85 @@
1
+ import { ANTHROPIC_API_VERSION } from '../default-claude-http-transport.constants.js';
2
+ import { extractOAuthTokenFromConfigDir } from './extract-oauth-token-from-config-dir.js';
3
+ /**
4
+ * Attempts to resolve OAuth bearer authentication from `candidateSeat.configDir`.
5
+ *
6
+ * Returns `undefined` when `configDir` is absent or when `configDir` is missing on disk and a fallback
7
+ * `apiKey` is configured on either the seat or the model pool's `fallbackItem`.
8
+ *
9
+ * @param {ClaudeAccountSeatNode | undefined} candidateSeat - Active candidate account seat.
10
+ * @param {ClaudeAccountSeatNode | undefined} fallbackSeat - Pool fallback account seat, if configured.
11
+ *
12
+ * @returns {ClaudeSeatAuth | undefined} Resolved OAuth seat auth, or `undefined` to fall back to `apiKey`.
13
+ */
14
+ function tryResolveClaudeOAuthSeat(candidateSeat, fallbackSeat) {
15
+ if (candidateSeat?.configDir === undefined) {
16
+ return undefined;
17
+ }
18
+ const diskToken = extractOAuthTokenFromConfigDir(candidateSeat.configDir);
19
+ if (diskToken !== undefined) {
20
+ return Object.freeze({
21
+ seatId: candidateSeat.id,
22
+ authSource: 'cli-oauth',
23
+ headers: Object.freeze({
24
+ 'content-type': 'application/json',
25
+ 'anthropic-version': ANTHROPIC_API_VERSION,
26
+ authorization: `Bearer ${diskToken}`,
27
+ }),
28
+ });
29
+ }
30
+ if (candidateSeat.apiKey !== undefined || fallbackSeat?.apiKey !== undefined) {
31
+ return undefined;
32
+ }
33
+ return Object.freeze({
34
+ seatId: candidateSeat.id,
35
+ authSource: 'cli-oauth',
36
+ headers: Object.freeze({
37
+ 'content-type': 'application/json',
38
+ 'anthropic-version': ANTHROPIC_API_VERSION,
39
+ authorization: `Bearer oauth:${candidateSeat.id}:${candidateSeat.configDir}`,
40
+ }),
41
+ });
42
+ }
43
+ /**
44
+ * Resolves Anthropic authentication headers and seat metadata for a single turn invocation.
45
+ *
46
+ * Prioritizes OAuth credentials extracted from `seat.configDir` and falls back to `seat.apiKey`
47
+ * (or the model pool's fallback seat `apiKey`) resolved via `params.driverCtx?.resolveEnv`.
48
+ *
49
+ * @param {ResolveClaudeSeatAuthParams} params - Seat configuration, model node, and runtime driver context.
50
+ *
51
+ * @returns {ClaudeSeatAuth} Resolved `seatId`, `authSource`, and HTTP `headers`.
52
+ */
53
+ export function resolveClaudeSeatAuth(params) {
54
+ const pool = params.modelNode?.accountPool;
55
+ const candidateSeat = (params.accountConfig ?? pool?.items[0] ?? pool?.fallbackItem);
56
+ const oauthAuth = tryResolveClaudeOAuthSeat(candidateSeat, pool?.fallbackItem);
57
+ if (oauthAuth !== undefined) {
58
+ return oauthAuth;
59
+ }
60
+ const apiKeySeat = candidateSeat?.apiKey !== undefined ? candidateSeat : (pool?.fallbackItem ?? candidateSeat);
61
+ const rawKey = apiKeySeat?.apiKey;
62
+ if (rawKey !== undefined) {
63
+ const resolvedKey = typeof rawKey === 'string' ? rawKey : params.driverCtx?.resolveEnv(rawKey);
64
+ if (resolvedKey !== undefined && resolvedKey.length > 0) {
65
+ return Object.freeze({
66
+ seatId: apiKeySeat?.id,
67
+ authSource: 'api-key',
68
+ headers: Object.freeze({
69
+ 'content-type': 'application/json',
70
+ 'anthropic-version': ANTHROPIC_API_VERSION,
71
+ 'x-api-key': resolvedKey,
72
+ }),
73
+ });
74
+ }
75
+ }
76
+ return Object.freeze({
77
+ seatId: candidateSeat?.id,
78
+ authSource: 'none',
79
+ headers: Object.freeze({
80
+ 'content-type': 'application/json',
81
+ 'anthropic-version': ANTHROPIC_API_VERSION,
82
+ }),
83
+ });
84
+ }
85
+ //# sourceMappingURL=resolve-claude-seat-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-claude-seat-auth.js","sourceRoot":"","sources":["../../../src/driver/internal/resolve-claude-seat-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ClaudeHttpRequest } from '../claude-http-request.js';
2
+ import type { ClaudeHttpResponse } from '../claude-http-response.js';
3
+ /**
4
+ * Dispatches an Anthropic `/v1/messages` request through the official `@anthropic-ai/sdk` client.
5
+ *
6
+ * Uses `maxRetries: 0` so HTTP `429` and `5xx` statuses return immediately with `resetAtMs` and raw error text.
7
+ *
8
+ * @param {ClaudeHttpRequest} request - Outbound Anthropic `/v1/messages` request envelope.
9
+ *
10
+ * @returns {Promise<ClaudeHttpResponse>} HTTP status, parsed JSON body or error text, and `resetAtMs`.
11
+ *
12
+ * @throws {Error} If `request.signal` is aborted or a network transport exception occurs.
13
+ */
14
+ export declare function sendClaudeMessagesViaSdk(request: ClaudeHttpRequest): Promise<ClaudeHttpResponse>;
15
+ //# sourceMappingURL=send-claude-messages-via-sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-claude-messages-via-sdk.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/send-claude-messages-via-sdk.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAqDrE;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAyC7B"}
@@ -0,0 +1,98 @@
1
+ import { APIError, Anthropic } from '@anthropic-ai/sdk';
2
+ import { createAnthropicSdkFetch } from './create-anthropic-sdk-fetch.js';
3
+ import { parseClaudeRetryAfterResetAtMs } from './parse-claude-retry-after-reset-at-ms.js';
4
+ import { resolveAnthropicSdkBaseUrl } from './resolve-anthropic-sdk-base-url.js';
5
+ /**
6
+ * Converts an `@anthropic-ai/sdk` `APIError` exception into a structured `ClaudeHttpResponse`.
7
+ *
8
+ * Preserves the HTTP status code, parsed error object when available, raw error message text,
9
+ * and parsed `retry-after` reset timestamp.
10
+ *
11
+ * @param {APIError} err - Caught `@anthropic-ai/sdk` API error instance.
12
+ *
13
+ * @returns {ClaudeHttpResponse} Normalized HTTP response record for `ClaudeModelDriver`.
14
+ */
15
+ function buildClaudeSdkApiErrorResponse(err) {
16
+ const errBody = err.error !== undefined && err.error !== null && typeof err.error === 'object'
17
+ ? err.error
18
+ : Object.freeze({});
19
+ return Object.freeze({
20
+ status: err.status ?? 500,
21
+ body: errBody,
22
+ bodyText: err.message,
23
+ headers: undefined,
24
+ resetAtMs: parseClaudeRetryAfterResetAtMs(err.headers?.get('retry-after')),
25
+ });
26
+ }
27
+ /**
28
+ * Resolves the `apiKey` option passed to `new Anthropic()` from `apiKey` and `authToken`.
29
+ *
30
+ * Returns `apiKey` when present, `null` when OAuth `authToken` is active, and a placeholder string
31
+ * when neither credential is provided (subsequently stripped by `createAnthropicSdkFetch`).
32
+ *
33
+ * @param {string | undefined} apiKey - Explicit `x-api-key` header value, if present.
34
+ * @param {string | undefined} authToken - Explicit OAuth bearer token, if present.
35
+ *
36
+ * @returns {string | null} Value for the `Anthropic` constructor `apiKey` option.
37
+ */
38
+ function resolveAnthropicClientApiKeyOption(apiKey, authToken) {
39
+ if (apiKey !== undefined) {
40
+ return apiKey;
41
+ }
42
+ if (authToken !== undefined) {
43
+ return null;
44
+ }
45
+ return 'anthropic-seat-unconfigured';
46
+ }
47
+ /**
48
+ * Dispatches an Anthropic `/v1/messages` request through the official `@anthropic-ai/sdk` client.
49
+ *
50
+ * Uses `maxRetries: 0` so HTTP `429` and `5xx` statuses return immediately with `resetAtMs` and raw error text.
51
+ *
52
+ * @param {ClaudeHttpRequest} request - Outbound Anthropic `/v1/messages` request envelope.
53
+ *
54
+ * @returns {Promise<ClaudeHttpResponse>} HTTP status, parsed JSON body or error text, and `resetAtMs`.
55
+ *
56
+ * @throws {Error} If `request.signal` is aborted or a network transport exception occurs.
57
+ */
58
+ export async function sendClaudeMessagesViaSdk(request) {
59
+ request.signal?.throwIfAborted();
60
+ const rawAuth = request.headers['authorization'];
61
+ const authToken = rawAuth?.startsWith('Bearer ') ? rawAuth.slice('Bearer '.length) : rawAuth;
62
+ const apiKey = request.headers['x-api-key'];
63
+ const hasExplicitAuth = (apiKey !== undefined && apiKey.length > 0) ||
64
+ (authToken !== undefined && authToken.length > 0);
65
+ const client = new Anthropic({
66
+ apiKey: resolveAnthropicClientApiKeyOption(apiKey, authToken),
67
+ authToken: authToken ?? null,
68
+ baseURL: resolveAnthropicSdkBaseUrl(request.url),
69
+ maxRetries: 0,
70
+ fetch: createAnthropicSdkFetch({
71
+ hasExplicitAuth,
72
+ baseFetch: request.fetch ?? globalThis.fetch,
73
+ }),
74
+ });
75
+ try {
76
+ const sdkResponse = await client
77
+ .post('/v1/messages', {
78
+ body: request.body,
79
+ headers: request.headers,
80
+ signal: request.signal,
81
+ })
82
+ .withResponse();
83
+ return Object.freeze({
84
+ status: sdkResponse.response.status,
85
+ body: sdkResponse.data,
86
+ bodyText: undefined,
87
+ headers: undefined,
88
+ resetAtMs: parseClaudeRetryAfterResetAtMs(sdkResponse.response.headers.get('retry-after')),
89
+ });
90
+ }
91
+ catch (err) {
92
+ if (err instanceof APIError) {
93
+ return buildClaudeSdkApiErrorResponse(err);
94
+ }
95
+ throw err;
96
+ }
97
+ }
98
+ //# sourceMappingURL=send-claude-messages-via-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-claude-messages-via-sdk.js","sourceRoot":"","sources":["../../../src/driver/internal/send-claude-messages-via-sdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ForkContext, WireFrameRecord } from '@paraharness/core';
2
+ /**
3
+ * Slices `ctx.parentChain` up to and including `ctx.forkPointMessageId` when specified.
4
+ *
5
+ * Returns the full `ctx.parentChain` when `forkPointMessageId` is `null` or does not match an entry.
6
+ *
7
+ * @param {ForkContext} ctx - Fork preparation context carrying `parentChain` and `forkPointMessageId`.
8
+ *
9
+ * @returns {readonly WireFrameRecord[]} Parent frames up to the fork point.
10
+ */
11
+ export declare function sliceClaudeParentChain(ctx: ForkContext): readonly WireFrameRecord[];
12
+ //# sourceMappingURL=slice-claude-parent-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slice-claude-parent-chain.d.ts","sourceRoot":"","sources":["../../../src/driver/internal/slice-claude-parent-chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEtE;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,eAAe,EAAE,CAYnF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Slices `ctx.parentChain` up to and including `ctx.forkPointMessageId` when specified.
3
+ *
4
+ * Returns the full `ctx.parentChain` when `forkPointMessageId` is `null` or does not match an entry.
5
+ *
6
+ * @param {ForkContext} ctx - Fork preparation context carrying `parentChain` and `forkPointMessageId`.
7
+ *
8
+ * @returns {readonly WireFrameRecord[]} Parent frames up to the fork point.
9
+ */
10
+ export function sliceClaudeParentChain(ctx) {
11
+ if (ctx.forkPointMessageId === null) {
12
+ return ctx.parentChain;
13
+ }
14
+ const sliced = [];
15
+ for (const frame of ctx.parentChain) {
16
+ sliced.push(frame);
17
+ if (frame.messageId === ctx.forkPointMessageId) {
18
+ return Object.freeze(sliced);
19
+ }
20
+ }
21
+ return ctx.parentChain;
22
+ }
23
+ //# sourceMappingURL=slice-claude-parent-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slice-claude-parent-chain.js","sourceRoot":"","sources":["../../../src/driver/internal/slice-claude-parent-chain.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAgB;IACrD,IAAI,GAAG,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC,WAAW,CAAC;IACzB,CAAC;IACD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,SAAS,KAAK,GAAG,CAAC,kBAAkB,EAAE,CAAC;YAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,WAAW,CAAC;AACzB,CAAC"}