@mariozechner/pi-web-ui 0.5.44 → 0.5.45

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
package/src/ChatPanel.ts CHANGED
@@ -1,29 +1,29 @@
1
1
  import { Badge, html } from "@mariozechner/mini-lit";
2
- import { type AgentTool, getModel } from "@mariozechner/pi-ai";
3
2
  import { LitElement } from "lit";
4
- import { customElement, property, state } from "lit/decorators.js";
3
+ import { customElement, state } from "lit/decorators.js";
4
+ import type { Agent } from "./agent/agent.js";
5
5
  import "./components/AgentInterface.js";
6
- import { AgentSession, type AgentSessionState, type ThinkingLevel } from "./state/agent-session.js";
7
- import { ArtifactsPanel } from "./tools/artifacts/index.js";
8
- import { createJavaScriptReplTool } from "./tools/javascript-repl.js";
6
+ import type { AgentTool } from "@mariozechner/pi-ai";
7
+ import type { AgentInterface } from "./components/AgentInterface.js";
8
+ import { ArtifactsRuntimeProvider } from "./components/sandbox/ArtifactsRuntimeProvider.js";
9
+ import { AttachmentsRuntimeProvider } from "./components/sandbox/AttachmentsRuntimeProvider.js";
10
+ import type { SandboxRuntimeProvider } from "./components/sandbox/SandboxRuntimeProvider.js";
11
+ import { ArtifactsPanel, ArtifactsToolRenderer } from "./tools/artifacts/index.js";
9
12
  import { registerToolRenderer } from "./tools/renderer-registry.js";
10
- import { getAuthToken } from "./utils/auth-token.js";
13
+ import type { Attachment } from "./utils/attachment-utils.js";
11
14
  import { i18n } from "./utils/i18n.js";
12
15
 
13
16
  const BREAKPOINT = 800; // px - switch between overlay and side-by-side
14
17
 
15
18
  @customElement("pi-chat-panel")
16
19
  export class ChatPanel extends LitElement {
17
- @state() private session!: AgentSession;
18
- @state() private artifactsPanel!: ArtifactsPanel;
20
+ @state() public agent?: Agent;
21
+ @state() public agentInterface?: AgentInterface;
22
+ @state() public artifactsPanel?: ArtifactsPanel;
19
23
  @state() private hasArtifacts = false;
20
24
  @state() private artifactCount = 0;
21
25
  @state() private showArtifactsPanel = false;
22
- @state() private windowWidth = window.innerWidth;
23
- @property({ type: String }) systemPrompt = "You are a helpful AI assistant.";
24
- @property({ type: Array }) additionalTools: AgentTool<any, any>[] = [];
25
- @property({ attribute: false }) sandboxUrlProvider?: () => string;
26
- @property({ attribute: false }) onApiKeyRequired?: (provider: string) => Promise<boolean>;
26
+ @state() private windowWidth = 0;
27
27
 
28
28
  private resizeHandler = () => {
29
29
  this.windowWidth = window.innerWidth;
@@ -34,64 +34,89 @@ export class ChatPanel extends LitElement {
34
34
  return this;
35
35
  }
36
36
 
37
- override async connectedCallback() {
37
+ override connectedCallback() {
38
38
  super.connectedCallback();
39
-
40
- // Listen to window resize
39
+ this.windowWidth = window.innerWidth; // Set initial width after connection
41
40
  window.addEventListener("resize", this.resizeHandler);
42
-
43
- // Ensure panel fills height and allows flex layout
44
41
  this.style.display = "flex";
45
42
  this.style.flexDirection = "column";
46
43
  this.style.height = "100%";
47
44
  this.style.minHeight = "0";
45
+ // Update width after initial render
46
+ requestAnimationFrame(() => {
47
+ this.windowWidth = window.innerWidth;
48
+ this.requestUpdate();
49
+ });
50
+ }
48
51
 
49
- // Create JavaScript REPL tool with attachments provider
50
- const javascriptReplTool = createJavaScriptReplTool();
51
- if (this.sandboxUrlProvider) {
52
- javascriptReplTool.sandboxUrlProvider = this.sandboxUrlProvider;
53
- }
52
+ override disconnectedCallback() {
53
+ super.disconnectedCallback();
54
+ window.removeEventListener("resize", this.resizeHandler);
55
+ }
56
+
57
+ async setAgent(
58
+ agent: Agent,
59
+ config?: {
60
+ onApiKeyRequired?: (provider: string) => Promise<boolean>;
61
+ onBeforeSend?: () => void | Promise<void>;
62
+ sandboxUrlProvider?: () => string;
63
+ toolsFactory?: (
64
+ agent: Agent,
65
+ agentInterface: AgentInterface,
66
+ artifactsPanel: ArtifactsPanel,
67
+ runtimeProvidersFactory: () => SandboxRuntimeProvider[],
68
+ ) => AgentTool<any>[];
69
+ },
70
+ ) {
71
+ this.agent = agent;
72
+
73
+ // Create AgentInterface
74
+ this.agentInterface = document.createElement("agent-interface") as AgentInterface;
75
+ this.agentInterface.session = agent;
76
+ this.agentInterface.enableAttachments = true;
77
+ this.agentInterface.enableModelSelector = true;
78
+ this.agentInterface.enableThinkingSelector = true;
79
+ this.agentInterface.showThemeToggle = false;
80
+ this.agentInterface.onApiKeyRequired = config?.onApiKeyRequired;
81
+ this.agentInterface.onBeforeSend = config?.onBeforeSend;
54
82
 
55
83
  // Set up artifacts panel
56
84
  this.artifactsPanel = new ArtifactsPanel();
57
- if (this.sandboxUrlProvider) {
58
- this.artifactsPanel.sandboxUrlProvider = this.sandboxUrlProvider;
85
+ this.artifactsPanel.agent = agent; // Pass agent for HTML artifact runtime providers
86
+ if (config?.sandboxUrlProvider) {
87
+ this.artifactsPanel.sandboxUrlProvider = config.sandboxUrlProvider;
59
88
  }
60
- registerToolRenderer("artifacts", this.artifactsPanel);
89
+ // Register the standalone tool renderer (not the panel itself)
90
+ registerToolRenderer("artifacts", new ArtifactsToolRenderer(this.artifactsPanel));
61
91
 
62
- // Attachments provider for both REPL and artifacts
63
- const getAttachments = () => {
64
- // Get all attachments from conversation messages
65
- const attachments: any[] = [];
66
- for (const message of this.session.state.messages) {
92
+ // Runtime providers factory for REPL tools (read-write access)
93
+ const runtimeProvidersFactory = () => {
94
+ const attachments: Attachment[] = [];
95
+ for (const message of this.agent!.state.messages) {
67
96
  if (message.role === "user") {
68
- const content = Array.isArray(message.content) ? message.content : [message.content];
69
- for (const block of content) {
70
- if (typeof block !== "string" && block.type === "image") {
71
- attachments.push({
72
- id: `image-${attachments.length}`,
73
- fileName: "image.png",
74
- mimeType: block.mimeType || "image/png",
75
- size: 0,
76
- content: block.data,
77
- });
78
- }
79
- }
97
+ message.attachments?.forEach((a) => {
98
+ attachments.push(a);
99
+ });
80
100
  }
81
101
  }
82
- return attachments;
83
- };
102
+ const providers: SandboxRuntimeProvider[] = [];
103
+
104
+ // Add attachments provider if there are attachments
105
+ if (attachments.length > 0) {
106
+ providers.push(new AttachmentsRuntimeProvider(attachments));
107
+ }
108
+
109
+ // Add artifacts provider with read-write access (for REPL)
110
+ providers.push(new ArtifactsRuntimeProvider(this.artifactsPanel!, this.agent!, true));
84
111
 
85
- javascriptReplTool.attachmentsProvider = getAttachments;
86
- this.artifactsPanel.attachmentsProvider = getAttachments;
112
+ return providers;
113
+ };
87
114
 
88
115
  this.artifactsPanel.onArtifactsChange = () => {
89
- const count = this.artifactsPanel.artifacts?.size ?? 0;
116
+ const count = this.artifactsPanel?.artifacts?.size ?? 0;
90
117
  const created = count > this.artifactCount;
91
118
  this.hasArtifacts = count > 0;
92
119
  this.artifactCount = count;
93
-
94
- // Auto-open when new artifacts are created
95
120
  if (this.hasArtifacts && created) {
96
121
  this.showArtifactsPanel = true;
97
122
  }
@@ -108,48 +133,30 @@ export class ChatPanel extends LitElement {
108
133
  this.requestUpdate();
109
134
  };
110
135
 
111
- const initialState = {
112
- systemPrompt: this.systemPrompt,
113
- model: getModel("anthropic", "claude-sonnet-4-5-20250929"),
114
- tools: [...this.additionalTools, javascriptReplTool, this.artifactsPanel.tool],
115
- thinkingLevel: "off" as ThinkingLevel,
116
- messages: [],
117
- } satisfies Partial<AgentSessionState>;
118
- // initialState = { ...initialState, ...(simpleHtml as any) };
119
- // initialState = { ...initialState, ...(longSession as any) };
120
-
121
- // Create agent session first so attachments provider works
122
- this.session = new AgentSession({
123
- initialState,
124
- authTokenProvider: async () => getAuthToken(),
125
- transportMode: "provider", // Use provider mode by default (API keys from storage, optional CORS proxy)
126
- });
136
+ // Set tools on the agent
137
+ // Pass runtimeProvidersFactory so consumers can configure their own REPL tools
138
+ const additionalTools =
139
+ config?.toolsFactory?.(agent, this.agentInterface, this.artifactsPanel, runtimeProvidersFactory) || [];
140
+ const tools = [this.artifactsPanel.tool, ...additionalTools];
141
+ this.agent.setTools(tools);
127
142
 
128
- // Reconstruct artifacts panel from initial messages (session must exist first)
129
- await this.artifactsPanel.reconstructFromMessages(initialState.messages);
130
- this.hasArtifacts = this.artifactsPanel.artifacts.size > 0;
131
- }
143
+ // Reconstruct artifacts from existing messages
144
+ // Temporarily disable the onArtifactsChange callback to prevent auto-opening on load
145
+ const originalCallback = this.artifactsPanel.onArtifactsChange;
146
+ this.artifactsPanel.onArtifactsChange = undefined;
147
+ await this.artifactsPanel.reconstructFromMessages(this.agent.state.messages);
148
+ this.artifactsPanel.onArtifactsChange = originalCallback;
132
149
 
133
- override disconnectedCallback() {
134
- super.disconnectedCallback();
135
- window.removeEventListener("resize", this.resizeHandler);
136
- }
150
+ this.hasArtifacts = this.artifactsPanel.artifacts.size > 0;
151
+ this.artifactCount = this.artifactsPanel.artifacts.size;
137
152
 
138
- // Expose method to toggle artifacts panel
139
- public toggleArtifactsPanel() {
140
- this.showArtifactsPanel = !this.showArtifactsPanel;
141
153
  this.requestUpdate();
142
154
  }
143
155
 
144
- // Check if artifacts panel is currently visible
145
- public get artifactsPanelVisible(): boolean {
146
- return this.showArtifactsPanel;
147
- }
148
-
149
156
  render() {
150
- if (!this.session) {
157
+ if (!this.agent || !this.agentInterface) {
151
158
  return html`<div class="flex items-center justify-center h-full">
152
- <div class="text-muted-foreground">Loading...</div>
159
+ <div class="text-muted-foreground">No agent set</div>
153
160
  </div>`;
154
161
  }
155
162
 
@@ -164,15 +171,7 @@ export class ChatPanel extends LitElement {
164
171
  return html`
165
172
  <div class="relative w-full h-full overflow-hidden flex">
166
173
  <div class="h-full" style="${!isMobile && this.showArtifactsPanel && this.hasArtifacts ? "width: 50%;" : "width: 100%;"}">
167
- <agent-interface
168
- .session=${this.session}
169
- .enableAttachments=${true}
170
- .enableModelSelector=${true}
171
- .enableThinking=${true}
172
- .showThemeToggle=${false}
173
- .showDebugToggle=${false}
174
- .onApiKeyRequired=${this.onApiKeyRequired}
175
- ></agent-interface>
174
+ ${this.agentInterface}
176
175
  </div>
177
176
 
178
177
  <!-- Floating pill when artifacts exist and panel is collapsed -->
@@ -190,14 +189,7 @@ export class ChatPanel extends LitElement {
190
189
  ${Badge(html`
191
190
  <span class="inline-flex items-center gap-1">
192
191
  <span>${i18n("Artifacts")}</span>
193
- ${
194
- this.artifactCount > 1
195
- ? html`<span
196
- class="text-[10px] leading-none bg-primary-foreground/20 text-primary-foreground rounded px-1 font-mono tabular-nums"
197
- >${this.artifactCount}</span
198
- >`
199
- : ""
200
- }
192
+ <span class="text-[10px] leading-none bg-primary-foreground/20 text-primary-foreground rounded px-1 font-mono tabular-nums">${this.artifactCount}</span>
201
193
  </span>
202
194
  `)}
203
195
  </button>
@@ -1,4 +1,4 @@
1
- import type { Context } from "@mariozechner/pi-ai";
1
+ import type { Context, QueuedMessage } from "@mariozechner/pi-ai";
2
2
  import {
3
3
  type AgentTool,
4
4
  type AssistantMessage as AssistantMessageType,
@@ -10,17 +10,31 @@ import {
10
10
  } from "@mariozechner/pi-ai";
11
11
  import type { AppMessage } from "../components/Messages.js";
12
12
  import type { Attachment } from "../utils/attachment-utils.js";
13
- import { AppTransport } from "./transports/AppTransport.js";
14
- import { ProviderTransport } from "./transports/ProviderTransport.js";
15
13
  import type { AgentRunConfig, AgentTransport } from "./transports/types.js";
16
14
  import type { DebugLogEntry } from "./types.js";
17
15
 
16
+ // Default transformer: Keep only LLM-compatible messages, strip app-specific fields
17
+ function defaultMessageTransformer(messages: AppMessage[]): Message[] {
18
+ return messages
19
+ .filter((m) => {
20
+ // Only keep standard LLM message roles
21
+ return m.role === "user" || m.role === "assistant" || m.role === "toolResult";
22
+ })
23
+ .map((m) => {
24
+ if (m.role === "user") {
25
+ // Strip attachments field (app-specific)
26
+ const { attachments, ...rest } = m as any;
27
+ return rest as Message;
28
+ }
29
+ return m as Message;
30
+ });
31
+ }
32
+
18
33
  export type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high";
19
34
 
20
- export interface AgentSessionState {
21
- id: string;
35
+ export interface AgentState {
22
36
  systemPrompt: string;
23
- model: Model<any> | null;
37
+ model: Model<any>;
24
38
  thinkingLevel: ThinkingLevel;
25
39
  tools: AgentTool<any>[];
26
40
  messages: AppMessage[];
@@ -30,24 +44,23 @@ export interface AgentSessionState {
30
44
  error?: string;
31
45
  }
32
46
 
33
- export type AgentSessionEvent =
34
- | { type: "state-update"; state: AgentSessionState }
47
+ export type AgentEvent =
48
+ | { type: "state-update"; state: AgentState }
35
49
  | { type: "error-no-model" }
36
- | { type: "error-no-api-key"; provider: string };
37
-
38
- export type TransportMode = "provider" | "app";
50
+ | { type: "error-no-api-key"; provider: string }
51
+ | { type: "started" }
52
+ | { type: "completed" };
39
53
 
40
- export interface AgentSessionOptions {
41
- initialState?: Partial<AgentSessionState>;
42
- messagePreprocessor?: (messages: AppMessage[]) => Promise<Message[]>;
54
+ export interface AgentOptions {
55
+ initialState?: Partial<AgentState>;
43
56
  debugListener?: (entry: DebugLogEntry) => void;
44
- transportMode?: TransportMode;
45
- authTokenProvider?: () => Promise<string | undefined>;
57
+ transport: AgentTransport;
58
+ // Transform app messages to LLM-compatible messages before sending to transport
59
+ messageTransformer?: (messages: AppMessage[]) => Message[] | Promise<Message[]>;
46
60
  }
47
61
 
48
- export class AgentSession {
49
- private _state: AgentSessionState = {
50
- id: "default",
62
+ export class Agent {
63
+ private _state: AgentState = {
51
64
  systemPrompt: "",
52
65
  model: getModel("google", "gemini-2.5-flash-lite-preview-06-17"),
53
66
  thinkingLevel: "off",
@@ -58,42 +71,25 @@ export class AgentSession {
58
71
  pendingToolCalls: new Set<string>(),
59
72
  error: undefined,
60
73
  };
61
- private listeners = new Set<(e: AgentSessionEvent) => void>();
74
+ private listeners = new Set<(e: AgentEvent) => void>();
62
75
  private abortController?: AbortController;
63
76
  private transport: AgentTransport;
64
- private messagePreprocessor?: (messages: AppMessage[]) => Promise<Message[]>;
65
77
  private debugListener?: (entry: DebugLogEntry) => void;
78
+ private messageTransformer: (messages: AppMessage[]) => Message[] | Promise<Message[]>;
79
+ private messageQueue: Array<QueuedMessage<AppMessage>> = [];
66
80
 
67
- constructor(opts: AgentSessionOptions = {}) {
81
+ constructor(opts: AgentOptions) {
68
82
  this._state = { ...this._state, ...opts.initialState };
69
- this.messagePreprocessor = opts.messagePreprocessor;
70
83
  this.debugListener = opts.debugListener;
71
-
72
- const mode = opts.transportMode || "provider";
73
-
74
- if (mode === "app") {
75
- this.transport = new AppTransport(async () => this.preprocessMessages());
76
- } else {
77
- this.transport = new ProviderTransport(async () => this.preprocessMessages());
78
- }
79
- }
80
-
81
- private async preprocessMessages(): Promise<Message[]> {
82
- const filtered = this._state.messages.map((m) => {
83
- if (m.role === "user") {
84
- const { attachments, ...rest } = m as AppMessage & { attachments?: Attachment[] };
85
- return rest;
86
- }
87
- return m;
88
- });
89
- return this.messagePreprocessor ? this.messagePreprocessor(filtered as AppMessage[]) : (filtered as Message[]);
84
+ this.transport = opts.transport;
85
+ this.messageTransformer = opts.messageTransformer || defaultMessageTransformer;
90
86
  }
91
87
 
92
- get state(): AgentSessionState {
88
+ get state(): AgentState {
93
89
  return this._state;
94
90
  }
95
91
 
96
- subscribe(fn: (e: AgentSessionEvent) => void): () => void {
92
+ subscribe(fn: (e: AgentEvent) => void): () => void {
97
93
  this.listeners.add(fn);
98
94
  fn({ type: "state-update", state: this._state });
99
95
  return () => this.listeners.delete(fn);
@@ -103,7 +99,7 @@ export class AgentSession {
103
99
  setSystemPrompt(v: string) {
104
100
  this.patch({ systemPrompt: v });
105
101
  }
106
- setModel(m: Model<any> | null) {
102
+ setModel(m: Model<any>) {
107
103
  this.patch({ model: m });
108
104
  }
109
105
  setThinkingLevel(l: ThinkingLevel) {
@@ -118,6 +114,14 @@ export class AgentSession {
118
114
  appendMessage(m: AppMessage) {
119
115
  this.patch({ messages: [...this._state.messages, m] });
120
116
  }
117
+ async queueMessage(m: AppMessage) {
118
+ // Transform message and queue it for injection at next turn
119
+ const transformed = await this.messageTransformer([m]);
120
+ this.messageQueue.push({
121
+ original: m,
122
+ llm: transformed[0], // undefined if filtered out
123
+ });
124
+ }
121
125
  clearMessages() {
122
126
  this.patch({ messages: [] });
123
127
  }
@@ -126,6 +130,11 @@ export class AgentSession {
126
130
  this.abortController?.abort();
127
131
  }
128
132
 
133
+ private logState(message: string) {
134
+ const { systemPrompt, model, messages } = this._state;
135
+ console.log(message, { systemPrompt, model, messages });
136
+ }
137
+
129
138
  async prompt(input: string, attachments?: Attachment[]) {
130
139
  const model = this._state.model;
131
140
  if (!model) {
@@ -157,6 +166,7 @@ export class AgentSession {
157
166
 
158
167
  this.abortController = new AbortController();
159
168
  this.patch({ isStreaming: true, streamMessage: null, error: undefined });
169
+ this.emit({ type: "started" });
160
170
 
161
171
  const reasoning =
162
172
  this._state.thinkingLevel === "off"
@@ -169,21 +179,38 @@ export class AgentSession {
169
179
  tools: this._state.tools,
170
180
  model,
171
181
  reasoning,
182
+ getQueuedMessages: async <T>() => {
183
+ // Return queued messages (they'll be added to state via message_end event)
184
+ const queued = this.messageQueue.slice();
185
+ this.messageQueue = [];
186
+ return queued as QueuedMessage<T>[];
187
+ },
172
188
  };
173
189
 
174
190
  try {
175
191
  let partial: Message | null = null;
176
192
  let turnDebug: DebugLogEntry | null = null;
177
193
  let turnStart = 0;
178
- for await (const ev of this.transport.run(userMessage as Message, cfg, this.abortController.signal)) {
194
+
195
+ this.logState("prompt started, current state:");
196
+
197
+ // Transform app messages to LLM-compatible messages (initial set)
198
+ const llmMessages = await this.messageTransformer(this._state.messages);
199
+
200
+ console.log("transformed messages:", llmMessages);
201
+ for await (const ev of this.transport.run(
202
+ llmMessages,
203
+ userMessage as Message,
204
+ cfg,
205
+ this.abortController.signal,
206
+ )) {
179
207
  switch (ev.type) {
180
208
  case "turn_start": {
181
209
  turnStart = performance.now();
182
- // Build request context snapshot
183
- const existing = this._state.messages as Message[];
210
+ // Build request context snapshot (use transformed messages)
184
211
  const ctx: Context = {
185
212
  systemPrompt: this._state.systemPrompt,
186
- messages: [...existing],
213
+ messages: [...llmMessages],
187
214
  tools: this._state.tools,
188
215
  };
189
216
  turnDebug = {
@@ -291,19 +318,17 @@ export class AgentSession {
291
318
  } finally {
292
319
  this.patch({ isStreaming: false, streamMessage: null, pendingToolCalls: new Set<string>() });
293
320
  this.abortController = undefined;
321
+ this.emit({ type: "completed" });
294
322
  }
295
- {
296
- const { systemPrompt, model, messages } = this._state;
297
- console.log("final state:", { systemPrompt, model, messages });
298
- }
323
+ this.logState("final state:");
299
324
  }
300
325
 
301
- private patch(p: Partial<AgentSessionState>): void {
326
+ private patch(p: Partial<AgentState>): void {
302
327
  this._state = { ...this._state, ...p };
303
328
  this.emit({ type: "state-update", state: this._state });
304
329
  }
305
330
 
306
- private emit(e: AgentSessionEvent) {
331
+ private emit(e: AgentEvent) {
307
332
  for (const listener of this.listeners) {
308
333
  listener(e);
309
334
  }
@@ -1,12 +1,12 @@
1
1
  import type {
2
2
  AgentContext,
3
+ AgentLoopConfig,
3
4
  Api,
4
5
  AssistantMessage,
5
6
  AssistantMessageEvent,
6
7
  Context,
7
8
  Message,
8
9
  Model,
9
- PromptConfig,
10
10
  SimpleStreamOptions,
11
11
  ToolCall,
12
12
  UserMessage,
@@ -322,9 +322,7 @@ export class AppTransport implements AgentTransport {
322
322
  // Hardcoded proxy URL for now - will be made configurable later
323
323
  private readonly proxyUrl = "https://genai.mariozechner.at";
324
324
 
325
- constructor(private readonly getMessages: () => Promise<Message[]>) {}
326
-
327
- async *run(userMessage: Message, cfg: AgentRunConfig, signal?: AbortSignal) {
325
+ async *run(messages: Message[], userMessage: Message, cfg: AgentRunConfig, signal?: AbortSignal) {
328
326
  const authToken = await getAuthToken();
329
327
  if (!authToken) {
330
328
  throw new Error(i18n("Auth token is required for proxy transport"));
@@ -343,15 +341,17 @@ export class AppTransport implements AgentTransport {
343
341
  );
344
342
  };
345
343
 
344
+ // Messages are already LLM-compatible (filtered by Agent)
346
345
  const context: AgentContext = {
347
346
  systemPrompt: cfg.systemPrompt,
348
- messages: await this.getMessages(),
347
+ messages,
349
348
  tools: cfg.tools,
350
349
  };
351
350
 
352
- const pc: PromptConfig = {
351
+ const pc: AgentLoopConfig = {
353
352
  model: cfg.model,
354
353
  reasoning: cfg.reasoning,
354
+ getQueuedMessages: cfg.getQueuedMessages,
355
355
  };
356
356
 
357
357
  // Yield events from the upstream agentLoop iterator
@@ -1,4 +1,10 @@
1
- import { type AgentContext, agentLoop, type Message, type PromptConfig, type UserMessage } from "@mariozechner/pi-ai";
1
+ import {
2
+ type AgentContext,
3
+ type AgentLoopConfig,
4
+ agentLoop,
5
+ type Message,
6
+ type UserMessage,
7
+ } from "@mariozechner/pi-ai";
2
8
  import { getAppStorage } from "../../storage/app-storage.js";
3
9
  import type { AgentRunConfig, AgentTransport } from "./types.js";
4
10
 
@@ -7,11 +13,9 @@ import type { AgentRunConfig, AgentTransport } from "./types.js";
7
13
  * Optionally routes calls through a CORS proxy if enabled in settings.
8
14
  */
9
15
  export class ProviderTransport implements AgentTransport {
10
- constructor(private readonly getMessages: () => Promise<Message[]>) {}
11
-
12
- async *run(userMessage: Message, cfg: AgentRunConfig, signal?: AbortSignal) {
16
+ async *run(messages: Message[], userMessage: Message, cfg: AgentRunConfig, signal?: AbortSignal) {
13
17
  // Get API key from storage
14
- const apiKey = await getAppStorage().providerKeys.getKey(cfg.model.provider);
18
+ const apiKey = await getAppStorage().providerKeys.get(cfg.model.provider);
15
19
  if (!apiKey) {
16
20
  throw new Error("no-api-key");
17
21
  }
@@ -29,16 +33,18 @@ export class ProviderTransport implements AgentTransport {
29
33
  };
30
34
  }
31
35
 
36
+ // Messages are already LLM-compatible (filtered by Agent)
32
37
  const context: AgentContext = {
33
38
  systemPrompt: cfg.systemPrompt,
34
- messages: await this.getMessages(),
39
+ messages,
35
40
  tools: cfg.tools,
36
41
  };
37
42
 
38
- const pc: PromptConfig = {
43
+ const pc: AgentLoopConfig = {
39
44
  model,
40
45
  reasoning: cfg.reasoning,
41
46
  apiKey,
47
+ getQueuedMessages: cfg.getQueuedMessages,
42
48
  };
43
49
 
44
50
  // Yield events from agentLoop
@@ -1,4 +1,4 @@
1
- import type { AgentEvent, AgentTool, Message, Model } from "@mariozechner/pi-ai";
1
+ import type { AgentEvent, AgentTool, Message, Model, QueuedMessage } from "@mariozechner/pi-ai";
2
2
 
3
3
  // The minimal configuration needed to run a turn.
4
4
  export interface AgentRunConfig {
@@ -6,11 +6,17 @@ export interface AgentRunConfig {
6
6
  tools: AgentTool<any>[];
7
7
  model: Model<any>;
8
8
  reasoning?: "low" | "medium" | "high";
9
+ getQueuedMessages?: <T>() => Promise<QueuedMessage<T>[]>;
9
10
  }
10
11
 
11
12
  // Events yielded by transports must match the @mariozechner/pi-ai prompt() events.
12
13
  // We re-export the Message type above; consumers should use the upstream AgentEvent type.
13
14
 
14
15
  export interface AgentTransport {
15
- run(userMessage: Message, config: AgentRunConfig, signal?: AbortSignal): AsyncIterable<AgentEvent>; // passthrough of AgentEvent from upstream
16
+ run(
17
+ messages: Message[],
18
+ userMessage: Message,
19
+ config: AgentRunConfig,
20
+ signal?: AbortSignal,
21
+ ): AsyncIterable<AgentEvent>; // passthrough of AgentEvent from upstream
16
22
  }