@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.
- package/README.md +178 -99
- package/dist/ChatPanel.d.ts +15 -10
- package/dist/ChatPanel.d.ts.map +1 -1
- package/dist/ChatPanel.js +68 -100
- package/dist/ChatPanel.js.map +1 -1
- package/dist/{state/agent-session.d.ts → agent/agent.d.ts} +23 -19
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/{state/agent-session.js → agent/agent.js} +50 -32
- package/dist/agent/agent.js.map +1 -0
- package/dist/{state → agent}/transports/AppTransport.d.ts +1 -3
- package/dist/agent/transports/AppTransport.d.ts.map +1 -0
- package/dist/{state → agent}/transports/AppTransport.js +5 -4
- package/dist/{state → agent}/transports/AppTransport.js.map +1 -1
- package/dist/{state → agent}/transports/ProviderTransport.d.ts +1 -3
- package/dist/agent/transports/ProviderTransport.d.ts.map +1 -0
- package/dist/{state → agent}/transports/ProviderTransport.js +6 -7
- package/dist/agent/transports/ProviderTransport.js.map +1 -0
- package/dist/{state → agent}/transports/index.d.ts.map +1 -1
- package/dist/agent/transports/index.js.map +1 -0
- package/dist/{state → agent}/transports/proxy-types.d.ts.map +1 -1
- package/dist/agent/transports/proxy-types.js.map +1 -0
- package/dist/agent/transports/types.d.ts +12 -0
- package/dist/agent/transports/types.d.ts.map +1 -0
- package/dist/{state → agent}/transports/types.js.map +1 -1
- package/dist/{state → agent}/types.d.ts.map +1 -1
- package/dist/{state → agent}/types.js.map +1 -1
- package/dist/app.css +1 -1
- package/dist/components/AgentInterface.d.ts +7 -4
- package/dist/components/AgentInterface.d.ts.map +1 -1
- package/dist/components/AgentInterface.js +29 -17
- package/dist/components/AgentInterface.js.map +1 -1
- package/dist/components/ConsoleBlock.d.ts +1 -0
- package/dist/components/ConsoleBlock.d.ts.map +1 -1
- package/dist/components/ConsoleBlock.js +7 -1
- package/dist/components/ConsoleBlock.js.map +1 -1
- package/dist/components/ExpandableSection.d.ts +15 -0
- package/dist/components/ExpandableSection.d.ts.map +1 -0
- package/dist/components/ExpandableSection.js +63 -0
- package/dist/components/ExpandableSection.js.map +1 -0
- package/dist/components/MessageEditor.d.ts +8 -1
- package/dist/components/MessageEditor.d.ts.map +1 -1
- package/dist/components/MessageEditor.js +149 -6
- package/dist/components/MessageEditor.js.map +1 -1
- package/dist/components/MessageList.d.ts +3 -2
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +14 -1
- package/dist/components/MessageList.js.map +1 -1
- package/dist/components/Messages.d.ts +15 -6
- package/dist/components/Messages.d.ts.map +1 -1
- package/dist/components/Messages.js +17 -83
- package/dist/components/Messages.js.map +1 -1
- package/dist/components/ProviderKeyInput.d.ts.map +1 -1
- package/dist/components/ProviderKeyInput.js +6 -5
- package/dist/components/ProviderKeyInput.js.map +1 -1
- package/dist/components/SandboxedIframe.d.ts +29 -7
- package/dist/components/SandboxedIframe.d.ts.map +1 -1
- package/dist/components/SandboxedIframe.js +350 -282
- package/dist/components/SandboxedIframe.js.map +1 -1
- package/dist/components/message-renderer-registry.d.ts +12 -0
- package/dist/components/message-renderer-registry.d.ts.map +1 -0
- package/dist/components/message-renderer-registry.js +12 -0
- package/dist/components/message-renderer-registry.js.map +1 -0
- package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts +35 -0
- package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts.map +1 -0
- package/dist/components/sandbox/ArtifactsRuntimeProvider.js +189 -0
- package/dist/components/sandbox/ArtifactsRuntimeProvider.js.map +1 -0
- package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts +17 -0
- package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts.map +1 -0
- package/dist/components/sandbox/AttachmentsRuntimeProvider.js +64 -0
- package/dist/components/sandbox/AttachmentsRuntimeProvider.js.map +1 -0
- package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts +42 -0
- package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts.map +1 -0
- package/dist/components/sandbox/ConsoleRuntimeProvider.js +161 -0
- package/dist/components/sandbox/ConsoleRuntimeProvider.js.map +1 -0
- package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts +30 -0
- package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts.map +1 -0
- package/dist/components/sandbox/FileDownloadRuntimeProvider.js +97 -0
- package/dist/components/sandbox/FileDownloadRuntimeProvider.js.map +1 -0
- package/dist/components/sandbox/RuntimeMessageBridge.d.ts +19 -0
- package/dist/components/sandbox/RuntimeMessageBridge.d.ts.map +1 -0
- package/dist/components/sandbox/RuntimeMessageBridge.js +74 -0
- package/dist/components/sandbox/RuntimeMessageBridge.js.map +1 -0
- package/dist/components/sandbox/RuntimeMessageRouter.d.ts +65 -0
- package/dist/components/sandbox/RuntimeMessageRouter.d.ts.map +1 -0
- package/dist/components/sandbox/RuntimeMessageRouter.js +168 -0
- package/dist/components/sandbox/RuntimeMessageRouter.js.map +1 -0
- package/dist/components/sandbox/SandboxRuntimeProvider.d.ts +33 -0
- package/dist/components/sandbox/SandboxRuntimeProvider.d.ts.map +1 -0
- package/dist/components/sandbox/SandboxRuntimeProvider.js +2 -0
- package/dist/components/sandbox/SandboxRuntimeProvider.js.map +1 -0
- package/dist/dialogs/ApiKeyPromptDialog.d.ts.map +1 -1
- package/dist/dialogs/ApiKeyPromptDialog.js +2 -5
- package/dist/dialogs/ApiKeyPromptDialog.js.map +1 -1
- package/dist/dialogs/ModelSelector.js.map +1 -1
- package/dist/dialogs/PersistentStorageDialog.d.ts +17 -0
- package/dist/dialogs/PersistentStorageDialog.d.ts.map +1 -0
- package/dist/dialogs/PersistentStorageDialog.js +144 -0
- package/dist/dialogs/PersistentStorageDialog.js.map +1 -0
- package/dist/dialogs/SessionListDialog.d.ts +19 -0
- package/dist/dialogs/SessionListDialog.d.ts.map +1 -0
- package/dist/dialogs/SessionListDialog.js +152 -0
- package/dist/dialogs/SessionListDialog.js.map +1 -0
- package/dist/dialogs/SettingsDialog.d.ts.map +1 -1
- package/dist/dialogs/SettingsDialog.js +1 -0
- package/dist/dialogs/SettingsDialog.js.map +1 -1
- package/dist/index.d.ts +34 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -14
- package/dist/index.js.map +1 -1
- package/dist/prompts/prompts.d.ts +11 -0
- package/dist/prompts/prompts.d.ts.map +1 -0
- package/dist/prompts/prompts.js +272 -0
- package/dist/prompts/prompts.js.map +1 -0
- package/dist/storage/app-storage.d.ts +17 -12
- package/dist/storage/app-storage.d.ts.map +1 -1
- package/dist/storage/app-storage.js +13 -20
- package/dist/storage/app-storage.js.map +1 -1
- package/dist/storage/backends/indexeddb-storage-backend.d.ts +27 -0
- package/dist/storage/backends/indexeddb-storage-backend.d.ts.map +1 -0
- package/dist/storage/backends/indexeddb-storage-backend.js +166 -0
- package/dist/storage/backends/indexeddb-storage-backend.js.map +1 -0
- package/dist/storage/store.d.ts +23 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/store.js +26 -0
- package/dist/storage/store.js.map +1 -0
- package/dist/storage/stores/provider-keys-store.d.ts +14 -0
- package/dist/storage/stores/provider-keys-store.d.ts.map +1 -0
- package/dist/storage/stores/provider-keys-store.js +27 -0
- package/dist/storage/stores/provider-keys-store.js.map +1 -0
- package/dist/storage/stores/sessions-store.d.ts +31 -0
- package/dist/storage/stores/sessions-store.d.ts.map +1 -0
- package/dist/storage/stores/sessions-store.js +113 -0
- package/dist/storage/stores/sessions-store.js.map +1 -0
- package/dist/storage/stores/settings-store.d.ts +14 -0
- package/dist/storage/stores/settings-store.d.ts.map +1 -0
- package/dist/storage/stores/settings-store.js +28 -0
- package/dist/storage/stores/settings-store.js.map +1 -0
- package/dist/storage/types.d.ts +156 -22
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/tools/artifacts/ArtifactElement.d.ts +0 -1
- package/dist/tools/artifacts/ArtifactElement.d.ts.map +1 -1
- package/dist/tools/artifacts/ArtifactElement.js +0 -1
- package/dist/tools/artifacts/ArtifactElement.js.map +1 -1
- package/dist/tools/artifacts/ArtifactPill.d.ts +4 -0
- package/dist/tools/artifacts/ArtifactPill.d.ts.map +1 -0
- package/dist/tools/artifacts/ArtifactPill.js +22 -0
- package/dist/tools/artifacts/ArtifactPill.js.map +1 -0
- package/dist/tools/artifacts/Console.d.ts +18 -0
- package/dist/tools/artifacts/Console.d.ts.map +1 -0
- package/dist/tools/artifacts/Console.js +95 -0
- package/dist/tools/artifacts/Console.js.map +1 -0
- package/dist/tools/artifacts/DocxArtifact.d.ts +22 -0
- package/dist/tools/artifacts/DocxArtifact.d.ts.map +1 -0
- package/dist/tools/artifacts/DocxArtifact.js +208 -0
- package/dist/tools/artifacts/DocxArtifact.js.map +1 -0
- package/dist/tools/artifacts/ExcelArtifact.d.ts +24 -0
- package/dist/tools/artifacts/ExcelArtifact.d.ts.map +1 -0
- package/dist/tools/artifacts/ExcelArtifact.js +216 -0
- package/dist/tools/artifacts/ExcelArtifact.js.map +1 -0
- package/dist/tools/artifacts/GenericArtifact.d.ts +19 -0
- package/dist/tools/artifacts/GenericArtifact.d.ts.map +1 -0
- package/dist/tools/artifacts/GenericArtifact.js +117 -0
- package/dist/tools/artifacts/GenericArtifact.js.map +1 -0
- package/dist/tools/artifacts/HtmlArtifact.d.ts +8 -11
- package/dist/tools/artifacts/HtmlArtifact.d.ts.map +1 -1
- package/dist/tools/artifacts/HtmlArtifact.js +56 -88
- package/dist/tools/artifacts/HtmlArtifact.js.map +1 -1
- package/dist/tools/artifacts/ImageArtifact.d.ts +20 -0
- package/dist/tools/artifacts/ImageArtifact.d.ts.map +1 -0
- package/dist/tools/artifacts/ImageArtifact.js +120 -0
- package/dist/tools/artifacts/ImageArtifact.js.map +1 -0
- package/dist/tools/artifacts/MarkdownArtifact.d.ts +0 -1
- package/dist/tools/artifacts/MarkdownArtifact.d.ts.map +1 -1
- package/dist/tools/artifacts/MarkdownArtifact.js +0 -4
- package/dist/tools/artifacts/MarkdownArtifact.js.map +1 -1
- package/dist/tools/artifacts/PdfArtifact.d.ts +25 -0
- package/dist/tools/artifacts/PdfArtifact.d.ts.map +1 -0
- package/dist/tools/artifacts/PdfArtifact.js +184 -0
- package/dist/tools/artifacts/PdfArtifact.js.map +1 -0
- package/dist/tools/artifacts/SvgArtifact.d.ts +0 -1
- package/dist/tools/artifacts/SvgArtifact.d.ts.map +1 -1
- package/dist/tools/artifacts/SvgArtifact.js +0 -4
- package/dist/tools/artifacts/SvgArtifact.js.map +1 -1
- package/dist/tools/artifacts/TextArtifact.d.ts +0 -1
- package/dist/tools/artifacts/TextArtifact.d.ts.map +1 -1
- package/dist/tools/artifacts/TextArtifact.js +0 -4
- package/dist/tools/artifacts/TextArtifact.js.map +1 -1
- package/dist/tools/artifacts/artifacts-tool-renderer.d.ts +11 -0
- package/dist/tools/artifacts/artifacts-tool-renderer.d.ts.map +1 -0
- package/dist/tools/artifacts/artifacts-tool-renderer.js +262 -0
- package/dist/tools/artifacts/artifacts-tool-renderer.js.map +1 -0
- package/dist/tools/artifacts/artifacts.d.ts +10 -13
- package/dist/tools/artifacts/artifacts.d.ts.map +1 -1
- package/dist/tools/artifacts/artifacts.js +166 -344
- package/dist/tools/artifacts/artifacts.js.map +1 -1
- package/dist/tools/artifacts/index.d.ts +1 -0
- package/dist/tools/artifacts/index.d.ts.map +1 -1
- package/dist/tools/artifacts/index.js +1 -0
- package/dist/tools/artifacts/index.js.map +1 -1
- package/dist/tools/extract-document.d.ts +24 -0
- package/dist/tools/extract-document.d.ts.map +1 -0
- package/dist/tools/extract-document.js +193 -0
- package/dist/tools/extract-document.js.map +1 -0
- package/dist/tools/index.d.ts +9 -7
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +17 -13
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/javascript-repl.d.ts +16 -15
- package/dist/tools/javascript-repl.d.ts.map +1 -1
- package/dist/tools/javascript-repl.js +101 -133
- package/dist/tools/javascript-repl.js.map +1 -1
- package/dist/tools/renderer-registry.d.ts +12 -0
- package/dist/tools/renderer-registry.d.ts.map +1 -1
- package/dist/tools/renderer-registry.js +78 -0
- package/dist/tools/renderer-registry.js.map +1 -1
- package/dist/tools/renderers/BashRenderer.d.ts +2 -4
- package/dist/tools/renderers/BashRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/BashRenderer.js +30 -26
- package/dist/tools/renderers/BashRenderer.js.map +1 -1
- package/dist/tools/renderers/CalculateRenderer.d.ts +2 -4
- package/dist/tools/renderers/CalculateRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/CalculateRenderer.js +32 -28
- package/dist/tools/renderers/CalculateRenderer.js.map +1 -1
- package/dist/tools/renderers/DefaultRenderer.d.ts +2 -4
- package/dist/tools/renderers/DefaultRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/DefaultRenderer.js +78 -18
- package/dist/tools/renderers/DefaultRenderer.js.map +1 -1
- package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts +2 -4
- package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/GetCurrentTimeRenderer.js +57 -21
- package/dist/tools/renderers/GetCurrentTimeRenderer.js.map +1 -1
- package/dist/tools/types.d.ts +5 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/i18n.d.ts +424 -1
- package/dist/utils/i18n.d.ts.map +1 -1
- package/dist/utils/i18n.js +131 -7
- package/dist/utils/i18n.js.map +1 -1
- package/example/package.json +2 -1
- package/example/src/custom-messages.ts +112 -0
- package/example/src/main.ts +391 -38
- package/package.json +48 -43
- package/scripts/count-prompt-tokens.ts +88 -0
- package/src/ChatPanel.ts +93 -101
- package/src/{state/agent-session.ts → agent/agent.ts} +80 -55
- package/src/{state → agent}/transports/AppTransport.ts +6 -6
- package/src/{state → agent}/transports/ProviderTransport.ts +13 -7
- package/src/{state → agent}/transports/types.ts +8 -2
- package/src/components/AgentInterface.ts +32 -16
- package/src/components/ConsoleBlock.ts +5 -1
- package/src/components/ExpandableSection.ts +46 -0
- package/src/components/MessageEditor.ts +159 -5
- package/src/components/MessageList.ts +18 -3
- package/src/components/Messages.ts +48 -89
- package/src/components/ProviderKeyInput.ts +6 -5
- package/src/components/SandboxedIframe.ts +412 -321
- package/src/components/message-renderer-registry.ts +28 -0
- package/src/components/sandbox/ArtifactsRuntimeProvider.ts +219 -0
- package/src/components/sandbox/AttachmentsRuntimeProvider.ts +66 -0
- package/src/components/sandbox/ConsoleRuntimeProvider.ts +187 -0
- package/src/components/sandbox/FileDownloadRuntimeProvider.ts +110 -0
- package/src/components/sandbox/RuntimeMessageBridge.ts +82 -0
- package/src/components/sandbox/RuntimeMessageRouter.ts +216 -0
- package/src/components/sandbox/SandboxRuntimeProvider.ts +35 -0
- package/src/dialogs/ApiKeyPromptDialog.ts +2 -5
- package/src/dialogs/ModelSelector.ts +2 -2
- package/src/dialogs/PersistentStorageDialog.ts +141 -0
- package/src/dialogs/SessionListDialog.ts +148 -0
- package/src/dialogs/SettingsDialog.ts +1 -0
- package/src/index.ts +61 -20
- package/src/prompts/prompts.ts +282 -0
- package/src/storage/app-storage.ts +27 -24
- package/src/storage/backends/indexeddb-storage-backend.ts +193 -0
- package/src/storage/store.ts +33 -0
- package/src/storage/stores/provider-keys-store.ts +33 -0
- package/src/storage/stores/sessions-store.ts +130 -0
- package/src/storage/stores/settings-store.ts +34 -0
- package/src/storage/types.ts +182 -22
- package/src/tools/artifacts/ArtifactElement.ts +0 -1
- package/src/tools/artifacts/ArtifactPill.ts +25 -0
- package/src/tools/artifacts/Console.ts +93 -0
- package/src/tools/artifacts/DocxArtifact.ts +213 -0
- package/src/tools/artifacts/ExcelArtifact.ts +231 -0
- package/src/tools/artifacts/GenericArtifact.ts +117 -0
- package/src/tools/artifacts/HtmlArtifact.ts +64 -94
- package/src/tools/artifacts/ImageArtifact.ts +116 -0
- package/src/tools/artifacts/MarkdownArtifact.ts +0 -1
- package/src/tools/artifacts/PdfArtifact.ts +201 -0
- package/src/tools/artifacts/SvgArtifact.ts +0 -1
- package/src/tools/artifacts/TextArtifact.ts +0 -1
- package/src/tools/artifacts/artifacts-tool-renderer.ts +298 -0
- package/src/tools/artifacts/artifacts.ts +190 -366
- package/src/tools/artifacts/index.ts +1 -0
- package/src/tools/extract-document.ts +250 -0
- package/src/tools/index.ts +25 -14
- package/src/tools/javascript-repl.ts +138 -160
- package/src/tools/renderer-registry.ts +98 -0
- package/src/tools/renderers/BashRenderer.ts +33 -30
- package/src/tools/renderers/CalculateRenderer.ts +36 -31
- package/src/tools/renderers/DefaultRenderer.ts +84 -21
- package/src/tools/renderers/GetCurrentTimeRenderer.ts +68 -23
- package/src/tools/types.ts +10 -2
- package/src/utils/i18n.ts +203 -8
- package/dist/state/agent-session.d.ts.map +0 -1
- package/dist/state/agent-session.js.map +0 -1
- package/dist/state/transports/AppTransport.d.ts.map +0 -1
- package/dist/state/transports/ProviderTransport.d.ts.map +0 -1
- package/dist/state/transports/ProviderTransport.js.map +0 -1
- package/dist/state/transports/index.js.map +0 -1
- package/dist/state/transports/proxy-types.js.map +0 -1
- package/dist/state/transports/types.d.ts +0 -11
- package/dist/state/transports/types.d.ts.map +0 -1
- package/dist/storage/backends/chrome-storage-backend.d.ts +0 -18
- package/dist/storage/backends/chrome-storage-backend.d.ts.map +0 -1
- package/dist/storage/backends/chrome-storage-backend.js +0 -67
- package/dist/storage/backends/chrome-storage-backend.js.map +0 -1
- package/dist/storage/backends/indexeddb-backend.d.ts +0 -20
- package/dist/storage/backends/indexeddb-backend.d.ts.map +0 -1
- package/dist/storage/backends/indexeddb-backend.js +0 -89
- package/dist/storage/backends/indexeddb-backend.js.map +0 -1
- package/dist/storage/backends/local-storage-backend.d.ts +0 -18
- package/dist/storage/backends/local-storage-backend.d.ts.map +0 -1
- package/dist/storage/backends/local-storage-backend.js +0 -69
- package/dist/storage/backends/local-storage-backend.js.map +0 -1
- package/dist/storage/repositories/provider-keys-repository.d.ts +0 -34
- package/dist/storage/repositories/provider-keys-repository.d.ts.map +0 -1
- package/dist/storage/repositories/provider-keys-repository.js +0 -50
- package/dist/storage/repositories/provider-keys-repository.js.map +0 -1
- package/dist/storage/repositories/settings-repository.d.ts +0 -34
- package/dist/storage/repositories/settings-repository.d.ts.map +0 -1
- package/dist/storage/repositories/settings-repository.js +0 -46
- package/dist/storage/repositories/settings-repository.js.map +0 -1
- package/src/storage/backends/chrome-storage-backend.ts +0 -82
- package/src/storage/backends/indexeddb-backend.ts +0 -107
- package/src/storage/backends/local-storage-backend.ts +0 -74
- package/src/storage/repositories/provider-keys-repository.ts +0 -55
- package/src/storage/repositories/settings-repository.ts +0 -51
- /package/dist/{state → agent}/transports/index.d.ts +0 -0
- /package/dist/{state → agent}/transports/index.js +0 -0
- /package/dist/{state → agent}/transports/proxy-types.d.ts +0 -0
- /package/dist/{state → agent}/transports/proxy-types.js +0 -0
- /package/dist/{state → agent}/transports/types.js +0 -0
- /package/dist/{state → agent}/types.d.ts +0 -0
- /package/dist/{state → agent}/types.js +0 -0
- /package/src/{state → agent}/transports/index.ts +0 -0
- /package/src/{state → agent}/transports/proxy-types.ts +0 -0
- /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,
|
|
3
|
+
import { customElement, state } from "lit/decorators.js";
|
|
4
|
+
import type { Agent } from "./agent/agent.js";
|
|
5
5
|
import "./components/AgentInterface.js";
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
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 {
|
|
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()
|
|
18
|
-
@state()
|
|
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 =
|
|
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
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
89
|
+
// Register the standalone tool renderer (not the panel itself)
|
|
90
|
+
registerToolRenderer("artifacts", new ArtifactsToolRenderer(this.artifactsPanel));
|
|
61
91
|
|
|
62
|
-
//
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
const
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
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
|
-
|
|
86
|
-
|
|
112
|
+
return providers;
|
|
113
|
+
};
|
|
87
114
|
|
|
88
115
|
this.artifactsPanel.onArtifactsChange = () => {
|
|
89
|
-
const count = this.artifactsPanel
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
134
|
-
|
|
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.
|
|
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">
|
|
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
|
-
|
|
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
|
|
21
|
-
id: string;
|
|
35
|
+
export interface AgentState {
|
|
22
36
|
systemPrompt: string;
|
|
23
|
-
model: Model<any
|
|
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
|
|
34
|
-
| { type: "state-update"; state:
|
|
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
|
-
|
|
50
|
+
| { type: "error-no-api-key"; provider: string }
|
|
51
|
+
| { type: "started" }
|
|
52
|
+
| { type: "completed" };
|
|
39
53
|
|
|
40
|
-
export interface
|
|
41
|
-
initialState?: Partial<
|
|
42
|
-
messagePreprocessor?: (messages: AppMessage[]) => Promise<Message[]>;
|
|
54
|
+
export interface AgentOptions {
|
|
55
|
+
initialState?: Partial<AgentState>;
|
|
43
56
|
debugListener?: (entry: DebugLogEntry) => void;
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
49
|
-
private _state:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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():
|
|
88
|
+
get state(): AgentState {
|
|
93
89
|
return this._state;
|
|
94
90
|
}
|
|
95
91
|
|
|
96
|
-
subscribe(fn: (e:
|
|
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>
|
|
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
|
-
|
|
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: [...
|
|
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<
|
|
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:
|
|
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
|
-
|
|
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
|
|
347
|
+
messages,
|
|
349
348
|
tools: cfg.tools,
|
|
350
349
|
};
|
|
351
350
|
|
|
352
|
-
const pc:
|
|
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 {
|
|
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
|
-
|
|
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.
|
|
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
|
|
39
|
+
messages,
|
|
35
40
|
tools: cfg.tools,
|
|
36
41
|
};
|
|
37
42
|
|
|
38
|
-
const pc:
|
|
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(
|
|
16
|
+
run(
|
|
17
|
+
messages: Message[],
|
|
18
|
+
userMessage: Message,
|
|
19
|
+
config: AgentRunConfig,
|
|
20
|
+
signal?: AbortSignal,
|
|
21
|
+
): AsyncIterable<AgentEvent>; // passthrough of AgentEvent from upstream
|
|
16
22
|
}
|