@solidxai/core-ui 0.1.20-beta.0 → 0.1.20
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/dist/components/common/Link.d.ts.map +1 -1
- package/dist/components/common/Link.js +2 -1
- package/dist/components/common/Link.js.map +1 -1
- package/dist/components/common/Link.tsx +2 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts +1 -0
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +109 -23
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +155 -34
- package/dist/components/core/chatter/SolidChatter.js +2 -2
- package/dist/components/core/chatter/SolidChatter.js.map +1 -1
- package/dist/components/core/chatter/SolidChatter.tsx +2 -2
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.js +20 -19
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.js.map +1 -1
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.tsx +16 -16
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.js +36 -9
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.tsx +78 -7
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.d.ts +1 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.js +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.tsx +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.d.ts +4 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.js +131 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.js.map +1 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.tsx +151 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.d.ts +4 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.js +13 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.js.map +1 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.tsx +20 -0
- package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormView.js +4 -0
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/SolidFormView.tsx +4 -0
- package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js +50 -15
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +22 -3
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +16 -3
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +16 -2
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +4 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +4 -1
- package/dist/components/core/module/ModulePackageDialog.css +102 -0
- package/dist/components/core/module/ModulePackageDialog.d.ts +2 -1
- package/dist/components/core/module/ModulePackageDialog.d.ts.map +1 -1
- package/dist/components/core/module/ModulePackageDialog.js +216 -68
- package/dist/components/core/module/ModulePackageDialog.js.map +1 -1
- package/dist/components/core/module/ModulePackageDialog.tsx +356 -76
- package/dist/components/core/solid-agent/SolidAgentChat.d.ts.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentChat.js +9 -3
- package/dist/components/core/solid-agent/SolidAgentChat.js.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentChat.tsx +9 -4
- package/dist/components/core/solid-agent/SolidAgentMarkdown.d.ts.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentMarkdown.js +25 -6
- package/dist/components/core/solid-agent/SolidAgentMarkdown.js.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentMarkdown.tsx +15 -1
- package/dist/components/core/solid-agent/client/agentRuntime.d.ts +5 -0
- package/dist/components/core/solid-agent/client/agentRuntime.d.ts.map +1 -1
- package/dist/components/core/solid-agent/client/agentRuntime.js +77 -20
- package/dist/components/core/solid-agent/client/agentRuntime.js.map +1 -1
- package/dist/components/core/solid-agent/client/agentRuntime.ts +29 -1
- package/dist/components/core/solid-agent/client/agentSocket.d.ts +5 -1
- package/dist/components/core/solid-agent/client/agentSocket.d.ts.map +1 -1
- package/dist/components/core/solid-agent/client/agentSocket.js +27 -4
- package/dist/components/core/solid-agent/client/agentSocket.js.map +1 -1
- package/dist/components/core/solid-agent/client/agentSocket.ts +14 -3
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js +2 -2
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js.map +1 -1
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.tsx +5 -5
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts +2 -0
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts.map +1 -1
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js +2 -2
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js.map +1 -1
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.ts +4 -4
- package/dist/components/core/solid-agent/thread/AgentThread.d.ts.map +1 -1
- package/dist/components/core/solid-agent/thread/AgentThread.js +61 -26
- package/dist/components/core/solid-agent/thread/AgentThread.js.map +1 -1
- package/dist/components/core/solid-agent/thread/AgentThread.tsx +74 -40
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts +2 -1
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts.map +1 -1
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js +2 -1
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js.map +1 -1
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.tsx +3 -1
- package/dist/components/core/solid-agent/types.d.ts +3 -0
- package/dist/components/core/solid-agent/types.d.ts.map +1 -1
- package/dist/components/core/solid-agent/types.js +0 -9
- package/dist/components/core/solid-agent/types.js.map +1 -1
- package/dist/components/core/solid-agent/types.ts +4 -2
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js +5 -2
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.tsx +11 -5
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js +19 -0
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.tsx +20 -0
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/solidChatWidgets.module.css +9 -1
- package/dist/components/core/users/CreateUser.d.ts.map +1 -1
- package/dist/components/core/users/CreateUser.js +23 -8
- package/dist/components/core/users/CreateUser.js.map +1 -1
- package/dist/components/core/users/CreateUser.tsx +10 -6
- package/dist/components/layout/AdminTopHeader.js +2 -2
- package/dist/components/layout/AdminTopHeader.js.map +1 -1
- package/dist/components/layout/AdminTopHeader.tsx +2 -2
- package/dist/components/layout/AppSidebar.d.ts.map +1 -1
- package/dist/components/layout/AppSidebar.js +21 -5
- package/dist/components/layout/AppSidebar.js.map +1 -1
- package/dist/components/layout/AppSidebar.tsx +24 -6
- package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -1
- package/dist/components/layout/SolidAiStudioLayout.js +3 -4
- package/dist/components/layout/SolidAiStudioLayout.js.map +1 -1
- package/dist/components/layout/SolidAiStudioLayout.tsx +3 -4
- package/dist/components/layout/user-profile-menu.js +10 -10
- package/dist/components/layout/user-profile-menu.js.map +1 -1
- package/dist/components/layout/user-profile-menu.tsx +3 -3
- package/dist/components/shad-cn-ui/SolidLightbox.d.ts +2 -1
- package/dist/components/shad-cn-ui/SolidLightbox.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidLightbox.js +11 -4
- package/dist/components/shad-cn-ui/SolidLightbox.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidLightbox.tsx +14 -1
- package/dist/helpers/modelViewPersistence.d.ts +2 -0
- package/dist/helpers/modelViewPersistence.d.ts.map +1 -1
- package/dist/helpers/modelViewPersistence.js +72 -0
- package/dist/helpers/modelViewPersistence.js.map +1 -1
- package/dist/helpers/modelViewPersistence.ts +79 -0
- package/dist/helpers/registry.d.ts +6 -2
- package/dist/helpers/registry.d.ts.map +1 -1
- package/dist/helpers/registry.js +68 -3
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/registry.ts +62 -4
- package/dist/hooks/useModelsDevModels.d.ts +43 -0
- package/dist/hooks/useModelsDevModels.d.ts.map +1 -0
- package/dist/hooks/useModelsDevModels.js +81 -0
- package/dist/hooks/useModelsDevModels.js.map +1 -0
- package/dist/hooks/useModelsDevModels.ts +106 -0
- package/dist/hooks/useRouter.d.ts.map +1 -1
- package/dist/hooks/useRouter.js +3 -2
- package/dist/hooks/useRouter.js.map +1 -1
- package/dist/hooks/useRouter.ts +3 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.ts +4 -1
- package/dist/modules/solidUiModule.d.ts +3 -2
- package/dist/modules/solidUiModule.d.ts.map +1 -1
- package/dist/modules/solidUiModule.js +1 -1
- package/dist/modules/solidUiModule.js.map +1 -1
- package/dist/modules/solidUiModule.ts +5 -1
- package/dist/redux/api/moduleApi.d.ts +12 -2
- package/dist/redux/api/moduleApi.d.ts.map +1 -1
- package/dist/redux/api/moduleApi.js +33 -3
- package/dist/redux/api/moduleApi.js.map +1 -1
- package/dist/redux/api/moduleApi.ts +17 -2
- package/dist/redux/api/solidChatterMessageApi.d.ts +3 -1
- package/dist/redux/api/solidChatterMessageApi.d.ts.map +1 -1
- package/dist/redux/api/solidChatterMessageApi.js +9 -1
- package/dist/redux/api/solidChatterMessageApi.js.map +1 -1
- package/dist/redux/api/solidChatterMessageApi.ts +9 -1
- package/dist/redux/store/defaultStoreConfig.d.ts +9 -1
- package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
- package/dist/resources/globals.css +30 -0
- package/dist/resources/solid-custom.css +10 -6
- package/dist/resources/solid-tailwind-generated.css +1 -1
- package/dist/routes/AppEventListener.js +1 -1
- package/dist/routes/AppEventListener.js.map +1 -1
- package/dist/routes/AppEventListener.tsx +1 -1
- package/dist/routes/pages/admin/core/AgentPersonaHistory.css +130 -0
- package/dist/routes/pages/admin/core/AgentPersonaHistory.d.ts +7 -0
- package/dist/routes/pages/admin/core/AgentPersonaHistory.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/AgentPersonaHistory.js +228 -0
- package/dist/routes/pages/admin/core/AgentPersonaHistory.js.map +1 -0
- package/dist/routes/pages/admin/core/AgentPersonaHistory.tsx +234 -0
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.css +6 -14
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js +186 -146
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js.map +1 -1
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.tsx +170 -118
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.d.ts +2 -0
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js +108 -0
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js.map +1 -0
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.tsx +96 -0
- package/dist/routes/solidRoutes.d.ts.map +1 -1
- package/dist/routes/solidRoutes.js +2 -0
- package/dist/routes/solidRoutes.js.map +1 -1
- package/dist/routes/solidRoutes.tsx +2 -0
- package/dist/types/extension-registry.d.ts +12 -0
- package/dist/types/extension-registry.d.ts.map +1 -1
- package/dist/types/extension-registry.js.map +1 -1
- package/dist/types/extension-registry.ts +15 -0
- package/dist/types/solid-core.d.ts +2 -0
- package/package.json +2 -1
|
@@ -46,6 +46,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
48
|
import { eventBus } from "../../../../helpers/eventBus";
|
|
49
|
+
import { getAgentChatWidgetCatalog } from "../../../../helpers/registry";
|
|
49
50
|
import { agentConnectionChanged, agentEventReceived, agentHistoryLoaded, agentThreadReset, agentUserMessageAdded, } from "../../../../redux/features/agentSlice";
|
|
50
51
|
import { historyToItems, normalizeAgentFrame } from "../agentEvents";
|
|
51
52
|
import { SOLID_AGENT_EVENTS } from "../sdk/solidAgent";
|
|
@@ -143,6 +144,30 @@ var AgentRuntime = /** @class */ (function () {
|
|
|
143
144
|
writable: true,
|
|
144
145
|
value: void 0
|
|
145
146
|
});
|
|
147
|
+
Object.defineProperty(this, "historySessionId", {
|
|
148
|
+
enumerable: true,
|
|
149
|
+
configurable: true,
|
|
150
|
+
writable: true,
|
|
151
|
+
value: null
|
|
152
|
+
});
|
|
153
|
+
Object.defineProperty(this, "historyGeneration", {
|
|
154
|
+
enumerable: true,
|
|
155
|
+
configurable: true,
|
|
156
|
+
writable: true,
|
|
157
|
+
value: 0
|
|
158
|
+
});
|
|
159
|
+
Object.defineProperty(this, "loadingHistoryPages", {
|
|
160
|
+
enumerable: true,
|
|
161
|
+
configurable: true,
|
|
162
|
+
writable: true,
|
|
163
|
+
value: new Map()
|
|
164
|
+
});
|
|
165
|
+
Object.defineProperty(this, "loadedHistoryPages", {
|
|
166
|
+
enumerable: true,
|
|
167
|
+
configurable: true,
|
|
168
|
+
writable: true,
|
|
169
|
+
value: new Set()
|
|
170
|
+
});
|
|
146
171
|
Object.defineProperty(this, "sessionKey", {
|
|
147
172
|
enumerable: true,
|
|
148
173
|
configurable: true,
|
|
@@ -150,7 +175,7 @@ var AgentRuntime = /** @class */ (function () {
|
|
|
150
175
|
value: void 0
|
|
151
176
|
});
|
|
152
177
|
this.sessionKey = sessionKey(agentRuntime, agentUrl);
|
|
153
|
-
this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === "agentHub");
|
|
178
|
+
this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === "agentHub", agentRuntime === "agentHub" ? getAgentChatWidgetCatalog() : []);
|
|
154
179
|
this.unsubscribers.push(this.socket.onEvent(function (frame) { return _this.handleFrame(frame); }), this.socket.onStatus(function (status) { return _this.dispatch(agentConnectionChanged(status)); }));
|
|
155
180
|
this.socket.connect();
|
|
156
181
|
}
|
|
@@ -230,6 +255,7 @@ var AgentRuntime = /** @class */ (function () {
|
|
|
230
255
|
configurable: true,
|
|
231
256
|
writable: true,
|
|
232
257
|
value: function () {
|
|
258
|
+
this.resetHistoryLoads();
|
|
233
259
|
if (this.persistSession)
|
|
234
260
|
writeSessionId(this.sessionKey, null);
|
|
235
261
|
this.lastContext = undefined;
|
|
@@ -242,6 +268,7 @@ var AgentRuntime = /** @class */ (function () {
|
|
|
242
268
|
configurable: true,
|
|
243
269
|
writable: true,
|
|
244
270
|
value: function (sessionId) {
|
|
271
|
+
this.resetHistoryLoads();
|
|
245
272
|
if (this.persistSession)
|
|
246
273
|
writeSessionId(this.sessionKey, sessionId);
|
|
247
274
|
this.dispatch(agentThreadReset());
|
|
@@ -270,11 +297,23 @@ var AgentRuntime = /** @class */ (function () {
|
|
|
270
297
|
});
|
|
271
298
|
}
|
|
272
299
|
});
|
|
300
|
+
Object.defineProperty(AgentRuntime.prototype, "resetHistoryLoads", {
|
|
301
|
+
enumerable: false,
|
|
302
|
+
configurable: true,
|
|
303
|
+
writable: true,
|
|
304
|
+
value: function () {
|
|
305
|
+
this.historyGeneration += 1;
|
|
306
|
+
this.historySessionId = null;
|
|
307
|
+
this.loadingHistoryPages.clear();
|
|
308
|
+
this.loadedHistoryPages.clear();
|
|
309
|
+
}
|
|
310
|
+
});
|
|
273
311
|
Object.defineProperty(AgentRuntime.prototype, "dispose", {
|
|
274
312
|
enumerable: false,
|
|
275
313
|
configurable: true,
|
|
276
314
|
writable: true,
|
|
277
315
|
value: function () {
|
|
316
|
+
this.resetHistoryLoads();
|
|
278
317
|
this.unsubscribers.forEach(function (off) { return off(); });
|
|
279
318
|
if (this.frame != null)
|
|
280
319
|
cancelAnimationFrame(this.frame);
|
|
@@ -286,35 +325,49 @@ var AgentRuntime = /** @class */ (function () {
|
|
|
286
325
|
configurable: true,
|
|
287
326
|
writable: true,
|
|
288
327
|
value: function (historySessionId, page) {
|
|
289
|
-
var _a;
|
|
328
|
+
var _a, _b;
|
|
290
329
|
return __awaiter(this, void 0, void 0, function () {
|
|
291
|
-
var result, rawItems, items,
|
|
292
|
-
return __generator(this, function (
|
|
293
|
-
switch (
|
|
330
|
+
var key, generation, result, rawItems, items, _c, _d;
|
|
331
|
+
return __generator(this, function (_e) {
|
|
332
|
+
switch (_e.label) {
|
|
294
333
|
case 0:
|
|
295
|
-
|
|
296
|
-
|
|
334
|
+
key = "".concat(historySessionId, ":").concat(page);
|
|
335
|
+
if (this.loadingHistoryPages.has(key) || this.loadedHistoryPages.has(key))
|
|
336
|
+
return [2 /*return*/];
|
|
337
|
+
generation = this.historyGeneration;
|
|
338
|
+
this.loadingHistoryPages.set(key, generation);
|
|
339
|
+
_e.label = 1;
|
|
297
340
|
case 1:
|
|
298
|
-
|
|
341
|
+
_e.trys.push([1, 6, 7, 8]);
|
|
342
|
+
return [4 /*yield*/, fetchSessionHistory(this.agentUrl, historySessionId, page)];
|
|
343
|
+
case 2:
|
|
344
|
+
result = _e.sent();
|
|
299
345
|
if (!result)
|
|
300
346
|
return [2 /*return*/];
|
|
301
347
|
rawItems = historyToItems((_a = result.messages) !== null && _a !== void 0 ? _a : []);
|
|
302
|
-
if (!this.persistSession) return [3 /*break*/,
|
|
348
|
+
if (!this.persistSession) return [3 /*break*/, 4];
|
|
303
349
|
return [4 /*yield*/, resolveAttachmentMedia(rawItems)];
|
|
304
|
-
case 2:
|
|
305
|
-
_b = _d.sent();
|
|
306
|
-
return [3 /*break*/, 4];
|
|
307
350
|
case 3:
|
|
308
|
-
|
|
309
|
-
|
|
351
|
+
_c = _e.sent();
|
|
352
|
+
return [3 /*break*/, 5];
|
|
310
353
|
case 4:
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
return [3 /*break*/, 6];
|
|
354
|
+
_c = rawItems;
|
|
355
|
+
_e.label = 5;
|
|
314
356
|
case 5:
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
357
|
+
items = _c;
|
|
358
|
+
if (generation !== this.historyGeneration || ((_b = this.getState()) === null || _b === void 0 ? void 0 : _b.historySessionId) !== historySessionId)
|
|
359
|
+
return [2 /*return*/];
|
|
360
|
+
this.dispatch(agentHistoryLoaded({ items: items, hasMore: !!result.has_more, page: page }));
|
|
361
|
+
this.loadedHistoryPages.add(key);
|
|
362
|
+
return [3 /*break*/, 8];
|
|
363
|
+
case 6:
|
|
364
|
+
_d = _e.sent();
|
|
365
|
+
return [3 /*break*/, 8];
|
|
366
|
+
case 7:
|
|
367
|
+
if (this.loadingHistoryPages.get(key) === generation)
|
|
368
|
+
this.loadingHistoryPages.delete(key);
|
|
369
|
+
return [7 /*endfinally*/];
|
|
370
|
+
case 8: return [2 /*return*/];
|
|
318
371
|
}
|
|
319
372
|
});
|
|
320
373
|
});
|
|
@@ -354,6 +407,10 @@ var AgentRuntime = /** @class */ (function () {
|
|
|
354
407
|
eventBus.emit(SOLID_AGENT_EVENTS.sessionChanged, { sessionId: sessionId, agentType: this.agentRuntime });
|
|
355
408
|
var state = this.getState();
|
|
356
409
|
var historyId = (_d = (_c = event.frame.history_session_id) !== null && _c !== void 0 ? _c : event.eventData.history_session_id) !== null && _d !== void 0 ? _d : sessionId;
|
|
410
|
+
if (historyId !== this.historySessionId) {
|
|
411
|
+
this.resetHistoryLoads();
|
|
412
|
+
this.historySessionId = historyId;
|
|
413
|
+
}
|
|
357
414
|
if (state && state.items.length === 0 && historyId)
|
|
358
415
|
void this.loadHistory(historyId, 1);
|
|
359
416
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentRuntime.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["import { eventBus } from \"../../../../helpers/eventBus\";\nimport {\n agentConnectionChanged,\n agentEventReceived,\n agentHistoryLoaded,\n agentThreadReset,\n agentUserMessageAdded,\n type AgentState,\n} from \"../../../../redux/features/agentSlice\";\nimport { historyToItems, normalizeAgentFrame } from \"../agentEvents\";\nimport { SOLID_AGENT_EVENTS } from \"../sdk/solidAgent\";\nimport { AgentEventTypes, type AgentRuntimeType, type AgentAttachment, type AgentChatEvent, type AgentContext, type AgentWireFrame } from \"../types\";\nimport { resolveAttachmentMedia } from \"./agentAttachmentMedia\";\nimport { clearAllAgentAuth } from \"./agentAuth\";\nimport { fetchSessionHistory, uploadAgentAttachments } from \"./agentRest\";\nimport { AgentSocket } from \"./agentSocket\";\nimport { agentIdOf } from \"./agentUrls\";\n\n/**\n * A live connection to one agent backend. The \"solidx\" runtime is shared by the floating window and\n * any embedded chat of that type (ensureAgentRuntime); other types get their own runtime per\n * embedded chat (see useAgentChat). Owns the AgentSocket, normalises frames to `{ eventType, eventData }`, batches LlmToken\n * deltas to one dispatch per animation frame, loads history on session start, and emits the\n * public SDK events on the event bus.\n */\n\ntype Dispatch = (action: any) => any;\ntype GetAgentState = () => AgentState | undefined;\n\n/** Keep the original SolidX storage key; Agent Hub keeps one per agent (its agent URL names the agent). */\nfunction sessionKey(agentRuntime: AgentRuntimeType, agentUrl: string) {\n if (agentRuntime === \"solidx\") return \"solid-agent.session_id\";\n const agentId = agentIdOf(agentUrl);\n return agentId === undefined ? `solid-agent.${agentRuntime}.session_id` : `solid-agent.${agentRuntime}.${agentId}.session_id`;\n}\n\nfunction readSessionId(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction writeSessionId(key: string, id: string | null) {\n try {\n id ? localStorage.setItem(key, id) : localStorage.removeItem(key);\n } catch {\n // Storage blocked (private mode); the session just won't survive a reload.\n }\n}\n\nexport class AgentRuntime {\n readonly socket: AgentSocket;\n private pendingDelta = \"\";\n private frame: number | null = null;\n private unsubscribers: Array<() => void> = [];\n private lastContext: AgentContext | undefined;\n\n private readonly sessionKey: string;\n\n constructor(\n readonly agentUrl: string,\n private dispatch: Dispatch,\n private getState: GetAgentState,\n readonly agentRuntime: AgentRuntimeType = \"solidx\",\n private persistSession = true,\n ) {\n this.sessionKey = sessionKey(agentRuntime, agentUrl);\n this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === \"agentHub\");\n this.unsubscribers.push(\n this.socket.onEvent((frame) => this.handleFrame(frame)),\n this.socket.onStatus((status) => this.dispatch(agentConnectionChanged(status))),\n );\n this.socket.connect();\n }\n\n /**\n * Uploads files into SolidX media storage first, then sends their IDs with the socket message.\n */\n async sendMessage(text: string, context?: AgentContext, attachments: AgentAttachment[] = [], inputs?: Record<string, unknown>) {\n const content = text.trim();\n if (!content && !attachments.length) return;\n const uploaded = attachments.length\n ? await uploadAgentAttachments(this.agentUrl, attachments.map((item) => item.file))\n : [];\n if (uploaded.length !== attachments.length) {\n throw new Error(\"SolidX did not confirm every uploaded file. Please retry.\");\n }\n if (context) this.lastContext = context;\n const displayAttachments = attachments.map((item, index) => ({\n ...item.meta,\n ...(uploaded[index] ? { mediaId: uploaded[index].id } : {}),\n }));\n this.dispatch(agentUserMessageAdded({ text: content, attachments: displayAttachments }));\n this.socket.send({\n action: \"message\",\n session_id: this.socket.currentSessionId ?? \"\",\n content,\n context: context ?? this.lastContext,\n ...(this.agentRuntime === \"agentHub\" && inputs ? { inputs } : {}),\n ...(attachments.length ? { attachments: uploaded } : {}),\n });\n }\n\n /** Answers a widget. Sent as text too, so agents without widget_reply support still understand it. */\n replyToWidget(widgetId: string, widget: string, value: unknown) {\n const text = typeof value === \"string\" ? value : Array.isArray(value) ? value.join(\", \") : JSON.stringify(value);\n this.dispatch(agentUserMessageAdded({ text }));\n this.socket.send({\n action: \"message\",\n session_id: this.socket.currentSessionId ?? \"\",\n content: text,\n context: this.lastContext,\n widget_reply: { widgetId, value },\n });\n eventBus.emit(SOLID_AGENT_EVENTS.widgetAction, { widgetId, widget, value, agentType: this.agentRuntime });\n }\n\n cancel() {\n const sessionId = this.socket.currentSessionId;\n if (sessionId) this.socket.send({ action: \"cancel\", session_id: sessionId });\n }\n\n newChat() {\n if (this.persistSession) writeSessionId(this.sessionKey, null);\n this.lastContext = undefined;\n this.dispatch(agentThreadReset());\n this.socket.newSession();\n }\n\n resume(sessionId: string) {\n if (this.persistSession) writeSessionId(this.sessionKey, sessionId);\n this.dispatch(agentThreadReset());\n this.socket.resume(sessionId);\n }\n\n async loadOlder() {\n const state = this.getState();\n if (!state?.historySessionId || !state.hasMoreHistory) return;\n await this.loadHistory(state.historySessionId, state.historyPage + 1);\n }\n\n dispose() {\n this.unsubscribers.forEach((off) => off());\n if (this.frame != null) cancelAnimationFrame(this.frame);\n this.socket.close();\n }\n\n private async loadHistory(historySessionId: string, page: number) {\n try {\n const result = await fetchSessionHistory(this.agentUrl, historySessionId, page);\n if (!result) return;\n // Attached files are stored in Solid media storage; resolve their URLs before showing.\n const rawItems = historyToItems(result.messages ?? []);\n const items = this.persistSession ? await resolveAttachmentMedia(rawItems) : rawItems;\n this.dispatch(agentHistoryLoaded({ items, hasMore: !!result.has_more, page }));\n } catch {\n // History is a convenience; the live session still works without it.\n }\n }\n\n private handleFrame(frame: AgentWireFrame) {\n const event = normalizeAgentFrame(frame);\n\n // Stream text is batched per animation frame unless it carries a widget of its own.\n if (event.eventType === AgentEventTypes.llmToken && !event.eventData.widget) {\n this.pendingDelta += event.eventData.delta ?? \"\";\n if (this.frame == null) this.frame = requestAnimationFrame(() => this.flushTokens());\n return;\n }\n // Keep order: any buffered text lands before the next event.\n this.flushTokens();\n this.dispatch(agentEventReceived(event));\n this.emitSdkEvents(event);\n }\n\n private emitSdkEvents(event: AgentChatEvent) {\n if (event.eventType === AgentEventTypes.sessionStarted) {\n const sessionId = event.frame.session_id ?? event.eventData.session_id ?? null;\n if (this.persistSession) writeSessionId(this.sessionKey, sessionId);\n eventBus.emit(SOLID_AGENT_EVENTS.sessionChanged, { sessionId, agentType: this.agentRuntime });\n const state = this.getState();\n const historyId = event.frame.history_session_id ?? event.eventData.history_session_id ?? sessionId;\n if (state && state.items.length === 0 && historyId) void this.loadHistory(historyId, 1);\n } else if (event.eventType === AgentEventTypes.turnComplete || event.eventType === AgentEventTypes.turnCompleteLegacy) {\n eventBus.emit(SOLID_AGENT_EVENTS.turnComplete, {\n sessionId: this.socket.currentSessionId,\n agentType: this.agentRuntime,\n content: event.eventData.content ?? event.frame.content,\n });\n }\n }\n\n private flushTokens() {\n if (this.frame != null) {\n cancelAnimationFrame(this.frame);\n this.frame = null;\n }\n if (!this.pendingDelta) return;\n const delta = this.pendingDelta;\n this.pendingDelta = \"\";\n this.dispatch(agentEventReceived(normalizeAgentFrame({ event_type: AgentEventTypes.llmToken, event_data: { delta } })));\n }\n}\n\nlet runtime: AgentRuntime | null = null;\n\n/** Returns the shared \"solidx\" runtime, creating (or re-pointing) it for `agentUrl`. */\nexport function ensureAgentRuntime(agentUrl: string, dispatch: Dispatch, getState: GetAgentState): AgentRuntime {\n if (runtime && runtime.agentUrl === agentUrl) return runtime;\n runtime?.dispose();\n runtime = new AgentRuntime(agentUrl, dispatch, getState);\n return runtime;\n}\n\nexport function getAgentRuntime(): AgentRuntime | null {\n return runtime;\n}\n\n/** Closes the connection and forgets this tab's agent logins (e.g. on logout). */\nexport function disposeAgentRuntime() {\n runtime?.dispose();\n runtime = null;\n clearAllAgentAuth();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agentRuntime.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["import { eventBus } from \"../../../../helpers/eventBus\";\nimport { getAgentChatWidgetCatalog } from \"../../../../helpers/registry\";\nimport {\n agentConnectionChanged,\n agentEventReceived,\n agentHistoryLoaded,\n agentThreadReset,\n agentUserMessageAdded,\n type AgentState,\n} from \"../../../../redux/features/agentSlice\";\nimport { historyToItems, normalizeAgentFrame } from \"../agentEvents\";\nimport { SOLID_AGENT_EVENTS } from \"../sdk/solidAgent\";\nimport { AgentEventTypes, type AgentRuntimeType, type AgentAttachment, type AgentChatEvent, type AgentContext, type AgentWireFrame } from \"../types\";\nimport { resolveAttachmentMedia } from \"./agentAttachmentMedia\";\nimport { clearAllAgentAuth } from \"./agentAuth\";\nimport { fetchSessionHistory, uploadAgentAttachments } from \"./agentRest\";\nimport { AgentSocket } from \"./agentSocket\";\nimport { agentIdOf } from \"./agentUrls\";\n\n/**\n * A live connection to one agent backend. The \"solidx\" runtime is shared by the floating window and\n * any embedded chat of that type (ensureAgentRuntime); other types get their own runtime per\n * embedded chat (see useAgentChat). Owns the AgentSocket, normalises frames to `{ eventType, eventData }`, batches LlmToken\n * deltas to one dispatch per animation frame, loads history on session start, and emits the\n * public SDK events on the event bus.\n */\n\ntype Dispatch = (action: any) => any;\ntype GetAgentState = () => AgentState | undefined;\n\n/** Keep the original SolidX storage key; Agent Hub keeps one per agent (its agent URL names the agent). */\nfunction sessionKey(agentRuntime: AgentRuntimeType, agentUrl: string) {\n if (agentRuntime === \"solidx\") return \"solid-agent.session_id\";\n const agentId = agentIdOf(agentUrl);\n return agentId === undefined ? `solid-agent.${agentRuntime}.session_id` : `solid-agent.${agentRuntime}.${agentId}.session_id`;\n}\n\nfunction readSessionId(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction writeSessionId(key: string, id: string | null) {\n try {\n id ? localStorage.setItem(key, id) : localStorage.removeItem(key);\n } catch {\n // Storage blocked (private mode); the session just won't survive a reload.\n }\n}\n\nexport class AgentRuntime {\n readonly socket: AgentSocket;\n private pendingDelta = \"\";\n private frame: number | null = null;\n private unsubscribers: Array<() => void> = [];\n private lastContext: AgentContext | undefined;\n private historySessionId: string | null = null;\n private historyGeneration = 0;\n private loadingHistoryPages = new Map<string, number>();\n private loadedHistoryPages = new Set<string>();\n\n private readonly sessionKey: string;\n\n constructor(\n readonly agentUrl: string,\n private dispatch: Dispatch,\n private getState: GetAgentState,\n readonly agentRuntime: AgentRuntimeType = \"solidx\",\n private persistSession = true,\n ) {\n this.sessionKey = sessionKey(agentRuntime, agentUrl);\n this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === \"agentHub\",\n agentRuntime === \"agentHub\" ? getAgentChatWidgetCatalog() : []);\n this.unsubscribers.push(\n this.socket.onEvent((frame) => this.handleFrame(frame)),\n this.socket.onStatus((status) => this.dispatch(agentConnectionChanged(status))),\n );\n this.socket.connect();\n }\n\n /**\n * Uploads files into SolidX media storage first, then sends their IDs with the socket message.\n */\n async sendMessage(text: string, context?: AgentContext, attachments: AgentAttachment[] = [], inputs?: Record<string, unknown>) {\n const content = text.trim();\n if (!content && !attachments.length) return;\n const uploaded = attachments.length\n ? await uploadAgentAttachments(this.agentUrl, attachments.map((item) => item.file))\n : [];\n if (uploaded.length !== attachments.length) {\n throw new Error(\"SolidX did not confirm every uploaded file. Please retry.\");\n }\n if (context) this.lastContext = context;\n const displayAttachments = attachments.map((item, index) => ({\n ...item.meta,\n ...(uploaded[index] ? { mediaId: uploaded[index].id } : {}),\n }));\n this.dispatch(agentUserMessageAdded({ text: content, attachments: displayAttachments }));\n this.socket.send({\n action: \"message\",\n session_id: this.socket.currentSessionId ?? \"\",\n content,\n context: context ?? this.lastContext,\n ...(this.agentRuntime === \"agentHub\" && inputs ? { inputs } : {}),\n ...(attachments.length ? { attachments: uploaded } : {}),\n });\n }\n\n /** Answers a widget. Sent as text too, so agents without widget_reply support still understand it. */\n replyToWidget(widgetId: string, widget: string, value: unknown) {\n const text = typeof value === \"string\" ? value : Array.isArray(value) ? value.join(\", \") : JSON.stringify(value);\n this.dispatch(agentUserMessageAdded({ text }));\n this.socket.send({\n action: \"message\",\n session_id: this.socket.currentSessionId ?? \"\",\n content: text,\n context: this.lastContext,\n widget_reply: { widgetId, value },\n });\n eventBus.emit(SOLID_AGENT_EVENTS.widgetAction, { widgetId, widget, value, agentType: this.agentRuntime });\n }\n\n cancel() {\n const sessionId = this.socket.currentSessionId;\n if (sessionId) this.socket.send({ action: \"cancel\", session_id: sessionId });\n }\n\n newChat() {\n this.resetHistoryLoads();\n if (this.persistSession) writeSessionId(this.sessionKey, null);\n this.lastContext = undefined;\n this.dispatch(agentThreadReset());\n this.socket.newSession();\n }\n\n resume(sessionId: string) {\n this.resetHistoryLoads();\n if (this.persistSession) writeSessionId(this.sessionKey, sessionId);\n this.dispatch(agentThreadReset());\n this.socket.resume(sessionId);\n }\n\n async loadOlder() {\n const state = this.getState();\n if (!state?.historySessionId || !state.hasMoreHistory) return;\n await this.loadHistory(state.historySessionId, state.historyPage + 1);\n }\n\n private resetHistoryLoads() {\n this.historyGeneration += 1;\n this.historySessionId = null;\n this.loadingHistoryPages.clear();\n this.loadedHistoryPages.clear();\n }\n\n dispose() {\n this.resetHistoryLoads();\n this.unsubscribers.forEach((off) => off());\n if (this.frame != null) cancelAnimationFrame(this.frame);\n this.socket.close();\n }\n\n private async loadHistory(historySessionId: string, page: number) {\n const key = `${historySessionId}:${page}`;\n if (this.loadingHistoryPages.has(key) || this.loadedHistoryPages.has(key)) return;\n const generation = this.historyGeneration;\n this.loadingHistoryPages.set(key, generation);\n try {\n const result = await fetchSessionHistory(this.agentUrl, historySessionId, page);\n if (!result) return;\n // Attached files are stored in Solid media storage; resolve their URLs before showing.\n const rawItems = historyToItems(result.messages ?? []);\n const items = this.persistSession ? await resolveAttachmentMedia(rawItems) : rawItems;\n if (generation !== this.historyGeneration || this.getState()?.historySessionId !== historySessionId) return;\n this.dispatch(agentHistoryLoaded({ items, hasMore: !!result.has_more, page }));\n this.loadedHistoryPages.add(key);\n } catch {\n // History is a convenience; the live session still works without it.\n } finally {\n if (this.loadingHistoryPages.get(key) === generation) this.loadingHistoryPages.delete(key);\n }\n }\n\n private handleFrame(frame: AgentWireFrame) {\n const event = normalizeAgentFrame(frame);\n\n // Stream text is batched per animation frame unless it carries a widget of its own.\n if (event.eventType === AgentEventTypes.llmToken && !event.eventData.widget) {\n this.pendingDelta += event.eventData.delta ?? \"\";\n if (this.frame == null) this.frame = requestAnimationFrame(() => this.flushTokens());\n return;\n }\n // Keep order: any buffered text lands before the next event.\n this.flushTokens();\n this.dispatch(agentEventReceived(event));\n this.emitSdkEvents(event);\n }\n\n private emitSdkEvents(event: AgentChatEvent) {\n if (event.eventType === AgentEventTypes.sessionStarted) {\n const sessionId = event.frame.session_id ?? event.eventData.session_id ?? null;\n if (this.persistSession) writeSessionId(this.sessionKey, sessionId);\n eventBus.emit(SOLID_AGENT_EVENTS.sessionChanged, { sessionId, agentType: this.agentRuntime });\n const state = this.getState();\n const historyId = event.frame.history_session_id ?? event.eventData.history_session_id ?? sessionId;\n if (historyId !== this.historySessionId) {\n this.resetHistoryLoads();\n this.historySessionId = historyId;\n }\n if (state && state.items.length === 0 && historyId) void this.loadHistory(historyId, 1);\n } else if (event.eventType === AgentEventTypes.turnComplete || event.eventType === AgentEventTypes.turnCompleteLegacy) {\n eventBus.emit(SOLID_AGENT_EVENTS.turnComplete, {\n sessionId: this.socket.currentSessionId,\n agentType: this.agentRuntime,\n content: event.eventData.content ?? event.frame.content,\n });\n }\n }\n\n private flushTokens() {\n if (this.frame != null) {\n cancelAnimationFrame(this.frame);\n this.frame = null;\n }\n if (!this.pendingDelta) return;\n const delta = this.pendingDelta;\n this.pendingDelta = \"\";\n this.dispatch(agentEventReceived(normalizeAgentFrame({ event_type: AgentEventTypes.llmToken, event_data: { delta } })));\n }\n}\n\nlet runtime: AgentRuntime | null = null;\n\n/** Returns the shared \"solidx\" runtime, creating (or re-pointing) it for `agentUrl`. */\nexport function ensureAgentRuntime(agentUrl: string, dispatch: Dispatch, getState: GetAgentState): AgentRuntime {\n if (runtime && runtime.agentUrl === agentUrl) return runtime;\n runtime?.dispose();\n runtime = new AgentRuntime(agentUrl, dispatch, getState);\n return runtime;\n}\n\nexport function getAgentRuntime(): AgentRuntime | null {\n return runtime;\n}\n\n/** Closes the connection and forgets this tab's agent logins (e.g. on logout). */\nexport function disposeAgentRuntime() {\n runtime?.dispose();\n runtime = null;\n clearAllAgentAuth();\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { eventBus } from "../../../../helpers/eventBus";
|
|
2
|
+
import { getAgentChatWidgetCatalog } from "../../../../helpers/registry";
|
|
2
3
|
import {
|
|
3
4
|
agentConnectionChanged,
|
|
4
5
|
agentEventReceived,
|
|
@@ -56,6 +57,10 @@ export class AgentRuntime {
|
|
|
56
57
|
private frame: number | null = null;
|
|
57
58
|
private unsubscribers: Array<() => void> = [];
|
|
58
59
|
private lastContext: AgentContext | undefined;
|
|
60
|
+
private historySessionId: string | null = null;
|
|
61
|
+
private historyGeneration = 0;
|
|
62
|
+
private loadingHistoryPages = new Map<string, number>();
|
|
63
|
+
private loadedHistoryPages = new Set<string>();
|
|
59
64
|
|
|
60
65
|
private readonly sessionKey: string;
|
|
61
66
|
|
|
@@ -67,7 +72,8 @@ export class AgentRuntime {
|
|
|
67
72
|
private persistSession = true,
|
|
68
73
|
) {
|
|
69
74
|
this.sessionKey = sessionKey(agentRuntime, agentUrl);
|
|
70
|
-
this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === "agentHub"
|
|
75
|
+
this.socket = new AgentSocket(agentUrl, persistSession ? readSessionId(this.sessionKey) : null, agentRuntime === "agentHub",
|
|
76
|
+
agentRuntime === "agentHub" ? getAgentChatWidgetCatalog() : []);
|
|
71
77
|
this.unsubscribers.push(
|
|
72
78
|
this.socket.onEvent((frame) => this.handleFrame(frame)),
|
|
73
79
|
this.socket.onStatus((status) => this.dispatch(agentConnectionChanged(status))),
|
|
@@ -123,6 +129,7 @@ export class AgentRuntime {
|
|
|
123
129
|
}
|
|
124
130
|
|
|
125
131
|
newChat() {
|
|
132
|
+
this.resetHistoryLoads();
|
|
126
133
|
if (this.persistSession) writeSessionId(this.sessionKey, null);
|
|
127
134
|
this.lastContext = undefined;
|
|
128
135
|
this.dispatch(agentThreadReset());
|
|
@@ -130,6 +137,7 @@ export class AgentRuntime {
|
|
|
130
137
|
}
|
|
131
138
|
|
|
132
139
|
resume(sessionId: string) {
|
|
140
|
+
this.resetHistoryLoads();
|
|
133
141
|
if (this.persistSession) writeSessionId(this.sessionKey, sessionId);
|
|
134
142
|
this.dispatch(agentThreadReset());
|
|
135
143
|
this.socket.resume(sessionId);
|
|
@@ -141,22 +149,38 @@ export class AgentRuntime {
|
|
|
141
149
|
await this.loadHistory(state.historySessionId, state.historyPage + 1);
|
|
142
150
|
}
|
|
143
151
|
|
|
152
|
+
private resetHistoryLoads() {
|
|
153
|
+
this.historyGeneration += 1;
|
|
154
|
+
this.historySessionId = null;
|
|
155
|
+
this.loadingHistoryPages.clear();
|
|
156
|
+
this.loadedHistoryPages.clear();
|
|
157
|
+
}
|
|
158
|
+
|
|
144
159
|
dispose() {
|
|
160
|
+
this.resetHistoryLoads();
|
|
145
161
|
this.unsubscribers.forEach((off) => off());
|
|
146
162
|
if (this.frame != null) cancelAnimationFrame(this.frame);
|
|
147
163
|
this.socket.close();
|
|
148
164
|
}
|
|
149
165
|
|
|
150
166
|
private async loadHistory(historySessionId: string, page: number) {
|
|
167
|
+
const key = `${historySessionId}:${page}`;
|
|
168
|
+
if (this.loadingHistoryPages.has(key) || this.loadedHistoryPages.has(key)) return;
|
|
169
|
+
const generation = this.historyGeneration;
|
|
170
|
+
this.loadingHistoryPages.set(key, generation);
|
|
151
171
|
try {
|
|
152
172
|
const result = await fetchSessionHistory(this.agentUrl, historySessionId, page);
|
|
153
173
|
if (!result) return;
|
|
154
174
|
// Attached files are stored in Solid media storage; resolve their URLs before showing.
|
|
155
175
|
const rawItems = historyToItems(result.messages ?? []);
|
|
156
176
|
const items = this.persistSession ? await resolveAttachmentMedia(rawItems) : rawItems;
|
|
177
|
+
if (generation !== this.historyGeneration || this.getState()?.historySessionId !== historySessionId) return;
|
|
157
178
|
this.dispatch(agentHistoryLoaded({ items, hasMore: !!result.has_more, page }));
|
|
179
|
+
this.loadedHistoryPages.add(key);
|
|
158
180
|
} catch {
|
|
159
181
|
// History is a convenience; the live session still works without it.
|
|
182
|
+
} finally {
|
|
183
|
+
if (this.loadingHistoryPages.get(key) === generation) this.loadingHistoryPages.delete(key);
|
|
160
184
|
}
|
|
161
185
|
}
|
|
162
186
|
|
|
@@ -182,6 +206,10 @@ export class AgentRuntime {
|
|
|
182
206
|
eventBus.emit(SOLID_AGENT_EVENTS.sessionChanged, { sessionId, agentType: this.agentRuntime });
|
|
183
207
|
const state = this.getState();
|
|
184
208
|
const historyId = event.frame.history_session_id ?? event.eventData.history_session_id ?? sessionId;
|
|
209
|
+
if (historyId !== this.historySessionId) {
|
|
210
|
+
this.resetHistoryLoads();
|
|
211
|
+
this.historySessionId = historyId;
|
|
212
|
+
}
|
|
185
213
|
if (state && state.items.length === 0 && historyId) void this.loadHistory(historyId, 1);
|
|
186
214
|
} else if (event.eventType === AgentEventTypes.turnComplete || event.eventType === AgentEventTypes.turnCompleteLegacy) {
|
|
187
215
|
eventBus.emit(SOLID_AGENT_EVENTS.turnComplete, {
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { AgentAction, AgentConnection, AgentWireFrame } from "../types";
|
|
2
|
+
import type { AgentChatWidgetMetadata } from "../../../../types/extension-registry";
|
|
2
3
|
type EventListener = (frame: AgentWireFrame) => void;
|
|
3
4
|
type StatusListener = (status: AgentConnection) => void;
|
|
4
5
|
export declare class AgentSocket {
|
|
5
6
|
private agentUrl;
|
|
6
7
|
private initialSessionId;
|
|
7
8
|
private checkProcessAvailability;
|
|
9
|
+
private widgetCatalog;
|
|
8
10
|
private ws;
|
|
9
11
|
private attempt;
|
|
10
12
|
private timer;
|
|
@@ -19,8 +21,10 @@ export declare class AgentSocket {
|
|
|
19
21
|
private unacknowledgedMessage;
|
|
20
22
|
private offAuthChange;
|
|
21
23
|
private readonly debugEmbed;
|
|
22
|
-
constructor(agentUrl: string, initialSessionId?: string | null, checkProcessAvailability?: boolean);
|
|
24
|
+
constructor(agentUrl: string, initialSessionId?: string | null, checkProcessAvailability?: boolean, widgetCatalog?: AgentChatWidgetMetadata[]);
|
|
23
25
|
private openSession;
|
|
26
|
+
private startSessionAction;
|
|
27
|
+
private resumeSessionAction;
|
|
24
28
|
get currentSessionId(): string | null;
|
|
25
29
|
onEvent(listener: EventListener): () => boolean;
|
|
26
30
|
onStatus(listener: StatusListener): () => boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentSocket.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"agentSocket.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAepF,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AACrD,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;AAExD,qBAAa,WAAW;IAkBhB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,wBAAwB;IAChC,OAAO,CAAC,aAAa;IApBzB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,SAAS,CAAuB;IACxC,0FAA0F;IAC1F,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,qBAAqB,CAA4B;IAEzD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;gBAGzB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,MAAM,GAAG,IAAW,EACtC,wBAAwB,UAAQ,EAChC,aAAa,GAAE,uBAAuB,EAAO;IAazD,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,mBAAmB;IAK3B,IAAI,gBAAgB,kBAEnB;IAED,OAAO,CAAC,QAAQ,EAAE,aAAa;IAK/B,QAAQ,CAAC,QAAQ,EAAE,cAAc;IAKjC,OAAO;IAwFP,4EAA4E;IAC5E,IAAI,CAAC,MAAM,EAAE,WAAW;IAUxB,kEAAkE;IAClE,UAAU;IASV,4CAA4C;IAC5C,MAAM,CAAC,SAAS,EAAE,MAAM;IAOxB,uDAAuD;IACvD,KAAK;IASL,oEAAoE;IACpE,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,UAAU;YAUJ,OAAO;IAYrB,OAAO,CAAC,iBAAiB;YAcX,iBAAiB;IAgB/B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,YAAY;CAQvB"}
|
|
@@ -57,10 +57,11 @@ import { agentWsUrl, clearAgentAuth, isAgentProcessAvailable, loadAgentAuth, onA
|
|
|
57
57
|
*/
|
|
58
58
|
var BACKOFF_MS = [1000, 2000, 4000, 8000, 15000];
|
|
59
59
|
var AgentSocket = /** @class */ (function () {
|
|
60
|
-
function AgentSocket(agentUrl, initialSessionId, checkProcessAvailability) {
|
|
60
|
+
function AgentSocket(agentUrl, initialSessionId, checkProcessAvailability, widgetCatalog) {
|
|
61
61
|
var _this = this;
|
|
62
62
|
if (initialSessionId === void 0) { initialSessionId = null; }
|
|
63
63
|
if (checkProcessAvailability === void 0) { checkProcessAvailability = false; }
|
|
64
|
+
if (widgetCatalog === void 0) { widgetCatalog = []; }
|
|
64
65
|
Object.defineProperty(this, "agentUrl", {
|
|
65
66
|
enumerable: true,
|
|
66
67
|
configurable: true,
|
|
@@ -79,6 +80,12 @@ var AgentSocket = /** @class */ (function () {
|
|
|
79
80
|
writable: true,
|
|
80
81
|
value: checkProcessAvailability
|
|
81
82
|
});
|
|
83
|
+
Object.defineProperty(this, "widgetCatalog", {
|
|
84
|
+
enumerable: true,
|
|
85
|
+
configurable: true,
|
|
86
|
+
writable: true,
|
|
87
|
+
value: widgetCatalog
|
|
88
|
+
});
|
|
82
89
|
Object.defineProperty(this, "ws", {
|
|
83
90
|
enumerable: true,
|
|
84
91
|
configurable: true,
|
|
@@ -177,7 +184,23 @@ var AgentSocket = /** @class */ (function () {
|
|
|
177
184
|
configurable: true,
|
|
178
185
|
writable: true,
|
|
179
186
|
value: function () {
|
|
180
|
-
void this.sendRaw(this.sessionId ?
|
|
187
|
+
void this.sendRaw(this.sessionId ? this.resumeSessionAction(this.sessionId) : this.startSessionAction());
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
Object.defineProperty(AgentSocket.prototype, "startSessionAction", {
|
|
191
|
+
enumerable: false,
|
|
192
|
+
configurable: true,
|
|
193
|
+
writable: true,
|
|
194
|
+
value: function () {
|
|
195
|
+
return __assign({ action: "start_session" }, (this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}));
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
Object.defineProperty(AgentSocket.prototype, "resumeSessionAction", {
|
|
199
|
+
enumerable: false,
|
|
200
|
+
configurable: true,
|
|
201
|
+
writable: true,
|
|
202
|
+
value: function (sessionId) {
|
|
203
|
+
return __assign({ action: "resume_session", session_id: sessionId }, (this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}));
|
|
181
204
|
}
|
|
182
205
|
});
|
|
183
206
|
Object.defineProperty(AgentSocket.prototype, "currentSessionId", {
|
|
@@ -345,7 +368,7 @@ var AgentSocket = /** @class */ (function () {
|
|
|
345
368
|
this.sessionReady = false;
|
|
346
369
|
this.queue = [];
|
|
347
370
|
if (((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN)
|
|
348
|
-
void this.sendRaw(
|
|
371
|
+
void this.sendRaw(this.startSessionAction());
|
|
349
372
|
else
|
|
350
373
|
this.connect();
|
|
351
374
|
}
|
|
@@ -360,7 +383,7 @@ var AgentSocket = /** @class */ (function () {
|
|
|
360
383
|
this.sessionId = sessionId;
|
|
361
384
|
this.sessionReady = false;
|
|
362
385
|
if (((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN)
|
|
363
|
-
void this.sendRaw(
|
|
386
|
+
void this.sendRaw(this.resumeSessionAction(sessionId));
|
|
364
387
|
else
|
|
365
388
|
this.connect();
|
|
366
389
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentSocket.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentSocket.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentAction, AgentConnection, AgentWireFrame } from \"../types\";\nimport { agentWsUrl, clearAgentAuth, isAgentProcessAvailable, loadAgentAuth, onAgentAuthChange } from \"./agentAuth\";\n\n/**\n * WebSocket client for the agent, connecting to the full `wsUrl` named at sign-in (agentAuth.ts).\n *\n * Held outside Redux because sockets are not serializable; the host wires its listeners to\n * dispatch into agentSlice. Every outbound frame carries the `agentToken` from the agent login;\n * there is no socket until the user has signed in with an API key, and signing out closes it. Unexpected closes\n * reconnect with backoff (1s, 2s, 4s, then 15s) and re-send `resume_session`; frames sent\n * while disconnected are queued and flushed once the session is re-established.\n */\n\nconst BACKOFF_MS = [1000, 2000, 4000, 8000, 15000];\n\ntype EventListener = (frame: AgentWireFrame) => void;\ntype StatusListener = (status: AgentConnection) => void;\n\nexport class AgentSocket {\n private ws: WebSocket | null = null;\n private attempt = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private closedByUser = false;\n private queue: AgentAction[] = [];\n private eventListeners = new Set<EventListener>();\n private statusListeners = new Set<StatusListener>();\n private sessionId: string | null = null;\n /** False until the agent confirms the session (session_started) on the current socket. */\n private sessionReady = false;\n private checkingProcessAvailability = false;\n private unacknowledgedMessage: AgentAction | null = null;\n\n private offAuthChange: () => void;\n private readonly debugEmbed: boolean;\n\n constructor(\n private agentUrl: string,\n private initialSessionId: string | null = null,\n private checkProcessAvailability = false,\n ) {\n this.sessionId = initialSessionId;\n this.debugEmbed = !checkProcessAvailability;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] socket created\", { endpoint: this.safeEndpoint(), hasInitialSession: !!initialSessionId });\n // Signing in opens the socket on the wsUrl it named; signing out (or the token expiring) closes it.\n this.offAuthChange = onAgentAuthChange(agentUrl, () => {\n if (this.closedByUser) return;\n if (agentWsUrl(agentUrl)) this.connect();\n else this.disconnect();\n });\n }\n\n private openSession() {\n void this.sendRaw(this.sessionId ? { action: \"resume_session\", session_id: this.sessionId } : { action: \"start_session\" });\n }\n\n get currentSessionId() {\n return this.sessionId;\n }\n\n onEvent(listener: EventListener) {\n this.eventListeners.add(listener);\n return () => this.eventListeners.delete(listener);\n }\n\n onStatus(listener: StatusListener) {\n this.statusListeners.add(listener);\n return () => this.statusListeners.delete(listener);\n }\n\n connect() {\n if (this.closedByUser) return;\n const state = this.ws?.readyState;\n if (state === WebSocket.OPEN || state === WebSocket.CONNECTING) return;\n this.closedByUser = false;\n const url = agentWsUrl(this.agentUrl);\n if (!url) {\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] no WebSocket URL is available from auth yet\");\n // Not signed in: the auth listener connects once sign-in names the wsUrl.\n this.setStatus(\"idle\");\n return;\n }\n this.setStatus(this.attempt === 0 ? \"connecting\" : \"reconnecting\");\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] opening WebSocket\", { endpoint: this.safeEndpoint(url), attempt: this.attempt + 1 });\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch (error) {\n if (this.debugEmbed) console.error(\"[agent-embed][runtime] WebSocket construction failed\", { name: error instanceof Error ? error.name : \"unknown\", message: error instanceof Error ? error.message : String(error) });\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n\n ws.onopen = () => {\n if (this.ws !== ws) return;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] WebSocket open\");\n this.attempt = 0;\n this.sessionReady = false;\n this.setStatus(\"open\");\n this.openSession();\n };\n\n ws.onmessage = (message) => {\n if (this.ws !== ws) return;\n let frame: AgentWireFrame;\n try {\n frame = JSON.parse(message.data);\n } catch {\n return;\n }\n const eventType = frame.event_type ?? frame.type;\n const payload = frame.event_data ?? frame.data;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] WebSocket frame\", { eventType, hasSessionId: !!(frame.session_id ?? payload?.session_id), isError: eventType === \"error\" });\n if (eventType === \"session_started\") {\n // After an agent restart the old session is gone and resume returns a new id.\n this.sessionId = frame.session_id ?? payload?.session_id ?? null;\n this.sessionReady = true;\n this.flushQueue();\n } else if (eventType === \"error\" && /agent token/i.test(String(payload?.error ?? \"\"))) {\n // The agent forgot the token (idle 30 min or restarted): sign in again.\n this.sessionReady = false;\n if (this.unacknowledgedMessage) this.queue.push(this.unacknowledgedMessage);\n this.unacknowledgedMessage = null;\n clearAgentAuth(this.agentUrl);\n } else if (eventType === \"error\" && !this.sessionReady) {\n // Start/resume failed (e.g. auth); stop holding messages so their errors show.\n this.sessionReady = true;\n this.flushQueue();\n }\n if (eventType === \"UserMessage\" || eventType === \"turn_complete\" || eventType === \"error\") {\n this.unacknowledgedMessage = null;\n }\n // Drop frames for a different session (e.g. a late event after a switch).\n const frameSession = frame.session_id ?? payload?.session_id;\n if (eventType !== \"session_started\" && frameSession && this.sessionId && frameSession !== this.sessionId) return;\n this.eventListeners.forEach((listener) => listener(frame));\n };\n\n ws.onclose = (event) => {\n if (this.ws !== ws) return;\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] WebSocket closed\", { code: event.code, reason: event.reason, clean: event.wasClean });\n this.ws = null;\n this.sessionReady = false;\n if (this.closedByUser) {\n this.setStatus(\"idle\");\n return;\n }\n this.scheduleReconnect();\n };\n\n ws.onerror = () => {\n if (this.debugEmbed) console.error(\"[agent-embed][runtime] WebSocket error event\");\n // onclose follows and handles the reconnect.\n };\n }\n\n /** Sends an action, or queues it until the socket and session are ready. */\n send(action: AgentAction) {\n if (this.closedByUser) return;\n if (this.ws?.readyState === WebSocket.OPEN && this.sessionId && this.sessionReady) {\n void this.sendRaw(action);\n } else {\n this.queue.push(action);\n this.connect();\n }\n }\n\n /** Starts a fresh conversation (drops the current session id). */\n newSession() {\n this.unacknowledgedMessage = null;\n this.sessionId = null;\n this.sessionReady = false;\n this.queue = [];\n if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw({ action: \"start_session\" });\n else this.connect();\n }\n\n /** Switches to an existing conversation. */\n resume(sessionId: string) {\n this.sessionId = sessionId;\n this.sessionReady = false;\n if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw({ action: \"resume_session\", session_id: sessionId });\n else this.connect();\n }\n\n /** Closes for good (the runtime is being disposed). */\n close() {\n this.offAuthChange();\n this.closedByUser = true;\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.ws?.close();\n this.ws = null;\n }\n\n /** Drops the socket after sign-out; the next sign-in reconnects. */\n private disconnect() {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.attempt = 0;\n this.sessionReady = false;\n if (this.ws) {\n this.ws.onclose = null; // No reconnect.\n this.ws.close();\n this.ws = null;\n }\n this.setStatus(\"idle\");\n }\n\n private flushQueue() {\n const pending = this.queue;\n this.queue = [];\n pending.forEach((action) => {\n // Queued messages were addressed before a session existed; point them at the current one.\n const addressed = \"session_id\" in action && this.sessionId ? { ...action, session_id: this.sessionId } : action;\n void this.sendRaw(addressed as AgentAction);\n });\n }\n\n private async sendRaw(action: AgentAction) {\n const agentToken = (await loadAgentAuth(this.agentUrl))?.agentToken;\n if (!agentToken || this.ws?.readyState !== WebSocket.OPEN) {\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] skipped outbound frame\", { action: action.action, hasAgentToken: !!agentToken, socketOpen: this.ws?.readyState === WebSocket.OPEN });\n if (action.action !== \"start_session\" && action.action !== \"resume_session\") this.queue.push(action);\n return;\n }\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] sending WebSocket action\", { action: action.action });\n this.ws.send(JSON.stringify({ ...action, agentToken }));\n if (action.action === \"message\") this.unacknowledgedMessage = action;\n }\n\n private scheduleReconnect() {\n if (this.timer) return;\n const delay = BACKOFF_MS[Math.min(this.attempt, BACKOFF_MS.length - 1)];\n this.attempt += 1;\n this.setStatus(this.attempt > BACKOFF_MS.length ? \"offline\" : \"reconnecting\");\n if (this.checkProcessAvailability && this.attempt >= 2 && this.attempt % 3 === 2) {\n void this.checkAgentProcess(this.attempt);\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n this.connect();\n }, delay);\n }\n\n private async checkAgentProcess(failedAttempt: number) {\n if (this.checkingProcessAvailability) return;\n this.checkingProcessAvailability = true;\n try {\n const auth = await loadAgentAuth(this.agentUrl);\n if (!auth || this.closedByUser || this.attempt !== failedAttempt) return;\n if (!(await isAgentProcessAvailable(auth)) && !this.closedByUser && this.attempt === failedAttempt) {\n // Repeated WebSocket failures plus a failed process health check mean the stored\n // endpoint is stale. Returning to sign-in lets the manager issue a fresh wsUrl.\n clearAgentAuth(this.agentUrl);\n }\n } finally {\n this.checkingProcessAvailability = false;\n }\n }\n\n private setStatus(status: AgentConnection) {\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] connection status\", { status });\n this.statusListeners.forEach((listener) => listener(status));\n }\n\n private safeEndpoint(url = this.agentUrl) {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}`;\n } catch {\n return \"invalid-url\";\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agentSocket.js","sourceRoot":"","sources":["../../../../../src/components/core/solid-agent/client/agentSocket.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentAction, AgentConnection, AgentWireFrame } from \"../types\";\nimport type { AgentChatWidgetMetadata } from \"../../../../types/extension-registry\";\nimport { agentWsUrl, clearAgentAuth, isAgentProcessAvailable, loadAgentAuth, onAgentAuthChange } from \"./agentAuth\";\n\n/**\n * WebSocket client for the agent, connecting to the full `wsUrl` named at sign-in (agentAuth.ts).\n *\n * Held outside Redux because sockets are not serializable; the host wires its listeners to\n * dispatch into agentSlice. Every outbound frame carries the `agentToken` from the agent login;\n * there is no socket until the user has signed in with an API key, and signing out closes it. Unexpected closes\n * reconnect with backoff (1s, 2s, 4s, then 15s) and re-send `resume_session`; frames sent\n * while disconnected are queued and flushed once the session is re-established.\n */\n\nconst BACKOFF_MS = [1000, 2000, 4000, 8000, 15000];\n\ntype EventListener = (frame: AgentWireFrame) => void;\ntype StatusListener = (status: AgentConnection) => void;\n\nexport class AgentSocket {\n private ws: WebSocket | null = null;\n private attempt = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private closedByUser = false;\n private queue: AgentAction[] = [];\n private eventListeners = new Set<EventListener>();\n private statusListeners = new Set<StatusListener>();\n private sessionId: string | null = null;\n /** False until the agent confirms the session (session_started) on the current socket. */\n private sessionReady = false;\n private checkingProcessAvailability = false;\n private unacknowledgedMessage: AgentAction | null = null;\n\n private offAuthChange: () => void;\n private readonly debugEmbed: boolean;\n\n constructor(\n private agentUrl: string,\n private initialSessionId: string | null = null,\n private checkProcessAvailability = false,\n private widgetCatalog: AgentChatWidgetMetadata[] = [],\n ) {\n this.sessionId = initialSessionId;\n this.debugEmbed = !checkProcessAvailability;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] socket created\", { endpoint: this.safeEndpoint(), hasInitialSession: !!initialSessionId });\n // Signing in opens the socket on the wsUrl it named; signing out (or the token expiring) closes it.\n this.offAuthChange = onAgentAuthChange(agentUrl, () => {\n if (this.closedByUser) return;\n if (agentWsUrl(agentUrl)) this.connect();\n else this.disconnect();\n });\n }\n\n private openSession() {\n void this.sendRaw(this.sessionId ? this.resumeSessionAction(this.sessionId) : this.startSessionAction());\n }\n\n private startSessionAction(): AgentAction {\n return { action: \"start_session\", ...(this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}) };\n }\n\n private resumeSessionAction(sessionId: string): AgentAction {\n return { action: \"resume_session\", session_id: sessionId,\n ...(this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}) };\n }\n\n get currentSessionId() {\n return this.sessionId;\n }\n\n onEvent(listener: EventListener) {\n this.eventListeners.add(listener);\n return () => this.eventListeners.delete(listener);\n }\n\n onStatus(listener: StatusListener) {\n this.statusListeners.add(listener);\n return () => this.statusListeners.delete(listener);\n }\n\n connect() {\n if (this.closedByUser) return;\n const state = this.ws?.readyState;\n if (state === WebSocket.OPEN || state === WebSocket.CONNECTING) return;\n this.closedByUser = false;\n const url = agentWsUrl(this.agentUrl);\n if (!url) {\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] no WebSocket URL is available from auth yet\");\n // Not signed in: the auth listener connects once sign-in names the wsUrl.\n this.setStatus(\"idle\");\n return;\n }\n this.setStatus(this.attempt === 0 ? \"connecting\" : \"reconnecting\");\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] opening WebSocket\", { endpoint: this.safeEndpoint(url), attempt: this.attempt + 1 });\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch (error) {\n if (this.debugEmbed) console.error(\"[agent-embed][runtime] WebSocket construction failed\", { name: error instanceof Error ? error.name : \"unknown\", message: error instanceof Error ? error.message : String(error) });\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n\n ws.onopen = () => {\n if (this.ws !== ws) return;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] WebSocket open\");\n this.attempt = 0;\n this.sessionReady = false;\n this.setStatus(\"open\");\n this.openSession();\n };\n\n ws.onmessage = (message) => {\n if (this.ws !== ws) return;\n let frame: AgentWireFrame;\n try {\n frame = JSON.parse(message.data);\n } catch {\n return;\n }\n const eventType = frame.event_type ?? frame.type;\n const payload = frame.event_data ?? frame.data;\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] WebSocket frame\", { eventType, hasSessionId: !!(frame.session_id ?? payload?.session_id), isError: eventType === \"error\" });\n if (eventType === \"session_started\") {\n // After an agent restart the old session is gone and resume returns a new id.\n this.sessionId = frame.session_id ?? payload?.session_id ?? null;\n this.sessionReady = true;\n this.flushQueue();\n } else if (eventType === \"error\" && /agent token/i.test(String(payload?.error ?? \"\"))) {\n // The agent forgot the token (idle 30 min or restarted): sign in again.\n this.sessionReady = false;\n if (this.unacknowledgedMessage) this.queue.push(this.unacknowledgedMessage);\n this.unacknowledgedMessage = null;\n clearAgentAuth(this.agentUrl);\n } else if (eventType === \"error\" && !this.sessionReady) {\n // Start/resume failed (e.g. auth); stop holding messages so their errors show.\n this.sessionReady = true;\n this.flushQueue();\n }\n if (eventType === \"UserMessage\" || eventType === \"turn_complete\" || eventType === \"error\") {\n this.unacknowledgedMessage = null;\n }\n // Drop frames for a different session (e.g. a late event after a switch).\n const frameSession = frame.session_id ?? payload?.session_id;\n if (eventType !== \"session_started\" && frameSession && this.sessionId && frameSession !== this.sessionId) return;\n this.eventListeners.forEach((listener) => listener(frame));\n };\n\n ws.onclose = (event) => {\n if (this.ws !== ws) return;\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] WebSocket closed\", { code: event.code, reason: event.reason, clean: event.wasClean });\n this.ws = null;\n this.sessionReady = false;\n if (this.closedByUser) {\n this.setStatus(\"idle\");\n return;\n }\n this.scheduleReconnect();\n };\n\n ws.onerror = () => {\n if (this.debugEmbed) console.error(\"[agent-embed][runtime] WebSocket error event\");\n // onclose follows and handles the reconnect.\n };\n }\n\n /** Sends an action, or queues it until the socket and session are ready. */\n send(action: AgentAction) {\n if (this.closedByUser) return;\n if (this.ws?.readyState === WebSocket.OPEN && this.sessionId && this.sessionReady) {\n void this.sendRaw(action);\n } else {\n this.queue.push(action);\n this.connect();\n }\n }\n\n /** Starts a fresh conversation (drops the current session id). */\n newSession() {\n this.unacknowledgedMessage = null;\n this.sessionId = null;\n this.sessionReady = false;\n this.queue = [];\n if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw(this.startSessionAction());\n else this.connect();\n }\n\n /** Switches to an existing conversation. */\n resume(sessionId: string) {\n this.sessionId = sessionId;\n this.sessionReady = false;\n if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw(this.resumeSessionAction(sessionId));\n else this.connect();\n }\n\n /** Closes for good (the runtime is being disposed). */\n close() {\n this.offAuthChange();\n this.closedByUser = true;\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.ws?.close();\n this.ws = null;\n }\n\n /** Drops the socket after sign-out; the next sign-in reconnects. */\n private disconnect() {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n this.attempt = 0;\n this.sessionReady = false;\n if (this.ws) {\n this.ws.onclose = null; // No reconnect.\n this.ws.close();\n this.ws = null;\n }\n this.setStatus(\"idle\");\n }\n\n private flushQueue() {\n const pending = this.queue;\n this.queue = [];\n pending.forEach((action) => {\n // Queued messages were addressed before a session existed; point them at the current one.\n const addressed = \"session_id\" in action && this.sessionId ? { ...action, session_id: this.sessionId } : action;\n void this.sendRaw(addressed as AgentAction);\n });\n }\n\n private async sendRaw(action: AgentAction) {\n const agentToken = (await loadAgentAuth(this.agentUrl))?.agentToken;\n if (!agentToken || this.ws?.readyState !== WebSocket.OPEN) {\n if (this.debugEmbed) console.warn(\"[agent-embed][runtime] skipped outbound frame\", { action: action.action, hasAgentToken: !!agentToken, socketOpen: this.ws?.readyState === WebSocket.OPEN });\n if (action.action !== \"start_session\" && action.action !== \"resume_session\") this.queue.push(action);\n return;\n }\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] sending WebSocket action\", { action: action.action });\n this.ws.send(JSON.stringify({ ...action, agentToken }));\n if (action.action === \"message\") this.unacknowledgedMessage = action;\n }\n\n private scheduleReconnect() {\n if (this.timer) return;\n const delay = BACKOFF_MS[Math.min(this.attempt, BACKOFF_MS.length - 1)];\n this.attempt += 1;\n this.setStatus(this.attempt > BACKOFF_MS.length ? \"offline\" : \"reconnecting\");\n if (this.checkProcessAvailability && this.attempt >= 2 && this.attempt % 3 === 2) {\n void this.checkAgentProcess(this.attempt);\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n this.connect();\n }, delay);\n }\n\n private async checkAgentProcess(failedAttempt: number) {\n if (this.checkingProcessAvailability) return;\n this.checkingProcessAvailability = true;\n try {\n const auth = await loadAgentAuth(this.agentUrl);\n if (!auth || this.closedByUser || this.attempt !== failedAttempt) return;\n if (!(await isAgentProcessAvailable(auth)) && !this.closedByUser && this.attempt === failedAttempt) {\n // Repeated WebSocket failures plus a failed process health check mean the stored\n // endpoint is stale. Returning to sign-in lets the manager issue a fresh wsUrl.\n clearAgentAuth(this.agentUrl);\n }\n } finally {\n this.checkingProcessAvailability = false;\n }\n }\n\n private setStatus(status: AgentConnection) {\n if (this.debugEmbed) console.info(\"[agent-embed][runtime] connection status\", { status });\n this.statusListeners.forEach((listener) => listener(status));\n }\n\n private safeEndpoint(url = this.agentUrl) {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}`;\n } catch {\n return \"invalid-url\";\n }\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AgentAction, AgentConnection, AgentWireFrame } from "../types";
|
|
2
|
+
import type { AgentChatWidgetMetadata } from "../../../../types/extension-registry";
|
|
2
3
|
import { agentWsUrl, clearAgentAuth, isAgentProcessAvailable, loadAgentAuth, onAgentAuthChange } from "./agentAuth";
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -37,6 +38,7 @@ export class AgentSocket {
|
|
|
37
38
|
private agentUrl: string,
|
|
38
39
|
private initialSessionId: string | null = null,
|
|
39
40
|
private checkProcessAvailability = false,
|
|
41
|
+
private widgetCatalog: AgentChatWidgetMetadata[] = [],
|
|
40
42
|
) {
|
|
41
43
|
this.sessionId = initialSessionId;
|
|
42
44
|
this.debugEmbed = !checkProcessAvailability;
|
|
@@ -50,7 +52,16 @@ export class AgentSocket {
|
|
|
50
52
|
}
|
|
51
53
|
|
|
52
54
|
private openSession() {
|
|
53
|
-
void this.sendRaw(this.sessionId ?
|
|
55
|
+
void this.sendRaw(this.sessionId ? this.resumeSessionAction(this.sessionId) : this.startSessionAction());
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private startSessionAction(): AgentAction {
|
|
59
|
+
return { action: "start_session", ...(this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}) };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private resumeSessionAction(sessionId: string): AgentAction {
|
|
63
|
+
return { action: "resume_session", session_id: sessionId,
|
|
64
|
+
...(this.widgetCatalog.length ? { widget_catalog: this.widgetCatalog } : {}) };
|
|
54
65
|
}
|
|
55
66
|
|
|
56
67
|
get currentSessionId() {
|
|
@@ -172,7 +183,7 @@ export class AgentSocket {
|
|
|
172
183
|
this.sessionId = null;
|
|
173
184
|
this.sessionReady = false;
|
|
174
185
|
this.queue = [];
|
|
175
|
-
if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw(
|
|
186
|
+
if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw(this.startSessionAction());
|
|
176
187
|
else this.connect();
|
|
177
188
|
}
|
|
178
189
|
|
|
@@ -180,7 +191,7 @@ export class AgentSocket {
|
|
|
180
191
|
resume(sessionId: string) {
|
|
181
192
|
this.sessionId = sessionId;
|
|
182
193
|
this.sessionReady = false;
|
|
183
|
-
if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw(
|
|
194
|
+
if (this.ws?.readyState === WebSocket.OPEN) void this.sendRaw(this.resumeSessionAction(sessionId));
|
|
184
195
|
else this.connect();
|
|
185
196
|
}
|
|
186
197
|
|