@aexol/spectral 0.9.230 → 0.9.234

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 (265) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +89 -14
  4. package/dist/backend/generated-images.d.ts +1 -1
  5. package/dist/backend/generated-images.d.ts.map +1 -1
  6. package/dist/commands/serve.d.ts.map +1 -1
  7. package/dist/commands/serve.js +12 -1
  8. package/dist/designer/data/skills/blog-post.d.ts +3 -0
  9. package/dist/designer/data/skills/blog-post.d.ts.map +1 -0
  10. package/dist/designer/data/skills/blog-post.js +84 -0
  11. package/dist/designer/data/skills/blog-post.ts +87 -0
  12. package/dist/designer/data/skills/critique.d.ts +3 -0
  13. package/dist/designer/data/skills/critique.d.ts.map +1 -0
  14. package/dist/designer/data/skills/critique.js +109 -0
  15. package/dist/designer/data/skills/critique.ts +112 -0
  16. package/dist/designer/data/skills/dashboard.d.ts +3 -0
  17. package/dist/designer/data/skills/dashboard.d.ts.map +1 -0
  18. package/dist/designer/data/skills/dashboard.js +165 -0
  19. package/dist/designer/data/skills/dashboard.ts +168 -0
  20. package/dist/designer/data/skills/design-brief.d.ts +3 -0
  21. package/dist/designer/data/skills/design-brief.d.ts.map +1 -0
  22. package/dist/designer/data/skills/design-brief.js +141 -0
  23. package/dist/designer/data/skills/design-brief.ts +144 -0
  24. package/dist/designer/data/skills/design-skill.d.ts +10 -0
  25. package/dist/designer/data/skills/design-skill.d.ts.map +1 -0
  26. package/dist/designer/data/skills/design-skill.js +1 -0
  27. package/dist/designer/data/skills/design-skill.ts +9 -0
  28. package/dist/designer/data/skills/docs-page.d.ts +3 -0
  29. package/dist/designer/data/skills/docs-page.d.ts.map +1 -0
  30. package/dist/designer/data/skills/docs-page.js +68 -0
  31. package/dist/designer/data/skills/docs-page.ts +71 -0
  32. package/dist/designer/data/skills/index.d.ts +3 -0
  33. package/dist/designer/data/skills/index.d.ts.map +1 -0
  34. package/dist/designer/data/skills/index.js +28 -0
  35. package/dist/designer/data/skills/index.ts +30 -0
  36. package/dist/designer/data/skills/magazine-poster.d.ts +3 -0
  37. package/dist/designer/data/skills/magazine-poster.d.ts.map +1 -0
  38. package/dist/designer/data/skills/magazine-poster.js +70 -0
  39. package/dist/designer/data/skills/magazine-poster.ts +73 -0
  40. package/dist/designer/data/skills/mobile-app.d.ts +3 -0
  41. package/dist/designer/data/skills/mobile-app.d.ts.map +1 -0
  42. package/dist/designer/data/skills/mobile-app.js +229 -0
  43. package/dist/designer/data/skills/mobile-app.ts +232 -0
  44. package/dist/designer/data/skills/motion-frames.d.ts +3 -0
  45. package/dist/designer/data/skills/motion-frames.d.ts.map +1 -0
  46. package/dist/designer/data/skills/motion-frames.js +121 -0
  47. package/dist/designer/data/skills/motion-frames.ts +124 -0
  48. package/dist/designer/data/skills/pricing-page.d.ts +3 -0
  49. package/dist/designer/data/skills/pricing-page.d.ts.map +1 -0
  50. package/dist/designer/data/skills/pricing-page.js +76 -0
  51. package/dist/designer/data/skills/pricing-page.ts +79 -0
  52. package/dist/designer/data/skills/saas-landing.d.ts +3 -0
  53. package/dist/designer/data/skills/saas-landing.d.ts.map +1 -0
  54. package/dist/designer/data/skills/saas-landing.js +71 -0
  55. package/dist/designer/data/skills/saas-landing.ts +74 -0
  56. package/dist/designer/data/skills/slide-deck.d.ts +3 -0
  57. package/dist/designer/data/skills/slide-deck.d.ts.map +1 -0
  58. package/dist/designer/data/skills/slide-deck.js +213 -0
  59. package/dist/designer/data/skills/slide-deck.ts +216 -0
  60. package/dist/designer/data/skills/social-carousel.d.ts +3 -0
  61. package/dist/designer/data/skills/social-carousel.d.ts.map +1 -0
  62. package/dist/designer/data/skills/social-carousel.js +135 -0
  63. package/dist/designer/data/skills/social-carousel.ts +138 -0
  64. package/dist/designer/data/skills/web-prototype.d.ts +3 -0
  65. package/dist/designer/data/skills/web-prototype.d.ts.map +1 -0
  66. package/dist/designer/data/skills/web-prototype.js +159 -0
  67. package/dist/designer/data/skills/web-prototype.ts +162 -0
  68. package/dist/designer/skills.d.ts +4 -10
  69. package/dist/designer/skills.d.ts.map +1 -1
  70. package/dist/designer/skills.js +2 -1643
  71. package/dist/extensions/logic-trace.d.ts +1 -1
  72. package/dist/extensions/logic-trace.d.ts.map +1 -1
  73. package/dist/extensions/logic-trace.js +199 -70
  74. package/dist/extensions/video-generation/index.d.ts +3 -0
  75. package/dist/extensions/video-generation/index.d.ts.map +1 -0
  76. package/dist/extensions/video-generation/index.js +299 -0
  77. package/dist/extensions/wizard/index.js +9 -1
  78. package/dist/generated/parser/ast/nodes.d.ts +115 -0
  79. package/dist/generated/parser/ast/nodes.d.ts.map +1 -0
  80. package/dist/generated/parser/ast/nodes.js +8 -0
  81. package/dist/generated/parser/lexer/lexer.d.ts +28 -0
  82. package/dist/generated/parser/lexer/lexer.d.ts.map +1 -0
  83. package/dist/generated/parser/{lexer.js → lexer/lexer.js} +1 -180
  84. package/dist/generated/parser/{lexer.d.ts → lexer/tokens.d.ts} +5 -24
  85. package/dist/generated/parser/lexer/tokens.d.ts.map +1 -0
  86. package/dist/generated/parser/lexer/tokens.js +187 -0
  87. package/dist/generated/parser/mod.d.ts +5 -7
  88. package/dist/generated/parser/mod.d.ts.map +1 -1
  89. package/dist/generated/parser/mod.js +2 -1
  90. package/dist/generated/parser/parser/cursor.d.ts +47 -0
  91. package/dist/generated/parser/parser/cursor.d.ts.map +1 -0
  92. package/dist/generated/parser/parser/cursor.js +12 -0
  93. package/dist/generated/parser/parser/definitions.d.ts +16 -0
  94. package/dist/generated/parser/parser/definitions.d.ts.map +1 -0
  95. package/dist/generated/parser/parser/definitions.js +353 -0
  96. package/dist/generated/parser/parser/expressions.d.ts +17 -0
  97. package/dist/generated/parser/parser/expressions.d.ts.map +1 -0
  98. package/dist/generated/parser/parser/expressions.js +165 -0
  99. package/dist/generated/parser/parser.d.ts +18 -133
  100. package/dist/generated/parser/parser.d.ts.map +1 -1
  101. package/dist/generated/parser/parser.js +9 -505
  102. package/dist/generated/parser/tokenizer.d.ts +1 -2
  103. package/dist/generated/parser/tokenizer.d.ts.map +1 -1
  104. package/dist/generated/parser/tokenizer.js +2 -1
  105. package/dist/generated/parser/validator.d.ts +1 -1
  106. package/dist/generated/parser/validator.d.ts.map +1 -1
  107. package/dist/generated/zeus/const.d.ts.map +1 -1
  108. package/dist/generated/zeus/const.js +30 -0
  109. package/dist/generated/zeus/index.d.ts +140 -0
  110. package/dist/generated/zeus/index.d.ts.map +1 -1
  111. package/dist/generated/zeus/index.js +5 -0
  112. package/dist/mcp/glimpse-ui.js +9 -1
  113. package/dist/relay/dispatcher.d.ts +23 -104
  114. package/dist/relay/dispatcher.d.ts.map +1 -1
  115. package/dist/relay/dispatcher.js +21 -1130
  116. package/dist/relay/rest.d.ts +31 -0
  117. package/dist/relay/rest.d.ts.map +1 -0
  118. package/dist/relay/rest.js +85 -0
  119. package/dist/relay/routing.d.ts +109 -0
  120. package/dist/relay/routing.d.ts.map +1 -0
  121. package/dist/relay/routing.js +669 -0
  122. package/dist/relay/wizard-login.d.ts +17 -0
  123. package/dist/relay/wizard-login.d.ts.map +1 -0
  124. package/dist/relay/wizard-login.js +419 -0
  125. package/dist/sdk/agent-core/agent-loop.d.ts +2 -9
  126. package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
  127. package/dist/sdk/agent-core/agent-loop.js +17 -291
  128. package/dist/sdk/agent-core/agent.d.ts +11 -4
  129. package/dist/sdk/agent-core/agent.d.ts.map +1 -1
  130. package/dist/sdk/agent-core/agent.js +16 -4
  131. package/dist/sdk/agent-core/tool-call-registry.d.ts +75 -0
  132. package/dist/sdk/agent-core/tool-call-registry.d.ts.map +1 -0
  133. package/dist/sdk/agent-core/tool-call-registry.js +131 -0
  134. package/dist/sdk/agent-core/tool-execution.d.ts +33 -0
  135. package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -0
  136. package/dist/sdk/agent-core/tool-execution.js +399 -0
  137. package/dist/sdk/agent-core/types.d.ts +15 -4
  138. package/dist/sdk/agent-core/types.d.ts.map +1 -1
  139. package/dist/sdk/ai/env-api-keys.js +9 -1
  140. package/dist/sdk/ai/index.d.ts +3 -0
  141. package/dist/sdk/ai/index.d.ts.map +1 -1
  142. package/dist/sdk/ai/index.js +3 -0
  143. package/dist/sdk/ai/providers/faux.d.ts.map +1 -1
  144. package/dist/sdk/ai/providers/faux.js +3 -0
  145. package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts +39 -6
  146. package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts.map +1 -1
  147. package/dist/sdk/ai/providers/leaked-tool-call-parser.js +159 -18
  148. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts +48 -0
  149. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts.map +1 -0
  150. package/dist/sdk/ai/providers/openai/reasoning-replay.js +209 -0
  151. package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
  152. package/dist/sdk/ai/providers/openai-completions.js +23 -211
  153. package/dist/sdk/ai/providers/openrouter-videos.d.ts +3 -0
  154. package/dist/sdk/ai/providers/openrouter-videos.d.ts.map +1 -0
  155. package/dist/sdk/ai/providers/openrouter-videos.js +412 -0
  156. package/dist/sdk/ai/providers/register-builtins.d.ts.map +1 -1
  157. package/dist/sdk/ai/providers/register-builtins.js +6 -0
  158. package/dist/sdk/ai/providers/simple-options.d.ts +1 -6
  159. package/dist/sdk/ai/providers/simple-options.d.ts.map +1 -1
  160. package/dist/sdk/ai/providers/simple-options.js +0 -22
  161. package/dist/sdk/ai/providers/transform-messages.d.ts.map +1 -1
  162. package/dist/sdk/ai/providers/transform-messages.js +52 -1
  163. package/dist/sdk/ai/types.d.ts +91 -10
  164. package/dist/sdk/ai/types.d.ts.map +1 -1
  165. package/dist/sdk/ai/video-models.d.ts +10 -0
  166. package/dist/sdk/ai/video-models.d.ts.map +1 -0
  167. package/dist/sdk/ai/video-models.generated.d.ts +440 -0
  168. package/dist/sdk/ai/video-models.generated.d.ts.map +1 -0
  169. package/dist/sdk/ai/video-models.generated.js +441 -0
  170. package/dist/sdk/ai/video-models.js +22 -0
  171. package/dist/sdk/ai/videos-api-registry.d.ts +14 -0
  172. package/dist/sdk/ai/videos-api-registry.d.ts.map +1 -0
  173. package/dist/sdk/ai/videos-api-registry.js +21 -0
  174. package/dist/sdk/ai/videos.d.ts +4 -0
  175. package/dist/sdk/ai/videos.d.ts.map +1 -0
  176. package/dist/sdk/ai/videos.js +13 -0
  177. package/dist/sdk/coding-agent/core/agent-session.d.ts +8 -0
  178. package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
  179. package/dist/sdk/coding-agent/core/agent-session.js +11 -0
  180. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts +6 -118
  181. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts.map +1 -1
  182. package/dist/sdk/coding-agent/core/compaction/compaction.js +11 -733
  183. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts +58 -0
  184. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts.map +1 -0
  185. package/dist/sdk/coding-agent/core/compaction/cut-points.js +191 -0
  186. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts +28 -0
  187. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts.map +1 -0
  188. package/dist/sdk/coding-agent/core/compaction/dedupe.js +156 -0
  189. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts +21 -0
  190. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts.map +1 -0
  191. package/dist/sdk/coding-agent/core/compaction/summarize.js +181 -0
  192. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts +47 -0
  193. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts.map +1 -0
  194. package/dist/sdk/coding-agent/core/compaction/tokens.js +224 -0
  195. package/dist/sdk/coding-agent/core/extensions/loader.d.ts.map +1 -1
  196. package/dist/sdk/coding-agent/core/extensions/loader.js +14 -0
  197. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts +26 -0
  198. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts.map +1 -1
  199. package/dist/sdk/coding-agent/core/extensions/native-extensions.js +23 -0
  200. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +157 -0
  201. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -0
  202. package/dist/sdk/coding-agent/core/extensions/session-events.js +13 -0
  203. package/dist/sdk/coding-agent/core/extensions/types.d.ts +10 -367
  204. package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
  205. package/dist/sdk/coding-agent/core/extensions/types.js +2 -10
  206. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts +219 -0
  207. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts.map +1 -0
  208. package/dist/sdk/coding-agent/core/extensions/ui-types.js +4 -0
  209. package/dist/sdk/coding-agent/core/messages.d.ts.map +1 -1
  210. package/dist/sdk/coding-agent/core/messages.js +42 -2
  211. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts +115 -0
  212. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts.map +1 -0
  213. package/dist/sdk/coding-agent/core/package/default-package-manager.js +1184 -0
  214. package/dist/sdk/coding-agent/core/package/discovery.d.ts +20 -0
  215. package/dist/sdk/coding-agent/core/package/discovery.d.ts.map +1 -0
  216. package/dist/sdk/coding-agent/core/package/discovery.js +283 -0
  217. package/dist/sdk/coding-agent/core/package/ignore.d.ts +29 -0
  218. package/dist/sdk/coding-agent/core/package/ignore.d.ts.map +1 -0
  219. package/dist/sdk/coding-agent/core/package/ignore.js +235 -0
  220. package/dist/sdk/coding-agent/core/package/types.d.ts +128 -0
  221. package/dist/sdk/coding-agent/core/package/types.d.ts.map +1 -0
  222. package/dist/sdk/coding-agent/core/package/types.js +18 -0
  223. package/dist/sdk/coding-agent/core/package/update-check.d.ts +43 -0
  224. package/dist/sdk/coding-agent/core/package/update-check.d.ts.map +1 -0
  225. package/dist/sdk/coding-agent/core/package/update-check.js +253 -0
  226. package/dist/sdk/coding-agent/core/package-manager.d.ts +2 -188
  227. package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
  228. package/dist/sdk/coding-agent/core/package-manager.js +1 -1940
  229. package/dist/sdk/coding-agent/core/resource-loader.d.ts +11 -0
  230. package/dist/sdk/coding-agent/core/resource-loader.d.ts.map +1 -1
  231. package/dist/sdk/coding-agent/core/resource-loader.js +23 -6
  232. package/dist/sdk/coding-agent/core/sdk.d.ts +24 -2
  233. package/dist/sdk/coding-agent/core/sdk.d.ts.map +1 -1
  234. package/dist/sdk/coding-agent/core/sdk.js +15 -3
  235. package/dist/sdk/coding-agent/core/session/migrate.d.ts +18 -0
  236. package/dist/sdk/coding-agent/core/session/migrate.d.ts.map +1 -0
  237. package/dist/sdk/coding-agent/core/session/migrate.js +78 -0
  238. package/dist/sdk/coding-agent/core/session/types.d.ts +165 -0
  239. package/dist/sdk/coding-agent/core/session/types.d.ts.map +1 -0
  240. package/dist/sdk/coding-agent/core/session/types.js +4 -0
  241. package/dist/sdk/coding-agent/core/session-manager.d.ts +3 -161
  242. package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
  243. package/dist/sdk/coding-agent/core/session-manager.js +4 -72
  244. package/dist/sdk/coding-agent/core/settings-manager.d.ts +0 -8
  245. package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
  246. package/dist/sdk/coding-agent/core/settings-manager.js +3 -3
  247. package/dist/sdk/coding-agent/index.d.ts +2 -2
  248. package/dist/sdk/coding-agent/index.d.ts.map +1 -1
  249. package/dist/sdk/coding-agent/index.js +1 -1
  250. package/dist/sdk-public.d.ts +96 -0
  251. package/dist/sdk-public.d.ts.map +1 -0
  252. package/dist/sdk-public.js +109 -0
  253. package/dist/server/agent-bridge/rehydrate.d.ts +2 -2
  254. package/dist/server/agent-bridge/rehydrate.d.ts.map +1 -1
  255. package/dist/server/agent-bridge/rehydrate.js +14 -0
  256. package/dist/server/agent-bridge.d.ts +8 -2
  257. package/dist/server/agent-bridge.d.ts.map +1 -1
  258. package/dist/server/agent-bridge.js +25 -2
  259. package/dist/server/session-stream.d.ts +19 -0
  260. package/dist/server/session-stream.d.ts.map +1 -1
  261. package/dist/server/session-stream.js +35 -0
  262. package/dist/server/wire.d.ts +13 -0
  263. package/dist/server/wire.d.ts.map +1 -1
  264. package/package.json +8 -2
  265. package/dist/generated/parser/lexer.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import OpenAI from "openai";
2
- import { coerceLeakedParameterValue, extractLeakedToolCalls, findLeakedToolCallOpener, } from "./leaked-tool-call-parser.js";
2
+ import { coerceLeakedParameterValue, extractLeakedToolCalls, findLeakedToolCallOpener, salvageLeakedToolCallTail, } from "./leaked-tool-call-parser.js";
3
3
  import { backendHostedImageResolver } from "../utils/hosted-image-resolver.js";
4
4
  import { getApiUrl, readConfig } from "../../../config.js";
5
5
  import { getEnvApiKey } from "../env-api-keys.js";
@@ -13,6 +13,7 @@ import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
13
13
  import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
14
14
  import { buildBaseOptions } from "./simple-options.js";
15
15
  import { transformMessages } from "./transform-messages.js";
16
+ import { assistantHasReasoningReplay, extractReasoningDelta, extractReasoningMetadata, extractReasoningSignature, hasEncryptedReasoningMetadata, mergeThinkingMetadata, normalizeReasoningReplayField, setAssistantReasoningField, setAssistantReasoningLifecycleSidecars, splitInlineThinkingDelta, } from "./openai/reasoning-replay.js";
16
17
  /**
17
18
  * Check if conversation messages contain tool calls or tool results.
18
19
  * This is needed because Anthropic (via proxy) requires the tools param
@@ -76,15 +77,6 @@ async function backendImageBaseUrl(explicit) {
76
77
  function defaultWarn(message) {
77
78
  console.warn(`[spectral] ${message}`);
78
79
  }
79
- const SAFE_REASONING_REPLAY_FIELDS = [
80
- "reasoning_content",
81
- "reasoning",
82
- "reasoning_text",
83
- "reasoning_summary",
84
- "reasoning_summary_text",
85
- "summary_text",
86
- "summary",
87
- ];
88
80
  function isOpenRouterModel(model) {
89
81
  return model.provider === "openrouter" ||
90
82
  model.baseUrl.includes("openrouter.ai");
@@ -99,200 +91,6 @@ function resolveCacheRetention(cacheRetention) {
99
91
  }
100
92
  return "short";
101
93
  }
102
- function asRecord(value) {
103
- return typeof value === "object" && value !== null && !Array.isArray(value)
104
- ? value
105
- : undefined;
106
- }
107
- function collectReasoningText(value) {
108
- if (typeof value === "string")
109
- return value;
110
- if (Array.isArray(value))
111
- return value.map(collectReasoningText).join("");
112
- const record = asRecord(value);
113
- if (!record)
114
- return "";
115
- const direct = [
116
- record.delta,
117
- record.text,
118
- record.value,
119
- record.output_text,
120
- record.reasoning_text,
121
- record.reasoning_content,
122
- record.reasoning_summary,
123
- record.reasoning_summary_text,
124
- record.summary_text,
125
- ];
126
- for (const candidate of direct) {
127
- if (typeof candidate === "string" && candidate.length > 0)
128
- return candidate;
129
- }
130
- return [record.summary, record.parts, record.content, record.annotations]
131
- .map(collectReasoningText)
132
- .join("");
133
- }
134
- function extractReasoningDelta(deltaFields) {
135
- const reasoningFields = [
136
- "reasoning_content",
137
- "reasoning",
138
- "reasoning_text",
139
- "reasoning_summary",
140
- "reasoning_summary_text",
141
- "summary_text",
142
- "summary",
143
- ];
144
- for (const field of reasoningFields) {
145
- const delta = collectReasoningText(deltaFields[field]);
146
- if (delta.length > 0)
147
- return { field, delta };
148
- }
149
- const details = collectReasoningText(deltaFields.reasoning_details);
150
- return details.length > 0
151
- ? { field: "reasoning_details", delta: details }
152
- : undefined;
153
- }
154
- function extractReasoningSignature(value) {
155
- if (typeof value === "string" && value.length > 0)
156
- return value;
157
- const record = asRecord(value);
158
- if (!record)
159
- return undefined;
160
- for (const candidate of [
161
- record.id,
162
- record.item_id,
163
- record.data,
164
- ]) {
165
- if (typeof candidate === "string" && candidate.length > 0)
166
- return candidate;
167
- }
168
- return undefined;
169
- }
170
- function extractReasoningMetadata(value) {
171
- const record = asRecord(value);
172
- if (!record)
173
- return undefined;
174
- const metadata = {};
175
- for (const key of [
176
- "id",
177
- "item_id",
178
- "output_index",
179
- "summary_index",
180
- "encrypted_content",
181
- "type",
182
- ]) {
183
- if (record[key] !== undefined && record[key] !== null)
184
- metadata[key] = record[key];
185
- }
186
- return Object.keys(metadata).length > 0 ? metadata : undefined;
187
- }
188
- function stringMetadata(metadata, key) {
189
- const value = metadata?.[key];
190
- return typeof value === "string" && value.length > 0 ? value : undefined;
191
- }
192
- function numberMetadata(metadata, key) {
193
- const value = metadata?.[key];
194
- return typeof value === "number" && Number.isFinite(value) ? value : undefined;
195
- }
196
- function hasEncryptedReasoningMetadata(block) {
197
- return stringMetadata(block.thinkingMetadata, "encrypted_content") !== undefined;
198
- }
199
- function buildResponsesReasoningSidecar(metadata, includeOutputIndex) {
200
- const sidecar = {};
201
- const id = stringMetadata(metadata, "id");
202
- if (id)
203
- sidecar.id = id;
204
- const itemId = stringMetadata(metadata, "item_id");
205
- if (itemId)
206
- sidecar.item_id = itemId;
207
- if (includeOutputIndex) {
208
- const outputIndex = numberMetadata(metadata, "output_index");
209
- if (outputIndex !== undefined)
210
- sidecar.output_index = outputIndex;
211
- const summaryIndex = numberMetadata(metadata, "summary_index");
212
- if (summaryIndex !== undefined)
213
- sidecar.summary_index = summaryIndex;
214
- }
215
- const encryptedContent = stringMetadata(metadata, "encrypted_content");
216
- if (encryptedContent)
217
- sidecar.encrypted_content = encryptedContent;
218
- return sidecar;
219
- }
220
- function isSafeReasoningReplayField(field) {
221
- return SAFE_REASONING_REPLAY_FIELDS.includes(field);
222
- }
223
- function normalizeReasoningReplayField(field, model) {
224
- const normalized = model.provider === "opencode-go" && field === "reasoning"
225
- ? "reasoning_content"
226
- : field;
227
- return normalized && isSafeReasoningReplayField(normalized)
228
- ? normalized
229
- : "reasoning_content";
230
- }
231
- function setAssistantReasoningField(message, field, value) {
232
- const messageWithSidecars = message;
233
- messageWithSidecars[field] = value;
234
- }
235
- function setAssistantReasoningLifecycleSidecars(message, blocks) {
236
- const encryptedBlock = blocks.find(hasEncryptedReasoningMetadata);
237
- if (!encryptedBlock)
238
- return;
239
- const messageWithSidecars = message;
240
- messageWithSidecars.reasoning_start = buildResponsesReasoningSidecar(encryptedBlock.thinkingMetadata, true);
241
- messageWithSidecars.reasoning_content = blocks
242
- .map((block) => block.thinking)
243
- .join("\n");
244
- messageWithSidecars.reasoning_end = buildResponsesReasoningSidecar(encryptedBlock.thinkingMetadata, false);
245
- }
246
- function assistantHasReasoningReplay(message) {
247
- const messageWithSidecars = message;
248
- return messageWithSidecars.reasoning_start !== undefined ||
249
- messageWithSidecars.reasoning_end !== undefined ||
250
- SAFE_REASONING_REPLAY_FIELDS.some((field) => typeof messageWithSidecars[field] === "string");
251
- }
252
- function mergeThinkingMetadata(block, metadata) {
253
- if (!metadata)
254
- return;
255
- block.thinkingMetadata = { ...(block.thinkingMetadata ?? {}), ...metadata };
256
- }
257
- function splitInlineThinkingDelta(pending, inInlineThinking, delta) {
258
- const parts = [];
259
- let buffer = pending + delta;
260
- let thinking = inInlineThinking;
261
- const append = (type, value) => {
262
- if (!value)
263
- return;
264
- const last = parts[parts.length - 1];
265
- if (last?.type === type) {
266
- last.delta += value;
267
- return;
268
- }
269
- parts.push({ type, delta: value });
270
- };
271
- while (buffer.length > 0) {
272
- const tag = thinking ? "</think>" : "<think>";
273
- const idx = buffer.toLowerCase().indexOf(tag);
274
- if (idx >= 0) {
275
- append(thinking ? "thinking" : "text", buffer.slice(0, idx));
276
- buffer = buffer.slice(idx + tag.length);
277
- thinking = !thinking;
278
- continue;
279
- }
280
- const maxTagLength = "</think>".length - 1;
281
- let keep = 0;
282
- const limit = Math.min(maxTagLength, buffer.length);
283
- for (let size = limit; size > 0; size--) {
284
- const suffix = buffer.slice(-size).toLowerCase();
285
- if ("<think>".startsWith(suffix) || "</think>".startsWith(suffix)) {
286
- keep = size;
287
- break;
288
- }
289
- }
290
- append(thinking ? "thinking" : "text", buffer.slice(0, buffer.length - keep));
291
- buffer = buffer.slice(buffer.length - keep);
292
- break;
293
- }
294
- return { parts, pending: buffer, inInlineThinking: thinking };
295
- }
296
94
  export const streamOpenAICompletions = (model, context, options) => {
297
95
  const stream = new AssistantMessageEventStream();
298
96
  (async () => {
@@ -381,9 +179,11 @@ export const streamOpenAICompletions = (model, context, options) => {
381
179
  let inlineThinkingPending = "";
382
180
  let inInlineThinking = false;
383
181
  // Leaked tool-call XML: some OpenRouter models emit antml-style
384
- // markup in plain content instead of native tool_calls. Text is
385
- // buffered here until a complete wrapper block arrives, then parsed
386
- // into real toolCall blocks (see leaked-tool-call-parser.ts).
182
+ // markup in plain content instead of native tool_calls — either a
183
+ // wrapper block or orphan pi-style invoke blocks with no wrapper
184
+ // at all. Text is buffered here until a complete block arrives,
185
+ // then parsed into real toolCall blocks (see
186
+ // leaked-tool-call-parser.ts).
387
187
  let leakMode = false;
388
188
  let leakBuffer = "";
389
189
  let leakPending = "";
@@ -750,11 +550,23 @@ export const streamOpenAICompletions = (model, context, options) => {
750
550
  }
751
551
  inlineThinkingPending = "";
752
552
  }
753
- // Flush leak buffers. A never-closed block is emitted as plain text
754
- // (graceful degradation) so no content is lost; a held-back tail
755
- // without an opener is just prose.
553
+ // Flush leak buffers. A never-closed block is first offered to the
554
+ // end-of-stream salvage (models that were cut off after emitting
555
+ // complete parameter values); whatever it cannot recover is emitted
556
+ // as plain text (graceful degradation) so no content is lost. A
557
+ // held-back tail without an opener is just prose.
756
558
  if (leakMode && leakBuffer) {
757
- emitTextDelta(leakBuffer);
559
+ const salvaged = salvageLeakedToolCallTail(leakBuffer);
560
+ if (salvaged &&
561
+ salvaged.length > 0 &&
562
+ salvaged.every((call) => availableToolNames.has(call.name))) {
563
+ for (const call of salvaged)
564
+ emitSyntheticToolCall(call);
565
+ emittedLeakedToolCalls = true;
566
+ }
567
+ else {
568
+ emitTextDelta(leakBuffer);
569
+ }
758
570
  leakBuffer = "";
759
571
  leakMode = false;
760
572
  }
@@ -0,0 +1,3 @@
1
+ import type { ProviderVideosOptions, VideosContext, VideosModel, VideosResult } from "../types.js";
2
+ export declare function generateOpenRouterVideos(model: VideosModel<"openrouter-videos">, context: VideosContext, options?: ProviderVideosOptions): Promise<VideosResult>;
3
+ //# sourceMappingURL=openrouter-videos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter-videos.d.ts","sourceRoot":"","sources":["../../../../src/sdk/ai/providers/openrouter-videos.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,qBAAqB,EAIrB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,MAAM,aAAa,CAAC;AAgarB,wBAAsB,wBAAwB,CAC7C,KAAK,EAAE,WAAW,CAAC,mBAAmB,CAAC,EACvC,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,qBAA0B,GACjC,OAAO,CAAC,YAAY,CAAC,CAkCvB"}