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,24 @@
1
+ import type { AgentTool } from "../../agent/index.js";
2
+ import { type Static } from "@sinclair/typebox";
3
+ import type { ToolRenderer } from "./types.js";
4
+ declare const extractDocumentSchema: import("@sinclair/typebox").TObject<{
5
+ url: import("@sinclair/typebox").TString;
6
+ }>;
7
+ export type ExtractDocumentParams = Static<typeof extractDocumentSchema>;
8
+ export interface ExtractDocumentResult {
9
+ extractedText: string;
10
+ format: string;
11
+ fileName: string;
12
+ size: number;
13
+ }
14
+ export declare function createExtractDocumentTool(): AgentTool<typeof extractDocumentSchema, ExtractDocumentResult> & {
15
+ corsProxyUrl?: string;
16
+ };
17
+ export declare const extractDocumentTool: AgentTool<import("@sinclair/typebox").TObject<{
18
+ url: import("@sinclair/typebox").TString;
19
+ }>, ExtractDocumentResult> & {
20
+ corsProxyUrl?: string;
21
+ };
22
+ export declare const extractDocumentRenderer: ToolRenderer<ExtractDocumentParams, ExtractDocumentResult>;
23
+ export {};
24
+ //# sourceMappingURL=extract-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-document.d.ts","sourceRoot":"","sources":["../../../src/webui/tools/extract-document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAQtD,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;AAMjE,QAAA,MAAM,qBAAqB;;EAIzB,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb;AAMD,wBAAgB,yBAAyB,IAAI,SAAS,CAAC,OAAO,qBAAqB,EAAE,qBAAqB,CAAC,GAAG;IAC7G,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,CA+IA;AAGD,eAAO,MAAM,mBAAmB;;;mBAnJhB,MAAM;CAmJwC,CAAC;AAM/D,eAAO,MAAM,uBAAuB,EAAE,YAAY,CAAC,qBAAqB,EAAE,qBAAqB,CAkF9F,CAAC"}
@@ -0,0 +1,215 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { html } from "lit";
3
+ import { createRef, ref } from "lit/directives/ref.js";
4
+ import { FileText } from "lucide";
5
+ import { EXTRACT_DOCUMENT_DESCRIPTION } from "../prompts/prompts.js";
6
+ import { loadAttachment } from "../utils/attachment-utils.js";
7
+ import { isCorsError } from "../utils/proxy-utils.js";
8
+ import { registerToolRenderer, renderCollapsibleHeader, renderHeader } from "./renderer-registry.js";
9
+ // ============================================================================
10
+ // TYPES
11
+ // ============================================================================
12
+ const extractDocumentSchema = Type.Object({
13
+ url: Type.String({
14
+ description: "URL of the document to extract text from (PDF, DOCX, XLSX, or PPTX)",
15
+ }),
16
+ });
17
+ // ============================================================================
18
+ // TOOL
19
+ // ============================================================================
20
+ export function createExtractDocumentTool() {
21
+ const tool = {
22
+ label: "Extract Document",
23
+ name: "extract_document",
24
+ corsProxyUrl: undefined, // Can be set by consumer (e.g., from user settings)
25
+ description: EXTRACT_DOCUMENT_DESCRIPTION,
26
+ parameters: extractDocumentSchema,
27
+ execute: async (_toolCallId, args, signal) => {
28
+ if (signal?.aborted) {
29
+ throw new Error("Extract document aborted");
30
+ }
31
+ const url = args.url.trim();
32
+ if (!url) {
33
+ throw new Error("URL is required");
34
+ }
35
+ // Validate URL format
36
+ try {
37
+ new URL(url);
38
+ }
39
+ catch {
40
+ throw new Error(`Invalid URL: ${url}`);
41
+ }
42
+ // Size limit: 50MB
43
+ const MAX_SIZE = 50 * 1024 * 1024;
44
+ // Helper function to fetch and process document
45
+ const fetchAndProcess = async (fetchUrl) => {
46
+ const response = await fetch(fetchUrl, { signal });
47
+ if (!response.ok) {
48
+ throw new Error(`TELL USER: Unable to download the document (${response.status} ${response.statusText}). The site likely blocks automated downloads.\n\n` +
49
+ `INSTRUCT USER: Please download the file manually and attach it to your message using the attachment button (paperclip icon) in the message input area. I can then extract the text from the attached file.`);
50
+ }
51
+ // Check size before downloading
52
+ const contentLength = response.headers.get("content-length");
53
+ if (contentLength) {
54
+ const size = Number.parseInt(contentLength, 10);
55
+ if (size > MAX_SIZE) {
56
+ throw new Error(`Document is too large (${(size / 1024 / 1024).toFixed(1)}MB). Maximum supported size is 50MB.`);
57
+ }
58
+ }
59
+ // Download the document
60
+ const arrayBuffer = await response.arrayBuffer();
61
+ const size = arrayBuffer.byteLength;
62
+ if (size > MAX_SIZE) {
63
+ throw new Error(`Document is too large (${(size / 1024 / 1024).toFixed(1)}MB). Maximum supported size is 50MB.`);
64
+ }
65
+ return arrayBuffer;
66
+ };
67
+ // Try without proxy first, fallback to proxy on CORS error
68
+ let arrayBuffer;
69
+ try {
70
+ // Attempt direct fetch first
71
+ arrayBuffer = await fetchAndProcess(url);
72
+ }
73
+ catch (directError) {
74
+ // If CORS error and proxy is available, retry with proxy
75
+ if (isCorsError(directError) && tool.corsProxyUrl) {
76
+ try {
77
+ const proxiedUrl = tool.corsProxyUrl + encodeURIComponent(url);
78
+ arrayBuffer = await fetchAndProcess(proxiedUrl);
79
+ }
80
+ catch (proxyError) {
81
+ // Proxy fetch also failed - throw helpful message
82
+ throw new Error(`TELL USER: Unable to fetch the document due to CORS restrictions.\n\n` +
83
+ `Tried with proxy but it also failed: ${proxyError.message}\n\n` +
84
+ `INSTRUCT USER: Please download the file manually and attach it to your message using the attachment button (paperclip icon) in the message input area. I can then extract the text from the attached file.`);
85
+ }
86
+ }
87
+ else if (isCorsError(directError) && !tool.corsProxyUrl) {
88
+ // CORS error but no proxy configured
89
+ throw new Error(`TELL USER: Unable to fetch the document due to CORS restrictions (the server blocks requests from browser extensions).\n\n` +
90
+ `To fix this, you need to configure a CORS proxy in Sitegeist settings:\n` +
91
+ `1. Open Sitegeist settings\n` +
92
+ `2. Find "CORS Proxy URL" setting\n` +
93
+ `3. Enter a proxy URL like: https://corsproxy.io/?\n` +
94
+ `4. Save and try again\n\n` +
95
+ `Alternatively, download the file manually and attach it to your message using the attachment button (paperclip icon).`);
96
+ }
97
+ else {
98
+ // Not a CORS error - re-throw
99
+ throw directError;
100
+ }
101
+ }
102
+ // Extract filename from URL
103
+ const urlParts = url.split("/");
104
+ let fileName = urlParts[urlParts.length - 1]?.split("?")[0] || "document";
105
+ if (url.startsWith("https://arxiv.org/")) {
106
+ fileName = `${fileName}.pdf`;
107
+ }
108
+ // Use loadAttachment to process the document
109
+ const attachment = await loadAttachment(arrayBuffer, fileName);
110
+ if (!attachment.extractedText) {
111
+ throw new Error(`Document format not supported. Supported formats:\n` +
112
+ `- PDF (.pdf)\n` +
113
+ `- Word (.docx)\n` +
114
+ `- Excel (.xlsx, .xls)\n` +
115
+ `- PowerPoint (.pptx)`);
116
+ }
117
+ // Determine format from attachment
118
+ let format = "unknown";
119
+ if (attachment.mimeType.includes("pdf")) {
120
+ format = "pdf";
121
+ }
122
+ else if (attachment.mimeType.includes("wordprocessingml")) {
123
+ format = "docx";
124
+ }
125
+ else if (attachment.mimeType.includes("spreadsheetml") || attachment.mimeType.includes("ms-excel")) {
126
+ format = "xlsx";
127
+ }
128
+ else if (attachment.mimeType.includes("presentationml")) {
129
+ format = "pptx";
130
+ }
131
+ return {
132
+ content: [{ type: "text", text: attachment.extractedText }],
133
+ details: {
134
+ extractedText: attachment.extractedText,
135
+ format,
136
+ fileName: attachment.fileName,
137
+ size: attachment.size,
138
+ },
139
+ };
140
+ },
141
+ };
142
+ return tool;
143
+ }
144
+ // Export a default instance
145
+ export const extractDocumentTool = createExtractDocumentTool();
146
+ // ============================================================================
147
+ // RENDERER
148
+ // ============================================================================
149
+ export const extractDocumentRenderer = {
150
+ render(params, result, isStreaming) {
151
+ // Determine status
152
+ const state = result ? (result.isError ? "error" : "complete") : isStreaming ? "inprogress" : "complete";
153
+ // Create refs for collapsible sections
154
+ const contentRef = createRef();
155
+ const chevronRef = createRef();
156
+ // With result: show params + result
157
+ if (result && params) {
158
+ const details = result.details;
159
+ const title = details
160
+ ? result.isError
161
+ ? `Failed to extract ${details.fileName || "document"}`
162
+ : `Extracted text from ${details.fileName} (${details.format.toUpperCase()}, ${(details.size / 1024).toFixed(1)}KB)`
163
+ : result.isError
164
+ ? "Failed to extract document"
165
+ : "Extracted text from document";
166
+ const output = result.content
167
+ ?.filter((c) => c.type === "text")
168
+ .map((c) => c.text)
169
+ .join("\n") || "";
170
+ return {
171
+ content: html `
172
+ <div>
173
+ ${renderCollapsibleHeader(state, FileText, title, contentRef, chevronRef, false)}
174
+ <div ${ref(contentRef)} class="max-h-0 overflow-hidden transition-all duration-300 space-y-3">
175
+ ${params.url
176
+ ? html `<div class="text-sm text-gray-600 dark:text-gray-400">
177
+ <strong>URL:</strong> ${params.url}
178
+ </div>`
179
+ : ""}
180
+ ${output && !result.isError
181
+ ? html `<code-block .code=${output} language="plaintext"></code-block>`
182
+ : ""}
183
+ ${result.isError && output
184
+ ? html `<console-block .content=${output} .variant=${"error"}></console-block>`
185
+ : ""}
186
+ </div>
187
+ </div>
188
+ `,
189
+ isCustom: false,
190
+ };
191
+ }
192
+ // Just params (streaming or waiting for result)
193
+ if (params) {
194
+ const title = "Extracting document...";
195
+ return {
196
+ content: html `
197
+ <div>
198
+ ${renderCollapsibleHeader(state, FileText, title, contentRef, chevronRef, false)}
199
+ <div ${ref(contentRef)} class="max-h-0 overflow-hidden transition-all duration-300">
200
+ <div class="text-sm text-gray-600 dark:text-gray-400"><strong>URL:</strong> ${params.url}</div>
201
+ </div>
202
+ </div>
203
+ `,
204
+ isCustom: false,
205
+ };
206
+ }
207
+ // No params or result yet
208
+ return {
209
+ content: renderHeader(state, FileText, "Preparing extraction..."),
210
+ isCustom: false,
211
+ };
212
+ },
213
+ };
214
+ // Auto-register the renderer
215
+ registerToolRenderer("extract_document", extractDocumentRenderer);
@@ -0,0 +1,16 @@
1
+ import type { ToolResultMessage } from "../../ai/index.js";
2
+ import "./javascript-repl.js";
3
+ import "./extract-document.js";
4
+ import { getToolRenderer, registerToolRenderer } from "./renderer-registry.js";
5
+ import type { ToolRenderResult } from "./types.js";
6
+ /**
7
+ * Enable or disable show JSON mode
8
+ * When enabled, all tool renderers will use the default JSON renderer
9
+ */
10
+ export declare function setShowJsonMode(enabled: boolean): void;
11
+ /**
12
+ * Render tool - unified function that handles params, result, and streaming state
13
+ */
14
+ export declare function renderTool(toolName: string, params: any | undefined, result: ToolResultMessage | undefined, isStreaming?: boolean): ToolRenderResult;
15
+ export { getToolRenderer, registerToolRenderer };
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/webui/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,sBAAsB,CAAC;AAC9B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAUnD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,GAAG,GAAG,SAAS,EACvB,MAAM,EAAE,iBAAiB,GAAG,SAAS,EACrC,WAAW,CAAC,EAAE,OAAO,GACnB,gBAAgB,CAWlB;AAED,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ import "./javascript-repl.js"; // Auto-registers the renderer
2
+ import "./extract-document.js"; // Auto-registers the renderer
3
+ import { getToolRenderer, registerToolRenderer } from "./renderer-registry.js";
4
+ import { BashRenderer } from "./renderers/BashRenderer.js";
5
+ import { DefaultRenderer } from "./renderers/DefaultRenderer.js";
6
+ // Register all built-in tool renderers
7
+ registerToolRenderer("bash", new BashRenderer());
8
+ const defaultRenderer = new DefaultRenderer();
9
+ // Global flag to force default JSON rendering for all tools
10
+ let showJsonMode = false;
11
+ /**
12
+ * Enable or disable show JSON mode
13
+ * When enabled, all tool renderers will use the default JSON renderer
14
+ */
15
+ export function setShowJsonMode(enabled) {
16
+ showJsonMode = enabled;
17
+ }
18
+ /**
19
+ * Render tool - unified function that handles params, result, and streaming state
20
+ */
21
+ export function renderTool(toolName, params, result, isStreaming) {
22
+ // If showJsonMode is enabled, always use the default renderer
23
+ if (showJsonMode) {
24
+ return defaultRenderer.render(params, result, isStreaming);
25
+ }
26
+ const renderer = getToolRenderer(toolName);
27
+ if (renderer) {
28
+ return renderer.render(params, result, isStreaming);
29
+ }
30
+ return defaultRenderer.render(params, result, isStreaming);
31
+ }
32
+ export { getToolRenderer, registerToolRenderer };
@@ -0,0 +1,44 @@
1
+ import type { AgentTool } from "../../agent/index.js";
2
+ import { type Static } from "@sinclair/typebox";
3
+ import { type SandboxFile } from "../components/SandboxedIframe.js";
4
+ import type { SandboxRuntimeProvider } from "../components/sandbox/SandboxRuntimeProvider.js";
5
+ import type { ToolRenderer } from "./types.js";
6
+ export declare function executeJavaScript(code: string, runtimeProviders: SandboxRuntimeProvider[], signal?: AbortSignal, sandboxUrlProvider?: () => string): Promise<{
7
+ output: string;
8
+ files?: SandboxFile[];
9
+ }>;
10
+ export type JavaScriptReplToolResult = {
11
+ files?: {
12
+ fileName: string;
13
+ contentBase64: string;
14
+ mimeType: string;
15
+ }[] | undefined;
16
+ };
17
+ declare const javascriptReplSchema: import("@sinclair/typebox").TObject<{
18
+ title: import("@sinclair/typebox").TString;
19
+ code: import("@sinclair/typebox").TString;
20
+ }>;
21
+ export type JavaScriptReplParams = Static<typeof javascriptReplSchema>;
22
+ interface JavaScriptReplResult {
23
+ output?: string;
24
+ files?: Array<{
25
+ fileName: string;
26
+ mimeType: string;
27
+ size: number;
28
+ contentBase64: string;
29
+ }>;
30
+ }
31
+ export declare function createJavaScriptReplTool(): AgentTool<typeof javascriptReplSchema, JavaScriptReplToolResult> & {
32
+ runtimeProvidersFactory?: () => SandboxRuntimeProvider[];
33
+ sandboxUrlProvider?: () => string;
34
+ };
35
+ export declare const javascriptReplTool: AgentTool<import("@sinclair/typebox").TObject<{
36
+ title: import("@sinclair/typebox").TString;
37
+ code: import("@sinclair/typebox").TString;
38
+ }>, JavaScriptReplToolResult> & {
39
+ runtimeProvidersFactory?: () => SandboxRuntimeProvider[];
40
+ sandboxUrlProvider?: () => string;
41
+ };
42
+ export declare const javascriptReplRenderer: ToolRenderer<JavaScriptReplParams, JavaScriptReplResult>;
43
+ export {};
44
+ //# sourceMappingURL=javascript-repl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-repl.d.ts","sourceRoot":"","sources":["../../../src/webui/tools/javascript-repl.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAItD,OAAO,EAAE,KAAK,WAAW,EAAqC,MAAM,kCAAkC,CAAC;AACvG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AAI9F,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;AAGjE,wBAAsB,iBAAiB,CACtC,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,sBAAsB,EAAE,EAC1C,MAAM,CAAC,EAAE,WAAW,EACpB,kBAAkB,CAAC,EAAE,MAAM,MAAM,GAC/B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CA2EpD;AAED,MAAM,MAAM,wBAAwB,GAAG;IACtC,KAAK,CAAC,EACH;QACA,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAChB,EAAE,GACH,SAAS,CAAC;CACb,CAAC;AAEF,QAAA,MAAM,oBAAoB;;;EAMxB,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,UAAU,oBAAoB;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACH;AAED,wBAAgB,wBAAwB,IAAI,SAAS,CAAC,OAAO,oBAAoB,EAAE,wBAAwB,CAAC,GAAG;IAC9G,uBAAuB,CAAC,EAAE,MAAM,sBAAsB,EAAE,CAAC;IACzD,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC;CAClC,CAgEA;AAGD,eAAO,MAAM,kBAAkB;;;;8BArEJ,MAAM,sBAAsB,EAAE;yBACnC,MAAM,MAAM;CAoE0B,CAAC;AAE7D,eAAO,MAAM,sBAAsB,EAAE,YAAY,CAAC,oBAAoB,EAAE,oBAAoB,CA0F3F,CAAC"}
@@ -0,0 +1,223 @@
1
+ import { i18n } from "@mariozechner/mini-lit";
2
+ import { Type } from "@sinclair/typebox";
3
+ import { html } from "lit";
4
+ import { createRef, ref } from "lit/directives/ref.js";
5
+ import { Code } from "lucide";
6
+ import { SandboxIframe } from "../components/SandboxedIframe.js";
7
+ import { JAVASCRIPT_REPL_TOOL_DESCRIPTION } from "../prompts/prompts.js";
8
+ import { registerToolRenderer, renderCollapsibleHeader, renderHeader } from "./renderer-registry.js";
9
+ // Execute JavaScript code with attachments using SandboxedIframe
10
+ export async function executeJavaScript(code, runtimeProviders, signal, sandboxUrlProvider) {
11
+ if (!code) {
12
+ throw new Error("Code parameter is required");
13
+ }
14
+ // Check for abort before starting
15
+ if (signal?.aborted) {
16
+ throw new Error("Execution aborted");
17
+ }
18
+ // Create a SandboxedIframe instance for execution
19
+ const sandbox = new SandboxIframe();
20
+ if (sandboxUrlProvider) {
21
+ sandbox.sandboxUrlProvider = sandboxUrlProvider;
22
+ }
23
+ sandbox.style.display = "none";
24
+ document.body.appendChild(sandbox);
25
+ try {
26
+ const sandboxId = `repl-${Date.now()}-${Math.random().toString(36).substring(7)}`;
27
+ // Pass providers to execute (router handles all message routing)
28
+ // No additional consumers needed - execute() has its own internal consumer
29
+ const result = await sandbox.execute(sandboxId, code, runtimeProviders, [], signal);
30
+ // Remove the sandbox iframe after execution
31
+ sandbox.remove();
32
+ // Build plain text response
33
+ let output = "";
34
+ // Add console output - result.console contains { type: string, text: string } from sandbox.js
35
+ if (result.console && result.console.length > 0) {
36
+ for (const entry of result.console) {
37
+ output += `${entry.text}\n`;
38
+ }
39
+ }
40
+ // Add error if execution failed
41
+ if (!result.success) {
42
+ if (output)
43
+ output += "\n";
44
+ output += `Error: ${result.error?.message || "Unknown error"}\n${result.error?.stack || ""}`;
45
+ // Throw error so tool call is marked as failed
46
+ throw new Error(output.trim());
47
+ }
48
+ // Add return value if present
49
+ if (result.returnValue !== undefined) {
50
+ if (output)
51
+ output += "\n";
52
+ output += `=> ${typeof result.returnValue === "object" ? JSON.stringify(result.returnValue, null, 2) : result.returnValue}`;
53
+ }
54
+ // Add file notifications
55
+ if (result.files && result.files.length > 0) {
56
+ output += `\n[Files returned: ${result.files.length}]\n`;
57
+ for (const file of result.files) {
58
+ output += ` - ${file.fileName} (${file.mimeType})\n`;
59
+ }
60
+ }
61
+ else {
62
+ // Explicitly note when no files were returned (helpful for debugging)
63
+ if (code.includes("returnFile")) {
64
+ output += "\n[No files returned - check async operations]";
65
+ }
66
+ }
67
+ return {
68
+ output: output.trim() || "Code executed successfully (no output)",
69
+ files: result.files,
70
+ };
71
+ }
72
+ catch (error) {
73
+ // Clean up on error
74
+ sandbox.remove();
75
+ throw new Error(error.message || "Execution failed");
76
+ }
77
+ }
78
+ const javascriptReplSchema = Type.Object({
79
+ title: Type.String({
80
+ description: "Brief title describing what the code snippet tries to achieve in active form, e.g. 'Calculating sum'",
81
+ }),
82
+ code: Type.String({ description: "JavaScript code to execute" }),
83
+ });
84
+ export function createJavaScriptReplTool() {
85
+ return {
86
+ label: "JavaScript REPL",
87
+ name: "javascript_repl",
88
+ runtimeProvidersFactory: () => [], // default to empty array
89
+ sandboxUrlProvider: undefined, // optional, for browser extensions
90
+ get description() {
91
+ const runtimeProviderDescriptions = this.runtimeProvidersFactory?.()
92
+ .map((d) => d.getDescription())
93
+ .filter((d) => d.trim().length > 0) || [];
94
+ return JAVASCRIPT_REPL_TOOL_DESCRIPTION(runtimeProviderDescriptions);
95
+ },
96
+ parameters: javascriptReplSchema,
97
+ execute: async function (_toolCallId, args, signal) {
98
+ const result = await executeJavaScript(args.code, this.runtimeProvidersFactory?.() ?? [], signal, this.sandboxUrlProvider);
99
+ // Convert files to JSON-serializable with base64 payloads
100
+ const files = (result.files || []).map((f) => {
101
+ const toBase64 = (input) => {
102
+ if (input instanceof Uint8Array) {
103
+ let binary = "";
104
+ const chunk = 0x8000;
105
+ for (let i = 0; i < input.length; i += chunk) {
106
+ binary += String.fromCharCode(...input.subarray(i, i + chunk));
107
+ }
108
+ return { base64: btoa(binary), size: input.length };
109
+ }
110
+ else if (typeof input === "string") {
111
+ const enc = new TextEncoder();
112
+ const bytes = enc.encode(input);
113
+ let binary = "";
114
+ const chunk = 0x8000;
115
+ for (let i = 0; i < bytes.length; i += chunk) {
116
+ binary += String.fromCharCode(...bytes.subarray(i, i + chunk));
117
+ }
118
+ return { base64: btoa(binary), size: bytes.length };
119
+ }
120
+ else {
121
+ const s = String(input);
122
+ const enc = new TextEncoder();
123
+ const bytes = enc.encode(s);
124
+ let binary = "";
125
+ const chunk = 0x8000;
126
+ for (let i = 0; i < bytes.length; i += chunk) {
127
+ binary += String.fromCharCode(...bytes.subarray(i, i + chunk));
128
+ }
129
+ return { base64: btoa(binary), size: bytes.length };
130
+ }
131
+ };
132
+ const { base64, size } = toBase64(f.content);
133
+ return {
134
+ fileName: f.fileName || "file",
135
+ mimeType: f.mimeType || "application/octet-stream",
136
+ size,
137
+ contentBase64: base64,
138
+ };
139
+ });
140
+ return { content: [{ type: "text", text: result.output }], details: { files } };
141
+ },
142
+ };
143
+ }
144
+ // Export a default instance for backward compatibility
145
+ export const javascriptReplTool = createJavaScriptReplTool();
146
+ export const javascriptReplRenderer = {
147
+ render(params, result, isStreaming) {
148
+ // Determine status
149
+ const state = result ? (result.isError ? "error" : "complete") : isStreaming ? "inprogress" : "complete";
150
+ // Create refs for collapsible code section
151
+ const codeContentRef = createRef();
152
+ const codeChevronRef = createRef();
153
+ // With result: show params + result
154
+ if (result && params) {
155
+ const output = result.content
156
+ ?.filter((c) => c.type === "text")
157
+ .map((c) => c.text)
158
+ .join("\n") || "";
159
+ const files = result.details?.files || [];
160
+ const attachments = files.map((f, i) => {
161
+ // Decode base64 content for text files to show in overlay
162
+ let extractedText;
163
+ const isTextBased = f.mimeType?.startsWith("text/") ||
164
+ f.mimeType === "application/json" ||
165
+ f.mimeType === "application/javascript" ||
166
+ f.mimeType?.includes("xml");
167
+ if (isTextBased && f.contentBase64) {
168
+ try {
169
+ extractedText = atob(f.contentBase64);
170
+ }
171
+ catch (_e) {
172
+ console.warn("Failed to decode base64 content for", f.fileName);
173
+ }
174
+ }
175
+ return {
176
+ id: `repl-${Date.now()}-${i}`,
177
+ type: f.mimeType?.startsWith("image/") ? "image" : "document",
178
+ fileName: f.fileName || `file-${i}`,
179
+ mimeType: f.mimeType || "application/octet-stream",
180
+ size: f.size ?? 0,
181
+ content: f.contentBase64,
182
+ preview: f.mimeType?.startsWith("image/") ? f.contentBase64 : undefined,
183
+ extractedText,
184
+ };
185
+ });
186
+ return {
187
+ content: html `
188
+ <div>
189
+ ${renderCollapsibleHeader(state, Code, params.title ? params.title : i18n("Executing JavaScript"), codeContentRef, codeChevronRef, false)}
190
+ <div ${ref(codeContentRef)} class="max-h-0 overflow-hidden transition-all duration-300 space-y-3">
191
+ <code-block .code=${params.code || ""} language="javascript"></code-block>
192
+ ${output ? html `<console-block .content=${output} .variant=${result.isError ? "error" : "default"}></console-block>` : ""}
193
+ </div>
194
+ ${attachments.length
195
+ ? html `<div class="flex flex-wrap gap-2 mt-3">
196
+ ${attachments.map((att) => html `<attachment-tile .attachment=${att}></attachment-tile>`)}
197
+ </div>`
198
+ : ""}
199
+ </div>
200
+ `,
201
+ isCustom: false,
202
+ };
203
+ }
204
+ // Just params (streaming or waiting for result)
205
+ if (params) {
206
+ return {
207
+ content: html `
208
+ <div>
209
+ ${renderCollapsibleHeader(state, Code, params.title ? params.title : i18n("Executing JavaScript"), codeContentRef, codeChevronRef, false)}
210
+ <div ${ref(codeContentRef)} class="max-h-0 overflow-hidden transition-all duration-300">
211
+ ${params.code ? html `<code-block .code=${params.code} language="javascript"></code-block>` : ""}
212
+ </div>
213
+ </div>
214
+ `,
215
+ isCustom: false,
216
+ };
217
+ }
218
+ // No params or result yet
219
+ return { content: renderHeader(state, Code, i18n("Preparing JavaScript...")), isCustom: false };
220
+ },
221
+ };
222
+ // Auto-register the renderer
223
+ registerToolRenderer(javascriptReplTool.name, javascriptReplRenderer);
@@ -0,0 +1,23 @@
1
+ import { type TemplateResult } from "lit";
2
+ import type { Ref } from "lit/directives/ref.js";
3
+ import type { ToolRenderer } from "./types.js";
4
+ export declare const toolRenderers: Map<string, ToolRenderer<any, any>>;
5
+ /**
6
+ * Register a custom tool renderer
7
+ */
8
+ export declare function registerToolRenderer(toolName: string, renderer: ToolRenderer): void;
9
+ /**
10
+ * Get a tool renderer by name
11
+ */
12
+ export declare function getToolRenderer(toolName: string): ToolRenderer | undefined;
13
+ /**
14
+ * Helper to render a header for tool renderers
15
+ * Shows icon on left when complete/error, spinner on right when in progress
16
+ */
17
+ export declare function renderHeader(state: "inprogress" | "complete" | "error", toolIcon: any, text: string | TemplateResult): TemplateResult;
18
+ /**
19
+ * Helper to render a collapsible header for tool renderers
20
+ * Same as renderHeader but with a chevron button that toggles visibility of content
21
+ */
22
+ export declare function renderCollapsibleHeader(state: "inprogress" | "complete" | "error", toolIcon: any, text: string | TemplateResult, contentRef: Ref<HTMLElement>, chevronRef: Ref<HTMLElement>, defaultExpanded?: boolean): TemplateResult;
23
+ //# sourceMappingURL=renderer-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-registry.d.ts","sourceRoot":"","sources":["../../../src/webui/tools/renderer-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,eAAO,MAAM,aAAa,qCAAkC,CAAC;AAE7D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAEnF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE1E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC3B,KAAK,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,EAC1C,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,MAAM,GAAG,cAAc,GAC3B,cAAc,CA8BhB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,EAC1C,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,MAAM,GAAG,cAAc,EAC7B,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC,EAC5B,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC,EAC5B,eAAe,UAAQ,GACrB,cAAc,CAsDhB"}