@adminide-stack/yantra-mobile 12.0.28-alpha.7 → 12.0.28-alpha.72
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/lib/api/stt.js +54 -0
- package/lib/api/stt.js.map +1 -0
- package/lib/assets/icon.png +0 -0
- package/lib/components/CustomDrawer.js +479 -0
- package/lib/components/CustomDrawer.js.map +1 -0
- package/lib/components/GatewayConnector/GatewayConnector.js +18 -0
- package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -0
- package/lib/components/GatewayToolbarButtonMobile.js +84 -0
- package/lib/components/GatewayToolbarButtonMobile.js.map +1 -0
- package/lib/components/NavigationHeader/NavigationHeader.js +214 -0
- package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -0
- package/lib/components/ThinkingIndicator.js +55 -0
- package/lib/components/ThinkingIndicator.js.map +1 -0
- package/lib/components/YantraBrandLoader.js +94 -0
- package/lib/components/YantraBrandLoader.js.map +1 -0
- package/lib/compute.js +114 -5
- package/lib/compute.js.map +1 -1
- package/lib/config/constants.js +16 -0
- package/lib/config/constants.js.map +1 -0
- package/lib/config/env-config.js +74 -19
- package/lib/config/env-config.js.map +1 -1
- package/lib/contexts/CdecliConnectionContext.js +47 -0
- package/lib/contexts/CdecliConnectionContext.js.map +1 -0
- package/lib/contexts/GatewayContext.js +77 -0
- package/lib/contexts/GatewayContext.js.map +1 -0
- package/lib/features/audio-input/AudioRecorderPanel.js +224 -0
- package/lib/features/audio-input/AudioRecorderPanel.js.map +1 -0
- package/lib/features/audio-input/MicErrorBoundary.js +34 -0
- package/lib/features/audio-input/MicErrorBoundary.js.map +1 -0
- package/lib/graphql/agentGatewayDocuments.js +53 -0
- package/lib/graphql/agentGatewayDocuments.js.map +1 -0
- package/lib/hooks/useCdecliAutoConnect.js +242 -0
- package/lib/hooks/useCdecliAutoConnect.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +226 -0
- package/lib/hooks/useCdecliChannel.js.map +1 -0
- package/lib/hooks/useChatApi.js +338 -171
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +281 -64
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/hooks/useGatewayConnection.js +123 -0
- package/lib/hooks/useGatewayConnection.js.map +1 -0
- package/lib/hooks/useGatewayRegistry.js +28 -0
- package/lib/hooks/useGatewayRegistry.js.map +1 -0
- package/lib/hooks/usePrerequisiteIds.js +181 -0
- package/lib/hooks/usePrerequisiteIds.js.map +1 -0
- package/lib/hooks/useWorkspaceProvisioner.js +236 -0
- package/lib/hooks/useWorkspaceProvisioner.js.map +1 -0
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/routes.json +120 -5
- package/lib/screens/Chat/index.js +404 -0
- package/lib/screens/Chat/index.js.map +1 -0
- package/lib/screens/ChatHistory/index.js +56 -0
- package/lib/screens/ChatHistory/index.js.map +1 -0
- package/lib/screens/Home/HomeScreen.js +397 -143
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +487 -0
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -0
- package/lib/screens/Home/components/DeepSearchModal.js +349 -0
- package/lib/screens/Home/components/DeepSearchModal.js.map +1 -0
- package/lib/screens/Home/deepSearchUtils.js +41 -0
- package/lib/screens/Home/deepSearchUtils.js.map +1 -0
- package/lib/screens/NewChat/index.js +79 -0
- package/lib/screens/NewChat/index.js.map +1 -0
- package/lib/services/agentSessionManager.js +451 -0
- package/lib/services/agentSessionManager.js.map +1 -0
- package/lib/services/gatewayApiKeyBridge.js +4 -0
- package/lib/services/gatewayApiKeyBridge.js.map +1 -0
- package/lib/services/gatewayClient.js +470 -0
- package/lib/services/gatewayClient.js.map +1 -0
- package/lib/theme/mobileTokens.js +18 -0
- package/lib/theme/mobileTokens.js.map +1 -0
- package/lib/utils/gatewaySelectionStorage.js +21 -0
- package/lib/utils/gatewaySelectionStorage.js.map +1 -0
- package/package.json +7 -3
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useMemo,useRef,useEffect}from'react';import {View}from'react-native';import {useNavigation,useRoute}from'@react-navigation/native';import {navigationRef}from'@common-stack/client-react';import {ContributionSchemaId}from'common';import {useGetContextDataQuery,useGetPageSettingsQuery}from'common/graphql';import {Text}from'@admin-layout/gluestack-ui-mobile';import {YantraBrandLoader}from'../../components/YantraBrandLoader.js';import {mobileTokens}from'../../theme/mobileTokens.js';function organizationFromSettingsValue(settings) {
|
|
2
|
+
if (settings == null) return null;
|
|
3
|
+
if (typeof settings === "string") {
|
|
4
|
+
try {
|
|
5
|
+
const parsed = JSON.parse(settings);
|
|
6
|
+
const o = parsed == null ? void 0 : parsed.organization;
|
|
7
|
+
return typeof o === "string" && o.trim() ? o.trim() : null;
|
|
8
|
+
} catch (e) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
if (typeof settings === "object" && settings !== null && "organization" in settings) {
|
|
13
|
+
const o = settings.organization;
|
|
14
|
+
return typeof o === "string" && o.trim() ? o.trim() : null;
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
function NewChat() {
|
|
19
|
+
var _a, _b, _c;
|
|
20
|
+
const navigation = useNavigation();
|
|
21
|
+
const route = useRoute();
|
|
22
|
+
const {
|
|
23
|
+
data: contextData
|
|
24
|
+
} = useGetContextDataQuery();
|
|
25
|
+
const cdecodeUri = (_a = contextData == null ? void 0 : contextData.getContextData) == null ? void 0 : _a.cdecodeUri;
|
|
26
|
+
const {
|
|
27
|
+
data: pageSettingsData,
|
|
28
|
+
loading: pageSettingsLoading
|
|
29
|
+
} = useGetPageSettingsQuery({
|
|
30
|
+
variables: {
|
|
31
|
+
resourceUri: cdecodeUri,
|
|
32
|
+
options: {
|
|
33
|
+
schemaId: ContributionSchemaId.Configuration,
|
|
34
|
+
configKey: "account.default",
|
|
35
|
+
includeMarketplace: true
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
skip: !cdecodeUri,
|
|
39
|
+
fetchPolicy: "cache-first"
|
|
40
|
+
});
|
|
41
|
+
const settingsOrgName = useMemo(() => {
|
|
42
|
+
var _a2;
|
|
43
|
+
return organizationFromSettingsValue((_a2 = pageSettingsData == null ? void 0 : pageSettingsData.pageSettings) == null ? void 0 : _a2.settings);
|
|
44
|
+
}, [pageSettingsData]);
|
|
45
|
+
const routeOrgName = ((_c = (_b = route == null ? void 0 : route.params) == null ? void 0 : _b.orgName) == null ? void 0 : _c.trim()) || null;
|
|
46
|
+
const resolvedOrgName = settingsOrgName || routeOrgName || null;
|
|
47
|
+
const hasNavigatedRef = useRef(false);
|
|
48
|
+
const waitingForOrg = !routeOrgName && (!cdecodeUri || pageSettingsLoading || !settingsOrgName);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (hasNavigatedRef.current || waitingForOrg) return;
|
|
51
|
+
const go = (org) => {
|
|
52
|
+
if (hasNavigatedRef.current) return;
|
|
53
|
+
const params = org ? {
|
|
54
|
+
orgName: org
|
|
55
|
+
} : void 0;
|
|
56
|
+
if (navigationRef.isReady()) {
|
|
57
|
+
navigationRef.navigate("MainStack", {
|
|
58
|
+
screen: "MainStack.Layout.Home",
|
|
59
|
+
params
|
|
60
|
+
});
|
|
61
|
+
hasNavigatedRef.current = true;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
navigation.navigate("MainStack.Layout.Home", params);
|
|
65
|
+
hasNavigatedRef.current = true;
|
|
66
|
+
};
|
|
67
|
+
go(resolvedOrgName);
|
|
68
|
+
}, [resolvedOrgName, waitingForOrg, navigation]);
|
|
69
|
+
return /* @__PURE__ */ jsxs(View, { style: {
|
|
70
|
+
flex: 1,
|
|
71
|
+
alignItems: "center",
|
|
72
|
+
justifyContent: "center",
|
|
73
|
+
backgroundColor: mobileTokens.color.bg,
|
|
74
|
+
gap: 10
|
|
75
|
+
}, children: [
|
|
76
|
+
/* @__PURE__ */ jsx(YantraBrandLoader, {}),
|
|
77
|
+
/* @__PURE__ */ jsx(Text, { color: mobileTokens.color.textMuted, fontSize: "$sm", children: "Preparing your workspace..." })
|
|
78
|
+
] });
|
|
79
|
+
}export{NewChat as default};//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/screens/NewChat/index.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\nimport { View } from 'react-native';\nimport { useNavigation, useRoute } from '@react-navigation/native';\nimport { navigationRef } from '@common-stack/client-react';\nimport { ContributionSchemaId } from 'common';\nimport { useGetContextDataQuery, useGetPageSettingsQuery } from 'common/graphql';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { YantraBrandLoader } from '../../components/YantraBrandLoader';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\n/** `pageSettings.settings` may be object or JSON string. */\nfunction organizationFromSettingsValue(settings: unknown): string | null {\n if (settings == null) return null;\n if (typeof settings === 'string') {\n try {\n const parsed = JSON.parse(settings) as { organization?: string };\n const o = parsed?.organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n } catch {\n return null;\n }\n }\n if (typeof settings === 'object' && settings !== null && 'organization' in settings) {\n const o = (settings as { organization?: unknown }).organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n }\n return null;\n}\n\nexport default function NewChat() {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const { data: contextData } = useGetContextDataQuery();\n const cdecodeUri = contextData?.getContextData?.cdecodeUri;\n\n const { data: pageSettingsData, loading: pageSettingsLoading } = useGetPageSettingsQuery({\n variables: {\n resourceUri: cdecodeUri as never,\n options: {\n schemaId: ContributionSchemaId.Configuration,\n configKey: 'account.default',\n includeMarketplace: true,\n },\n },\n skip: !cdecodeUri,\n fetchPolicy: 'cache-first',\n });\n\n const settingsOrgName = useMemo(\n () => organizationFromSettingsValue(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n\n const routeOrgName = (route?.params?.orgName as string | undefined)?.trim() || null;\n const resolvedOrgName = settingsOrgName || routeOrgName || null;\n const hasNavigatedRef = useRef(false);\n const waitingForOrg = !routeOrgName && (!cdecodeUri || pageSettingsLoading || !settingsOrgName);\n\n useEffect(() => {\n if (hasNavigatedRef.current || waitingForOrg) return;\n\n const go = (org?: string | null) => {\n if (hasNavigatedRef.current) return;\n const params = org ? { orgName: org } : undefined;\n if (navigationRef.isReady()) {\n navigationRef.navigate(\n 'MainStack' as never,\n {\n screen: 'MainStack.Layout.Home',\n params,\n } as never,\n );\n hasNavigatedRef.current = true;\n return;\n }\n navigation.navigate('MainStack.Layout.Home', params);\n hasNavigatedRef.current = true;\n };\n\n // Navigate only when orgName is available so backend context URI is correct.\n go(resolvedOrgName);\n }, [resolvedOrgName, waitingForOrg, navigation]);\n\n return (\n <View\n style={{\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.bg,\n gap: 10,\n }}\n >\n <YantraBrandLoader />\n <Text color={mobileTokens.color.textMuted} fontSize=\"$sm\">\n Preparing your workspace...\n </Text>\n </View>\n );\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import {MAX_CONCURRENT_TASKS}from'../config/constants.js';import {resetGatewayApiKeyBridge}from'./gatewayApiKeyBridge.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
21
|
+
function sanitizeGatewayError(raw) {
|
|
22
|
+
if (/No API key found for provider/i.test(raw)) {
|
|
23
|
+
const providerMatch = raw.match(/provider\s+["']?(\w+)["']?/i);
|
|
24
|
+
const provider = (providerMatch == null ? void 0 : providerMatch[1]) || "the AI model";
|
|
25
|
+
return `The gateway server is missing the API key for ${provider}. Please contact your administrator to configure the LLM credentials.`;
|
|
26
|
+
}
|
|
27
|
+
const agentFailedMatch = raw.match(/Agent failed before reply:\s*(.+)/i);
|
|
28
|
+
if (agentFailedMatch) {
|
|
29
|
+
return sanitizeGatewayError(agentFailedMatch[1]);
|
|
30
|
+
}
|
|
31
|
+
if (/rate.?limit|overloaded|too many requests/i.test(raw)) {
|
|
32
|
+
return "The AI service is temporarily overloaded. Please wait a moment and try again.";
|
|
33
|
+
}
|
|
34
|
+
if (/context.?overflow|prompt.*too large|token limit/i.test(raw)) {
|
|
35
|
+
return "The message is too long for the selected model. Try a shorter message or switch to a model with a larger context window.";
|
|
36
|
+
}
|
|
37
|
+
const scrubbed = raw.replace(/\boclaw\b/gi, "").replace(/\bopenclaw\b/gi, "").replace(/auth-profiles\.json/gi, "").replace(/agentDir:[^.)\n]*/gi, "").replace(/Logs:\s*openclaw logs[^\n]*/gi, "").replace(/Configure auth for this agent[^.\n]*/gi, "").replace(/\s{2,}/g, " ").trim();
|
|
38
|
+
return scrubbed || "An unexpected error occurred. Please try again.";
|
|
39
|
+
}
|
|
40
|
+
class AgentSessionManagerImpl {
|
|
41
|
+
constructor() {
|
|
42
|
+
__publicField(this, "client", null);
|
|
43
|
+
__publicField(this, "state", {
|
|
44
|
+
gatewayConnected: false,
|
|
45
|
+
gatewayStatus: null,
|
|
46
|
+
agents: [],
|
|
47
|
+
defaultAgentId: null,
|
|
48
|
+
models: [],
|
|
49
|
+
skills: [],
|
|
50
|
+
tasks: [],
|
|
51
|
+
activeTaskId: null
|
|
52
|
+
});
|
|
53
|
+
__publicField(this, "listeners", /* @__PURE__ */ new Set());
|
|
54
|
+
__publicField(this, "chatHandler", null);
|
|
55
|
+
/** External callback to pipe gateway chat stream events into the main chat UI. */
|
|
56
|
+
__publicField(this, "chatStreamCallback", null);
|
|
57
|
+
}
|
|
58
|
+
/** Set a callback to receive chat stream events (delta/complete/error). */
|
|
59
|
+
setChatStreamCallback(cb) {
|
|
60
|
+
this.chatStreamCallback = cb;
|
|
61
|
+
}
|
|
62
|
+
/** Subscribe to state changes. Returns unsubscribe function. */
|
|
63
|
+
subscribe(listener) {
|
|
64
|
+
this.listeners.add(listener);
|
|
65
|
+
listener(this.state);
|
|
66
|
+
return () => this.listeners.delete(listener);
|
|
67
|
+
}
|
|
68
|
+
getState() {
|
|
69
|
+
return this.state;
|
|
70
|
+
}
|
|
71
|
+
getClient() {
|
|
72
|
+
return this.client;
|
|
73
|
+
}
|
|
74
|
+
// ─── Gateway Connection ─────────────────────────────────
|
|
75
|
+
/** Attach a connected GatewayClient and sync state. */
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
77
|
+
async attachGateway(client, _hello) {
|
|
78
|
+
this.detachGateway();
|
|
79
|
+
this.client = client;
|
|
80
|
+
this.chatHandler = (payload) => this.handleChatEvent(payload);
|
|
81
|
+
client.on("chat", this.chatHandler);
|
|
82
|
+
client.on("disconnect", () => {
|
|
83
|
+
this.update({
|
|
84
|
+
gatewayConnected: false,
|
|
85
|
+
gatewayStatus: null
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
await this.syncGatewayState();
|
|
89
|
+
this.update({
|
|
90
|
+
gatewayConnected: true
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/** Detach the current gateway client. */
|
|
94
|
+
detachGateway() {
|
|
95
|
+
if (this.client && this.chatHandler) {
|
|
96
|
+
this.client.off("chat", this.chatHandler);
|
|
97
|
+
this.chatHandler = null;
|
|
98
|
+
}
|
|
99
|
+
this.client = null;
|
|
100
|
+
this.update({
|
|
101
|
+
gatewayConnected: false,
|
|
102
|
+
gatewayStatus: null,
|
|
103
|
+
agents: [],
|
|
104
|
+
defaultAgentId: null,
|
|
105
|
+
models: [],
|
|
106
|
+
skills: []
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/** Re-fetch agents, models, skills, status from the gateway. */
|
|
110
|
+
async syncGatewayState() {
|
|
111
|
+
var _a, _b;
|
|
112
|
+
if (!((_a = this.client) == null ? void 0 : _a.connected)) return;
|
|
113
|
+
try {
|
|
114
|
+
const [status, agentsResp, models, skillsResp] = await Promise.all([this.client.getStatus().catch(() => null), this.client.listAgents().catch(() => ({
|
|
115
|
+
defaultId: "",
|
|
116
|
+
agents: []
|
|
117
|
+
})), this.client.listModels().catch(() => []), this.client.getSkillsStatus().catch(() => ({
|
|
118
|
+
skills: []
|
|
119
|
+
}))]);
|
|
120
|
+
const defaultAgentId = agentsResp.defaultId || ((_b = agentsResp.agents[0]) == null ? void 0 : _b.id) || null;
|
|
121
|
+
this.update({
|
|
122
|
+
gatewayStatus: status,
|
|
123
|
+
agents: agentsResp.agents,
|
|
124
|
+
defaultAgentId,
|
|
125
|
+
models,
|
|
126
|
+
skills: skillsResp.skills
|
|
127
|
+
});
|
|
128
|
+
} catch (err) {
|
|
129
|
+
console.error("[AgentSessionManager] Failed to sync gateway state:", err);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ─── Task Management ────────────────────────────────────
|
|
133
|
+
/** Whether a new task can be created (respects MAX_CONCURRENT_TASKS). */
|
|
134
|
+
get canCreateTask() {
|
|
135
|
+
return this.state.tasks.length < MAX_CONCURRENT_TASKS;
|
|
136
|
+
}
|
|
137
|
+
/** Create a new task bound to a gateway agent session. */
|
|
138
|
+
createTask(opts) {
|
|
139
|
+
if (!this.canCreateTask) {
|
|
140
|
+
console.warn("[AgentSessionManager] Task limit reached:", MAX_CONCURRENT_TASKS);
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
const task = {
|
|
144
|
+
id: crypto.randomUUID(),
|
|
145
|
+
sessionKey: opts.sessionKey || "default",
|
|
146
|
+
title: opts.title,
|
|
147
|
+
status: "idle",
|
|
148
|
+
runId: null,
|
|
149
|
+
messages: [],
|
|
150
|
+
skillTemplate: opts.skillTemplate || null,
|
|
151
|
+
skillTemplateName: opts.skillTemplateName || null,
|
|
152
|
+
model: opts.model || null,
|
|
153
|
+
error: null,
|
|
154
|
+
createdAt: Date.now(),
|
|
155
|
+
updatedAt: Date.now()
|
|
156
|
+
};
|
|
157
|
+
const tasks = [...this.state.tasks, task];
|
|
158
|
+
this.update({
|
|
159
|
+
tasks,
|
|
160
|
+
activeTaskId: task.id
|
|
161
|
+
});
|
|
162
|
+
return task;
|
|
163
|
+
}
|
|
164
|
+
/** Send a message in a task's agent session. */
|
|
165
|
+
async sendMessage(taskId, message) {
|
|
166
|
+
var _a, _b, _c;
|
|
167
|
+
const task = this.state.tasks.find((t) => t.id === taskId);
|
|
168
|
+
if (!task || !((_a = this.client) == null ? void 0 : _a.connected)) {
|
|
169
|
+
const reason = !task ? "task not found" : "gateway not connected";
|
|
170
|
+
console.warn("[AgentSessionManager] sendMessage skipped:", reason);
|
|
171
|
+
(_b = this.chatStreamCallback) == null ? void 0 : _b.call(this, {
|
|
172
|
+
type: "error",
|
|
173
|
+
error: sanitizeGatewayError(`Cannot send message: ${reason}`)
|
|
174
|
+
});
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
const userMsg = {
|
|
178
|
+
id: crypto.randomUUID(),
|
|
179
|
+
role: "user",
|
|
180
|
+
content: message,
|
|
181
|
+
timestamp: Date.now()
|
|
182
|
+
};
|
|
183
|
+
this.updateTask(taskId, {
|
|
184
|
+
status: "running",
|
|
185
|
+
messages: [...task.messages, userMsg],
|
|
186
|
+
error: null
|
|
187
|
+
});
|
|
188
|
+
try {
|
|
189
|
+
console.log("[AgentSessionManager] Sending message to session:", task.sessionKey);
|
|
190
|
+
const resp = await this.client.sendChatMessage(task.sessionKey, message);
|
|
191
|
+
console.log("[AgentSessionManager] chat.send returned runId:", resp.runId, "status:", resp.status);
|
|
192
|
+
this.updateTask(taskId, {
|
|
193
|
+
runId: resp.runId
|
|
194
|
+
});
|
|
195
|
+
return resp;
|
|
196
|
+
} catch (err) {
|
|
197
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
198
|
+
console.error("[AgentSessionManager] sendMessage failed:", errorMsg);
|
|
199
|
+
const userError = sanitizeGatewayError(errorMsg);
|
|
200
|
+
this.updateTask(taskId, {
|
|
201
|
+
status: "failed",
|
|
202
|
+
error: userError
|
|
203
|
+
});
|
|
204
|
+
(_c = this.chatStreamCallback) == null ? void 0 : _c.call(this, {
|
|
205
|
+
type: "error",
|
|
206
|
+
error: userError
|
|
207
|
+
});
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/** Abort the running task. */
|
|
212
|
+
async abortTask(taskId) {
|
|
213
|
+
var _a;
|
|
214
|
+
const task = this.state.tasks.find((t) => t.id === taskId);
|
|
215
|
+
if (!(task == null ? void 0 : task.runId) || !((_a = this.client) == null ? void 0 : _a.connected)) return;
|
|
216
|
+
try {
|
|
217
|
+
await this.client.abortChat(task.runId);
|
|
218
|
+
this.updateTask(taskId, {
|
|
219
|
+
status: "aborted",
|
|
220
|
+
runId: null
|
|
221
|
+
});
|
|
222
|
+
} catch (err) {
|
|
223
|
+
console.error("[AgentSessionManager] Failed to abort task:", err);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/** Remove a task. */
|
|
227
|
+
removeTask(taskId) {
|
|
228
|
+
const tasks = this.state.tasks.filter((t) => t.id !== taskId);
|
|
229
|
+
const {
|
|
230
|
+
activeTaskId: currentActiveId
|
|
231
|
+
} = this.state;
|
|
232
|
+
let activeTaskId = currentActiveId;
|
|
233
|
+
if (currentActiveId === taskId) {
|
|
234
|
+
activeTaskId = tasks.length > 0 ? tasks[tasks.length - 1].id : null;
|
|
235
|
+
}
|
|
236
|
+
this.update({
|
|
237
|
+
tasks,
|
|
238
|
+
activeTaskId
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
/** Set the active (focused) task. */
|
|
242
|
+
setActiveTask(taskId) {
|
|
243
|
+
this.update({
|
|
244
|
+
activeTaskId: taskId
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/** Update a locally managed task without routing through the gateway. */
|
|
248
|
+
updateLocalTask(taskId, patch) {
|
|
249
|
+
const task = this.state.tasks.find((item) => item.id === taskId);
|
|
250
|
+
if (!task) return;
|
|
251
|
+
this.updateTask(taskId, patch);
|
|
252
|
+
}
|
|
253
|
+
/** Load chat history from gateway for an existing task. */
|
|
254
|
+
async loadTaskHistory(taskId) {
|
|
255
|
+
var _a;
|
|
256
|
+
const task = this.state.tasks.find((t) => t.id === taskId);
|
|
257
|
+
if (!task || !((_a = this.client) == null ? void 0 : _a.connected)) return;
|
|
258
|
+
try {
|
|
259
|
+
const history = await this.client.getChatHistory(task.sessionKey);
|
|
260
|
+
const messages = history.messages.map((m, i) => ({
|
|
261
|
+
id: `history-${i}`,
|
|
262
|
+
role: m.role,
|
|
263
|
+
content: typeof m.content === "string" ? m.content : m.content.map((b) => b.text || "").join(""),
|
|
264
|
+
timestamp: m.timestamp || task.createdAt + i,
|
|
265
|
+
usage: m.usage
|
|
266
|
+
}));
|
|
267
|
+
this.updateTask(taskId, {
|
|
268
|
+
messages
|
|
269
|
+
});
|
|
270
|
+
} catch (err) {
|
|
271
|
+
console.error("[AgentSessionManager] Failed to load history:", err);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// ─── Agent Management ───────────────────────────────────
|
|
275
|
+
/** Create a new agent on the gateway, set it as default, and return its ID. */
|
|
276
|
+
async createAgent(name, soulContent) {
|
|
277
|
+
var _a;
|
|
278
|
+
if (!((_a = this.client) == null ? void 0 : _a.connected)) return null;
|
|
279
|
+
try {
|
|
280
|
+
const workspace = `/home/node/.openclaw/workspaces/${name}`;
|
|
281
|
+
const resp = await this.client.createAgent(name, workspace);
|
|
282
|
+
await this.client.setDefaultAgent(resp.agentId).catch((err) => {
|
|
283
|
+
console.warn("[AgentSessionManager] Failed to set default agent:", err);
|
|
284
|
+
});
|
|
285
|
+
if (soulContent) {
|
|
286
|
+
await this.client.setAgentFile(resp.agentId, "SOUL.md", soulContent);
|
|
287
|
+
}
|
|
288
|
+
await this.syncGatewayState();
|
|
289
|
+
resetGatewayApiKeyBridge();
|
|
290
|
+
return resp.agentId;
|
|
291
|
+
} catch (err) {
|
|
292
|
+
console.error("[AgentSessionManager] Failed to create agent:", err);
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/** Update agent model. */
|
|
297
|
+
async setAgentModel(agentId, model) {
|
|
298
|
+
var _a;
|
|
299
|
+
if (!((_a = this.client) == null ? void 0 : _a.connected)) return;
|
|
300
|
+
await this.client.updateAgent(agentId, {
|
|
301
|
+
model
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
/** Update the default agent's model to match the user's selection. */
|
|
305
|
+
async setDefaultAgentModel(model) {
|
|
306
|
+
var _a;
|
|
307
|
+
if (!((_a = this.client) == null ? void 0 : _a.connected)) return;
|
|
308
|
+
const agentId = this.state.defaultAgentId;
|
|
309
|
+
if (!agentId) {
|
|
310
|
+
console.warn("[AgentSessionManager] No default agent ID \u2013 cannot update model");
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
let resolvedModel = model;
|
|
314
|
+
const gatewayModels = this.state.models;
|
|
315
|
+
if (gatewayModels.length > 0) {
|
|
316
|
+
const isSupported = gatewayModels.some((m) => m.id === model);
|
|
317
|
+
if (!isSupported) {
|
|
318
|
+
const fallback = gatewayModels.find((m) => m.available);
|
|
319
|
+
if (fallback) {
|
|
320
|
+
console.log(`[AgentSessionManager] Model "${model}" not available on gateway, using fallback: ${fallback.id}`);
|
|
321
|
+
resolvedModel = fallback.id;
|
|
322
|
+
} else {
|
|
323
|
+
console.warn("[AgentSessionManager] No available gateway models \u2014 skipping model sync");
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
try {
|
|
329
|
+
await this.client.updateAgent(agentId, {
|
|
330
|
+
model: resolvedModel
|
|
331
|
+
});
|
|
332
|
+
console.log("[AgentSessionManager] Updated default agent model to:", resolvedModel);
|
|
333
|
+
} catch (err) {
|
|
334
|
+
console.error("[AgentSessionManager] Failed to update default agent model:", err);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/** Apply a SOUL.md persona to an agent. */
|
|
338
|
+
async setAgentSoul(agentId, content) {
|
|
339
|
+
var _a;
|
|
340
|
+
if (!((_a = this.client) == null ? void 0 : _a.connected)) return;
|
|
341
|
+
await this.client.setAgentFile(agentId, "SOUL.md", content);
|
|
342
|
+
}
|
|
343
|
+
// ─── Skill Management ───────────────────────────────────
|
|
344
|
+
/** Toggle a skill's enabled state. */
|
|
345
|
+
async toggleSkill(skillKey, enabled) {
|
|
346
|
+
var _a;
|
|
347
|
+
if (!((_a = this.client) == null ? void 0 : _a.connected)) return;
|
|
348
|
+
await this.client.updateSkill(skillKey, {
|
|
349
|
+
enabled
|
|
350
|
+
});
|
|
351
|
+
await this.syncGatewayState();
|
|
352
|
+
}
|
|
353
|
+
/** Set an API key for a skill. */
|
|
354
|
+
async setSkillApiKey(skillKey, apiKey) {
|
|
355
|
+
var _a;
|
|
356
|
+
if (!((_a = this.client) == null ? void 0 : _a.connected)) return;
|
|
357
|
+
await this.client.updateSkill(skillKey, {
|
|
358
|
+
apiKey
|
|
359
|
+
});
|
|
360
|
+
await this.syncGatewayState();
|
|
361
|
+
}
|
|
362
|
+
// ─── Internal ───────────────────────────────────────────
|
|
363
|
+
handleChatEvent(event) {
|
|
364
|
+
var _a, _b, _c;
|
|
365
|
+
const task = this.state.tasks.find((t) => t.runId === event.runId || t.sessionKey === event.sessionKey);
|
|
366
|
+
if (!task) {
|
|
367
|
+
console.warn("[AgentSessionManager] Received chat event with no matching task. runId:", event.runId, "sessionKey:", event.sessionKey, "state:", event.state);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
console.log("[AgentSessionManager] Chat event:", event.state, "for task:", task.title, "runId:", event.runId);
|
|
371
|
+
if (event.state === "delta" && event.message) {
|
|
372
|
+
const content = typeof event.message.content === "string" ? event.message.content : event.message.content.map((b) => b.text || "").join("");
|
|
373
|
+
(_a = this.chatStreamCallback) == null ? void 0 : _a.call(this, {
|
|
374
|
+
type: "delta",
|
|
375
|
+
content
|
|
376
|
+
});
|
|
377
|
+
const msgs = [...task.messages];
|
|
378
|
+
const lastMsg = msgs[msgs.length - 1];
|
|
379
|
+
if ((lastMsg == null ? void 0 : lastMsg.role) === "assistant" && lastMsg.id.startsWith("stream-")) {
|
|
380
|
+
msgs[msgs.length - 1] = __spreadProps(__spreadValues({}, lastMsg), {
|
|
381
|
+
content: lastMsg.content + content
|
|
382
|
+
});
|
|
383
|
+
} else {
|
|
384
|
+
msgs.push({
|
|
385
|
+
id: `stream-${event.runId}`,
|
|
386
|
+
role: "assistant",
|
|
387
|
+
content,
|
|
388
|
+
timestamp: Date.now()
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
this.updateTask(task.id, {
|
|
392
|
+
messages: msgs
|
|
393
|
+
});
|
|
394
|
+
} else if (event.state === "final" && event.message) {
|
|
395
|
+
const content = typeof event.message.content === "string" ? event.message.content : event.message.content.map((b) => b.text || "").join("");
|
|
396
|
+
(_b = this.chatStreamCallback) == null ? void 0 : _b.call(this, {
|
|
397
|
+
type: "complete",
|
|
398
|
+
content
|
|
399
|
+
});
|
|
400
|
+
const msgs = task.messages.filter((m) => !m.id.startsWith("stream-"));
|
|
401
|
+
msgs.push({
|
|
402
|
+
id: crypto.randomUUID(),
|
|
403
|
+
role: "assistant",
|
|
404
|
+
content,
|
|
405
|
+
timestamp: Date.now(),
|
|
406
|
+
usage: event.message.usage
|
|
407
|
+
});
|
|
408
|
+
this.updateTask(task.id, {
|
|
409
|
+
messages: msgs,
|
|
410
|
+
status: "completed",
|
|
411
|
+
runId: null
|
|
412
|
+
});
|
|
413
|
+
} else if (event.state === "error") {
|
|
414
|
+
console.error("[AgentSessionManager] RAW gateway error:", event.errorMessage);
|
|
415
|
+
const userError = sanitizeGatewayError(event.errorMessage || "Unknown error");
|
|
416
|
+
(_c = this.chatStreamCallback) == null ? void 0 : _c.call(this, {
|
|
417
|
+
type: "error",
|
|
418
|
+
error: userError
|
|
419
|
+
});
|
|
420
|
+
this.updateTask(task.id, {
|
|
421
|
+
status: "failed",
|
|
422
|
+
error: userError,
|
|
423
|
+
runId: null
|
|
424
|
+
});
|
|
425
|
+
} else if (event.state === "aborted") {
|
|
426
|
+
this.updateTask(task.id, {
|
|
427
|
+
status: "aborted",
|
|
428
|
+
runId: null
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
updateTask(taskId, patch) {
|
|
433
|
+
const tasks = this.state.tasks.map((t) => t.id === taskId ? __spreadProps(__spreadValues(__spreadValues({}, t), patch), {
|
|
434
|
+
updatedAt: Date.now()
|
|
435
|
+
}) : t);
|
|
436
|
+
this.update({
|
|
437
|
+
tasks
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
update(patch) {
|
|
441
|
+
this.state = __spreadValues(__spreadValues({}, this.state), patch);
|
|
442
|
+
for (const listener of this.listeners) {
|
|
443
|
+
try {
|
|
444
|
+
listener(this.state);
|
|
445
|
+
} catch (e) {
|
|
446
|
+
console.error("[AgentSessionManager] Listener error:", e);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
const agentSessionManager = new AgentSessionManagerImpl();export{agentSessionManager};//# sourceMappingURL=agentSessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentSessionManager.js","sources":["../../src/services/agentSessionManager.ts"],"sourcesContent":["/**\n * Agent Session Manager — persistent task sessions connected to OpenClaw gateway agents.\n *\n * Manages the lifecycle of \"tasks\" (Manus-like), each bound to a gateway agent session.\n * Tasks persist across page navigations and keep the agent session alive.\n */\n\nimport type {\n GatewayClient,\n ChatStreamEvent,\n ChatSendResponse,\n GatewayAgent,\n GatewayModel,\n SkillInfo,\n GatewayStatus,\n HelloOk,\n} from './gatewayClient';\nimport { MAX_CONCURRENT_TASKS } from '../config/constants';\nimport { resetGatewayApiKeyBridge } from './gatewayApiKeyBridge';\n\n// ─── Types ──────────────────────────────────────────────────────\n\nexport type TaskStatus = 'idle' | 'connecting' | 'running' | 'completed' | 'failed' | 'aborted';\n\nexport interface TaskMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: number;\n usage?: { inputTokens?: number; outputTokens?: number };\n}\n\nexport interface AgentTask {\n id: string;\n /** Gateway agent session key (e.g. 'default' or agent ID) */\n sessionKey: string;\n /** Display title */\n title: string;\n status: TaskStatus;\n /** Current run ID from chat.send */\n runId: string | null;\n messages: TaskMessage[];\n /** Skill template ID applied to this task */\n skillTemplate: string | null;\n /** Skill template display name */\n skillTemplateName: string | null;\n /** Model used for this agent session */\n model: string | null;\n /** Error message if failed */\n error: string | null;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface AgentSessionState {\n /** Gateway connection status */\n gatewayConnected: boolean;\n gatewayStatus: GatewayStatus | null;\n /** Available agents on the gateway */\n agents: GatewayAgent[];\n /** Default agent ID on the gateway */\n defaultAgentId: string | null;\n /** Available models */\n models: GatewayModel[];\n /** Available skills */\n skills: SkillInfo[];\n /** Active tasks (Manus-like persistent sessions) */\n tasks: AgentTask[];\n /** Currently focused task ID */\n activeTaskId: string | null;\n}\n\ntype Listener = (state: AgentSessionState) => void;\n\n/** Callback for piping gateway chat stream events to the main chat UI. */\nexport type ChatStreamCallback = (\n event:\n | { type: 'delta'; content: string }\n | { type: 'complete'; content: string }\n | { type: 'error'; error: string },\n) => void;\n\n// ─── Error Sanitization ─────────────────────────────────────────\n\n/** Transforms raw gateway/agent errors into polished user-facing messages. */\nfunction sanitizeGatewayError(raw: string): string {\n // \"No API key found for provider 'X'\" — internal auth store details\n if (/No API key found for provider/i.test(raw)) {\n const providerMatch = raw.match(/provider\\s+[\"']?(\\w+)[\"']?/i);\n const provider = providerMatch?.[1] || 'the AI model';\n return `The gateway server is missing the API key for ${provider}. Please contact your administrator to configure the LLM credentials.`;\n }\n // \"Agent failed before reply: <reason>\" — strip the wrapper and recurse\n const agentFailedMatch = raw.match(/Agent failed before reply:\\s*(.+)/i);\n if (agentFailedMatch) {\n return sanitizeGatewayError(agentFailedMatch[1]);\n }\n // Rate-limit / overloaded\n if (/rate.?limit|overloaded|too many requests/i.test(raw)) {\n return 'The AI service is temporarily overloaded. Please wait a moment and try again.';\n }\n // Context overflow\n if (/context.?overflow|prompt.*too large|token limit/i.test(raw)) {\n return 'The message is too long for the selected model. Try a shorter message or switch to a model with a larger context window.';\n }\n // Strip any remaining internal references (openclaw, auth-profiles, agentDir, etc.)\n const scrubbed = raw\n .replace(/\\boclaw\\b/gi, '')\n .replace(/\\bopenclaw\\b/gi, '')\n .replace(/auth-profiles\\.json/gi, '')\n .replace(/agentDir:[^.)\\n]*/gi, '')\n .replace(/Logs:\\s*openclaw logs[^\\n]*/gi, '')\n .replace(/Configure auth for this agent[^.\\n]*/gi, '')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n return scrubbed || 'An unexpected error occurred. Please try again.';\n}\n\n// ─── Agent Session Manager ──────────────────────────────────────\n\nclass AgentSessionManagerImpl {\n private client: GatewayClient | null = null;\n\n private state: AgentSessionState = {\n gatewayConnected: false,\n gatewayStatus: null,\n agents: [],\n defaultAgentId: null,\n models: [],\n skills: [],\n tasks: [],\n activeTaskId: null,\n };\n\n private listeners = new Set<Listener>();\n\n private chatHandler: ((payload: unknown) => void) | null = null;\n\n /** External callback to pipe gateway chat stream events into the main chat UI. */\n private chatStreamCallback: ChatStreamCallback | null = null;\n\n /** Set a callback to receive chat stream events (delta/complete/error). */\n setChatStreamCallback(cb: ChatStreamCallback | null): void {\n this.chatStreamCallback = cb;\n }\n\n /** Subscribe to state changes. Returns unsubscribe function. */\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n listener(this.state);\n return () => this.listeners.delete(listener);\n }\n\n getState(): AgentSessionState {\n return this.state;\n }\n\n getClient(): GatewayClient | null {\n return this.client;\n }\n\n // ─── Gateway Connection ─────────────────────────────────\n\n /** Attach a connected GatewayClient and sync state. */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async attachGateway(client: GatewayClient, _hello: HelloOk): Promise<void> {\n // Detach previous client\n this.detachGateway();\n\n this.client = client;\n\n // Listen for chat stream events\n this.chatHandler = (payload: unknown) => this.handleChatEvent(payload as ChatStreamEvent);\n client.on('chat', this.chatHandler);\n client.on('disconnect', () => {\n this.update({ gatewayConnected: false, gatewayStatus: null });\n });\n\n // Fetch gateway state first, then mark connected so consumers\n // (e.g. model-sync effect) see defaultAgentId immediately.\n await this.syncGatewayState();\n\n this.update({ gatewayConnected: true });\n }\n\n /** Detach the current gateway client. */\n detachGateway(): void {\n if (this.client && this.chatHandler) {\n this.client.off('chat', this.chatHandler);\n this.chatHandler = null;\n }\n this.client = null;\n this.update({\n gatewayConnected: false,\n gatewayStatus: null,\n agents: [],\n defaultAgentId: null,\n models: [],\n skills: [],\n });\n }\n\n /** Re-fetch agents, models, skills, status from the gateway. */\n async syncGatewayState(): Promise<void> {\n if (!this.client?.connected) return;\n\n try {\n const [status, agentsResp, models, skillsResp] = await Promise.all([\n this.client.getStatus().catch(() => null),\n this.client.listAgents().catch(() => ({ defaultId: '', agents: [] })),\n this.client.listModels().catch(() => []),\n this.client.getSkillsStatus().catch(() => ({ skills: [] })),\n ]);\n\n // Fallback: if gateway returns no defaultId, use first agent\n const defaultAgentId = agentsResp.defaultId || agentsResp.agents[0]?.id || null;\n\n this.update({\n gatewayStatus: status,\n agents: agentsResp.agents,\n defaultAgentId,\n models,\n skills: skillsResp.skills,\n });\n } catch (err) {\n console.error('[AgentSessionManager] Failed to sync gateway state:', err);\n }\n }\n\n // ─── Task Management ────────────────────────────────────\n\n /** Whether a new task can be created (respects MAX_CONCURRENT_TASKS). */\n get canCreateTask(): boolean {\n return this.state.tasks.length < MAX_CONCURRENT_TASKS;\n }\n\n /** Create a new task bound to a gateway agent session. */\n createTask(opts: {\n title: string;\n sessionKey?: string;\n skillTemplate?: string;\n skillTemplateName?: string;\n model?: string;\n }): AgentTask | null {\n if (!this.canCreateTask) {\n console.warn('[AgentSessionManager] Task limit reached:', MAX_CONCURRENT_TASKS);\n return null;\n }\n const task: AgentTask = {\n id: crypto.randomUUID(),\n sessionKey: opts.sessionKey || 'default',\n title: opts.title,\n status: 'idle',\n runId: null,\n messages: [],\n skillTemplate: opts.skillTemplate || null,\n skillTemplateName: opts.skillTemplateName || null,\n model: opts.model || null,\n error: null,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n\n const tasks = [...this.state.tasks, task];\n this.update({ tasks, activeTaskId: task.id });\n return task;\n }\n\n /** Send a message in a task's agent session. */\n async sendMessage(taskId: string, message: string): Promise<ChatSendResponse | null> {\n const task = this.state.tasks.find((t) => t.id === taskId);\n if (!task || !this.client?.connected) {\n const reason = !task ? 'task not found' : 'gateway not connected';\n console.warn('[AgentSessionManager] sendMessage skipped:', reason);\n this.chatStreamCallback?.({ type: 'error', error: sanitizeGatewayError(`Cannot send message: ${reason}`) });\n return null;\n }\n\n // Add user message\n const userMsg: TaskMessage = {\n id: crypto.randomUUID(),\n role: 'user',\n content: message,\n timestamp: Date.now(),\n };\n\n this.updateTask(taskId, {\n status: 'running',\n messages: [...task.messages, userMsg],\n error: null,\n });\n\n try {\n console.log('[AgentSessionManager] Sending message to session:', task.sessionKey);\n const resp = await this.client.sendChatMessage(task.sessionKey, message);\n console.log('[AgentSessionManager] chat.send returned runId:', resp.runId, 'status:', resp.status);\n this.updateTask(taskId, { runId: resp.runId });\n return resp;\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n console.error('[AgentSessionManager] sendMessage failed:', errorMsg);\n const userError = sanitizeGatewayError(errorMsg);\n this.updateTask(taskId, {\n status: 'failed',\n error: userError,\n });\n // Propagate error to the chat UI so it exits the streaming state\n this.chatStreamCallback?.({ type: 'error', error: userError });\n return null;\n }\n }\n\n /** Abort the running task. */\n async abortTask(taskId: string): Promise<void> {\n const task = this.state.tasks.find((t) => t.id === taskId);\n if (!task?.runId || !this.client?.connected) return;\n\n try {\n await this.client.abortChat(task.runId);\n this.updateTask(taskId, { status: 'aborted', runId: null });\n } catch (err) {\n console.error('[AgentSessionManager] Failed to abort task:', err);\n }\n }\n\n /** Remove a task. */\n removeTask(taskId: string): void {\n const tasks = this.state.tasks.filter((t) => t.id !== taskId);\n const { activeTaskId: currentActiveId } = this.state;\n let activeTaskId = currentActiveId;\n if (currentActiveId === taskId) {\n activeTaskId = tasks.length > 0 ? tasks[tasks.length - 1].id : null;\n }\n this.update({ tasks, activeTaskId });\n }\n\n /** Set the active (focused) task. */\n setActiveTask(taskId: string | null): void {\n this.update({ activeTaskId: taskId });\n }\n\n /** Update a locally managed task without routing through the gateway. */\n updateLocalTask(\n taskId: string,\n patch: Partial<\n Pick<\n AgentTask,\n 'title' | 'status' | 'runId' | 'messages' | 'skillTemplate' | 'skillTemplateName' | 'model' | 'error'\n >\n >,\n ): void {\n const task = this.state.tasks.find((item) => item.id === taskId);\n if (!task) return;\n this.updateTask(taskId, patch);\n }\n\n /** Load chat history from gateway for an existing task. */\n async loadTaskHistory(taskId: string): Promise<void> {\n const task = this.state.tasks.find((t) => t.id === taskId);\n if (!task || !this.client?.connected) return;\n\n try {\n const history = await this.client.getChatHistory(task.sessionKey);\n const messages: TaskMessage[] = history.messages.map((m, i) => ({\n id: `history-${i}`,\n role: m.role as TaskMessage['role'],\n content: typeof m.content === 'string' ? m.content : m.content.map((b) => b.text || '').join(''),\n timestamp: m.timestamp || task.createdAt + i,\n usage: m.usage,\n }));\n\n this.updateTask(taskId, { messages });\n } catch (err) {\n console.error('[AgentSessionManager] Failed to load history:', err);\n }\n }\n\n // ─── Agent Management ───────────────────────────────────\n\n /** Create a new agent on the gateway, set it as default, and return its ID. */\n async createAgent(name: string, soulContent?: string): Promise<string | null> {\n if (!this.client?.connected) return null;\n\n try {\n const workspace = `/home/node/.openclaw/workspaces/${name}`;\n const resp = await this.client.createAgent(name, workspace);\n\n // Set the newly created agent as the default (triggers gateway restart)\n await this.client.setDefaultAgent(resp.agentId).catch((err: unknown) => {\n console.warn('[AgentSessionManager] Failed to set default agent:', err);\n });\n\n if (soulContent) {\n await this.client.setAgentFile(resp.agentId, 'SOUL.md', soulContent);\n }\n await this.syncGatewayState();\n\n // The new agent's auth-profiles.json is empty — clear the pushed cache\n // so ensureGatewayApiKeys re-pushes keys before the next chat.send\n resetGatewayApiKeyBridge();\n\n return resp.agentId;\n } catch (err) {\n console.error('[AgentSessionManager] Failed to create agent:', err);\n return null;\n }\n }\n\n /** Update agent model. */\n async setAgentModel(agentId: string, model: string): Promise<void> {\n if (!this.client?.connected) return;\n await this.client.updateAgent(agentId, { model });\n }\n\n /** Update the default agent's model to match the user's selection. */\n async setDefaultAgentModel(model: string): Promise<void> {\n if (!this.client?.connected) return;\n const agentId = this.state.defaultAgentId;\n if (!agentId) {\n console.warn('[AgentSessionManager] No default agent ID – cannot update model');\n return;\n }\n\n // Only push models that the gateway actually supports\n let resolvedModel = model;\n const gatewayModels = this.state.models;\n if (gatewayModels.length > 0) {\n const isSupported = gatewayModels.some((m) => m.id === model);\n if (!isSupported) {\n // Pick the first available gateway model as fallback\n const fallback = gatewayModels.find((m) => m.available);\n if (fallback) {\n console.log(\n `[AgentSessionManager] Model \"${model}\" not available on gateway, using fallback: ${fallback.id}`,\n );\n resolvedModel = fallback.id;\n } else {\n console.warn('[AgentSessionManager] No available gateway models — skipping model sync');\n return;\n }\n }\n }\n\n try {\n await this.client.updateAgent(agentId, { model: resolvedModel });\n console.log('[AgentSessionManager] Updated default agent model to:', resolvedModel);\n } catch (err) {\n console.error('[AgentSessionManager] Failed to update default agent model:', err);\n }\n }\n\n /** Apply a SOUL.md persona to an agent. */\n async setAgentSoul(agentId: string, content: string): Promise<void> {\n if (!this.client?.connected) return;\n await this.client.setAgentFile(agentId, 'SOUL.md', content);\n }\n\n // ─── Skill Management ───────────────────────────────────\n\n /** Toggle a skill's enabled state. */\n async toggleSkill(skillKey: string, enabled: boolean): Promise<void> {\n if (!this.client?.connected) return;\n await this.client.updateSkill(skillKey, { enabled });\n await this.syncGatewayState();\n }\n\n /** Set an API key for a skill. */\n async setSkillApiKey(skillKey: string, apiKey: string): Promise<void> {\n if (!this.client?.connected) return;\n await this.client.updateSkill(skillKey, { apiKey });\n await this.syncGatewayState();\n }\n\n // ─── Internal ───────────────────────────────────────────\n\n private handleChatEvent(event: ChatStreamEvent): void {\n // Find the task with matching runId or sessionKey\n const task = this.state.tasks.find((t) => t.runId === event.runId || t.sessionKey === event.sessionKey);\n if (!task) {\n console.warn(\n '[AgentSessionManager] Received chat event with no matching task. runId:',\n event.runId,\n 'sessionKey:',\n event.sessionKey,\n 'state:',\n event.state,\n );\n return;\n }\n console.log('[AgentSessionManager] Chat event:', event.state, 'for task:', task.title, 'runId:', event.runId);\n\n if (event.state === 'delta' && event.message) {\n const content =\n typeof event.message.content === 'string'\n ? event.message.content\n : event.message.content.map((b) => b.text || '').join('');\n\n // Pipe delta to external chat UI callback\n this.chatStreamCallback?.({ type: 'delta', content });\n\n // Check if there's already an assistant message being streamed\n const msgs = [...task.messages];\n const lastMsg = msgs[msgs.length - 1];\n if (lastMsg?.role === 'assistant' && lastMsg.id.startsWith('stream-')) {\n // Append to existing streaming message\n msgs[msgs.length - 1] = { ...lastMsg, content: lastMsg.content + content };\n } else {\n // Start new streaming message\n msgs.push({\n id: `stream-${event.runId}`,\n role: 'assistant',\n content,\n timestamp: Date.now(),\n });\n }\n this.updateTask(task.id, { messages: msgs });\n } else if (event.state === 'final' && event.message) {\n const content =\n typeof event.message.content === 'string'\n ? event.message.content\n : event.message.content.map((b) => b.text || '').join('');\n\n // Pipe final response to external chat UI callback\n this.chatStreamCallback?.({ type: 'complete', content });\n\n // Replace streaming message with final message\n const msgs = task.messages.filter((m) => !m.id.startsWith('stream-'));\n msgs.push({\n id: crypto.randomUUID(),\n role: 'assistant',\n content,\n timestamp: Date.now(),\n usage: event.message.usage,\n });\n\n this.updateTask(task.id, {\n messages: msgs,\n status: 'completed',\n runId: null,\n });\n } else if (event.state === 'error') {\n console.error('[AgentSessionManager] RAW gateway error:', event.errorMessage);\n const userError = sanitizeGatewayError(event.errorMessage || 'Unknown error');\n // Pipe sanitized error to external chat UI callback\n this.chatStreamCallback?.({ type: 'error', error: userError });\n\n this.updateTask(task.id, {\n status: 'failed',\n error: userError,\n runId: null,\n });\n } else if (event.state === 'aborted') {\n this.updateTask(task.id, { status: 'aborted', runId: null });\n }\n }\n\n private updateTask(taskId: string, patch: Partial<AgentTask>): void {\n const tasks = this.state.tasks.map((t) => (t.id === taskId ? { ...t, ...patch, updatedAt: Date.now() } : t));\n this.update({ tasks });\n }\n\n private update(patch: Partial<AgentSessionState>): void {\n this.state = { ...this.state, ...patch };\n for (const listener of this.listeners) {\n try {\n listener(this.state);\n } catch (e) {\n console.error('[AgentSessionManager] Listener error:', e);\n }\n }\n }\n}\n\n/** Singleton agent session manager. */\nexport const agentSessionManager = new AgentSessionManagerImpl();\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AA+EA,SAAS,qBAAqB,GAAqB,EAAA;AAEjD,EAAI,IAAA,gCAAA,CAAiC,IAAK,CAAA,GAAG,CAAG,EAAA;AAC9C,IAAM,MAAA,aAAA,GAAgB,GAAI,CAAA,KAAA,CAAM,6BAA6B,CAAA;AAC7D,IAAM,MAAA,QAAA,GAAA,CAAW,+CAAgB,CAAM,CAAA,KAAA,cAAA;AACvC,IAAA,OAAO,iDAAiD,QAAQ,CAAA,qEAAA,CAAA;AAAA;AAGlE,EAAM,MAAA,gBAAA,GAAmB,GAAI,CAAA,KAAA,CAAM,oCAAoC,CAAA;AACvE,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAO,OAAA,oBAAA,CAAqB,gBAAiB,CAAA,CAAC,CAAC,CAAA;AAAA;AAGjD,EAAI,IAAA,2CAAA,CAA4C,IAAK,CAAA,GAAG,CAAG,EAAA;AACzD,IAAO,OAAA,+EAAA;AAAA;AAGT,EAAI,IAAA,kDAAA,CAAmD,IAAK,CAAA,GAAG,CAAG,EAAA;AAChE,IAAO,OAAA,0HAAA;AAAA;AAGT,EAAA,MAAM,QAAW,GAAA,GAAA,CAAI,OAAQ,CAAA,aAAA,EAAe,EAAE,CAAA,CAAE,OAAQ,CAAA,gBAAA,EAAkB,EAAE,CAAA,CAAE,OAAQ,CAAA,uBAAA,EAAyB,EAAE,CAAE,CAAA,OAAA,CAAQ,qBAAuB,EAAA,EAAE,CAAE,CAAA,OAAA,CAAQ,+BAAiC,EAAA,EAAE,CAAE,CAAA,OAAA,CAAQ,wCAA0C,EAAA,EAAE,CAAE,CAAA,OAAA,CAAQ,SAAW,EAAA,GAAG,EAAE,IAAK,EAAA;AACtR,EAAA,OAAO,QAAY,IAAA,iDAAA;AACrB;AAIA,MAAM,uBAAwB,CAAA;AAAA,EAA9B,WAAA,GAAA;AACE,IAAA,aAAA,CAAA,IAAA,EAAQ,QAA+B,EAAA,IAAA,CAAA;AACvC,IAAA,aAAA,CAAA,IAAA,EAAQ,OAA2B,EAAA;AAAA,MACjC,gBAAkB,EAAA,KAAA;AAAA,MAClB,aAAe,EAAA,IAAA;AAAA,MACf,QAAQ,EAAC;AAAA,MACT,cAAgB,EAAA,IAAA;AAAA,MAChB,QAAQ,EAAC;AAAA,MACT,QAAQ,EAAC;AAAA,MACT,OAAO,EAAC;AAAA,MACR,YAAc,EAAA;AAAA,KAChB,CAAA;AACA,IAAQ,aAAA,CAAA,IAAA,EAAA,WAAA,sBAAgB,GAAc,EAAA,CAAA;AACtC,IAAA,aAAA,CAAA,IAAA,EAAQ,aAAmD,EAAA,IAAA,CAAA;AAG3D;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,oBAAgD,EAAA,IAAA,CAAA;AAAA;AAAA;AAAA,EAGxD,sBAAsB,EAAqC,EAAA;AACzD,IAAA,IAAA,CAAK,kBAAqB,GAAA,EAAA;AAAA;AAC5B;AAAA,EAGA,UAAU,QAAgC,EAAA;AACxC,IAAK,IAAA,CAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AACnB,IAAA,OAAO,MAAM,IAAA,CAAK,SAAU,CAAA,MAAA,CAAO,QAAQ,CAAA;AAAA;AAC7C,EACA,QAA8B,GAAA;AAC5B,IAAA,OAAO,IAAK,CAAA,KAAA;AAAA;AACd,EACA,SAAkC,GAAA;AAChC,IAAA,OAAO,IAAK,CAAA,MAAA;AAAA;AACd;AAAA;AAAA;AAAA,EAMA,MAAM,aAAc,CAAA,MAAA,EAAuB,MAAgC,EAAA;AAEzE,IAAA,IAAA,CAAK,aAAc,EAAA;AACnB,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAGd,IAAA,IAAA,CAAK,WAAc,GAAA,CAAC,OAAqB,KAAA,IAAA,CAAK,gBAAgB,OAA0B,CAAA;AACxF,IAAO,MAAA,CAAA,EAAA,CAAG,MAAQ,EAAA,IAAA,CAAK,WAAW,CAAA;AAClC,IAAO,MAAA,CAAA,EAAA,CAAG,cAAc,MAAM;AAC5B,MAAA,IAAA,CAAK,MAAO,CAAA;AAAA,QACV,gBAAkB,EAAA,KAAA;AAAA,QAClB,aAAe,EAAA;AAAA,OAChB,CAAA;AAAA,KACF,CAAA;AAID,IAAA,MAAM,KAAK,gBAAiB,EAAA;AAC5B,IAAA,IAAA,CAAK,MAAO,CAAA;AAAA,MACV,gBAAkB,EAAA;AAAA,KACnB,CAAA;AAAA;AACH;AAAA,EAGA,aAAsB,GAAA;AACpB,IAAI,IAAA,IAAA,CAAK,MAAU,IAAA,IAAA,CAAK,WAAa,EAAA;AACnC,MAAA,IAAA,CAAK,MAAO,CAAA,GAAA,CAAI,MAAQ,EAAA,IAAA,CAAK,WAAW,CAAA;AACxC,MAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AAAA;AAErB,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA;AACd,IAAA,IAAA,CAAK,MAAO,CAAA;AAAA,MACV,gBAAkB,EAAA,KAAA;AAAA,MAClB,aAAe,EAAA,IAAA;AAAA,MACf,QAAQ,EAAC;AAAA,MACT,cAAgB,EAAA,IAAA;AAAA,MAChB,QAAQ,EAAC;AAAA,MACT,QAAQ;AAAC,KACV,CAAA;AAAA;AACH;AAAA,EAGA,MAAM,gBAAkC,GAAA;AA3L1C,IAAA,IAAA,EAAA,EAAA,EAAA;AA4LI,IAAA,IAAI,EAAC,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,SAAW,CAAA,EAAA;AAC7B,IAAI,IAAA;AACF,MAAM,MAAA,CAAC,QAAQ,UAAY,EAAA,MAAA,EAAQ,UAAU,CAAI,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,CAAC,IAAA,CAAK,OAAO,SAAU,EAAA,CAAE,KAAM,CAAA,MAAM,IAAI,CAAA,EAAG,KAAK,MAAO,CAAA,UAAA,EAAa,CAAA,KAAA,CAAM,OAAO;AAAA,QACnJ,SAAW,EAAA,EAAA;AAAA,QACX,QAAQ;AAAC,QACT,CAAG,EAAA,IAAA,CAAK,MAAO,CAAA,UAAA,GAAa,KAAM,CAAA,MAAM,EAAE,GAAG,IAAK,CAAA,MAAA,CAAO,eAAgB,EAAA,CAAE,MAAM,OAAO;AAAA,QACxF,QAAQ;AAAC,OACX,CAAE,CAAC,CAAC,CAAA;AAGJ,MAAM,MAAA,cAAA,GAAiB,WAAW,SAAa,KAAA,CAAA,EAAA,GAAA,UAAA,CAAW,OAAO,CAAC,CAAA,KAAnB,mBAAsB,EAAM,CAAA,IAAA,IAAA;AAC3E,MAAA,IAAA,CAAK,MAAO,CAAA;AAAA,QACV,aAAe,EAAA,MAAA;AAAA,QACf,QAAQ,UAAW,CAAA,MAAA;AAAA,QACnB,cAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAQ,UAAW,CAAA;AAAA,OACpB,CAAA;AAAA,aACM,GAAK,EAAA;AACZ,MAAQ,OAAA,CAAA,KAAA,CAAM,uDAAuD,GAAG,CAAA;AAAA;AAC1E;AACF;AAAA;AAAA,EAKA,IAAI,aAAyB,GAAA;AAC3B,IAAO,OAAA,IAAA,CAAK,KAAM,CAAA,KAAA,CAAM,MAAS,GAAA,oBAAA;AAAA;AACnC;AAAA,EAGA,WAAW,IAMU,EAAA;AACnB,IAAI,IAAA,CAAC,KAAK,aAAe,EAAA;AACvB,MAAQ,OAAA,CAAA,IAAA,CAAK,6CAA6C,oBAAoB,CAAA;AAC9E,MAAO,OAAA,IAAA;AAAA;AAET,IAAA,MAAM,IAAkB,GAAA;AAAA,MACtB,EAAA,EAAI,OAAO,UAAW,EAAA;AAAA,MACtB,UAAA,EAAY,KAAK,UAAc,IAAA,SAAA;AAAA,MAC/B,OAAO,IAAK,CAAA,KAAA;AAAA,MACZ,MAAQ,EAAA,MAAA;AAAA,MACR,KAAO,EAAA,IAAA;AAAA,MACP,UAAU,EAAC;AAAA,MACX,aAAA,EAAe,KAAK,aAAiB,IAAA,IAAA;AAAA,MACrC,iBAAA,EAAmB,KAAK,iBAAqB,IAAA,IAAA;AAAA,MAC7C,KAAA,EAAO,KAAK,KAAS,IAAA,IAAA;AAAA,MACrB,KAAO,EAAA,IAAA;AAAA,MACP,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,MACpB,SAAA,EAAW,KAAK,GAAI;AAAA,KACtB;AACA,IAAA,MAAM,QAAQ,CAAC,GAAG,IAAK,CAAA,KAAA,CAAM,OAAO,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,MAAO,CAAA;AAAA,MACV,KAAA;AAAA,MACA,cAAc,IAAK,CAAA;AAAA,KACpB,CAAA;AACD,IAAO,OAAA,IAAA;AAAA;AACT;AAAA,EAGA,MAAM,WAAY,CAAA,MAAA,EAAgB,OAAmD,EAAA;AA7PvF,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA8PI,IAAM,MAAA,IAAA,GAAO,KAAK,KAAM,CAAA,KAAA,CAAM,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,IAAQ,IAAA,EAAA,CAAC,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,mBAAa,SAAW,CAAA,EAAA;AACpC,MAAM,MAAA,MAAA,GAAS,CAAC,IAAA,GAAO,gBAAmB,GAAA,uBAAA;AAC1C,MAAQ,OAAA,CAAA,IAAA,CAAK,8CAA8C,MAAM,CAAA;AACjE,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,uBAAL,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA;AAAA,QACxB,IAAM,EAAA,OAAA;AAAA,QACN,KAAO,EAAA,oBAAA,CAAqB,CAAwB,qBAAA,EAAA,MAAM,CAAE,CAAA;AAAA,OAC9D,CAAA;AACA,MAAO,OAAA,IAAA;AAAA;AAIT,IAAA,MAAM,OAAuB,GAAA;AAAA,MAC3B,EAAA,EAAI,OAAO,UAAW,EAAA;AAAA,MACtB,IAAM,EAAA,MAAA;AAAA,MACN,OAAS,EAAA,OAAA;AAAA,MACT,SAAA,EAAW,KAAK,GAAI;AAAA,KACtB;AACA,IAAA,IAAA,CAAK,WAAW,MAAQ,EAAA;AAAA,MACtB,MAAQ,EAAA,SAAA;AAAA,MACR,QAAU,EAAA,CAAC,GAAG,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,MACpC,KAAO,EAAA;AAAA,KACR,CAAA;AACD,IAAI,IAAA;AACF,MAAQ,OAAA,CAAA,GAAA,CAAI,mDAAqD,EAAA,IAAA,CAAK,UAAU,CAAA;AAChF,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,OAAO,eAAgB,CAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AACvE,MAAA,OAAA,CAAQ,IAAI,iDAAmD,EAAA,IAAA,CAAK,KAAO,EAAA,SAAA,EAAW,KAAK,MAAM,CAAA;AACjG,MAAA,IAAA,CAAK,WAAW,MAAQ,EAAA;AAAA,QACtB,OAAO,IAAK,CAAA;AAAA,OACb,CAAA;AACD,MAAO,OAAA,IAAA;AAAA,aACA,GAAK,EAAA;AACZ,MAAA,MAAM,WAAW,GAAe,YAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,GAAU,OAAO,GAAG,CAAA;AAChE,MAAQ,OAAA,CAAA,KAAA,CAAM,6CAA6C,QAAQ,CAAA;AACnE,MAAM,MAAA,SAAA,GAAY,qBAAqB,QAAQ,CAAA;AAC/C,MAAA,IAAA,CAAK,WAAW,MAAQ,EAAA;AAAA,QACtB,MAAQ,EAAA,QAAA;AAAA,QACR,KAAO,EAAA;AAAA,OACR,CAAA;AAED,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,uBAAL,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA;AAAA,QACxB,IAAM,EAAA,OAAA;AAAA,QACN,KAAO,EAAA;AAAA,OACT,CAAA;AACA,MAAO,OAAA,IAAA;AAAA;AACT;AACF;AAAA,EAGA,MAAM,UAAU,MAA+B,EAAA;AA/SjD,IAAA,IAAA,EAAA;AAgTI,IAAM,MAAA,IAAA,GAAO,KAAK,KAAM,CAAA,KAAA,CAAM,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,MAAM,CAAA;AACvD,IAAA,IAAI,EAAC,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,KAAA,CAAA,IAAS,GAAC,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,mBAAa,SAAW,CAAA,EAAA;AAC7C,IAAI,IAAA;AACF,MAAA,MAAM,IAAK,CAAA,MAAA,CAAO,SAAU,CAAA,IAAA,CAAK,KAAK,CAAA;AACtC,MAAA,IAAA,CAAK,WAAW,MAAQ,EAAA;AAAA,QACtB,MAAQ,EAAA,SAAA;AAAA,QACR,KAAO,EAAA;AAAA,OACR,CAAA;AAAA,aACM,GAAK,EAAA;AACZ,MAAQ,OAAA,CAAA,KAAA,CAAM,+CAA+C,GAAG,CAAA;AAAA;AAClE;AACF;AAAA,EAGA,WAAW,MAAsB,EAAA;AAC/B,IAAM,MAAA,KAAA,GAAQ,KAAK,KAAM,CAAA,KAAA,CAAM,OAAO,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,MAAM,CAAA;AAC1D,IAAM,MAAA;AAAA,MACJ,YAAc,EAAA;AAAA,QACZ,IAAK,CAAA,KAAA;AACT,IAAA,IAAI,YAAe,GAAA,eAAA;AACnB,IAAA,IAAI,oBAAoB,MAAQ,EAAA;AAC9B,MAAe,YAAA,GAAA,KAAA,CAAM,SAAS,CAAI,GAAA,KAAA,CAAM,MAAM,MAAS,GAAA,CAAC,EAAE,EAAK,GAAA,IAAA;AAAA;AAEjE,IAAA,IAAA,CAAK,MAAO,CAAA;AAAA,MACV,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA;AACH;AAAA,EAGA,cAAc,MAA6B,EAAA;AACzC,IAAA,IAAA,CAAK,MAAO,CAAA;AAAA,MACV,YAAc,EAAA;AAAA,KACf,CAAA;AAAA;AACH;AAAA,EAGA,eAAA,CAAgB,QAAgB,KAA8I,EAAA;AAC5K,IAAM,MAAA,IAAA,GAAO,KAAK,KAAM,CAAA,KAAA,CAAM,KAAK,CAAQ,IAAA,KAAA,IAAA,CAAK,OAAO,MAAM,CAAA;AAC7D,IAAA,IAAI,CAAC,IAAM,EAAA;AACX,IAAK,IAAA,CAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA;AAC/B;AAAA,EAGA,MAAM,gBAAgB,MAA+B,EAAA;AA5VvD,IAAA,IAAA,EAAA;AA6VI,IAAM,MAAA,IAAA,GAAO,KAAK,KAAM,CAAA,KAAA,CAAM,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,IAAQ,IAAA,EAAA,CAAC,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,mBAAa,SAAW,CAAA,EAAA;AACtC,IAAI,IAAA;AACF,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAO,CAAA,cAAA,CAAe,KAAK,UAAU,CAAA;AAChE,MAAA,MAAM,WAA0B,OAAQ,CAAA,QAAA,CAAS,GAAI,CAAA,CAAC,GAAG,CAAO,MAAA;AAAA,QAC9D,EAAA,EAAI,WAAW,CAAC,CAAA,CAAA;AAAA,QAChB,MAAM,CAAE,CAAA,IAAA;AAAA,QACR,SAAS,OAAO,CAAA,CAAE,OAAY,KAAA,QAAA,GAAW,EAAE,OAAU,GAAA,CAAA,CAAE,OAAQ,CAAA,GAAA,CAAI,OAAK,CAAE,CAAA,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,QAC7F,SAAW,EAAA,CAAA,CAAE,SAAa,IAAA,IAAA,CAAK,SAAY,GAAA,CAAA;AAAA,QAC3C,OAAO,CAAE,CAAA;AAAA,OACT,CAAA,CAAA;AACF,MAAA,IAAA,CAAK,WAAW,MAAQ,EAAA;AAAA,QACtB;AAAA,OACD,CAAA;AAAA,aACM,GAAK,EAAA;AACZ,MAAQ,OAAA,CAAA,KAAA,CAAM,iDAAiD,GAAG,CAAA;AAAA;AACpE;AACF;AAAA;AAAA,EAKA,MAAM,WAAY,CAAA,IAAA,EAAc,WAA8C,EAAA;AAnXhF,IAAA,IAAA,EAAA;AAoXI,IAAA,IAAI,EAAC,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,YAAkB,OAAA,IAAA;AACpC,IAAI,IAAA;AACF,MAAM,MAAA,SAAA,GAAY,mCAAmC,IAAI,CAAA,CAAA;AACzD,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,MAAM,SAAS,CAAA;AAG1D,MAAM,MAAA,IAAA,CAAK,OAAO,eAAgB,CAAA,IAAA,CAAK,OAAO,CAAE,CAAA,KAAA,CAAM,CAAC,GAAiB,KAAA;AACtE,QAAQ,OAAA,CAAA,IAAA,CAAK,sDAAsD,GAAG,CAAA;AAAA,OACvE,CAAA;AACD,MAAA,IAAI,WAAa,EAAA;AACf,QAAA,MAAM,KAAK,MAAO,CAAA,YAAA,CAAa,IAAK,CAAA,OAAA,EAAS,WAAW,WAAW,CAAA;AAAA;AAErE,MAAA,MAAM,KAAK,gBAAiB,EAAA;AAI5B,MAAyB,wBAAA,EAAA;AACzB,MAAA,OAAO,IAAK,CAAA,OAAA;AAAA,aACL,GAAK,EAAA;AACZ,MAAQ,OAAA,CAAA,KAAA,CAAM,iDAAiD,GAAG,CAAA;AAClE,MAAO,OAAA,IAAA;AAAA;AACT;AACF;AAAA,EAGA,MAAM,aAAc,CAAA,OAAA,EAAiB,KAA8B,EAAA;AA7YrE,IAAA,IAAA,EAAA;AA8YI,IAAA,IAAI,EAAC,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,SAAW,CAAA,EAAA;AAC7B,IAAM,MAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,OAAS,EAAA;AAAA,MACrC;AAAA,KACD,CAAA;AAAA;AACH;AAAA,EAGA,MAAM,qBAAqB,KAA8B,EAAA;AArZ3D,IAAA,IAAA,EAAA;AAsZI,IAAA,IAAI,EAAC,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,SAAW,CAAA,EAAA;AAC7B,IAAM,MAAA,OAAA,GAAU,KAAK,KAAM,CAAA,cAAA;AAC3B,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,OAAA,CAAQ,KAAK,sEAAiE,CAAA;AAC9E,MAAA;AAAA;AAIF,IAAA,IAAI,aAAgB,GAAA,KAAA;AACpB,IAAM,MAAA,aAAA,GAAgB,KAAK,KAAM,CAAA,MAAA;AACjC,IAAI,IAAA,aAAA,CAAc,SAAS,CAAG,EAAA;AAC5B,MAAA,MAAM,cAAc,aAAc,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,KAAK,CAAA;AAC1D,MAAA,IAAI,CAAC,WAAa,EAAA;AAEhB,QAAA,MAAM,QAAW,GAAA,aAAA,CAAc,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA;AACpD,QAAA,IAAI,QAAU,EAAA;AACZ,UAAA,OAAA,CAAQ,IAAI,CAAgC,6BAAA,EAAA,KAAK,CAA+C,4CAAA,EAAA,QAAA,CAAS,EAAE,CAAE,CAAA,CAAA;AAC7G,UAAA,aAAA,GAAgB,QAAS,CAAA,EAAA;AAAA,SACpB,MAAA;AACL,UAAA,OAAA,CAAQ,KAAK,8EAAyE,CAAA;AACtF,UAAA;AAAA;AACF;AACF;AAEF,IAAI,IAAA;AACF,MAAM,MAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,OAAS,EAAA;AAAA,QACrC,KAAO,EAAA;AAAA,OACR,CAAA;AACD,MAAQ,OAAA,CAAA,GAAA,CAAI,yDAAyD,aAAa,CAAA;AAAA,aAC3E,GAAK,EAAA;AACZ,MAAQ,OAAA,CAAA,KAAA,CAAM,+DAA+D,GAAG,CAAA;AAAA;AAClF;AACF;AAAA,EAGA,MAAM,YAAa,CAAA,OAAA,EAAiB,OAAgC,EAAA;AAzbtE,IAAA,IAAA,EAAA;AA0bI,IAAA,IAAI,EAAC,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,SAAW,CAAA,EAAA;AAC7B,IAAA,MAAM,IAAK,CAAA,MAAA,CAAO,YAAa,CAAA,OAAA,EAAS,WAAW,OAAO,CAAA;AAAA;AAC5D;AAAA;AAAA,EAKA,MAAM,WAAY,CAAA,QAAA,EAAkB,OAAiC,EAAA;AAjcvE,IAAA,IAAA,EAAA;AAkcI,IAAA,IAAI,EAAC,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,SAAW,CAAA,EAAA;AAC7B,IAAM,MAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,QAAU,EAAA;AAAA,MACtC;AAAA,KACD,CAAA;AACD,IAAA,MAAM,KAAK,gBAAiB,EAAA;AAAA;AAC9B;AAAA,EAGA,MAAM,cAAe,CAAA,QAAA,EAAkB,MAA+B,EAAA;AA1cxE,IAAA,IAAA,EAAA;AA2cI,IAAA,IAAI,EAAC,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,SAAW,CAAA,EAAA;AAC7B,IAAM,MAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,QAAU,EAAA;AAAA,MACtC;AAAA,KACD,CAAA;AACD,IAAA,MAAM,KAAK,gBAAiB,EAAA;AAAA;AAC9B;AAAA,EAIQ,gBAAgB,KAA8B,EAAA;AApdxD,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAsdI,IAAA,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA,CAAM,IAAK,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,KAAA,KAAU,KAAM,CAAA,KAAA,IAAS,CAAE,CAAA,UAAA,KAAe,MAAM,UAAU,CAAA;AACpG,IAAA,IAAI,CAAC,IAAM,EAAA;AACT,MAAQ,OAAA,CAAA,IAAA,CAAK,2EAA2E,KAAM,CAAA,KAAA,EAAO,eAAe,KAAM,CAAA,UAAA,EAAY,QAAU,EAAA,KAAA,CAAM,KAAK,CAAA;AAC3J,MAAA;AAAA;AAEF,IAAQ,OAAA,CAAA,GAAA,CAAI,qCAAqC,KAAM,CAAA,KAAA,EAAO,aAAa,IAAK,CAAA,KAAA,EAAO,QAAU,EAAA,KAAA,CAAM,KAAK,CAAA;AAC5G,IAAA,IAAI,KAAM,CAAA,KAAA,KAAU,OAAW,IAAA,KAAA,CAAM,OAAS,EAAA;AAC5C,MAAA,MAAM,UAAU,OAAO,KAAA,CAAM,QAAQ,OAAY,KAAA,QAAA,GAAW,MAAM,OAAQ,CAAA,OAAA,GAAU,MAAM,OAAQ,CAAA,OAAA,CAAQ,IAAI,CAAK,CAAA,KAAA,CAAA,CAAE,QAAQ,EAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAGxI,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,uBAAL,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA;AAAA,QACxB,IAAM,EAAA,OAAA;AAAA,QACN;AAAA,OACF,CAAA;AAGA,MAAA,MAAM,IAAO,GAAA,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AAC9B,MAAA,MAAM,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA;AACpC,MAAA,IAAA,CAAI,mCAAS,IAAS,MAAA,WAAA,IAAe,QAAQ,EAAG,CAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AAErE,QAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA,GAAI,iCACnB,OADmB,CAAA,EAAA;AAAA,UAEtB,OAAA,EAAS,QAAQ,OAAU,GAAA;AAAA,SAC7B,CAAA;AAAA,OACK,MAAA;AAEL,QAAA,IAAA,CAAK,IAAK,CAAA;AAAA,UACR,EAAA,EAAI,CAAU,OAAA,EAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,UACzB,IAAM,EAAA,WAAA;AAAA,UACN,OAAA;AAAA,UACA,SAAA,EAAW,KAAK,GAAI;AAAA,SACrB,CAAA;AAAA;AAEH,MAAK,IAAA,CAAA,UAAA,CAAW,KAAK,EAAI,EAAA;AAAA,QACvB,QAAU,EAAA;AAAA,OACX,CAAA;AAAA,KACQ,MAAA,IAAA,KAAA,CAAM,KAAU,KAAA,OAAA,IAAW,MAAM,OAAS,EAAA;AACnD,MAAA,MAAM,UAAU,OAAO,KAAA,CAAM,QAAQ,OAAY,KAAA,QAAA,GAAW,MAAM,OAAQ,CAAA,OAAA,GAAU,MAAM,OAAQ,CAAA,OAAA,CAAQ,IAAI,CAAK,CAAA,KAAA,CAAA,CAAE,QAAQ,EAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAGxI,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,uBAAL,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA;AAAA,QACxB,IAAM,EAAA,UAAA;AAAA,QACN;AAAA,OACF,CAAA;AAGA,MAAM,MAAA,IAAA,GAAO,IAAK,CAAA,QAAA,CAAS,MAAO,CAAA,CAAA,CAAA,KAAK,CAAC,CAAE,CAAA,EAAA,CAAG,UAAW,CAAA,SAAS,CAAC,CAAA;AAClE,MAAA,IAAA,CAAK,IAAK,CAAA;AAAA,QACR,EAAA,EAAI,OAAO,UAAW,EAAA;AAAA,QACtB,IAAM,EAAA,WAAA;AAAA,QACN,OAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,QACpB,KAAA,EAAO,MAAM,OAAQ,CAAA;AAAA,OACtB,CAAA;AACD,MAAK,IAAA,CAAA,UAAA,CAAW,KAAK,EAAI,EAAA;AAAA,QACvB,QAAU,EAAA,IAAA;AAAA,QACV,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA;AAAA,OACR,CAAA;AAAA,KACH,MAAA,IAAW,KAAM,CAAA,KAAA,KAAU,OAAS,EAAA;AAClC,MAAQ,OAAA,CAAA,KAAA,CAAM,0CAA4C,EAAA,KAAA,CAAM,YAAY,CAAA;AAC5E,MAAA,MAAM,SAAY,GAAA,oBAAA,CAAqB,KAAM,CAAA,YAAA,IAAgB,eAAe,CAAA;AAE5E,MAAA,CAAA,EAAA,GAAA,IAAA,CAAK,uBAAL,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAA;AAAA,QACxB,IAAM,EAAA,OAAA;AAAA,QACN,KAAO,EAAA;AAAA,OACT,CAAA;AACA,MAAK,IAAA,CAAA,UAAA,CAAW,KAAK,EAAI,EAAA;AAAA,QACvB,MAAQ,EAAA,QAAA;AAAA,QACR,KAAO,EAAA,SAAA;AAAA,QACP,KAAO,EAAA;AAAA,OACR,CAAA;AAAA,KACH,MAAA,IAAW,KAAM,CAAA,KAAA,KAAU,SAAW,EAAA;AACpC,MAAK,IAAA,CAAA,UAAA,CAAW,KAAK,EAAI,EAAA;AAAA,QACvB,MAAQ,EAAA,SAAA;AAAA,QACR,KAAO,EAAA;AAAA,OACR,CAAA;AAAA;AACH;AACF,EACQ,UAAA,CAAW,QAAgB,KAAiC,EAAA;AAClE,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,EAAO,KAAA,MAAA,GAAS,aACrD,CAAA,cAAA,CAAA,cAAA,CAAA,EAAA,EAAA,CAAA,CAAA,EACA,KAFqD,CAAA,EAAA;AAAA,MAGxD,SAAA,EAAW,KAAK,GAAI;AAAA,SAClB,CAAC,CAAA;AACL,IAAA,IAAA,CAAK,MAAO,CAAA;AAAA,MACV;AAAA,KACD,CAAA;AAAA;AACH,EACQ,OAAO,KAAyC,EAAA;AACtD,IAAK,IAAA,CAAA,KAAA,GAAQ,cACR,CAAA,cAAA,CAAA,EAAA,EAAA,IAAA,CAAK,KACL,CAAA,EAAA,KAAA,CAAA;AAEL,IAAW,KAAA,MAAA,QAAA,IAAY,KAAK,SAAW,EAAA;AACrC,MAAI,IAAA;AACF,QAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,eACZ,CAAG,EAAA;AACV,QAAQ,OAAA,CAAA,KAAA,CAAM,yCAAyC,CAAC,CAAA;AAAA;AAC1D;AACF;AAEJ;AAGa,MAAA,mBAAA,GAAsB,IAAI,uBAAwB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gatewayApiKeyBridge.js","sources":["../../src/services/gatewayApiKeyBridge.ts"],"sourcesContent":["/**\n * Web browser pushes pool/BYOK keys to the OpenClaw gateway here.\n * Mobile keeps a no-op: the app shell can extend this later if needed.\n */\n\nexport function resetGatewayApiKeyBridge(): void {}\n\nexport async function ensureGatewayApiKeys(_activeProvider?: string): Promise<void> {}\n"],"names":[],"mappings":"AAKO,SAAS,wBAAiC,GAAA;AAAC;AAClD,eAAsB,qBAAqB,eAAyC,EAAA;AAAC"}
|