@draht/web-ui 2026.3.2-2

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 (372) hide show
  1. package/CHANGELOG.md +276 -0
  2. package/README.md +601 -0
  3. package/dist/ChatPanel.d.ts +28 -0
  4. package/dist/ChatPanel.d.ts.map +1 -0
  5. package/dist/ChatPanel.js +193 -0
  6. package/dist/ChatPanel.js.map +1 -0
  7. package/dist/app.css +2 -0
  8. package/dist/components/AgentInterface.d.ts +39 -0
  9. package/dist/components/AgentInterface.d.ts.map +1 -0
  10. package/dist/components/AgentInterface.js +384 -0
  11. package/dist/components/AgentInterface.js.map +1 -0
  12. package/dist/components/AttachmentTile.d.ts +12 -0
  13. package/dist/components/AttachmentTile.d.ts.map +1 -0
  14. package/dist/components/AttachmentTile.js +110 -0
  15. package/dist/components/AttachmentTile.js.map +1 -0
  16. package/dist/components/ConsoleBlock.d.ts +12 -0
  17. package/dist/components/ConsoleBlock.d.ts.map +1 -0
  18. package/dist/components/ConsoleBlock.js +81 -0
  19. package/dist/components/ConsoleBlock.js.map +1 -0
  20. package/dist/components/CustomProviderCard.d.ts +17 -0
  21. package/dist/components/CustomProviderCard.d.ts.map +1 -0
  22. package/dist/components/CustomProviderCard.js +112 -0
  23. package/dist/components/CustomProviderCard.js.map +1 -0
  24. package/dist/components/ExpandableSection.d.ts +15 -0
  25. package/dist/components/ExpandableSection.d.ts.map +1 -0
  26. package/dist/components/ExpandableSection.js +61 -0
  27. package/dist/components/ExpandableSection.js.map +1 -0
  28. package/dist/components/Input.d.ts +26 -0
  29. package/dist/components/Input.d.ts.map +1 -0
  30. package/dist/components/Input.js +57 -0
  31. package/dist/components/Input.js.map +1 -0
  32. package/dist/components/MessageEditor.d.ts +44 -0
  33. package/dist/components/MessageEditor.d.ts.map +1 -0
  34. package/dist/components/MessageEditor.js +418 -0
  35. package/dist/components/MessageEditor.js.map +1 -0
  36. package/dist/components/MessageList.d.ts +14 -0
  37. package/dist/components/MessageList.d.ts.map +1 -0
  38. package/dist/components/MessageList.js +104 -0
  39. package/dist/components/MessageList.js.map +1 -0
  40. package/dist/components/Messages.d.ts +95 -0
  41. package/dist/components/Messages.d.ts.map +1 -0
  42. package/dist/components/Messages.js +363 -0
  43. package/dist/components/Messages.js.map +1 -0
  44. package/dist/components/ProviderKeyInput.d.ts +16 -0
  45. package/dist/components/ProviderKeyInput.d.ts.map +1 -0
  46. package/dist/components/ProviderKeyInput.js +168 -0
  47. package/dist/components/ProviderKeyInput.js.map +1 -0
  48. package/dist/components/SandboxedIframe.d.ts +85 -0
  49. package/dist/components/SandboxedIframe.d.ts.map +1 -0
  50. package/dist/components/SandboxedIframe.js +518 -0
  51. package/dist/components/SandboxedIframe.js.map +1 -0
  52. package/dist/components/StreamingMessageContainer.d.ts +19 -0
  53. package/dist/components/StreamingMessageContainer.d.ts.map +1 -0
  54. package/dist/components/StreamingMessageContainer.js +117 -0
  55. package/dist/components/StreamingMessageContainer.js.map +1 -0
  56. package/dist/components/ThinkingBlock.d.ts +11 -0
  57. package/dist/components/ThinkingBlock.d.ts.map +1 -0
  58. package/dist/components/ThinkingBlock.js +56 -0
  59. package/dist/components/ThinkingBlock.js.map +1 -0
  60. package/dist/components/message-renderer-registry.d.ts +12 -0
  61. package/dist/components/message-renderer-registry.d.ts.map +1 -0
  62. package/dist/components/message-renderer-registry.js +12 -0
  63. package/dist/components/message-renderer-registry.js.map +1 -0
  64. package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts +35 -0
  65. package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts.map +1 -0
  66. package/dist/components/sandbox/ArtifactsRuntimeProvider.js +192 -0
  67. package/dist/components/sandbox/ArtifactsRuntimeProvider.js.map +1 -0
  68. package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts +17 -0
  69. package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts.map +1 -0
  70. package/dist/components/sandbox/AttachmentsRuntimeProvider.js +65 -0
  71. package/dist/components/sandbox/AttachmentsRuntimeProvider.js.map +1 -0
  72. package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts +42 -0
  73. package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts.map +1 -0
  74. package/dist/components/sandbox/ConsoleRuntimeProvider.js +159 -0
  75. package/dist/components/sandbox/ConsoleRuntimeProvider.js.map +1 -0
  76. package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts +30 -0
  77. package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts.map +1 -0
  78. package/dist/components/sandbox/FileDownloadRuntimeProvider.js +95 -0
  79. package/dist/components/sandbox/FileDownloadRuntimeProvider.js.map +1 -0
  80. package/dist/components/sandbox/RuntimeMessageBridge.d.ts +19 -0
  81. package/dist/components/sandbox/RuntimeMessageBridge.d.ts.map +1 -0
  82. package/dist/components/sandbox/RuntimeMessageBridge.js +74 -0
  83. package/dist/components/sandbox/RuntimeMessageBridge.js.map +1 -0
  84. package/dist/components/sandbox/RuntimeMessageRouter.d.ts +65 -0
  85. package/dist/components/sandbox/RuntimeMessageRouter.d.ts.map +1 -0
  86. package/dist/components/sandbox/RuntimeMessageRouter.js +166 -0
  87. package/dist/components/sandbox/RuntimeMessageRouter.js.map +1 -0
  88. package/dist/components/sandbox/SandboxRuntimeProvider.d.ts +48 -0
  89. package/dist/components/sandbox/SandboxRuntimeProvider.d.ts.map +1 -0
  90. package/dist/components/sandbox/SandboxRuntimeProvider.js +2 -0
  91. package/dist/components/sandbox/SandboxRuntimeProvider.js.map +1 -0
  92. package/dist/dialogs/ApiKeyPromptDialog.d.ts +15 -0
  93. package/dist/dialogs/ApiKeyPromptDialog.d.ts.map +1 -0
  94. package/dist/dialogs/ApiKeyPromptDialog.js +77 -0
  95. package/dist/dialogs/ApiKeyPromptDialog.js.map +1 -0
  96. package/dist/dialogs/AttachmentOverlay.d.ts +32 -0
  97. package/dist/dialogs/AttachmentOverlay.d.ts.map +1 -0
  98. package/dist/dialogs/AttachmentOverlay.js +576 -0
  99. package/dist/dialogs/AttachmentOverlay.js.map +1 -0
  100. package/dist/dialogs/CustomProviderDialog.d.ts +25 -0
  101. package/dist/dialogs/CustomProviderDialog.d.ts.map +1 -0
  102. package/dist/dialogs/CustomProviderDialog.js +270 -0
  103. package/dist/dialogs/CustomProviderDialog.js.map +1 -0
  104. package/dist/dialogs/ModelSelector.d.ts +27 -0
  105. package/dist/dialogs/ModelSelector.d.ts.map +1 -0
  106. package/dist/dialogs/ModelSelector.js +320 -0
  107. package/dist/dialogs/ModelSelector.js.map +1 -0
  108. package/dist/dialogs/PersistentStorageDialog.d.ts +17 -0
  109. package/dist/dialogs/PersistentStorageDialog.d.ts.map +1 -0
  110. package/dist/dialogs/PersistentStorageDialog.js +144 -0
  111. package/dist/dialogs/PersistentStorageDialog.js.map +1 -0
  112. package/dist/dialogs/ProvidersModelsTab.d.ts +20 -0
  113. package/dist/dialogs/ProvidersModelsTab.d.ts.map +1 -0
  114. package/dist/dialogs/ProvidersModelsTab.js +188 -0
  115. package/dist/dialogs/ProvidersModelsTab.js.map +1 -0
  116. package/dist/dialogs/SessionListDialog.d.ts +19 -0
  117. package/dist/dialogs/SessionListDialog.d.ts.map +1 -0
  118. package/dist/dialogs/SessionListDialog.js +152 -0
  119. package/dist/dialogs/SessionListDialog.js.map +1 -0
  120. package/dist/dialogs/SettingsDialog.d.ts +30 -0
  121. package/dist/dialogs/SettingsDialog.d.ts.map +1 -0
  122. package/dist/dialogs/SettingsDialog.js +222 -0
  123. package/dist/dialogs/SettingsDialog.js.map +1 -0
  124. package/dist/index.d.ts +67 -0
  125. package/dist/index.d.ts.map +1 -0
  126. package/dist/index.js +70 -0
  127. package/dist/index.js.map +1 -0
  128. package/dist/prompts/prompts.d.ts +11 -0
  129. package/dist/prompts/prompts.d.ts.map +1 -0
  130. package/dist/prompts/prompts.js +272 -0
  131. package/dist/prompts/prompts.js.map +1 -0
  132. package/dist/storage/app-storage.d.ts +33 -0
  133. package/dist/storage/app-storage.d.ts.map +1 -0
  134. package/dist/storage/app-storage.js +43 -0
  135. package/dist/storage/app-storage.js.map +1 -0
  136. package/dist/storage/backends/indexeddb-storage-backend.d.ts +27 -0
  137. package/dist/storage/backends/indexeddb-storage-backend.d.ts.map +1 -0
  138. package/dist/storage/backends/indexeddb-storage-backend.js +167 -0
  139. package/dist/storage/backends/indexeddb-storage-backend.js.map +1 -0
  140. package/dist/storage/store.d.ts +23 -0
  141. package/dist/storage/store.d.ts.map +1 -0
  142. package/dist/storage/store.js +24 -0
  143. package/dist/storage/store.js.map +1 -0
  144. package/dist/storage/stores/custom-providers-store.d.ts +25 -0
  145. package/dist/storage/stores/custom-providers-store.d.ts.map +1 -0
  146. package/dist/storage/stores/custom-providers-store.js +35 -0
  147. package/dist/storage/stores/custom-providers-store.js.map +1 -0
  148. package/dist/storage/stores/provider-keys-store.d.ts +14 -0
  149. package/dist/storage/stores/provider-keys-store.d.ts.map +1 -0
  150. package/dist/storage/stores/provider-keys-store.js +27 -0
  151. package/dist/storage/stores/provider-keys-store.js.map +1 -0
  152. package/dist/storage/stores/sessions-store.d.ts +32 -0
  153. package/dist/storage/stores/sessions-store.d.ts.map +1 -0
  154. package/dist/storage/stores/sessions-store.js +113 -0
  155. package/dist/storage/stores/sessions-store.js.map +1 -0
  156. package/dist/storage/stores/settings-store.d.ts +14 -0
  157. package/dist/storage/stores/settings-store.d.ts.map +1 -0
  158. package/dist/storage/stores/settings-store.js +28 -0
  159. package/dist/storage/stores/settings-store.js.map +1 -0
  160. package/dist/storage/types.d.ts +176 -0
  161. package/dist/storage/types.d.ts.map +1 -0
  162. package/dist/storage/types.js +2 -0
  163. package/dist/storage/types.js.map +1 -0
  164. package/dist/tools/artifacts/ArtifactElement.d.ts +9 -0
  165. package/dist/tools/artifacts/ArtifactElement.d.ts.map +1 -0
  166. package/dist/tools/artifacts/ArtifactElement.js +8 -0
  167. package/dist/tools/artifacts/ArtifactElement.js.map +1 -0
  168. package/dist/tools/artifacts/ArtifactPill.d.ts +4 -0
  169. package/dist/tools/artifacts/ArtifactPill.d.ts.map +1 -0
  170. package/dist/tools/artifacts/ArtifactPill.js +23 -0
  171. package/dist/tools/artifacts/ArtifactPill.js.map +1 -0
  172. package/dist/tools/artifacts/Console.d.ts +18 -0
  173. package/dist/tools/artifacts/Console.d.ts.map +1 -0
  174. package/dist/tools/artifacts/Console.js +92 -0
  175. package/dist/tools/artifacts/Console.js.map +1 -0
  176. package/dist/tools/artifacts/DocxArtifact.d.ts +22 -0
  177. package/dist/tools/artifacts/DocxArtifact.d.ts.map +1 -0
  178. package/dist/tools/artifacts/DocxArtifact.js +205 -0
  179. package/dist/tools/artifacts/DocxArtifact.js.map +1 -0
  180. package/dist/tools/artifacts/ExcelArtifact.d.ts +24 -0
  181. package/dist/tools/artifacts/ExcelArtifact.d.ts.map +1 -0
  182. package/dist/tools/artifacts/ExcelArtifact.js +213 -0
  183. package/dist/tools/artifacts/ExcelArtifact.js.map +1 -0
  184. package/dist/tools/artifacts/GenericArtifact.d.ts +19 -0
  185. package/dist/tools/artifacts/GenericArtifact.d.ts.map +1 -0
  186. package/dist/tools/artifacts/GenericArtifact.js +114 -0
  187. package/dist/tools/artifacts/GenericArtifact.js.map +1 -0
  188. package/dist/tools/artifacts/HtmlArtifact.d.ts +27 -0
  189. package/dist/tools/artifacts/HtmlArtifact.d.ts.map +1 -0
  190. package/dist/tools/artifacts/HtmlArtifact.js +187 -0
  191. package/dist/tools/artifacts/HtmlArtifact.js.map +1 -0
  192. package/dist/tools/artifacts/ImageArtifact.d.ts +20 -0
  193. package/dist/tools/artifacts/ImageArtifact.d.ts.map +1 -0
  194. package/dist/tools/artifacts/ImageArtifact.js +117 -0
  195. package/dist/tools/artifacts/ImageArtifact.js.map +1 -0
  196. package/dist/tools/artifacts/MarkdownArtifact.d.ts +19 -0
  197. package/dist/tools/artifacts/MarkdownArtifact.d.ts.map +1 -0
  198. package/dist/tools/artifacts/MarkdownArtifact.js +79 -0
  199. package/dist/tools/artifacts/MarkdownArtifact.js.map +1 -0
  200. package/dist/tools/artifacts/PdfArtifact.d.ts +25 -0
  201. package/dist/tools/artifacts/PdfArtifact.d.ts.map +1 -0
  202. package/dist/tools/artifacts/PdfArtifact.js +181 -0
  203. package/dist/tools/artifacts/PdfArtifact.js.map +1 -0
  204. package/dist/tools/artifacts/SvgArtifact.d.ts +18 -0
  205. package/dist/tools/artifacts/SvgArtifact.d.ts.map +1 -0
  206. package/dist/tools/artifacts/SvgArtifact.js +75 -0
  207. package/dist/tools/artifacts/SvgArtifact.js.map +1 -0
  208. package/dist/tools/artifacts/TextArtifact.d.ts +19 -0
  209. package/dist/tools/artifacts/TextArtifact.d.ts.map +1 -0
  210. package/dist/tools/artifacts/TextArtifact.js +141 -0
  211. package/dist/tools/artifacts/TextArtifact.js.map +1 -0
  212. package/dist/tools/artifacts/artifacts-tool-renderer.d.ts +11 -0
  213. package/dist/tools/artifacts/artifacts-tool-renderer.d.ts.map +1 -0
  214. package/dist/tools/artifacts/artifacts-tool-renderer.js +273 -0
  215. package/dist/tools/artifacts/artifacts-tool-renderer.js.map +1 -0
  216. package/dist/tools/artifacts/artifacts.d.ts +63 -0
  217. package/dist/tools/artifacts/artifacts.d.ts.map +1 -0
  218. package/dist/tools/artifacts/artifacts.js +664 -0
  219. package/dist/tools/artifacts/artifacts.js.map +1 -0
  220. package/dist/tools/artifacts/index.d.ts +8 -0
  221. package/dist/tools/artifacts/index.d.ts.map +1 -0
  222. package/dist/tools/artifacts/index.js +8 -0
  223. package/dist/tools/artifacts/index.js.map +1 -0
  224. package/dist/tools/extract-document.d.ts +24 -0
  225. package/dist/tools/extract-document.d.ts.map +1 -0
  226. package/dist/tools/extract-document.js +216 -0
  227. package/dist/tools/extract-document.js.map +1 -0
  228. package/dist/tools/index.d.ts +16 -0
  229. package/dist/tools/index.d.ts.map +1 -0
  230. package/dist/tools/index.js +33 -0
  231. package/dist/tools/index.js.map +1 -0
  232. package/dist/tools/javascript-repl.d.ts +44 -0
  233. package/dist/tools/javascript-repl.d.ts.map +1 -0
  234. package/dist/tools/javascript-repl.js +224 -0
  235. package/dist/tools/javascript-repl.js.map +1 -0
  236. package/dist/tools/renderer-registry.d.ts +23 -0
  237. package/dist/tools/renderer-registry.d.ts.map +1 -0
  238. package/dist/tools/renderer-registry.js +107 -0
  239. package/dist/tools/renderer-registry.js.map +1 -0
  240. package/dist/tools/renderers/BashRenderer.d.ts +10 -0
  241. package/dist/tools/renderers/BashRenderer.d.ts.map +1 -0
  242. package/dist/tools/renderers/BashRenderer.js +42 -0
  243. package/dist/tools/renderers/BashRenderer.js.map +1 -0
  244. package/dist/tools/renderers/CalculateRenderer.d.ts +10 -0
  245. package/dist/tools/renderers/CalculateRenderer.d.ts.map +1 -0
  246. package/dist/tools/renderers/CalculateRenderer.js +45 -0
  247. package/dist/tools/renderers/CalculateRenderer.js.map +1 -0
  248. package/dist/tools/renderers/DefaultRenderer.d.ts +6 -0
  249. package/dist/tools/renderers/DefaultRenderer.d.ts.map +1 -0
  250. package/dist/tools/renderers/DefaultRenderer.js +94 -0
  251. package/dist/tools/renderers/DefaultRenderer.js.map +1 -0
  252. package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts +10 -0
  253. package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts.map +1 -0
  254. package/dist/tools/renderers/GetCurrentTimeRenderer.js +72 -0
  255. package/dist/tools/renderers/GetCurrentTimeRenderer.js.map +1 -0
  256. package/dist/tools/types.d.ts +10 -0
  257. package/dist/tools/types.d.ts.map +1 -0
  258. package/dist/tools/types.js +2 -0
  259. package/dist/tools/types.js.map +1 -0
  260. package/dist/utils/attachment-utils.d.ts +19 -0
  261. package/dist/utils/attachment-utils.d.ts.map +1 -0
  262. package/dist/utils/attachment-utils.js +415 -0
  263. package/dist/utils/attachment-utils.js.map +1 -0
  264. package/dist/utils/auth-token.d.ts +3 -0
  265. package/dist/utils/auth-token.d.ts.map +1 -0
  266. package/dist/utils/auth-token.js +19 -0
  267. package/dist/utils/auth-token.js.map +1 -0
  268. package/dist/utils/format.d.ts +6 -0
  269. package/dist/utils/format.d.ts.map +1 -0
  270. package/dist/utils/format.js +47 -0
  271. package/dist/utils/format.js.map +1 -0
  272. package/dist/utils/i18n.d.ts +636 -0
  273. package/dist/utils/i18n.d.ts.map +1 -0
  274. package/dist/utils/i18n.js +418 -0
  275. package/dist/utils/i18n.js.map +1 -0
  276. package/dist/utils/model-discovery.d.ts +38 -0
  277. package/dist/utils/model-discovery.d.ts.map +1 -0
  278. package/dist/utils/model-discovery.js +243 -0
  279. package/dist/utils/model-discovery.js.map +1 -0
  280. package/dist/utils/proxy-utils.d.ts +45 -0
  281. package/dist/utils/proxy-utils.d.ts.map +1 -0
  282. package/dist/utils/proxy-utils.js +116 -0
  283. package/dist/utils/proxy-utils.js.map +1 -0
  284. package/dist/utils/test-sessions.d.ts +359 -0
  285. package/dist/utils/test-sessions.d.ts.map +1 -0
  286. package/dist/utils/test-sessions.js +2325 -0
  287. package/dist/utils/test-sessions.js.map +1 -0
  288. package/example/README.md +61 -0
  289. package/example/index.html +13 -0
  290. package/example/package.json +25 -0
  291. package/example/src/app.css +1 -0
  292. package/example/src/custom-messages.ts +99 -0
  293. package/example/src/env.d.ts +1 -0
  294. package/example/src/main.ts +421 -0
  295. package/example/tsconfig.json +23 -0
  296. package/example/vite.config.ts +6 -0
  297. package/package.json +53 -0
  298. package/scripts/count-prompt-tokens.ts +88 -0
  299. package/src/ChatPanel.ts +207 -0
  300. package/src/app.css +68 -0
  301. package/src/components/AgentInterface.ts +388 -0
  302. package/src/components/AttachmentTile.ts +107 -0
  303. package/src/components/ConsoleBlock.ts +72 -0
  304. package/src/components/CustomProviderCard.ts +100 -0
  305. package/src/components/ExpandableSection.ts +46 -0
  306. package/src/components/Input.ts +113 -0
  307. package/src/components/MessageEditor.ts +400 -0
  308. package/src/components/MessageList.ts +95 -0
  309. package/src/components/Messages.ts +383 -0
  310. package/src/components/ProviderKeyInput.ts +153 -0
  311. package/src/components/SandboxedIframe.ts +626 -0
  312. package/src/components/StreamingMessageContainer.ts +103 -0
  313. package/src/components/ThinkingBlock.ts +43 -0
  314. package/src/components/message-renderer-registry.ts +28 -0
  315. package/src/components/sandbox/ArtifactsRuntimeProvider.ts +219 -0
  316. package/src/components/sandbox/AttachmentsRuntimeProvider.ts +66 -0
  317. package/src/components/sandbox/ConsoleRuntimeProvider.ts +186 -0
  318. package/src/components/sandbox/FileDownloadRuntimeProvider.ts +110 -0
  319. package/src/components/sandbox/RuntimeMessageBridge.ts +82 -0
  320. package/src/components/sandbox/RuntimeMessageRouter.ts +216 -0
  321. package/src/components/sandbox/SandboxRuntimeProvider.ts +52 -0
  322. package/src/dialogs/ApiKeyPromptDialog.ts +75 -0
  323. package/src/dialogs/AttachmentOverlay.ts +636 -0
  324. package/src/dialogs/CustomProviderDialog.ts +274 -0
  325. package/src/dialogs/ModelSelector.ts +313 -0
  326. package/src/dialogs/PersistentStorageDialog.ts +144 -0
  327. package/src/dialogs/ProvidersModelsTab.ts +212 -0
  328. package/src/dialogs/SessionListDialog.ts +150 -0
  329. package/src/dialogs/SettingsDialog.ts +214 -0
  330. package/src/index.ts +119 -0
  331. package/src/prompts/prompts.ts +282 -0
  332. package/src/storage/app-storage.ts +60 -0
  333. package/src/storage/backends/indexeddb-storage-backend.ts +193 -0
  334. package/src/storage/store.ts +33 -0
  335. package/src/storage/stores/custom-providers-store.ts +62 -0
  336. package/src/storage/stores/provider-keys-store.ts +33 -0
  337. package/src/storage/stores/sessions-store.ts +136 -0
  338. package/src/storage/stores/settings-store.ts +34 -0
  339. package/src/storage/types.ts +206 -0
  340. package/src/tools/artifacts/ArtifactElement.ts +14 -0
  341. package/src/tools/artifacts/ArtifactPill.ts +26 -0
  342. package/src/tools/artifacts/Console.ts +93 -0
  343. package/src/tools/artifacts/DocxArtifact.ts +213 -0
  344. package/src/tools/artifacts/ExcelArtifact.ts +231 -0
  345. package/src/tools/artifacts/GenericArtifact.ts +117 -0
  346. package/src/tools/artifacts/HtmlArtifact.ts +195 -0
  347. package/src/tools/artifacts/ImageArtifact.ts +116 -0
  348. package/src/tools/artifacts/MarkdownArtifact.ts +82 -0
  349. package/src/tools/artifacts/PdfArtifact.ts +201 -0
  350. package/src/tools/artifacts/SvgArtifact.ts +78 -0
  351. package/src/tools/artifacts/TextArtifact.ts +148 -0
  352. package/src/tools/artifacts/artifacts-tool-renderer.ts +310 -0
  353. package/src/tools/artifacts/artifacts.ts +713 -0
  354. package/src/tools/artifacts/index.ts +7 -0
  355. package/src/tools/extract-document.ts +275 -0
  356. package/src/tools/index.ts +46 -0
  357. package/src/tools/javascript-repl.ts +293 -0
  358. package/src/tools/renderer-registry.ts +130 -0
  359. package/src/tools/renderers/BashRenderer.ts +52 -0
  360. package/src/tools/renderers/CalculateRenderer.ts +58 -0
  361. package/src/tools/renderers/DefaultRenderer.ts +103 -0
  362. package/src/tools/renderers/GetCurrentTimeRenderer.ts +92 -0
  363. package/src/tools/types.ts +15 -0
  364. package/src/utils/attachment-utils.ts +472 -0
  365. package/src/utils/auth-token.ts +22 -0
  366. package/src/utils/format.ts +42 -0
  367. package/src/utils/i18n.ts +653 -0
  368. package/src/utils/model-discovery.ts +277 -0
  369. package/src/utils/proxy-utils.ts +134 -0
  370. package/src/utils/test-sessions.ts +2357 -0
  371. package/tsconfig.build.json +20 -0
  372. package/tsconfig.json +7 -0
@@ -0,0 +1,224 @@
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);
224
+ //# sourceMappingURL=javascript-repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-repl.js","sourceRoot":"","sources":["../../src/tools/javascript-repl.ts"],"names":[],"mappings":"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"}
@@ -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/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"}
@@ -0,0 +1,107 @@
1
+ import { icon } from "@mariozechner/mini-lit";
2
+ import { html } from "lit";
3
+ import { ref } from "lit/directives/ref.js";
4
+ import { ChevronsUpDown, ChevronUp, Loader } from "lucide";
5
+ // Registry of tool renderers
6
+ export const toolRenderers = new Map();
7
+ /**
8
+ * Register a custom tool renderer
9
+ */
10
+ export function registerToolRenderer(toolName, renderer) {
11
+ toolRenderers.set(toolName, renderer);
12
+ }
13
+ /**
14
+ * Get a tool renderer by name
15
+ */
16
+ export function getToolRenderer(toolName) {
17
+ return toolRenderers.get(toolName);
18
+ }
19
+ /**
20
+ * Helper to render a header for tool renderers
21
+ * Shows icon on left when complete/error, spinner on right when in progress
22
+ */
23
+ export function renderHeader(state, toolIcon, text) {
24
+ const statusIcon = (iconComponent, color) => html `<span class="inline-block ${color}">${icon(iconComponent, "sm")}</span>`;
25
+ switch (state) {
26
+ case "inprogress":
27
+ return html `
28
+ <div class="flex items-center justify-between gap-2 text-sm text-muted-foreground">
29
+ <div class="flex items-center gap-2">
30
+ ${statusIcon(toolIcon, "text-foreground")}
31
+ ${text}
32
+ </div>
33
+ ${statusIcon(Loader, "text-foreground animate-spin")}
34
+ </div>
35
+ `;
36
+ case "complete":
37
+ return html `
38
+ <div class="flex items-center gap-2 text-sm text-muted-foreground">
39
+ ${statusIcon(toolIcon, "text-green-600 dark:text-green-500")}
40
+ ${text}
41
+ </div>
42
+ `;
43
+ case "error":
44
+ return html `
45
+ <div class="flex items-center gap-2 text-sm text-muted-foreground">
46
+ ${statusIcon(toolIcon, "text-destructive")}
47
+ ${text}
48
+ </div>
49
+ `;
50
+ }
51
+ }
52
+ /**
53
+ * Helper to render a collapsible header for tool renderers
54
+ * Same as renderHeader but with a chevron button that toggles visibility of content
55
+ */
56
+ export function renderCollapsibleHeader(state, toolIcon, text, contentRef, chevronRef, defaultExpanded = false) {
57
+ const statusIcon = (iconComponent, color) => html `<span class="inline-block ${color}">${icon(iconComponent, "sm")}</span>`;
58
+ const toggleContent = (e) => {
59
+ e.preventDefault();
60
+ const content = contentRef.value;
61
+ const chevron = chevronRef.value;
62
+ if (content && chevron) {
63
+ const isCollapsed = content.classList.contains("max-h-0");
64
+ if (isCollapsed) {
65
+ content.classList.remove("max-h-0");
66
+ content.classList.add("max-h-[2000px]", "mt-3");
67
+ // Show ChevronUp, hide ChevronsUpDown
68
+ const upIcon = chevron.querySelector(".chevron-up");
69
+ const downIcon = chevron.querySelector(".chevrons-up-down");
70
+ if (upIcon && downIcon) {
71
+ upIcon.classList.remove("hidden");
72
+ downIcon.classList.add("hidden");
73
+ }
74
+ }
75
+ else {
76
+ content.classList.remove("max-h-[2000px]", "mt-3");
77
+ content.classList.add("max-h-0");
78
+ // Show ChevronsUpDown, hide ChevronUp
79
+ const upIcon = chevron.querySelector(".chevron-up");
80
+ const downIcon = chevron.querySelector(".chevrons-up-down");
81
+ if (upIcon && downIcon) {
82
+ upIcon.classList.add("hidden");
83
+ downIcon.classList.remove("hidden");
84
+ }
85
+ }
86
+ }
87
+ };
88
+ const toolIconColor = state === "complete"
89
+ ? "text-green-600 dark:text-green-500"
90
+ : state === "error"
91
+ ? "text-destructive"
92
+ : "text-foreground";
93
+ return html `
94
+ <button @click=${toggleContent} class="flex items-center justify-between gap-2 text-sm text-muted-foreground w-full text-left hover:text-foreground transition-colors cursor-pointer">
95
+ <div class="flex items-center gap-2">
96
+ ${state === "inprogress" ? statusIcon(Loader, "text-foreground animate-spin") : ""}
97
+ ${statusIcon(toolIcon, toolIconColor)}
98
+ ${text}
99
+ </div>
100
+ <span class="inline-block text-muted-foreground" ${ref(chevronRef)}>
101
+ <span class="chevron-up ${defaultExpanded ? "" : "hidden"}">${icon(ChevronUp, "sm")}</span>
102
+ <span class="chevrons-up-down ${defaultExpanded ? "hidden" : ""}">${icon(ChevronsUpDown, "sm")}</span>
103
+ </span>
104
+ </button>
105
+ `;
106
+ }
107
+ //# sourceMappingURL=renderer-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-registry.js","sourceRoot":"","sources":["../../src/tools/renderer-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ToolResultMessage } from "@draht/ai";
2
+ import type { ToolRenderer, ToolRenderResult } from "../types.js";
3
+ interface BashParams {
4
+ command: string;
5
+ }
6
+ export declare class BashRenderer implements ToolRenderer<BashParams, undefined> {
7
+ render(params: BashParams | undefined, result: ToolResultMessage<undefined> | undefined): ToolRenderResult;
8
+ }
9
+ export {};
10
+ //# sourceMappingURL=BashRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BashRenderer.d.ts","sourceRoot":"","sources":["../../../src/tools/renderers/BashRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAKnD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElE,UAAU,UAAU;IACnB,OAAO,EAAE,MAAM,CAAC;CAChB;AAGD,qBAAa,YAAa,YAAW,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC;IACvE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,gBAAgB,CAqCzG;CACD"}
@@ -0,0 +1,42 @@
1
+ import { html } from "lit";
2
+ import { SquareTerminal } from "lucide";
3
+ import { i18n } from "../../utils/i18n.js";
4
+ import { renderHeader } from "../renderer-registry.js";
5
+ // Bash tool has undefined details (only uses output)
6
+ export class BashRenderer {
7
+ render(params, result) {
8
+ const state = result ? (result.isError ? "error" : "complete") : "inprogress";
9
+ // With result: show command + output
10
+ if (result && params?.command) {
11
+ const output = result.content
12
+ ?.filter((c) => c.type === "text")
13
+ .map((c) => c.text)
14
+ .join("\n") || "";
15
+ const combined = output ? `> ${params.command}\n\n${output}` : `> ${params.command}`;
16
+ return {
17
+ content: html `
18
+ <div class="space-y-3">
19
+ ${renderHeader(state, SquareTerminal, i18n("Running command..."))}
20
+ <console-block .content=${combined} .variant=${result.isError ? "error" : "default"}></console-block>
21
+ </div>
22
+ `,
23
+ isCustom: false,
24
+ };
25
+ }
26
+ // Just params (streaming or waiting)
27
+ if (params?.command) {
28
+ return {
29
+ content: html `
30
+ <div class="space-y-3">
31
+ ${renderHeader(state, SquareTerminal, i18n("Running command..."))}
32
+ <console-block .content=${`> ${params.command}`}></console-block>
33
+ </div>
34
+ `,
35
+ isCustom: false,
36
+ };
37
+ }
38
+ // No params yet
39
+ return { content: renderHeader(state, SquareTerminal, i18n("Waiting for command...")), isCustom: false };
40
+ }
41
+ }
42
+ //# sourceMappingURL=BashRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BashRenderer.js","sourceRoot":"","sources":["../../../src/tools/renderers/BashRenderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAOvD,qDAAqD;AACrD,MAAM,OAAO,YAAY;IACxB,MAAM,CAAC,MAA8B,EAAE,MAAgD,EAAoB;QAC1G,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QAE9E,qCAAqC;QACrC,IAAI,MAAM,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,GACX,MAAM,CAAC,OAAO;gBACb,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBACjC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;YACrF,OAAO;gBACN,OAAO,EAAE,IAAI,CAAA;;QAET,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;gCACvC,QAAQ,aAAa,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;;KAEpF;gBACD,QAAQ,EAAE,KAAK;aACf,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACrB,OAAO;gBACN,OAAO,EAAE,IAAI,CAAA;;QAET,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;gCACvC,KAAK,MAAM,CAAC,OAAO,EAAE;;KAEhD;gBACD,QAAQ,EAAE,KAAK;aACf,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAAA,CACzG;CACD"}
@@ -0,0 +1,10 @@
1
+ import type { ToolResultMessage } from "@draht/ai";
2
+ import type { ToolRenderer, ToolRenderResult } from "../types.js";
3
+ interface CalculateParams {
4
+ expression: string;
5
+ }
6
+ export declare class CalculateRenderer implements ToolRenderer<CalculateParams, undefined> {
7
+ render(params: CalculateParams | undefined, result: ToolResultMessage<undefined> | undefined): ToolRenderResult;
8
+ }
9
+ export {};
10
+ //# sourceMappingURL=CalculateRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalculateRenderer.d.ts","sourceRoot":"","sources":["../../../src/tools/renderers/CalculateRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAKnD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElE,UAAU,eAAe;IACxB,UAAU,EAAE,MAAM,CAAC;CACnB;AAGD,qBAAa,iBAAkB,YAAW,YAAY,CAAC,eAAe,EAAE,SAAS,CAAC;IACjF,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,gBAAgB,CA2C9G;CACD"}
@@ -0,0 +1,45 @@
1
+ import { html } from "lit";
2
+ import { Calculator } from "lucide";
3
+ import { i18n } from "../../utils/i18n.js";
4
+ import { renderHeader } from "../renderer-registry.js";
5
+ // Calculate tool has undefined details (only uses output)
6
+ export class CalculateRenderer {
7
+ render(params, result) {
8
+ const state = result ? (result.isError ? "error" : "complete") : "inprogress";
9
+ // Full params + full result
10
+ if (result && params?.expression) {
11
+ const output = result.content
12
+ ?.filter((c) => c.type === "text")
13
+ .map((c) => c.text)
14
+ .join("\n") || "";
15
+ // Error: show expression in header, error below
16
+ if (result.isError) {
17
+ return {
18
+ content: html `
19
+ <div class="space-y-3">
20
+ ${renderHeader(state, Calculator, params.expression)}
21
+ <div class="text-sm text-destructive">${output}</div>
22
+ </div>
23
+ `,
24
+ isCustom: false,
25
+ };
26
+ }
27
+ // Success: show expression = result in header
28
+ return { content: renderHeader(state, Calculator, `${params.expression} = ${output}`), isCustom: false };
29
+ }
30
+ // Full params, no result: just show header with expression in it
31
+ if (params?.expression) {
32
+ return {
33
+ content: renderHeader(state, Calculator, `${i18n("Calculating")} ${params.expression}`),
34
+ isCustom: false,
35
+ };
36
+ }
37
+ // Partial params (empty expression), no result
38
+ if (params && !params.expression) {
39
+ return { content: renderHeader(state, Calculator, i18n("Writing expression...")), isCustom: false };
40
+ }
41
+ // No params, no result
42
+ return { content: renderHeader(state, Calculator, i18n("Waiting for expression...")), isCustom: false };
43
+ }
44
+ }
45
+ //# sourceMappingURL=CalculateRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalculateRenderer.js","sourceRoot":"","sources":["../../../src/tools/renderers/CalculateRenderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAOvD,0DAA0D;AAC1D,MAAM,OAAO,iBAAiB;IAC7B,MAAM,CAAC,MAAmC,EAAE,MAAgD,EAAoB;QAC/G,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QAE9E,4BAA4B;QAC5B,IAAI,MAAM,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GACX,MAAM,CAAC,OAAO;gBACb,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBACjC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAEpB,gDAAgD;YAChD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO;oBACN,OAAO,EAAE,IAAI,CAAA;;SAET,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;+CACZ,MAAM;;MAE/C;oBACD,QAAQ,EAAE,KAAK;iBACf,CAAC;YACH,CAAC;YAED,8CAA8C;YAC9C,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,UAAU,MAAM,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC1G,CAAC;QAED,iEAAiE;QACjE,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;YACxB,OAAO;gBACN,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvF,QAAQ,EAAE,KAAK;aACf,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACrG,CAAC;QAED,uBAAuB;QACvB,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAAA,CACxG;CACD"}
@@ -0,0 +1,6 @@
1
+ import type { ToolResultMessage } from "@draht/ai";
2
+ import type { ToolRenderer, ToolRenderResult } from "../types.js";
3
+ export declare class DefaultRenderer implements ToolRenderer {
4
+ render(params: any | undefined, result: ToolResultMessage | undefined, isStreaming?: boolean): ToolRenderResult;
5
+ }
6
+ //# sourceMappingURL=DefaultRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultRenderer.d.ts","sourceRoot":"","sources":["../../../src/tools/renderers/DefaultRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAKnD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElE,qBAAa,eAAgB,YAAW,YAAY;IACnD,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,SAAS,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,gBAAgB,CA6F9G;CACD"}
@@ -0,0 +1,94 @@
1
+ import { html } from "lit";
2
+ import { Code } from "lucide";
3
+ import { i18n } from "../../utils/i18n.js";
4
+ import { renderHeader } from "../renderer-registry.js";
5
+ export class DefaultRenderer {
6
+ render(params, result, isStreaming) {
7
+ const state = result ? (result.isError ? "error" : "complete") : isStreaming ? "inprogress" : "complete";
8
+ // Format params as JSON
9
+ let paramsJson = "";
10
+ if (params) {
11
+ try {
12
+ paramsJson = JSON.stringify(JSON.parse(params), null, 2);
13
+ }
14
+ catch {
15
+ try {
16
+ paramsJson = JSON.stringify(params, null, 2);
17
+ }
18
+ catch {
19
+ paramsJson = String(params);
20
+ }
21
+ }
22
+ }
23
+ // With result: show header + params + result
24
+ if (result) {
25
+ let outputJson = result.content
26
+ ?.filter((c) => c.type === "text")
27
+ .map((c) => c.text)
28
+ .join("\n") || i18n("(no output)");
29
+ let outputLanguage = "text";
30
+ // Try to parse and pretty-print if it's valid JSON
31
+ try {
32
+ const parsed = JSON.parse(outputJson);
33
+ outputJson = JSON.stringify(parsed, null, 2);
34
+ outputLanguage = "json";
35
+ }
36
+ catch {
37
+ // Not valid JSON, leave as-is and use text highlighting
38
+ }
39
+ return {
40
+ content: html `
41
+ <div class="space-y-3">
42
+ ${renderHeader(state, Code, "Tool Call")}
43
+ ${paramsJson
44
+ ? html `<div>
45
+ <div class="text-xs font-medium mb-1 text-muted-foreground">${i18n("Input")}</div>
46
+ <code-block .code=${paramsJson} language="json"></code-block>
47
+ </div>`
48
+ : ""}
49
+ <div>
50
+ <div class="text-xs font-medium mb-1 text-muted-foreground">${i18n("Output")}</div>
51
+ <code-block .code=${outputJson} language="${outputLanguage}"></code-block>
52
+ </div>
53
+ </div>
54
+ `,
55
+ isCustom: false,
56
+ };
57
+ }
58
+ // Just params (streaming or waiting for result)
59
+ if (params) {
60
+ if (isStreaming && (!paramsJson || paramsJson === "{}" || paramsJson === "null")) {
61
+ return {
62
+ content: html `
63
+ <div>
64
+ ${renderHeader(state, Code, "Preparing tool parameters...")}
65
+ </div>
66
+ `,
67
+ isCustom: false,
68
+ };
69
+ }
70
+ return {
71
+ content: html `
72
+ <div class="space-y-3">
73
+ ${renderHeader(state, Code, "Tool Call")}
74
+ <div>
75
+ <div class="text-xs font-medium mb-1 text-muted-foreground">${i18n("Input")}</div>
76
+ <code-block .code=${paramsJson} language="json"></code-block>
77
+ </div>
78
+ </div>
79
+ `,
80
+ isCustom: false,
81
+ };
82
+ }
83
+ // No params or result yet
84
+ return {
85
+ content: html `
86
+ <div>
87
+ ${renderHeader(state, Code, "Preparing tool...")}
88
+ </div>
89
+ `,
90
+ isCustom: false,
91
+ };
92
+ }
93
+ }
94
+ //# sourceMappingURL=DefaultRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultRenderer.js","sourceRoot":"","sources":["../../../src/tools/renderers/DefaultRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ToolResultMessage } from "@draht/ai";
2
+ import type { ToolRenderer, ToolRenderResult } from "../types.js";
3
+ interface GetCurrentTimeParams {
4
+ timezone?: string;
5
+ }
6
+ export declare class GetCurrentTimeRenderer implements ToolRenderer<GetCurrentTimeParams, undefined> {
7
+ render(params: GetCurrentTimeParams | undefined, result: ToolResultMessage<undefined> | undefined): ToolRenderResult;
8
+ }
9
+ export {};
10
+ //# sourceMappingURL=GetCurrentTimeRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GetCurrentTimeRenderer.d.ts","sourceRoot":"","sources":["../../../src/tools/renderers/GetCurrentTimeRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAKnD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElE,UAAU,oBAAoB;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,qBAAa,sBAAuB,YAAW,YAAY,CAAC,oBAAoB,EAAE,SAAS,CAAC;IAC3F,MAAM,CACL,MAAM,EAAE,oBAAoB,GAAG,SAAS,EACxC,MAAM,EAAE,iBAAiB,CAAC,SAAS,CAAC,GAAG,SAAS,GAC9C,gBAAgB,CA0ElB;CACD"}