@mariozechner/pi-web-ui 0.30.2 → 0.31.0

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 (242) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/README.md +420 -150
  3. package/dist/ChatPanel.d.ts +1 -2
  4. package/dist/ChatPanel.d.ts.map +1 -1
  5. package/dist/ChatPanel.js +22 -45
  6. package/dist/ChatPanel.js.map +1 -1
  7. package/dist/components/AgentInterface.d.ts +1 -1
  8. package/dist/components/AgentInterface.d.ts.map +1 -1
  9. package/dist/components/AgentInterface.js +113 -91
  10. package/dist/components/AgentInterface.js.map +1 -1
  11. package/dist/components/AttachmentTile.d.ts.map +1 -1
  12. package/dist/components/AttachmentTile.js +12 -28
  13. package/dist/components/AttachmentTile.js.map +1 -1
  14. package/dist/components/ConsoleBlock.d.ts.map +1 -1
  15. package/dist/components/ConsoleBlock.js +6 -21
  16. package/dist/components/ConsoleBlock.js.map +1 -1
  17. package/dist/components/CustomProviderCard.d.ts.map +1 -1
  18. package/dist/components/CustomProviderCard.js +15 -34
  19. package/dist/components/CustomProviderCard.js.map +1 -1
  20. package/dist/components/ExpandableSection.d.ts.map +1 -1
  21. package/dist/components/ExpandableSection.js +10 -27
  22. package/dist/components/ExpandableSection.js.map +1 -1
  23. package/dist/components/Input.js.map +1 -1
  24. package/dist/components/MessageEditor.d.ts +2 -1
  25. package/dist/components/MessageEditor.d.ts.map +1 -1
  26. package/dist/components/MessageEditor.js +147 -190
  27. package/dist/components/MessageEditor.js.map +1 -1
  28. package/dist/components/MessageList.d.ts +2 -3
  29. package/dist/components/MessageList.d.ts.map +1 -1
  30. package/dist/components/MessageList.js +11 -28
  31. package/dist/components/MessageList.js.map +1 -1
  32. package/dist/components/Messages.d.ts +37 -7
  33. package/dist/components/Messages.d.ts.map +1 -1
  34. package/dist/components/Messages.js +127 -103
  35. package/dist/components/Messages.js.map +1 -1
  36. package/dist/components/ProviderKeyInput.d.ts.map +1 -1
  37. package/dist/components/ProviderKeyInput.js +15 -39
  38. package/dist/components/ProviderKeyInput.js.map +1 -1
  39. package/dist/components/SandboxedIframe.d.ts.map +1 -1
  40. package/dist/components/SandboxedIframe.js +11 -15
  41. package/dist/components/SandboxedIframe.js.map +1 -1
  42. package/dist/components/StreamingMessageContainer.d.ts +3 -2
  43. package/dist/components/StreamingMessageContainer.d.ts.map +1 -1
  44. package/dist/components/StreamingMessageContainer.js +16 -34
  45. package/dist/components/StreamingMessageContainer.js.map +1 -1
  46. package/dist/components/ThinkingBlock.d.ts.map +1 -1
  47. package/dist/components/ThinkingBlock.js +9 -26
  48. package/dist/components/ThinkingBlock.js.map +1 -1
  49. package/dist/components/message-renderer-registry.d.ts +5 -5
  50. package/dist/components/message-renderer-registry.d.ts.map +1 -1
  51. package/dist/components/message-renderer-registry.js.map +1 -1
  52. package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts.map +1 -1
  53. package/dist/components/sandbox/ArtifactsRuntimeProvider.js +3 -0
  54. package/dist/components/sandbox/ArtifactsRuntimeProvider.js.map +1 -1
  55. package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts.map +1 -1
  56. package/dist/components/sandbox/AttachmentsRuntimeProvider.js +1 -0
  57. package/dist/components/sandbox/AttachmentsRuntimeProvider.js.map +1 -1
  58. package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts.map +1 -1
  59. package/dist/components/sandbox/ConsoleRuntimeProvider.js +3 -5
  60. package/dist/components/sandbox/ConsoleRuntimeProvider.js.map +1 -1
  61. package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts.map +1 -1
  62. package/dist/components/sandbox/FileDownloadRuntimeProvider.js +1 -3
  63. package/dist/components/sandbox/FileDownloadRuntimeProvider.js.map +1 -1
  64. package/dist/components/sandbox/RuntimeMessageBridge.d.ts.map +1 -1
  65. package/dist/components/sandbox/RuntimeMessageBridge.js.map +1 -1
  66. package/dist/components/sandbox/RuntimeMessageRouter.d.ts.map +1 -1
  67. package/dist/components/sandbox/RuntimeMessageRouter.js +3 -5
  68. package/dist/components/sandbox/RuntimeMessageRouter.js.map +1 -1
  69. package/dist/dialogs/ApiKeyPromptDialog.d.ts.map +1 -1
  70. package/dist/dialogs/ApiKeyPromptDialog.js +10 -23
  71. package/dist/dialogs/ApiKeyPromptDialog.js.map +1 -1
  72. package/dist/dialogs/AttachmentOverlay.d.ts.map +1 -1
  73. package/dist/dialogs/AttachmentOverlay.js +34 -46
  74. package/dist/dialogs/AttachmentOverlay.js.map +1 -1
  75. package/dist/dialogs/CustomProviderDialog.d.ts.map +1 -1
  76. package/dist/dialogs/CustomProviderDialog.js +19 -39
  77. package/dist/dialogs/CustomProviderDialog.js.map +1 -1
  78. package/dist/dialogs/ModelSelector.d.ts.map +1 -1
  79. package/dist/dialogs/ModelSelector.js +25 -53
  80. package/dist/dialogs/ModelSelector.js.map +1 -1
  81. package/dist/dialogs/PersistentStorageDialog.d.ts.map +1 -1
  82. package/dist/dialogs/PersistentStorageDialog.js +9 -23
  83. package/dist/dialogs/PersistentStorageDialog.js.map +1 -1
  84. package/dist/dialogs/ProvidersModelsTab.d.ts.map +1 -1
  85. package/dist/dialogs/ProvidersModelsTab.js +7 -23
  86. package/dist/dialogs/ProvidersModelsTab.js.map +1 -1
  87. package/dist/dialogs/SessionListDialog.d.ts.map +1 -1
  88. package/dist/dialogs/SessionListDialog.js +14 -29
  89. package/dist/dialogs/SessionListDialog.js.map +1 -1
  90. package/dist/dialogs/SettingsDialog.d.ts.map +1 -1
  91. package/dist/dialogs/SettingsDialog.js +20 -52
  92. package/dist/dialogs/SettingsDialog.js.map +1 -1
  93. package/dist/index.d.ts +5 -8
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +2 -6
  96. package/dist/index.js.map +1 -1
  97. package/dist/prompts/prompts.d.ts.map +1 -1
  98. package/dist/storage/app-storage.d.ts.map +1 -1
  99. package/dist/storage/app-storage.js +5 -0
  100. package/dist/storage/app-storage.js.map +1 -1
  101. package/dist/storage/backends/indexeddb-storage-backend.d.ts.map +1 -1
  102. package/dist/storage/backends/indexeddb-storage-backend.js +2 -1
  103. package/dist/storage/backends/indexeddb-storage-backend.js.map +1 -1
  104. package/dist/storage/store.d.ts.map +1 -1
  105. package/dist/storage/store.js +1 -3
  106. package/dist/storage/store.js.map +1 -1
  107. package/dist/storage/stores/custom-providers-store.d.ts.map +1 -1
  108. package/dist/storage/stores/custom-providers-store.js.map +1 -1
  109. package/dist/storage/stores/provider-keys-store.d.ts.map +1 -1
  110. package/dist/storage/stores/provider-keys-store.js.map +1 -1
  111. package/dist/storage/stores/sessions-store.d.ts +1 -1
  112. package/dist/storage/stores/sessions-store.d.ts.map +1 -1
  113. package/dist/storage/stores/sessions-store.js.map +1 -1
  114. package/dist/storage/stores/settings-store.d.ts.map +1 -1
  115. package/dist/storage/stores/settings-store.js.map +1 -1
  116. package/dist/storage/types.d.ts +2 -3
  117. package/dist/storage/types.d.ts.map +1 -1
  118. package/dist/tools/artifacts/ArtifactElement.d.ts.map +1 -1
  119. package/dist/tools/artifacts/ArtifactElement.js +1 -4
  120. package/dist/tools/artifacts/ArtifactElement.js.map +1 -1
  121. package/dist/tools/artifacts/ArtifactPill.js.map +1 -1
  122. package/dist/tools/artifacts/Console.d.ts.map +1 -1
  123. package/dist/tools/artifacts/Console.js +10 -28
  124. package/dist/tools/artifacts/Console.js.map +1 -1
  125. package/dist/tools/artifacts/DocxArtifact.d.ts.map +1 -1
  126. package/dist/tools/artifacts/DocxArtifact.js +7 -23
  127. package/dist/tools/artifacts/DocxArtifact.js.map +1 -1
  128. package/dist/tools/artifacts/ExcelArtifact.d.ts.map +1 -1
  129. package/dist/tools/artifacts/ExcelArtifact.js +7 -23
  130. package/dist/tools/artifacts/ExcelArtifact.js.map +1 -1
  131. package/dist/tools/artifacts/GenericArtifact.d.ts.map +1 -1
  132. package/dist/tools/artifacts/GenericArtifact.js +5 -19
  133. package/dist/tools/artifacts/GenericArtifact.js.map +1 -1
  134. package/dist/tools/artifacts/HtmlArtifact.d.ts.map +1 -1
  135. package/dist/tools/artifacts/HtmlArtifact.js +16 -35
  136. package/dist/tools/artifacts/HtmlArtifact.js.map +1 -1
  137. package/dist/tools/artifacts/ImageArtifact.d.ts.map +1 -1
  138. package/dist/tools/artifacts/ImageArtifact.js +5 -19
  139. package/dist/tools/artifacts/ImageArtifact.js.map +1 -1
  140. package/dist/tools/artifacts/MarkdownArtifact.d.ts.map +1 -1
  141. package/dist/tools/artifacts/MarkdownArtifact.js +8 -24
  142. package/dist/tools/artifacts/MarkdownArtifact.js.map +1 -1
  143. package/dist/tools/artifacts/PdfArtifact.d.ts.map +1 -1
  144. package/dist/tools/artifacts/PdfArtifact.js +8 -24
  145. package/dist/tools/artifacts/PdfArtifact.js.map +1 -1
  146. package/dist/tools/artifacts/SvgArtifact.d.ts.map +1 -1
  147. package/dist/tools/artifacts/SvgArtifact.js +8 -24
  148. package/dist/tools/artifacts/SvgArtifact.js.map +1 -1
  149. package/dist/tools/artifacts/TextArtifact.d.ts.map +1 -1
  150. package/dist/tools/artifacts/TextArtifact.js +6 -20
  151. package/dist/tools/artifacts/TextArtifact.js.map +1 -1
  152. package/dist/tools/artifacts/artifacts-tool-renderer.d.ts.map +1 -1
  153. package/dist/tools/artifacts/artifacts-tool-renderer.js +1 -0
  154. package/dist/tools/artifacts/artifacts-tool-renderer.js.map +1 -1
  155. package/dist/tools/artifacts/artifacts.d.ts +2 -3
  156. package/dist/tools/artifacts/artifacts.d.ts.map +1 -1
  157. package/dist/tools/artifacts/artifacts.js +30 -52
  158. package/dist/tools/artifacts/artifacts.js.map +1 -1
  159. package/dist/tools/extract-document.d.ts +2 -2
  160. package/dist/tools/extract-document.d.ts.map +1 -1
  161. package/dist/tools/extract-document.js.map +1 -1
  162. package/dist/tools/index.js.map +1 -1
  163. package/dist/tools/javascript-repl.d.ts +3 -3
  164. package/dist/tools/javascript-repl.d.ts.map +1 -1
  165. package/dist/tools/javascript-repl.js.map +1 -1
  166. package/dist/tools/renderer-registry.js.map +1 -1
  167. package/dist/tools/renderers/BashRenderer.d.ts.map +1 -1
  168. package/dist/tools/renderers/BashRenderer.js.map +1 -1
  169. package/dist/tools/renderers/CalculateRenderer.d.ts.map +1 -1
  170. package/dist/tools/renderers/CalculateRenderer.js.map +1 -1
  171. package/dist/tools/renderers/DefaultRenderer.d.ts.map +1 -1
  172. package/dist/tools/renderers/DefaultRenderer.js.map +1 -1
  173. package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts.map +1 -1
  174. package/dist/tools/renderers/GetCurrentTimeRenderer.js.map +1 -1
  175. package/dist/utils/attachment-utils.js.map +1 -1
  176. package/dist/utils/auth-token.js.map +1 -1
  177. package/dist/utils/format.js.map +1 -1
  178. package/dist/utils/i18n.d.ts +14 -14
  179. package/dist/utils/i18n.d.ts.map +1 -1
  180. package/dist/utils/i18n.js.map +1 -1
  181. package/dist/utils/model-discovery.js.map +1 -1
  182. package/dist/utils/proxy-utils.d.ts +9 -1
  183. package/dist/utils/proxy-utils.d.ts.map +1 -1
  184. package/dist/utils/proxy-utils.js +19 -0
  185. package/dist/utils/proxy-utils.js.map +1 -1
  186. package/dist/utils/test-sessions.d.ts +47 -47
  187. package/dist/utils/test-sessions.js.map +1 -1
  188. package/example/package.json +1 -1
  189. package/example/src/custom-messages.ts +26 -36
  190. package/example/src/main.ts +11 -20
  191. package/example/tsconfig.json +1 -0
  192. package/package.json +4 -4
  193. package/src/ChatPanel.ts +2 -3
  194. package/src/components/AgentInterface.ts +57 -13
  195. package/src/components/MessageEditor.ts +2 -1
  196. package/src/components/MessageList.ts +3 -4
  197. package/src/components/Messages.ts +108 -19
  198. package/src/components/StreamingMessageContainer.ts +6 -5
  199. package/src/components/message-renderer-registry.ts +5 -5
  200. package/src/index.ts +13 -10
  201. package/src/storage/stores/sessions-store.ts +1 -1
  202. package/src/storage/types.ts +2 -3
  203. package/src/tools/artifacts/artifacts.ts +4 -4
  204. package/src/tools/extract-document.ts +2 -1
  205. package/src/tools/javascript-repl.ts +2 -1
  206. package/src/utils/proxy-utils.ts +23 -1
  207. package/dist/agent/agent.d.ts +0 -62
  208. package/dist/agent/agent.d.ts.map +0 -1
  209. package/dist/agent/agent.js +0 -274
  210. package/dist/agent/agent.js.map +0 -1
  211. package/dist/agent/transports/AppTransport.d.ts +0 -15
  212. package/dist/agent/transports/AppTransport.d.ts.map +0 -1
  213. package/dist/agent/transports/AppTransport.js +0 -327
  214. package/dist/agent/transports/AppTransport.js.map +0 -1
  215. package/dist/agent/transports/ProviderTransport.d.ts +0 -14
  216. package/dist/agent/transports/ProviderTransport.d.ts.map +0 -1
  217. package/dist/agent/transports/ProviderTransport.js +0 -55
  218. package/dist/agent/transports/ProviderTransport.js.map +0 -1
  219. package/dist/agent/transports/index.d.ts +0 -4
  220. package/dist/agent/transports/index.d.ts.map +0 -1
  221. package/dist/agent/transports/index.js +0 -4
  222. package/dist/agent/transports/index.js.map +0 -1
  223. package/dist/agent/transports/proxy-types.d.ts +0 -48
  224. package/dist/agent/transports/proxy-types.d.ts.map +0 -1
  225. package/dist/agent/transports/proxy-types.js +0 -2
  226. package/dist/agent/transports/proxy-types.js.map +0 -1
  227. package/dist/agent/transports/types.d.ts +0 -15
  228. package/dist/agent/transports/types.d.ts.map +0 -1
  229. package/dist/agent/transports/types.js +0 -2
  230. package/dist/agent/transports/types.js.map +0 -1
  231. package/dist/agent/types.d.ts +0 -15
  232. package/dist/agent/types.d.ts.map +0 -1
  233. package/dist/agent/types.js +0 -2
  234. package/dist/agent/types.js.map +0 -1
  235. package/example/src/test-sessions.ts +0 -104
  236. package/src/agent/agent.ts +0 -341
  237. package/src/agent/transports/AppTransport.ts +0 -371
  238. package/src/agent/transports/ProviderTransport.ts +0 -71
  239. package/src/agent/transports/index.ts +0 -3
  240. package/src/agent/transports/proxy-types.ts +0 -15
  241. package/src/agent/transports/types.ts +0 -26
  242. package/src/agent/types.ts +0 -11
@@ -1,14 +0,0 @@
1
- import { type Message } from "@mariozechner/pi-ai";
2
- import type { AgentRunConfig, AgentTransport } from "./types.js";
3
- /**
4
- * Transport that calls LLM providers directly.
5
- * Uses CORS proxy only for providers that require it (Anthropic OAuth, Z-AI).
6
- */
7
- export declare class ProviderTransport implements AgentTransport {
8
- private getModel;
9
- private buildContext;
10
- private buildLoopConfig;
11
- run(messages: Message[], userMessage: Message, cfg: AgentRunConfig, signal?: AbortSignal): AsyncGenerator<import("@mariozechner/pi-ai").AgentEvent, void, unknown>;
12
- continue(messages: Message[], cfg: AgentRunConfig, signal?: AbortSignal): AsyncGenerator<import("@mariozechner/pi-ai").AgentEvent, void, unknown>;
13
- }
14
- //# sourceMappingURL=ProviderTransport.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProviderTransport.d.ts","sourceRoot":"","sources":["../../../src/agent/transports/ProviderTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,KAAK,OAAO,EAEZ,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,cAAc;YACzC,QAAQ;IAatB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAahB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,WAAW;IAUxF,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,WAAW;CAS9E"}
@@ -1,55 +0,0 @@
1
- import { agentLoop, agentLoopContinue, } from "@mariozechner/pi-ai";
2
- import { getAppStorage } from "../../storage/app-storage.js";
3
- import { applyProxyIfNeeded } from "../../utils/proxy-utils.js";
4
- /**
5
- * Transport that calls LLM providers directly.
6
- * Uses CORS proxy only for providers that require it (Anthropic OAuth, Z-AI).
7
- */
8
- export class ProviderTransport {
9
- async getModel(cfg) {
10
- const apiKey = await getAppStorage().providerKeys.get(cfg.model.provider);
11
- if (!apiKey) {
12
- throw new Error("no-api-key");
13
- }
14
- const proxyEnabled = await getAppStorage().settings.get("proxy.enabled");
15
- const proxyUrl = await getAppStorage().settings.get("proxy.url");
16
- const model = applyProxyIfNeeded(cfg.model, apiKey, proxyEnabled ? proxyUrl || undefined : undefined);
17
- return model;
18
- }
19
- buildContext(messages, cfg) {
20
- return {
21
- systemPrompt: cfg.systemPrompt,
22
- messages,
23
- tools: cfg.tools,
24
- };
25
- }
26
- buildLoopConfig(model, cfg) {
27
- return {
28
- model,
29
- reasoning: cfg.reasoning,
30
- // Resolve API key per assistant response (important for expiring OAuth tokens)
31
- getApiKey: async (provider) => {
32
- const key = await getAppStorage().providerKeys.get(provider);
33
- return key ?? undefined; // Convert null to undefined for type compatibility
34
- },
35
- getQueuedMessages: cfg.getQueuedMessages,
36
- };
37
- }
38
- async *run(messages, userMessage, cfg, signal) {
39
- const model = await this.getModel(cfg);
40
- const context = this.buildContext(messages, cfg);
41
- const pc = this.buildLoopConfig(model, cfg);
42
- for await (const ev of agentLoop(userMessage, context, pc, signal)) {
43
- yield ev;
44
- }
45
- }
46
- async *continue(messages, cfg, signal) {
47
- const model = await this.getModel(cfg);
48
- const context = this.buildContext(messages, cfg);
49
- const pc = this.buildLoopConfig(model, cfg);
50
- for await (const ev of agentLoopContinue(context, pc, signal)) {
51
- yield ev;
52
- }
53
- }
54
- }
55
- //# sourceMappingURL=ProviderTransport.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProviderTransport.js","sourceRoot":"","sources":["../../../src/agent/transports/ProviderTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,SAAS,EACT,iBAAiB,GAGjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACrB,KAAK,CAAC,QAAQ,CAAC,GAAmB;QACzC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,aAAa,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAU,eAAe,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAS,WAAW,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEtG,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,YAAY,CAAC,QAAmB,EAAE,GAAmB;QAC5D,OAAO;YACN,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,QAAQ;YACR,KAAK,EAAE,GAAG,CAAC,KAAK;SAChB,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,KAA8B,EAAE,GAAmB;QAC1E,OAAO;YACN,KAAK;YACL,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,+EAA+E;YAC/E,SAAS,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;gBACrC,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC7D,OAAO,GAAG,IAAI,SAAS,CAAC,CAAC,mDAAmD;YAC7E,CAAC;YACD,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;SACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,GAAG,CAAC,QAAmB,EAAE,WAAoB,EAAE,GAAmB,EAAE,MAAoB;QAC9F,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE5C,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,SAAS,CAAC,WAAqC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YAC9F,MAAM,EAAE,CAAC;QACV,CAAC;IACF,CAAC;IAED,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAmB,EAAE,GAAmB,EAAE,MAAoB;QAC7E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE5C,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,iBAAiB,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YAC/D,MAAM,EAAE,CAAC;QACV,CAAC;IACF,CAAC;CACD"}
@@ -1,4 +0,0 @@
1
- export * from "./AppTransport.js";
2
- export * from "./ProviderTransport.js";
3
- export * from "./types.js";
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/transports/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC"}
@@ -1,4 +0,0 @@
1
- export * from "./AppTransport.js";
2
- export * from "./ProviderTransport.js";
3
- export * from "./types.js";
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/transports/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC"}
@@ -1,48 +0,0 @@
1
- import type { StopReason, Usage } from "@mariozechner/pi-ai";
2
- export type ProxyAssistantMessageEvent = {
3
- type: "start";
4
- } | {
5
- type: "text_start";
6
- contentIndex: number;
7
- } | {
8
- type: "text_delta";
9
- contentIndex: number;
10
- delta: string;
11
- } | {
12
- type: "text_end";
13
- contentIndex: number;
14
- contentSignature?: string;
15
- } | {
16
- type: "thinking_start";
17
- contentIndex: number;
18
- } | {
19
- type: "thinking_delta";
20
- contentIndex: number;
21
- delta: string;
22
- } | {
23
- type: "thinking_end";
24
- contentIndex: number;
25
- contentSignature?: string;
26
- } | {
27
- type: "toolcall_start";
28
- contentIndex: number;
29
- id: string;
30
- toolName: string;
31
- } | {
32
- type: "toolcall_delta";
33
- contentIndex: number;
34
- delta: string;
35
- } | {
36
- type: "toolcall_end";
37
- contentIndex: number;
38
- } | {
39
- type: "done";
40
- reason: Extract<StopReason, "stop" | "length" | "toolUse">;
41
- usage: Usage;
42
- } | {
43
- type: "error";
44
- reason: Extract<StopReason, "aborted" | "error">;
45
- errorMessage: string;
46
- usage: Usage;
47
- };
48
- //# sourceMappingURL=proxy-types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy-types.d.ts","sourceRoot":"","sources":["../../../src/agent/transports/proxy-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,MAAM,0BAA0B,GACnC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAC1F;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=proxy-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy-types.js","sourceRoot":"","sources":["../../../src/agent/transports/proxy-types.ts"],"names":[],"mappings":""}
@@ -1,15 +0,0 @@
1
- import type { AgentEvent, AgentTool, Message, Model, QueuedMessage } from "@mariozechner/pi-ai";
2
- export interface AgentRunConfig {
3
- systemPrompt: string;
4
- tools: AgentTool<any>[];
5
- model: Model<any>;
6
- reasoning?: "low" | "medium" | "high";
7
- getQueuedMessages?: <T>() => Promise<QueuedMessage<T>[]>;
8
- }
9
- export interface AgentTransport {
10
- /** Run with a new user message */
11
- run(messages: Message[], userMessage: Message, config: AgentRunConfig, signal?: AbortSignal): AsyncIterable<AgentEvent>;
12
- /** Continue from current context (no new user message) */
13
- continue(messages: Message[], config: AgentRunConfig, signal?: AbortSignal): AsyncIterable<AgentEvent>;
14
- }
15
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/agent/transports/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGhG,MAAM,WAAW,cAAc;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;CACzD;AAKD,MAAM,WAAW,cAAc;IAC9B,kCAAkC;IAClC,GAAG,CACF,QAAQ,EAAE,OAAO,EAAE,EACnB,WAAW,EAAE,OAAO,EACpB,MAAM,EAAE,cAAc,EACtB,MAAM,CAAC,EAAE,WAAW,GAClB,aAAa,CAAC,UAAU,CAAC,CAAC;IAE7B,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;CACvG"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agent/transports/types.ts"],"names":[],"mappings":""}
@@ -1,15 +0,0 @@
1
- import type { AssistantMessage, Context } from "@mariozechner/pi-ai";
2
- export interface DebugLogEntry {
3
- timestamp: string;
4
- request: {
5
- provider: string;
6
- model: string;
7
- context: Context;
8
- };
9
- response?: AssistantMessage;
10
- error?: unknown;
11
- sseEvents: string[];
12
- ttft?: number;
13
- totalTime?: number;
14
- }
15
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/D,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":""}
@@ -1,104 +0,0 @@
1
- const simpleHtml = {
2
- "systemPrompt": "You are a helpful AI assistant with access to various tools.\n\nAvailable tools:\n- Calculator: Perform mathematical calculations\n- Current Time: Get the current date and time in any timezone\n- Artifacts: Create interactive HTML, SVG, Markdown, and text artifacts\n\nFeel free to use these tools when needed to provide accurate and helpful responses.",
3
- "model": {
4
- "id": "claude-sonnet-4-5-20250929",
5
- "name": "Claude Sonnet 4.5",
6
- "api": "anthropic-messages",
7
- "provider": "anthropic",
8
- "baseUrl": "https://api.anthropic.com",
9
- "reasoning": true,
10
- "input": [
11
- "text",
12
- "image"
13
- ],
14
- "cost": {
15
- "input": 3,
16
- "output": 15,
17
- "cacheRead": 0.3,
18
- "cacheWrite": 3.75
19
- },
20
- "contextWindow": 200000,
21
- "maxTokens": 64000
22
- },
23
- "messages": [
24
- {
25
- "role": "user",
26
- "content": [
27
- {
28
- "type": "text",
29
- "text": "simple html"
30
- }
31
- ]
32
- },
33
- {
34
- "role": "assistant",
35
- "content": [
36
- {
37
- "type": "text",
38
- "text": "I'll create a simple HTML page for you!"
39
- },
40
- {
41
- "type": "toolCall",
42
- "id": "toolu_01JXaq9rMAUt1goJ5tMQXgLh",
43
- "name": "artifacts",
44
- "arguments": {
45
- "command": "create",
46
- "filename": "index.html",
47
- "title": "Simple HTML Page",
48
- "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Simple HTML Page</title>\n <style>\n body {\n font-family: Arial, sans-serif;\n max-width: 800px;\n margin: 0 auto;\n padding: 20px;\n background-color: #f5f5f5;\n }\n \n header {\n background-color: #4CAF50;\n color: white;\n padding: 20px;\n text-align: center;\n border-radius: 8px;\n }\n \n main {\n background-color: white;\n padding: 20px;\n margin-top: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n \n button {\n background-color: #4CAF50;\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 16px;\n }\n \n button:hover {\n background-color: #45a049;\n }\n </style>\n</head>\n<body>\n <header>\n <h1>Welcome to My Simple Page</h1>\n </header>\n \n <main>\n <h2>Hello!</h2>\n <p>This is a simple HTML page with some basic styling.</p>\n \n <h3>Features:</h3>\n <ul>\n <li>Clean design</li>\n <li>Responsive layout</li>\n <li>Interactive button</li>\n </ul>\n \n <button onclick=\"showMessage()\">Click Me!</button>\n <p id=\"message\"></p>\n </main>\n \n <script>\n function showMessage() {\n document.getElementById('message').textContent = '✨ Thanks for clicking!';\n }\n </script>\n</body>\n</html>"
49
- }
50
- }
51
- ],
52
- "api": "anthropic-messages",
53
- "provider": "anthropic",
54
- "model": "claude-sonnet-4-5-20250929",
55
- "usage": {
56
- "input": 2108,
57
- "output": 666,
58
- "cacheRead": 0,
59
- "cacheWrite": 0,
60
- "cost": {
61
- "input": 0.006324,
62
- "output": 0.00999,
63
- "cacheRead": 0,
64
- "cacheWrite": 0,
65
- "total": 0.016314000000000002
66
- }
67
- },
68
- "stopReason": "toolUse"
69
- },
70
- {
71
- "role": "toolResult",
72
- "toolCallId": "toolu_01JXaq9rMAUt1goJ5tMQXgLh",
73
- "toolName": "artifacts",
74
- "output": "Created file index.html\n\nExecution timed out. Partial logs:\nKeine Logs für index.html",
75
- "isError": false
76
- },
77
- {
78
- "role": "assistant",
79
- "content": [
80
- {
81
- "type": "text",
82
- "text": "I've created a simple HTML page for you! It includes:\n\n- **Clean header** with a green background\n- **Main content area** with a white card-style design\n- **A list** showing some features\n- **An interactive button** that displays a message when clicked\n- **Responsive styling** that looks good on different screen sizes\n\nThe page has a light gray background and uses simple, clean styling. Try clicking the button to see it in action! \n\nWould you like me to modify anything or add more features?"
83
- }
84
- ],
85
- "api": "anthropic-messages",
86
- "provider": "anthropic",
87
- "model": "claude-sonnet-4-5-20250929",
88
- "usage": {
89
- "input": 2811,
90
- "output": 115,
91
- "cacheRead": 0,
92
- "cacheWrite": 0,
93
- "cost": {
94
- "input": 0.008433,
95
- "output": 0.001725,
96
- "cacheRead": 0,
97
- "cacheWrite": 0,
98
- "total": 0.010158
99
- }
100
- },
101
- "stopReason": "stop"
102
- }
103
- ]
104
- };
@@ -1,341 +0,0 @@
1
- import type { Context, QueuedMessage } from "@mariozechner/pi-ai";
2
- import {
3
- type AgentTool,
4
- type AssistantMessage as AssistantMessageType,
5
- getModel,
6
- type ImageContent,
7
- type Message,
8
- type Model,
9
- type TextContent,
10
- } from "@mariozechner/pi-ai";
11
- import type { AppMessage } from "../components/Messages.js";
12
- import type { Attachment } from "../utils/attachment-utils.js";
13
- import type { AgentRunConfig, AgentTransport } from "./transports/types.js";
14
- import type { DebugLogEntry } from "./types.js";
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
-
27
- // biome-ignore lint/correctness/noUnusedVariables: fine here
28
- const { attachments, ...rest } = m as any;
29
- return rest as Message;
30
- }
31
- return m as Message;
32
- });
33
- }
34
-
35
- export type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high";
36
-
37
- export interface AgentState {
38
- systemPrompt: string;
39
- model: Model<any>;
40
- thinkingLevel: ThinkingLevel;
41
- tools: AgentTool<any>[];
42
- messages: AppMessage[];
43
- isStreaming: boolean;
44
- streamMessage: Message | null;
45
- pendingToolCalls: Set<string>;
46
- error?: string;
47
- }
48
-
49
- export type AgentEvent =
50
- | { type: "state-update"; state: AgentState }
51
- | { type: "error-no-model" }
52
- | { type: "error-no-api-key"; provider: string }
53
- | { type: "started" }
54
- | { type: "completed" };
55
-
56
- export interface AgentOptions {
57
- initialState?: Partial<AgentState>;
58
- debugListener?: (entry: DebugLogEntry) => void;
59
- transport: AgentTransport;
60
- // Transform app messages to LLM-compatible messages before sending to transport
61
- messageTransformer?: (messages: AppMessage[]) => Message[] | Promise<Message[]>;
62
- }
63
-
64
- export class Agent {
65
- private _state: AgentState = {
66
- systemPrompt: "",
67
- model: getModel("google", "gemini-2.5-flash-lite-preview-06-17"),
68
- thinkingLevel: "off",
69
- tools: [],
70
- messages: [],
71
- isStreaming: false,
72
- streamMessage: null,
73
- pendingToolCalls: new Set<string>(),
74
- error: undefined,
75
- };
76
- private listeners = new Set<(e: AgentEvent) => void>();
77
- private abortController?: AbortController;
78
- private transport: AgentTransport;
79
- private debugListener?: (entry: DebugLogEntry) => void;
80
- private messageTransformer: (messages: AppMessage[]) => Message[] | Promise<Message[]>;
81
- private messageQueue: Array<QueuedMessage<AppMessage>> = [];
82
-
83
- constructor(opts: AgentOptions) {
84
- this._state = { ...this._state, ...opts.initialState };
85
- this.debugListener = opts.debugListener;
86
- this.transport = opts.transport;
87
- this.messageTransformer = opts.messageTransformer || defaultMessageTransformer;
88
- }
89
-
90
- get state(): AgentState {
91
- return this._state;
92
- }
93
-
94
- subscribe(fn: (e: AgentEvent) => void): () => void {
95
- this.listeners.add(fn);
96
- fn({ type: "state-update", state: this._state });
97
- return () => this.listeners.delete(fn);
98
- }
99
-
100
- // Mutators
101
- setSystemPrompt(v: string) {
102
- this.patch({ systemPrompt: v });
103
- }
104
- setModel(m: Model<any>) {
105
- this.patch({ model: m });
106
- }
107
- setThinkingLevel(l: ThinkingLevel) {
108
- this.patch({ thinkingLevel: l });
109
- }
110
- setTools(t: AgentTool<any>[]) {
111
- this.patch({ tools: t });
112
- }
113
- replaceMessages(ms: AppMessage[]) {
114
- this.patch({ messages: ms.slice() });
115
- }
116
- appendMessage(m: AppMessage) {
117
- this.patch({ messages: [...this._state.messages, m] });
118
- }
119
- async queueMessage(m: AppMessage) {
120
- // Transform message and queue it for injection at next turn
121
- const transformed = await this.messageTransformer([m]);
122
- this.messageQueue.push({
123
- original: m,
124
- llm: transformed[0], // undefined if filtered out
125
- });
126
- }
127
- clearMessages() {
128
- this.patch({ messages: [] });
129
- }
130
-
131
- abort() {
132
- this.abortController?.abort();
133
- }
134
-
135
- private logState(message: string) {
136
- const { systemPrompt, model, messages } = this._state;
137
- console.log(message, { systemPrompt, model, messages });
138
- }
139
-
140
- async prompt(input: string, attachments?: Attachment[]) {
141
- const model = this._state.model;
142
- if (!model) {
143
- this.emit({ type: "error-no-model" });
144
- return;
145
- }
146
-
147
- // Build user message with attachments
148
- const content: Array<TextContent | ImageContent> = [{ type: "text", text: input }];
149
- if (attachments?.length) {
150
- for (const a of attachments) {
151
- if (a.type === "image") {
152
- content.push({ type: "image", data: a.content, mimeType: a.mimeType });
153
- } else if (a.type === "document" && a.extractedText) {
154
- content.push({
155
- type: "text",
156
- text: `\n\n[Document: ${a.fileName}]\n${a.extractedText}`,
157
- isDocument: true,
158
- } as TextContent);
159
- }
160
- }
161
- }
162
-
163
- const userMessage: AppMessage = {
164
- role: "user",
165
- content,
166
- attachments: attachments?.length ? attachments : undefined,
167
- timestamp: Date.now(),
168
- };
169
-
170
- this.abortController = new AbortController();
171
- this.patch({ isStreaming: true, streamMessage: null, error: undefined });
172
- this.emit({ type: "started" });
173
-
174
- const reasoning =
175
- this._state.thinkingLevel === "off"
176
- ? undefined
177
- : this._state.thinkingLevel === "minimal"
178
- ? "low"
179
- : this._state.thinkingLevel;
180
- const cfg: AgentRunConfig = {
181
- systemPrompt: this._state.systemPrompt,
182
- tools: this._state.tools,
183
- model,
184
- reasoning,
185
- getQueuedMessages: async <T>() => {
186
- // Return queued messages (they'll be added to state via message_end event)
187
- const queued = this.messageQueue.slice();
188
- this.messageQueue = [];
189
- return queued as QueuedMessage<T>[];
190
- },
191
- };
192
-
193
- try {
194
- let partial: Message | null = null;
195
- let turnDebug: DebugLogEntry | null = null;
196
- let turnStart = 0;
197
-
198
- this.logState("prompt started, current state:");
199
-
200
- // Transform app messages to LLM-compatible messages (initial set)
201
- const llmMessages = await this.messageTransformer(this._state.messages);
202
-
203
- console.log("transformed messages:", llmMessages);
204
- for await (const ev of this.transport.run(
205
- llmMessages,
206
- userMessage as Message,
207
- cfg,
208
- this.abortController.signal,
209
- )) {
210
- switch (ev.type) {
211
- case "turn_start": {
212
- turnStart = performance.now();
213
- // Build request context snapshot (use transformed messages)
214
- const ctx: Context = {
215
- systemPrompt: this._state.systemPrompt,
216
- messages: [...llmMessages],
217
- tools: this._state.tools,
218
- };
219
- turnDebug = {
220
- timestamp: new Date().toISOString(),
221
- request: {
222
- provider: cfg.model.provider,
223
- model: cfg.model.id,
224
- context: { ...ctx },
225
- },
226
- sseEvents: [],
227
- };
228
- break;
229
- }
230
- case "message_start":
231
- case "message_update": {
232
- partial = ev.message;
233
- // Collect SSE-like events for debug (drop heavy partial)
234
- if (ev.type === "message_update" && ev.assistantMessageEvent && turnDebug) {
235
- const copy: any = { ...ev.assistantMessageEvent };
236
- if (copy && "partial" in copy) delete copy.partial;
237
- turnDebug.sseEvents.push(JSON.stringify(copy));
238
- if (!turnDebug.ttft) turnDebug.ttft = performance.now() - turnStart;
239
- }
240
- this.patch({ streamMessage: ev.message });
241
- break;
242
- }
243
- case "message_end": {
244
- partial = null;
245
- this.appendMessage(ev.message as AppMessage);
246
- this.patch({ streamMessage: null });
247
- if (turnDebug) {
248
- if (ev.message.role !== "assistant" && ev.message.role !== "toolResult") {
249
- turnDebug.request.context.messages.push(ev.message);
250
- }
251
- if (ev.message.role === "assistant") turnDebug.response = ev.message as any;
252
- }
253
- break;
254
- }
255
- case "tool_execution_start": {
256
- const s = new Set(this._state.pendingToolCalls);
257
- s.add(ev.toolCallId);
258
- this.patch({ pendingToolCalls: s });
259
- break;
260
- }
261
- case "tool_execution_end": {
262
- const s = new Set(this._state.pendingToolCalls);
263
- s.delete(ev.toolCallId);
264
- this.patch({ pendingToolCalls: s });
265
- break;
266
- }
267
- case "turn_end": {
268
- // finalize current turn
269
- if (turnDebug) {
270
- turnDebug.totalTime = performance.now() - turnStart;
271
- this.debugListener?.(turnDebug);
272
- turnDebug = null;
273
- }
274
- break;
275
- }
276
- case "agent_end": {
277
- this.patch({ streamMessage: null });
278
- break;
279
- }
280
- }
281
- }
282
-
283
- if (partial && partial.role === "assistant" && partial.content.length > 0) {
284
- const onlyEmpty = !partial.content.some(
285
- (c) =>
286
- (c.type === "thinking" && c.thinking.trim().length > 0) ||
287
- (c.type === "text" && c.text.trim().length > 0) ||
288
- (c.type === "toolCall" && c.name.trim().length > 0),
289
- );
290
- if (!onlyEmpty) {
291
- this.appendMessage(partial as AppMessage);
292
- } else {
293
- if (this.abortController?.signal.aborted) {
294
- throw new Error("Request was aborted");
295
- }
296
- }
297
- }
298
- } catch (err: any) {
299
- if (String(err?.message || err) === "no-api-key") {
300
- this.emit({ type: "error-no-api-key", provider: model.provider });
301
- } else {
302
- const msg: AssistantMessageType = {
303
- role: "assistant",
304
- content: [{ type: "text", text: "" }],
305
- api: model.api,
306
- provider: model.provider,
307
- model: model.id,
308
- usage: {
309
- input: 0,
310
- output: 0,
311
- cacheRead: 0,
312
- cacheWrite: 0,
313
- totalTokens: 0,
314
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
315
- },
316
- stopReason: this.abortController?.signal.aborted ? "aborted" : "error",
317
- errorMessage: err?.message || String(err),
318
- timestamp: Date.now(),
319
- };
320
- this.appendMessage(msg as AppMessage);
321
- this.patch({ error: err?.message || String(err) });
322
- }
323
- } finally {
324
- this.patch({ isStreaming: false, streamMessage: null, pendingToolCalls: new Set<string>() });
325
- this.abortController = undefined;
326
- this.emit({ type: "completed" });
327
- }
328
- this.logState("final state:");
329
- }
330
-
331
- private patch(p: Partial<AgentState>): void {
332
- this._state = { ...this._state, ...p };
333
- this.emit({ type: "state-update", state: this._state });
334
- }
335
-
336
- private emit(e: AgentEvent) {
337
- for (const listener of this.listeners) {
338
- listener(e);
339
- }
340
- }
341
- }