@adminide-stack/yantra-mobile 12.0.28-alpha.9 → 12.0.28-alpha.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/lib/api/stt.js +54 -0
  2. package/lib/api/stt.js.map +1 -0
  3. package/lib/assets/icon.png +0 -0
  4. package/lib/components/CustomDrawer.js +479 -0
  5. package/lib/components/CustomDrawer.js.map +1 -0
  6. package/lib/components/GatewayConnector/GatewayConnector.js +18 -0
  7. package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -0
  8. package/lib/components/GatewayToolbarButtonMobile.js +84 -0
  9. package/lib/components/GatewayToolbarButtonMobile.js.map +1 -0
  10. package/lib/components/NavigationHeader/NavigationHeader.js +214 -0
  11. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -0
  12. package/lib/components/ThinkingIndicator.js +55 -0
  13. package/lib/components/ThinkingIndicator.js.map +1 -0
  14. package/lib/components/YantraBrandLoader.js +94 -0
  15. package/lib/components/YantraBrandLoader.js.map +1 -0
  16. package/lib/compute.js +114 -5
  17. package/lib/compute.js.map +1 -1
  18. package/lib/config/constants.js +18 -0
  19. package/lib/config/constants.js.map +1 -0
  20. package/lib/config/env-config.js +75 -19
  21. package/lib/config/env-config.js.map +1 -1
  22. package/lib/contexts/CdecliConnectionContext.js +47 -0
  23. package/lib/contexts/CdecliConnectionContext.js.map +1 -0
  24. package/lib/contexts/GatewayContext.js +77 -0
  25. package/lib/contexts/GatewayContext.js.map +1 -0
  26. package/lib/features/audio-input/AudioRecorderPanel.js +220 -0
  27. package/lib/features/audio-input/AudioRecorderPanel.js.map +1 -0
  28. package/lib/features/audio-input/MicErrorBoundary.js +34 -0
  29. package/lib/features/audio-input/MicErrorBoundary.js.map +1 -0
  30. package/lib/features/audio-input/useAudioPermission.js +24 -0
  31. package/lib/features/audio-input/useAudioPermission.js.map +1 -0
  32. package/lib/graphql/agentGatewayDocuments.js +53 -0
  33. package/lib/graphql/agentGatewayDocuments.js.map +1 -0
  34. package/lib/hooks/useAccountDefaultSettings.js +38 -0
  35. package/lib/hooks/useAccountDefaultSettings.js.map +1 -0
  36. package/lib/hooks/useCdecliAutoConnect.js +244 -0
  37. package/lib/hooks/useCdecliAutoConnect.js.map +1 -0
  38. package/lib/hooks/useCdecliChannel.js +161 -0
  39. package/lib/hooks/useCdecliChannel.js.map +1 -0
  40. package/lib/hooks/useChatApi.js +386 -170
  41. package/lib/hooks/useChatApi.js.map +1 -1
  42. package/lib/hooks/useChatStream.js +179 -137
  43. package/lib/hooks/useChatStream.js.map +1 -1
  44. package/lib/hooks/useGatewayConnection.js +123 -0
  45. package/lib/hooks/useGatewayConnection.js.map +1 -0
  46. package/lib/hooks/useGatewayRegistry.js +28 -0
  47. package/lib/hooks/useGatewayRegistry.js.map +1 -0
  48. package/lib/hooks/usePrerequisiteIds.js +209 -0
  49. package/lib/hooks/usePrerequisiteIds.js.map +1 -0
  50. package/lib/hooks/useWorkspaceProvisioner.js +236 -0
  51. package/lib/hooks/useWorkspaceProvisioner.js.map +1 -0
  52. package/lib/index.js +1 -1
  53. package/lib/index.js.map +1 -1
  54. package/lib/routes.json +120 -5
  55. package/lib/screens/Chat/index.js +409 -0
  56. package/lib/screens/Chat/index.js.map +1 -0
  57. package/lib/screens/ChatHistory/index.js +56 -0
  58. package/lib/screens/ChatHistory/index.js.map +1 -0
  59. package/lib/screens/Home/HomeScreen.js +364 -144
  60. package/lib/screens/Home/HomeScreen.js.map +1 -1
  61. package/lib/screens/Home/components/ChatHistoryLanding.js +487 -0
  62. package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -0
  63. package/lib/screens/Home/components/DeepSearchModal.js +349 -0
  64. package/lib/screens/Home/components/DeepSearchModal.js.map +1 -0
  65. package/lib/screens/Home/deepSearchUtils.js +41 -0
  66. package/lib/screens/Home/deepSearchUtils.js.map +1 -0
  67. package/lib/screens/NewChat/index.js +43 -0
  68. package/lib/screens/NewChat/index.js.map +1 -0
  69. package/lib/services/agentSessionManager.js +451 -0
  70. package/lib/services/agentSessionManager.js.map +1 -0
  71. package/lib/services/gatewayApiKeyBridge.js +4 -0
  72. package/lib/services/gatewayApiKeyBridge.js.map +1 -0
  73. package/lib/services/gatewayClient.js +470 -0
  74. package/lib/services/gatewayClient.js.map +1 -0
  75. package/lib/theme/mobileTokens.js +18 -0
  76. package/lib/theme/mobileTokens.js.map +1 -0
  77. package/lib/utils/cdecodeUri.js +68 -0
  78. package/lib/utils/cdecodeUri.js.map +1 -0
  79. package/lib/utils/gatewaySelectionStorage.js +21 -0
  80. package/lib/utils/gatewaySelectionStorage.js.map +1 -0
  81. package/lib/utils/syncMobileOrgRouteContext.js +61 -0
  82. package/lib/utils/syncMobileOrgRouteContext.js.map +1 -0
  83. package/package.json +7 -3
  84. package/lib/api/chatApi.js +0 -102
  85. package/lib/api/chatApi.js.map +0 -1
@@ -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":"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"}
@@ -0,0 +1,4 @@
1
+ function resetGatewayApiKeyBridge() {
2
+ }
3
+ async function ensureGatewayApiKeys(_activeProvider) {
4
+ }export{ensureGatewayApiKeys,resetGatewayApiKeyBridge};//# sourceMappingURL=gatewayApiKeyBridge.js.map
@@ -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"}