indusagi 0.1.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 (422) hide show
  1. package/README.md +27 -0
  2. package/dist/agent/agent-loop.d.ts +21 -0
  3. package/dist/agent/agent-loop.d.ts.map +1 -0
  4. package/dist/agent/agent-loop.js +307 -0
  5. package/dist/agent/agent.d.ts +122 -0
  6. package/dist/agent/agent.d.ts.map +1 -0
  7. package/dist/agent/agent.js +347 -0
  8. package/dist/agent/index.d.ts +5 -0
  9. package/dist/agent/index.d.ts.map +1 -0
  10. package/dist/agent/index.js +8 -0
  11. package/dist/agent/proxy.d.ts +85 -0
  12. package/dist/agent/proxy.d.ts.map +1 -0
  13. package/dist/agent/proxy.js +267 -0
  14. package/dist/agent/types.d.ts +178 -0
  15. package/dist/agent/types.d.ts.map +1 -0
  16. package/dist/agent/types.js +1 -0
  17. package/dist/agent.d.ts +2 -0
  18. package/dist/agent.d.ts.map +1 -0
  19. package/dist/agent.js +1 -0
  20. package/dist/ai/api-registry.d.ts +20 -0
  21. package/dist/ai/api-registry.d.ts.map +1 -0
  22. package/dist/ai/api-registry.js +43 -0
  23. package/dist/ai/cli.d.ts +3 -0
  24. package/dist/ai/cli.d.ts.map +1 -0
  25. package/dist/ai/cli.js +115 -0
  26. package/dist/ai/env-api-keys.d.ts +9 -0
  27. package/dist/ai/env-api-keys.d.ts.map +1 -0
  28. package/dist/ai/env-api-keys.js +90 -0
  29. package/dist/ai/index.d.ts +20 -0
  30. package/dist/ai/index.d.ts.map +1 -0
  31. package/dist/ai/index.js +19 -0
  32. package/dist/ai/models.d.ts +21 -0
  33. package/dist/ai/models.d.ts.map +1 -0
  34. package/dist/ai/models.generated.d.ts +11500 -0
  35. package/dist/ai/models.generated.d.ts.map +1 -0
  36. package/dist/ai/models.generated.js +11350 -0
  37. package/dist/ai/models.js +47 -0
  38. package/dist/ai/providers/amazon-bedrock.d.ts +15 -0
  39. package/dist/ai/providers/amazon-bedrock.d.ts.map +1 -0
  40. package/dist/ai/providers/amazon-bedrock.js +510 -0
  41. package/dist/ai/providers/anthropic.d.ts +13 -0
  42. package/dist/ai/providers/anthropic.d.ts.map +1 -0
  43. package/dist/ai/providers/anthropic.js +584 -0
  44. package/dist/ai/providers/azure-openai-responses.d.ts +15 -0
  45. package/dist/ai/providers/azure-openai-responses.d.ts.map +1 -0
  46. package/dist/ai/providers/azure-openai-responses.js +183 -0
  47. package/dist/ai/providers/google-gemini-cli.d.ts +74 -0
  48. package/dist/ai/providers/google-gemini-cli.d.ts.map +1 -0
  49. package/dist/ai/providers/google-gemini-cli.js +807 -0
  50. package/dist/ai/providers/google-shared.d.ts +64 -0
  51. package/dist/ai/providers/google-shared.d.ts.map +1 -0
  52. package/dist/ai/providers/google-shared.js +300 -0
  53. package/dist/ai/providers/google-vertex.d.ts +15 -0
  54. package/dist/ai/providers/google-vertex.d.ts.map +1 -0
  55. package/dist/ai/providers/google-vertex.js +370 -0
  56. package/dist/ai/providers/google.d.ts +13 -0
  57. package/dist/ai/providers/google.d.ts.map +1 -0
  58. package/dist/ai/providers/google.js +351 -0
  59. package/dist/ai/providers/openai-codex-responses.d.ts +9 -0
  60. package/dist/ai/providers/openai-codex-responses.d.ts.map +1 -0
  61. package/dist/ai/providers/openai-codex-responses.js +341 -0
  62. package/dist/ai/providers/openai-completions.d.ts +15 -0
  63. package/dist/ai/providers/openai-completions.d.ts.map +1 -0
  64. package/dist/ai/providers/openai-completions.js +701 -0
  65. package/dist/ai/providers/openai-responses-shared.d.ts +17 -0
  66. package/dist/ai/providers/openai-responses-shared.d.ts.map +1 -0
  67. package/dist/ai/providers/openai-responses-shared.js +423 -0
  68. package/dist/ai/providers/openai-responses.d.ts +13 -0
  69. package/dist/ai/providers/openai-responses.d.ts.map +1 -0
  70. package/dist/ai/providers/openai-responses.js +182 -0
  71. package/dist/ai/providers/register-builtins.d.ts +3 -0
  72. package/dist/ai/providers/register-builtins.d.ts.map +1 -0
  73. package/dist/ai/providers/register-builtins.js +62 -0
  74. package/dist/ai/providers/simple-options.d.ts +8 -0
  75. package/dist/ai/providers/simple-options.d.ts.map +1 -0
  76. package/dist/ai/providers/simple-options.js +31 -0
  77. package/dist/ai/providers/transform-messages.d.ts +8 -0
  78. package/dist/ai/providers/transform-messages.d.ts.map +1 -0
  79. package/dist/ai/providers/transform-messages.js +149 -0
  80. package/dist/ai/stream.d.ts +8 -0
  81. package/dist/ai/stream.d.ts.map +1 -0
  82. package/dist/ai/stream.js +34 -0
  83. package/dist/ai/types.d.ts +234 -0
  84. package/dist/ai/types.d.ts.map +1 -0
  85. package/dist/ai/types.js +1 -0
  86. package/dist/ai/utils/event-stream.d.ts +21 -0
  87. package/dist/ai/utils/event-stream.d.ts.map +1 -0
  88. package/dist/ai/utils/event-stream.js +76 -0
  89. package/dist/ai/utils/json-parse.d.ts +9 -0
  90. package/dist/ai/utils/json-parse.d.ts.map +1 -0
  91. package/dist/ai/utils/json-parse.js +28 -0
  92. package/dist/ai/utils/oauth/anthropic.d.ts +17 -0
  93. package/dist/ai/utils/oauth/anthropic.d.ts.map +1 -0
  94. package/dist/ai/utils/oauth/anthropic.js +103 -0
  95. package/dist/ai/utils/oauth/github-copilot.d.ts +30 -0
  96. package/dist/ai/utils/oauth/github-copilot.d.ts.map +1 -0
  97. package/dist/ai/utils/oauth/github-copilot.js +280 -0
  98. package/dist/ai/utils/oauth/google-antigravity.d.ts +26 -0
  99. package/dist/ai/utils/oauth/google-antigravity.d.ts.map +1 -0
  100. package/dist/ai/utils/oauth/google-antigravity.js +355 -0
  101. package/dist/ai/utils/oauth/google-gemini-cli.d.ts +26 -0
  102. package/dist/ai/utils/oauth/google-gemini-cli.d.ts.map +1 -0
  103. package/dist/ai/utils/oauth/google-gemini-cli.js +461 -0
  104. package/dist/ai/utils/oauth/index.d.ts +50 -0
  105. package/dist/ai/utils/oauth/index.d.ts.map +1 -0
  106. package/dist/ai/utils/oauth/index.js +106 -0
  107. package/dist/ai/utils/oauth/openai-codex.d.ts +34 -0
  108. package/dist/ai/utils/oauth/openai-codex.d.ts.map +1 -0
  109. package/dist/ai/utils/oauth/openai-codex.js +379 -0
  110. package/dist/ai/utils/oauth/pkce.d.ts +13 -0
  111. package/dist/ai/utils/oauth/pkce.d.ts.map +1 -0
  112. package/dist/ai/utils/oauth/pkce.js +30 -0
  113. package/dist/ai/utils/oauth/types.d.ts +47 -0
  114. package/dist/ai/utils/oauth/types.d.ts.map +1 -0
  115. package/dist/ai/utils/oauth/types.js +1 -0
  116. package/dist/ai/utils/overflow.d.ts +51 -0
  117. package/dist/ai/utils/overflow.d.ts.map +1 -0
  118. package/dist/ai/utils/overflow.js +111 -0
  119. package/dist/ai/utils/sanitize-unicode.d.ts +22 -0
  120. package/dist/ai/utils/sanitize-unicode.d.ts.map +1 -0
  121. package/dist/ai/utils/sanitize-unicode.js +25 -0
  122. package/dist/ai/utils/typebox-helpers.d.ts +17 -0
  123. package/dist/ai/utils/typebox-helpers.d.ts.map +1 -0
  124. package/dist/ai/utils/typebox-helpers.js +20 -0
  125. package/dist/ai/utils/validation.d.ts +18 -0
  126. package/dist/ai/utils/validation.d.ts.map +1 -0
  127. package/dist/ai/utils/validation.js +71 -0
  128. package/dist/ai.d.ts +2 -0
  129. package/dist/ai.d.ts.map +1 -0
  130. package/dist/ai.js +1 -0
  131. package/dist/index.d.ts +5 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +4 -0
  134. package/dist/tui/autocomplete.d.ts +47 -0
  135. package/dist/tui/autocomplete.d.ts.map +1 -0
  136. package/dist/tui/autocomplete.js +474 -0
  137. package/dist/tui/components/box.d.ts +24 -0
  138. package/dist/tui/components/box.d.ts.map +1 -0
  139. package/dist/tui/components/box.js +100 -0
  140. package/dist/tui/components/cancellable-loader.d.ts +22 -0
  141. package/dist/tui/components/cancellable-loader.d.ts.map +1 -0
  142. package/dist/tui/components/cancellable-loader.js +35 -0
  143. package/dist/tui/components/editor.d.ts +171 -0
  144. package/dist/tui/components/editor.d.ts.map +1 -0
  145. package/dist/tui/components/editor.js +1540 -0
  146. package/dist/tui/components/image.d.ts +28 -0
  147. package/dist/tui/components/image.d.ts.map +1 -0
  148. package/dist/tui/components/image.js +60 -0
  149. package/dist/tui/components/input.d.ts +25 -0
  150. package/dist/tui/components/input.d.ts.map +1 -0
  151. package/dist/tui/components/input.js +297 -0
  152. package/dist/tui/components/loader.d.ts +21 -0
  153. package/dist/tui/components/loader.d.ts.map +1 -0
  154. package/dist/tui/components/loader.js +45 -0
  155. package/dist/tui/components/markdown.d.ts +89 -0
  156. package/dist/tui/components/markdown.d.ts.map +1 -0
  157. package/dist/tui/components/markdown.js +525 -0
  158. package/dist/tui/components/select-list.d.ts +32 -0
  159. package/dist/tui/components/select-list.d.ts.map +1 -0
  160. package/dist/tui/components/select-list.js +147 -0
  161. package/dist/tui/components/settings-list.d.ts +50 -0
  162. package/dist/tui/components/settings-list.d.ts.map +1 -0
  163. package/dist/tui/components/settings-list.js +176 -0
  164. package/dist/tui/components/spacer.d.ts +12 -0
  165. package/dist/tui/components/spacer.d.ts.map +1 -0
  166. package/dist/tui/components/spacer.js +21 -0
  167. package/dist/tui/components/text.d.ts +19 -0
  168. package/dist/tui/components/text.d.ts.map +1 -0
  169. package/dist/tui/components/text.js +80 -0
  170. package/dist/tui/components/truncated-text.d.ts +13 -0
  171. package/dist/tui/components/truncated-text.d.ts.map +1 -0
  172. package/dist/tui/components/truncated-text.js +47 -0
  173. package/dist/tui/editor-component.d.ts +35 -0
  174. package/dist/tui/editor-component.d.ts.map +1 -0
  175. package/dist/tui/editor-component.js +1 -0
  176. package/dist/tui/fuzzy.d.ts +16 -0
  177. package/dist/tui/fuzzy.d.ts.map +1 -0
  178. package/dist/tui/fuzzy.js +106 -0
  179. package/dist/tui/index.d.ts +23 -0
  180. package/dist/tui/index.d.ts.map +1 -0
  181. package/dist/tui/index.js +31 -0
  182. package/dist/tui/keybindings.d.ts +39 -0
  183. package/dist/tui/keybindings.d.ts.map +1 -0
  184. package/dist/tui/keybindings.js +110 -0
  185. package/dist/tui/keys.d.ts +160 -0
  186. package/dist/tui/keys.d.ts.map +1 -0
  187. package/dist/tui/keys.js +939 -0
  188. package/dist/tui/stdin-buffer.d.ts +48 -0
  189. package/dist/tui/stdin-buffer.d.ts.map +1 -0
  190. package/dist/tui/stdin-buffer.js +315 -0
  191. package/dist/tui/terminal-image.d.ts +67 -0
  192. package/dist/tui/terminal-image.d.ts.map +1 -0
  193. package/dist/tui/terminal-image.js +277 -0
  194. package/dist/tui/terminal.d.ts +63 -0
  195. package/dist/tui/terminal.d.ts.map +1 -0
  196. package/dist/tui/terminal.js +174 -0
  197. package/dist/tui/tui.d.ts +191 -0
  198. package/dist/tui/tui.d.ts.map +1 -0
  199. package/dist/tui/tui.js +881 -0
  200. package/dist/tui/utils.d.ts +78 -0
  201. package/dist/tui/utils.d.ts.map +1 -0
  202. package/dist/tui/utils.js +801 -0
  203. package/dist/tui.d.ts +2 -0
  204. package/dist/tui.d.ts.map +1 -0
  205. package/dist/tui.js +1 -0
  206. package/dist/webui/ChatPanel.d.ts +28 -0
  207. package/dist/webui/ChatPanel.d.ts.map +1 -0
  208. package/dist/webui/ChatPanel.js +192 -0
  209. package/dist/webui/components/AgentInterface.d.ts +39 -0
  210. package/dist/webui/components/AgentInterface.d.ts.map +1 -0
  211. package/dist/webui/components/AgentInterface.js +370 -0
  212. package/dist/webui/components/AttachmentTile.d.ts +12 -0
  213. package/dist/webui/components/AttachmentTile.d.ts.map +1 -0
  214. package/dist/webui/components/AttachmentTile.js +110 -0
  215. package/dist/webui/components/ConsoleBlock.d.ts +12 -0
  216. package/dist/webui/components/ConsoleBlock.d.ts.map +1 -0
  217. package/dist/webui/components/ConsoleBlock.js +83 -0
  218. package/dist/webui/components/CustomProviderCard.d.ts +17 -0
  219. package/dist/webui/components/CustomProviderCard.d.ts.map +1 -0
  220. package/dist/webui/components/CustomProviderCard.js +109 -0
  221. package/dist/webui/components/ExpandableSection.d.ts +15 -0
  222. package/dist/webui/components/ExpandableSection.d.ts.map +1 -0
  223. package/dist/webui/components/ExpandableSection.js +62 -0
  224. package/dist/webui/components/Input.d.ts +26 -0
  225. package/dist/webui/components/Input.d.ts.map +1 -0
  226. package/dist/webui/components/Input.js +56 -0
  227. package/dist/webui/components/MessageEditor.d.ts +44 -0
  228. package/dist/webui/components/MessageEditor.d.ts.map +1 -0
  229. package/dist/webui/components/MessageEditor.js +413 -0
  230. package/dist/webui/components/MessageList.d.ts +14 -0
  231. package/dist/webui/components/MessageList.d.ts.map +1 -0
  232. package/dist/webui/components/MessageList.js +103 -0
  233. package/dist/webui/components/Messages.d.ts +94 -0
  234. package/dist/webui/components/Messages.d.ts.map +1 -0
  235. package/dist/webui/components/Messages.js +351 -0
  236. package/dist/webui/components/ProviderKeyInput.d.ts +16 -0
  237. package/dist/webui/components/ProviderKeyInput.d.ts.map +1 -0
  238. package/dist/webui/components/ProviderKeyInput.js +170 -0
  239. package/dist/webui/components/SandboxedIframe.d.ts +85 -0
  240. package/dist/webui/components/SandboxedIframe.d.ts.map +1 -0
  241. package/dist/webui/components/SandboxedIframe.js +510 -0
  242. package/dist/webui/components/StreamingMessageContainer.d.ts +19 -0
  243. package/dist/webui/components/StreamingMessageContainer.d.ts.map +1 -0
  244. package/dist/webui/components/StreamingMessageContainer.js +116 -0
  245. package/dist/webui/components/ThinkingBlock.d.ts +11 -0
  246. package/dist/webui/components/ThinkingBlock.d.ts.map +1 -0
  247. package/dist/webui/components/ThinkingBlock.js +57 -0
  248. package/dist/webui/components/message-renderer-registry.d.ts +12 -0
  249. package/dist/webui/components/message-renderer-registry.d.ts.map +1 -0
  250. package/dist/webui/components/message-renderer-registry.js +11 -0
  251. package/dist/webui/components/sandbox/ArtifactsRuntimeProvider.d.ts +35 -0
  252. package/dist/webui/components/sandbox/ArtifactsRuntimeProvider.d.ts.map +1 -0
  253. package/dist/webui/components/sandbox/ArtifactsRuntimeProvider.js +188 -0
  254. package/dist/webui/components/sandbox/AttachmentsRuntimeProvider.d.ts +17 -0
  255. package/dist/webui/components/sandbox/AttachmentsRuntimeProvider.d.ts.map +1 -0
  256. package/dist/webui/components/sandbox/AttachmentsRuntimeProvider.js +63 -0
  257. package/dist/webui/components/sandbox/ConsoleRuntimeProvider.d.ts +42 -0
  258. package/dist/webui/components/sandbox/ConsoleRuntimeProvider.d.ts.map +1 -0
  259. package/dist/webui/components/sandbox/ConsoleRuntimeProvider.js +160 -0
  260. package/dist/webui/components/sandbox/FileDownloadRuntimeProvider.d.ts +30 -0
  261. package/dist/webui/components/sandbox/FileDownloadRuntimeProvider.d.ts.map +1 -0
  262. package/dist/webui/components/sandbox/FileDownloadRuntimeProvider.js +96 -0
  263. package/dist/webui/components/sandbox/RuntimeMessageBridge.d.ts +19 -0
  264. package/dist/webui/components/sandbox/RuntimeMessageBridge.d.ts.map +1 -0
  265. package/dist/webui/components/sandbox/RuntimeMessageBridge.js +73 -0
  266. package/dist/webui/components/sandbox/RuntimeMessageRouter.d.ts +65 -0
  267. package/dist/webui/components/sandbox/RuntimeMessageRouter.d.ts.map +1 -0
  268. package/dist/webui/components/sandbox/RuntimeMessageRouter.js +167 -0
  269. package/dist/webui/components/sandbox/SandboxRuntimeProvider.d.ts +48 -0
  270. package/dist/webui/components/sandbox/SandboxRuntimeProvider.d.ts.map +1 -0
  271. package/dist/webui/components/sandbox/SandboxRuntimeProvider.js +1 -0
  272. package/dist/webui/dialogs/ApiKeyPromptDialog.d.ts +15 -0
  273. package/dist/webui/dialogs/ApiKeyPromptDialog.d.ts.map +1 -0
  274. package/dist/webui/dialogs/ApiKeyPromptDialog.js +78 -0
  275. package/dist/webui/dialogs/AttachmentOverlay.d.ts +32 -0
  276. package/dist/webui/dialogs/AttachmentOverlay.d.ts.map +1 -0
  277. package/dist/webui/dialogs/AttachmentOverlay.js +575 -0
  278. package/dist/webui/dialogs/CustomProviderDialog.d.ts +25 -0
  279. package/dist/webui/dialogs/CustomProviderDialog.d.ts.map +1 -0
  280. package/dist/webui/dialogs/CustomProviderDialog.js +269 -0
  281. package/dist/webui/dialogs/ModelSelector.d.ts +27 -0
  282. package/dist/webui/dialogs/ModelSelector.d.ts.map +1 -0
  283. package/dist/webui/dialogs/ModelSelector.js +319 -0
  284. package/dist/webui/dialogs/PersistentStorageDialog.d.ts +17 -0
  285. package/dist/webui/dialogs/PersistentStorageDialog.d.ts.map +1 -0
  286. package/dist/webui/dialogs/PersistentStorageDialog.js +146 -0
  287. package/dist/webui/dialogs/ProvidersModelsTab.d.ts +20 -0
  288. package/dist/webui/dialogs/ProvidersModelsTab.d.ts.map +1 -0
  289. package/dist/webui/dialogs/ProvidersModelsTab.js +190 -0
  290. package/dist/webui/dialogs/SessionListDialog.d.ts +19 -0
  291. package/dist/webui/dialogs/SessionListDialog.d.ts.map +1 -0
  292. package/dist/webui/dialogs/SessionListDialog.js +153 -0
  293. package/dist/webui/dialogs/SettingsDialog.d.ts +30 -0
  294. package/dist/webui/dialogs/SettingsDialog.d.ts.map +1 -0
  295. package/dist/webui/dialogs/SettingsDialog.js +228 -0
  296. package/dist/webui/index.d.ts +65 -0
  297. package/dist/webui/index.d.ts.map +1 -0
  298. package/dist/webui/index.js +67 -0
  299. package/dist/webui/prompts/prompts.d.ts +11 -0
  300. package/dist/webui/prompts/prompts.d.ts.map +1 -0
  301. package/dist/webui/prompts/prompts.js +271 -0
  302. package/dist/webui/storage/app-storage.d.ts +33 -0
  303. package/dist/webui/storage/app-storage.d.ts.map +1 -0
  304. package/dist/webui/storage/app-storage.js +37 -0
  305. package/dist/webui/storage/backends/indexeddb-storage-backend.d.ts +27 -0
  306. package/dist/webui/storage/backends/indexeddb-storage-backend.d.ts.map +1 -0
  307. package/dist/webui/storage/backends/indexeddb-storage-backend.js +165 -0
  308. package/dist/webui/storage/store.d.ts +23 -0
  309. package/dist/webui/storage/store.d.ts.map +1 -0
  310. package/dist/webui/storage/store.js +25 -0
  311. package/dist/webui/storage/stores/custom-providers-store.d.ts +25 -0
  312. package/dist/webui/storage/stores/custom-providers-store.d.ts.map +1 -0
  313. package/dist/webui/storage/stores/custom-providers-store.js +34 -0
  314. package/dist/webui/storage/stores/provider-keys-store.d.ts +14 -0
  315. package/dist/webui/storage/stores/provider-keys-store.d.ts.map +1 -0
  316. package/dist/webui/storage/stores/provider-keys-store.js +26 -0
  317. package/dist/webui/storage/stores/sessions-store.d.ts +32 -0
  318. package/dist/webui/storage/stores/sessions-store.d.ts.map +1 -0
  319. package/dist/webui/storage/stores/sessions-store.js +112 -0
  320. package/dist/webui/storage/stores/settings-store.d.ts +14 -0
  321. package/dist/webui/storage/stores/settings-store.d.ts.map +1 -0
  322. package/dist/webui/storage/stores/settings-store.js +27 -0
  323. package/dist/webui/storage/types.d.ts +176 -0
  324. package/dist/webui/storage/types.d.ts.map +1 -0
  325. package/dist/webui/storage/types.js +1 -0
  326. package/dist/webui/tools/artifacts/ArtifactElement.d.ts +9 -0
  327. package/dist/webui/tools/artifacts/ArtifactElement.d.ts.map +1 -0
  328. package/dist/webui/tools/artifacts/ArtifactElement.js +10 -0
  329. package/dist/webui/tools/artifacts/ArtifactPill.d.ts +4 -0
  330. package/dist/webui/tools/artifacts/ArtifactPill.d.ts.map +1 -0
  331. package/dist/webui/tools/artifacts/ArtifactPill.js +22 -0
  332. package/dist/webui/tools/artifacts/Console.d.ts +18 -0
  333. package/dist/webui/tools/artifacts/Console.d.ts.map +1 -0
  334. package/dist/webui/tools/artifacts/Console.js +94 -0
  335. package/dist/webui/tools/artifacts/DocxArtifact.d.ts +22 -0
  336. package/dist/webui/tools/artifacts/DocxArtifact.d.ts.map +1 -0
  337. package/dist/webui/tools/artifacts/DocxArtifact.js +207 -0
  338. package/dist/webui/tools/artifacts/ExcelArtifact.d.ts +24 -0
  339. package/dist/webui/tools/artifacts/ExcelArtifact.d.ts.map +1 -0
  340. package/dist/webui/tools/artifacts/ExcelArtifact.js +215 -0
  341. package/dist/webui/tools/artifacts/GenericArtifact.d.ts +19 -0
  342. package/dist/webui/tools/artifacts/GenericArtifact.d.ts.map +1 -0
  343. package/dist/webui/tools/artifacts/GenericArtifact.js +116 -0
  344. package/dist/webui/tools/artifacts/HtmlArtifact.d.ts +27 -0
  345. package/dist/webui/tools/artifacts/HtmlArtifact.d.ts.map +1 -0
  346. package/dist/webui/tools/artifacts/HtmlArtifact.js +188 -0
  347. package/dist/webui/tools/artifacts/ImageArtifact.d.ts +20 -0
  348. package/dist/webui/tools/artifacts/ImageArtifact.d.ts.map +1 -0
  349. package/dist/webui/tools/artifacts/ImageArtifact.js +119 -0
  350. package/dist/webui/tools/artifacts/MarkdownArtifact.d.ts +19 -0
  351. package/dist/webui/tools/artifacts/MarkdownArtifact.d.ts.map +1 -0
  352. package/dist/webui/tools/artifacts/MarkdownArtifact.js +81 -0
  353. package/dist/webui/tools/artifacts/PdfArtifact.d.ts +25 -0
  354. package/dist/webui/tools/artifacts/PdfArtifact.d.ts.map +1 -0
  355. package/dist/webui/tools/artifacts/PdfArtifact.js +183 -0
  356. package/dist/webui/tools/artifacts/SvgArtifact.d.ts +18 -0
  357. package/dist/webui/tools/artifacts/SvgArtifact.d.ts.map +1 -0
  358. package/dist/webui/tools/artifacts/SvgArtifact.js +77 -0
  359. package/dist/webui/tools/artifacts/TextArtifact.d.ts +19 -0
  360. package/dist/webui/tools/artifacts/TextArtifact.d.ts.map +1 -0
  361. package/dist/webui/tools/artifacts/TextArtifact.js +143 -0
  362. package/dist/webui/tools/artifacts/artifacts-tool-renderer.d.ts +11 -0
  363. package/dist/webui/tools/artifacts/artifacts-tool-renderer.d.ts.map +1 -0
  364. package/dist/webui/tools/artifacts/artifacts-tool-renderer.js +271 -0
  365. package/dist/webui/tools/artifacts/artifacts.d.ts +63 -0
  366. package/dist/webui/tools/artifacts/artifacts.d.ts.map +1 -0
  367. package/dist/webui/tools/artifacts/artifacts.js +658 -0
  368. package/dist/webui/tools/artifacts/index.d.ts +8 -0
  369. package/dist/webui/tools/artifacts/index.d.ts.map +1 -0
  370. package/dist/webui/tools/artifacts/index.js +7 -0
  371. package/dist/webui/tools/extract-document.d.ts +24 -0
  372. package/dist/webui/tools/extract-document.d.ts.map +1 -0
  373. package/dist/webui/tools/extract-document.js +215 -0
  374. package/dist/webui/tools/index.d.ts +16 -0
  375. package/dist/webui/tools/index.d.ts.map +1 -0
  376. package/dist/webui/tools/index.js +32 -0
  377. package/dist/webui/tools/javascript-repl.d.ts +44 -0
  378. package/dist/webui/tools/javascript-repl.d.ts.map +1 -0
  379. package/dist/webui/tools/javascript-repl.js +223 -0
  380. package/dist/webui/tools/renderer-registry.d.ts +23 -0
  381. package/dist/webui/tools/renderer-registry.d.ts.map +1 -0
  382. package/dist/webui/tools/renderer-registry.js +106 -0
  383. package/dist/webui/tools/renderers/BashRenderer.d.ts +10 -0
  384. package/dist/webui/tools/renderers/BashRenderer.d.ts.map +1 -0
  385. package/dist/webui/tools/renderers/BashRenderer.js +41 -0
  386. package/dist/webui/tools/renderers/CalculateRenderer.d.ts +10 -0
  387. package/dist/webui/tools/renderers/CalculateRenderer.d.ts.map +1 -0
  388. package/dist/webui/tools/renderers/CalculateRenderer.js +44 -0
  389. package/dist/webui/tools/renderers/DefaultRenderer.d.ts +6 -0
  390. package/dist/webui/tools/renderers/DefaultRenderer.d.ts.map +1 -0
  391. package/dist/webui/tools/renderers/DefaultRenderer.js +93 -0
  392. package/dist/webui/tools/renderers/GetCurrentTimeRenderer.d.ts +10 -0
  393. package/dist/webui/tools/renderers/GetCurrentTimeRenderer.d.ts.map +1 -0
  394. package/dist/webui/tools/renderers/GetCurrentTimeRenderer.js +71 -0
  395. package/dist/webui/tools/types.d.ts +10 -0
  396. package/dist/webui/tools/types.d.ts.map +1 -0
  397. package/dist/webui/tools/types.js +1 -0
  398. package/dist/webui/utils/attachment-utils.d.ts +19 -0
  399. package/dist/webui/utils/attachment-utils.d.ts.map +1 -0
  400. package/dist/webui/utils/attachment-utils.js +414 -0
  401. package/dist/webui/utils/auth-token.d.ts +3 -0
  402. package/dist/webui/utils/auth-token.d.ts.map +1 -0
  403. package/dist/webui/utils/auth-token.js +18 -0
  404. package/dist/webui/utils/format.d.ts +6 -0
  405. package/dist/webui/utils/format.d.ts.map +1 -0
  406. package/dist/webui/utils/format.js +46 -0
  407. package/dist/webui/utils/i18n.d.ts +636 -0
  408. package/dist/webui/utils/i18n.d.ts.map +1 -0
  409. package/dist/webui/utils/i18n.js +417 -0
  410. package/dist/webui/utils/model-discovery.d.ts +38 -0
  411. package/dist/webui/utils/model-discovery.d.ts.map +1 -0
  412. package/dist/webui/utils/model-discovery.js +242 -0
  413. package/dist/webui/utils/proxy-utils.d.ts +45 -0
  414. package/dist/webui/utils/proxy-utils.d.ts.map +1 -0
  415. package/dist/webui/utils/proxy-utils.js +115 -0
  416. package/dist/webui/utils/test-sessions.d.ts +359 -0
  417. package/dist/webui/utils/test-sessions.d.ts.map +1 -0
  418. package/dist/webui/utils/test-sessions.js +2324 -0
  419. package/dist/webui.d.ts +2 -0
  420. package/dist/webui.d.ts.map +1 -0
  421. package/dist/webui.js +1 -0
  422. package/package.json +105 -0
@@ -0,0 +1,379 @@
1
+ /**
2
+ * OpenAI Codex (ChatGPT OAuth) flow
3
+ *
4
+ * NOTE: This module uses Node.js crypto and http for the OAuth callback.
5
+ * It is only intended for CLI use, not browser environments.
6
+ */
7
+ // NEVER convert to top-level imports - breaks browser/Vite builds (web-ui)
8
+ let _randomBytes = null;
9
+ let _http = null;
10
+ if (typeof process !== "undefined" && (process.versions?.node || process.versions?.bun)) {
11
+ import("node:crypto").then((m) => {
12
+ _randomBytes = m.randomBytes;
13
+ });
14
+ import("node:http").then((m) => {
15
+ _http = m;
16
+ });
17
+ }
18
+ import { generatePKCE } from "./pkce.js";
19
+ const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
20
+ const AUTHORIZE_URL = "https://auth.openai.com/oauth/authorize";
21
+ const TOKEN_URL = "https://auth.openai.com/oauth/token";
22
+ const REDIRECT_URI = "http://localhost:1455/auth/callback";
23
+ const SCOPE = "openid profile email offline_access";
24
+ const JWT_CLAIM_PATH = "https://api.openai.com/auth";
25
+ const SUCCESS_HTML = `<!doctype html>
26
+ <html lang="en">
27
+ <head>
28
+ <meta charset="utf-8" />
29
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
30
+ <title>Authentication successful</title>
31
+ </head>
32
+ <body>
33
+ <p>Authentication successful. Return to your terminal to continue.</p>
34
+ </body>
35
+ </html>`;
36
+ function createState() {
37
+ if (!_randomBytes) {
38
+ throw new Error("OpenAI Codex OAuth is only available in Node.js environments");
39
+ }
40
+ return _randomBytes(16).toString("hex");
41
+ }
42
+ function parseAuthorizationInput(input) {
43
+ const value = input.trim();
44
+ if (!value)
45
+ return {};
46
+ try {
47
+ const url = new URL(value);
48
+ return {
49
+ code: url.searchParams.get("code") ?? undefined,
50
+ state: url.searchParams.get("state") ?? undefined,
51
+ };
52
+ }
53
+ catch {
54
+ // not a URL
55
+ }
56
+ if (value.includes("#")) {
57
+ const [code, state] = value.split("#", 2);
58
+ return { code, state };
59
+ }
60
+ if (value.includes("code=")) {
61
+ const params = new URLSearchParams(value);
62
+ return {
63
+ code: params.get("code") ?? undefined,
64
+ state: params.get("state") ?? undefined,
65
+ };
66
+ }
67
+ return { code: value };
68
+ }
69
+ function decodeJwt(token) {
70
+ try {
71
+ const parts = token.split(".");
72
+ if (parts.length !== 3)
73
+ return null;
74
+ const payload = parts[1] ?? "";
75
+ const decoded = atob(payload);
76
+ return JSON.parse(decoded);
77
+ }
78
+ catch {
79
+ return null;
80
+ }
81
+ }
82
+ async function exchangeAuthorizationCode(code, verifier, redirectUri = REDIRECT_URI) {
83
+ const response = await fetch(TOKEN_URL, {
84
+ method: "POST",
85
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
86
+ body: new URLSearchParams({
87
+ grant_type: "authorization_code",
88
+ client_id: CLIENT_ID,
89
+ code,
90
+ code_verifier: verifier,
91
+ redirect_uri: redirectUri,
92
+ }),
93
+ });
94
+ if (!response.ok) {
95
+ const text = await response.text().catch(() => "");
96
+ console.error("[openai-codex] code->token failed:", response.status, text);
97
+ return { type: "failed" };
98
+ }
99
+ const json = (await response.json());
100
+ if (!json.access_token || !json.refresh_token || typeof json.expires_in !== "number") {
101
+ console.error("[openai-codex] token response missing fields:", json);
102
+ return { type: "failed" };
103
+ }
104
+ return {
105
+ type: "success",
106
+ access: json.access_token,
107
+ refresh: json.refresh_token,
108
+ expires: Date.now() + json.expires_in * 1000,
109
+ };
110
+ }
111
+ async function refreshAccessToken(refreshToken) {
112
+ try {
113
+ const response = await fetch(TOKEN_URL, {
114
+ method: "POST",
115
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
116
+ body: new URLSearchParams({
117
+ grant_type: "refresh_token",
118
+ refresh_token: refreshToken,
119
+ client_id: CLIENT_ID,
120
+ }),
121
+ });
122
+ if (!response.ok) {
123
+ const text = await response.text().catch(() => "");
124
+ console.error("[openai-codex] Token refresh failed:", response.status, text);
125
+ return { type: "failed" };
126
+ }
127
+ const json = (await response.json());
128
+ if (!json.access_token || !json.refresh_token || typeof json.expires_in !== "number") {
129
+ console.error("[openai-codex] Token refresh response missing fields:", json);
130
+ return { type: "failed" };
131
+ }
132
+ return {
133
+ type: "success",
134
+ access: json.access_token,
135
+ refresh: json.refresh_token,
136
+ expires: Date.now() + json.expires_in * 1000,
137
+ };
138
+ }
139
+ catch (error) {
140
+ console.error("[openai-codex] Token refresh error:", error);
141
+ return { type: "failed" };
142
+ }
143
+ }
144
+ async function createAuthorizationFlow(originator = "pi") {
145
+ const { verifier, challenge } = await generatePKCE();
146
+ const state = createState();
147
+ const url = new URL(AUTHORIZE_URL);
148
+ url.searchParams.set("response_type", "code");
149
+ url.searchParams.set("client_id", CLIENT_ID);
150
+ url.searchParams.set("redirect_uri", REDIRECT_URI);
151
+ url.searchParams.set("scope", SCOPE);
152
+ url.searchParams.set("code_challenge", challenge);
153
+ url.searchParams.set("code_challenge_method", "S256");
154
+ url.searchParams.set("state", state);
155
+ url.searchParams.set("id_token_add_organizations", "true");
156
+ url.searchParams.set("codex_cli_simplified_flow", "true");
157
+ url.searchParams.set("originator", originator);
158
+ return { verifier, state, url: url.toString() };
159
+ }
160
+ function startLocalOAuthServer(state) {
161
+ if (!_http) {
162
+ throw new Error("OpenAI Codex OAuth is only available in Node.js environments");
163
+ }
164
+ let lastCode = null;
165
+ let cancelled = false;
166
+ const server = _http.createServer((req, res) => {
167
+ try {
168
+ const url = new URL(req.url || "", "http://localhost");
169
+ if (url.pathname !== "/auth/callback") {
170
+ res.statusCode = 404;
171
+ res.end("Not found");
172
+ return;
173
+ }
174
+ if (url.searchParams.get("state") !== state) {
175
+ res.statusCode = 400;
176
+ res.end("State mismatch");
177
+ return;
178
+ }
179
+ const code = url.searchParams.get("code");
180
+ if (!code) {
181
+ res.statusCode = 400;
182
+ res.end("Missing authorization code");
183
+ return;
184
+ }
185
+ res.statusCode = 200;
186
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
187
+ res.end(SUCCESS_HTML);
188
+ lastCode = code;
189
+ }
190
+ catch {
191
+ res.statusCode = 500;
192
+ res.end("Internal error");
193
+ }
194
+ });
195
+ return new Promise((resolve) => {
196
+ server
197
+ .listen(1455, "127.0.0.1", () => {
198
+ resolve({
199
+ close: () => server.close(),
200
+ cancelWait: () => {
201
+ cancelled = true;
202
+ },
203
+ waitForCode: async () => {
204
+ const sleep = () => new Promise((r) => setTimeout(r, 100));
205
+ for (let i = 0; i < 600; i += 1) {
206
+ if (lastCode)
207
+ return { code: lastCode };
208
+ if (cancelled)
209
+ return null;
210
+ await sleep();
211
+ }
212
+ return null;
213
+ },
214
+ });
215
+ })
216
+ .on("error", (err) => {
217
+ console.error("[openai-codex] Failed to bind http://127.0.0.1:1455 (", err.code, ") Falling back to manual paste.");
218
+ resolve({
219
+ close: () => {
220
+ try {
221
+ server.close();
222
+ }
223
+ catch {
224
+ // ignore
225
+ }
226
+ },
227
+ cancelWait: () => { },
228
+ waitForCode: async () => null,
229
+ });
230
+ });
231
+ });
232
+ }
233
+ function getAccountId(accessToken) {
234
+ const payload = decodeJwt(accessToken);
235
+ const auth = payload?.[JWT_CLAIM_PATH];
236
+ const accountId = auth?.chatgpt_account_id;
237
+ return typeof accountId === "string" && accountId.length > 0 ? accountId : null;
238
+ }
239
+ /**
240
+ * Login with OpenAI Codex OAuth
241
+ *
242
+ * @param options.onAuth - Called with URL and instructions when auth starts
243
+ * @param options.onPrompt - Called to prompt user for manual code paste (fallback if no onManualCodeInput)
244
+ * @param options.onProgress - Optional progress messages
245
+ * @param options.onManualCodeInput - Optional promise that resolves with user-pasted code.
246
+ * Races with browser callback - whichever completes first wins.
247
+ * Useful for showing paste input immediately alongside browser flow.
248
+ * @param options.originator - OAuth originator parameter (defaults to "pi")
249
+ */
250
+ export async function loginOpenAICodex(options) {
251
+ const { verifier, state, url } = await createAuthorizationFlow(options.originator);
252
+ const server = await startLocalOAuthServer(state);
253
+ options.onAuth({ url, instructions: "A browser window should open. Complete login to finish." });
254
+ let code;
255
+ try {
256
+ if (options.onManualCodeInput) {
257
+ // Race between browser callback and manual input
258
+ let manualCode;
259
+ let manualError;
260
+ const manualPromise = options
261
+ .onManualCodeInput()
262
+ .then((input) => {
263
+ manualCode = input;
264
+ server.cancelWait();
265
+ })
266
+ .catch((err) => {
267
+ manualError = err instanceof Error ? err : new Error(String(err));
268
+ server.cancelWait();
269
+ });
270
+ const result = await server.waitForCode();
271
+ // If manual input was cancelled, throw that error
272
+ if (manualError) {
273
+ throw manualError;
274
+ }
275
+ if (result?.code) {
276
+ // Browser callback won
277
+ code = result.code;
278
+ }
279
+ else if (manualCode) {
280
+ // Manual input won (or callback timed out and user had entered code)
281
+ const parsed = parseAuthorizationInput(manualCode);
282
+ if (parsed.state && parsed.state !== state) {
283
+ throw new Error("State mismatch");
284
+ }
285
+ code = parsed.code;
286
+ }
287
+ // If still no code, wait for manual promise to complete and try that
288
+ if (!code) {
289
+ await manualPromise;
290
+ if (manualError) {
291
+ throw manualError;
292
+ }
293
+ if (manualCode) {
294
+ const parsed = parseAuthorizationInput(manualCode);
295
+ if (parsed.state && parsed.state !== state) {
296
+ throw new Error("State mismatch");
297
+ }
298
+ code = parsed.code;
299
+ }
300
+ }
301
+ }
302
+ else {
303
+ // Original flow: wait for callback, then prompt if needed
304
+ const result = await server.waitForCode();
305
+ if (result?.code) {
306
+ code = result.code;
307
+ }
308
+ }
309
+ // Fallback to onPrompt if still no code
310
+ if (!code) {
311
+ const input = await options.onPrompt({
312
+ message: "Paste the authorization code (or full redirect URL):",
313
+ });
314
+ const parsed = parseAuthorizationInput(input);
315
+ if (parsed.state && parsed.state !== state) {
316
+ throw new Error("State mismatch");
317
+ }
318
+ code = parsed.code;
319
+ }
320
+ if (!code) {
321
+ throw new Error("Missing authorization code");
322
+ }
323
+ const tokenResult = await exchangeAuthorizationCode(code, verifier);
324
+ if (tokenResult.type !== "success") {
325
+ throw new Error("Token exchange failed");
326
+ }
327
+ const accountId = getAccountId(tokenResult.access);
328
+ if (!accountId) {
329
+ throw new Error("Failed to extract accountId from token");
330
+ }
331
+ return {
332
+ access: tokenResult.access,
333
+ refresh: tokenResult.refresh,
334
+ expires: tokenResult.expires,
335
+ accountId,
336
+ };
337
+ }
338
+ finally {
339
+ server.close();
340
+ }
341
+ }
342
+ /**
343
+ * Refresh OpenAI Codex OAuth token
344
+ */
345
+ export async function refreshOpenAICodexToken(refreshToken) {
346
+ const result = await refreshAccessToken(refreshToken);
347
+ if (result.type !== "success") {
348
+ throw new Error("Failed to refresh OpenAI Codex token");
349
+ }
350
+ const accountId = getAccountId(result.access);
351
+ if (!accountId) {
352
+ throw new Error("Failed to extract accountId from token");
353
+ }
354
+ return {
355
+ access: result.access,
356
+ refresh: result.refresh,
357
+ expires: result.expires,
358
+ accountId,
359
+ };
360
+ }
361
+ export const openaiCodexOAuthProvider = {
362
+ id: "openai-codex",
363
+ name: "ChatGPT Plus/Pro (Codex Subscription)",
364
+ usesCallbackServer: true,
365
+ async login(callbacks) {
366
+ return loginOpenAICodex({
367
+ onAuth: callbacks.onAuth,
368
+ onPrompt: callbacks.onPrompt,
369
+ onProgress: callbacks.onProgress,
370
+ onManualCodeInput: callbacks.onManualCodeInput,
371
+ });
372
+ },
373
+ async refreshToken(credentials) {
374
+ return refreshOpenAICodexToken(credentials.refresh);
375
+ },
376
+ getApiKey(credentials) {
377
+ return credentials.access;
378
+ },
379
+ };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * PKCE utilities using Web Crypto API.
3
+ * Works in both Node.js 20+ and browsers.
4
+ */
5
+ /**
6
+ * Generate PKCE code verifier and challenge.
7
+ * Uses Web Crypto API for cross-platform compatibility.
8
+ */
9
+ export declare function generatePKCE(): Promise<{
10
+ verifier: string;
11
+ challenge: string;
12
+ }>;
13
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../../../src/ai/utils/oauth/pkce.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAarF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * PKCE utilities using Web Crypto API.
3
+ * Works in both Node.js 20+ and browsers.
4
+ */
5
+ /**
6
+ * Encode bytes as base64url string.
7
+ */
8
+ function base64urlEncode(bytes) {
9
+ let binary = "";
10
+ for (const byte of bytes) {
11
+ binary += String.fromCharCode(byte);
12
+ }
13
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
14
+ }
15
+ /**
16
+ * Generate PKCE code verifier and challenge.
17
+ * Uses Web Crypto API for cross-platform compatibility.
18
+ */
19
+ export async function generatePKCE() {
20
+ // Generate random verifier
21
+ const verifierBytes = new Uint8Array(32);
22
+ crypto.getRandomValues(verifierBytes);
23
+ const verifier = base64urlEncode(verifierBytes);
24
+ // Compute SHA-256 challenge
25
+ const encoder = new TextEncoder();
26
+ const data = encoder.encode(verifier);
27
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
28
+ const challenge = base64urlEncode(new Uint8Array(hashBuffer));
29
+ return { verifier, challenge };
30
+ }
@@ -0,0 +1,47 @@
1
+ import type { Api, Model } from "../../types.js";
2
+ export type OAuthCredentials = {
3
+ refresh: string;
4
+ access: string;
5
+ expires: number;
6
+ [key: string]: unknown;
7
+ };
8
+ export type OAuthProviderId = string;
9
+ /** @deprecated Use OAuthProviderId instead */
10
+ export type OAuthProvider = OAuthProviderId;
11
+ export type OAuthPrompt = {
12
+ message: string;
13
+ placeholder?: string;
14
+ allowEmpty?: boolean;
15
+ };
16
+ export type OAuthAuthInfo = {
17
+ url: string;
18
+ instructions?: string;
19
+ };
20
+ export interface OAuthLoginCallbacks {
21
+ onAuth: (info: OAuthAuthInfo) => void;
22
+ onPrompt: (prompt: OAuthPrompt) => Promise<string>;
23
+ onProgress?: (message: string) => void;
24
+ onManualCodeInput?: () => Promise<string>;
25
+ signal?: AbortSignal;
26
+ }
27
+ export interface OAuthProviderInterface {
28
+ readonly id: OAuthProviderId;
29
+ readonly name: string;
30
+ /** Run the login flow, return credentials to persist */
31
+ login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;
32
+ /** Whether login uses a local callback server and supports manual code input. */
33
+ usesCallbackServer?: boolean;
34
+ /** Refresh expired credentials, return updated credentials to persist */
35
+ refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials>;
36
+ /** Convert credentials to API key string for the provider */
37
+ getApiKey(credentials: OAuthCredentials): string;
38
+ /** Optional: modify models for this provider (e.g., update baseUrl) */
39
+ modifyModels?(models: Model<Api>[], credentials: OAuthCredentials): Model<Api>[];
40
+ }
41
+ /** @deprecated Use OAuthProviderInterface instead */
42
+ export interface OAuthProviderInfo {
43
+ id: OAuthProviderId;
44
+ name: string;
45
+ available: boolean;
46
+ }
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/ai/utils/oauth/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,8CAA8C;AAC9C,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wDAAwD;IACxD,KAAK,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEjE,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,yEAAyE;IACzE,YAAY,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEvE,6DAA6D;IAC7D,SAAS,CAAC,WAAW,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAEjD,uEAAuE;IACvE,YAAY,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;CACjF;AAED,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,eAAe,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACnB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,51 @@
1
+ import type { AssistantMessage } from "../types.js";
2
+ /**
3
+ * Check if an assistant message represents a context overflow error.
4
+ *
5
+ * This handles two cases:
6
+ * 1. Error-based overflow: Most providers return stopReason "error" with a
7
+ * specific error message pattern.
8
+ * 2. Silent overflow: Some providers accept overflow requests and return
9
+ * successfully. For these, we check if usage.input exceeds the context window.
10
+ *
11
+ * ## Reliability by Provider
12
+ *
13
+ * **Reliable detection (returns error with detectable message):**
14
+ * - Anthropic: "prompt is too long: X tokens > Y maximum"
15
+ * - OpenAI (Completions & Responses): "exceeds the context window"
16
+ * - Google Gemini: "input token count exceeds the maximum"
17
+ * - xAI (Grok): "maximum prompt length is X but request contains Y"
18
+ * - Groq: "reduce the length of the messages"
19
+ * - Cerebras: 400/413/429 status code (no body)
20
+ * - Mistral: 400/413/429 status code (no body)
21
+ * - OpenRouter (all backends): "maximum context length is X tokens"
22
+ * - llama.cpp: "exceeds the available context size"
23
+ * - LM Studio: "greater than the context length"
24
+ *
25
+ * **Unreliable detection:**
26
+ * - z.ai: Sometimes accepts overflow silently (detectable via usage.input > contextWindow),
27
+ * sometimes returns rate limit errors. Pass contextWindow param to detect silent overflow.
28
+ * - Ollama: Silently truncates input without error. Cannot be detected via this function.
29
+ * The response will have usage.input < expected, but we don't know the expected value.
30
+ *
31
+ * ## Custom Providers
32
+ *
33
+ * If you've added custom models via settings.json, this function may not detect
34
+ * overflow errors from those providers. To add support:
35
+ *
36
+ * 1. Send a request that exceeds the model's context window
37
+ * 2. Check the errorMessage in the response
38
+ * 3. Create a regex pattern that matches the error
39
+ * 4. The pattern should be added to OVERFLOW_PATTERNS in this file, or
40
+ * check the errorMessage yourself before calling this function
41
+ *
42
+ * @param message - The assistant message to check
43
+ * @param contextWindow - Optional context window size for detecting silent overflow (z.ai)
44
+ * @returns true if the message indicates a context overflow
45
+ */
46
+ export declare function isContextOverflow(message: AssistantMessage, contextWindow?: number): boolean;
47
+ /**
48
+ * Get the overflow patterns for testing purposes.
49
+ */
50
+ export declare function getOverflowPatterns(): RegExp[];
51
+ //# sourceMappingURL=overflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overflow.d.ts","sourceRoot":"","sources":["../../../src/ai/utils/overflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA0CpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAwB5F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Regex patterns to detect context overflow errors from different providers.
3
+ *
4
+ * These patterns match error messages returned when the input exceeds
5
+ * the model's context window.
6
+ *
7
+ * Provider-specific patterns (with example error messages):
8
+ *
9
+ * - Anthropic: "prompt is too long: 213462 tokens > 200000 maximum"
10
+ * - OpenAI: "Your input exceeds the context window of this model"
11
+ * - Google: "The input token count (1196265) exceeds the maximum number of tokens allowed (1048575)"
12
+ * - xAI: "This model's maximum prompt length is 131072 but the request contains 537812 tokens"
13
+ * - Groq: "Please reduce the length of the messages or completion"
14
+ * - OpenRouter: "This endpoint's maximum context length is X tokens. However, you requested about Y tokens"
15
+ * - llama.cpp: "the request exceeds the available context size, try increasing it"
16
+ * - LM Studio: "tokens to keep from the initial prompt is greater than the context length"
17
+ * - GitHub Copilot: "prompt token count of X exceeds the limit of Y"
18
+ * - MiniMax: "invalid params, context window exceeds limit"
19
+ * - Cerebras: Returns "400 status code (no body)" - handled separately below
20
+ * - Mistral: Returns "400 status code (no body)" - handled separately below
21
+ * - z.ai: Does NOT error, accepts overflow silently - handled via usage.input > contextWindow
22
+ * - Ollama: Silently truncates input - not detectable via error message
23
+ */
24
+ const OVERFLOW_PATTERNS = [
25
+ /prompt is too long/i, // Anthropic
26
+ /input is too long for requested model/i, // Amazon Bedrock
27
+ /exceeds the context window/i, // OpenAI (Completions & Responses API)
28
+ /input token count.*exceeds the maximum/i, // Google (Gemini)
29
+ /maximum prompt length is \d+/i, // xAI (Grok)
30
+ /reduce the length of the messages/i, // Groq
31
+ /maximum context length is \d+ tokens/i, // OpenRouter (all backends)
32
+ /exceeds the limit of \d+/i, // GitHub Copilot
33
+ /exceeds the available context size/i, // llama.cpp server
34
+ /greater than the context length/i, // LM Studio
35
+ /context window exceeds limit/i, // MiniMax
36
+ /context[_ ]length[_ ]exceeded/i, // Generic fallback
37
+ /too many tokens/i, // Generic fallback
38
+ /token limit exceeded/i, // Generic fallback
39
+ ];
40
+ /**
41
+ * Check if an assistant message represents a context overflow error.
42
+ *
43
+ * This handles two cases:
44
+ * 1. Error-based overflow: Most providers return stopReason "error" with a
45
+ * specific error message pattern.
46
+ * 2. Silent overflow: Some providers accept overflow requests and return
47
+ * successfully. For these, we check if usage.input exceeds the context window.
48
+ *
49
+ * ## Reliability by Provider
50
+ *
51
+ * **Reliable detection (returns error with detectable message):**
52
+ * - Anthropic: "prompt is too long: X tokens > Y maximum"
53
+ * - OpenAI (Completions & Responses): "exceeds the context window"
54
+ * - Google Gemini: "input token count exceeds the maximum"
55
+ * - xAI (Grok): "maximum prompt length is X but request contains Y"
56
+ * - Groq: "reduce the length of the messages"
57
+ * - Cerebras: 400/413/429 status code (no body)
58
+ * - Mistral: 400/413/429 status code (no body)
59
+ * - OpenRouter (all backends): "maximum context length is X tokens"
60
+ * - llama.cpp: "exceeds the available context size"
61
+ * - LM Studio: "greater than the context length"
62
+ *
63
+ * **Unreliable detection:**
64
+ * - z.ai: Sometimes accepts overflow silently (detectable via usage.input > contextWindow),
65
+ * sometimes returns rate limit errors. Pass contextWindow param to detect silent overflow.
66
+ * - Ollama: Silently truncates input without error. Cannot be detected via this function.
67
+ * The response will have usage.input < expected, but we don't know the expected value.
68
+ *
69
+ * ## Custom Providers
70
+ *
71
+ * If you've added custom models via settings.json, this function may not detect
72
+ * overflow errors from those providers. To add support:
73
+ *
74
+ * 1. Send a request that exceeds the model's context window
75
+ * 2. Check the errorMessage in the response
76
+ * 3. Create a regex pattern that matches the error
77
+ * 4. The pattern should be added to OVERFLOW_PATTERNS in this file, or
78
+ * check the errorMessage yourself before calling this function
79
+ *
80
+ * @param message - The assistant message to check
81
+ * @param contextWindow - Optional context window size for detecting silent overflow (z.ai)
82
+ * @returns true if the message indicates a context overflow
83
+ */
84
+ export function isContextOverflow(message, contextWindow) {
85
+ // Case 1: Check error message patterns
86
+ if (message.stopReason === "error" && message.errorMessage) {
87
+ // Check known patterns
88
+ if (OVERFLOW_PATTERNS.some((p) => p.test(message.errorMessage))) {
89
+ return true;
90
+ }
91
+ // Cerebras and Mistral return 400/413/429 with no body - check for status code pattern
92
+ // 429 can indicate token-based rate limiting which correlates with context overflow
93
+ if (/^4(00|13|29)\s*(status code)?\s*\(no body\)/i.test(message.errorMessage)) {
94
+ return true;
95
+ }
96
+ }
97
+ // Case 2: Silent overflow (z.ai style) - successful but usage exceeds context
98
+ if (contextWindow && message.stopReason === "stop") {
99
+ const inputTokens = message.usage.input + message.usage.cacheRead;
100
+ if (inputTokens > contextWindow) {
101
+ return true;
102
+ }
103
+ }
104
+ return false;
105
+ }
106
+ /**
107
+ * Get the overflow patterns for testing purposes.
108
+ */
109
+ export function getOverflowPatterns() {
110
+ return [...OVERFLOW_PATTERNS];
111
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Removes unpaired Unicode surrogate characters from a string.
3
+ *
4
+ * Unpaired surrogates (high surrogates 0xD800-0xDBFF without matching low surrogates 0xDC00-0xDFFF,
5
+ * or vice versa) cause JSON serialization errors in many API providers.
6
+ *
7
+ * Valid emoji and other characters outside the Basic Multilingual Plane use properly paired
8
+ * surrogates and will NOT be affected by this function.
9
+ *
10
+ * @param text - The text to sanitize
11
+ * @returns The sanitized text with unpaired surrogates removed
12
+ *
13
+ * @example
14
+ * // Valid emoji (properly paired surrogates) are preserved
15
+ * sanitizeSurrogates("Hello 🙈 World") // => "Hello 🙈 World"
16
+ *
17
+ * // Unpaired high surrogate is removed
18
+ * const unpaired = String.fromCharCode(0xD83D); // high surrogate without low
19
+ * sanitizeSurrogates(`Text ${unpaired} here`) // => "Text here"
20
+ */
21
+ export declare function sanitizeSurrogates(text: string): string;
22
+ //# sourceMappingURL=sanitize-unicode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-unicode.d.ts","sourceRoot":"","sources":["../../../src/ai/utils/sanitize-unicode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIvD"}