capacitor-mobile-claw 1.4.1 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/dist/esm/definitions.d.ts +152 -2
- package/dist/esm/definitions.d.ts.map +1 -1
- package/dist/esm/engine.d.ts +21 -1
- package/dist/esm/engine.d.ts.map +1 -1
- package/dist/esm/engine.js +160 -0
- package/dist/esm/engine.js.map +1 -1
- package/dist/esm/plugin.d.ts +18 -1
- package/dist/esm/plugin.d.ts.map +1 -1
- package/dist/esm/plugin.js +42 -0
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/services/bridge-protocol.d.ts +178 -2
- package/dist/esm/services/bridge-protocol.d.ts.map +1 -1
- package/nodejs-assets/nodejs-project/main.js +213 -12
- package/nodejs-assets/nodejs-project/worker-db.js +773 -3
- package/nodejs-assets/nodejs-project/worker-heartbeat.js +764 -0
- package/package.json +3 -2
package/dist/esm/plugin.js
CHANGED
|
@@ -30,6 +30,48 @@ export class MobileClawWeb extends WebPlugin {
|
|
|
30
30
|
async getAuthStatus() {
|
|
31
31
|
return this.engine.getAuthStatus();
|
|
32
32
|
}
|
|
33
|
+
async setSchedulerConfig(config) {
|
|
34
|
+
return this.engine.setSchedulerConfig(config);
|
|
35
|
+
}
|
|
36
|
+
async getSchedulerConfig() {
|
|
37
|
+
return this.engine.getSchedulerConfig();
|
|
38
|
+
}
|
|
39
|
+
async setHeartbeat(config) {
|
|
40
|
+
return this.engine.setHeartbeat(config);
|
|
41
|
+
}
|
|
42
|
+
async triggerHeartbeatWake(source) {
|
|
43
|
+
return this.engine.triggerHeartbeatWake(source);
|
|
44
|
+
}
|
|
45
|
+
async addCronJob(job) {
|
|
46
|
+
return this.engine.addCronJob(job);
|
|
47
|
+
}
|
|
48
|
+
async updateCronJob(id, patch) {
|
|
49
|
+
return this.engine.updateCronJob(id, patch);
|
|
50
|
+
}
|
|
51
|
+
async removeCronJob(id) {
|
|
52
|
+
return this.engine.removeCronJob(id);
|
|
53
|
+
}
|
|
54
|
+
async listCronJobs() {
|
|
55
|
+
return this.engine.listCronJobs();
|
|
56
|
+
}
|
|
57
|
+
async runCronJob(id) {
|
|
58
|
+
return this.engine.runCronJob(id);
|
|
59
|
+
}
|
|
60
|
+
async getCronRunHistory(jobId, limit) {
|
|
61
|
+
return this.engine.getCronRunHistory(jobId, limit);
|
|
62
|
+
}
|
|
63
|
+
async addSkill(skill) {
|
|
64
|
+
return this.engine.addSkill(skill);
|
|
65
|
+
}
|
|
66
|
+
async updateSkill(id, patch) {
|
|
67
|
+
return this.engine.updateSkill(id, patch);
|
|
68
|
+
}
|
|
69
|
+
async removeSkill(id) {
|
|
70
|
+
return this.engine.removeSkill(id);
|
|
71
|
+
}
|
|
72
|
+
async listSkills() {
|
|
73
|
+
return this.engine.listSkills();
|
|
74
|
+
}
|
|
33
75
|
async readFile(options) {
|
|
34
76
|
return this.engine.readFile(options.path);
|
|
35
77
|
}
|
package/dist/esm/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Bridge protocol between the Web UI and the embedded Node.js worker.
|
|
3
3
|
* Messages are JSON-serialized and passed via Capacitor-NodeJS message channel.
|
|
4
4
|
*/
|
|
5
|
+
import type { CronJobInput, CronJobRecord, CronRunRecord, CronSkillInput, CronSkillRecord, HeartbeatConfig, SchedulerConfig } from '../definitions';
|
|
5
6
|
export interface AgentStartMessage {
|
|
6
7
|
type: 'agent.start';
|
|
7
8
|
agentId: string;
|
|
@@ -74,7 +75,64 @@ export interface ToolPreExecuteResultMessage {
|
|
|
74
75
|
deny?: boolean;
|
|
75
76
|
denyReason?: string;
|
|
76
77
|
}
|
|
77
|
-
export
|
|
78
|
+
export interface HeartbeatWakeMessage {
|
|
79
|
+
type: 'heartbeat.wake';
|
|
80
|
+
source?: string;
|
|
81
|
+
timestamp?: number;
|
|
82
|
+
}
|
|
83
|
+
export interface HeartbeatSetMessage {
|
|
84
|
+
type: 'heartbeat.set';
|
|
85
|
+
config: Partial<HeartbeatConfig>;
|
|
86
|
+
}
|
|
87
|
+
export interface SchedulerSetMessage {
|
|
88
|
+
type: 'scheduler.set';
|
|
89
|
+
config: Partial<SchedulerConfig>;
|
|
90
|
+
}
|
|
91
|
+
export interface SchedulerGetMessage {
|
|
92
|
+
type: 'scheduler.get';
|
|
93
|
+
}
|
|
94
|
+
export interface CronJobAddMessage {
|
|
95
|
+
type: 'cron.job.add';
|
|
96
|
+
job: CronJobInput;
|
|
97
|
+
}
|
|
98
|
+
export interface CronJobUpdateMessage {
|
|
99
|
+
type: 'cron.job.update';
|
|
100
|
+
id: string;
|
|
101
|
+
patch: Partial<CronJobInput>;
|
|
102
|
+
}
|
|
103
|
+
export interface CronJobRemoveMessage {
|
|
104
|
+
type: 'cron.job.remove';
|
|
105
|
+
id: string;
|
|
106
|
+
}
|
|
107
|
+
export interface CronJobListMessage {
|
|
108
|
+
type: 'cron.job.list';
|
|
109
|
+
}
|
|
110
|
+
export interface CronJobRunMessage {
|
|
111
|
+
type: 'cron.job.run';
|
|
112
|
+
id: string;
|
|
113
|
+
}
|
|
114
|
+
export interface CronRunsListMessage {
|
|
115
|
+
type: 'cron.runs.list';
|
|
116
|
+
jobId?: string;
|
|
117
|
+
limit?: number;
|
|
118
|
+
}
|
|
119
|
+
export interface CronSkillAddMessage {
|
|
120
|
+
type: 'cron.skill.add';
|
|
121
|
+
skill: CronSkillInput;
|
|
122
|
+
}
|
|
123
|
+
export interface CronSkillUpdateMessage {
|
|
124
|
+
type: 'cron.skill.update';
|
|
125
|
+
id: string;
|
|
126
|
+
patch: Partial<CronSkillInput>;
|
|
127
|
+
}
|
|
128
|
+
export interface CronSkillRemoveMessage {
|
|
129
|
+
type: 'cron.skill.remove';
|
|
130
|
+
id: string;
|
|
131
|
+
}
|
|
132
|
+
export interface CronSkillListMessage {
|
|
133
|
+
type: 'cron.skill.list';
|
|
134
|
+
}
|
|
135
|
+
export type UIToNodeMessage = AgentStartMessage | AgentStopMessage | AgentSteerMessage | ConfigUpdateMessage | ConfigStatusMessage | SessionListMessage | SessionClearMessage | FileReadMessage | FileWriteMessage | SkillStartMessage | ToolPreExecuteResultMessage | HeartbeatWakeMessage | HeartbeatSetMessage | SchedulerSetMessage | SchedulerGetMessage | CronJobAddMessage | CronJobUpdateMessage | CronJobRemoveMessage | CronJobListMessage | CronJobRunMessage | CronRunsListMessage | CronSkillAddMessage | CronSkillUpdateMessage | CronSkillRemoveMessage | CronSkillListMessage;
|
|
78
136
|
export interface AgentEventMessage {
|
|
79
137
|
type: 'agent.event';
|
|
80
138
|
eventType: 'text_delta' | 'tool_use' | 'tool_result' | 'thinking' | 'error';
|
|
@@ -149,5 +207,123 @@ export interface ToolPreExecuteExpiredMessage {
|
|
|
149
207
|
toolCallId: string;
|
|
150
208
|
toolName: string;
|
|
151
209
|
}
|
|
152
|
-
export
|
|
210
|
+
export interface HeartbeatStartedMessage {
|
|
211
|
+
type: 'heartbeat.started';
|
|
212
|
+
source: string;
|
|
213
|
+
}
|
|
214
|
+
export interface HeartbeatCompletedMessage {
|
|
215
|
+
type: 'heartbeat.completed';
|
|
216
|
+
status: string;
|
|
217
|
+
reason?: string;
|
|
218
|
+
durationMs: number;
|
|
219
|
+
responsePreview?: string;
|
|
220
|
+
}
|
|
221
|
+
export interface HeartbeatSkippedMessage {
|
|
222
|
+
type: 'heartbeat.skipped';
|
|
223
|
+
reason: string;
|
|
224
|
+
}
|
|
225
|
+
export interface CronJobStartedMessage {
|
|
226
|
+
type: 'cron.job.started';
|
|
227
|
+
jobId: string;
|
|
228
|
+
jobName: string;
|
|
229
|
+
}
|
|
230
|
+
export interface CronJobCompletedMessage {
|
|
231
|
+
type: 'cron.job.completed';
|
|
232
|
+
jobId: string;
|
|
233
|
+
status: string;
|
|
234
|
+
durationMs: number;
|
|
235
|
+
responsePreview?: string;
|
|
236
|
+
}
|
|
237
|
+
export interface CronJobErrorMessage {
|
|
238
|
+
type: 'cron.job.error';
|
|
239
|
+
jobId: string;
|
|
240
|
+
error: string;
|
|
241
|
+
consecutiveErrors: number;
|
|
242
|
+
}
|
|
243
|
+
export interface CronNotificationMessage {
|
|
244
|
+
type: 'cron.notification';
|
|
245
|
+
title: string;
|
|
246
|
+
body: string;
|
|
247
|
+
jobId?: string;
|
|
248
|
+
source: string;
|
|
249
|
+
}
|
|
250
|
+
export interface SchedulerStatusMessage {
|
|
251
|
+
type: 'scheduler.status';
|
|
252
|
+
enabled: boolean;
|
|
253
|
+
mode: string;
|
|
254
|
+
nextDueAt?: number;
|
|
255
|
+
heartbeatNext?: number;
|
|
256
|
+
}
|
|
257
|
+
export interface SchedulerOverdueMessage {
|
|
258
|
+
type: 'scheduler.overdue';
|
|
259
|
+
[key: string]: unknown;
|
|
260
|
+
}
|
|
261
|
+
export interface HeartbeatSetResultMessage {
|
|
262
|
+
type: 'heartbeat.set.result';
|
|
263
|
+
success: boolean;
|
|
264
|
+
heartbeat?: HeartbeatConfig;
|
|
265
|
+
error?: string;
|
|
266
|
+
}
|
|
267
|
+
export interface SchedulerSetResultMessage {
|
|
268
|
+
type: 'scheduler.set.result';
|
|
269
|
+
success: boolean;
|
|
270
|
+
scheduler?: SchedulerConfig;
|
|
271
|
+
error?: string;
|
|
272
|
+
}
|
|
273
|
+
export interface SchedulerGetResultMessage {
|
|
274
|
+
type: 'scheduler.get.result';
|
|
275
|
+
scheduler: SchedulerConfig;
|
|
276
|
+
heartbeat: HeartbeatConfig;
|
|
277
|
+
}
|
|
278
|
+
export interface CronJobAddResultMessage {
|
|
279
|
+
type: 'cron.job.add.result';
|
|
280
|
+
success: boolean;
|
|
281
|
+
job?: CronJobRecord;
|
|
282
|
+
error?: string;
|
|
283
|
+
}
|
|
284
|
+
export interface CronJobUpdateResultMessage {
|
|
285
|
+
type: 'cron.job.update.result';
|
|
286
|
+
success: boolean;
|
|
287
|
+
error?: string;
|
|
288
|
+
}
|
|
289
|
+
export interface CronJobRemoveResultMessage {
|
|
290
|
+
type: 'cron.job.remove.result';
|
|
291
|
+
success: boolean;
|
|
292
|
+
error?: string;
|
|
293
|
+
}
|
|
294
|
+
export interface CronJobListResultMessage {
|
|
295
|
+
type: 'cron.job.list.result';
|
|
296
|
+
jobs: CronJobRecord[];
|
|
297
|
+
}
|
|
298
|
+
export interface CronJobRunResultMessage {
|
|
299
|
+
type: 'cron.job.run.result';
|
|
300
|
+
success: boolean;
|
|
301
|
+
id: string;
|
|
302
|
+
error?: string;
|
|
303
|
+
}
|
|
304
|
+
export interface CronRunsListResultMessage {
|
|
305
|
+
type: 'cron.runs.list.result';
|
|
306
|
+
runs: CronRunRecord[];
|
|
307
|
+
}
|
|
308
|
+
export interface CronSkillAddResultMessage {
|
|
309
|
+
type: 'cron.skill.add.result';
|
|
310
|
+
success: boolean;
|
|
311
|
+
skill?: CronSkillRecord;
|
|
312
|
+
error?: string;
|
|
313
|
+
}
|
|
314
|
+
export interface CronSkillUpdateResultMessage {
|
|
315
|
+
type: 'cron.skill.update.result';
|
|
316
|
+
success: boolean;
|
|
317
|
+
error?: string;
|
|
318
|
+
}
|
|
319
|
+
export interface CronSkillRemoveResultMessage {
|
|
320
|
+
type: 'cron.skill.remove.result';
|
|
321
|
+
success: boolean;
|
|
322
|
+
error?: string;
|
|
323
|
+
}
|
|
324
|
+
export interface CronSkillListResultMessage {
|
|
325
|
+
type: 'cron.skill.list.result';
|
|
326
|
+
skills: CronSkillRecord[];
|
|
327
|
+
}
|
|
328
|
+
export type NodeToUIMessage = AgentEventMessage | AgentCompletedMessage | AgentErrorMessage | ReadyMessage | SessionListResultMessage | FileReadResultMessage | ConfigStatusResultMessage | SessionClearResultMessage | ToolPreExecuteMessage | ToolPreExecuteExpiredMessage | HeartbeatStartedMessage | HeartbeatCompletedMessage | HeartbeatSkippedMessage | CronJobStartedMessage | CronJobCompletedMessage | CronJobErrorMessage | CronNotificationMessage | SchedulerStatusMessage | SchedulerOverdueMessage | HeartbeatSetResultMessage | SchedulerSetResultMessage | SchedulerGetResultMessage | CronJobAddResultMessage | CronJobUpdateResultMessage | CronJobRemoveResultMessage | CronJobListResultMessage | CronJobRunResultMessage | CronRunsListResultMessage | CronSkillAddResultMessage | CronSkillUpdateResultMessage | CronSkillRemoveResultMessage | CronSkillListResultMessage;
|
|
153
329
|
//# sourceMappingURL=bridge-protocol.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge-protocol.d.ts","sourceRoot":"","sources":["../../../src/services/bridge-protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"bridge-protocol.d.ts","sourceRoot":"","sources":["../../../src/services/bridge-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -82,12 +82,18 @@ import {
|
|
|
82
82
|
initWorkerDb, isDbReady,
|
|
83
83
|
run as dbRun, query as dbQuery, queryOne as dbQueryOne,
|
|
84
84
|
transaction as dbTransaction, flush as dbFlush,
|
|
85
|
+
getSchedulerConfig, setSchedulerConfig,
|
|
86
|
+
getHeartbeatConfig, setHeartbeatConfig,
|
|
87
|
+
addCronSkill, updateCronSkill, removeCronSkill, listCronSkills,
|
|
88
|
+
addCronJob, updateCronJob, removeCronJob, listCronJobs,
|
|
89
|
+
listCronRuns,
|
|
85
90
|
migrateFromJsonl, atomicWrite,
|
|
86
91
|
} from './worker-db.js';
|
|
87
92
|
|
|
88
93
|
// ── MCP bridge (device tools from WebView) ────────────────────────────────
|
|
89
94
|
import { initMcpBridge } from './mcp-bridge-client.js';
|
|
90
95
|
import { buildMcpAgentTools } from './mcp-agent-tools.js';
|
|
96
|
+
import { initHeartbeat, handleHeartbeatWake } from './worker-heartbeat.js';
|
|
91
97
|
|
|
92
98
|
const mcpBridge = initMcpBridge(channel);
|
|
93
99
|
console.error(`[DEBUG] MCP bridge initialized`);
|
|
@@ -122,10 +128,7 @@ async function discoverMcpTools() {
|
|
|
122
128
|
|
|
123
129
|
// Only cache if the epoch hasn't changed (no invalidation while discovering)
|
|
124
130
|
if (epoch === discoveryEpoch) {
|
|
125
|
-
cachedMcpTools = rawTools
|
|
126
|
-
...tool,
|
|
127
|
-
execute: wrapWithPreExecuteHook(tool.name, tool.execute),
|
|
128
|
-
}));
|
|
131
|
+
cachedMcpTools = rawTools;
|
|
129
132
|
console.log(`[mobile-claw] Discovered ${cachedMcpTools.length} MCP device tools`);
|
|
130
133
|
}
|
|
131
134
|
|
|
@@ -910,6 +913,23 @@ let currentAgent = null;
|
|
|
910
913
|
let currentAbortController = null;
|
|
911
914
|
let currentSessionKey = null;
|
|
912
915
|
let persistedMessageCount = 0; // Tracks how many messages have been written to JSONL
|
|
916
|
+
let userTurnActive = false;
|
|
917
|
+
|
|
918
|
+
function setUserTurnActive(active) {
|
|
919
|
+
userTurnActive = !!active;
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
function isUserTurnActive() {
|
|
923
|
+
return userTurnActive;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
function getCurrentAgent() {
|
|
927
|
+
return currentAgent;
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
function getCurrentSessionKey() {
|
|
931
|
+
return currentSessionKey;
|
|
932
|
+
}
|
|
913
933
|
|
|
914
934
|
// Idempotency: track recent message keys to silently drop duplicates
|
|
915
935
|
const recentIdempotencyKeys = new Set();
|
|
@@ -1109,13 +1129,23 @@ function buildAgentTools() {
|
|
|
1109
1129
|
},
|
|
1110
1130
|
];
|
|
1111
1131
|
|
|
1112
|
-
|
|
1132
|
+
return toolDefs;
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
function wrapToolsWithPreExecuteHook(toolDefs) {
|
|
1113
1136
|
return toolDefs.map(tool => ({
|
|
1114
1137
|
...tool,
|
|
1115
1138
|
execute: wrapWithPreExecuteHook(tool.name, tool.execute),
|
|
1116
1139
|
}));
|
|
1117
1140
|
}
|
|
1118
1141
|
|
|
1142
|
+
function buildAutoApproveTools(allowedToolNames = null) {
|
|
1143
|
+
const raw = buildAgentTools();
|
|
1144
|
+
return allowedToolNames
|
|
1145
|
+
? raw.filter(tool => allowedToolNames.includes(tool.name))
|
|
1146
|
+
: raw;
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1119
1149
|
// ── AgentEvent → Bridge event mapping ────────────────────────────────────
|
|
1120
1150
|
|
|
1121
1151
|
// skillContext: if set, events are tagged as skill events and ignored by the main session view
|
|
@@ -1390,6 +1420,11 @@ function _checkpointMessages(agent, agentId, sessionKey) {
|
|
|
1390
1420
|
}
|
|
1391
1421
|
}
|
|
1392
1422
|
|
|
1423
|
+
function persistCurrentSession(startTime = Date.now(), agentId = 'main', sessionKey = currentSessionKey) {
|
|
1424
|
+
if (!currentAgent || !sessionKey) return;
|
|
1425
|
+
saveSession(currentAgent, agentId, sessionKey, startTime);
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1393
1428
|
// ── Error classification ─────────────────────────────────────────────────
|
|
1394
1429
|
|
|
1395
1430
|
function isTransientError(err) {
|
|
@@ -1596,7 +1631,11 @@ async function runSkill(agentId, locale = 'en', injectedConfig = null) {
|
|
|
1596
1631
|
const setupNames = new Set(setupTools.map(t => t.name));
|
|
1597
1632
|
const filteredBase = baseTools.filter(t => !setupNames.has(t.name));
|
|
1598
1633
|
const filteredMcp = mcpTools.filter(t => !setupNames.has(t.name));
|
|
1599
|
-
const tools = [
|
|
1634
|
+
const tools = [
|
|
1635
|
+
...setupTools,
|
|
1636
|
+
...wrapToolsWithPreExecuteHook(filteredBase),
|
|
1637
|
+
...wrapToolsWithPreExecuteHook(filteredMcp),
|
|
1638
|
+
];
|
|
1600
1639
|
|
|
1601
1640
|
const skillId = injectedConfig?.id || 'setup';
|
|
1602
1641
|
const sessionKey = `${skillId}/${Date.now()}`;
|
|
@@ -1751,9 +1790,9 @@ async function runAgentLoop(agentId, sessionKey, prompt, requestedModel) {
|
|
|
1751
1790
|
console.error(`[DEBUG] Model resolved: ${JSON.stringify({id: model?.id, provider: model?.provider, api: model?.api}).slice(0,200)}`);
|
|
1752
1791
|
|
|
1753
1792
|
// Merge local tools with MCP device tools (if bridge is available)
|
|
1754
|
-
const localTools = buildAgentTools();
|
|
1793
|
+
const localTools = wrapToolsWithPreExecuteHook(buildAgentTools());
|
|
1755
1794
|
console.error(`[DEBUG] Local tools: ${localTools.length}`);
|
|
1756
|
-
const mcpTools = await discoverMcpTools();
|
|
1795
|
+
const mcpTools = wrapToolsWithPreExecuteHook(await discoverMcpTools());
|
|
1757
1796
|
console.error(`[DEBUG] MCP tools: ${mcpTools.length}`);
|
|
1758
1797
|
const tools = [...localTools, ...mcpTools];
|
|
1759
1798
|
console.error(`[DEBUG] Total tools: ${tools.length}`);
|
|
@@ -1786,6 +1825,7 @@ async function runAgentLoop(agentId, sessionKey, prompt, requestedModel) {
|
|
|
1786
1825
|
// Run
|
|
1787
1826
|
const startTime = Date.now();
|
|
1788
1827
|
console.error(`[DEBUG] Calling agent.prompt()...`);
|
|
1828
|
+
setUserTurnActive(true);
|
|
1789
1829
|
try {
|
|
1790
1830
|
await agent.prompt(prompt);
|
|
1791
1831
|
console.error(`[DEBUG] agent.prompt() resolved, calling waitForIdle()...`);
|
|
@@ -1827,6 +1867,8 @@ async function runAgentLoop(agentId, sessionKey, prompt, requestedModel) {
|
|
|
1827
1867
|
lastFailedPrompt = null;
|
|
1828
1868
|
}
|
|
1829
1869
|
currentAbortController = null;
|
|
1870
|
+
} finally {
|
|
1871
|
+
setUserTurnActive(false);
|
|
1830
1872
|
}
|
|
1831
1873
|
}
|
|
1832
1874
|
|
|
@@ -1874,6 +1916,7 @@ channel.addListener('message', async (event) => {
|
|
|
1874
1916
|
const startTime = Date.now();
|
|
1875
1917
|
const agentId = msg.agentId || 'main';
|
|
1876
1918
|
const sessionKey = currentSessionKey || msg.sessionKey;
|
|
1919
|
+
setUserTurnActive(true);
|
|
1877
1920
|
try {
|
|
1878
1921
|
await currentAgent.prompt(msg.prompt);
|
|
1879
1922
|
await currentAgent.waitForIdle();
|
|
@@ -1903,6 +1946,8 @@ channel.addListener('message', async (event) => {
|
|
|
1903
1946
|
currentSessionKey = null;
|
|
1904
1947
|
lastFailedPrompt = null;
|
|
1905
1948
|
}
|
|
1949
|
+
} finally {
|
|
1950
|
+
setUserTurnActive(false);
|
|
1906
1951
|
}
|
|
1907
1952
|
} else {
|
|
1908
1953
|
// New conversation
|
|
@@ -1938,6 +1983,7 @@ channel.addListener('message', async (event) => {
|
|
|
1938
1983
|
const retryAgentId = msg.agentId || 'main';
|
|
1939
1984
|
const retrySessionKey = currentSessionKey || msg.sessionKey;
|
|
1940
1985
|
const retryStart = Date.now();
|
|
1986
|
+
setUserTurnActive(true);
|
|
1941
1987
|
try {
|
|
1942
1988
|
await currentAgent.prompt(retryPrompt);
|
|
1943
1989
|
await currentAgent.waitForIdle();
|
|
@@ -1965,6 +2011,8 @@ channel.addListener('message', async (event) => {
|
|
|
1965
2011
|
currentSessionKey = null;
|
|
1966
2012
|
lastFailedPrompt = null;
|
|
1967
2013
|
}
|
|
2014
|
+
} finally {
|
|
2015
|
+
setUserTurnActive(false);
|
|
1968
2016
|
}
|
|
1969
2017
|
break;
|
|
1970
2018
|
}
|
|
@@ -2043,8 +2091,8 @@ channel.addListener('message', async (event) => {
|
|
|
2043
2091
|
// If an agent is running, re-discover and inject the updated tool set
|
|
2044
2092
|
if (currentAgent) {
|
|
2045
2093
|
try {
|
|
2046
|
-
const localTools = buildAgentTools();
|
|
2047
|
-
const mcpTools = await discoverMcpTools();
|
|
2094
|
+
const localTools = wrapToolsWithPreExecuteHook(buildAgentTools());
|
|
2095
|
+
const mcpTools = wrapToolsWithPreExecuteHook(await discoverMcpTools());
|
|
2048
2096
|
const tools = [...localTools, ...mcpTools];
|
|
2049
2097
|
currentAgent.setTools(tools);
|
|
2050
2098
|
console.log(`[mobile-claw] Tools invalidated and refreshed: ${tools.length} total (${mcpTools.length} MCP)`);
|
|
@@ -2135,6 +2183,142 @@ channel.addListener('message', async (event) => {
|
|
|
2135
2183
|
break;
|
|
2136
2184
|
}
|
|
2137
2185
|
|
|
2186
|
+
case 'heartbeat.wake': {
|
|
2187
|
+
await handleHeartbeatWake(msg.source || 'manual');
|
|
2188
|
+
break;
|
|
2189
|
+
}
|
|
2190
|
+
|
|
2191
|
+
case 'heartbeat.set': {
|
|
2192
|
+
try {
|
|
2193
|
+
const heartbeat = setHeartbeatConfig(msg.config || {});
|
|
2194
|
+
channel.send('message', {
|
|
2195
|
+
type: 'heartbeat.set.result',
|
|
2196
|
+
success: true,
|
|
2197
|
+
heartbeat,
|
|
2198
|
+
});
|
|
2199
|
+
} catch (err) {
|
|
2200
|
+
channel.send('message', {
|
|
2201
|
+
type: 'heartbeat.set.result',
|
|
2202
|
+
success: false,
|
|
2203
|
+
error: err.message,
|
|
2204
|
+
});
|
|
2205
|
+
}
|
|
2206
|
+
break;
|
|
2207
|
+
}
|
|
2208
|
+
|
|
2209
|
+
case 'scheduler.set': {
|
|
2210
|
+
try {
|
|
2211
|
+
const scheduler = setSchedulerConfig(msg.config || {});
|
|
2212
|
+
channel.send('message', {
|
|
2213
|
+
type: 'scheduler.set.result',
|
|
2214
|
+
success: true,
|
|
2215
|
+
scheduler,
|
|
2216
|
+
});
|
|
2217
|
+
} catch (err) {
|
|
2218
|
+
channel.send('message', {
|
|
2219
|
+
type: 'scheduler.set.result',
|
|
2220
|
+
success: false,
|
|
2221
|
+
error: err.message,
|
|
2222
|
+
});
|
|
2223
|
+
}
|
|
2224
|
+
break;
|
|
2225
|
+
}
|
|
2226
|
+
|
|
2227
|
+
case 'scheduler.get': {
|
|
2228
|
+
const scheduler = getSchedulerConfig();
|
|
2229
|
+
const heartbeat = getHeartbeatConfig();
|
|
2230
|
+
channel.send('message', {
|
|
2231
|
+
type: 'scheduler.get.result',
|
|
2232
|
+
scheduler,
|
|
2233
|
+
heartbeat,
|
|
2234
|
+
});
|
|
2235
|
+
break;
|
|
2236
|
+
}
|
|
2237
|
+
|
|
2238
|
+
case 'cron.job.add': {
|
|
2239
|
+
try {
|
|
2240
|
+
const job = addCronJob(msg.job || {});
|
|
2241
|
+
channel.send('message', { type: 'cron.job.add.result', success: true, job });
|
|
2242
|
+
} catch (err) {
|
|
2243
|
+
channel.send('message', { type: 'cron.job.add.result', success: false, error: err.message });
|
|
2244
|
+
}
|
|
2245
|
+
break;
|
|
2246
|
+
}
|
|
2247
|
+
|
|
2248
|
+
case 'cron.job.update': {
|
|
2249
|
+
try {
|
|
2250
|
+
updateCronJob(msg.id, msg.patch || {});
|
|
2251
|
+
channel.send('message', { type: 'cron.job.update.result', success: true });
|
|
2252
|
+
} catch (err) {
|
|
2253
|
+
channel.send('message', { type: 'cron.job.update.result', success: false, error: err.message });
|
|
2254
|
+
}
|
|
2255
|
+
break;
|
|
2256
|
+
}
|
|
2257
|
+
|
|
2258
|
+
case 'cron.job.remove': {
|
|
2259
|
+
try {
|
|
2260
|
+
removeCronJob(msg.id);
|
|
2261
|
+
channel.send('message', { type: 'cron.job.remove.result', success: true });
|
|
2262
|
+
} catch (err) {
|
|
2263
|
+
channel.send('message', { type: 'cron.job.remove.result', success: false, error: err.message });
|
|
2264
|
+
}
|
|
2265
|
+
break;
|
|
2266
|
+
}
|
|
2267
|
+
|
|
2268
|
+
case 'cron.job.list': {
|
|
2269
|
+
const jobs = listCronJobs();
|
|
2270
|
+
channel.send('message', { type: 'cron.job.list.result', jobs });
|
|
2271
|
+
break;
|
|
2272
|
+
}
|
|
2273
|
+
|
|
2274
|
+
case 'cron.job.run': {
|
|
2275
|
+
await handleHeartbeatWake('manual', { force: true, forceJobId: msg.id });
|
|
2276
|
+
channel.send('message', { type: 'cron.job.run.result', success: true, id: msg.id });
|
|
2277
|
+
break;
|
|
2278
|
+
}
|
|
2279
|
+
|
|
2280
|
+
case 'cron.runs.list': {
|
|
2281
|
+
const runs = listCronRuns(msg.jobId, msg.limit);
|
|
2282
|
+
channel.send('message', { type: 'cron.runs.list.result', runs });
|
|
2283
|
+
break;
|
|
2284
|
+
}
|
|
2285
|
+
|
|
2286
|
+
case 'cron.skill.add': {
|
|
2287
|
+
try {
|
|
2288
|
+
const skill = addCronSkill(msg.skill || {});
|
|
2289
|
+
channel.send('message', { type: 'cron.skill.add.result', success: true, skill });
|
|
2290
|
+
} catch (err) {
|
|
2291
|
+
channel.send('message', { type: 'cron.skill.add.result', success: false, error: err.message });
|
|
2292
|
+
}
|
|
2293
|
+
break;
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
case 'cron.skill.update': {
|
|
2297
|
+
try {
|
|
2298
|
+
updateCronSkill(msg.id, msg.patch || {});
|
|
2299
|
+
channel.send('message', { type: 'cron.skill.update.result', success: true });
|
|
2300
|
+
} catch (err) {
|
|
2301
|
+
channel.send('message', { type: 'cron.skill.update.result', success: false, error: err.message });
|
|
2302
|
+
}
|
|
2303
|
+
break;
|
|
2304
|
+
}
|
|
2305
|
+
|
|
2306
|
+
case 'cron.skill.remove': {
|
|
2307
|
+
try {
|
|
2308
|
+
removeCronSkill(msg.id);
|
|
2309
|
+
channel.send('message', { type: 'cron.skill.remove.result', success: true });
|
|
2310
|
+
} catch (err) {
|
|
2311
|
+
channel.send('message', { type: 'cron.skill.remove.result', success: false, error: err.message });
|
|
2312
|
+
}
|
|
2313
|
+
break;
|
|
2314
|
+
}
|
|
2315
|
+
|
|
2316
|
+
case 'cron.skill.list': {
|
|
2317
|
+
const skills = listCronSkills();
|
|
2318
|
+
channel.send('message', { type: 'cron.skill.list.result', skills });
|
|
2319
|
+
break;
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2138
2322
|
case 'session.list': {
|
|
2139
2323
|
const agentId = msg.agentId || 'main';
|
|
2140
2324
|
let sessions = [];
|
|
@@ -2346,8 +2530,8 @@ channel.addListener('message', async (event) => {
|
|
|
2346
2530
|
const systemPrompt = loadSystemPrompt();
|
|
2347
2531
|
const model = getModel('anthropic', 'claude-sonnet-4-5');
|
|
2348
2532
|
|
|
2349
|
-
const localTools = buildAgentTools();
|
|
2350
|
-
const mcpTools = await discoverMcpTools();
|
|
2533
|
+
const localTools = wrapToolsWithPreExecuteHook(buildAgentTools());
|
|
2534
|
+
const mcpTools = wrapToolsWithPreExecuteHook(await discoverMcpTools());
|
|
2351
2535
|
const tools = [...localTools, ...mcpTools];
|
|
2352
2536
|
|
|
2353
2537
|
const agent = new Agent({
|
|
@@ -2451,6 +2635,23 @@ initWorkerDb(OPENCLAW_ROOT).then(() => {
|
|
|
2451
2635
|
});
|
|
2452
2636
|
console.error(`[DEBUG] worker.ready SENT. Node=${process.version} root=${OPENCLAW_ROOT}`);
|
|
2453
2637
|
|
|
2638
|
+
initHeartbeat({
|
|
2639
|
+
channel,
|
|
2640
|
+
buildAutoApproveTools,
|
|
2641
|
+
discoverMcpTools,
|
|
2642
|
+
getCurrentAgent,
|
|
2643
|
+
getCurrentSessionKey,
|
|
2644
|
+
isUserTurnActive,
|
|
2645
|
+
resolveApiKey,
|
|
2646
|
+
loadAuthProfiles,
|
|
2647
|
+
loadSystemPrompt,
|
|
2648
|
+
getModel,
|
|
2649
|
+
refreshOAuthTokenIfNeeded,
|
|
2650
|
+
Agent,
|
|
2651
|
+
OPENCLAW_ROOT,
|
|
2652
|
+
persistCurrentSession,
|
|
2653
|
+
});
|
|
2654
|
+
|
|
2454
2655
|
// Pre-discover MCP device tools at startup (non-blocking, best-effort).
|
|
2455
2656
|
channel.send('message', { type: 'worker.loading_phase', phase: 'tools' });
|
|
2456
2657
|
discoverMcpTools().then(tools => {
|