@psnext/slingcli 2.4.20260507-3 → 2.4.20260509-1

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 (393) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/bin/sling.js +12 -12
  4. package/node_modules/@aws-sdk/client-bedrock-runtime/package.json +2 -2
  5. package/node_modules/@aws-sdk/token-providers/package.json +1 -1
  6. package/node_modules/{@mariozechner → @earendil-works}/pi-agent-core/dist/agent-loop.js +1 -1
  7. package/node_modules/{@mariozechner → @earendil-works}/pi-agent-core/dist/agent.js +4 -3
  8. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +526 -0
  9. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js +243 -0
  10. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +616 -0
  11. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +348 -0
  12. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.js +3 -0
  13. package/node_modules/@earendil-works/pi-agent-core/dist/harness/factory.js +9 -0
  14. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js +102 -0
  15. package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.js +194 -0
  16. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.js +92 -0
  17. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.js +42 -0
  18. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.js +31 -0
  19. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +196 -0
  20. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.js +170 -0
  21. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.js +90 -0
  22. package/node_modules/@earendil-works/pi-agent-core/dist/harness/skills.js +258 -0
  23. package/node_modules/@earendil-works/pi-agent-core/dist/harness/system-prompt.js +30 -0
  24. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js +16 -0
  25. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js +97 -0
  26. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +26 -0
  27. package/node_modules/{@mariozechner → @earendil-works}/pi-agent-core/dist/proxy.js +1 -1
  28. package/node_modules/{@mariozechner → @earendil-works}/pi-agent-core/package.json +7 -5
  29. package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/cli.js +6 -6
  30. package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/env-api-keys.js +1 -0
  31. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +307 -0
  32. package/node_modules/@earendil-works/pi-ai/dist/image-models.js +23 -0
  33. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.js +22 -0
  34. package/node_modules/@earendil-works/pi-ai/dist/images.js +14 -0
  35. package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/index.js +4 -0
  36. package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/models.generated.js +427 -122
  37. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js +129 -0
  38. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js +34 -0
  39. package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/providers/openai-codex-responses.js +1 -1
  40. package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/openai-completions.js +150 -122
  41. package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/providers/openai-responses-shared.js +14 -1
  42. package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/openai-codex.js +25 -14
  43. package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/overflow.js +3 -0
  44. package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/package.json +5 -4
  45. package/node_modules/@earendil-works/pi-coding-agent/dist/bun/register-bedrock.js +4 -0
  46. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/args.js +1 -0
  47. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/config-selector.js +1 -1
  48. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/list-models.js +1 -1
  49. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/session-picker.js +1 -1
  50. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/config.js +52 -30
  51. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/agent-session.js +1 -1
  52. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/auth-storage.js +2 -2
  53. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/compaction/branch-summarization.js +1 -1
  54. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/compaction/compaction.js +1 -1
  55. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/utils.js +153 -0
  56. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/template.css +45 -1
  57. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/template.js +68 -4
  58. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/extensions/loader.js +26 -12
  59. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/keybindings.js +1 -1
  60. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/model-registry.js +3 -2
  61. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/model-resolver.js +2 -1
  62. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/package-manager.js +22 -5
  63. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/provider-display-names.js +1 -0
  64. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/sdk.js +3 -3
  65. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/bash.js +1 -1
  66. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/edit.js +1 -1
  67. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/find.js +1 -1
  68. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/grep.js +1 -1
  69. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/ls.js +1 -1
  70. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/read.js +3 -2
  71. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/render-utils.js +1 -1
  72. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/truncate.js +205 -0
  73. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/write.js +1 -1
  74. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/main.js +2 -2
  75. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/migrations.js +3 -3
  76. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +1 -1
  77. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +1 -1
  78. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
  79. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  80. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  81. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/config-selector.js +25 -3
  82. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/custom-editor.js +1 -1
  83. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  84. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/earendil-announcement.js +1 -1
  85. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/extension-editor.js +1 -1
  86. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/extension-input.js +1 -1
  87. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +1 -1
  88. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/footer.js +1 -1
  89. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/keybinding-hints.js +36 -0
  90. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +4 -3
  91. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/model-selector.js +2 -2
  92. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +1 -1
  93. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +1 -1
  94. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +1 -1
  95. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/session-selector.js +1 -1
  96. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +4 -2
  97. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/show-images-selector.js +1 -1
  98. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  99. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/theme-selector.js +1 -1
  100. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/thinking-selector.js +1 -1
  101. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  102. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +3 -2
  103. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +1 -1
  104. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
  105. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/visual-truncate.js +1 -1
  106. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/interactive-mode.js +47 -32
  107. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/theme/dark.json +1 -1
  108. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/theme/light.json +1 -1
  109. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -1
  110. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/package-manager-cli.js +42 -39
  111. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/clipboard.js +9 -2
  112. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/paths.js +16 -0
  113. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/version-check.js +9 -2
  114. package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/package.json +9 -8
  115. package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/image.js +14 -7
  116. package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/markdown.js +24 -84
  117. package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/terminal-image.js +10 -4
  118. package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/tui.js +73 -4
  119. package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/utils.js +33 -7
  120. package/node_modules/{@mariozechner → @earendil-works}/pi-tui/package.json +3 -3
  121. package/node_modules/@mariozechner/clipboard/README.md +58 -0
  122. package/node_modules/@mariozechner/clipboard/index.d.ts +23 -0
  123. package/node_modules/@mariozechner/clipboard-linux-x64-gnu/README.md +3 -0
  124. package/node_modules/@types/node/README.md +1 -1
  125. package/node_modules/@types/node/http2.d.ts +4 -1
  126. package/node_modules/@types/node/package.json +2 -2
  127. package/node_modules/@types/node/stream/web.d.ts +4 -0
  128. package/node_modules/brace-expansion/dist/commonjs/index.js +1 -1
  129. package/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -1
  130. package/node_modules/brace-expansion/dist/esm/index.js +1 -1
  131. package/node_modules/brace-expansion/dist/esm/index.js.map +1 -1
  132. package/node_modules/brace-expansion/package.json +1 -1
  133. package/node_modules/fast-xml-builder/CHANGELOG.md +4 -0
  134. package/node_modules/fast-xml-builder/lib/fxb.cjs +1 -1
  135. package/node_modules/fast-xml-builder/lib/fxb.d.cts +91 -1
  136. package/node_modules/fast-xml-builder/lib/fxb.min.js +1 -1
  137. package/node_modules/fast-xml-builder/lib/fxb.min.js.map +1 -1
  138. package/node_modules/fast-xml-builder/package.json +3 -2
  139. package/node_modules/fast-xml-builder/src/fxb.d.ts +92 -3
  140. package/node_modules/fast-xml-builder/src/fxb.js +92 -31
  141. package/node_modules/fast-xml-builder/src/orderedJs2Xml.js +87 -33
  142. package/node_modules/get-east-asian-width/lookup-data.js +15 -12
  143. package/node_modules/get-east-asian-width/lookup.js +25 -22
  144. package/node_modules/get-east-asian-width/package.json +1 -1
  145. package/node_modules/jiti/README.md +258 -0
  146. package/node_modules/jiti/dist/babel.cjs +257 -0
  147. package/node_modules/jiti/dist/jiti.cjs +1 -0
  148. package/node_modules/jiti/lib/jiti.mjs +29 -0
  149. package/node_modules/jiti/lib/types.d.ts +420 -0
  150. package/node_modules/jiti/package.json +146 -0
  151. package/node_modules/protobufjs/dist/light/protobuf.js +5 -3
  152. package/node_modules/protobufjs/dist/light/protobuf.js.map +1 -1
  153. package/node_modules/protobufjs/dist/light/protobuf.min.js +3 -3
  154. package/node_modules/protobufjs/dist/light/protobuf.min.js.map +1 -1
  155. package/node_modules/protobufjs/dist/minimal/protobuf.js +2 -2
  156. package/node_modules/protobufjs/dist/minimal/protobuf.min.js +2 -2
  157. package/node_modules/protobufjs/dist/protobuf.js +5 -3
  158. package/node_modules/protobufjs/dist/protobuf.js.map +1 -1
  159. package/node_modules/protobufjs/dist/protobuf.min.js +3 -3
  160. package/node_modules/protobufjs/dist/protobuf.min.js.map +1 -1
  161. package/node_modules/protobufjs/package.json +1 -1
  162. package/node_modules/protobufjs/src/namespace.js +3 -1
  163. package/node_modules/semver/README.md +19 -4
  164. package/node_modules/semver/bin/semver.js +14 -10
  165. package/node_modules/semver/functions/truncate.js +48 -0
  166. package/node_modules/semver/index.js +2 -0
  167. package/node_modules/semver/internal/re.js +1 -1
  168. package/node_modules/semver/package.json +3 -3
  169. package/node_modules/semver/range.bnf +5 -4
  170. package/node_modules/socks/package.json +2 -2
  171. package/node_modules/xml-naming/README.md +189 -0
  172. package/node_modules/xml-naming/package.json +54 -0
  173. package/node_modules/xml-naming/src/index.d.ts +74 -0
  174. package/node_modules/xml-naming/src/index.js +270 -0
  175. package/package.json +6 -6
  176. package/sling-default-packages.json +2 -1
  177. package/slingshot/index.js +442 -23
  178. package/node_modules/@mariozechner/jiti/dist/babel.cjs +0 -246
  179. package/node_modules/@mariozechner/jiti/dist/jiti.cjs +0 -1
  180. package/node_modules/@mariozechner/jiti/package.json +0 -96
  181. package/node_modules/@mariozechner/pi-agent-core/dist/index.js +0 -9
  182. package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/cli.js +0 -116
  183. package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/env-api-keys.js +0 -166
  184. package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/index.js +0 -15
  185. package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/models.generated.js +0 -16568
  186. package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/providers/amazon-bedrock.js +0 -753
  187. package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/providers/openai-codex-responses.js +0 -909
  188. package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/providers/openai-responses-shared.js +0 -479
  189. package/node_modules/@mariozechner/pi-agent-core/node_modules/@mariozechner/pi-ai/dist/utils/oauth/openai-codex.js +0 -374
  190. package/node_modules/@mariozechner/pi-ai/dist/api-registry.js +0 -44
  191. package/node_modules/@mariozechner/pi-ai/dist/bedrock-provider.js +0 -6
  192. package/node_modules/@mariozechner/pi-ai/dist/models.js +0 -71
  193. package/node_modules/@mariozechner/pi-ai/dist/oauth.js +0 -2
  194. package/node_modules/@mariozechner/pi-ai/dist/providers/anthropic.js +0 -951
  195. package/node_modules/@mariozechner/pi-ai/dist/providers/azure-openai-responses.js +0 -208
  196. package/node_modules/@mariozechner/pi-ai/dist/providers/cloudflare.js +0 -26
  197. package/node_modules/@mariozechner/pi-ai/dist/providers/faux.js +0 -368
  198. package/node_modules/@mariozechner/pi-ai/dist/providers/github-copilot-headers.js +0 -29
  199. package/node_modules/@mariozechner/pi-ai/dist/providers/google-shared.js +0 -329
  200. package/node_modules/@mariozechner/pi-ai/dist/providers/google-vertex.js +0 -442
  201. package/node_modules/@mariozechner/pi-ai/dist/providers/google.js +0 -400
  202. package/node_modules/@mariozechner/pi-ai/dist/providers/mistral.js +0 -535
  203. package/node_modules/@mariozechner/pi-ai/dist/providers/openai-completions.js +0 -908
  204. package/node_modules/@mariozechner/pi-ai/dist/providers/openai-responses.js +0 -220
  205. package/node_modules/@mariozechner/pi-ai/dist/providers/register-builtins.js +0 -243
  206. package/node_modules/@mariozechner/pi-ai/dist/providers/simple-options.js +0 -39
  207. package/node_modules/@mariozechner/pi-ai/dist/providers/transform-messages.js +0 -184
  208. package/node_modules/@mariozechner/pi-ai/dist/stream.js +0 -27
  209. package/node_modules/@mariozechner/pi-ai/dist/types.js +0 -2
  210. package/node_modules/@mariozechner/pi-ai/dist/utils/event-stream.js +0 -81
  211. package/node_modules/@mariozechner/pi-ai/dist/utils/hash.js +0 -14
  212. package/node_modules/@mariozechner/pi-ai/dist/utils/headers.js +0 -8
  213. package/node_modules/@mariozechner/pi-ai/dist/utils/json-parse.js +0 -113
  214. package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/anthropic.js +0 -335
  215. package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/github-copilot.js +0 -292
  216. package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/index.js +0 -121
  217. package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/oauth-page.js +0 -105
  218. package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/pkce.js +0 -31
  219. package/node_modules/@mariozechner/pi-ai/dist/utils/oauth/types.js +0 -2
  220. package/node_modules/@mariozechner/pi-ai/dist/utils/overflow.js +0 -146
  221. package/node_modules/@mariozechner/pi-ai/dist/utils/sanitize-unicode.js +0 -26
  222. package/node_modules/@mariozechner/pi-ai/dist/utils/typebox-helpers.js +0 -21
  223. package/node_modules/@mariozechner/pi-ai/dist/utils/validation.js +0 -281
  224. package/node_modules/@mariozechner/pi-ai/package.json +0 -108
  225. package/node_modules/@mariozechner/pi-coding-agent/dist/bun/register-bedrock.js +0 -4
  226. package/node_modules/@mariozechner/pi-coding-agent/dist/modes/interactive/components/keybinding-hints.js +0 -22
  227. package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/dist/agent-loop.js +0 -458
  228. package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/dist/agent.js +0 -398
  229. package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/dist/index.js +0 -9
  230. package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/dist/proxy.js +0 -278
  231. package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/dist/types.js +0 -2
  232. package/node_modules/@mariozechner/pi-coding-agent/node_modules/@mariozechner/pi-agent-core/package.json +0 -45
  233. package/node_modules/socks/.claude/settings.local.json +0 -26
  234. package/node_modules/std-env/LICENCE +0 -22
  235. package/node_modules/std-env/README.md +0 -118
  236. package/node_modules/std-env/dist/index.cjs +0 -1
  237. package/node_modules/std-env/dist/index.d.cts +0 -92
  238. package/node_modules/std-env/dist/index.d.mts +0 -92
  239. package/node_modules/std-env/dist/index.d.ts +0 -92
  240. package/node_modules/std-env/dist/index.mjs +0 -1
  241. package/node_modules/std-env/package.json +0 -46
  242. package/node_modules/yoctocolors/base.d.ts +0 -47
  243. package/node_modules/yoctocolors/base.js +0 -94
  244. package/node_modules/yoctocolors/index.d.ts +0 -2
  245. package/node_modules/yoctocolors/index.js +0 -2
  246. package/node_modules/yoctocolors/license +0 -9
  247. package/node_modules/yoctocolors/package.json +0 -69
  248. package/node_modules/yoctocolors/readme.md +0 -138
  249. /package/node_modules/{@mariozechner/pi-coding-agent/dist/core → @earendil-works/pi-agent-core/dist/harness}/compaction/utils.js +0 -0
  250. /package/node_modules/{@mariozechner/pi-coding-agent/dist/core/tools → @earendil-works/pi-agent-core/dist/harness/utils}/truncate.js +0 -0
  251. /package/node_modules/{@mariozechner → @earendil-works}/pi-agent-core/dist/types.js +0 -0
  252. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/api-registry.js +0 -0
  253. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/bedrock-provider.js +0 -0
  254. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/models.js +0 -0
  255. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/oauth.js +0 -0
  256. /package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/providers/amazon-bedrock.js +0 -0
  257. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/anthropic.js +0 -0
  258. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/azure-openai-responses.js +0 -0
  259. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/cloudflare.js +0 -0
  260. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/faux.js +0 -0
  261. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/github-copilot-headers.js +0 -0
  262. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/google-shared.js +0 -0
  263. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/google-vertex.js +0 -0
  264. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/google.js +0 -0
  265. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/mistral.js +0 -0
  266. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/openai-responses.js +0 -0
  267. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/register-builtins.js +0 -0
  268. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/simple-options.js +0 -0
  269. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/providers/transform-messages.js +0 -0
  270. /package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/session-resources.js +0 -0
  271. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/stream.js +0 -0
  272. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/types.js +0 -0
  273. /package/node_modules/{@mariozechner → @earendil-works}/pi-ai/dist/utils/diagnostics.js +0 -0
  274. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/event-stream.js +0 -0
  275. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/hash.js +0 -0
  276. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/headers.js +0 -0
  277. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/json-parse.js +0 -0
  278. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/anthropic.js +0 -0
  279. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/github-copilot.js +0 -0
  280. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/index.js +0 -0
  281. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/oauth-page.js +0 -0
  282. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/pkce.js +0 -0
  283. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/oauth/types.js +0 -0
  284. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/sanitize-unicode.js +0 -0
  285. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/typebox-helpers.js +0 -0
  286. /package/node_modules/{@mariozechner/pi-agent-core/node_modules/@mariozechner → @earendil-works}/pi-ai/dist/utils/validation.js +0 -0
  287. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/bun/cli.js +0 -0
  288. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/bun/restore-sandbox-env.js +0 -0
  289. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/file-processor.js +0 -0
  290. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli/initial-message.js +0 -0
  291. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/cli.js +0 -0
  292. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/agent-session-runtime.js +0 -0
  293. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/agent-session-services.js +0 -0
  294. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/auth-guidance.js +0 -0
  295. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/bash-executor.js +0 -0
  296. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/compaction/index.js +0 -0
  297. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/defaults.js +0 -0
  298. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/diagnostics.js +0 -0
  299. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/event-bus.js +0 -0
  300. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/exec.js +0 -0
  301. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/ansi-to-html.js +0 -0
  302. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/index.js +0 -0
  303. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/template.html +0 -0
  304. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/tool-renderer.js +0 -0
  305. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/vendor/highlight.min.js +0 -0
  306. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/export-html/vendor/marked.min.js +0 -0
  307. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/extensions/index.js +0 -0
  308. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/extensions/runner.js +0 -0
  309. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/extensions/types.js +0 -0
  310. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/extensions/wrapper.js +0 -0
  311. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/footer-data-provider.js +0 -0
  312. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/index.js +0 -0
  313. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/messages.js +0 -0
  314. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/output-guard.js +0 -0
  315. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/prompt-templates.js +0 -0
  316. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/resolve-config-value.js +0 -0
  317. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/resource-loader.js +0 -0
  318. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/session-cwd.js +0 -0
  319. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/session-manager.js +0 -0
  320. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/settings-manager.js +0 -0
  321. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/skills.js +0 -0
  322. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/slash-commands.js +0 -0
  323. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/source-info.js +0 -0
  324. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/system-prompt.js +0 -0
  325. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/telemetry.js +0 -0
  326. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/timings.js +0 -0
  327. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/edit-diff.js +0 -0
  328. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/file-mutation-queue.js +0 -0
  329. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/index.js +0 -0
  330. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/output-accumulator.js +0 -0
  331. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/path-utils.js +0 -0
  332. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/core/tools/tool-definition-wrapper.js +0 -0
  333. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/index.js +0 -0
  334. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/index.js +0 -0
  335. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/assets/clankolas.png +0 -0
  336. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/armin.js +0 -0
  337. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +0 -0
  338. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +0 -0
  339. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/diff.js +0 -0
  340. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +0 -0
  341. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/components/index.js +0 -0
  342. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -0
  343. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/print-mode.js +0 -0
  344. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/rpc/jsonl.js +0 -0
  345. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/rpc/rpc-client.js +0 -0
  346. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/rpc/rpc-mode.js +0 -0
  347. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/modes/rpc/rpc-types.js +0 -0
  348. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/changelog.js +0 -0
  349. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/child-process.js +0 -0
  350. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/clipboard-image.js +0 -0
  351. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/clipboard-native.js +0 -0
  352. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/exif-orientation.js +0 -0
  353. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/frontmatter.js +0 -0
  354. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/fs-watch.js +0 -0
  355. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/git.js +0 -0
  356. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/image-convert.js +0 -0
  357. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/image-resize.js +0 -0
  358. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/mime.js +0 -0
  359. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/photon.js +0 -0
  360. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/pi-user-agent.js +0 -0
  361. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/shell.js +0 -0
  362. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/sleep.js +0 -0
  363. /package/node_modules/{@mariozechner → @earendil-works}/pi-coding-agent/dist/utils/tools-manager.js +0 -0
  364. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/autocomplete.js +0 -0
  365. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/box.js +0 -0
  366. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/cancellable-loader.js +0 -0
  367. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/editor.js +0 -0
  368. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/input.js +0 -0
  369. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/loader.js +0 -0
  370. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/select-list.js +0 -0
  371. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/settings-list.js +0 -0
  372. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/spacer.js +0 -0
  373. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/text.js +0 -0
  374. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/components/truncated-text.js +0 -0
  375. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/editor-component.js +0 -0
  376. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/fuzzy.js +0 -0
  377. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/index.js +0 -0
  378. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/keybindings.js +0 -0
  379. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/keys.js +0 -0
  380. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/kill-ring.js +0 -0
  381. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/stdin-buffer.js +0 -0
  382. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/terminal.js +0 -0
  383. /package/node_modules/{@mariozechner → @earendil-works}/pi-tui/dist/undo-stack.js +0 -0
  384. /package/node_modules/{@mariozechner/jiti → jiti}/LICENSE +0 -0
  385. /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti-cli.mjs +0 -0
  386. /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti-hooks.mjs +0 -0
  387. /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti-native.mjs +0 -0
  388. /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti-register.d.mts +0 -0
  389. /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti-register.mjs +0 -0
  390. /package/node_modules/{@mariozechner/jiti/lib/jiti.mjs → jiti/lib/jiti-static.mjs} +0 -0
  391. /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti.cjs +0 -0
  392. /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti.d.cts +0 -0
  393. /package/node_modules/{@mariozechner/jiti → jiti}/lib/jiti.d.mts +0 -0
@@ -0,0 +1,129 @@
1
+ import OpenAI from "openai";
2
+ import { getEnvApiKey } from "../../env-api-keys.js";
3
+ import { headersToRecord } from "../../utils/headers.js";
4
+ import { sanitizeSurrogates } from "../../utils/sanitize-unicode.js";
5
+ export const generateImagesOpenRouter = async (model, context, options) => {
6
+ const output = {
7
+ api: model.api,
8
+ provider: model.provider,
9
+ model: model.id,
10
+ output: [],
11
+ stopReason: "stop",
12
+ timestamp: Date.now(),
13
+ };
14
+ try {
15
+ const apiKey = options?.apiKey || getEnvApiKey(model.provider);
16
+ if (!apiKey) {
17
+ throw new Error(`No API key available for provider: ${model.provider}`);
18
+ }
19
+ const client = createClient(model, apiKey, options?.headers);
20
+ let params = buildParams(model, context);
21
+ const nextParams = await options?.onPayload?.(params, model);
22
+ if (nextParams !== undefined) {
23
+ params = nextParams;
24
+ }
25
+ const requestOptions = {
26
+ ...(options?.signal ? { signal: options.signal } : {}),
27
+ ...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),
28
+ ...(options?.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),
29
+ };
30
+ const { data: response, response: rawResponse } = await client.chat.completions
31
+ .create(params, requestOptions)
32
+ .withResponse();
33
+ await options?.onResponse?.({ status: rawResponse.status, headers: headersToRecord(rawResponse.headers) }, model);
34
+ const imageResponse = response;
35
+ output.responseId = imageResponse.id;
36
+ if (imageResponse.usage) {
37
+ output.usage = parseUsage(imageResponse.usage, model);
38
+ }
39
+ const choice = imageResponse.choices[0];
40
+ if (choice) {
41
+ const content = choice.message.content;
42
+ if (typeof content === "string" && content.length > 0) {
43
+ output.output.push({ type: "text", text: content });
44
+ }
45
+ for (const image of choice.message.images ?? []) {
46
+ const imageUrl = typeof image.image_url === "string" ? image.image_url : image.image_url?.url;
47
+ if (!imageUrl?.startsWith("data:"))
48
+ continue;
49
+ const matches = imageUrl.match(/^data:([^;]+);base64,(.+)$/);
50
+ if (!matches)
51
+ continue;
52
+ output.output.push({
53
+ type: "image",
54
+ mimeType: matches[1],
55
+ data: matches[2],
56
+ });
57
+ }
58
+ }
59
+ return output;
60
+ }
61
+ catch (error) {
62
+ output.stopReason = options?.signal?.aborted ? "aborted" : "error";
63
+ output.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);
64
+ return output;
65
+ }
66
+ };
67
+ function createClient(model, apiKey, optionsHeaders) {
68
+ return new OpenAI({
69
+ apiKey,
70
+ baseURL: model.baseUrl,
71
+ dangerouslyAllowBrowser: true,
72
+ defaultHeaders: {
73
+ ...model.headers,
74
+ ...optionsHeaders,
75
+ },
76
+ });
77
+ }
78
+ function buildParams(model, context) {
79
+ const content = context.input.map((item) => {
80
+ if (item.type === "text") {
81
+ return {
82
+ type: "text",
83
+ text: sanitizeSurrogates(item.text),
84
+ };
85
+ }
86
+ return {
87
+ type: "image_url",
88
+ image_url: {
89
+ url: `data:${item.mimeType};base64,${item.data}`,
90
+ },
91
+ };
92
+ });
93
+ return {
94
+ model: model.id,
95
+ messages: [
96
+ {
97
+ role: "user",
98
+ content,
99
+ },
100
+ ],
101
+ stream: false,
102
+ modalities: model.output.includes("text") ? ["image", "text"] : ["image"],
103
+ };
104
+ }
105
+ function parseUsage(rawUsage, model) {
106
+ const promptTokens = rawUsage.prompt_tokens || 0;
107
+ const reportedCachedTokens = rawUsage.prompt_tokens_details?.cached_tokens || 0;
108
+ const cacheWriteTokens = rawUsage.prompt_tokens_details?.cache_write_tokens || 0;
109
+ const cacheReadTokens = cacheWriteTokens > 0 ? Math.max(0, reportedCachedTokens - cacheWriteTokens) : reportedCachedTokens;
110
+ const input = Math.max(0, promptTokens - cacheReadTokens - cacheWriteTokens);
111
+ const output = rawUsage.completion_tokens || 0;
112
+ const usage = {
113
+ input,
114
+ output,
115
+ cacheRead: cacheReadTokens,
116
+ cacheWrite: cacheWriteTokens,
117
+ totalTokens: input + output + cacheReadTokens + cacheWriteTokens,
118
+ cost: {
119
+ input: (model.cost.input / 1000000) * input,
120
+ output: (model.cost.output / 1000000) * output,
121
+ cacheRead: (model.cost.cacheRead / 1000000) * cacheReadTokens,
122
+ cacheWrite: (model.cost.cacheWrite / 1000000) * cacheWriteTokens,
123
+ total: 0,
124
+ },
125
+ };
126
+ usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
127
+ return usage;
128
+ }
129
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1,34 @@
1
+ import { registerImagesApiProvider } from "../../images-api-registry.js";
2
+ let openRouterImagesProviderModulePromise;
3
+ function createLazyLoadErrorImages(model, error) {
4
+ return {
5
+ api: model.api,
6
+ provider: model.provider,
7
+ model: model.id,
8
+ output: [],
9
+ stopReason: "error",
10
+ errorMessage: error instanceof Error ? error.message : String(error),
11
+ timestamp: Date.now(),
12
+ };
13
+ }
14
+ function loadOpenRouterImagesProviderModule() {
15
+ openRouterImagesProviderModulePromise ||= import("./openrouter.js").then((module) => module);
16
+ return openRouterImagesProviderModulePromise;
17
+ }
18
+ export const generateImagesOpenRouter = async (model, context, options) => {
19
+ try {
20
+ const module = await loadOpenRouterImagesProviderModule();
21
+ return await module.generateImagesOpenRouter(model, context, options);
22
+ }
23
+ catch (error) {
24
+ return createLazyLoadErrorImages(model, error);
25
+ }
26
+ };
27
+ export function registerBuiltInImagesApiProviders() {
28
+ registerImagesApiProvider({
29
+ api: "openrouter-images",
30
+ generateImages: generateImagesOpenRouter,
31
+ });
32
+ }
33
+ registerBuiltInImagesApiProviders();
34
+ //# sourceMappingURL=register-builtins.js.map
@@ -232,7 +232,7 @@ function buildRequestBody(model, context, options) {
232
232
  model: model.id,
233
233
  store: false,
234
234
  stream: true,
235
- instructions: context.systemPrompt,
235
+ instructions: context.systemPrompt || "You are a helpful assistant.",
236
236
  input: messages,
237
237
  text: { verbosity: options?.textVerbosity || "low" },
238
238
  include: ["reasoning.encrypted_content"],
@@ -89,46 +89,103 @@ export const streamOpenAICompletions = (model, context, options) => {
89
89
  .withResponse();
90
90
  await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);
91
91
  stream.push({ type: "start", partial: output });
92
- let currentBlock = null;
92
+ let textBlock = null;
93
+ let thinkingBlock = null;
94
+ const toolCallBlocksByIndex = new Map();
95
+ const toolCallBlocksById = new Map();
93
96
  const blocks = output.content;
94
- const getContentIndex = (block) => (block ? blocks.indexOf(block) : -1);
95
- const currentContentIndex = () => getContentIndex(currentBlock);
96
- const finishCurrentBlock = (block) => {
97
- if (block) {
98
- const contentIndex = getContentIndex(block);
99
- if (contentIndex === -1) {
100
- return;
101
- }
102
- if (block.type === "text") {
103
- stream.push({
104
- type: "text_end",
105
- contentIndex,
106
- content: block.text,
107
- partial: output,
108
- });
109
- }
110
- else if (block.type === "thinking") {
111
- stream.push({
112
- type: "thinking_end",
113
- contentIndex,
114
- content: block.thinking,
115
- partial: output,
116
- });
97
+ const getContentIndex = (block) => blocks.indexOf(block);
98
+ const finishBlock = (block) => {
99
+ const contentIndex = getContentIndex(block);
100
+ if (contentIndex === -1) {
101
+ return;
102
+ }
103
+ if (block.type === "text") {
104
+ stream.push({
105
+ type: "text_end",
106
+ contentIndex,
107
+ content: block.text,
108
+ partial: output,
109
+ });
110
+ }
111
+ else if (block.type === "thinking") {
112
+ stream.push({
113
+ type: "thinking_end",
114
+ contentIndex,
115
+ content: block.thinking,
116
+ partial: output,
117
+ });
118
+ }
119
+ else if (block.type === "toolCall") {
120
+ block.arguments = parseStreamingJson(block.partialArgs);
121
+ // Finalize in-place and strip the scratch buffers so replay only
122
+ // carries parsed arguments.
123
+ delete block.partialArgs;
124
+ delete block.streamIndex;
125
+ stream.push({
126
+ type: "toolcall_end",
127
+ contentIndex,
128
+ toolCall: block,
129
+ partial: output,
130
+ });
131
+ }
132
+ };
133
+ const ensureTextBlock = () => {
134
+ if (!textBlock) {
135
+ textBlock = { type: "text", text: "" };
136
+ blocks.push(textBlock);
137
+ stream.push({ type: "text_start", contentIndex: getContentIndex(textBlock), partial: output });
138
+ }
139
+ return textBlock;
140
+ };
141
+ const ensureThinkingBlock = (thinkingSignature) => {
142
+ if (!thinkingBlock) {
143
+ thinkingBlock = {
144
+ type: "thinking",
145
+ thinking: "",
146
+ thinkingSignature,
147
+ };
148
+ blocks.push(thinkingBlock);
149
+ stream.push({ type: "thinking_start", contentIndex: getContentIndex(thinkingBlock), partial: output });
150
+ }
151
+ return thinkingBlock;
152
+ };
153
+ const ensureToolCallBlock = (toolCall) => {
154
+ const streamIndex = typeof toolCall.index === "number" ? toolCall.index : undefined;
155
+ let block = streamIndex !== undefined ? toolCallBlocksByIndex.get(streamIndex) : undefined;
156
+ if (!block && toolCall.id) {
157
+ block = toolCallBlocksById.get(toolCall.id);
158
+ }
159
+ if (!block) {
160
+ block = {
161
+ type: "toolCall",
162
+ id: toolCall.id || "",
163
+ name: toolCall.function?.name || "",
164
+ arguments: {},
165
+ partialArgs: "",
166
+ streamIndex,
167
+ };
168
+ if (streamIndex !== undefined) {
169
+ toolCallBlocksByIndex.set(streamIndex, block);
117
170
  }
118
- else if (block.type === "toolCall") {
119
- block.arguments = parseStreamingJson(block.partialArgs);
120
- // Finalize in-place and strip the scratch buffers so replay only
121
- // carries parsed arguments.
122
- delete block.partialArgs;
123
- delete block.streamIndex;
124
- stream.push({
125
- type: "toolcall_end",
126
- contentIndex,
127
- toolCall: block,
128
- partial: output,
129
- });
171
+ if (toolCall.id) {
172
+ toolCallBlocksById.set(toolCall.id, block);
130
173
  }
174
+ blocks.push(block);
175
+ stream.push({
176
+ type: "toolcall_start",
177
+ contentIndex: getContentIndex(block),
178
+ partial: output,
179
+ });
180
+ }
181
+ if (streamIndex !== undefined && block.streamIndex === undefined) {
182
+ block.streamIndex = streamIndex;
183
+ toolCallBlocksByIndex.set(streamIndex, block);
184
+ }
185
+ if (toolCall.id) {
186
+ toolCallBlocksById.set(toolCall.id, block);
131
187
  }
188
+ return block;
132
189
  };
133
190
  for await (const chunk of openaiStream) {
134
191
  if (!chunk || typeof chunk !== "object")
@@ -161,55 +218,37 @@ export const streamOpenAICompletions = (model, context, options) => {
161
218
  if (choice.delta.content !== null &&
162
219
  choice.delta.content !== undefined &&
163
220
  choice.delta.content.length > 0) {
164
- if (!currentBlock || currentBlock.type !== "text") {
165
- finishCurrentBlock(currentBlock);
166
- currentBlock = { type: "text", text: "" };
167
- output.content.push(currentBlock);
168
- stream.push({ type: "text_start", contentIndex: currentContentIndex(), partial: output });
169
- }
170
- if (currentBlock.type === "text") {
171
- currentBlock.text += choice.delta.content;
172
- stream.push({
173
- type: "text_delta",
174
- contentIndex: currentContentIndex(),
175
- delta: choice.delta.content,
176
- partial: output,
177
- });
178
- }
221
+ const block = ensureTextBlock();
222
+ block.text += choice.delta.content;
223
+ stream.push({
224
+ type: "text_delta",
225
+ contentIndex: getContentIndex(block),
226
+ delta: choice.delta.content,
227
+ partial: output,
228
+ });
179
229
  }
180
230
  // Some endpoints return reasoning in reasoning_content (llama.cpp),
181
231
  // or reasoning (other openai compatible endpoints)
182
232
  // Use the first non-empty reasoning field to avoid duplication
183
233
  // (e.g., chutes.ai returns both reasoning_content and reasoning with same content)
184
234
  const reasoningFields = ["reasoning_content", "reasoning", "reasoning_text"];
235
+ const deltaFields = choice.delta;
185
236
  let foundReasoningField = null;
186
237
  for (const field of reasoningFields) {
187
- if (choice.delta[field] !== null &&
188
- choice.delta[field] !== undefined &&
189
- choice.delta[field].length > 0) {
190
- if (!foundReasoningField) {
191
- foundReasoningField = field;
192
- break;
193
- }
238
+ const value = deltaFields[field];
239
+ if (typeof value === "string" && value.length > 0) {
240
+ foundReasoningField = field;
241
+ break;
194
242
  }
195
243
  }
196
244
  if (foundReasoningField) {
197
- if (!currentBlock || currentBlock.type !== "thinking") {
198
- finishCurrentBlock(currentBlock);
199
- currentBlock = {
200
- type: "thinking",
201
- thinking: "",
202
- thinkingSignature: foundReasoningField,
203
- };
204
- output.content.push(currentBlock);
205
- stream.push({ type: "thinking_start", contentIndex: currentContentIndex(), partial: output });
206
- }
207
- if (currentBlock.type === "thinking") {
208
- const delta = choice.delta[foundReasoningField];
209
- currentBlock.thinking += delta;
245
+ const delta = deltaFields[foundReasoningField];
246
+ if (typeof delta === "string" && delta.length > 0) {
247
+ const block = ensureThinkingBlock(foundReasoningField);
248
+ block.thinking += delta;
210
249
  stream.push({
211
250
  type: "thinking_delta",
212
- contentIndex: currentContentIndex(),
251
+ contentIndex: getContentIndex(block),
213
252
  delta,
214
253
  partial: output,
215
254
  });
@@ -217,50 +256,26 @@ export const streamOpenAICompletions = (model, context, options) => {
217
256
  }
218
257
  if (choice?.delta?.tool_calls) {
219
258
  for (const toolCall of choice.delta.tool_calls) {
220
- const streamIndex = typeof toolCall.index === "number" ? toolCall.index : undefined;
221
- const sameToolCall = currentBlock?.type === "toolCall" &&
222
- ((streamIndex !== undefined && currentBlock.streamIndex === streamIndex) ||
223
- (streamIndex === undefined && toolCall.id && currentBlock.id === toolCall.id));
224
- if (!sameToolCall) {
225
- finishCurrentBlock(currentBlock);
226
- currentBlock = {
227
- type: "toolCall",
228
- id: toolCall.id || "",
229
- name: toolCall.function?.name || "",
230
- arguments: {},
231
- partialArgs: "",
232
- streamIndex,
233
- };
234
- output.content.push(currentBlock);
235
- stream.push({
236
- type: "toolcall_start",
237
- contentIndex: getContentIndex(currentBlock),
238
- partial: output,
239
- });
259
+ const block = ensureToolCallBlock(toolCall);
260
+ if (!block.id && toolCall.id) {
261
+ block.id = toolCall.id;
262
+ toolCallBlocksById.set(toolCall.id, block);
240
263
  }
241
- const currentToolCallBlock = currentBlock?.type === "toolCall" ? currentBlock : null;
242
- if (currentToolCallBlock) {
243
- if (!currentToolCallBlock.id && toolCall.id)
244
- currentToolCallBlock.id = toolCall.id;
245
- if (!currentToolCallBlock.name && toolCall.function?.name) {
246
- currentToolCallBlock.name = toolCall.function.name;
247
- }
248
- if (currentToolCallBlock.streamIndex === undefined && streamIndex !== undefined) {
249
- currentToolCallBlock.streamIndex = streamIndex;
250
- }
251
- let delta = "";
252
- if (toolCall.function?.arguments) {
253
- delta = toolCall.function.arguments;
254
- currentToolCallBlock.partialArgs += toolCall.function.arguments;
255
- currentToolCallBlock.arguments = parseStreamingJson(currentToolCallBlock.partialArgs);
256
- }
257
- stream.push({
258
- type: "toolcall_delta",
259
- contentIndex: getContentIndex(currentToolCallBlock),
260
- delta,
261
- partial: output,
262
- });
264
+ if (!block.name && toolCall.function?.name) {
265
+ block.name = toolCall.function.name;
266
+ }
267
+ let delta = "";
268
+ if (toolCall.function?.arguments) {
269
+ delta = toolCall.function.arguments;
270
+ block.partialArgs = (block.partialArgs ?? "") + toolCall.function.arguments;
271
+ block.arguments = parseStreamingJson(block.partialArgs);
263
272
  }
273
+ stream.push({
274
+ type: "toolcall_delta",
275
+ contentIndex: getContentIndex(block),
276
+ delta,
277
+ partial: output,
278
+ });
264
279
  }
265
280
  }
266
281
  const reasoningDetails = choice.delta.reasoning_details;
@@ -276,7 +291,9 @@ export const streamOpenAICompletions = (model, context, options) => {
276
291
  }
277
292
  }
278
293
  }
279
- finishCurrentBlock(currentBlock);
294
+ for (const block of blocks) {
295
+ finishBlock(block);
296
+ }
280
297
  if (options?.signal?.aborted) {
281
298
  throw new Error("Request was aborted");
282
299
  }
@@ -439,6 +456,13 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
439
456
  openRouterParams.reasoning = { effort: model.thinkingLevelMap?.off ?? "none" };
440
457
  }
441
458
  }
459
+ else if (compat.thinkingFormat === "together" && model.reasoning) {
460
+ const togetherParams = params;
461
+ togetherParams.reasoning = { enabled: !!options?.reasoningEffort };
462
+ if (options?.reasoningEffort && compat.supportsReasoningEffort) {
463
+ togetherParams.reasoning_effort = model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;
464
+ }
465
+ }
442
466
  else if (options?.reasoningEffort && model.reasoning && compat.supportsReasoningEffort) {
443
467
  // OpenAI-style reasoning_effort
444
468
  params.reasoning_effort = model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort;
@@ -831,6 +855,7 @@ function detectCompat(model) {
831
855
  const provider = model.provider;
832
856
  const baseUrl = model.baseUrl;
833
857
  const isZai = provider === "zai" || baseUrl.includes("api.z.ai");
858
+ const isTogether = provider === "together" || baseUrl.includes("api.together.ai") || baseUrl.includes("api.together.xyz");
834
859
  const isMoonshot = provider === "moonshotai" || provider === "moonshotai-cn" || baseUrl.includes("api.moonshot.");
835
860
  const isCloudflareWorkersAI = provider === "cloudflare-workers-ai" || baseUrl.includes("api.cloudflare.com");
836
861
  const isCloudflareAiGateway = provider === "cloudflare-ai-gateway" || baseUrl.includes("gateway.ai.cloudflare.com");
@@ -838,6 +863,7 @@ function detectCompat(model) {
838
863
  baseUrl.includes("cerebras.ai") ||
839
864
  provider === "xai" ||
840
865
  baseUrl.includes("api.x.ai") ||
866
+ isTogether ||
841
867
  baseUrl.includes("chutes.ai") ||
842
868
  baseUrl.includes("deepseek.com") ||
843
869
  isZai ||
@@ -846,14 +872,14 @@ function detectCompat(model) {
846
872
  baseUrl.includes("opencode.ai") ||
847
873
  isCloudflareWorkersAI ||
848
874
  isCloudflareAiGateway;
849
- const useMaxTokens = baseUrl.includes("chutes.ai") || isMoonshot || isCloudflareAiGateway;
875
+ const useMaxTokens = baseUrl.includes("chutes.ai") || isMoonshot || isCloudflareAiGateway || isTogether;
850
876
  const isGrok = provider === "xai" || baseUrl.includes("api.x.ai");
851
877
  const isDeepSeek = provider === "deepseek" || baseUrl.includes("deepseek.com");
852
878
  const cacheControlFormat = provider === "openrouter" && model.id.startsWith("anthropic/") ? "anthropic" : undefined;
853
879
  return {
854
880
  supportsStore: !isNonStandard,
855
881
  supportsDeveloperRole: !isNonStandard,
856
- supportsReasoningEffort: !isGrok && !isZai && !isMoonshot && !isCloudflareAiGateway,
882
+ supportsReasoningEffort: !isGrok && !isZai && !isMoonshot && !isTogether && !isCloudflareAiGateway,
857
883
  supportsUsageInStreaming: true,
858
884
  maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
859
885
  requiresToolResultName: false,
@@ -864,16 +890,18 @@ function detectCompat(model) {
864
890
  ? "deepseek"
865
891
  : isZai
866
892
  ? "zai"
867
- : provider === "openrouter" || baseUrl.includes("openrouter.ai")
868
- ? "openrouter"
869
- : "openai",
893
+ : isTogether
894
+ ? "together"
895
+ : provider === "openrouter" || baseUrl.includes("openrouter.ai")
896
+ ? "openrouter"
897
+ : "openai",
870
898
  openRouterRouting: {},
871
899
  vercelGatewayRouting: {},
872
900
  zaiToolStream: false,
873
- supportsStrictMode: !isMoonshot && !isCloudflareAiGateway,
901
+ supportsStrictMode: !isMoonshot && !isTogether && !isCloudflareAiGateway,
874
902
  cacheControlFormat,
875
903
  sendSessionAffinityHeaders: false,
876
- supportsLongCacheRetention: !(isCloudflareWorkersAI || isCloudflareAiGateway),
904
+ supportsLongCacheRetention: !(isTogether || isCloudflareWorkersAI || isCloudflareAiGateway),
877
905
  };
878
906
  }
879
907
  /**
@@ -287,6 +287,17 @@ export async function processResponsesStream(openaiStream, output, stream, model
287
287
  }
288
288
  }
289
289
  }
290
+ else if (event.type === "response.reasoning_text.delta") {
291
+ if (currentItem?.type === "reasoning" && currentBlock?.type === "thinking") {
292
+ currentBlock.thinking += event.delta;
293
+ stream.push({
294
+ type: "thinking_delta",
295
+ contentIndex: blockIndex(),
296
+ delta: event.delta,
297
+ partial: output,
298
+ });
299
+ }
300
+ }
290
301
  else if (event.type === "response.content_part.added") {
291
302
  if (currentItem?.type === "message") {
292
303
  currentItem.content = currentItem.content || [];
@@ -365,7 +376,9 @@ export async function processResponsesStream(openaiStream, output, stream, model
365
376
  else if (event.type === "response.output_item.done") {
366
377
  const item = event.item;
367
378
  if (item.type === "reasoning" && currentBlock?.type === "thinking") {
368
- currentBlock.thinking = item.summary?.map((s) => s.text).join("\n\n") || "";
379
+ const summaryText = item.summary?.map((s) => s.text).join("\n\n") || "";
380
+ const contentText = item.content?.map((c) => c.text).join("\n\n") || "";
381
+ currentBlock.thinking = summaryText || contentText || currentBlock.thinking;
369
382
  currentBlock.thinkingSignature = JSON.stringify(item);
370
383
  stream.push({
371
384
  type: "thinking_end",
@@ -84,13 +84,18 @@ async function exchangeAuthorizationCode(code, verifier, redirectUri = REDIRECT_
84
84
  });
85
85
  if (!response.ok) {
86
86
  const text = await response.text().catch(() => "");
87
- console.error("[openai-codex] code->token failed:", response.status, text);
88
- return { type: "failed" };
87
+ return {
88
+ type: "failed",
89
+ status: response.status,
90
+ message: `OpenAI Codex token exchange failed (${response.status}): ${text || response.statusText}`,
91
+ };
89
92
  }
90
93
  const json = (await response.json());
91
94
  if (!json.access_token || !json.refresh_token || typeof json.expires_in !== "number") {
92
- console.error("[openai-codex] token response missing fields:", json);
93
- return { type: "failed" };
95
+ return {
96
+ type: "failed",
97
+ message: `OpenAI Codex token exchange response missing fields: ${JSON.stringify(json)}`,
98
+ };
94
99
  }
95
100
  return {
96
101
  type: "success",
@@ -112,13 +117,18 @@ async function refreshAccessToken(refreshToken) {
112
117
  });
113
118
  if (!response.ok) {
114
119
  const text = await response.text().catch(() => "");
115
- console.error("[openai-codex] Token refresh failed:", response.status, text);
116
- return { type: "failed" };
120
+ return {
121
+ type: "failed",
122
+ status: response.status,
123
+ message: `OpenAI Codex token refresh failed (${response.status}): ${text || response.statusText}`,
124
+ };
117
125
  }
118
126
  const json = (await response.json());
119
127
  if (!json.access_token || !json.refresh_token || typeof json.expires_in !== "number") {
120
- console.error("[openai-codex] Token refresh response missing fields:", json);
121
- return { type: "failed" };
128
+ return {
129
+ type: "failed",
130
+ message: `OpenAI Codex token refresh response missing fields: ${JSON.stringify(json)}`,
131
+ };
122
132
  }
123
133
  return {
124
134
  type: "success",
@@ -128,8 +138,10 @@ async function refreshAccessToken(refreshToken) {
128
138
  };
129
139
  }
130
140
  catch (error) {
131
- console.error("[openai-codex] Token refresh error:", error);
132
- return { type: "failed" };
141
+ return {
142
+ type: "failed",
143
+ message: `OpenAI Codex token refresh error: ${error instanceof Error ? error.message : String(error)}`,
144
+ };
133
145
  }
134
146
  }
135
147
  async function createAuthorizationFlow(originator = "pi") {
@@ -206,8 +218,7 @@ function startLocalOAuthServer(state) {
206
218
  waitForCode: () => waitForCodePromise,
207
219
  });
208
220
  })
209
- .on("error", (err) => {
210
- console.error(`[openai-codex] Failed to bind http://${CALLBACK_HOST}:1455 (`, err.code, ") Falling back to manual paste.");
221
+ .on("error", (_err) => {
211
222
  settleWait?.(null);
212
223
  resolve({
213
224
  close: () => {
@@ -316,7 +327,7 @@ export async function loginOpenAICodex(options) {
316
327
  }
317
328
  const tokenResult = await exchangeAuthorizationCode(code, verifier);
318
329
  if (tokenResult.type !== "success") {
319
- throw new Error("Token exchange failed");
330
+ throw new Error(tokenResult.message);
320
331
  }
321
332
  const accountId = getAccountId(tokenResult.access);
322
333
  if (!accountId) {
@@ -339,7 +350,7 @@ export async function loginOpenAICodex(options) {
339
350
  export async function refreshOpenAICodexToken(refreshToken) {
340
351
  const result = await refreshAccessToken(refreshToken);
341
352
  if (result.type !== "success") {
342
- throw new Error("Failed to refresh OpenAI Codex token");
353
+ throw new Error(result.message);
343
354
  }
344
355
  const accountId = getAccountId(result.access);
345
356
  if (!accountId) {