@code-yeongyu/senpi 2026.8.11 → 2026.8.12

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 (482) hide show
  1. package/CHANGELOG.md +185 -0
  2. package/dist/brand-dir-migration.d.ts +28 -0
  3. package/dist/brand-dir-migration.d.ts.map +1 -0
  4. package/dist/brand-dir-migration.js +77 -0
  5. package/dist/brand-dir-migration.js.map +1 -0
  6. package/dist/cli/grok-neo-gate.d.ts +0 -8
  7. package/dist/cli/grok-neo-gate.d.ts.map +1 -1
  8. package/dist/cli/grok-neo-gate.js +4 -2
  9. package/dist/cli/grok-neo-gate.js.map +1 -1
  10. package/dist/cli-main.d.ts +1 -1
  11. package/dist/cli-main.d.ts.map +1 -1
  12. package/dist/cli-main.js +4 -0
  13. package/dist/cli-main.js.map +1 -1
  14. package/dist/cli.d.ts +1 -1
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +3 -2
  17. package/dist/cli.js.map +1 -1
  18. package/dist/config.d.ts +27 -1
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +41 -9
  21. package/dist/config.js.map +1 -1
  22. package/dist/core/agent-session.d.ts +8 -2
  23. package/dist/core/agent-session.d.ts.map +1 -1
  24. package/dist/core/agent-session.js +73 -11
  25. package/dist/core/agent-session.js.map +1 -1
  26. package/dist/core/brand.d.ts +79 -0
  27. package/dist/core/brand.d.ts.map +1 -0
  28. package/dist/core/brand.js +141 -0
  29. package/dist/core/brand.js.map +1 -0
  30. package/dist/core/dynamic-prompt/identity.d.ts.map +1 -1
  31. package/dist/core/dynamic-prompt/identity.js +2 -1
  32. package/dist/core/dynamic-prompt/identity.js.map +1 -1
  33. package/dist/core/event-bus.d.ts +5 -0
  34. package/dist/core/event-bus.d.ts.map +1 -1
  35. package/dist/core/event-bus.js +1 -0
  36. package/dist/core/event-bus.js.map +1 -1
  37. package/dist/core/experimental.d.ts.map +1 -1
  38. package/dist/core/experimental.js +2 -1
  39. package/dist/core/experimental.js.map +1 -1
  40. package/dist/core/extensions/builtin/btw/index.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/btw/index.js +7 -2
  42. package/dist/core/extensions/builtin/btw/index.js.map +1 -1
  43. package/dist/core/extensions/builtin/btw/side-query.d.ts +2 -0
  44. package/dist/core/extensions/builtin/btw/side-query.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/btw/side-query.js +39 -2
  46. package/dist/core/extensions/builtin/btw/side-query.js.map +1 -1
  47. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +2 -0
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -0
  49. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +24 -0
  50. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -0
  51. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts +4 -0
  52. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +1 -1
  53. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js +5 -2
  54. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -1
  55. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts +6 -1
  56. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +16 -0
  58. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
  59. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
  60. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js +10 -1
  61. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js.map +1 -1
  62. package/dist/core/extensions/builtin/compaction/index.d.ts +1 -0
  63. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  64. package/dist/core/extensions/builtin/compaction/index.js +1 -1
  65. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  66. package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
  67. package/dist/core/extensions/builtin/compaction/log.js +2 -1
  68. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  69. package/dist/core/extensions/builtin/config-reload/generated-shim-filter.d.ts.map +1 -1
  70. package/dist/core/extensions/builtin/config-reload/generated-shim-filter.js +4 -4
  71. package/dist/core/extensions/builtin/config-reload/generated-shim-filter.js.map +1 -1
  72. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  73. package/dist/core/extensions/builtin/goal/index.js +5 -0
  74. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  75. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +2 -2
  76. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  77. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +3 -3
  78. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  79. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  80. package/dist/core/extensions/builtin/goal/monitor-continuation.js +6 -0
  81. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  82. package/dist/core/extensions/builtin/goal/store.d.ts +3 -2
  83. package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
  84. package/dist/core/extensions/builtin/goal/store.js +128 -101
  85. package/dist/core/extensions/builtin/goal/store.js.map +1 -1
  86. package/dist/core/extensions/builtin/goal/transitions.js +2 -1
  87. package/dist/core/extensions/builtin/goal/transitions.js.map +1 -1
  88. package/dist/core/extensions/builtin/help/index.d.ts.map +1 -1
  89. package/dist/core/extensions/builtin/help/index.js +3 -2
  90. package/dist/core/extensions/builtin/help/index.js.map +1 -1
  91. package/dist/core/extensions/builtin/imagegen/auth.d.ts +45 -0
  92. package/dist/core/extensions/builtin/imagegen/auth.d.ts.map +1 -0
  93. package/dist/core/extensions/builtin/imagegen/auth.js +137 -0
  94. package/dist/core/extensions/builtin/imagegen/auth.js.map +1 -0
  95. package/dist/core/extensions/builtin/imagegen/index.d.ts +5 -0
  96. package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -0
  97. package/dist/core/extensions/builtin/imagegen/index.js +46 -0
  98. package/dist/core/extensions/builtin/imagegen/index.js.map +1 -0
  99. package/dist/core/extensions/builtin/imagegen/paths.d.ts +26 -0
  100. package/dist/core/extensions/builtin/imagegen/paths.d.ts.map +1 -0
  101. package/dist/core/extensions/builtin/imagegen/paths.js +52 -0
  102. package/dist/core/extensions/builtin/imagegen/paths.js.map +1 -0
  103. package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +67 -0
  104. package/dist/core/extensions/builtin/imagegen/state.d.ts +26 -0
  105. package/dist/core/extensions/builtin/imagegen/state.d.ts.map +1 -0
  106. package/dist/core/extensions/builtin/imagegen/state.js +35 -0
  107. package/dist/core/extensions/builtin/imagegen/state.js.map +1 -0
  108. package/dist/core/extensions/builtin/imagegen/tool.d.ts +31 -0
  109. package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -0
  110. package/dist/core/extensions/builtin/imagegen/tool.js +174 -0
  111. package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -0
  112. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  113. package/dist/core/extensions/builtin/index.js +9 -1
  114. package/dist/core/extensions/builtin/index.js.map +1 -1
  115. package/dist/core/extensions/builtin/mcp/control-inventory.d.ts +14 -0
  116. package/dist/core/extensions/builtin/mcp/control-inventory.d.ts.map +1 -0
  117. package/dist/core/extensions/builtin/mcp/control-inventory.js +22 -0
  118. package/dist/core/extensions/builtin/mcp/control-inventory.js.map +1 -0
  119. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts +2 -44
  120. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts.map +1 -1
  121. package/dist/core/extensions/builtin/mcp/expose/native-search.js +3 -97
  122. package/dist/core/extensions/builtin/mcp/expose/native-search.js.map +1 -1
  123. package/dist/core/extensions/builtin/mcp/expose/proxy.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/mcp/expose/proxy.js +15 -4
  125. package/dist/core/extensions/builtin/mcp/expose/proxy.js.map +1 -1
  126. package/dist/core/extensions/builtin/mcp/expose/session.d.ts +2 -1
  127. package/dist/core/extensions/builtin/mcp/expose/session.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/mcp/expose/session.js +2 -2
  129. package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
  130. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts +13 -11
  131. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/mcp/expose/tier-b.js +58 -59
  133. package/dist/core/extensions/builtin/mcp/expose/tier-b.js.map +1 -1
  134. package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/mcp/index.js +28 -36
  136. package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
  137. package/dist/core/extensions/builtin/mcp/service-register.d.ts +2 -1
  138. package/dist/core/extensions/builtin/mcp/service-register.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/mcp/service-register.js +2 -2
  140. package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
  141. package/dist/core/extensions/builtin/mcp/service-types.d.ts +4 -0
  142. package/dist/core/extensions/builtin/mcp/service-types.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/mcp/service-types.js.map +1 -1
  144. package/dist/core/extensions/builtin/mcp/service.d.ts +6 -11
  145. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/mcp/service.js +79 -41
  147. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  148. package/dist/core/extensions/builtin/mcp/wrap.d.ts +2 -0
  149. package/dist/core/extensions/builtin/mcp/wrap.d.ts.map +1 -1
  150. package/dist/core/extensions/builtin/mcp/wrap.js +3 -0
  151. package/dist/core/extensions/builtin/mcp/wrap.js.map +1 -1
  152. package/dist/core/extensions/builtin/openai-image-gen/externalize.d.ts +27 -0
  153. package/dist/core/extensions/builtin/openai-image-gen/externalize.d.ts.map +1 -0
  154. package/dist/core/extensions/builtin/openai-image-gen/externalize.js +133 -0
  155. package/dist/core/extensions/builtin/openai-image-gen/externalize.js.map +1 -0
  156. package/dist/core/extensions/builtin/openai-image-gen/gate.d.ts +21 -0
  157. package/dist/core/extensions/builtin/openai-image-gen/gate.d.ts.map +1 -0
  158. package/dist/core/extensions/builtin/openai-image-gen/gate.js +63 -0
  159. package/dist/core/extensions/builtin/openai-image-gen/gate.js.map +1 -0
  160. package/dist/core/extensions/builtin/openai-image-gen/index.d.ts +14 -0
  161. package/dist/core/extensions/builtin/openai-image-gen/index.d.ts.map +1 -0
  162. package/dist/core/extensions/builtin/openai-image-gen/index.js +77 -0
  163. package/dist/core/extensions/builtin/openai-image-gen/index.js.map +1 -0
  164. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts +15 -0
  165. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts.map +1 -0
  166. package/dist/core/extensions/builtin/openai-image-gen/inject.js +42 -0
  167. package/dist/core/extensions/builtin/openai-image-gen/inject.js.map +1 -0
  168. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.d.ts.map +1 -1
  169. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +2 -1
  170. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
  171. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.d.ts.map +1 -1
  172. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +2 -1
  173. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
  174. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts.map +1 -1
  175. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +2 -1
  176. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
  177. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  178. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +2 -1
  179. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  180. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.d.ts.map +1 -1
  181. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js +6 -5
  182. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js.map +1 -1
  183. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
  184. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +2 -1
  185. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  186. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/terminal/monitor-notify.js +8 -1
  188. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  189. package/dist/core/extensions/builtin/terminal/notify.d.ts +3 -1
  190. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  191. package/dist/core/extensions/builtin/terminal/notify.js +4 -1
  192. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  193. package/dist/core/extensions/builtin/tool-search/engine/bm25.d.ts +22 -0
  194. package/dist/core/extensions/builtin/tool-search/engine/bm25.d.ts.map +1 -0
  195. package/dist/core/extensions/builtin/{mcp/expose → tool-search/engine}/bm25.js +16 -31
  196. package/dist/core/extensions/builtin/tool-search/engine/bm25.js.map +1 -0
  197. package/dist/core/extensions/builtin/tool-search/engine/document.d.ts +14 -0
  198. package/dist/core/extensions/builtin/tool-search/engine/document.d.ts.map +1 -0
  199. package/dist/core/extensions/builtin/tool-search/engine/document.js +2 -0
  200. package/dist/core/extensions/builtin/tool-search/engine/document.js.map +1 -0
  201. package/dist/core/extensions/builtin/tool-search/engine/marker.d.ts +55 -0
  202. package/dist/core/extensions/builtin/tool-search/engine/marker.d.ts.map +1 -0
  203. package/dist/core/extensions/builtin/tool-search/engine/marker.js +189 -0
  204. package/dist/core/extensions/builtin/tool-search/engine/marker.js.map +1 -0
  205. package/dist/core/extensions/builtin/tool-search/index.d.ts +7 -0
  206. package/dist/core/extensions/builtin/tool-search/index.d.ts.map +1 -0
  207. package/dist/core/extensions/builtin/tool-search/index.js +71 -0
  208. package/dist/core/extensions/builtin/tool-search/index.js.map +1 -0
  209. package/dist/core/extensions/builtin/tool-search/native-search.d.ts +52 -0
  210. package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -0
  211. package/dist/core/extensions/builtin/tool-search/native-search.js +116 -0
  212. package/dist/core/extensions/builtin/tool-search/native-search.js.map +1 -0
  213. package/dist/core/extensions/builtin/tool-search/service.d.ts +38 -0
  214. package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -0
  215. package/dist/core/extensions/builtin/tool-search/service.js +200 -0
  216. package/dist/core/extensions/builtin/tool-search/service.js.map +1 -0
  217. package/dist/core/extensions/builtin/tool-search/tool.d.ts +21 -0
  218. package/dist/core/extensions/builtin/tool-search/tool.d.ts.map +1 -0
  219. package/dist/core/extensions/builtin/tool-search/tool.js +95 -0
  220. package/dist/core/extensions/builtin/tool-search/tool.js.map +1 -0
  221. package/dist/core/extensions/index.d.ts +1 -1
  222. package/dist/core/extensions/index.d.ts.map +1 -1
  223. package/dist/core/extensions/index.js.map +1 -1
  224. package/dist/core/extensions/loader.d.ts.map +1 -1
  225. package/dist/core/extensions/loader.js +31 -1
  226. package/dist/core/extensions/loader.js.map +1 -1
  227. package/dist/core/extensions/runner.d.ts +5 -1
  228. package/dist/core/extensions/runner.d.ts.map +1 -1
  229. package/dist/core/extensions/runner.js +28 -1
  230. package/dist/core/extensions/runner.js.map +1 -1
  231. package/dist/core/extensions/types.d.ts +61 -4
  232. package/dist/core/extensions/types.d.ts.map +1 -1
  233. package/dist/core/extensions/types.js +11 -0
  234. package/dist/core/extensions/types.js.map +1 -1
  235. package/dist/core/generated-shim-banner.d.ts +15 -0
  236. package/dist/core/generated-shim-banner.d.ts.map +1 -0
  237. package/dist/core/generated-shim-banner.js +26 -0
  238. package/dist/core/generated-shim-banner.js.map +1 -0
  239. package/dist/core/model-runtime.d.ts.map +1 -1
  240. package/dist/core/model-runtime.js +7 -3
  241. package/dist/core/model-runtime.js.map +1 -1
  242. package/dist/core/package-manager.d.ts.map +1 -1
  243. package/dist/core/package-manager.js +2 -1
  244. package/dist/core/package-manager.js.map +1 -1
  245. package/dist/core/provider-composer.d.ts +10 -1
  246. package/dist/core/provider-composer.d.ts.map +1 -1
  247. package/dist/core/provider-composer.js +9 -0
  248. package/dist/core/provider-composer.js.map +1 -1
  249. package/dist/core/resource-loader.d.ts.map +1 -1
  250. package/dist/core/resource-loader.js +21 -10
  251. package/dist/core/resource-loader.js.map +1 -1
  252. package/dist/core/session-log.d.ts.map +1 -1
  253. package/dist/core/session-log.js +4 -2
  254. package/dist/core/session-log.js.map +1 -1
  255. package/dist/core/settings-manager.d.ts.map +1 -1
  256. package/dist/core/settings-manager.js +3 -2
  257. package/dist/core/settings-manager.js.map +1 -1
  258. package/dist/core/telemetry.d.ts.map +1 -1
  259. package/dist/core/telemetry.js +2 -1
  260. package/dist/core/telemetry.js.map +1 -1
  261. package/dist/core/timings.d.ts +0 -4
  262. package/dist/core/timings.d.ts.map +1 -1
  263. package/dist/core/timings.js +2 -1
  264. package/dist/core/timings.js.map +1 -1
  265. package/dist/index.d.ts +2 -2
  266. package/dist/index.d.ts.map +1 -1
  267. package/dist/index.js.map +1 -1
  268. package/dist/inspector-policy.d.ts.map +1 -1
  269. package/dist/inspector-policy.js +2 -1
  270. package/dist/inspector-policy.js.map +1 -1
  271. package/dist/main.d.ts.map +1 -1
  272. package/dist/main.js +5 -4
  273. package/dist/main.js.map +1 -1
  274. package/dist/migrations.d.ts.map +1 -1
  275. package/dist/migrations.js +4 -0
  276. package/dist/migrations.js.map +1 -1
  277. package/dist/modes/index.d.ts +2 -2
  278. package/dist/modes/index.d.ts.map +1 -1
  279. package/dist/modes/index.js +1 -1
  280. package/dist/modes/index.js.map +1 -1
  281. package/dist/modes/interactive/external-editor.d.ts +2 -0
  282. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  283. package/dist/modes/interactive/external-editor.js +10 -4
  284. package/dist/modes/interactive/external-editor.js.map +1 -1
  285. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  286. package/dist/modes/interactive/interactive-mode.js +6 -5
  287. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  288. package/dist/modes/interactive/tips/catalog/cli-tips.d.ts.map +1 -1
  289. package/dist/modes/interactive/tips/catalog/cli-tips.js +2 -1
  290. package/dist/modes/interactive/tips/catalog/cli-tips.js.map +1 -1
  291. package/dist/modes/interactive/tips/catalog/ethos-tips.d.ts.map +1 -1
  292. package/dist/modes/interactive/tips/catalog/ethos-tips.js +4 -3
  293. package/dist/modes/interactive/tips/catalog/ethos-tips.js.map +1 -1
  294. package/dist/modes/interactive/tips/catalog/model-tips.d.ts.map +1 -1
  295. package/dist/modes/interactive/tips/catalog/model-tips.js +2 -1
  296. package/dist/modes/interactive/tips/catalog/model-tips.js.map +1 -1
  297. package/dist/modes/interactive/tips/catalog/session-tips.d.ts.map +1 -1
  298. package/dist/modes/interactive/tips/catalog/session-tips.js +2 -1
  299. package/dist/modes/interactive/tips/catalog/session-tips.js.map +1 -1
  300. package/dist/modes/interactive/tips/catalog/settings-tips.d.ts.map +1 -1
  301. package/dist/modes/interactive/tips/catalog/settings-tips.js +3 -2
  302. package/dist/modes/interactive/tips/catalog/settings-tips.js.map +1 -1
  303. package/dist/modes/interactive/tips/catalog/workspace-tips.d.ts.map +1 -1
  304. package/dist/modes/interactive/tips/catalog/workspace-tips.js +4 -3
  305. package/dist/modes/interactive/tips/catalog/workspace-tips.js.map +1 -1
  306. package/dist/modes/provider-native-rendering.d.ts.map +1 -1
  307. package/dist/modes/provider-native-rendering.js +33 -0
  308. package/dist/modes/provider-native-rendering.js.map +1 -1
  309. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  310. package/dist/modes/rpc/connection-handler.js +148 -5
  311. package/dist/modes/rpc/connection-handler.js.map +1 -1
  312. package/dist/modes/rpc/custom-capability.d.ts +1 -0
  313. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  314. package/dist/modes/rpc/custom-capability.js +1 -0
  315. package/dist/modes/rpc/custom-capability.js.map +1 -1
  316. package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
  317. package/dist/modes/rpc/multi-session-host.js +4 -1
  318. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  319. package/dist/modes/rpc/rpc-client.d.ts +5 -2
  320. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  321. package/dist/modes/rpc/rpc-client.js +10 -1
  322. package/dist/modes/rpc/rpc-client.js.map +1 -1
  323. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  324. package/dist/modes/rpc/rpc-mode.js +2 -1
  325. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  326. package/dist/modes/rpc/rpc-types.d.ts +47 -0
  327. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  328. package/dist/modes/rpc/rpc-types.js.map +1 -1
  329. package/dist/modes/rpc/session-binding.d.ts +2 -1
  330. package/dist/modes/rpc/session-binding.d.ts.map +1 -1
  331. package/dist/modes/rpc/session-binding.js +3 -2
  332. package/dist/modes/rpc/session-binding.js.map +1 -1
  333. package/dist/modes/rpc/session-command-router.d.ts +2 -1
  334. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  335. package/dist/modes/rpc/session-command-router.js +3 -2
  336. package/dist/modes/rpc/session-command-router.js.map +1 -1
  337. package/dist/nearest-parent-config.d.ts +6 -1
  338. package/dist/nearest-parent-config.d.ts.map +1 -1
  339. package/dist/nearest-parent-config.js +18 -2
  340. package/dist/nearest-parent-config.js.map +1 -1
  341. package/dist/package-manager-cli.d.ts.map +1 -1
  342. package/dist/package-manager-cli.js +13 -1
  343. package/dist/package-manager-cli.js.map +1 -1
  344. package/dist/rpc-entry.js +2 -0
  345. package/dist/rpc-entry.js.map +1 -1
  346. package/dist/self-update-bootstrap.d.ts.map +1 -1
  347. package/dist/self-update-bootstrap.js +6 -0
  348. package/dist/self-update-bootstrap.js.map +1 -1
  349. package/dist/senpi +3 -2
  350. package/dist/utils/pi-user-agent.d.ts +1 -1
  351. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  352. package/dist/utils/pi-user-agent.js +4 -3
  353. package/dist/utils/pi-user-agent.js.map +1 -1
  354. package/dist/utils/tools-manager.d.ts.map +1 -1
  355. package/dist/utils/tools-manager.js +2 -1
  356. package/dist/utils/tools-manager.js.map +1 -1
  357. package/dist/utils/version-check.d.ts +3 -0
  358. package/dist/utils/version-check.d.ts.map +1 -1
  359. package/dist/utils/version-check.js +37 -6
  360. package/dist/utils/version-check.js.map +1 -1
  361. package/dist/valid-cwd.d.ts +2 -0
  362. package/dist/valid-cwd.d.ts.map +1 -0
  363. package/dist/valid-cwd.js +14 -0
  364. package/dist/valid-cwd.js.map +1 -0
  365. package/docs/environment-variables.md +8 -1
  366. package/docs/extensions.md +93 -13
  367. package/docs/mcp.md +2 -0
  368. package/docs/providers.md +2 -2
  369. package/docs/rpc.md +126 -0
  370. package/docs/skills.md +8 -0
  371. package/examples/extensions/searchable-tools.ts +49 -0
  372. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +77 -0
  373. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  374. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/kernel.ts +14 -1
  375. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/kernel.ts +14 -1
  376. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/runtime-asset.ts +31 -0
  377. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  378. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +5 -1
  379. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  380. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +4 -1
  381. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  382. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -0
  383. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  384. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +9 -0
  385. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  386. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  387. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  388. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +2 -2
  389. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  390. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  391. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +4 -2
  392. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  393. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  394. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +7 -3
  395. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  396. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +8 -0
  397. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -0
  398. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +222 -0
  399. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -0
  400. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.d.ts +3 -0
  401. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.d.ts.map +1 -0
  402. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.js +10 -0
  403. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.js.map +1 -0
  404. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +113 -4
  406. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  407. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  408. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -0
  409. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  410. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts +5 -0
  411. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  412. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +2 -1
  413. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  414. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  415. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js +2 -1
  416. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +1 -1
  417. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +10 -0
  418. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  420. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +47 -0
  421. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  422. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +47 -0
  423. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  424. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  425. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  426. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  427. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  428. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  429. package/node_modules/@earendil-works/pi-ai/dist/models.js +36 -13
  430. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  431. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.d.ts +2 -0
  432. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.d.ts.map +1 -1
  433. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.js.map +1 -1
  434. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -1
  436. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  437. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  438. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  439. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  442. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  443. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  444. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts +1 -0
  446. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts.map +1 -1
  447. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js +18 -0
  448. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -1
  449. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.d.ts +3 -0
  450. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.d.ts.map +1 -0
  451. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.js +16 -0
  452. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.js.map +1 -0
  453. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +1 -1
  454. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  455. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  456. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js +1 -1
  457. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js.map +1 -1
  458. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  459. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +7 -0
  460. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  461. package/node_modules/@earendil-works/pi-ai/dist/wire-identity.d.ts +14 -0
  462. package/node_modules/@earendil-works/pi-ai/dist/wire-identity.d.ts.map +1 -0
  463. package/node_modules/@earendil-works/pi-ai/dist/wire-identity.js +24 -0
  464. package/node_modules/@earendil-works/pi-ai/dist/wire-identity.js.map +1 -0
  465. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  466. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.d.ts.map +1 -1
  467. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js +11 -3
  468. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js.map +1 -1
  469. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  470. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  471. package/package.json +9 -9
  472. package/dist/core/extensions/builtin/mcp/expose/bm25.d.ts +0 -30
  473. package/dist/core/extensions/builtin/mcp/expose/bm25.d.ts.map +0 -1
  474. package/dist/core/extensions/builtin/mcp/expose/bm25.js.map +0 -1
  475. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.d.ts +0 -15
  476. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.d.ts.map +0 -1
  477. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.js +0 -33
  478. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.js.map +0 -1
  479. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts +0 -43
  480. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts.map +0 -1
  481. package/dist/core/extensions/builtin/mcp/expose/tool-search.js +0 -125
  482. package/dist/core/extensions/builtin/mcp/expose/tool-search.js.map +0 -1
@@ -0,0 +1,222 @@
1
+ import OpenAI from "openai";
2
+ import { formatProviderError, normalizeProviderError } from "../utils/error-body.js";
3
+ import { headersToRecord } from "../utils/headers.js";
4
+ import { retryProviderRequest } from "../utils/provider-retry.js";
5
+ import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
6
+ import { resolveOpenAIClientAuth } from "./openai-client-auth.js";
7
+ const MAX_PROMPT_CHARS = 32_000;
8
+ const MAX_IMAGE_BYTES = 24 * 1024 * 1024;
9
+ const ENDPOINT_SUFFIXES = ["/chat/completions", "/responses", "/models"];
10
+ const PNG_MAGIC = [0x89, 0x50, 0x4e, 0x47];
11
+ const JPEG_MAGIC = [0xff, 0xd8, 0xff];
12
+ const WEBP_MAGIC = [0x52, 0x49, 0x46, 0x46, 0x57, 0x45, 0x42, 0x50];
13
+ export const generateImages = async (model, context, options) => {
14
+ const output = {
15
+ api: model.api,
16
+ provider: model.provider,
17
+ model: model.id,
18
+ output: [],
19
+ stopReason: "stop",
20
+ timestamp: Date.now(),
21
+ };
22
+ try {
23
+ let params = buildParams(model, context, options);
24
+ const nextParams = await options?.onPayload?.(params, model);
25
+ if (nextParams !== undefined) {
26
+ if (!isGenerateParams(nextParams))
27
+ throw new Error("onPayload returned an invalid image generation payload");
28
+ params = nextParams;
29
+ }
30
+ const headers = { ...model.headers, ...options?.headers };
31
+ const auth = resolveOpenAIClientAuth(model.provider, options?.apiKey, headers);
32
+ const client = new OpenAI({
33
+ apiKey: auth.apiKey,
34
+ baseURL: normalizeBaseUrl(model.baseUrl),
35
+ dangerouslyAllowBrowser: true,
36
+ fetch: options?.fetch,
37
+ defaultHeaders: auth.headers,
38
+ });
39
+ const requestOptions = {
40
+ ...(options?.signal ? { signal: options.signal } : {}),
41
+ ...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),
42
+ maxRetries: 0,
43
+ };
44
+ const { data: response, response: rawResponse } = await retryProviderRequest(() => client.images.generate(params, requestOptions).withResponse(), {
45
+ maxRetries: options?.maxRetries,
46
+ maxRetryDelayMs: options?.maxRetryDelayMs,
47
+ signal: options?.signal,
48
+ });
49
+ await options?.onResponse?.({ status: rawResponse.status, headers: headersToRecord(rawResponse.headers) }, model);
50
+ if (response.usage)
51
+ output.usage = parseUsage(response.usage, model);
52
+ if (!response.data || response.data.length === 0)
53
+ throw new Error("OpenAI images response contained no image data");
54
+ for (const datum of response.data) {
55
+ const image = await resolveImage(datum, options);
56
+ if (datum.revised_prompt?.trim()) {
57
+ output.output.push({ type: "text", text: datum.revised_prompt });
58
+ }
59
+ output.output.push(image);
60
+ }
61
+ return output;
62
+ }
63
+ catch (error) {
64
+ output.stopReason = options?.signal?.aborted ? "aborted" : "error";
65
+ output.errorMessage = formatProviderError(normalizeProviderError(error));
66
+ return output;
67
+ }
68
+ };
69
+ function buildParams(model, context, options) {
70
+ const promptParts = [];
71
+ for (const item of context.input) {
72
+ if (item.type === "image") {
73
+ throw new Error("generations does not accept image input; use the images edit endpoint");
74
+ }
75
+ const text = sanitizeSurrogates(item.text);
76
+ if (text.trim())
77
+ promptParts.push(text);
78
+ }
79
+ const prompt = promptParts.join("\n\n");
80
+ if (!prompt.trim())
81
+ throw new Error("Image generation requires a non-empty text prompt");
82
+ if (prompt.length > MAX_PROMPT_CHARS) {
83
+ throw new Error(`Image generation prompt exceeds ${MAX_PROMPT_CHARS} characters`);
84
+ }
85
+ return {
86
+ model: model.id,
87
+ prompt,
88
+ size: options?.size ?? "auto",
89
+ quality: options?.quality ?? "auto",
90
+ n: options?.n ?? 1,
91
+ output_format: "png",
92
+ stream: false,
93
+ };
94
+ }
95
+ function isGenerateParams(value) {
96
+ return typeof value === "object" && value !== null && "prompt" in value && typeof value.prompt === "string";
97
+ }
98
+ function normalizeBaseUrl(baseUrl) {
99
+ let url;
100
+ try {
101
+ url = new URL(baseUrl);
102
+ }
103
+ catch {
104
+ throw new Error(`Invalid OpenAI images base URL: ${baseUrl}`);
105
+ }
106
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
107
+ throw new Error("OpenAI images base URL must use HTTP or HTTPS");
108
+ }
109
+ if (url.search || url.hash)
110
+ throw new Error("OpenAI images base URL must not include a query or fragment");
111
+ const pathname = url.pathname.replace(/\/+$/, "");
112
+ const normalizedPathname = pathname.toLowerCase();
113
+ if (normalizedPathname.includes("/images")) {
114
+ throw new Error("OpenAI images base URL must not include an images endpoint");
115
+ }
116
+ if (ENDPOINT_SUFFIXES.some((suffix) => normalizedPathname.endsWith(suffix))) {
117
+ throw new Error("OpenAI images base URL must not include a known API endpoint");
118
+ }
119
+ url.pathname = pathname.endsWith("/v1") ? pathname : `${pathname}/v1`;
120
+ return url.toString();
121
+ }
122
+ async function resolveImage(datum, options) {
123
+ const b64 = datum.b64_json?.trim();
124
+ if (b64)
125
+ return { type: "image", mimeType: "image/png", data: b64 };
126
+ const url = datum.url?.trim();
127
+ if (!url)
128
+ throw new Error("OpenAI images response datum contained no image data");
129
+ if (url.startsWith("data:"))
130
+ return parseDataUrl(url);
131
+ return hydrateImageUrl(url, options);
132
+ }
133
+ function parseDataUrl(url) {
134
+ const match = /^data:([^;,]+);base64,(.+)$/i.exec(url);
135
+ if (!match?.[1] || !match[2])
136
+ throw new Error("OpenAI images response contained an invalid data URL");
137
+ const mimeType = supportedMime(match[1]);
138
+ if (!mimeType)
139
+ throw new Error(`OpenAI images response used unsupported MIME type: ${match[1]}`);
140
+ return { type: "image", mimeType, data: match[2] };
141
+ }
142
+ async function hydrateImageUrl(url, options) {
143
+ let parsed;
144
+ try {
145
+ parsed = new URL(url);
146
+ }
147
+ catch {
148
+ throw new Error("OpenAI images response URL must be absolute");
149
+ }
150
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
151
+ throw new Error("OpenAI images response URL must use HTTP or HTTPS");
152
+ }
153
+ const response = await (options?.fetch ?? globalThis.fetch)(url, options?.signal ? { signal: options.signal } : {});
154
+ if (!response.ok)
155
+ throw new Error(`OpenAI image hydration failed with HTTP ${response.status}`);
156
+ const declaredLength = response.headers.get("content-length");
157
+ if (declaredLength && Number(declaredLength) > MAX_IMAGE_BYTES)
158
+ throw oversizedImageError();
159
+ const bytes = new Uint8Array(await response.arrayBuffer());
160
+ if (bytes.byteLength === 0)
161
+ throw new Error("OpenAI image hydration returned an empty body");
162
+ if (bytes.byteLength > MAX_IMAGE_BYTES)
163
+ throw oversizedImageError();
164
+ const declaredMime = supportedMime(response.headers.get("content-type")?.split(";", 1)[0]);
165
+ const detectedMime = detectMime(bytes);
166
+ if (declaredMime && detectedMime && declaredMime !== detectedMime) {
167
+ throw new Error(`OpenAI image MIME mismatch: declared ${declaredMime}, detected ${detectedMime}`);
168
+ }
169
+ const mimeType = detectedMime ?? declaredMime;
170
+ if (!mimeType)
171
+ throw new Error("OpenAI image hydration returned unsupported image content");
172
+ return { type: "image", mimeType, data: bytesToBase64(bytes) };
173
+ }
174
+ function supportedMime(value) {
175
+ const normalized = value?.trim().toLowerCase();
176
+ if (normalized === "image/png" || normalized === "image/jpeg" || normalized === "image/webp")
177
+ return normalized;
178
+ return undefined;
179
+ }
180
+ function detectMime(bytes) {
181
+ if (hasMagic(bytes, PNG_MAGIC))
182
+ return "image/png";
183
+ if (hasMagic(bytes, JPEG_MAGIC))
184
+ return "image/jpeg";
185
+ if (hasMagic(bytes, WEBP_MAGIC.slice(0, 4)) && hasMagic(bytes, WEBP_MAGIC.slice(4), 8))
186
+ return "image/webp";
187
+ return undefined;
188
+ }
189
+ function hasMagic(bytes, magic, offset = 0) {
190
+ return magic.every((value, index) => bytes[offset + index] === value);
191
+ }
192
+ function bytesToBase64(bytes) {
193
+ let binary = "";
194
+ for (let offset = 0; offset < bytes.length; offset += 0x8000) {
195
+ binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));
196
+ }
197
+ return btoa(binary);
198
+ }
199
+ function oversizedImageError() {
200
+ return new Error("OpenAI image hydration exceeded the 24 MiB limit");
201
+ }
202
+ function parseUsage(rawUsage, model) {
203
+ const input = rawUsage.input_tokens ?? 0;
204
+ const output = rawUsage.output_tokens ?? 0;
205
+ const usage = {
206
+ input,
207
+ output,
208
+ cacheRead: 0,
209
+ cacheWrite: 0,
210
+ totalTokens: rawUsage.total_tokens ?? input + output,
211
+ cost: {
212
+ input: (model.cost.input / 1_000_000) * input,
213
+ output: (model.cost.output / 1_000_000) * output,
214
+ cacheRead: 0,
215
+ cacheWrite: 0,
216
+ total: 0,
217
+ },
218
+ };
219
+ usage.cost.total = usage.cost.input + usage.cost.output;
220
+ return usage;
221
+ }
222
+ //# sourceMappingURL=openai-images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-images.js","sourceRoot":"","sources":["../../src/api/openai-images.ts"],"names":[],"mappings":"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","sourcesContent":["import OpenAI from \"openai\";\nimport type { Image, ImageGenerateParamsNonStreaming } from \"openai/resources/images.js\";\nimport type {\n\tAssistantImages,\n\tImageContent,\n\tImagesContext,\n\tImagesFunction,\n\tImagesModel,\n\tImagesOptions,\n\tProviderHeaders,\n\tTextContent,\n} from \"../types.ts\";\nimport { formatProviderError, normalizeProviderError } from \"../utils/error-body.ts\";\nimport { headersToRecord } from \"../utils/headers.ts\";\nimport { retryProviderRequest } from \"../utils/provider-retry.ts\";\nimport { sanitizeSurrogates } from \"../utils/sanitize-unicode.ts\";\nimport { resolveOpenAIClientAuth } from \"./openai-client-auth.ts\";\n\nconst MAX_PROMPT_CHARS = 32_000;\nconst MAX_IMAGE_BYTES = 24 * 1024 * 1024;\nconst ENDPOINT_SUFFIXES = [\"/chat/completions\", \"/responses\", \"/models\"] as const;\nconst PNG_MAGIC = [0x89, 0x50, 0x4e, 0x47] as const;\nconst JPEG_MAGIC = [0xff, 0xd8, 0xff] as const;\nconst WEBP_MAGIC = [0x52, 0x49, 0x46, 0x46, 0x57, 0x45, 0x42, 0x50] as const;\n\ntype SupportedImageMime = \"image/png\" | \"image/jpeg\" | \"image/webp\";\n\nexport interface OpenAIImagesOptions extends ImagesOptions {\n\tsize?: \"auto\" | \"1024x1024\" | \"1024x1536\" | \"1536x1024\";\n\tquality?: \"auto\" | \"low\" | \"medium\" | \"high\";\n\tn?: number;\n}\n\nexport const generateImages: ImagesFunction<\"openai-images\", OpenAIImagesOptions> = async (\n\tmodel: ImagesModel<\"openai-images\">,\n\tcontext: ImagesContext,\n\toptions?: OpenAIImagesOptions,\n) => {\n\tconst output: AssistantImages = {\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\toutput: [],\n\t\tstopReason: \"stop\",\n\t\ttimestamp: Date.now(),\n\t};\n\n\ttry {\n\t\tlet params = buildParams(model, context, options);\n\t\tconst nextParams = await options?.onPayload?.(params, model);\n\t\tif (nextParams !== undefined) {\n\t\t\tif (!isGenerateParams(nextParams)) throw new Error(\"onPayload returned an invalid image generation payload\");\n\t\t\tparams = nextParams;\n\t\t}\n\n\t\tconst headers: ProviderHeaders = { ...model.headers, ...options?.headers };\n\t\tconst auth = resolveOpenAIClientAuth(model.provider, options?.apiKey, headers);\n\t\tconst client = new OpenAI({\n\t\t\tapiKey: auth.apiKey,\n\t\t\tbaseURL: normalizeBaseUrl(model.baseUrl),\n\t\t\tdangerouslyAllowBrowser: true,\n\t\t\tfetch: options?.fetch,\n\t\t\tdefaultHeaders: auth.headers,\n\t\t});\n\t\tconst requestOptions = {\n\t\t\t...(options?.signal ? { signal: options.signal } : {}),\n\t\t\t...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),\n\t\t\tmaxRetries: 0,\n\t\t};\n\t\tconst { data: response, response: rawResponse } = await retryProviderRequest(\n\t\t\t() => client.images.generate(params, requestOptions).withResponse(),\n\t\t\t{\n\t\t\t\tmaxRetries: options?.maxRetries,\n\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs,\n\t\t\t\tsignal: options?.signal,\n\t\t\t},\n\t\t);\n\t\tawait options?.onResponse?.({ status: rawResponse.status, headers: headersToRecord(rawResponse.headers) }, model);\n\n\t\tif (response.usage) output.usage = parseUsage(response.usage, model);\n\t\tif (!response.data || response.data.length === 0)\n\t\t\tthrow new Error(\"OpenAI images response contained no image data\");\n\n\t\tfor (const datum of response.data) {\n\t\t\tconst image = await resolveImage(datum, options);\n\t\t\tif (datum.revised_prompt?.trim()) {\n\t\t\t\toutput.output.push({ type: \"text\", text: datum.revised_prompt } satisfies TextContent);\n\t\t\t}\n\t\t\toutput.output.push(image);\n\t\t}\n\t\treturn output;\n\t} catch (error) {\n\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\toutput.errorMessage = formatProviderError(normalizeProviderError(error));\n\t\treturn output;\n\t}\n};\n\nfunction buildParams(\n\tmodel: ImagesModel<\"openai-images\">,\n\tcontext: ImagesContext,\n\toptions?: OpenAIImagesOptions,\n): ImageGenerateParamsNonStreaming {\n\tconst promptParts: string[] = [];\n\tfor (const item of context.input) {\n\t\tif (item.type === \"image\") {\n\t\t\tthrow new Error(\"generations does not accept image input; use the images edit endpoint\");\n\t\t}\n\t\tconst text = sanitizeSurrogates(item.text);\n\t\tif (text.trim()) promptParts.push(text);\n\t}\n\tconst prompt = promptParts.join(\"\\n\\n\");\n\tif (!prompt.trim()) throw new Error(\"Image generation requires a non-empty text prompt\");\n\tif (prompt.length > MAX_PROMPT_CHARS) {\n\t\tthrow new Error(`Image generation prompt exceeds ${MAX_PROMPT_CHARS} characters`);\n\t}\n\treturn {\n\t\tmodel: model.id,\n\t\tprompt,\n\t\tsize: options?.size ?? \"auto\",\n\t\tquality: options?.quality ?? \"auto\",\n\t\tn: options?.n ?? 1,\n\t\toutput_format: \"png\",\n\t\tstream: false,\n\t};\n}\n\nfunction isGenerateParams(value: unknown): value is ImageGenerateParamsNonStreaming {\n\treturn typeof value === \"object\" && value !== null && \"prompt\" in value && typeof value.prompt === \"string\";\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(baseUrl);\n\t} catch {\n\t\tthrow new Error(`Invalid OpenAI images base URL: ${baseUrl}`);\n\t}\n\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\tthrow new Error(\"OpenAI images base URL must use HTTP or HTTPS\");\n\t}\n\tif (url.search || url.hash) throw new Error(\"OpenAI images base URL must not include a query or fragment\");\n\tconst pathname = url.pathname.replace(/\\/+$/, \"\");\n\tconst normalizedPathname = pathname.toLowerCase();\n\tif (normalizedPathname.includes(\"/images\")) {\n\t\tthrow new Error(\"OpenAI images base URL must not include an images endpoint\");\n\t}\n\tif (ENDPOINT_SUFFIXES.some((suffix) => normalizedPathname.endsWith(suffix))) {\n\t\tthrow new Error(\"OpenAI images base URL must not include a known API endpoint\");\n\t}\n\turl.pathname = pathname.endsWith(\"/v1\") ? pathname : `${pathname}/v1`;\n\treturn url.toString();\n}\n\nasync function resolveImage(datum: Image, options?: OpenAIImagesOptions): Promise<ImageContent> {\n\tconst b64 = datum.b64_json?.trim();\n\tif (b64) return { type: \"image\", mimeType: \"image/png\", data: b64 };\n\tconst url = datum.url?.trim();\n\tif (!url) throw new Error(\"OpenAI images response datum contained no image data\");\n\tif (url.startsWith(\"data:\")) return parseDataUrl(url);\n\treturn hydrateImageUrl(url, options);\n}\n\nfunction parseDataUrl(url: string): ImageContent {\n\tconst match = /^data:([^;,]+);base64,(.+)$/i.exec(url);\n\tif (!match?.[1] || !match[2]) throw new Error(\"OpenAI images response contained an invalid data URL\");\n\tconst mimeType = supportedMime(match[1]);\n\tif (!mimeType) throw new Error(`OpenAI images response used unsupported MIME type: ${match[1]}`);\n\treturn { type: \"image\", mimeType, data: match[2] };\n}\n\nasync function hydrateImageUrl(url: string, options?: OpenAIImagesOptions): Promise<ImageContent> {\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(url);\n\t} catch {\n\t\tthrow new Error(\"OpenAI images response URL must be absolute\");\n\t}\n\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\tthrow new Error(\"OpenAI images response URL must use HTTP or HTTPS\");\n\t}\n\tconst response = await (options?.fetch ?? globalThis.fetch)(url, options?.signal ? { signal: options.signal } : {});\n\tif (!response.ok) throw new Error(`OpenAI image hydration failed with HTTP ${response.status}`);\n\tconst declaredLength = response.headers.get(\"content-length\");\n\tif (declaredLength && Number(declaredLength) > MAX_IMAGE_BYTES) throw oversizedImageError();\n\tconst bytes = new Uint8Array(await response.arrayBuffer());\n\tif (bytes.byteLength === 0) throw new Error(\"OpenAI image hydration returned an empty body\");\n\tif (bytes.byteLength > MAX_IMAGE_BYTES) throw oversizedImageError();\n\tconst declaredMime = supportedMime(response.headers.get(\"content-type\")?.split(\";\", 1)[0]);\n\tconst detectedMime = detectMime(bytes);\n\tif (declaredMime && detectedMime && declaredMime !== detectedMime) {\n\t\tthrow new Error(`OpenAI image MIME mismatch: declared ${declaredMime}, detected ${detectedMime}`);\n\t}\n\tconst mimeType = detectedMime ?? declaredMime;\n\tif (!mimeType) throw new Error(\"OpenAI image hydration returned unsupported image content\");\n\treturn { type: \"image\", mimeType, data: bytesToBase64(bytes) };\n}\n\nfunction supportedMime(value: string | undefined): SupportedImageMime | undefined {\n\tconst normalized = value?.trim().toLowerCase();\n\tif (normalized === \"image/png\" || normalized === \"image/jpeg\" || normalized === \"image/webp\") return normalized;\n\treturn undefined;\n}\n\nfunction detectMime(bytes: Uint8Array): SupportedImageMime | undefined {\n\tif (hasMagic(bytes, PNG_MAGIC)) return \"image/png\";\n\tif (hasMagic(bytes, JPEG_MAGIC)) return \"image/jpeg\";\n\tif (hasMagic(bytes, WEBP_MAGIC.slice(0, 4)) && hasMagic(bytes, WEBP_MAGIC.slice(4), 8)) return \"image/webp\";\n\treturn undefined;\n}\n\nfunction hasMagic(bytes: Uint8Array, magic: readonly number[], offset = 0): boolean {\n\treturn magic.every((value, index) => bytes[offset + index] === value);\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (let offset = 0; offset < bytes.length; offset += 0x8000) {\n\t\tbinary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));\n\t}\n\treturn btoa(binary);\n}\n\nfunction oversizedImageError(): Error {\n\treturn new Error(\"OpenAI image hydration exceeded the 24 MiB limit\");\n}\n\nfunction parseUsage(\n\trawUsage: { input_tokens?: number; output_tokens?: number; total_tokens?: number },\n\tmodel: ImagesModel<\"openai-images\">,\n) {\n\tconst input = rawUsage.input_tokens ?? 0;\n\tconst output = rawUsage.output_tokens ?? 0;\n\tconst usage = {\n\t\tinput,\n\t\toutput,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: rawUsage.total_tokens ?? input + output,\n\t\tcost: {\n\t\t\tinput: (model.cost.input / 1_000_000) * input,\n\t\t\toutput: (model.cost.output / 1_000_000) * output,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotal: 0,\n\t\t},\n\t};\n\tusage.cost.total = usage.cost.input + usage.cost.output;\n\treturn usage;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ProviderImages } from "../types.ts";
2
+ export declare const openaiImagesApi: () => ProviderImages;
3
+ //# sourceMappingURL=openai-images.lazy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-images.lazy.d.ts","sourceRoot":"","sources":["../../src/api/openai-images.lazy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,eAAe,QAAO,cAQjC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export const openaiImagesApi = () => ({
2
+ generateImages: async (model, context, options) => {
3
+ if (model.api !== "openai-images") {
4
+ throw new Error(`Mismatched api: ${model.api} expected openai-images`);
5
+ }
6
+ const openaiModel = { ...model, api: "openai-images" };
7
+ return (await import("./openai-images.js")).generateImages(openaiModel, context, options);
8
+ },
9
+ });
10
+ //# sourceMappingURL=openai-images.lazy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-images.lazy.js","sourceRoot":"","sources":["../../src/api/openai-images.lazy.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,GAAmB,EAAE,CAAC,CAAC;IACrD,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QACjD,IAAI,KAAK,CAAC,GAAG,KAAK,eAAe,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,GAAG,yBAAyB,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,eAAe,EAAyC,CAAC;QAC9F,OAAO,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3F,CAAC;CACD,CAAC,CAAC","sourcesContent":["import type { ImagesModel, ProviderImages } from \"../types.ts\";\n\nexport const openaiImagesApi = (): ProviderImages => ({\n\tgenerateImages: async (model, context, options) => {\n\t\tif (model.api !== \"openai-images\") {\n\t\t\tthrow new Error(`Mismatched api: ${model.api} expected openai-images`);\n\t\t}\n\t\tconst openaiModel = { ...model, api: \"openai-images\" } satisfies ImagesModel<\"openai-images\">;\n\t\treturn (await import(\"./openai-images.ts\")).generateImages(openaiModel, context, options);\n\t},\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"openai-responses-shared.d.ts","sourceRoot":"","sources":["../../src/api/openai-responses-shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEX,IAAI,IAAI,UAAU,EAClB,6BAA6B,EAE7B,aAAa,EAOb,mBAAmB,EAEnB,MAAM,yCAAyC,CAAC;AAQjD,OAAO,KAAK,EACX,GAAG,EACH,gBAAgB,EAChB,OAAO,EAEP,KAAK,EAML,IAAI,EAEJ,KAAK,EACL,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AA2F5E,MAAM,WAAW,4BAA4B;IAC5C,WAAW,CAAC,EAAE,6BAA6B,CAAC,cAAc,CAAC,CAAC;IAC5D,0BAA0B,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,kBAAkB,CAAC,EAAE,CACpB,mBAAmB,EAAE,6BAA6B,CAAC,cAAc,CAAC,GAAG,SAAS,EAC9E,kBAAkB,EAAE,6BAA6B,CAAC,cAAc,CAAC,GAAG,SAAS,KACzE,6BAA6B,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC;IAC/D,uBAAuB,CAAC,EAAE,CACzB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,6BAA6B,CAAC,cAAc,CAAC,GAAG,SAAS,KAClE,IAAI,CAAC;CACV;AAED,MAAM,WAAW,+BAA+B;IAC/C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,0BAA0B,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,4BAA4B,CAAC;IAC3C,6FAA6F;IAC7F,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC5C,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAmBD,eAAO,MAAM,iCAAiC,WAAW,CAAC;AA+C1D,wBAAgB,wBAAwB,CAAC,IAAI,SAAS,GAAG,EACxD,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,EAAE,OAAO,EAChB,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAC,EAC7C,OAAO,CAAC,EAAE,+BAA+B,GACvC,aAAa,CAuQf;AAMD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,OAAO,CAAC,EAAE,4BAA4B,GAAG,UAAU,EAAE,CA6ClH;AAqCD,wBAAsB,sBAAsB,CAAC,IAAI,SAAS,GAAG,EAC5D,YAAY,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAChD,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,2BAA2B,EACnC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,CAAC,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAuVf"}
1
+ {"version":3,"file":"openai-responses-shared.d.ts","sourceRoot":"","sources":["../../src/api/openai-responses-shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEX,IAAI,IAAI,UAAU,EAClB,6BAA6B,EAE7B,aAAa,EAOb,mBAAmB,EAEnB,MAAM,yCAAyC,CAAC;AAQjD,OAAO,KAAK,EACX,GAAG,EACH,gBAAgB,EAChB,OAAO,EAEP,KAAK,EAML,IAAI,EAEJ,KAAK,EACL,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AA2F5E,MAAM,WAAW,4BAA4B;IAC5C,WAAW,CAAC,EAAE,6BAA6B,CAAC,cAAc,CAAC,CAAC;IAC5D,0BAA0B,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,kBAAkB,CAAC,EAAE,CACpB,mBAAmB,EAAE,6BAA6B,CAAC,cAAc,CAAC,GAAG,SAAS,EAC9E,kBAAkB,EAAE,6BAA6B,CAAC,cAAc,CAAC,GAAG,SAAS,KACzE,6BAA6B,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC;IAC/D,uBAAuB,CAAC,EAAE,CACzB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,6BAA6B,CAAC,cAAc,CAAC,GAAG,SAAS,KAClE,IAAI,CAAC;CACV;AAED,MAAM,WAAW,+BAA+B;IAC/C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,0BAA0B,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,4BAA4B,CAAC;IAC3C,6FAA6F;IAC7F,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC5C,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAmBD,eAAO,MAAM,iCAAiC,WAAW,CAAC;AA+C1D,wBAAgB,wBAAwB,CAAC,IAAI,SAAS,GAAG,EACxD,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,EAAE,OAAO,EAChB,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAC,EAC7C,OAAO,CAAC,EAAE,+BAA+B,GACvC,aAAa,CAuQf;AAMD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,OAAO,CAAC,EAAE,4BAA4B,GAAG,UAAU,EAAE,CA6ClH;AA2FD,wBAAsB,sBAAsB,CAAC,IAAI,SAAS,GAAG,EAC5D,YAAY,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAChD,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,2BAA2B,EACnC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAClB,OAAO,CAAC,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAkZf"}
@@ -400,10 +400,57 @@ function appendCustomToolCallInput(block, nextInput, close) {
400
400
  block.arguments = { [customInput.property]: nextInput };
401
401
  return delta;
402
402
  }
403
+ const MAX_NATIVE_IMAGE_BASE64_CHARS = 24 * 1024 * 1024;
404
+ function readNativeImageGenerationCall(value) {
405
+ if (typeof value !== "object" || value === null || !("type" in value) || !("status" in value))
406
+ return undefined;
407
+ if (value.type !== "image_generation_call" || typeof value.status !== "string")
408
+ return undefined;
409
+ return {
410
+ type: "image_generation_call",
411
+ ...("id" in value && typeof value.id === "string" ? { id: value.id } : {}),
412
+ status: value.status,
413
+ ...("result" in value && (typeof value.result === "string" || value.result === null)
414
+ ? { result: value.result }
415
+ : {}),
416
+ ...("revised_prompt" in value && typeof value.revised_prompt === "string"
417
+ ? { revised_prompt: value.revised_prompt }
418
+ : {}),
419
+ };
420
+ }
421
+ function isValidBase64(value) {
422
+ return value.length > 0 && value.length % 4 === 0 && /^[A-Za-z0-9+/]*={0,2}$/.test(value);
423
+ }
424
+ function reconcileNativeImageGenerationCall(item) {
425
+ if (item.status !== "completed") {
426
+ return {
427
+ type: "image_generation_call",
428
+ ...(item.id !== undefined ? { id: item.id } : {}),
429
+ status: item.status,
430
+ };
431
+ }
432
+ if (typeof item.result !== "string" || !isValidBase64(item.result)) {
433
+ return {
434
+ type: "image_generation_call",
435
+ ...(item.id !== undefined ? { id: item.id } : {}),
436
+ status: "malformed",
437
+ };
438
+ }
439
+ return {
440
+ type: "image_generation_call",
441
+ ...(item.id !== undefined ? { id: item.id } : {}),
442
+ status: "completed",
443
+ result: item.result,
444
+ ...(item.revised_prompt?.trim() ? { revised_prompt: item.revised_prompt } : {}),
445
+ };
446
+ }
403
447
  export async function processResponsesStream(openaiStream, output, stream, model, options) {
404
448
  let sawTerminalResponseEvent = false;
449
+ let nativeImageBase64Chars = 0;
405
450
  const outputSlots = new Map();
406
451
  const reasoningBlocksById = new Map();
452
+ const nativeImageCharsByOutputIndex = new Map();
453
+ const finalizedNativeImageOutputIndexes = new Set();
407
454
  const applyMessagePhaseStopReason = (item) => {
408
455
  if (item.type === "message" && item.phase === "final_answer") {
409
456
  output.stopReason = "stop";
@@ -486,19 +533,74 @@ export async function processResponsesStream(openaiStream, output, stream, model
486
533
  stream.push({ type: "toolcall_start", contentIndex: slot.contentIndex, partial: output });
487
534
  return slot;
488
535
  }
489
- const block = { type: "providerNative", subtype: item.type, raw: item };
490
- output.content.push(block);
536
+ const imageItem = readNativeImageGenerationCall(item);
537
+ const block = {
538
+ type: "providerNative",
539
+ subtype: item.type,
540
+ raw: imageItem ? reconcileNativeImageGenerationCall(imageItem) : item,
541
+ };
491
542
  const slot = {
492
543
  type: "providerNative",
493
544
  block,
494
- contentIndex: output.content.length - 1,
545
+ contentIndex: output.content.length,
495
546
  };
547
+ if (imageItem)
548
+ reconcileNativeImageSlot(outputIndex, slot, imageItem);
549
+ output.content.push(block);
496
550
  outputSlots.set(outputIndex, slot);
497
551
  return slot;
498
552
  };
499
553
  const getOrCreateSlot = (outputIndex, item) => {
500
554
  return outputSlots.get(outputIndex) ?? createSlot(outputIndex, item);
501
555
  };
556
+ function scrubNativeImageResults() {
557
+ for (const block of output.content) {
558
+ if (block.type !== "providerNative" || block.subtype !== "image_generation_call")
559
+ continue;
560
+ const item = readNativeImageGenerationCall(block.raw);
561
+ if (typeof item?.result !== "string")
562
+ continue;
563
+ block.raw = {
564
+ type: "image_generation_call",
565
+ ...(item.id !== undefined ? { id: item.id } : {}),
566
+ status: "malformed",
567
+ };
568
+ }
569
+ nativeImageBase64Chars = 0;
570
+ nativeImageCharsByOutputIndex.clear();
571
+ }
572
+ function reconcileNativeImageSlot(outputIndex, slot, item) {
573
+ const reconciled = reconcileNativeImageGenerationCall(item);
574
+ const previousChars = nativeImageCharsByOutputIndex.get(outputIndex) ?? 0;
575
+ const nextChars = typeof reconciled.result === "string" ? reconciled.result.length : 0;
576
+ const nextTotal = nativeImageBase64Chars - previousChars + nextChars;
577
+ if (nextTotal > MAX_NATIVE_IMAGE_BASE64_CHARS) {
578
+ scrubNativeImageResults();
579
+ throw new Error("Native image generation results exceed the 24 MiB base64 limit");
580
+ }
581
+ nativeImageBase64Chars = nextTotal;
582
+ if (nextChars > 0)
583
+ nativeImageCharsByOutputIndex.set(outputIndex, nextChars);
584
+ else
585
+ nativeImageCharsByOutputIndex.delete(outputIndex);
586
+ slot.block.subtype = "image_generation_call";
587
+ slot.block.raw = reconciled;
588
+ }
589
+ const backfillNativeImageGenerationCalls = (responseOutput) => {
590
+ for (const [outputIndex, outputItem] of responseOutput.entries()) {
591
+ if (finalizedNativeImageOutputIndexes.has(outputIndex))
592
+ continue;
593
+ const imageItem = readNativeImageGenerationCall(outputItem);
594
+ if (!imageItem)
595
+ continue;
596
+ const existingSlot = getSlot(outputIndex, "providerNative");
597
+ if (existingSlot)
598
+ reconcileNativeImageSlot(outputIndex, existingSlot, imageItem);
599
+ else
600
+ createSlot(outputIndex, outputItem);
601
+ outputSlots.delete(outputIndex);
602
+ }
603
+ };
502
604
  // Azure OpenAI can omit reasoning.encrypted_content from response.output_item.done
503
605
  // and provide it only in response.completed.response.output. Backfill the
504
606
  // persisted reasoning signature from the terminal response to keep store:false
@@ -522,6 +624,7 @@ export async function processResponsesStream(openaiStream, output, stream, model
522
624
  const finalizeResponse = (response) => {
523
625
  sawTerminalResponseEvent = true;
524
626
  backfillReasoningSignatures(response.output ?? []);
627
+ backfillNativeImageGenerationCalls(response.output ?? []);
525
628
  if (response?.id) {
526
629
  output.responseId = response.id;
527
630
  }
@@ -659,7 +762,13 @@ export async function processResponsesStream(openaiStream, output, stream, model
659
762
  const item = event.item;
660
763
  applyMessagePhaseStopReason(item);
661
764
  const slot = getOrCreateSlot(event.output_index, item);
662
- if (item.type === "reasoning" && slot?.type === "thinking") {
765
+ const imageItem = readNativeImageGenerationCall(item);
766
+ if (imageItem && slot?.type === "providerNative") {
767
+ reconcileNativeImageSlot(event.output_index, slot, imageItem);
768
+ finalizedNativeImageOutputIndexes.add(event.output_index);
769
+ outputSlots.delete(event.output_index);
770
+ }
771
+ else if (item.type === "reasoning" && slot?.type === "thinking") {
663
772
  const summaryText = item.summary?.map((s) => s.text).join("\n\n") || "";
664
773
  const contentText = item.content?.map((c) => c.text).join("\n\n") || "";
665
774
  slot.block.thinking = summaryText || contentText || slot.block.thinking;