@code-yeongyu/senpi 2026.7.20-2 → 2026.7.20

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 (160) hide show
  1. package/CHANGELOG.md +0 -18
  2. package/dist/core/agent-session.d.ts +0 -32
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +68 -368
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/compaction/compaction.d.ts +2 -2
  7. package/dist/core/compaction/compaction.d.ts.map +1 -1
  8. package/dist/core/compaction/compaction.js +11 -39
  9. package/dist/core/compaction/compaction.js.map +1 -1
  10. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  11. package/dist/core/extensions/builtin/compaction/index.js +8 -24
  12. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  13. package/dist/core/extensions/builtin/goal/command-registration.d.ts +2 -2
  14. package/dist/core/extensions/builtin/goal/command-registration.d.ts.map +1 -1
  15. package/dist/core/extensions/builtin/goal/command-registration.js +4 -3
  16. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
  17. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  18. package/dist/core/extensions/builtin/goal/index.js +27 -11
  19. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  20. package/dist/core/extensions/builtin/goal/tool-registration.d.ts +2 -2
  21. package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
  22. package/dist/core/extensions/builtin/goal/tool-registration.js +3 -2
  23. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  24. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/index.js +0 -2
  26. package/dist/core/extensions/builtin/index.js.map +1 -1
  27. package/dist/core/extensions/builtin/nested-agents-md/index.d.ts.map +1 -1
  28. package/dist/core/extensions/builtin/nested-agents-md/index.js +1 -4
  29. package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
  30. package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
  31. package/dist/core/extensions/builtin/rules/index.js +1 -4
  32. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  33. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  34. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +4 -13
  35. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  36. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +2 -3
  37. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/websearch/websearch/search.js +1 -2
  39. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  40. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/websearch/websearch/tool.js +1 -17
  42. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  43. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +0 -2
  44. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  46. package/dist/core/extensions/runner.d.ts +0 -1
  47. package/dist/core/extensions/runner.d.ts.map +1 -1
  48. package/dist/core/extensions/runner.js +0 -31
  49. package/dist/core/extensions/runner.js.map +1 -1
  50. package/dist/core/extensions/types.d.ts +10 -67
  51. package/dist/core/extensions/types.d.ts.map +1 -1
  52. package/dist/core/extensions/types.js.map +1 -1
  53. package/dist/core/sdk.d.ts.map +1 -1
  54. package/dist/core/sdk.js +0 -1
  55. package/dist/core/sdk.js.map +1 -1
  56. package/dist/core/session-manager.d.ts +1 -6
  57. package/dist/core/session-manager.d.ts.map +1 -1
  58. package/dist/core/session-manager.js +3 -19
  59. package/dist/core/session-manager.js.map +1 -1
  60. package/dist/core/settings-manager.d.ts +0 -15
  61. package/dist/core/settings-manager.d.ts.map +1 -1
  62. package/dist/core/settings-manager.js +1 -80
  63. package/dist/core/settings-manager.js.map +1 -1
  64. package/dist/modes/interactive/components/footer.d.ts +1 -2
  65. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  66. package/dist/modes/interactive/components/footer.js +2 -21
  67. package/dist/modes/interactive/components/footer.js.map +1 -1
  68. package/dist/modes/interactive/interactive-mode.d.ts +0 -4
  69. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  70. package/dist/modes/interactive/interactive-mode.js +3 -78
  71. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  72. package/docs/extensions.md +0 -28
  73. package/docs/settings.md +0 -35
  74. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +0 -12
  75. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  76. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  77. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +8 -76
  78. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  79. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  80. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +1 -26
  81. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  82. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  83. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +2 -24
  84. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  85. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +0 -5
  86. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  87. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  88. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  89. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  90. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +25 -68
  91. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  92. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  93. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +52 -62
  94. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  95. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +0 -1
  96. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  97. package/node_modules/@earendil-works/pi-ai/dist/index.js +0 -1
  98. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  99. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +4 -0
  100. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  101. package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
  102. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  103. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  104. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts +0 -1
  105. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
  106. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js +0 -1
  107. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  108. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +4 -0
  109. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
  110. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
  111. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +0 -15
  112. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  113. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  114. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  115. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -5
  116. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  117. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  118. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  119. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  120. package/package.json +6 -6
  121. package/dist/core/extensions/builtin/goal/turn-usage.d.ts +0 -20
  122. package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +0 -1
  123. package/dist/core/extensions/builtin/goal/turn-usage.js +0 -61
  124. package/dist/core/extensions/builtin/goal/turn-usage.js.map +0 -1
  125. package/dist/core/extensions/builtin/model-fallback/index.d.ts +0 -4
  126. package/dist/core/extensions/builtin/model-fallback/index.d.ts.map +0 -1
  127. package/dist/core/extensions/builtin/model-fallback/index.js +0 -55
  128. package/dist/core/extensions/builtin/model-fallback/index.js.map +0 -1
  129. package/dist/core/extensions/builtin/model-fallback/settings.d.ts +0 -6
  130. package/dist/core/extensions/builtin/model-fallback/settings.d.ts.map +0 -1
  131. package/dist/core/extensions/builtin/model-fallback/settings.js +0 -11
  132. package/dist/core/extensions/builtin/model-fallback/settings.js.map +0 -1
  133. package/dist/core/extensions/builtin/model-fallback/ui.d.ts +0 -12
  134. package/dist/core/extensions/builtin/model-fallback/ui.d.ts.map +0 -1
  135. package/dist/core/extensions/builtin/model-fallback/ui.js +0 -72
  136. package/dist/core/extensions/builtin/model-fallback/ui.js.map +0 -1
  137. package/dist/core/retry-fallback/chains.d.ts +0 -29
  138. package/dist/core/retry-fallback/chains.d.ts.map +0 -1
  139. package/dist/core/retry-fallback/chains.js +0 -109
  140. package/dist/core/retry-fallback/chains.js.map +0 -1
  141. package/dist/core/retry-fallback/controller.d.ts +0 -77
  142. package/dist/core/retry-fallback/controller.d.ts.map +0 -1
  143. package/dist/core/retry-fallback/controller.js +0 -157
  144. package/dist/core/retry-fallback/controller.js.map +0 -1
  145. package/dist/core/retry-fallback/cooldown.d.ts +0 -21
  146. package/dist/core/retry-fallback/cooldown.d.ts.map +0 -1
  147. package/dist/core/retry-fallback/cooldown.js +0 -49
  148. package/dist/core/retry-fallback/cooldown.js.map +0 -1
  149. package/dist/core/retry-fallback/log.d.ts +0 -10
  150. package/dist/core/retry-fallback/log.d.ts.map +0 -1
  151. package/dist/core/retry-fallback/log.js +0 -128
  152. package/dist/core/retry-fallback/log.js.map +0 -1
  153. package/dist/core/retry-fallback/validate.d.ts +0 -8
  154. package/dist/core/retry-fallback/validate.d.ts.map +0 -1
  155. package/dist/core/retry-fallback/validate.js +0 -63
  156. package/dist/core/retry-fallback/validate.js.map +0 -1
  157. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +0 -4
  158. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +0 -1
  159. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +0 -6
  160. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"transform-messages.d.ts","sourceRoot":"","sources":["../../src/api/transform-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,GAAG,EACH,gBAAgB,EAEhB,OAAO,EACP,KAAK,EAIL,MAAM,aAAa,CAAC;AA+FrB,MAAM,WAAW,wBAAwB;IACxC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,SAAS,GAAG,EACjD,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,mBAAmB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,KAAK,MAAM,EAC1F,OAAO,GAAE,wBAA6B,GACpC,OAAO,EAAE,CAiLX"}
1
+ {"version":3,"file":"transform-messages.d.ts","sourceRoot":"","sources":["../../src/api/transform-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,GAAG,EACH,gBAAgB,EAEhB,OAAO,EACP,KAAK,EAIL,MAAM,aAAa,CAAC;AA+FrB,MAAM,WAAW,wBAAwB;IACxC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,SAAS,GAAG,EACjD,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,mBAAmB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,KAAK,MAAM,EAC1F,OAAO,GAAE,wBAA6B,GACpC,OAAO,EAAE,CAqKX"}
@@ -163,76 +163,66 @@ export function transformMessages(messages, model, normalizeToolCallId, options
163
163
  }
164
164
  return msg;
165
165
  });
166
- // Second pass: pair every replayable tool call with the earliest unconsumed
167
- // result after its declaring assistant. Results are emitted adjacent to their
168
- // calls because Anthropic requires that ordering. A reused ID starts a new
169
- // pairing window, so a later result cannot repair an earlier call.
166
+ // Second pass: insert synthetic empty tool results for orphaned tool calls
167
+ // This preserves thinking signatures and satisfies API requirements
170
168
  const result = [];
171
- const toolResultsById = new Map();
172
- const nextToolCallIndexById = new Map();
173
- for (let sourceIndex = 0; sourceIndex < transformed.length; sourceIndex++) {
174
- const message = transformed[sourceIndex];
175
- if (message.role === "toolResult") {
176
- const entries = toolResultsById.get(message.toolCallId) ?? [];
177
- entries.push({ message, sourceIndex, consumed: false });
178
- toolResultsById.set(message.toolCallId, entries);
179
- continue;
180
- }
181
- if (message.role !== "assistant" || message.stopReason === "error" || message.stopReason === "aborted") {
182
- continue;
169
+ let pendingToolCalls = [];
170
+ let existingToolResultIds = new Set();
171
+ const insertSyntheticToolResults = () => {
172
+ if (pendingToolCalls.length > 0) {
173
+ for (const tc of pendingToolCalls) {
174
+ if (!existingToolResultIds.has(tc.id)) {
175
+ result.push({
176
+ role: "toolResult",
177
+ toolCallId: tc.id,
178
+ toolName: tc.name,
179
+ content: [{ type: "text", text: "No result provided" }],
180
+ isError: true,
181
+ timestamp: Date.now(),
182
+ });
183
+ }
184
+ }
185
+ pendingToolCalls = [];
186
+ existingToolResultIds = new Set();
183
187
  }
184
- for (const block of message.content) {
185
- if (block.type !== "toolCall")
188
+ };
189
+ for (let i = 0; i < transformed.length; i++) {
190
+ const msg = transformed[i];
191
+ if (msg.role === "assistant") {
192
+ // If we have pending orphaned tool calls from a previous assistant, insert synthetic results now
193
+ insertSyntheticToolResults();
194
+ // Skip errored/aborted assistant messages entirely.
195
+ // These are incomplete turns that shouldn't be replayed:
196
+ // - May have partial content (reasoning without message, incomplete tool calls)
197
+ // - Replaying them can cause API errors (e.g., OpenAI "reasoning without following item")
198
+ // - The model should retry from the last valid state
199
+ const assistantMsg = msg;
200
+ if (assistantMsg.stopReason === "error" || assistantMsg.stopReason === "aborted") {
186
201
  continue;
187
- const indexes = nextToolCallIndexById.get(block.id) ?? [];
188
- indexes.push(sourceIndex);
189
- nextToolCallIndexById.set(block.id, indexes);
202
+ }
203
+ // Track tool calls from this assistant message
204
+ const toolCalls = assistantMsg.content.filter((b) => b.type === "toolCall");
205
+ if (toolCalls.length > 0) {
206
+ pendingToolCalls = toolCalls;
207
+ existingToolResultIds = new Set();
208
+ }
209
+ result.push(msg);
190
210
  }
191
- }
192
- for (let sourceIndex = 0; sourceIndex < transformed.length; sourceIndex++) {
193
- const message = transformed[sourceIndex];
194
- if (message.role === "toolResult") {
195
- const entry = toolResultsById
196
- .get(message.toolCallId)
197
- ?.find((candidate) => candidate.sourceIndex === sourceIndex);
198
- if (!entry?.consumed)
199
- result.push(message);
200
- continue;
211
+ else if (msg.role === "toolResult") {
212
+ existingToolResultIds.add(msg.toolCallId);
213
+ result.push(msg);
201
214
  }
202
- if (message.role !== "assistant") {
203
- result.push(message);
204
- continue;
215
+ else if (msg.role === "user") {
216
+ // User message interrupts tool flow - insert synthetic results for orphaned calls
217
+ insertSyntheticToolResults();
218
+ result.push(msg);
205
219
  }
206
- // Skip errored/aborted assistant messages entirely. These incomplete turns
207
- // must not be revived merely because a matching result appears later.
208
- if (message.stopReason === "error" || message.stopReason === "aborted")
209
- continue;
210
- result.push(message);
211
- for (const block of message.content) {
212
- if (block.type !== "toolCall")
213
- continue;
214
- const laterDeclarations = nextToolCallIndexById.get(block.id) ?? [];
215
- const nextDeclarationIndex = laterDeclarations.find((index) => index > sourceIndex) ?? Infinity;
216
- const matchedResult = toolResultsById
217
- .get(block.id)
218
- ?.find((candidate) => !candidate.consumed &&
219
- candidate.sourceIndex > sourceIndex &&
220
- candidate.sourceIndex < nextDeclarationIndex);
221
- if (matchedResult) {
222
- matchedResult.consumed = true;
223
- result.push(matchedResult.message);
224
- continue;
225
- }
226
- result.push({
227
- role: "toolResult",
228
- toolCallId: block.id,
229
- toolName: block.name,
230
- content: [{ type: "text", text: "No result provided" }],
231
- isError: true,
232
- timestamp: Date.now(),
233
- });
220
+ else {
221
+ result.push(msg);
234
222
  }
235
223
  }
224
+ // If the conversation ends with unresolved tool calls, synthesize results now.
225
+ insertSyntheticToolResults();
236
226
  return result;
237
227
  }
238
228
  //# sourceMappingURL=transform-messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transform-messages.js","sourceRoot":"","sources":["../../src/api/transform-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tApi,\n\tAssistantMessage,\n\tImageContent,\n\tMessage,\n\tModel,\n\tTextContent,\n\tToolCall,\n\tToolResultMessage,\n} from \"../types.ts\";\nimport { isVideoMimeType } from \"../types.ts\";\n\nconst NON_VISION_USER_IMAGE_PLACEHOLDER = \"(image omitted: model does not support images)\";\nconst NON_VISION_TOOL_IMAGE_PLACEHOLDER = \"(tool image omitted: model does not support images)\";\nconst NO_VIDEO_USER_PLACEHOLDER = \"(video omitted: model does not support video input)\";\nconst NO_VIDEO_TOOL_PLACEHOLDER = \"(tool video omitted: model does not support video input)\";\n\nfunction replaceMediaWithPlaceholder(\n\tcontent: (TextContent | ImageContent)[],\n\tplaceholder: string,\n\tmatches: (block: ImageContent) => boolean,\n): (TextContent | ImageContent)[] {\n\tif (!content.some((block) => block.type === \"image\" && matches(block))) {\n\t\treturn content;\n\t}\n\tconst result: (TextContent | ImageContent)[] = [];\n\tlet previousWasPlaceholder = false;\n\n\tfor (const block of content) {\n\t\tif (block.type === \"image\" && matches(block)) {\n\t\t\tif (!previousWasPlaceholder) {\n\t\t\t\tresult.push({ type: \"text\", text: placeholder });\n\t\t\t}\n\t\t\tpreviousWasPlaceholder = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tresult.push(block);\n\t\tpreviousWasPlaceholder = block.type === \"text\" && block.text === placeholder;\n\t}\n\n\treturn result;\n}\n\nfunction replaceImagesWithPlaceholder(content: (TextContent | ImageContent)[], placeholder: string): TextContent[] {\n\tconst result: TextContent[] = [];\n\tlet previousWasPlaceholder = false;\n\n\tfor (const block of content) {\n\t\tif (block.type === \"image\") {\n\t\t\tif (!previousWasPlaceholder) {\n\t\t\t\tresult.push({ type: \"text\", text: placeholder });\n\t\t\t}\n\t\t\tpreviousWasPlaceholder = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tresult.push(block);\n\t\tpreviousWasPlaceholder = block.text === placeholder;\n\t}\n\n\treturn result;\n}\n\nfunction downgradeUnsupportedImages<TApi extends Api>(messages: Message[], model: Model<TApi>): Message[] {\n\tconst supportsImages = model.input.includes(\"image\");\n\tconst supportsVideo = model.input.includes(\"video\");\n\tif (supportsImages && supportsVideo) {\n\t\treturn messages;\n\t}\n\n\treturn messages.map((msg) => {\n\t\tif (msg.role === \"user\" && Array.isArray(msg.content)) {\n\t\t\tlet content = msg.content;\n\t\t\t// Video payloads ride ImageContent blocks; strip them first for models\n\t\t\t// without the \"video\" modality so they never hit an incompatible wire.\n\t\t\tif (!supportsVideo) {\n\t\t\t\tcontent = replaceMediaWithPlaceholder(content, NO_VIDEO_USER_PLACEHOLDER, (b) =>\n\t\t\t\t\tisVideoMimeType(b.mimeType),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!supportsImages) {\n\t\t\t\tcontent = replaceImagesWithPlaceholder(content, NON_VISION_USER_IMAGE_PLACEHOLDER);\n\t\t\t}\n\t\t\treturn { ...msg, content };\n\t\t}\n\n\t\tif (msg.role === \"toolResult\") {\n\t\t\tlet content = msg.content;\n\t\t\tif (!supportsVideo) {\n\t\t\t\tcontent = replaceMediaWithPlaceholder(content, NO_VIDEO_TOOL_PLACEHOLDER, (b) =>\n\t\t\t\t\tisVideoMimeType(b.mimeType),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!supportsImages) {\n\t\t\t\tcontent = replaceImagesWithPlaceholder(content, NON_VISION_TOOL_IMAGE_PLACEHOLDER);\n\t\t\t}\n\t\t\treturn { ...msg, content };\n\t\t}\n\n\t\treturn msg;\n\t});\n}\n\nexport interface TransformMessagesOptions {\n\t/**\n\t * Preserve provider-native thinking/reasoning replay state for the current\n\t * model. When false, standalone same-model thinking is omitted, while\n\t * thinking attached to tool calls is preserved for provider validation.\n\t */\n\tpreserveThinking?: boolean;\n\tpreserveTextSignatures?: boolean;\n\t/**\n\t * Preserve same-model thinking blocks that do not carry a usable signature\n\t * so provider adapters can downgrade them to plain text or provider-specific\n\t * compatibility payloads.\n\t */\n\tpreserveUnsignedThinking?: boolean;\n}\n\n/**\n * Normalize tool call ID for cross-provider compatibility.\n * OpenAI Responses API generates IDs that are 450+ chars with special characters like `|`.\n * Anthropic APIs require IDs matching ^[a-zA-Z0-9_-]+$ (max 64 chars).\n */\nexport function transformMessages<TApi extends Api>(\n\tmessages: Message[],\n\tmodel: Model<TApi>,\n\tnormalizeToolCallId?: (id: string, model: Model<TApi>, source: AssistantMessage) => string,\n\toptions: TransformMessagesOptions = {},\n): Message[] {\n\t// Build a map of original tool call IDs to normalized IDs\n\tconst toolCallIdMap = new Map<string, string>();\n\t// Normalize null/undefined content from untyped callers (custom tools, hand-built\n\t// histories, old session files) so downstream code can rely on the type contract.\n\tconst normalizedMessages = messages.map((msg) => (msg.content == null ? { ...msg, content: [] } : msg));\n\tconst imageAwareMessages = downgradeUnsupportedImages(normalizedMessages, model);\n\tconst preserveThinking = options.preserveThinking ?? true;\n\tconst preserveTextSignatures = options.preserveTextSignatures ?? false;\n\tconst preserveUnsignedThinking = options.preserveUnsignedThinking ?? false;\n\n\t// First pass: transform messages (unsupported image downgrade, thinking blocks, tool call ID normalization)\n\tconst transformed = imageAwareMessages.map((msg) => {\n\t\t// User messages pass through unchanged\n\t\tif (msg.role === \"user\") {\n\t\t\treturn msg;\n\t\t}\n\n\t\t// Handle toolResult messages - normalize toolCallId if we have a mapping\n\t\tif (msg.role === \"toolResult\") {\n\t\t\tconst normalizedId = toolCallIdMap.get(msg.toolCallId);\n\t\t\tif (normalizedId && normalizedId !== msg.toolCallId) {\n\t\t\t\treturn { ...msg, toolCallId: normalizedId };\n\t\t\t}\n\t\t\treturn msg;\n\t\t}\n\n\t\t// Assistant messages need transformation check\n\t\tif (msg.role === \"assistant\") {\n\t\t\tconst assistantMsg = msg as AssistantMessage;\n\t\t\tconst isSameModel =\n\t\t\t\tassistantMsg.provider === model.provider &&\n\t\t\t\tassistantMsg.api === model.api &&\n\t\t\t\tassistantMsg.model === model.id;\n\t\t\tconst hasToolCalls = assistantMsg.content.some((block) => block.type === \"toolCall\");\n\t\t\tconst preserveProviderState = preserveThinking || hasToolCalls;\n\n\t\t\tconst transformedContent = assistantMsg.content.flatMap((block) => {\n\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t// Redacted thinking is opaque encrypted content, only valid for the same model.\n\t\t\t\t\t// Drop it for cross-model to avoid API errors.\n\t\t\t\t\tif (block.redacted) {\n\t\t\t\t\t\treturn isSameModel && preserveProviderState ? { ...block } : [];\n\t\t\t\t\t}\n\t\t\t\t\tconst hasUsableSignature =\n\t\t\t\t\t\ttypeof block.thinkingSignature === \"string\" && block.thinkingSignature.trim().length > 0;\n\t\t\t\t\t// For same model: keep signed thinking only while replaying provider state.\n\t\t\t\t\t// Empty signed blocks are opaque compatibility state, not visible reasoning.\n\t\t\t\t\tif (isSameModel && hasUsableSignature && (preserveProviderState || block.thinking.trim() === \"\")) {\n\t\t\t\t\t\treturn { ...block };\n\t\t\t\t\t}\n\t\t\t\t\t// Skip empty thinking blocks, convert others to plain text\n\t\t\t\t\tif (!block.thinking || block.thinking.trim() === \"\") return [];\n\t\t\t\t\tif (isSameModel) {\n\t\t\t\t\t\treturn preserveProviderState || (preserveUnsignedThinking && !hasUsableSignature) ? { ...block } : [];\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: block.thinking,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\tif (isSameModel && (preserveProviderState || preserveTextSignatures)) return { ...block };\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: block.text,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst toolCall = block as ToolCall;\n\t\t\t\t\tlet normalizedToolCall: ToolCall = { ...toolCall };\n\n\t\t\t\t\tif ((!isSameModel || !preserveProviderState) && toolCall.thoughtSignature) {\n\t\t\t\t\t\tdelete (normalizedToolCall as { thoughtSignature?: string }).thoughtSignature;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!isSameModel && normalizeToolCallId) {\n\t\t\t\t\t\tconst normalizedId = normalizeToolCallId(toolCall.id, model, assistantMsg);\n\t\t\t\t\t\tif (normalizedId !== toolCall.id) {\n\t\t\t\t\t\t\ttoolCallIdMap.set(toolCall.id, normalizedId);\n\t\t\t\t\t\t\tnormalizedToolCall = { ...normalizedToolCall, id: normalizedId };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn normalizedToolCall;\n\t\t\t\t}\n\n\t\t\t\treturn block;\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...assistantMsg,\n\t\t\t\tcontent: transformedContent,\n\t\t\t};\n\t\t}\n\t\treturn msg;\n\t});\n\n\t// Second pass: pair every replayable tool call with the earliest unconsumed\n\t// result after its declaring assistant. Results are emitted adjacent to their\n\t// calls because Anthropic requires that ordering. A reused ID starts a new\n\t// pairing window, so a later result cannot repair an earlier call.\n\tconst result: Message[] = [];\n\tconst toolResultsById = new Map<string, { message: ToolResultMessage; sourceIndex: number; consumed: boolean }[]>();\n\tconst nextToolCallIndexById = new Map<string, number[]>();\n\n\tfor (let sourceIndex = 0; sourceIndex < transformed.length; sourceIndex++) {\n\t\tconst message = transformed[sourceIndex];\n\t\tif (message.role === \"toolResult\") {\n\t\t\tconst entries = toolResultsById.get(message.toolCallId) ?? [];\n\t\t\tentries.push({ message, sourceIndex, consumed: false });\n\t\t\ttoolResultsById.set(message.toolCallId, entries);\n\t\t\tcontinue;\n\t\t}\n\t\tif (message.role !== \"assistant\" || message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const block of message.content) {\n\t\t\tif (block.type !== \"toolCall\") continue;\n\t\t\tconst indexes = nextToolCallIndexById.get(block.id) ?? [];\n\t\t\tindexes.push(sourceIndex);\n\t\t\tnextToolCallIndexById.set(block.id, indexes);\n\t\t}\n\t}\n\n\tfor (let sourceIndex = 0; sourceIndex < transformed.length; sourceIndex++) {\n\t\tconst message = transformed[sourceIndex];\n\t\tif (message.role === \"toolResult\") {\n\t\t\tconst entry = toolResultsById\n\t\t\t\t.get(message.toolCallId)\n\t\t\t\t?.find((candidate) => candidate.sourceIndex === sourceIndex);\n\t\t\tif (!entry?.consumed) result.push(message);\n\t\t\tcontinue;\n\t\t}\n\t\tif (message.role !== \"assistant\") {\n\t\t\tresult.push(message);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Skip errored/aborted assistant messages entirely. These incomplete turns\n\t\t// must not be revived merely because a matching result appears later.\n\t\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") continue;\n\n\t\tresult.push(message);\n\t\tfor (const block of message.content) {\n\t\t\tif (block.type !== \"toolCall\") continue;\n\t\t\tconst laterDeclarations = nextToolCallIndexById.get(block.id) ?? [];\n\t\t\tconst nextDeclarationIndex = laterDeclarations.find((index) => index > sourceIndex) ?? Infinity;\n\t\t\tconst matchedResult = toolResultsById\n\t\t\t\t.get(block.id)\n\t\t\t\t?.find(\n\t\t\t\t\t(candidate) =>\n\t\t\t\t\t\t!candidate.consumed &&\n\t\t\t\t\t\tcandidate.sourceIndex > sourceIndex &&\n\t\t\t\t\t\tcandidate.sourceIndex < nextDeclarationIndex,\n\t\t\t\t);\n\n\t\t\tif (matchedResult) {\n\t\t\t\tmatchedResult.consumed = true;\n\t\t\t\tresult.push(matchedResult.message);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tresult.push({\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: block.id,\n\t\t\t\ttoolName: block.name,\n\t\t\t\tcontent: [{ type: \"text\", text: \"No result provided\" }],\n\t\t\t\tisError: true,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t} as ToolResultMessage);\n\t\t}\n\t}\n\n\treturn result;\n}\n"]}
1
+ {"version":3,"file":"transform-messages.js","sourceRoot":"","sources":["../../src/api/transform-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tApi,\n\tAssistantMessage,\n\tImageContent,\n\tMessage,\n\tModel,\n\tTextContent,\n\tToolCall,\n\tToolResultMessage,\n} from \"../types.ts\";\nimport { isVideoMimeType } from \"../types.ts\";\n\nconst NON_VISION_USER_IMAGE_PLACEHOLDER = \"(image omitted: model does not support images)\";\nconst NON_VISION_TOOL_IMAGE_PLACEHOLDER = \"(tool image omitted: model does not support images)\";\nconst NO_VIDEO_USER_PLACEHOLDER = \"(video omitted: model does not support video input)\";\nconst NO_VIDEO_TOOL_PLACEHOLDER = \"(tool video omitted: model does not support video input)\";\n\nfunction replaceMediaWithPlaceholder(\n\tcontent: (TextContent | ImageContent)[],\n\tplaceholder: string,\n\tmatches: (block: ImageContent) => boolean,\n): (TextContent | ImageContent)[] {\n\tif (!content.some((block) => block.type === \"image\" && matches(block))) {\n\t\treturn content;\n\t}\n\tconst result: (TextContent | ImageContent)[] = [];\n\tlet previousWasPlaceholder = false;\n\n\tfor (const block of content) {\n\t\tif (block.type === \"image\" && matches(block)) {\n\t\t\tif (!previousWasPlaceholder) {\n\t\t\t\tresult.push({ type: \"text\", text: placeholder });\n\t\t\t}\n\t\t\tpreviousWasPlaceholder = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tresult.push(block);\n\t\tpreviousWasPlaceholder = block.type === \"text\" && block.text === placeholder;\n\t}\n\n\treturn result;\n}\n\nfunction replaceImagesWithPlaceholder(content: (TextContent | ImageContent)[], placeholder: string): TextContent[] {\n\tconst result: TextContent[] = [];\n\tlet previousWasPlaceholder = false;\n\n\tfor (const block of content) {\n\t\tif (block.type === \"image\") {\n\t\t\tif (!previousWasPlaceholder) {\n\t\t\t\tresult.push({ type: \"text\", text: placeholder });\n\t\t\t}\n\t\t\tpreviousWasPlaceholder = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tresult.push(block);\n\t\tpreviousWasPlaceholder = block.text === placeholder;\n\t}\n\n\treturn result;\n}\n\nfunction downgradeUnsupportedImages<TApi extends Api>(messages: Message[], model: Model<TApi>): Message[] {\n\tconst supportsImages = model.input.includes(\"image\");\n\tconst supportsVideo = model.input.includes(\"video\");\n\tif (supportsImages && supportsVideo) {\n\t\treturn messages;\n\t}\n\n\treturn messages.map((msg) => {\n\t\tif (msg.role === \"user\" && Array.isArray(msg.content)) {\n\t\t\tlet content = msg.content;\n\t\t\t// Video payloads ride ImageContent blocks; strip them first for models\n\t\t\t// without the \"video\" modality so they never hit an incompatible wire.\n\t\t\tif (!supportsVideo) {\n\t\t\t\tcontent = replaceMediaWithPlaceholder(content, NO_VIDEO_USER_PLACEHOLDER, (b) =>\n\t\t\t\t\tisVideoMimeType(b.mimeType),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!supportsImages) {\n\t\t\t\tcontent = replaceImagesWithPlaceholder(content, NON_VISION_USER_IMAGE_PLACEHOLDER);\n\t\t\t}\n\t\t\treturn { ...msg, content };\n\t\t}\n\n\t\tif (msg.role === \"toolResult\") {\n\t\t\tlet content = msg.content;\n\t\t\tif (!supportsVideo) {\n\t\t\t\tcontent = replaceMediaWithPlaceholder(content, NO_VIDEO_TOOL_PLACEHOLDER, (b) =>\n\t\t\t\t\tisVideoMimeType(b.mimeType),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!supportsImages) {\n\t\t\t\tcontent = replaceImagesWithPlaceholder(content, NON_VISION_TOOL_IMAGE_PLACEHOLDER);\n\t\t\t}\n\t\t\treturn { ...msg, content };\n\t\t}\n\n\t\treturn msg;\n\t});\n}\n\nexport interface TransformMessagesOptions {\n\t/**\n\t * Preserve provider-native thinking/reasoning replay state for the current\n\t * model. When false, standalone same-model thinking is omitted, while\n\t * thinking attached to tool calls is preserved for provider validation.\n\t */\n\tpreserveThinking?: boolean;\n\tpreserveTextSignatures?: boolean;\n\t/**\n\t * Preserve same-model thinking blocks that do not carry a usable signature\n\t * so provider adapters can downgrade them to plain text or provider-specific\n\t * compatibility payloads.\n\t */\n\tpreserveUnsignedThinking?: boolean;\n}\n\n/**\n * Normalize tool call ID for cross-provider compatibility.\n * OpenAI Responses API generates IDs that are 450+ chars with special characters like `|`.\n * Anthropic APIs require IDs matching ^[a-zA-Z0-9_-]+$ (max 64 chars).\n */\nexport function transformMessages<TApi extends Api>(\n\tmessages: Message[],\n\tmodel: Model<TApi>,\n\tnormalizeToolCallId?: (id: string, model: Model<TApi>, source: AssistantMessage) => string,\n\toptions: TransformMessagesOptions = {},\n): Message[] {\n\t// Build a map of original tool call IDs to normalized IDs\n\tconst toolCallIdMap = new Map<string, string>();\n\t// Normalize null/undefined content from untyped callers (custom tools, hand-built\n\t// histories, old session files) so downstream code can rely on the type contract.\n\tconst normalizedMessages = messages.map((msg) => (msg.content == null ? { ...msg, content: [] } : msg));\n\tconst imageAwareMessages = downgradeUnsupportedImages(normalizedMessages, model);\n\tconst preserveThinking = options.preserveThinking ?? true;\n\tconst preserveTextSignatures = options.preserveTextSignatures ?? false;\n\tconst preserveUnsignedThinking = options.preserveUnsignedThinking ?? false;\n\n\t// First pass: transform messages (unsupported image downgrade, thinking blocks, tool call ID normalization)\n\tconst transformed = imageAwareMessages.map((msg) => {\n\t\t// User messages pass through unchanged\n\t\tif (msg.role === \"user\") {\n\t\t\treturn msg;\n\t\t}\n\n\t\t// Handle toolResult messages - normalize toolCallId if we have a mapping\n\t\tif (msg.role === \"toolResult\") {\n\t\t\tconst normalizedId = toolCallIdMap.get(msg.toolCallId);\n\t\t\tif (normalizedId && normalizedId !== msg.toolCallId) {\n\t\t\t\treturn { ...msg, toolCallId: normalizedId };\n\t\t\t}\n\t\t\treturn msg;\n\t\t}\n\n\t\t// Assistant messages need transformation check\n\t\tif (msg.role === \"assistant\") {\n\t\t\tconst assistantMsg = msg as AssistantMessage;\n\t\t\tconst isSameModel =\n\t\t\t\tassistantMsg.provider === model.provider &&\n\t\t\t\tassistantMsg.api === model.api &&\n\t\t\t\tassistantMsg.model === model.id;\n\t\t\tconst hasToolCalls = assistantMsg.content.some((block) => block.type === \"toolCall\");\n\t\t\tconst preserveProviderState = preserveThinking || hasToolCalls;\n\n\t\t\tconst transformedContent = assistantMsg.content.flatMap((block) => {\n\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\t// Redacted thinking is opaque encrypted content, only valid for the same model.\n\t\t\t\t\t// Drop it for cross-model to avoid API errors.\n\t\t\t\t\tif (block.redacted) {\n\t\t\t\t\t\treturn isSameModel && preserveProviderState ? { ...block } : [];\n\t\t\t\t\t}\n\t\t\t\t\tconst hasUsableSignature =\n\t\t\t\t\t\ttypeof block.thinkingSignature === \"string\" && block.thinkingSignature.trim().length > 0;\n\t\t\t\t\t// For same model: keep signed thinking only while replaying provider state.\n\t\t\t\t\t// Empty signed blocks are opaque compatibility state, not visible reasoning.\n\t\t\t\t\tif (isSameModel && hasUsableSignature && (preserveProviderState || block.thinking.trim() === \"\")) {\n\t\t\t\t\t\treturn { ...block };\n\t\t\t\t\t}\n\t\t\t\t\t// Skip empty thinking blocks, convert others to plain text\n\t\t\t\t\tif (!block.thinking || block.thinking.trim() === \"\") return [];\n\t\t\t\t\tif (isSameModel) {\n\t\t\t\t\t\treturn preserveProviderState || (preserveUnsignedThinking && !hasUsableSignature) ? { ...block } : [];\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: block.thinking,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\tif (isSameModel && (preserveProviderState || preserveTextSignatures)) return { ...block };\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: block.text,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst toolCall = block as ToolCall;\n\t\t\t\t\tlet normalizedToolCall: ToolCall = { ...toolCall };\n\n\t\t\t\t\tif ((!isSameModel || !preserveProviderState) && toolCall.thoughtSignature) {\n\t\t\t\t\t\tdelete (normalizedToolCall as { thoughtSignature?: string }).thoughtSignature;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!isSameModel && normalizeToolCallId) {\n\t\t\t\t\t\tconst normalizedId = normalizeToolCallId(toolCall.id, model, assistantMsg);\n\t\t\t\t\t\tif (normalizedId !== toolCall.id) {\n\t\t\t\t\t\t\ttoolCallIdMap.set(toolCall.id, normalizedId);\n\t\t\t\t\t\t\tnormalizedToolCall = { ...normalizedToolCall, id: normalizedId };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn normalizedToolCall;\n\t\t\t\t}\n\n\t\t\t\treturn block;\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...assistantMsg,\n\t\t\t\tcontent: transformedContent,\n\t\t\t};\n\t\t}\n\t\treturn msg;\n\t});\n\n\t// Second pass: insert synthetic empty tool results for orphaned tool calls\n\t// This preserves thinking signatures and satisfies API requirements\n\tconst result: Message[] = [];\n\tlet pendingToolCalls: ToolCall[] = [];\n\tlet existingToolResultIds = new Set<string>();\n\tconst insertSyntheticToolResults = () => {\n\t\tif (pendingToolCalls.length > 0) {\n\t\t\tfor (const tc of pendingToolCalls) {\n\t\t\t\tif (!existingToolResultIds.has(tc.id)) {\n\t\t\t\t\tresult.push({\n\t\t\t\t\t\trole: \"toolResult\",\n\t\t\t\t\t\ttoolCallId: tc.id,\n\t\t\t\t\t\ttoolName: tc.name,\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No result provided\" }],\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t} as ToolResultMessage);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpendingToolCalls = [];\n\t\t\texistingToolResultIds = new Set();\n\t\t}\n\t};\n\n\tfor (let i = 0; i < transformed.length; i++) {\n\t\tconst msg = transformed[i];\n\n\t\tif (msg.role === \"assistant\") {\n\t\t\t// If we have pending orphaned tool calls from a previous assistant, insert synthetic results now\n\t\t\tinsertSyntheticToolResults();\n\n\t\t\t// Skip errored/aborted assistant messages entirely.\n\t\t\t// These are incomplete turns that shouldn't be replayed:\n\t\t\t// - May have partial content (reasoning without message, incomplete tool calls)\n\t\t\t// - Replaying them can cause API errors (e.g., OpenAI \"reasoning without following item\")\n\t\t\t// - The model should retry from the last valid state\n\t\t\tconst assistantMsg = msg as AssistantMessage;\n\t\t\tif (assistantMsg.stopReason === \"error\" || assistantMsg.stopReason === \"aborted\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Track tool calls from this assistant message\n\t\t\tconst toolCalls = assistantMsg.content.filter((b) => b.type === \"toolCall\") as ToolCall[];\n\t\t\tif (toolCalls.length > 0) {\n\t\t\t\tpendingToolCalls = toolCalls;\n\t\t\t\texistingToolResultIds = new Set();\n\t\t\t}\n\n\t\t\tresult.push(msg);\n\t\t} else if (msg.role === \"toolResult\") {\n\t\t\texistingToolResultIds.add(msg.toolCallId);\n\t\t\tresult.push(msg);\n\t\t} else if (msg.role === \"user\") {\n\t\t\t// User message interrupts tool flow - insert synthetic results for orphaned calls\n\t\t\tinsertSyntheticToolResults();\n\t\t\tresult.push(msg);\n\t\t} else {\n\t\t\tresult.push(msg);\n\t\t}\n\t}\n\n\t// If the conversation ends with unresolved tool calls, synthesize results now.\n\tinsertSyntheticToolResults();\n\n\treturn result;\n}\n"]}
@@ -28,7 +28,6 @@ export * from "./utils/event-stream.ts";
28
28
  export * from "./utils/json-parse.ts";
29
29
  export * from "./utils/overflow.ts";
30
30
  export * from "./utils/retry.ts";
31
- export * from "./utils/stop-details.ts";
32
31
  export * from "./utils/tool-pair-repair.ts";
33
32
  export * from "./utils/typebox-helpers.ts";
34
33
  export * from "./utils/validation.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAO/B,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC/G,YAAY,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/F,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,YAAY,EAAE,2BAA2B,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AACnH,YAAY,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACxG,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,YAAY,EACX,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,mCAAmC,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAO/B,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC/G,YAAY,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/F,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,YAAY,EAAE,2BAA2B,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AACnH,YAAY,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,YAAY,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACxG,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,YAAY,EACX,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,mCAAmC,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC"}
@@ -15,7 +15,6 @@ export * from "./utils/event-stream.js";
15
15
  export * from "./utils/json-parse.js";
16
16
  export * from "./utils/overflow.js";
17
17
  export * from "./utils/retry.js";
18
- export * from "./utils/stop-details.js";
19
18
  export * from "./utils/tool-pair-repair.js";
20
19
  export * from "./utils/typebox-helpers.js";
21
20
  export * from "./utils/validation.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAa/B,cAAc,eAAe,CAAC;AAM9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAUhC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC","sourcesContent":["export type { Static, TSchema } from \"typebox\";\nexport { Type } from \"typebox\";\n\n// Core only, side-effect free: no generated catalogs, no provider factories,\n// no api-registry, no OAuth implementations, no compat. Provider factories\n// live under \"@earendil-works/pi-ai/providers/*\", API implementations under\n// \"@earendil-works/pi-ai/api/*\", the old global API under\n// \"@earendil-works/pi-ai/compat\".\nexport type { AnthropicEffort, AnthropicOptions, AnthropicThinkingDisplay } from \"./api/anthropic-messages.ts\";\nexport type { AzureOpenAIResponsesOptions } from \"./api/azure-openai-responses.ts\";\nexport type { BedrockOptions, BedrockThinkingDisplay } from \"./api/bedrock-converse-stream.ts\";\nexport type { GoogleOptions } from \"./api/google-generative-ai.ts\";\nexport type { GoogleThinkingLevel } from \"./api/google-shared.ts\";\nexport type { GoogleVertexOptions } from \"./api/google-vertex.ts\";\nexport * from \"./api/lazy.ts\";\nexport type { MistralOptions } from \"./api/mistral-conversations.ts\";\nexport type { OpenAICodexResponsesOptions, OpenAICodexWebSocketDebugStats } from \"./api/openai-codex-responses.ts\";\nexport type { OpenAICompletionsOptions } from \"./api/openai-completions.ts\";\nexport type { OpenAIResponsesOptions } from \"./api/openai-responses.ts\";\nexport type { PiMessagesEvent, PiMessagesOptions, PiMessagesRewriteImpact } from \"./api/pi-messages.ts\";\nexport * from \"./auth/context.ts\";\nexport * from \"./auth/credential-store.ts\";\nexport * from \"./auth/helpers.ts\";\nexport * from \"./auth/types.ts\";\nexport type {\n\tOAuthAuthInfo,\n\tOAuthDeviceCodeInfo,\n\tOAuthLoginCallbacks,\n\tOAuthPrompt,\n\tOAuthProviderId,\n\tOAuthSelectOption,\n\tOAuthSelectPrompt,\n} from \"./compat/extension-oauth-types.ts\";\nexport * from \"./images-models.ts\";\nexport * from \"./models.ts\";\nexport * from \"./models-store.ts\";\nexport * from \"./providers/faux.ts\";\nexport * from \"./session-resources.ts\";\nexport * from \"./types.ts\";\nexport * from \"./utils/diagnostics.ts\";\nexport * from \"./utils/event-stream.ts\";\nexport * from \"./utils/json-parse.ts\";\nexport * from \"./utils/overflow.ts\";\nexport * from \"./utils/retry.ts\";\nexport * from \"./utils/stop-details.ts\";\nexport * from \"./utils/tool-pair-repair.ts\";\nexport * from \"./utils/typebox-helpers.ts\";\nexport * from \"./utils/validation.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAa/B,cAAc,eAAe,CAAC;AAM9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAUhC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC","sourcesContent":["export type { Static, TSchema } from \"typebox\";\nexport { Type } from \"typebox\";\n\n// Core only, side-effect free: no generated catalogs, no provider factories,\n// no api-registry, no OAuth implementations, no compat. Provider factories\n// live under \"@earendil-works/pi-ai/providers/*\", API implementations under\n// \"@earendil-works/pi-ai/api/*\", the old global API under\n// \"@earendil-works/pi-ai/compat\".\nexport type { AnthropicEffort, AnthropicOptions, AnthropicThinkingDisplay } from \"./api/anthropic-messages.ts\";\nexport type { AzureOpenAIResponsesOptions } from \"./api/azure-openai-responses.ts\";\nexport type { BedrockOptions, BedrockThinkingDisplay } from \"./api/bedrock-converse-stream.ts\";\nexport type { GoogleOptions } from \"./api/google-generative-ai.ts\";\nexport type { GoogleThinkingLevel } from \"./api/google-shared.ts\";\nexport type { GoogleVertexOptions } from \"./api/google-vertex.ts\";\nexport * from \"./api/lazy.ts\";\nexport type { MistralOptions } from \"./api/mistral-conversations.ts\";\nexport type { OpenAICodexResponsesOptions, OpenAICodexWebSocketDebugStats } from \"./api/openai-codex-responses.ts\";\nexport type { OpenAICompletionsOptions } from \"./api/openai-completions.ts\";\nexport type { OpenAIResponsesOptions } from \"./api/openai-responses.ts\";\nexport type { PiMessagesEvent, PiMessagesOptions, PiMessagesRewriteImpact } from \"./api/pi-messages.ts\";\nexport * from \"./auth/context.ts\";\nexport * from \"./auth/credential-store.ts\";\nexport * from \"./auth/helpers.ts\";\nexport * from \"./auth/types.ts\";\nexport type {\n\tOAuthAuthInfo,\n\tOAuthDeviceCodeInfo,\n\tOAuthLoginCallbacks,\n\tOAuthPrompt,\n\tOAuthProviderId,\n\tOAuthSelectOption,\n\tOAuthSelectPrompt,\n} from \"./compat/extension-oauth-types.ts\";\nexport * from \"./images-models.ts\";\nexport * from \"./models.ts\";\nexport * from \"./models-store.ts\";\nexport * from \"./providers/faux.ts\";\nexport * from \"./session-resources.ts\";\nexport * from \"./types.ts\";\nexport * from \"./utils/diagnostics.ts\";\nexport * from \"./utils/event-stream.ts\";\nexport * from \"./utils/json-parse.ts\";\nexport * from \"./utils/overflow.ts\";\nexport * from \"./utils/retry.ts\";\nexport * from \"./utils/tool-pair-repair.ts\";\nexport * from \"./utils/typebox-helpers.ts\";\nexport * from \"./utils/validation.ts\";\n"]}
@@ -1460,6 +1460,10 @@ export declare const MODELS: {
1460
1460
  };
1461
1461
  };
1462
1462
  readonly "kimi-coding": {
1463
+ k2p7: import("./types.ts").Model<"anthropic-messages"> & {
1464
+ id: "k2p7";
1465
+ provider: "kimi-coding";
1466
+ };
1463
1467
  k3: import("./types.ts").Model<"anthropic-messages"> & {
1464
1468
  id: "k3";
1465
1469
  provider: "kimi-coding";
@@ -1 +1 @@
1
- {"version":3,"file":"models.generated.d.ts","sourceRoot":"","sources":["../src/models.generated.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACV,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACb,UAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACZ,QAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACV,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACnB,GAAK;;;;;;;;;;;;;;aACL,MAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;aACR,uBAAuB;;;;;;;;;;;;;;aACvB,sBAAsB;;;;;;;;;;;;;;aACtB,uBAAuB;;;;;;;;;;;;;;aACvB,GAAK;;;;;;;;;;;;;;;;;;;;;;;;;;aACL,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;CACN,CAAC"}
1
+ {"version":3,"file":"models.generated.d.ts","sourceRoot":"","sources":["../src/models.generated.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACV,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACb,UAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACZ,QAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACV,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aACnB,GAAK;;;;;;;;;;;;;;aACL,MAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;aACR,uBAAuB;;;;;;;;;;;;;;aACvB,sBAAsB;;;;;;;;;;;;;;aACtB,uBAAuB;;;;;;;;;;;;;;aACvB,GAAK;;;;;;;;;;;;;;;;;;;;;;;;;;aACL,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;CACN,CAAC"}
@@ -1 +1 @@
1
- {"k3":{"id":"k3","name":"Kimi K3","api":"anthropic-messages","provider":"kimi-coding","baseUrl":"https://api.kimi.com/coding","headers":{"User-Agent":"KimiCLI/1.5"},"compat":{"allowEmptySignature":true,"forceAdaptiveThinking":true},"reasoning":true,"thinkingLevelMap":{"off":null,"minimal":null,"low":null,"medium":null,"high":null,"xhigh":null,"max":"max"},"input":["text","image","video"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072},"kimi-for-coding":{"id":"kimi-for-coding","name":"Kimi K2.7 Code","api":"anthropic-messages","provider":"kimi-coding","baseUrl":"https://api.kimi.com/coding","headers":{"User-Agent":"KimiCLI/1.5"},"compat":{"allowEmptySignature":true,"forceAdaptiveThinking":true},"reasoning":true,"input":["text","image"],"cost":{"input":0.95,"output":4,"cacheRead":0.19,"cacheWrite":0},"contextWindow":262144,"maxTokens":32768},"kimi-for-coding-highspeed":{"id":"kimi-for-coding-highspeed","name":"Kimi For Coding HighSpeed","api":"anthropic-messages","provider":"kimi-coding","baseUrl":"https://api.kimi.com/coding","headers":{"User-Agent":"KimiCLI/1.5"},"compat":{"forceAdaptiveThinking":true},"reasoning":true,"input":["text","image"],"cost":{"input":1.9,"output":8,"cacheRead":0.38,"cacheWrite":0},"contextWindow":262144,"maxTokens":32768},"kimi-k2-thinking":{"id":"kimi-k2-thinking","name":"Kimi K2 Thinking","api":"anthropic-messages","provider":"kimi-coding","baseUrl":"https://api.kimi.com/coding","headers":{"User-Agent":"KimiCLI/1.5"},"compat":{"forceAdaptiveThinking":true},"reasoning":true,"input":["text"],"cost":{"input":0.6,"output":2.5,"cacheRead":0.15,"cacheWrite":0},"contextWindow":262144,"maxTokens":32768}}
1
+ {"k2p7":{"id":"k2p7","name":"Kimi K2.7 Code","api":"anthropic-messages","provider":"kimi-coding","baseUrl":"https://api.kimi.com/coding","headers":{"User-Agent":"KimiCLI/1.5"},"compat":{"forceAdaptiveThinking":true},"reasoning":true,"input":["text","image"],"cost":{"input":0.95,"output":4,"cacheRead":0.19,"cacheWrite":0},"contextWindow":262144,"maxTokens":32768},"k3":{"id":"k3","name":"Kimi K3","api":"anthropic-messages","provider":"kimi-coding","baseUrl":"https://api.kimi.com/coding","headers":{"User-Agent":"KimiCLI/1.5"},"compat":{"allowEmptySignature":true,"forceAdaptiveThinking":true},"reasoning":true,"thinkingLevelMap":{"off":null,"minimal":null,"low":null,"medium":null,"high":null,"xhigh":null,"max":"max"},"input":["text","image","video"],"cost":{"input":3,"output":15,"cacheRead":0.3,"cacheWrite":0},"contextWindow":1048576,"maxTokens":131072},"kimi-for-coding":{"id":"kimi-for-coding","name":"Kimi For Coding","api":"anthropic-messages","provider":"kimi-coding","baseUrl":"https://api.kimi.com/coding","headers":{"User-Agent":"KimiCLI/1.5"},"compat":{"allowEmptySignature":true,"forceAdaptiveThinking":true},"reasoning":true,"input":["text","image"],"cost":{"input":0.95,"output":4,"cacheRead":0.19,"cacheWrite":0},"contextWindow":262144,"maxTokens":32768},"kimi-for-coding-highspeed":{"id":"kimi-for-coding-highspeed","name":"Kimi For Coding HighSpeed","api":"anthropic-messages","provider":"kimi-coding","baseUrl":"https://api.kimi.com/coding","headers":{"User-Agent":"KimiCLI/1.5"},"compat":{"forceAdaptiveThinking":true},"reasoning":true,"input":["text","image"],"cost":{"input":1.9,"output":8,"cacheRead":0.38,"cacheWrite":0},"contextWindow":262144,"maxTokens":32768},"kimi-k2-thinking":{"id":"kimi-k2-thinking","name":"Kimi K2 Thinking","api":"anthropic-messages","provider":"kimi-coding","baseUrl":"https://api.kimi.com/coding","headers":{"User-Agent":"KimiCLI/1.5"},"compat":{"forceAdaptiveThinking":true},"reasoning":true,"input":["text"],"cost":{"input":0.6,"output":2.5,"cacheRead":0.15,"cacheWrite":0},"contextWindow":262144,"maxTokens":32768}}