@mariozechner/pi-web-ui 0.5.44 → 0.5.46

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 (346) hide show
  1. package/README.md +178 -99
  2. package/dist/ChatPanel.d.ts +15 -10
  3. package/dist/ChatPanel.d.ts.map +1 -1
  4. package/dist/ChatPanel.js +68 -100
  5. package/dist/ChatPanel.js.map +1 -1
  6. package/dist/{state/agent-session.d.ts → agent/agent.d.ts} +23 -19
  7. package/dist/agent/agent.d.ts.map +1 -0
  8. package/dist/{state/agent-session.js → agent/agent.js} +50 -32
  9. package/dist/agent/agent.js.map +1 -0
  10. package/dist/{state → agent}/transports/AppTransport.d.ts +1 -3
  11. package/dist/agent/transports/AppTransport.d.ts.map +1 -0
  12. package/dist/{state → agent}/transports/AppTransport.js +5 -4
  13. package/dist/{state → agent}/transports/AppTransport.js.map +1 -1
  14. package/dist/{state → agent}/transports/ProviderTransport.d.ts +1 -3
  15. package/dist/agent/transports/ProviderTransport.d.ts.map +1 -0
  16. package/dist/{state → agent}/transports/ProviderTransport.js +6 -7
  17. package/dist/agent/transports/ProviderTransport.js.map +1 -0
  18. package/dist/{state → agent}/transports/index.d.ts.map +1 -1
  19. package/dist/agent/transports/index.js.map +1 -0
  20. package/dist/{state → agent}/transports/proxy-types.d.ts.map +1 -1
  21. package/dist/agent/transports/proxy-types.js.map +1 -0
  22. package/dist/agent/transports/types.d.ts +12 -0
  23. package/dist/agent/transports/types.d.ts.map +1 -0
  24. package/dist/{state → agent}/transports/types.js.map +1 -1
  25. package/dist/{state → agent}/types.d.ts.map +1 -1
  26. package/dist/{state → agent}/types.js.map +1 -1
  27. package/dist/app.css +1 -1
  28. package/dist/components/AgentInterface.d.ts +7 -4
  29. package/dist/components/AgentInterface.d.ts.map +1 -1
  30. package/dist/components/AgentInterface.js +29 -17
  31. package/dist/components/AgentInterface.js.map +1 -1
  32. package/dist/components/ConsoleBlock.d.ts +1 -0
  33. package/dist/components/ConsoleBlock.d.ts.map +1 -1
  34. package/dist/components/ConsoleBlock.js +7 -1
  35. package/dist/components/ConsoleBlock.js.map +1 -1
  36. package/dist/components/ExpandableSection.d.ts +15 -0
  37. package/dist/components/ExpandableSection.d.ts.map +1 -0
  38. package/dist/components/ExpandableSection.js +63 -0
  39. package/dist/components/ExpandableSection.js.map +1 -0
  40. package/dist/components/MessageEditor.d.ts +8 -1
  41. package/dist/components/MessageEditor.d.ts.map +1 -1
  42. package/dist/components/MessageEditor.js +149 -6
  43. package/dist/components/MessageEditor.js.map +1 -1
  44. package/dist/components/MessageList.d.ts +3 -2
  45. package/dist/components/MessageList.d.ts.map +1 -1
  46. package/dist/components/MessageList.js +14 -1
  47. package/dist/components/MessageList.js.map +1 -1
  48. package/dist/components/Messages.d.ts +15 -6
  49. package/dist/components/Messages.d.ts.map +1 -1
  50. package/dist/components/Messages.js +17 -83
  51. package/dist/components/Messages.js.map +1 -1
  52. package/dist/components/ProviderKeyInput.d.ts.map +1 -1
  53. package/dist/components/ProviderKeyInput.js +6 -5
  54. package/dist/components/ProviderKeyInput.js.map +1 -1
  55. package/dist/components/SandboxedIframe.d.ts +29 -7
  56. package/dist/components/SandboxedIframe.d.ts.map +1 -1
  57. package/dist/components/SandboxedIframe.js +350 -282
  58. package/dist/components/SandboxedIframe.js.map +1 -1
  59. package/dist/components/message-renderer-registry.d.ts +12 -0
  60. package/dist/components/message-renderer-registry.d.ts.map +1 -0
  61. package/dist/components/message-renderer-registry.js +12 -0
  62. package/dist/components/message-renderer-registry.js.map +1 -0
  63. package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts +35 -0
  64. package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts.map +1 -0
  65. package/dist/components/sandbox/ArtifactsRuntimeProvider.js +189 -0
  66. package/dist/components/sandbox/ArtifactsRuntimeProvider.js.map +1 -0
  67. package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts +17 -0
  68. package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts.map +1 -0
  69. package/dist/components/sandbox/AttachmentsRuntimeProvider.js +64 -0
  70. package/dist/components/sandbox/AttachmentsRuntimeProvider.js.map +1 -0
  71. package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts +42 -0
  72. package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts.map +1 -0
  73. package/dist/components/sandbox/ConsoleRuntimeProvider.js +161 -0
  74. package/dist/components/sandbox/ConsoleRuntimeProvider.js.map +1 -0
  75. package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts +30 -0
  76. package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts.map +1 -0
  77. package/dist/components/sandbox/FileDownloadRuntimeProvider.js +97 -0
  78. package/dist/components/sandbox/FileDownloadRuntimeProvider.js.map +1 -0
  79. package/dist/components/sandbox/RuntimeMessageBridge.d.ts +19 -0
  80. package/dist/components/sandbox/RuntimeMessageBridge.d.ts.map +1 -0
  81. package/dist/components/sandbox/RuntimeMessageBridge.js +74 -0
  82. package/dist/components/sandbox/RuntimeMessageBridge.js.map +1 -0
  83. package/dist/components/sandbox/RuntimeMessageRouter.d.ts +65 -0
  84. package/dist/components/sandbox/RuntimeMessageRouter.d.ts.map +1 -0
  85. package/dist/components/sandbox/RuntimeMessageRouter.js +168 -0
  86. package/dist/components/sandbox/RuntimeMessageRouter.js.map +1 -0
  87. package/dist/components/sandbox/SandboxRuntimeProvider.d.ts +33 -0
  88. package/dist/components/sandbox/SandboxRuntimeProvider.d.ts.map +1 -0
  89. package/dist/components/sandbox/SandboxRuntimeProvider.js +2 -0
  90. package/dist/components/sandbox/SandboxRuntimeProvider.js.map +1 -0
  91. package/dist/dialogs/ApiKeyPromptDialog.d.ts.map +1 -1
  92. package/dist/dialogs/ApiKeyPromptDialog.js +2 -5
  93. package/dist/dialogs/ApiKeyPromptDialog.js.map +1 -1
  94. package/dist/dialogs/ModelSelector.js.map +1 -1
  95. package/dist/dialogs/PersistentStorageDialog.d.ts +17 -0
  96. package/dist/dialogs/PersistentStorageDialog.d.ts.map +1 -0
  97. package/dist/dialogs/PersistentStorageDialog.js +144 -0
  98. package/dist/dialogs/PersistentStorageDialog.js.map +1 -0
  99. package/dist/dialogs/SessionListDialog.d.ts +19 -0
  100. package/dist/dialogs/SessionListDialog.d.ts.map +1 -0
  101. package/dist/dialogs/SessionListDialog.js +152 -0
  102. package/dist/dialogs/SessionListDialog.js.map +1 -0
  103. package/dist/dialogs/SettingsDialog.d.ts.map +1 -1
  104. package/dist/dialogs/SettingsDialog.js +1 -0
  105. package/dist/dialogs/SettingsDialog.js.map +1 -1
  106. package/dist/index.d.ts +34 -16
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +32 -14
  109. package/dist/index.js.map +1 -1
  110. package/dist/prompts/prompts.d.ts +11 -0
  111. package/dist/prompts/prompts.d.ts.map +1 -0
  112. package/dist/prompts/prompts.js +272 -0
  113. package/dist/prompts/prompts.js.map +1 -0
  114. package/dist/storage/app-storage.d.ts +17 -12
  115. package/dist/storage/app-storage.d.ts.map +1 -1
  116. package/dist/storage/app-storage.js +13 -20
  117. package/dist/storage/app-storage.js.map +1 -1
  118. package/dist/storage/backends/indexeddb-storage-backend.d.ts +27 -0
  119. package/dist/storage/backends/indexeddb-storage-backend.d.ts.map +1 -0
  120. package/dist/storage/backends/indexeddb-storage-backend.js +166 -0
  121. package/dist/storage/backends/indexeddb-storage-backend.js.map +1 -0
  122. package/dist/storage/store.d.ts +23 -0
  123. package/dist/storage/store.d.ts.map +1 -0
  124. package/dist/storage/store.js +26 -0
  125. package/dist/storage/store.js.map +1 -0
  126. package/dist/storage/stores/provider-keys-store.d.ts +14 -0
  127. package/dist/storage/stores/provider-keys-store.d.ts.map +1 -0
  128. package/dist/storage/stores/provider-keys-store.js +27 -0
  129. package/dist/storage/stores/provider-keys-store.js.map +1 -0
  130. package/dist/storage/stores/sessions-store.d.ts +31 -0
  131. package/dist/storage/stores/sessions-store.d.ts.map +1 -0
  132. package/dist/storage/stores/sessions-store.js +113 -0
  133. package/dist/storage/stores/sessions-store.js.map +1 -0
  134. package/dist/storage/stores/settings-store.d.ts +14 -0
  135. package/dist/storage/stores/settings-store.d.ts.map +1 -0
  136. package/dist/storage/stores/settings-store.js +28 -0
  137. package/dist/storage/stores/settings-store.js.map +1 -0
  138. package/dist/storage/types.d.ts +156 -22
  139. package/dist/storage/types.d.ts.map +1 -1
  140. package/dist/tools/artifacts/ArtifactElement.d.ts +0 -1
  141. package/dist/tools/artifacts/ArtifactElement.d.ts.map +1 -1
  142. package/dist/tools/artifacts/ArtifactElement.js +0 -1
  143. package/dist/tools/artifacts/ArtifactElement.js.map +1 -1
  144. package/dist/tools/artifacts/ArtifactPill.d.ts +4 -0
  145. package/dist/tools/artifacts/ArtifactPill.d.ts.map +1 -0
  146. package/dist/tools/artifacts/ArtifactPill.js +22 -0
  147. package/dist/tools/artifacts/ArtifactPill.js.map +1 -0
  148. package/dist/tools/artifacts/Console.d.ts +18 -0
  149. package/dist/tools/artifacts/Console.d.ts.map +1 -0
  150. package/dist/tools/artifacts/Console.js +95 -0
  151. package/dist/tools/artifacts/Console.js.map +1 -0
  152. package/dist/tools/artifacts/DocxArtifact.d.ts +22 -0
  153. package/dist/tools/artifacts/DocxArtifact.d.ts.map +1 -0
  154. package/dist/tools/artifacts/DocxArtifact.js +208 -0
  155. package/dist/tools/artifacts/DocxArtifact.js.map +1 -0
  156. package/dist/tools/artifacts/ExcelArtifact.d.ts +24 -0
  157. package/dist/tools/artifacts/ExcelArtifact.d.ts.map +1 -0
  158. package/dist/tools/artifacts/ExcelArtifact.js +216 -0
  159. package/dist/tools/artifacts/ExcelArtifact.js.map +1 -0
  160. package/dist/tools/artifacts/GenericArtifact.d.ts +19 -0
  161. package/dist/tools/artifacts/GenericArtifact.d.ts.map +1 -0
  162. package/dist/tools/artifacts/GenericArtifact.js +117 -0
  163. package/dist/tools/artifacts/GenericArtifact.js.map +1 -0
  164. package/dist/tools/artifacts/HtmlArtifact.d.ts +8 -11
  165. package/dist/tools/artifacts/HtmlArtifact.d.ts.map +1 -1
  166. package/dist/tools/artifacts/HtmlArtifact.js +56 -88
  167. package/dist/tools/artifacts/HtmlArtifact.js.map +1 -1
  168. package/dist/tools/artifacts/ImageArtifact.d.ts +20 -0
  169. package/dist/tools/artifacts/ImageArtifact.d.ts.map +1 -0
  170. package/dist/tools/artifacts/ImageArtifact.js +120 -0
  171. package/dist/tools/artifacts/ImageArtifact.js.map +1 -0
  172. package/dist/tools/artifacts/MarkdownArtifact.d.ts +0 -1
  173. package/dist/tools/artifacts/MarkdownArtifact.d.ts.map +1 -1
  174. package/dist/tools/artifacts/MarkdownArtifact.js +0 -4
  175. package/dist/tools/artifacts/MarkdownArtifact.js.map +1 -1
  176. package/dist/tools/artifacts/PdfArtifact.d.ts +25 -0
  177. package/dist/tools/artifacts/PdfArtifact.d.ts.map +1 -0
  178. package/dist/tools/artifacts/PdfArtifact.js +184 -0
  179. package/dist/tools/artifacts/PdfArtifact.js.map +1 -0
  180. package/dist/tools/artifacts/SvgArtifact.d.ts +0 -1
  181. package/dist/tools/artifacts/SvgArtifact.d.ts.map +1 -1
  182. package/dist/tools/artifacts/SvgArtifact.js +0 -4
  183. package/dist/tools/artifacts/SvgArtifact.js.map +1 -1
  184. package/dist/tools/artifacts/TextArtifact.d.ts +0 -1
  185. package/dist/tools/artifacts/TextArtifact.d.ts.map +1 -1
  186. package/dist/tools/artifacts/TextArtifact.js +0 -4
  187. package/dist/tools/artifacts/TextArtifact.js.map +1 -1
  188. package/dist/tools/artifacts/artifacts-tool-renderer.d.ts +11 -0
  189. package/dist/tools/artifacts/artifacts-tool-renderer.d.ts.map +1 -0
  190. package/dist/tools/artifacts/artifacts-tool-renderer.js +262 -0
  191. package/dist/tools/artifacts/artifacts-tool-renderer.js.map +1 -0
  192. package/dist/tools/artifacts/artifacts.d.ts +10 -13
  193. package/dist/tools/artifacts/artifacts.d.ts.map +1 -1
  194. package/dist/tools/artifacts/artifacts.js +166 -344
  195. package/dist/tools/artifacts/artifacts.js.map +1 -1
  196. package/dist/tools/artifacts/index.d.ts +1 -0
  197. package/dist/tools/artifacts/index.d.ts.map +1 -1
  198. package/dist/tools/artifacts/index.js +1 -0
  199. package/dist/tools/artifacts/index.js.map +1 -1
  200. package/dist/tools/extract-document.d.ts +24 -0
  201. package/dist/tools/extract-document.d.ts.map +1 -0
  202. package/dist/tools/extract-document.js +193 -0
  203. package/dist/tools/extract-document.js.map +1 -0
  204. package/dist/tools/index.d.ts +9 -7
  205. package/dist/tools/index.d.ts.map +1 -1
  206. package/dist/tools/index.js +17 -13
  207. package/dist/tools/index.js.map +1 -1
  208. package/dist/tools/javascript-repl.d.ts +16 -15
  209. package/dist/tools/javascript-repl.d.ts.map +1 -1
  210. package/dist/tools/javascript-repl.js +101 -133
  211. package/dist/tools/javascript-repl.js.map +1 -1
  212. package/dist/tools/renderer-registry.d.ts +12 -0
  213. package/dist/tools/renderer-registry.d.ts.map +1 -1
  214. package/dist/tools/renderer-registry.js +78 -0
  215. package/dist/tools/renderer-registry.js.map +1 -1
  216. package/dist/tools/renderers/BashRenderer.d.ts +2 -4
  217. package/dist/tools/renderers/BashRenderer.d.ts.map +1 -1
  218. package/dist/tools/renderers/BashRenderer.js +30 -26
  219. package/dist/tools/renderers/BashRenderer.js.map +1 -1
  220. package/dist/tools/renderers/CalculateRenderer.d.ts +2 -4
  221. package/dist/tools/renderers/CalculateRenderer.d.ts.map +1 -1
  222. package/dist/tools/renderers/CalculateRenderer.js +32 -28
  223. package/dist/tools/renderers/CalculateRenderer.js.map +1 -1
  224. package/dist/tools/renderers/DefaultRenderer.d.ts +2 -4
  225. package/dist/tools/renderers/DefaultRenderer.d.ts.map +1 -1
  226. package/dist/tools/renderers/DefaultRenderer.js +78 -18
  227. package/dist/tools/renderers/DefaultRenderer.js.map +1 -1
  228. package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts +2 -4
  229. package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts.map +1 -1
  230. package/dist/tools/renderers/GetCurrentTimeRenderer.js +57 -21
  231. package/dist/tools/renderers/GetCurrentTimeRenderer.js.map +1 -1
  232. package/dist/tools/types.d.ts +5 -2
  233. package/dist/tools/types.d.ts.map +1 -1
  234. package/dist/utils/i18n.d.ts +424 -1
  235. package/dist/utils/i18n.d.ts.map +1 -1
  236. package/dist/utils/i18n.js +131 -7
  237. package/dist/utils/i18n.js.map +1 -1
  238. package/example/package.json +2 -1
  239. package/example/src/custom-messages.ts +112 -0
  240. package/example/src/main.ts +391 -38
  241. package/package.json +48 -43
  242. package/scripts/count-prompt-tokens.ts +88 -0
  243. package/src/ChatPanel.ts +93 -101
  244. package/src/{state/agent-session.ts → agent/agent.ts} +80 -55
  245. package/src/{state → agent}/transports/AppTransport.ts +6 -6
  246. package/src/{state → agent}/transports/ProviderTransport.ts +13 -7
  247. package/src/{state → agent}/transports/types.ts +8 -2
  248. package/src/components/AgentInterface.ts +32 -16
  249. package/src/components/ConsoleBlock.ts +5 -1
  250. package/src/components/ExpandableSection.ts +46 -0
  251. package/src/components/MessageEditor.ts +159 -5
  252. package/src/components/MessageList.ts +18 -3
  253. package/src/components/Messages.ts +48 -89
  254. package/src/components/ProviderKeyInput.ts +6 -5
  255. package/src/components/SandboxedIframe.ts +412 -321
  256. package/src/components/message-renderer-registry.ts +28 -0
  257. package/src/components/sandbox/ArtifactsRuntimeProvider.ts +219 -0
  258. package/src/components/sandbox/AttachmentsRuntimeProvider.ts +66 -0
  259. package/src/components/sandbox/ConsoleRuntimeProvider.ts +187 -0
  260. package/src/components/sandbox/FileDownloadRuntimeProvider.ts +110 -0
  261. package/src/components/sandbox/RuntimeMessageBridge.ts +82 -0
  262. package/src/components/sandbox/RuntimeMessageRouter.ts +216 -0
  263. package/src/components/sandbox/SandboxRuntimeProvider.ts +35 -0
  264. package/src/dialogs/ApiKeyPromptDialog.ts +2 -5
  265. package/src/dialogs/ModelSelector.ts +2 -2
  266. package/src/dialogs/PersistentStorageDialog.ts +141 -0
  267. package/src/dialogs/SessionListDialog.ts +148 -0
  268. package/src/dialogs/SettingsDialog.ts +1 -0
  269. package/src/index.ts +61 -20
  270. package/src/prompts/prompts.ts +282 -0
  271. package/src/storage/app-storage.ts +27 -24
  272. package/src/storage/backends/indexeddb-storage-backend.ts +193 -0
  273. package/src/storage/store.ts +33 -0
  274. package/src/storage/stores/provider-keys-store.ts +33 -0
  275. package/src/storage/stores/sessions-store.ts +130 -0
  276. package/src/storage/stores/settings-store.ts +34 -0
  277. package/src/storage/types.ts +182 -22
  278. package/src/tools/artifacts/ArtifactElement.ts +0 -1
  279. package/src/tools/artifacts/ArtifactPill.ts +25 -0
  280. package/src/tools/artifacts/Console.ts +93 -0
  281. package/src/tools/artifacts/DocxArtifact.ts +213 -0
  282. package/src/tools/artifacts/ExcelArtifact.ts +231 -0
  283. package/src/tools/artifacts/GenericArtifact.ts +117 -0
  284. package/src/tools/artifacts/HtmlArtifact.ts +64 -94
  285. package/src/tools/artifacts/ImageArtifact.ts +116 -0
  286. package/src/tools/artifacts/MarkdownArtifact.ts +0 -1
  287. package/src/tools/artifacts/PdfArtifact.ts +201 -0
  288. package/src/tools/artifacts/SvgArtifact.ts +0 -1
  289. package/src/tools/artifacts/TextArtifact.ts +0 -1
  290. package/src/tools/artifacts/artifacts-tool-renderer.ts +298 -0
  291. package/src/tools/artifacts/artifacts.ts +190 -366
  292. package/src/tools/artifacts/index.ts +1 -0
  293. package/src/tools/extract-document.ts +250 -0
  294. package/src/tools/index.ts +25 -14
  295. package/src/tools/javascript-repl.ts +138 -160
  296. package/src/tools/renderer-registry.ts +98 -0
  297. package/src/tools/renderers/BashRenderer.ts +33 -30
  298. package/src/tools/renderers/CalculateRenderer.ts +36 -31
  299. package/src/tools/renderers/DefaultRenderer.ts +84 -21
  300. package/src/tools/renderers/GetCurrentTimeRenderer.ts +68 -23
  301. package/src/tools/types.ts +10 -2
  302. package/src/utils/i18n.ts +203 -8
  303. package/dist/state/agent-session.d.ts.map +0 -1
  304. package/dist/state/agent-session.js.map +0 -1
  305. package/dist/state/transports/AppTransport.d.ts.map +0 -1
  306. package/dist/state/transports/ProviderTransport.d.ts.map +0 -1
  307. package/dist/state/transports/ProviderTransport.js.map +0 -1
  308. package/dist/state/transports/index.js.map +0 -1
  309. package/dist/state/transports/proxy-types.js.map +0 -1
  310. package/dist/state/transports/types.d.ts +0 -11
  311. package/dist/state/transports/types.d.ts.map +0 -1
  312. package/dist/storage/backends/chrome-storage-backend.d.ts +0 -18
  313. package/dist/storage/backends/chrome-storage-backend.d.ts.map +0 -1
  314. package/dist/storage/backends/chrome-storage-backend.js +0 -67
  315. package/dist/storage/backends/chrome-storage-backend.js.map +0 -1
  316. package/dist/storage/backends/indexeddb-backend.d.ts +0 -20
  317. package/dist/storage/backends/indexeddb-backend.d.ts.map +0 -1
  318. package/dist/storage/backends/indexeddb-backend.js +0 -89
  319. package/dist/storage/backends/indexeddb-backend.js.map +0 -1
  320. package/dist/storage/backends/local-storage-backend.d.ts +0 -18
  321. package/dist/storage/backends/local-storage-backend.d.ts.map +0 -1
  322. package/dist/storage/backends/local-storage-backend.js +0 -69
  323. package/dist/storage/backends/local-storage-backend.js.map +0 -1
  324. package/dist/storage/repositories/provider-keys-repository.d.ts +0 -34
  325. package/dist/storage/repositories/provider-keys-repository.d.ts.map +0 -1
  326. package/dist/storage/repositories/provider-keys-repository.js +0 -50
  327. package/dist/storage/repositories/provider-keys-repository.js.map +0 -1
  328. package/dist/storage/repositories/settings-repository.d.ts +0 -34
  329. package/dist/storage/repositories/settings-repository.d.ts.map +0 -1
  330. package/dist/storage/repositories/settings-repository.js +0 -46
  331. package/dist/storage/repositories/settings-repository.js.map +0 -1
  332. package/src/storage/backends/chrome-storage-backend.ts +0 -82
  333. package/src/storage/backends/indexeddb-backend.ts +0 -107
  334. package/src/storage/backends/local-storage-backend.ts +0 -74
  335. package/src/storage/repositories/provider-keys-repository.ts +0 -55
  336. package/src/storage/repositories/settings-repository.ts +0 -51
  337. /package/dist/{state → agent}/transports/index.d.ts +0 -0
  338. /package/dist/{state → agent}/transports/index.js +0 -0
  339. /package/dist/{state → agent}/transports/proxy-types.d.ts +0 -0
  340. /package/dist/{state → agent}/transports/proxy-types.js +0 -0
  341. /package/dist/{state → agent}/transports/types.js +0 -0
  342. /package/dist/{state → agent}/types.d.ts +0 -0
  343. /package/dist/{state → agent}/types.js +0 -0
  344. /package/src/{state → agent}/transports/index.ts +0 -0
  345. /package/src/{state → agent}/transports/proxy-types.ts +0 -0
  346. /package/src/{state → agent}/types.ts +0 -0
@@ -0,0 +1,33 @@
1
+ import type { StorageBackend, StoreConfig } from "./types.js";
2
+
3
+ /**
4
+ * Base class for all storage stores.
5
+ * Each store defines its IndexedDB schema and provides domain-specific methods.
6
+ */
7
+ export abstract class Store {
8
+ private backend: StorageBackend | null = null;
9
+
10
+ /**
11
+ * Returns the IndexedDB configuration for this store.
12
+ * Defines store name, key path, and indices.
13
+ */
14
+ abstract getConfig(): StoreConfig;
15
+
16
+ /**
17
+ * Sets the storage backend. Called by AppStorage after backend creation.
18
+ */
19
+ setBackend(backend: StorageBackend): void {
20
+ this.backend = backend;
21
+ }
22
+
23
+ /**
24
+ * Gets the storage backend. Throws if backend not set.
25
+ * Concrete stores must use this to access the backend.
26
+ */
27
+ protected getBackend(): StorageBackend {
28
+ if (!this.backend) {
29
+ throw new Error(`Backend not set on ${this.constructor.name}`);
30
+ }
31
+ return this.backend;
32
+ }
33
+ }
@@ -0,0 +1,33 @@
1
+ import { Store } from "../store.js";
2
+ import type { StoreConfig } from "../types.js";
3
+
4
+ /**
5
+ * Store for LLM provider API keys (Anthropic, OpenAI, etc.).
6
+ */
7
+ export class ProviderKeysStore extends Store {
8
+ getConfig(): StoreConfig {
9
+ return {
10
+ name: "provider-keys",
11
+ };
12
+ }
13
+
14
+ async get(provider: string): Promise<string | null> {
15
+ return this.getBackend().get("provider-keys", provider);
16
+ }
17
+
18
+ async set(provider: string, key: string): Promise<void> {
19
+ await this.getBackend().set("provider-keys", provider, key);
20
+ }
21
+
22
+ async delete(provider: string): Promise<void> {
23
+ await this.getBackend().delete("provider-keys", provider);
24
+ }
25
+
26
+ async list(): Promise<string[]> {
27
+ return this.getBackend().keys("provider-keys");
28
+ }
29
+
30
+ async has(provider: string): Promise<boolean> {
31
+ return this.getBackend().has("provider-keys", provider);
32
+ }
33
+ }
@@ -0,0 +1,130 @@
1
+ import { Store } from "../store.js";
2
+ import type { SessionData, SessionMetadata, StoreConfig } from "../types.js";
3
+
4
+ /**
5
+ * Store for chat sessions (data and metadata).
6
+ * Uses two object stores: sessions (full data) and sessions-metadata (lightweight).
7
+ */
8
+ export class SessionsStore extends Store {
9
+ getConfig(): StoreConfig {
10
+ return {
11
+ name: "sessions",
12
+ keyPath: "id",
13
+ indices: [{ name: "lastModified", keyPath: "lastModified" }],
14
+ };
15
+ }
16
+
17
+ /**
18
+ * Additional config for sessions-metadata store.
19
+ * Must be included when creating the backend.
20
+ */
21
+ static getMetadataConfig(): StoreConfig {
22
+ return {
23
+ name: "sessions-metadata",
24
+ keyPath: "id",
25
+ indices: [{ name: "lastModified", keyPath: "lastModified" }],
26
+ };
27
+ }
28
+
29
+ async save(data: SessionData, metadata: SessionMetadata): Promise<void> {
30
+ await this.getBackend().transaction(["sessions", "sessions-metadata"], "readwrite", async (tx) => {
31
+ await tx.set("sessions", data.id, data);
32
+ await tx.set("sessions-metadata", metadata.id, metadata);
33
+ });
34
+ }
35
+
36
+ async get(id: string): Promise<SessionData | null> {
37
+ return this.getBackend().get("sessions", id);
38
+ }
39
+
40
+ async getMetadata(id: string): Promise<SessionMetadata | null> {
41
+ return this.getBackend().get("sessions-metadata", id);
42
+ }
43
+
44
+ async getAllMetadata(): Promise<SessionMetadata[]> {
45
+ // Use the lastModified index to get sessions sorted by most recent first
46
+ return this.getBackend().getAllFromIndex<SessionMetadata>("sessions-metadata", "lastModified", "desc");
47
+ }
48
+
49
+ async delete(id: string): Promise<void> {
50
+ await this.getBackend().transaction(["sessions", "sessions-metadata"], "readwrite", async (tx) => {
51
+ await tx.delete("sessions", id);
52
+ await tx.delete("sessions-metadata", id);
53
+ });
54
+ }
55
+
56
+ // Alias for backward compatibility
57
+ async deleteSession(id: string): Promise<void> {
58
+ return this.delete(id);
59
+ }
60
+
61
+ async updateTitle(id: string, title: string): Promise<void> {
62
+ const metadata = await this.getMetadata(id);
63
+ if (metadata) {
64
+ metadata.title = title;
65
+ await this.getBackend().set("sessions-metadata", id, metadata);
66
+ }
67
+
68
+ // Also update in full session data
69
+ const data = await this.get(id);
70
+ if (data) {
71
+ data.title = title;
72
+ await this.getBackend().set("sessions", id, data);
73
+ }
74
+ }
75
+
76
+ async getQuotaInfo(): Promise<{ usage: number; quota: number; percent: number }> {
77
+ return this.getBackend().getQuotaInfo();
78
+ }
79
+
80
+ async requestPersistence(): Promise<boolean> {
81
+ return this.getBackend().requestPersistence();
82
+ }
83
+
84
+ // Alias methods for backward compatibility
85
+ async saveSession(id: string, state: any, metadata: SessionMetadata | undefined, title?: string): Promise<void> {
86
+ // If metadata is provided, use it; otherwise create it from state
87
+ const meta: SessionMetadata = metadata || {
88
+ id,
89
+ title: title || "",
90
+ createdAt: new Date().toISOString(),
91
+ lastModified: new Date().toISOString(),
92
+ messageCount: state.messages?.length || 0,
93
+ usage: state.usage || {
94
+ input: 0,
95
+ output: 0,
96
+ cacheRead: 0,
97
+ cacheWrite: 0,
98
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
99
+ },
100
+ modelId: state.model?.id || null,
101
+ thinkingLevel: state.thinkingLevel || "off",
102
+ preview: "",
103
+ };
104
+
105
+ const data: SessionData = {
106
+ id,
107
+ title: title || meta.title,
108
+ model: state.model,
109
+ thinkingLevel: state.thinkingLevel,
110
+ messages: state.messages || [],
111
+ createdAt: meta.createdAt,
112
+ lastModified: new Date().toISOString(),
113
+ };
114
+
115
+ await this.save(data, meta);
116
+ }
117
+
118
+ async loadSession(id: string): Promise<SessionData | null> {
119
+ return this.get(id);
120
+ }
121
+
122
+ async getLatestSessionId(): Promise<string | null> {
123
+ const allMetadata = await this.getAllMetadata();
124
+ if (allMetadata.length === 0) return null;
125
+
126
+ // Sort by lastModified descending
127
+ allMetadata.sort((a, b) => b.lastModified.localeCompare(a.lastModified));
128
+ return allMetadata[0].id;
129
+ }
130
+ }
@@ -0,0 +1,34 @@
1
+ import { Store } from "../store.js";
2
+ import type { StoreConfig } from "../types.js";
3
+
4
+ /**
5
+ * Store for application settings (theme, proxy config, etc.).
6
+ */
7
+ export class SettingsStore extends Store {
8
+ getConfig(): StoreConfig {
9
+ return {
10
+ name: "settings",
11
+ // No keyPath - uses out-of-line keys
12
+ };
13
+ }
14
+
15
+ async get<T>(key: string): Promise<T | null> {
16
+ return this.getBackend().get("settings", key);
17
+ }
18
+
19
+ async set<T>(key: string, value: T): Promise<void> {
20
+ await this.getBackend().set("settings", key, value);
21
+ }
22
+
23
+ async delete(key: string): Promise<void> {
24
+ await this.getBackend().delete("settings", key);
25
+ }
26
+
27
+ async list(): Promise<string[]> {
28
+ return this.getBackend().keys("settings");
29
+ }
30
+
31
+ async clear(): Promise<void> {
32
+ await this.getBackend().clear("settings");
33
+ }
34
+ }
@@ -1,48 +1,208 @@
1
+ import type { Model } from "@mariozechner/pi-ai";
2
+ import type { ThinkingLevel } from "../agent/agent.js";
3
+ import type { AppMessage } from "../components/Messages.js";
4
+
5
+ /**
6
+ * Transaction interface for atomic operations across stores.
7
+ */
8
+ export interface StorageTransaction {
9
+ /**
10
+ * Get a value by key from a specific store.
11
+ */
12
+ get<T = unknown>(storeName: string, key: string): Promise<T | null>;
13
+
14
+ /**
15
+ * Set a value for a key in a specific store.
16
+ */
17
+ set<T = unknown>(storeName: string, key: string, value: T): Promise<void>;
18
+
19
+ /**
20
+ * Delete a key from a specific store.
21
+ */
22
+ delete(storeName: string, key: string): Promise<void>;
23
+ }
24
+
1
25
  /**
2
26
  * Base interface for all storage backends.
3
- * Provides a simple key-value storage abstraction that can be implemented
4
- * by localStorage, IndexedDB, chrome.storage, or remote APIs.
27
+ * Multi-store key-value storage abstraction that can be implemented
28
+ * by IndexedDB, remote APIs, or any other multi-collection storage system.
5
29
  */
6
30
  export interface StorageBackend {
7
31
  /**
8
- * Get a value by key. Returns null if key doesn't exist.
32
+ * Get a value by key from a specific store. Returns null if key doesn't exist.
9
33
  */
10
- get<T = unknown>(key: string): Promise<T | null>;
34
+ get<T = unknown>(storeName: string, key: string): Promise<T | null>;
11
35
 
12
36
  /**
13
- * Set a value for a key.
37
+ * Set a value for a key in a specific store.
14
38
  */
15
- set<T = unknown>(key: string, value: T): Promise<void>;
39
+ set<T = unknown>(storeName: string, key: string, value: T): Promise<void>;
16
40
 
17
41
  /**
18
- * Delete a key.
42
+ * Delete a key from a specific store.
19
43
  */
20
- delete(key: string): Promise<void>;
44
+ delete(storeName: string, key: string): Promise<void>;
21
45
 
22
46
  /**
23
- * Get all keys.
47
+ * Get all keys from a specific store, optionally filtered by prefix.
24
48
  */
25
- keys(): Promise<string[]>;
49
+ keys(storeName: string, prefix?: string): Promise<string[]>;
26
50
 
27
51
  /**
28
- * Clear all data.
52
+ * Get all values from a specific store, ordered by an index.
53
+ * @param storeName - The store to query
54
+ * @param indexName - The index to use for ordering
55
+ * @param direction - Sort direction ("asc" or "desc")
29
56
  */
30
- clear(): Promise<void>;
57
+ getAllFromIndex<T = unknown>(storeName: string, indexName: string, direction?: "asc" | "desc"): Promise<T[]>;
31
58
 
32
59
  /**
33
- * Check if a key exists.
60
+ * Clear all data from a specific store.
34
61
  */
35
- has(key: string): Promise<boolean>;
62
+ clear(storeName: string): Promise<void>;
63
+
64
+ /**
65
+ * Check if a key exists in a specific store.
66
+ */
67
+ has(storeName: string, key: string): Promise<boolean>;
68
+
69
+ /**
70
+ * Execute atomic operations across multiple stores.
71
+ */
72
+ transaction<T>(
73
+ storeNames: string[],
74
+ mode: "readonly" | "readwrite",
75
+ operation: (tx: StorageTransaction) => Promise<T>,
76
+ ): Promise<T>;
77
+
78
+ /**
79
+ * Get storage quota information.
80
+ * Used for warning users when approaching limits.
81
+ */
82
+ getQuotaInfo(): Promise<{ usage: number; quota: number; percent: number }>;
83
+
84
+ /**
85
+ * Request persistent storage (prevents eviction).
86
+ * Returns true if granted, false otherwise.
87
+ */
88
+ requestPersistence(): Promise<boolean>;
89
+ }
90
+
91
+ /**
92
+ * Lightweight session metadata for listing and searching.
93
+ * Stored separately from full session data for performance.
94
+ */
95
+ export interface SessionMetadata {
96
+ /** Unique session identifier (UUID v4) */
97
+ id: string;
98
+
99
+ /** User-defined title or auto-generated from first message */
100
+ title: string;
101
+
102
+ /** ISO 8601 UTC timestamp of creation */
103
+ createdAt: string;
104
+
105
+ /** ISO 8601 UTC timestamp of last modification */
106
+ lastModified: string;
107
+
108
+ /** Total number of messages (user + assistant + tool results) */
109
+ messageCount: number;
110
+
111
+ /** Cumulative usage statistics */
112
+ usage: {
113
+ /** Total input tokens */
114
+ input: number;
115
+ /** Total output tokens */
116
+ output: number;
117
+ /** Total cache read tokens */
118
+ cacheRead: number;
119
+ /** Total cache write tokens */
120
+ cacheWrite: number;
121
+ /** Total cost breakdown */
122
+ cost: {
123
+ input: number;
124
+ output: number;
125
+ cacheRead: number;
126
+ cacheWrite: number;
127
+ total: number;
128
+ };
129
+ };
130
+
131
+ /** Last used model ID (e.g., "claude-sonnet-4") */
132
+ modelId: string | null;
133
+
134
+ /** Last used thinking level */
135
+ thinkingLevel: ThinkingLevel;
136
+
137
+ /**
138
+ * Preview text for search and display.
139
+ * First 2KB of conversation text (user + assistant messages in sequence).
140
+ * Tool calls and tool results are excluded.
141
+ */
142
+ preview: string;
143
+ }
144
+
145
+ /**
146
+ * Full session data including all messages.
147
+ * Only loaded when user opens a specific session.
148
+ */
149
+ export interface SessionData {
150
+ /** Unique session identifier (UUID v4) */
151
+ id: string;
152
+
153
+ /** User-defined title or auto-generated from first message */
154
+ title: string;
155
+
156
+ /** Last selected model */
157
+ model: Model<any>;
158
+
159
+ /** Last selected thinking level */
160
+ thinkingLevel: ThinkingLevel;
161
+
162
+ /** Full conversation history (with attachments inline) */
163
+ messages: AppMessage[];
164
+
165
+ /** ISO 8601 UTC timestamp of creation */
166
+ createdAt: string;
167
+
168
+ /** ISO 8601 UTC timestamp of last modification */
169
+ lastModified: string;
170
+ }
171
+
172
+ /**
173
+ * Configuration for IndexedDB backend.
174
+ */
175
+ export interface IndexedDBConfig {
176
+ /** Database name */
177
+ dbName: string;
178
+ /** Database version */
179
+ version: number;
180
+ /** Object stores to create */
181
+ stores: StoreConfig[];
182
+ }
183
+
184
+ /**
185
+ * Configuration for an IndexedDB object store.
186
+ */
187
+ export interface StoreConfig {
188
+ /** Store name */
189
+ name: string;
190
+ /** Key path (optional, for auto-extracting keys from objects) */
191
+ keyPath?: string;
192
+ /** Auto-increment keys (optional) */
193
+ autoIncrement?: boolean;
194
+ /** Indices to create on this store */
195
+ indices?: IndexConfig[];
36
196
  }
37
197
 
38
198
  /**
39
- * Options for configuring AppStorage.
199
+ * Configuration for an IndexedDB index.
40
200
  */
41
- export interface AppStorageConfig {
42
- /** Backend for simple settings (proxy, theme, etc.) */
43
- settings?: StorageBackend;
44
- /** Backend for provider API keys */
45
- providerKeys?: StorageBackend;
46
- /** Backend for sessions (chat history, attachments) */
47
- sessions?: StorageBackend;
201
+ export interface IndexConfig {
202
+ /** Index name */
203
+ name: string;
204
+ /** Key path to index on */
205
+ keyPath: string;
206
+ /** Unique constraint (optional) */
207
+ unique?: boolean;
48
208
  }
@@ -2,7 +2,6 @@ import { LitElement, type TemplateResult } from "lit";
2
2
 
3
3
  export abstract class ArtifactElement extends LitElement {
4
4
  public filename = "";
5
- public displayTitle = "";
6
5
 
7
6
  protected override createRenderRoot(): HTMLElement | DocumentFragment {
8
7
  return this; // light DOM for shared styles
@@ -0,0 +1,25 @@
1
+ import { html, icon, type TemplateResult } from "@mariozechner/mini-lit";
2
+ import { FileCode2 } from "lucide";
3
+ import type { ArtifactsPanel } from "./artifacts.js";
4
+
5
+ export function ArtifactPill(filename: string, artifactsPanel?: ArtifactsPanel): TemplateResult {
6
+ const handleClick = (e: Event) => {
7
+ if (!artifactsPanel) return;
8
+ e.preventDefault();
9
+ e.stopPropagation();
10
+ // openArtifact will show the artifact and call onOpen() to open the panel if needed
11
+ artifactsPanel.openArtifact(filename);
12
+ };
13
+
14
+ return html`
15
+ <span
16
+ class="inline-flex items-center gap-1 px-2 py-0.5 text-xs bg-muted/50 border border-border rounded ${
17
+ artifactsPanel ? "cursor-pointer hover:bg-muted transition-colors" : ""
18
+ }"
19
+ @click=${artifactsPanel ? handleClick : null}
20
+ >
21
+ ${icon(FileCode2, "sm")}
22
+ <span class="text-foreground">${filename}</span>
23
+ </span>
24
+ `;
25
+ }
@@ -0,0 +1,93 @@
1
+ import { icon } from "@mariozechner/mini-lit";
2
+ import "@mariozechner/mini-lit/dist/CopyButton.js";
3
+ import { html, LitElement, type TemplateResult } from "lit";
4
+ import { customElement, property, state } from "lit/decorators.js";
5
+ import { createRef, type Ref, ref } from "lit/directives/ref.js";
6
+ import { repeat } from "lit/directives/repeat.js";
7
+ import { ChevronDown, ChevronRight, ChevronsDown, Lock } from "lucide";
8
+ import { i18n } from "../../utils/i18n.js";
9
+
10
+ interface LogEntry {
11
+ type: "log" | "error";
12
+ text: string;
13
+ }
14
+
15
+ @customElement("artifact-console")
16
+ export class Console extends LitElement {
17
+ @property({ attribute: false }) logs: LogEntry[] = [];
18
+ @state() private expanded = false;
19
+ @state() private autoscroll = true;
20
+ private logsContainerRef: Ref<HTMLDivElement> = createRef();
21
+
22
+ protected createRenderRoot() {
23
+ return this; // light DOM
24
+ }
25
+
26
+ override updated() {
27
+ // Autoscroll to bottom when new logs arrive
28
+ if (this.autoscroll && this.expanded && this.logsContainerRef.value) {
29
+ this.logsContainerRef.value.scrollTop = this.logsContainerRef.value.scrollHeight;
30
+ }
31
+ }
32
+
33
+ private getLogsText(): string {
34
+ return this.logs.map((l) => `[${l.type}] ${l.text}`).join("\n");
35
+ }
36
+
37
+ override render(): TemplateResult {
38
+ const errorCount = this.logs.filter((l) => l.type === "error").length;
39
+ const summary =
40
+ errorCount > 0
41
+ ? `${i18n("console")} (${errorCount} ${errorCount === 1 ? "error" : "errors"})`
42
+ : `${i18n("console")} (${this.logs.length})`;
43
+
44
+ return html`
45
+ <div class="border-t border-border p-2">
46
+ <div class="flex items-center gap-2 w-full">
47
+ <button
48
+ @click=${() => {
49
+ this.expanded = !this.expanded;
50
+ }}
51
+ class="flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors flex-1 text-left"
52
+ >
53
+ ${icon(this.expanded ? ChevronDown : ChevronRight, "sm")}
54
+ <span>${summary}</span>
55
+ </button>
56
+ ${
57
+ this.expanded
58
+ ? html`
59
+ <button
60
+ @click=${() => {
61
+ this.autoscroll = !this.autoscroll;
62
+ }}
63
+ class="p-1 rounded transition-colors ${this.autoscroll ? "bg-accent text-accent-foreground" : "hover:bg-muted"}"
64
+ title=${this.autoscroll ? i18n("Autoscroll enabled") : i18n("Autoscroll disabled")}
65
+ >
66
+ ${icon(this.autoscroll ? ChevronsDown : Lock, "sm")}
67
+ </button>
68
+ <copy-button .text=${this.getLogsText()} title=${i18n("Copy logs")} .showText=${false} class="!bg-transparent hover:!bg-accent"></copy-button>
69
+ `
70
+ : ""
71
+ }
72
+ </div>
73
+ ${
74
+ this.expanded
75
+ ? html`
76
+ <div class="max-h-48 overflow-y-auto space-y-1 mt-2" ${ref(this.logsContainerRef)}>
77
+ ${repeat(
78
+ this.logs,
79
+ (_log, index) => index,
80
+ (log) => html`
81
+ <div class="text-xs font-mono ${log.type === "error" ? "text-destructive" : "text-muted-foreground"}">
82
+ [${log.type}] ${log.text}
83
+ </div>
84
+ `,
85
+ )}
86
+ </div>
87
+ `
88
+ : ""
89
+ }
90
+ </div>
91
+ `;
92
+ }
93
+ }