visionclaw 0.1.111 → 0.1.113

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 (88) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/agent/backup.d.ts.map +1 -1
  3. package/dist/agent/backup.js +41 -0
  4. package/dist/agent/backup.js.map +1 -1
  5. package/dist/agent/client-factory.js +1 -74
  6. package/dist/agent/command-handlers.d.ts.map +1 -1
  7. package/dist/agent/command-handlers.js +7 -3
  8. package/dist/agent/command-handlers.js.map +1 -1
  9. package/dist/agent/loop.d.ts.map +1 -1
  10. package/dist/agent/loop.js +16 -1
  11. package/dist/agent/loop.js.map +1 -1
  12. package/dist/agent/openai-file-session.js +1 -78
  13. package/dist/agent/openai-session.js +1 -413
  14. package/dist/agent/openai-tools.js +1 -167
  15. package/dist/agent/providers/claude/session.d.ts.map +1 -1
  16. package/dist/agent/providers/claude/session.js +17 -0
  17. package/dist/agent/providers/claude/session.js.map +1 -1
  18. package/dist/agent/runtime-surface.d.ts.map +1 -1
  19. package/dist/agent/runtime-surface.js +17 -3
  20. package/dist/agent/runtime-surface.js.map +1 -1
  21. package/dist/agent/session-trimmer.d.ts +34 -0
  22. package/dist/agent/session-trimmer.d.ts.map +1 -0
  23. package/dist/agent/session-trimmer.js +101 -0
  24. package/dist/agent/session-trimmer.js.map +1 -0
  25. package/dist/agent/session-types.js +1 -2
  26. package/dist/agent/session.js +1 -500
  27. package/dist/agent/state.d.ts +2 -0
  28. package/dist/agent/state.d.ts.map +1 -1
  29. package/dist/agent/state.js +14 -0
  30. package/dist/agent/state.js.map +1 -1
  31. package/dist/agent/system-prompt.d.ts.map +1 -1
  32. package/dist/agent/system-prompt.js +5 -3
  33. package/dist/agent/system-prompt.js.map +1 -1
  34. package/dist/builtin-skills/visionclaw-manual/SKILL.md +29 -5
  35. package/dist/channels/slack.js +1 -142
  36. package/dist/channels/sms.js +1 -111
  37. package/dist/channels/whatsapp.js +1 -292
  38. package/dist/config/types.d.ts +3 -0
  39. package/dist/config/types.d.ts.map +1 -1
  40. package/dist/config/types.js +3 -0
  41. package/dist/config/types.js.map +1 -1
  42. package/dist/files.js +1 -82
  43. package/dist/google/default-oauth-app.js +1 -7
  44. package/dist/index.js +36 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/memory/store.js +1 -71
  47. package/dist/onboarding/index.d.ts.map +1 -1
  48. package/dist/onboarding/index.js +55 -6
  49. package/dist/onboarding/index.js.map +1 -1
  50. package/dist/onboarding/macos-permissions.d.ts +4 -8
  51. package/dist/onboarding/macos-permissions.d.ts.map +1 -1
  52. package/dist/onboarding/macos-permissions.js +79 -28
  53. package/dist/onboarding/macos-permissions.js.map +1 -1
  54. package/dist/onboarding/prepare-mac.d.ts.map +1 -1
  55. package/dist/onboarding/prepare-mac.js +206 -70
  56. package/dist/onboarding/prepare-mac.js.map +1 -1
  57. package/dist/onboarding/provisioning-spec.d.ts +5 -0
  58. package/dist/onboarding/provisioning-spec.d.ts.map +1 -1
  59. package/dist/onboarding/provisioning-spec.js +6 -0
  60. package/dist/onboarding/provisioning-spec.js.map +1 -1
  61. package/dist/onboarding/setup-state.d.ts +1 -0
  62. package/dist/onboarding/setup-state.d.ts.map +1 -1
  63. package/dist/onboarding/setup-state.js +1 -0
  64. package/dist/onboarding/setup-state.js.map +1 -1
  65. package/dist/restore.d.ts.map +1 -1
  66. package/dist/restore.js +26 -0
  67. package/dist/restore.js.map +1 -1
  68. package/dist/service/launchd.d.ts +11 -0
  69. package/dist/service/launchd.d.ts.map +1 -0
  70. package/dist/service/launchd.js +344 -0
  71. package/dist/service/launchd.js.map +1 -0
  72. package/dist/tools/browser.js +1 -108
  73. package/dist/tools/helpers/macos-screenshot.swift +74 -0
  74. package/dist/tools/screenshot.d.ts.map +1 -1
  75. package/dist/tools/screenshot.js +55 -2
  76. package/dist/tools/screenshot.js.map +1 -1
  77. package/dist/tools/sleep-interval.js +1 -25
  78. package/dist/tools/upgrade.d.ts.map +1 -1
  79. package/dist/tools/upgrade.js +2 -1
  80. package/dist/tools/upgrade.js.map +1 -1
  81. package/dist/tools/version-check.js +1 -164
  82. package/dist/tools/web-search.js +1 -2
  83. package/dist/utils/backup-paths.js +1 -14
  84. package/dist/utils/restart.d.ts +3 -1
  85. package/dist/utils/restart.d.ts.map +1 -1
  86. package/dist/utils/restart.js +43 -26
  87. package/dist/utils/restart.js.map +1 -1
  88. package/package.json +5 -3
@@ -1,500 +1 @@
1
- import { query, } from "@anthropic-ai/claude-agent-sdk";
2
- import { loadSessionId, saveSessionId, loadUsageSnapshot, saveUsageSnapshot, getConfigDir } from "../config/index.js";
3
- import { logger } from "../logger.js";
4
- import { buildAgentEnv, getModelId } from "./client-factory.js";
5
- import { getAgentState } from "./state.js";
6
- import { createRequire } from "module";
7
- import path from "path";
8
- import fs from "fs";
9
- import { ensureBrowser } from "./browser-launcher.js";
10
- import * as imagePrunerUnTyped from "./image-pruner.js";
11
- const imagePruner = imagePrunerUnTyped;
12
- export const COMPACT_USED_PCT_THRESHOLD = 0.5;
13
- export const MAX_BASE64_IMAGE_BLOCKS = 10;
14
- export class AgentSession {
15
- config;
16
- buildSystemPrompt;
17
- /** Static MCP servers (playwright, serpapi, etc.) shared across calls. */
18
- staticMcpServers;
19
- /** Dynamic MCP servers added at runtime via manage_mcp_servers tool. */
20
- dynamicMcpServers;
21
- /** Factory that produces a fresh visionclaw MCP server per query() call. */
22
- toolServerFactory;
23
- currentQuery = null;
24
- sessionId;
25
- transcriptPath = null;
26
- mode;
27
- /**
28
- * Pending message queue for the long-lived generator.
29
- * When a message is injected, it's pushed here and the waiting
30
- * generator is woken up via the resolver.
31
- */
32
- pendingMessages = [];
33
- messageResolver = null;
34
- generatorClosed = true;
35
- _orphanedInjections = 0;
36
- lastCompactRequestAtMs = 0;
37
- compactInFlight = false;
38
- stopRequested = false;
39
- /** Optional: auto-injects screenshots after Playwright tool calls. */
40
- _screenshotInjector = null;
41
- /** AbortController passed to the SDK; aborting it cleanly stops the running query. */
42
- abortController = null;
43
- lastUsageSnapshot = null;
44
- constructor(config, buildSystemPrompt, staticMcpServers, toolServerFactory, mode = "general") {
45
- this.config = config;
46
- this.buildSystemPrompt = buildSystemPrompt;
47
- this.staticMcpServers = staticMcpServers;
48
- this.dynamicMcpServers = {};
49
- this.toolServerFactory = toolServerFactory;
50
- this.mode = mode;
51
- this.sessionId = loadSessionId(mode);
52
- const persisted = loadUsageSnapshot(mode);
53
- if (persisted && this.sessionId) {
54
- this.lastUsageSnapshot = { ...persisted, capturedAtMs: Date.now() };
55
- }
56
- }
57
- set screenshotInjector(injector) {
58
- this._screenshotInjector = injector;
59
- }
60
- /**
61
- * Build a fresh mcpServers record with a new visionclaw tool server instance.
62
- * This avoids the "Already connected to a transport" error when the same
63
- * McpServer instance is reused across concurrent/sequential query() calls.
64
- */
65
- buildMcpServers() {
66
- return {
67
- ...this.staticMcpServers,
68
- ...this.dynamicMcpServers,
69
- visionclaw: this.toolServerFactory(),
70
- };
71
- }
72
- /**
73
- * Send the initial user message and return the query generator to stream
74
- * responses. The underlying async generator stays open so that additional
75
- * messages can be injected via injectMessage().
76
- */
77
- sendAndStream(content) {
78
- const savedSessionId = this.sessionId;
79
- // Resolve the SDK's cli.js path so it works both in dev and bundled mode
80
- const _require = createRequire(import.meta.url);
81
- const sdkCliPath = path.resolve(path.dirname(_require.resolve("@anthropic-ai/claude-agent-sdk")), "cli.js");
82
- const options = {
83
- model: getModelId(this.config),
84
- pathToClaudeCodeExecutable: sdkCliPath,
85
- systemPrompt: this.buildSystemPrompt(),
86
- permissionMode: "bypassPermissions",
87
- allowDangerouslySkipPermissions: true,
88
- cwd: getConfigDir(),
89
- settingSources: ["project"],
90
- mcpServers: this.buildMcpServers(),
91
- hooks: {
92
- UserPromptSubmit: [
93
- {
94
- hooks: [
95
- (async (input, _toolUseID, { signal }) => {
96
- const up = input;
97
- try {
98
- this.captureTranscriptPath(up.transcript_path);
99
- if (signal.aborted)
100
- return {};
101
- // Prune aggressively throughout the session to prevent
102
- // context bloat from accumulated base64 screenshots.
103
- await imagePruner.pruneSessionImages({
104
- transcriptPath: up.transcript_path,
105
- keepLastNBase64Images: MAX_BASE64_IMAGE_BLOCKS,
106
- });
107
- }
108
- catch (err) {
109
- logger.warn(`UserPromptSubmit image pruning failed: ${err instanceof Error ? err.message : String(err)}`);
110
- }
111
- return {};
112
- }),
113
- ],
114
- timeout: 120,
115
- },
116
- ],
117
- PreCompact: [
118
- {
119
- hooks: [
120
- (async (input, _toolUseID, { signal }) => {
121
- const pre = input;
122
- try {
123
- this.captureTranscriptPath(pre.transcript_path);
124
- // Best-effort pruning: keep only the last 10 base64 image blocks
125
- // so compaction does not have to carry large screenshots forward.
126
- // Abort early if hook is cancelled.
127
- if (signal.aborted)
128
- return {};
129
- const res = await imagePruner.pruneSessionImages({
130
- transcriptPath: pre.transcript_path,
131
- keepLastNBase64Images: MAX_BASE64_IMAGE_BLOCKS,
132
- });
133
- if (res.fileChanged) {
134
- logger.system(`Pruned transcript images before compaction: pruned=${res.prunedImageBlocks} resized=${res.resizedImageBlocks} kept=${res.keptImageBlocks} total=${res.totalImageBlocks}`);
135
- }
136
- }
137
- catch (err) {
138
- logger.warn(`PreCompact image pruning failed: ${err instanceof Error ? err.message : String(err)}`);
139
- }
140
- return {};
141
- }),
142
- ],
143
- timeout: 120,
144
- },
145
- ],
146
- PreToolUse: [
147
- {
148
- matcher: "mcp__playwright__.*",
149
- hooks: [
150
- (async (_input) => {
151
- const pre = _input;
152
- logger.debug(`[PreToolUse] ensuring browser for ${pre.tool_name}`);
153
- await ensureBrowser();
154
- return {};
155
- }),
156
- ],
157
- timeout: 30,
158
- },
159
- ],
160
- PostToolUse: [
161
- {
162
- hooks: [
163
- (async (input, _toolUseID) => {
164
- const post = input;
165
- try {
166
- const { resizedCount } = await imagePruner.resizeOversizedImagesInToolOutput(post.tool_response);
167
- if (resizedCount > 0) {
168
- logger.debug(`[PostToolUse] resized ${resizedCount} oversized image(s) in ${post.tool_name} output`);
169
- return {
170
- hookSpecificOutput: {
171
- hookEventName: "PostToolUse",
172
- updatedMCPToolOutput: post.tool_response,
173
- },
174
- };
175
- }
176
- }
177
- catch (err) {
178
- logger.warn(`PostToolUse image resize failed: ${err instanceof Error ? err.message : String(err)}`);
179
- }
180
- if (this._screenshotInjector) {
181
- try {
182
- await this._screenshotInjector.onToolComplete(post.tool_name, this);
183
- }
184
- catch (err) {
185
- logger.warn(`PostToolUse screenshot injection failed: ${err instanceof Error ? err.message : String(err)}`);
186
- }
187
- }
188
- return {};
189
- }),
190
- ],
191
- timeout: 120,
192
- },
193
- ],
194
- },
195
- env: buildAgentEnv(this.config),
196
- ...(savedSessionId ? { resume: savedSessionId } : {}),
197
- };
198
- // Seed the generator with the initial message
199
- const initialMessage = {
200
- type: "user",
201
- session_id: savedSessionId ?? "",
202
- message: { role: "user", content },
203
- parent_tool_use_id: null,
204
- };
205
- this.pendingMessages = [initialMessage];
206
- this.generatorClosed = false;
207
- this._orphanedInjections = 0;
208
- const abortController = new AbortController();
209
- this.abortController = abortController;
210
- // Create a long-lived async generator that yields the initial message
211
- // and then waits for additional messages injected via injectMessage().
212
- // We capture references to the session's pending queue and resolver
213
- // so the generator can read from them without aliasing `this`.
214
- const pending = this.pendingMessages;
215
- const setResolver = (r) => {
216
- this.messageResolver = r;
217
- };
218
- const isClosed = () => this.generatorClosed;
219
- const shiftPending = () => pending.shift();
220
- async function* messageStream() {
221
- while (!isClosed()) {
222
- // Yield all pending messages
223
- let next = shiftPending();
224
- while (next) {
225
- yield next;
226
- next = shiftPending();
227
- }
228
- // If generator is still open, wait for the next message
229
- if (!isClosed()) {
230
- await new Promise((resolve) => {
231
- setResolver(resolve);
232
- });
233
- }
234
- }
235
- }
236
- if (savedSessionId) {
237
- logger.system(`Resuming session: ${savedSessionId}`);
238
- }
239
- else {
240
- logger.system("Creating new session...");
241
- }
242
- this.currentQuery = query({
243
- prompt: messageStream(),
244
- options: {
245
- ...options,
246
- abortController,
247
- ...(this.config.provider === "bedrock" ? { betas: ["context-1m-2025-08-07"] } : {}),
248
- },
249
- });
250
- return this.currentQuery;
251
- }
252
- /**
253
- * Inject a new user message into the running query stream.
254
- * The agent will see this as a follow-up user message in the conversation.
255
- * Only works while a query is active (between sendAndStream and closeInput).
256
- *
257
- * @returns true if the message was injected, false if the generator is closed.
258
- */
259
- injectMessage(content) {
260
- const msg = {
261
- type: "user",
262
- session_id: this.sessionId ?? "",
263
- message: { role: "user", content },
264
- parent_tool_use_id: null,
265
- };
266
- if (this.generatorClosed) {
267
- logger.warn("Cannot inject message: generator is closed");
268
- return false;
269
- }
270
- this.pendingMessages.push(msg);
271
- logger.info("Injected interrupt message into active session");
272
- // Wake the generator if it's waiting
273
- if (this.messageResolver) {
274
- this.messageResolver();
275
- this.messageResolver = null;
276
- }
277
- return true;
278
- }
279
- /**
280
- * Signal the input generator to close.
281
- * Any injected messages still in the pending queue are counted as
282
- * orphaned — they were accepted by injectMessage but never delivered
283
- * to the SDK.
284
- */
285
- closeInput() {
286
- this._orphanedInjections = this.pendingMessages.length;
287
- if (this._orphanedInjections > 0) {
288
- logger.warn(`closeInput: ${this._orphanedInjections} injected message(s) orphaned`);
289
- }
290
- this.pendingMessages = [];
291
- this.generatorClosed = true;
292
- if (this.messageResolver) {
293
- this.messageResolver();
294
- this.messageResolver = null;
295
- }
296
- }
297
- /**
298
- * Returns true if injected messages were lost when the generator closed.
299
- */
300
- get hasOrphanedInjections() {
301
- return this._orphanedInjections > 0;
302
- }
303
- get isInputClosed() {
304
- return this.generatorClosed;
305
- }
306
- /**
307
- * Request that the current agent turn be stopped.
308
- * Uses the SDK's AbortController to cleanly signal the running query to
309
- * stop, then closes the input stream so the loop returns to idle.
310
- */
311
- requestStop() {
312
- this.stopRequested = true;
313
- if (this.abortController) {
314
- this.abortController.abort();
315
- logger.system("Stop requested — aborting query via AbortController");
316
- }
317
- this.closeInput();
318
- }
319
- isStopRequested() {
320
- return this.stopRequested;
321
- }
322
- clearStop() {
323
- this.stopRequested = false;
324
- this.abortController = null;
325
- }
326
- /**
327
- * Update the persisted session ID.
328
- */
329
- captureSessionId(id) {
330
- if (id) {
331
- this.sessionId = id;
332
- saveSessionId(id, this.mode);
333
- }
334
- }
335
- captureTranscriptPath(p) {
336
- if (p && typeof p === "string") {
337
- this.transcriptPath = p;
338
- }
339
- }
340
- getSessionId() {
341
- return this.sessionId;
342
- }
343
- /**
344
- * Proactively request compaction by running the /compact slash command as a
345
- * separate one-turn query resumed from the current session.
346
- *
347
- * This is more reliable than injecting "/compact" into the streaming prompt
348
- * because the running query may treat it as ordinary text.
349
- */
350
- async requestCompaction() {
351
- if (this.compactInFlight)
352
- return;
353
- this.compactInFlight = true;
354
- // TODO: maybe should use reply map.
355
- const sendCompactNotice = (text) => {
356
- try {
357
- const state = getAgentState();
358
- const { ownerConfig, channelManager } = state;
359
- const channel = ownerConfig.telegramChatId ? "telegram" : ownerConfig.ownerEmail ? "gmail" : undefined;
360
- const recipient = ownerConfig.telegramChatId ? String(ownerConfig.telegramChatId) : ownerConfig.ownerEmail;
361
- if (channel && recipient) {
362
- channelManager
363
- .sendMessage(channel, recipient, text)
364
- .catch((err) => {
365
- logger.warn(`Failed to send compaction notification: ${err instanceof Error ? err.message : String(err)}`);
366
- });
367
- }
368
- }
369
- catch {
370
- // Agent state not yet initialized — skip notification
371
- }
372
- };
373
- try {
374
- const savedSessionId = this.sessionId;
375
- if (!savedSessionId) {
376
- logger.warn("Cannot request /compact: session_id not available yet");
377
- return;
378
- }
379
- // Resolve the SDK's cli.js path so it works both in dev and bundled mode
380
- const _require = createRequire(import.meta.url);
381
- const sdkCliPath = path.resolve(path.dirname(_require.resolve("@anthropic-ai/claude-agent-sdk")), "cli.js");
382
- if (!fs.existsSync(sdkCliPath)) {
383
- logger.warn(`Cannot request /compact: sdk cli.js not found at ${sdkCliPath}`);
384
- return;
385
- }
386
- const options = {
387
- model: getModelId(this.config),
388
- pathToClaudeCodeExecutable: sdkCliPath,
389
- systemPrompt: this.buildSystemPrompt(),
390
- permissionMode: "bypassPermissions",
391
- allowDangerouslySkipPermissions: true,
392
- cwd: getConfigDir(),
393
- settingSources: ["project"],
394
- mcpServers: this.buildMcpServers(),
395
- env: buildAgentEnv(this.config),
396
- resume: savedSessionId,
397
- maxTurns: 1,
398
- };
399
- logger.system("Requesting /compact...");
400
- sendCompactNotice("Context window is getting full — compacting session memory, this may take a minute. I may lose some older details.");
401
- logger.debug(`Compaction query options: cli=${sdkCliPath} cwd=${getConfigDir()} resume=${savedSessionId}`);
402
- for await (const msg of query({
403
- prompt: "/compact",
404
- options,
405
- })) {
406
- if (msg.type === "system" && msg.subtype === "compact_boundary") {
407
- // Capture session id (should remain the same) and log compaction metadata.
408
- if ("session_id" in msg && msg.session_id) {
409
- this.captureSessionId(msg.session_id);
410
- }
411
- const meta = msg.compact_metadata;
412
- logger.system(`Compaction completed (trigger=${meta?.trigger ?? "unknown"}, pre_tokens=${meta?.pre_tokens ?? "?"})`);
413
- if (typeof meta?.pre_tokens === "number") {
414
- this.capturePostCompactionSnapshot(meta.pre_tokens);
415
- }
416
- sendCompactNotice("Session memory compacted. Ready to continue.");
417
- }
418
- }
419
- }
420
- catch (err) {
421
- logger.warn(`Request /compact failed: ${err instanceof Error ? err.message : String(err)}`);
422
- }
423
- finally {
424
- this.compactInFlight = false;
425
- }
426
- }
427
- captureUsageSnapshot(snapshot) {
428
- this.lastUsageSnapshot = {
429
- ...snapshot,
430
- capturedAtMs: Date.now(),
431
- };
432
- saveUsageSnapshot(snapshot, this.mode);
433
- }
434
- /**
435
- * Update the usage snapshot after the SDK performs mid-query auto-compaction.
436
- * Uses `pre_tokens` (the post-compaction token count) and the last known
437
- * context window to compute an accurate `usedPct`, preventing the post-query
438
- * `maybeCompactByTokens` from triggering a redundant compaction.
439
- */
440
- capturePostCompactionSnapshot(postCompactionTokens) {
441
- const contextWindow = this.lastUsageSnapshot?.contextWindow ?? 0;
442
- if (contextWindow <= 0 || postCompactionTokens < 0) {
443
- this.lastUsageSnapshot = null;
444
- return;
445
- }
446
- this.captureUsageSnapshot({
447
- usedInputTokens: postCompactionTokens,
448
- contextWindow,
449
- usedPct: postCompactionTokens / contextWindow,
450
- });
451
- }
452
- async maybeCompactByTokens(options) {
453
- const usedPctThreshold = options?.usedPctThreshold ?? COMPACT_USED_PCT_THRESHOLD;
454
- const cooldownMs = options?.cooldownMs ?? 10 * 60 * 1000;
455
- const snap = this.lastUsageSnapshot;
456
- if (!snap) {
457
- logger.debug("[compact] skip: no usage snapshot yet");
458
- return;
459
- }
460
- const nowMs = Date.now();
461
- const sinceLastCompactMs = nowMs - this.lastCompactRequestAtMs;
462
- if (sinceLastCompactMs <= cooldownMs) {
463
- logger.debug(`[compact] skip: cooldown active sinceLast=${sinceLastCompactMs}ms cooldown=${cooldownMs}ms (usedPct=${(snap.usedPct * 100).toFixed(1)}%)`);
464
- return;
465
- }
466
- if (this.compactInFlight) {
467
- logger.debug("[compact] skip: compaction already in flight");
468
- return;
469
- }
470
- const snapshotAgeMs = nowMs - snap.capturedAtMs;
471
- logger.debug(`[compact] check: usedPct=${(snap.usedPct * 100).toFixed(1)}% threshold=${(usedPctThreshold * 100).toFixed(1)}% used=${snap.usedInputTokens} window=${snap.contextWindow} snapshotAge=${snapshotAgeMs}ms`);
472
- if (snap.contextWindow > 0 && snap.usedPct >= usedPctThreshold) {
473
- this.lastCompactRequestAtMs = nowMs;
474
- logger.system(`Context usage ${(snap.usedPct * 100).toFixed(1)}% (used=${snap.usedInputTokens}, window=${snap.contextWindow}); requesting /compact`);
475
- await this.requestCompaction();
476
- }
477
- else {
478
- logger.debug(`[compact] skip: under threshold (usedPct=${(snap.usedPct * 100).toFixed(1)}% threshold=${(usedPctThreshold * 100).toFixed(1)}%)`);
479
- }
480
- }
481
- getTranscriptPath() {
482
- return this.transcriptPath;
483
- }
484
- getUsageSnapshot() {
485
- return this.lastUsageSnapshot ? { ...this.lastUsageSnapshot } : null;
486
- }
487
- /** Returns the live Query object, or null if no query is active. */
488
- getCurrentQuery() {
489
- return this.currentQuery;
490
- }
491
- /** Replace the full set of dynamic MCP servers (used when loading from disk). */
492
- setDynamicMcpServers(servers) {
493
- this.dynamicMcpServers = { ...servers };
494
- }
495
- /** Get the current dynamic MCP servers record. */
496
- getDynamicMcpServers() {
497
- return { ...this.dynamicMcpServers };
498
- }
499
- }
500
- //# sourceMappingURL=session.js.map
1
+ const a27_0x4cddb4=a27_0x5f27;(function(_0x5df700,_0x3cd134){const _0x3afa52=a27_0x5f27,_0xe05608=_0x5df700();while(!![]){try{const _0x3e68d7=-parseInt(_0x3afa52(0xf3))/0x1+parseInt(_0x3afa52(0x104))/0x2*(parseInt(_0x3afa52(0x13e))/0x3)+-parseInt(_0x3afa52(0x10a))/0x4+-parseInt(_0x3afa52(0xfe))/0x5*(-parseInt(_0x3afa52(0x115))/0x6)+parseInt(_0x3afa52(0x124))/0x7+-parseInt(_0x3afa52(0xb9))/0x8*(parseInt(_0x3afa52(0xf1))/0x9)+-parseInt(_0x3afa52(0xb5))/0xa*(-parseInt(_0x3afa52(0x122))/0xb);if(_0x3e68d7===_0x3cd134)break;else _0xe05608['push'](_0xe05608['shift']());}catch(_0x5d5b98){_0xe05608['push'](_0xe05608['shift']());}}}(a27_0x3e73,0x5b4ab));function a27_0x3e73(){const _0x36824a=['EtjMv0rODLL6DNzAExDethuYnuHdAg5pqJnX','q0jAAffU','y29UzMLN','CMvXDwvZDenVBxbHy3rPB24','uMvXDwvZDcaVy29TCgfJDcbMywLSzwq6ia','AwHYvKrNzLnWCq','qJi1DuiYovnXmJLuq2DyterNDq','rgHQsejoBKPdtuXxrgy5v3L4CK8','q012wKf4ueX6zuXuExDethfnwfz5mLrA','qMDMwKrLBLzcEgjiEtnYC3P4zJf6Eg4WCxHYBKnx','EJj2mhz4BKH6mNz0qK1Mv0mYsfzeyq','qND2wKmYzK56DMPmqZi5u0rnDLK','qZnmwKrNDLq','Eu52uejNCNrfEg4WENCXCunnovrdAhe','w1bYzvrVB2XvC2vDigvUC3vYAw5NigjYB3DZzxiGzM9Yia','Eti5venNzKPezJLjqJn2vxPNzLLfCq','y29UDgv4DfDPBMrVDW','C2vZC2LVBKLK','C3C1uxP3BJb6D3fhqxC1mhP4ALLeEgiWAwCXtemZBKH6mNvhqxC1mejzyKH5m3jqre11r0mYDLPdmKXwqKC','rdjMwujh','Eti5vurNDJreyZbyqNmWww1KAtfSDge0BhrHmW','EtjyvKmYDMPctMiXrge','mtbet2jNv3O','zNjVBunOyxjdB2rL','qZj2wKmYtfzcs0Xl','Eu5mv3L4BLP1z3zzqNDmwKmYtfzctM0','ogXdy0rsBa','yMvKCM9JAW','Du12wer3DLPez0XvELLHvNKYovrdz2zkrgm0vwXh','qZn2surOtfD6Cq','yNLWyxnZugvYBwLZC2LVBNm','qgfUDgHYB3bPyY1HAs9JBgf1zguTywDLBNqTC2rR','zgvIDwC','yNvPBgrtExn0zw1qCM9TChq','DZjUvKj4yKH5m3jeAwDUt3P3BLjVswiXqZj2s3vNBJbWCq','BKPPmM1nBMneDuGYqLC','AwHUvxL4yLPbzZKWCxDethbX','DwHQmujnDKTPAhjzExC1wNKZALbdAhfhqxCXshOYDLPPz2PmEK05wxPZyKPcmJfxExDUmef3ovvVswjxq052vxP3CtK','BwvZC2fNzq','DwC5wKrMCLzcmLH2qZj1r0f3muH6mNvhq012wKf4ueXPz3PiqxDythPKt0C','BgnIv0nnDKzezZLsENC1wNbX','BgvUz3rO','BgfZDenVBxbHy3rszxf1zxn0qxrnCW','qwDMwNqZALDbz2zvENDYAKjnueX5m3jqqJi1wG','y3vYCMvUDff1zxj5','Bxrdwg0Yvgv3zZfvELC','rhHUtenh','Edi5wunNseHctxzlC3C1uxP3BJbbDZLvq1C','zgLYBMfTzq','qJnevxP4AMzcD2zqqMe','y2HHCKf0','AwHeuejnCLzewJa','C3rVCfjLCxvLC3rLza','y2fWDhvYzvvZywDLu25HChnOB3q','y2XVC2vjBNb1Da','AwHQtemZDLr6Dda','qK05mW','EK1mu3P1BK95DZvoENDX','rhHUthPMyKPeyq','q2HQmujnDKTZDZfiEJj2y0jNouPbm20','BKPHmw4XseXZztvMqxe','Eti5vxPnte4','ywjVCNrLza','qNDMnxLnDMrcmJfxExDUmhfothvcmLrmqK5T','q2HQvKfnDKPeyq','DxnLCG','qZnYvKnMAKXdEhzmqZnYthPH','BxmGy29VBgrVD249','Aw5KzxHpzG','qZj2vxPLmuXdm25iEJj1','ENHiuemZCLP1m0XvEvC','Du12wKr3mvbctunhqZj2wKmYtfzcsK9h','CwDMvurNsfLcm2jqEvKXsefZouPcz2yXEMD1vhL3reXctNfuqZjYuG','ANnImumYDKTWCq','Cti5venNzKPez0XwqKLIwer3DLLfC2jwq2HYueiYnvPVswjkqMDloq','Eti5venNzKPezuXvCK1yuhOYsda','y29TCgfJDeLUrMXPz2H0','CtjMvujnotbPAgPmq3H2temZCuDSmM5wqNHIshKZCtzPAg5lqvLIsKjNs1vbtM1hqK05mgLNELzeDZvlAwDMmgLH','A3fvt09c','Dg9gAxHLza','vxnLCLbYB21WDfn1yM1PDcbPBwfNzsbWCNvUAw5NigzHAwXLzdOG','BLPlww1Kq1PVzvHSDhzmuNrh','ndiXotq5n0nVq3HJsW','z2vUzxjHDg9Yq2XVC2vK','mZy5nJu1AeHyBK9S','B3r1wg10yvDYzuW2DNzQsa','q2H2wKfH','q2HQthGZCLzbmNzvq1C','EJj2vxP4AKHcyq','EdnUsKnnDKXctM5pqJnYAKjnueX5m3jwq0C','Eti5venNzKPezJLuENHYshPNzJb5Cq','EMHmvxL3mvb5mdfkq2zUtenoEKXdtM0','qZnYserNteP0D25xDtj2wurnDLLdvW','DhjHBNnJCMLWDf9WyxrO','igTLChq9','nuDZswLNrG','C2nYzwvUC2HVDeLUAMvJDg9Y','qMD2vxOZCK8','EtjythL4ANrezZLx','rgHQuhOYreXdrW','Dg9VBf9YzxnWB25Zzq','mtKWufnhv29l','DZjUvKj4yKH5m3jeAwHUuKf4ytzPz25wqNHIshKZCLbcmJrhExDywxP3zKTfC2jqqKLItujNte5bAhe','DhjHBNnJCMLWDfbHDgG','C2HPzNq','AwDUm3PKma','DxnLzeLUChv0vg9Rzw5Z','mtC0mZi4zxbrtfzd','x29YCgHHBMvKsw5Qzwn0Aw9UCW','DgvSzwDYyw0','BM93','Bxrdmg90ELP0teX0qxD1','EtjMv0rODLL6DMjwqZnYzeiYmvD5D24WqxC5vxuYnuHdAg5pqJnX','qMDMwKrMDLP5D0rmDti1senOBK9cm3e','C2XPy2u','ANnHt0r4BKX6zda','BuPICxfnve95tMu','AwHQtemYtdz6D3e5','mZe0mZy0CwXAq1jy','DwC5wKrMCLzcmLH2qZj1','DwHQtheYovrdz2zkrgnIuej3zK56C2jxq052vuf3nu5Pz3PiqxDythPKt0C','BNvTyMvY','rgD2u3P3rfL5DZfKqwDMmhn3Cq','Eti5vurNDJrezKrqqK1YvKrx','EtjyvKmYDMPctMiXrgrprW','q2HQmujnDNr6Eg5AqxC5vxn3muH6mNzA','qNHTr2TODLP6D3jXEtnXoq','EJj2mhzOAKHctM5kq01mv0rMyKHez0C','rhHUthPMyKPezNjpq012wKfNovn6yq','BdjUvKj4yKH5m3e','qxHUDerNovD1txzyrhD2wKrNDKS','ndyWnZyXne5my1nSzq','q3j1sfbq','mZy3odm0nLHMshblEa','qND2wKmYzK56Cq','EJj2mhuYDLPdmKXwqKTmsW','DZjUvKj4yKH5m3jeAwHUuKf4ytzPz25wqJjys0iZrfvPz2zkrgDmmNPZyLPbDZvkENvysemZCtK','Aw5Qzwn0twvZC2fNzq','qZnYwuf3nu4','rgHmv3PX','AwDmvufnDKPez3zlAwCXtemZBKH6mNvpq1Llr0iZALDbz2zvENDX','CgvUzgLUz01LC3nHz2vZ','ig91Dhb1Da','BwvZC2fNzvjLC29SDMvY','BLPhwM1KytbTtLb2DtfeCxPH','BxrPv25kBvDTsKX2Dgv6seqYBq','EtjMv0rODLL6D3jIrguXwG','q3jLyxrPBMCGBMv3ihnLC3nPB24UlI4','CMvZB2X2zq','EtjMv0rODLL6DM5mqZnUueiYnwP6yq','AwC5mNP4ALPbEfbmEMnIuej3zK56C0HAA3nIuejjyq','Cti5vurNDJrey2iZqxC1s0iZq0DbEg1hEJj2merNtfv6wwjnrhDyu2LVA2fmy2jkqJiXv3L3BJbbDZvoAwHUtemZBLbcmJrhqND2veiZAJvSy2iWqwDmwMLNmuHfC2iWExDutgLNzuDcD0XvrhHYtgXjyMPPzZfirxnIu0iZBKXPAg5wqND1r0iYweT6EgLhEMD2mhL3tfndwtq','qNDUv3GXovDcz2y1rdnQuhOYsdb4mtHvA0C','C3LZDgvT','Cti5vurNDJrey2iXqZjMtNPZyq','u2vZC2LVBIbTzw1VCNKGy29TCgfJDgvKlIbszwfKEsb0BYbJB250Aw51zs4','EMDmwujnzLr6Cq','rgC5vKjMovL6Eg5xqJi1wNPX','A3rtr0nnDLHeD3zArgDmvxPzyvz5mJLuq2DMsKrH','ode4n0XYs3rhyq','q012wer3DLPezM4WqJnH','CtjMvujnotbPAgPmq3H2temZCuDSmM5wqNHIshKZCtzPAg5mqZnUueiYnuzbD3fhqK05mgLNzJj5D0XtExDQu3PZyJv6Ehe','Etn2wunnDLvezMyXENHQnq','rgHQsejoBKPdtuXxrgzIserNrW','q012wKiYwdj6Cq','ywjVCNrdB250CM9SBgvY'];a27_0x3e73=function(){return _0x36824a;};return a27_0x3e73();}function a27_0x5f27(_0x495396,_0x83482d){_0x495396=_0x495396-0xa5;const _0x3e731c=a27_0x3e73();let _0x5f278d=_0x3e731c[_0x495396];if(a27_0x5f27['VdclmK']===undefined){var _0x14b6ed=function(_0x3a90ee){const _0x152fdf='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5d8308='',_0x5504bb='';for(let _0x2dfbea=0x0,_0x2eb6bf,_0x4f200b,_0x124453=0x0;_0x4f200b=_0x3a90ee['charAt'](_0x124453++);~_0x4f200b&&(_0x2eb6bf=_0x2dfbea%0x4?_0x2eb6bf*0x40+_0x4f200b:_0x4f200b,_0x2dfbea++%0x4)?_0x5d8308+=String['fromCharCode'](0xff&_0x2eb6bf>>(-0x2*_0x2dfbea&0x6)):0x0){_0x4f200b=_0x152fdf['indexOf'](_0x4f200b);}for(let _0x24851d=0x0,_0x4b620f=_0x5d8308['length'];_0x24851d<_0x4b620f;_0x24851d++){_0x5504bb+='%'+('00'+_0x5d8308['charCodeAt'](_0x24851d)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5504bb);};a27_0x5f27['yXhBBy']=_0x14b6ed,a27_0x5f27['WFJdvo']={},a27_0x5f27['VdclmK']=!![];}const _0x3daaca=_0x3e731c[0x0],_0x43bb9d=_0x495396+_0x3daaca,_0x59884e=a27_0x5f27['WFJdvo'][_0x43bb9d];return!_0x59884e?(_0x5f278d=a27_0x5f27['yXhBBy'](_0x5f278d),a27_0x5f27['WFJdvo'][_0x43bb9d]=_0x5f278d):_0x5f278d=_0x59884e,_0x5f278d;}const a27_0x2e7a85=a27_0x51ce;(function(_0x2eb6bf,_0x4f200b){const _0x42fb45=a27_0x5f27,_0x124453=a27_0x51ce,_0x24851d=_0x2eb6bf();while(!![]){try{const _0x4b620f=parseInt(_0x124453(0x11f))/0x1+parseInt(_0x124453(0x138))/0x2*(-parseInt(_0x124453(0x109))/0x3)+-parseInt(_0x124453(0xda))/0x4*(parseInt(_0x124453(0x15d))/0x5)+parseInt(_0x124453(0xfe))/0x6+-parseInt(_0x124453(0x120))/0x7+-parseInt(_0x124453(0x11d))/0x8*(parseInt(_0x124453(0x10a))/0x9)+-parseInt(_0x124453(0x103))/0xa*(-parseInt(_0x124453(0xe4))/0xb);if(_0x4b620f===_0x4f200b)break;else _0x24851d['push'](_0x24851d[_0x42fb45(0x107)]());}catch(_0x15b115){_0x24851d['push'](_0x24851d[_0x42fb45(0x107)]());}}}(a27_0x17a6,0xe21f8));import{query}from'@anthropic-ai/claude-agent-sdk';import{loadSessionId,saveSessionId,loadUsageSnapshot,saveUsageSnapshot,getConfigDir}from'../config/index.js';import{logger}from'../logger.js';import{buildAgentEnv,getModelId}from'./client-factory.js';import{getAgentState}from'./state.js';import{createRequire}from'module';import a27_0x5d8308 from'path';import a27_0x5504bb from'fs';import{ensureBrowser}from'./browser-launcher.js';import*as a27_0x2dfbea from'./image-pruner.js';const imagePruner=a27_0x2dfbea;export const COMPACT_USED_PCT_THRESHOLD=0.5;function a27_0x51ce(_0x53fb62,_0x58db7b){const _0x5970f0=a27_0x5f27;_0x53fb62=_0x53fb62-0xd8;const _0x578058=a27_0x17a6();let _0x5dd3ce=_0x578058[_0x53fb62];if(a27_0x51ce[_0x5970f0(0x146)]===undefined){var _0x5dac28=function(_0x4b5841){const _0x5b083b=_0x5970f0,_0x248e4c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1437b1='',_0x577064='';for(let _0x23de8d=0x0,_0x530d05,_0x3385a1,_0x1c1a02=0x0;_0x3385a1=_0x4b5841[_0x5b083b(0xd1)](_0x1c1a02++);~_0x3385a1&&(_0x530d05=_0x23de8d%0x4?_0x530d05*0x40+_0x3385a1:_0x3385a1,_0x23de8d++%0x4)?_0x1437b1+=String[_0x5b083b(0xb6)](0xff&_0x530d05>>(-0x2*_0x23de8d&0x6)):0x0){_0x3385a1=_0x248e4c[_0x5b083b(0xe3)](_0x3385a1);}for(let _0x454739=0x0,_0x382256=_0x1437b1[_0x5b083b(0xc8)];_0x454739<_0x382256;_0x454739++){_0x577064+='%'+('00'+_0x1437b1['charCodeAt'](_0x454739)['toString'](0x10))[_0x5b083b(0x111)](-0x2);}return decodeURIComponent(_0x577064);};a27_0x51ce[_0x5970f0(0x123)]=_0x5dac28,a27_0x51ce[_0x5970f0(0xed)]={},a27_0x51ce[_0x5970f0(0x146)]=!![];}const _0x5414d7=_0x578058[0x0],_0x1e37a0=_0x53fb62+_0x5414d7,_0x76d1d9=a27_0x51ce[_0x5970f0(0xed)][_0x1e37a0];return!_0x76d1d9?(_0x5dd3ce=a27_0x51ce[_0x5970f0(0x123)](_0x5dd3ce),a27_0x51ce[_0x5970f0(0xed)][_0x1e37a0]=_0x5dd3ce):_0x5dd3ce=_0x76d1d9,_0x5dd3ce;}export const MAX_BASE64_IMAGE_BLOCKS=0xa;function a27_0x17a6(){const _0x5084ab=a27_0x5f27,_0x290b1f=[_0x5084ab(0xdc),_0x5084ab(0xd7),'y2fWDhvYzvrYyw5Zy3jPChrqyxrO',_0x5084ab(0x126),_0x5084ab(0xbb),_0x5084ab(0x129),_0x5084ab(0xb4),'w2nVBxbHy3rDihnRAxa6ig5VihvZywDLihnUyxbZAg90ihLLDa','u3rVCcbYzxf1zxn0zwqG4OcuigfIB3j0Aw5Nihf1zxj5ihzPysbbyM9YDenVBNrYB2XSzxi','AxnjBNb1DenSB3nLza',_0x5084ab(0xf6),_0x5084ab(0xaa),_0x5084ab(0x119),'ywjVCNrdB250CM9SBgvY',_0x5084ab(0xc4),'y29VBgrVD25nCW',_0x5084ab(0x117),'z21HAwW','A2vWDeLTywDLqMXVy2TZ','z2vUzxjHDg9Yq2XVC2vK',_0x5084ab(0x12b),_0x5084ab(0x13d),_0x5084ab(0x11e),'Dw5RBM93BG','y2f0y2G',_0x5084ab(0xa6),_0x5084ab(0x13c),_0x5084ab(0xc1),_0x5084ab(0xe8),_0x5084ab(0x135),_0x5084ab(0xf4),_0x5084ab(0x101),'w2nVBxbHy3rDihnRAxa6ihvUzgvYihrOCMvZAg9SzcaODxnLzfbJDd0',_0x5084ab(0xa7),'yNvPBgrny3btzxj2zxjZ',_0x5084ab(0xf5),_0x5084ab(0x139),_0x5084ab(0x113),_0x5084ab(0xe1),_0x5084ab(0xab),_0x5084ab(0xa5),_0x5084ab(0xf7),_0x5084ab(0xfa),_0x5084ab(0x131),_0x5084ab(0x134),_0x5084ab(0xda),_0x5084ab(0xd8),_0x5084ab(0x130),'Bw9Kzq',_0x5084ab(0x127),_0x5084ab(0x102),_0x5084ab(0xc7),_0x5084ab(0xd6),_0x5084ab(0x108),'CgvUzgLUz01LC3nHz2vZ',_0x5084ab(0xb1),'w1bVC3ruB29SvxnLxsbYzxnPEMvKia',_0x5084ab(0xd2),'C2vZC2LVBL9Pza',_0x5084ab(0xea),_0x5084ab(0x145),_0x5084ab(0xde),'lcb3Aw5KB3C9',_0x5084ab(0x11d),'ug9ZDfrVB2XvC2uGC2nYzwvUC2HVDcbPBMPLy3rPB24GzMfPBgvKoIa',_0x5084ab(0x13f),_0x5084ab(0x11b),'rMfPBgvKihrVihnLBMqGy29TCgfJDgLVBIbUB3rPzMLJyxrPB246ia',_0x5084ab(0xc3),'ywjVCNq',_0x5084ab(0x116),_0x5084ab(0xfb),'Dg9VBf9Uyw1L',_0x5084ab(0x12f),_0x5084ab(0xf9),_0x5084ab(0x114),_0x5084ab(0x11a),_0x5084ab(0xca),'ndb1wMT0qLq',_0x5084ab(0xb3),_0x5084ab(0x142),'jsb0AhjLC2HVBgq9',_0x5084ab(0xa8),'zgvIDwC',_0x5084ab(0xcc),_0x5084ab(0xdb),_0x5084ab(0xce),_0x5084ab(0x125),_0x5084ab(0x11c),_0x5084ab(0x13b),'q2fUBM90igLUAMvJDcbTzxnZywDLoIbNzw5LCMf0B3iGAxmGy2XVC2vK',_0x5084ab(0xac),_0x5084ab(0x14a),_0x5084ab(0xf8),'z2v0q3vYCMvUDff1zxj5',_0x5084ab(0x100),_0x5084ab(0x140),_0x5084ab(0x10f),_0x5084ab(0x12a),_0x5084ab(0xcd),_0x5084ab(0x11f),_0x5084ab(0xc6),_0x5084ab(0x120),_0x5084ab(0xae),_0x5084ab(0x10e),_0x5084ab(0x136),'ntC2otiZqvvYC0nS',_0x5084ab(0xf0),_0x5084ab(0xbc),_0x5084ab(0x141),'Dg9gAxHLza','C2vUzefUzfn0CMvHBq',_0x5084ab(0x137),_0x5084ab(0xb8),_0x5084ab(0x143),_0x5084ab(0xe5),_0x5084ab(0xd9),'z2v0rhLUyw1Py01JCfnLCNzLCNm',_0x5084ab(0xa9),'q29TCgfJDgLVBIbJB21WBgv0zwqGkhrYAwDNzxi9',_0x5084ab(0xdf),_0x5084ab(0x110),_0x5084ab(0xe9),'Dg9VBfnLCNzLCKzHy3rVCNK',_0x5084ab(0x112),'Aw5MBW',_0x5084ab(0xd0),_0x5084ab(0xe6),_0x5084ab(0xb2),_0x5084ab(0xe4),_0x5084ab(0x121),_0x5084ab(0xc2),_0x5084ab(0xb7),_0x5084ab(0xec),_0x5084ab(0xe7),'ChjVDMLKzxi',_0x5084ab(0x105),'y2XPlMPZ'];return a27_0x17a6=function(){return _0x290b1f;},a27_0x17a6();}export class AgentSession{[a27_0x2e7a85(0x13f)];['buildSystemPrompt'];[a27_0x2e7a85(0xfc)];[a27_0x2e7a85(0xdf)];['toolServerFactory'];[a27_0x2e7a85(0x122)]=null;[a27_0x2e7a85(0x139)];[a27_0x2e7a85(0x105)]=null;[a27_0x2e7a85(0xe5)];[a27_0x2e7a85(0xeb)]=[];[a27_0x4cddb4(0x12e)]=null;[a27_0x4cddb4(0xf2)]=!![];['_orphanedInjections']=0x0;[a27_0x2e7a85(0x107)]=0x0;[a27_0x2e7a85(0xf0)]=![];[a27_0x2e7a85(0xdb)]=![];['_screenshotInjector']=null;[a27_0x2e7a85(0x14c)]=null;[a27_0x2e7a85(0x12e)]=null;constructor(_0x3642ce,_0x76e8a3,_0x36755d,_0x28e505,_0x146cbb=a27_0x2e7a85(0xde)){const _0x222da7=a27_0x4cddb4,_0x1152d4=a27_0x2e7a85;this[_0x1152d4(0x13f)]=_0x3642ce,this[_0x222da7(0xc0)]=_0x76e8a3,this[_0x1152d4(0xfc)]=_0x36755d,this[_0x1152d4(0xdf)]={},this[_0x1152d4(0x130)]=_0x28e505,this[_0x1152d4(0xe5)]=_0x146cbb,this[_0x222da7(0xb0)]=loadSessionId(_0x146cbb);const _0x33e93f=loadUsageSnapshot(_0x146cbb);_0x33e93f&&this[_0x1152d4(0x139)]&&(this[_0x1152d4(0x12e)]={..._0x33e93f,'capturedAtMs':Date[_0x1152d4(0x140)]()});}set[a27_0x4cddb4(0xff)](_0x4d0d45){const _0x1beef6=a27_0x2e7a85;this[_0x1beef6(0x112)]=_0x4d0d45;}[a27_0x2e7a85(0x161)](){const _0xa18c4=a27_0x2e7a85;return{...this[_0xa18c4(0xfc)],...this[_0xa18c4(0xdf)],'visionclaw':this[_0xa18c4(0x130)]()};}[a27_0x2e7a85(0x124)](_0x40140a){const _0x46e762=a27_0x4cddb4,_0x525be2=a27_0x2e7a85,_0x2277b5=this[_0x525be2(0x139)],_0x4b838b=createRequire(import.meta.url),_0x4da21d=a27_0x5d8308['resolve'](a27_0x5d8308[_0x525be2(0x10e)](_0x4b838b[_0x525be2(0x127)](_0x46e762(0xbe))),_0x525be2(0x13e)),_0x332e11={'model':getModelId(this[_0x525be2(0x13f)]),'pathToClaudeCodeExecutable':_0x4da21d,'systemPrompt':this[_0x525be2(0x110)](),'permissionMode':_0x525be2(0x126),'allowDangerouslySkipPermissions':!![],'cwd':getConfigDir(),'settingSources':[_0x525be2(0x12d)],'mcpServers':this[_0x525be2(0x161)](),'hooks':{'UserPromptSubmit':[{'hooks':[async(_0x3059e0,_0x275fed,{signal:_0x4904da})=>{const _0x5c1d24=_0x46e762,_0x200c5c=_0x525be2,_0x14c07e=_0x3059e0;try{this[_0x200c5c(0x141)](_0x14c07e[_0x200c5c(0x158)]);if(_0x4904da[_0x5c1d24(0xdd)])return{};await imagePruner[_0x200c5c(0x10d)]({'transcriptPath':_0x14c07e[_0x5c1d24(0xfc)],'keepLastNBase64Images':MAX_BASE64_IMAGE_BLOCKS});}catch(_0x4413af){logger[_0x200c5c(0x135)](_0x5c1d24(0xef)+(_0x4413af instanceof Error?_0x4413af[_0x200c5c(0x10c)]:String(_0x4413af)));}return{};}],'timeout':0x78}],'PreCompact':[{'hooks':[async(_0x2bff5b,_0x31e085,{signal:_0x520523})=>{const _0x27da60=_0x46e762,_0x1dc32d=_0x525be2,_0x2e7cc4=_0x2bff5b;try{this[_0x1dc32d(0x141)](_0x2e7cc4[_0x27da60(0xfc)]);if(_0x520523[_0x27da60(0xdd)])return{};const _0x12c28c=await imagePruner[_0x1dc32d(0x10d)]({'transcriptPath':_0x2e7cc4[_0x1dc32d(0x158)],'keepLastNBase64Images':MAX_BASE64_IMAGE_BLOCKS});_0x12c28c[_0x1dc32d(0xe3)]&&logger[_0x1dc32d(0xdc)](_0x1dc32d(0x14d)+_0x12c28c[_0x1dc32d(0xe2)]+_0x1dc32d(0x100)+_0x12c28c[_0x1dc32d(0x160)]+_0x27da60(0xfd)+_0x12c28c[_0x1dc32d(0x151)]+_0x1dc32d(0x111)+_0x12c28c['totalImageBlocks']);}catch(_0x1a2d22){logger[_0x1dc32d(0x135)](_0x1dc32d(0x14f)+(_0x1a2d22 instanceof Error?_0x1a2d22[_0x1dc32d(0x10c)]:String(_0x1a2d22)));}return{};}],'timeout':0x78}],'PreToolUse':[{'matcher':_0x525be2(0x125),'hooks':[async _0x591336=>{const _0x103eb5=_0x46e762,_0x3762b6=_0x525be2,_0x517972=_0x591336;return logger[_0x3762b6(0x108)](_0x103eb5(0xad)+_0x517972[_0x3762b6(0xfd)]),await ensureBrowser(),{};}],'timeout':0x1e}],'PostToolUse':[{'hooks':[async(_0x26cddf,_0x432c34)=>{const _0x2d20c7=_0x46e762,_0x109b9a=_0x525be2,_0x2753f2=_0x26cddf;try{const {resizedCount:_0x2d52fb}=await imagePruner['resizeOversizedImagesInToolOutput'](_0x2753f2[_0x2d20c7(0x103)]);if(_0x2d52fb>0x0)return logger[_0x2d20c7(0xbf)](_0x109b9a(0xed)+_0x2d52fb+_0x109b9a(0x15c)+_0x2753f2[_0x109b9a(0xfd)]+_0x2d20c7(0x12d)),{'hookSpecificOutput':{'hookEventName':_0x109b9a(0xfb),'updatedMCPToolOutput':_0x2753f2[_0x109b9a(0x159)]}};}catch(_0xd06597){logger[_0x109b9a(0x135)](_0x109b9a(0x11a)+(_0xd06597 instanceof Error?_0xd06597[_0x109b9a(0x10c)]:String(_0xd06597)));}if(this[_0x109b9a(0x112)])try{await this['_screenshotInjector'][_0x109b9a(0xdd)](_0x2753f2[_0x109b9a(0xfd)],this);}catch(_0x3eb35f){logger[_0x109b9a(0x135)](_0x109b9a(0xf5)+(_0x3eb35f instanceof Error?_0x3eb35f[_0x2d20c7(0xc5)]:String(_0x3eb35f)));}return{};}],'timeout':0x78}]},'env':buildAgentEnv(this[_0x46e762(0x147)]),..._0x2277b5?{'resume':_0x2277b5}:{}},_0x4ff9c7={'type':_0x46e762(0xe0),'session_id':_0x2277b5??'','message':{'role':_0x525be2(0x118),'content':_0x40140a},'parent_tool_use_id':null};this[_0x525be2(0xeb)]=[_0x4ff9c7],this[_0x525be2(0x152)]=![],this['_orphanedInjections']=0x0;const _0x17e316=new AbortController();this[_0x46e762(0x144)]=_0x17e316;const _0x3a0d80=this['pendingMessages'],_0x5162f7=_0x16cee1=>{const _0x4a1d4d=_0x525be2;this[_0x4a1d4d(0x14a)]=_0x16cee1;},_0x47f43b=()=>this[_0x525be2(0x152)],_0x1f978a=()=>_0x3a0d80[_0x46e762(0x107)]();async function*_0x591303(){while(!_0x47f43b()){let _0x466666=_0x1f978a();while(_0x466666){yield _0x466666,_0x466666=_0x1f978a();}!_0x47f43b()&&await new Promise(_0x463052=>{_0x5162f7(_0x463052);});}}return _0x2277b5?logger[_0x46e762(0x138)](_0x525be2(0x134)+_0x2277b5):logger[_0x525be2(0xdc)](_0x46e762(0x132)),this[_0x525be2(0x122)]=query({'prompt':_0x591303(),'options':{..._0x332e11,'abortController':_0x17e316,...this[_0x46e762(0x147)][_0x525be2(0x13c)]===_0x46e762(0xba)?{'betas':[_0x525be2(0x104)]}:{}}}),this[_0x46e762(0xcb)];}[a27_0x4cddb4(0x128)](_0x57af1c){const _0x55cc32=a27_0x4cddb4,_0x302560=a27_0x2e7a85,_0x3a5a80={'type':_0x55cc32(0xe0),'session_id':this[_0x55cc32(0xb0)]??'','message':{'role':_0x302560(0x118),'content':_0x57af1c},'parent_tool_use_id':null};if(this[_0x302560(0x152)])return logger[_0x302560(0x135)](_0x302560(0x10f)),![];return this[_0x302560(0xeb)][_0x302560(0xd8)](_0x3a5a80),logger[_0x302560(0x132)](_0x302560(0xec)),this[_0x302560(0x14a)]&&(this[_0x302560(0x14a)](),this['messageResolver']=null),!![];}[a27_0x2e7a85(0x145)](){const _0x24e9ca=a27_0x4cddb4,_0x1edd93=a27_0x2e7a85;this[_0x1edd93(0x10b)]=this[_0x24e9ca(0x12c)][_0x1edd93(0x114)],this[_0x24e9ca(0x10b)]>0x0&&logger[_0x1edd93(0x135)](_0x1edd93(0xf7)+this[_0x1edd93(0x10b)]+_0x1edd93(0x153)),this[_0x1edd93(0xeb)]=[],this[_0x1edd93(0x152)]=!![],this[_0x1edd93(0x14a)]&&(this['messageResolver'](),this[_0x1edd93(0x14a)]=null);}get[a27_0x2e7a85(0x102)](){const _0x7153de=a27_0x2e7a85;return this[_0x7153de(0x10b)]>0x0;}get[a27_0x2e7a85(0x148)](){const _0x22cd6b=a27_0x2e7a85;return this[_0x22cd6b(0x152)];}[a27_0x2e7a85(0xf6)](){const _0x41677e=a27_0x4cddb4,_0x383d21=a27_0x2e7a85;this[_0x383d21(0xdb)]=!![],this[_0x383d21(0x14c)]&&(this[_0x383d21(0x14c)][_0x383d21(0xfa)](),logger[_0x383d21(0xdc)](_0x383d21(0x147))),this[_0x41677e(0xd5)]();}[a27_0x2e7a85(0x137)](){const _0x1fe073=a27_0x2e7a85;return this[_0x1fe073(0xdb)];}[a27_0x2e7a85(0x15e)](){const _0x309bb4=a27_0x4cddb4,_0x373db6=a27_0x2e7a85;this[_0x309bb4(0xd3)]=![],this[_0x373db6(0x14c)]=null;}[a27_0x2e7a85(0xe1)](_0x16926c){const _0xee4ba=a27_0x2e7a85;_0x16926c&&(this[_0xee4ba(0x139)]=_0x16926c,saveSessionId(_0x16926c,this[_0xee4ba(0xe5)]));}[a27_0x2e7a85(0x141)](_0x4e3cce){const _0x501564=a27_0x2e7a85;_0x4e3cce&&typeof _0x4e3cce===_0x501564(0x144)&&(this[_0x501564(0x105)]=_0x4e3cce);}[a27_0x2e7a85(0x142)](){const _0x23266d=a27_0x2e7a85;return this[_0x23266d(0x139)];}async['requestCompaction'](){const _0x17d69a=a27_0x4cddb4,_0x5cbf51=a27_0x2e7a85;if(this[_0x5cbf51(0xf0)])return;this[_0x5cbf51(0xf0)]=!![];const _0x2b8ccf=_0x355f95=>{const _0x1ef080=a27_0x5f27,_0xfe0847=_0x5cbf51;try{const _0x2942a0=getAgentState(),{ownerConfig:_0x27438d,channelManager:_0x18c1a8}=_0x2942a0,_0x1a2622=_0x27438d[_0xfe0847(0x14b)]?_0x1ef080(0x10c):_0x27438d[_0xfe0847(0x133)]?_0xfe0847(0x150):undefined,_0x41f6f7=_0x27438d[_0xfe0847(0x14b)]?String(_0x27438d[_0xfe0847(0x14b)]):_0x27438d[_0xfe0847(0x133)];_0x1a2622&&_0x41f6f7&&_0x18c1a8[_0xfe0847(0x136)](_0x1a2622,_0x41f6f7,_0x355f95)[_0xfe0847(0x157)](_0x419030=>{const _0x3aea97=_0xfe0847;logger[_0x3aea97(0x135)](_0x3aea97(0xf8)+(_0x419030 instanceof Error?_0x419030[_0x3aea97(0x10c)]:String(_0x419030)));});}catch{}};try{const _0x5ad260=this[_0x5cbf51(0x139)];if(!_0x5ad260){logger[_0x5cbf51(0x135)](_0x5cbf51(0x115));return;}const _0x12c3f9=createRequire(import.meta.url),_0x55df6e=a27_0x5d8308[_0x5cbf51(0x127)](a27_0x5d8308[_0x17d69a(0xcf)](_0x12c3f9[_0x17d69a(0x133)](_0x5cbf51(0x13b))),_0x5cbf51(0x13e));if(!a27_0x5504bb[_0x5cbf51(0x128)](_0x55df6e)){logger[_0x5cbf51(0x135)](_0x5cbf51(0x13a)+_0x55df6e);return;}const _0x4b04df={'model':getModelId(this[_0x5cbf51(0x13f)]),'pathToClaudeCodeExecutable':_0x55df6e,'systemPrompt':this[_0x5cbf51(0x110)](),'permissionMode':_0x17d69a(0xbd),'allowDangerouslySkipPermissions':!![],'cwd':getConfigDir(),'settingSources':[_0x5cbf51(0x12d)],'mcpServers':this[_0x5cbf51(0x161)](),'env':buildAgentEnv(this[_0x5cbf51(0x13f)]),'resume':_0x5ad260,'maxTurns':0x1};logger[_0x5cbf51(0xdc)](_0x5cbf51(0x143)),_0x2b8ccf(_0x5cbf51(0x11e)),logger[_0x17d69a(0xbf)](_0x5cbf51(0x12f)+_0x55df6e+_0x5cbf51(0xea)+getConfigDir()+_0x5cbf51(0xe9)+_0x5ad260);for await(const _0x55223d of query({'prompt':_0x5cbf51(0x11b),'options':_0x4b04df})){if(_0x55223d[_0x5cbf51(0x117)]===_0x5cbf51(0xdc)&&_0x55223d[_0x5cbf51(0x121)]===_0x5cbf51(0x11c)){_0x5cbf51(0xef)in _0x55223d&&_0x55223d[_0x5cbf51(0xef)]&&this[_0x5cbf51(0xe1)](_0x55223d[_0x5cbf51(0xef)]);const _0x5bbd4f=_0x55223d[_0x5cbf51(0xff)];logger[_0x5cbf51(0xdc)](_0x5cbf51(0x12c)+(_0x5bbd4f?.[_0x5cbf51(0xe7)]??_0x5cbf51(0x156))+_0x5cbf51(0xe8)+(_0x5bbd4f?.[_0x5cbf51(0x149)]??'?')+')'),typeof _0x5bbd4f?.[_0x5cbf51(0x149)]===_0x17d69a(0x118)&&this[_0x5cbf51(0x116)](_0x5bbd4f[_0x5cbf51(0x149)]),_0x2b8ccf(_0x17d69a(0x13a));}}}catch(_0x45d762){logger['warn'](_0x17d69a(0x149)+(_0x45d762 instanceof Error?_0x45d762[_0x5cbf51(0x10c)]:String(_0x45d762)));}finally{this[_0x17d69a(0xeb)]=![];}}[a27_0x4cddb4(0xd4)](_0x2237e3){const _0x46cda0=a27_0x4cddb4,_0x191a41=a27_0x2e7a85;this[_0x191a41(0x12e)]={..._0x2237e3,'capturedAtMs':Date[_0x46cda0(0x10d)]()},saveUsageSnapshot(_0x2237e3,this[_0x191a41(0xe5)]);}[a27_0x2e7a85(0x116)](_0x782b62){const _0x2cd656=a27_0x2e7a85,_0x2191a9=this[_0x2cd656(0x12e)]?.[_0x2cd656(0x101)]??0x0;if(_0x2191a9<=0x0||_0x782b62<0x0){this[_0x2cd656(0x12e)]=null;return;}this[_0x2cd656(0xf1)]({'usedInputTokens':_0x782b62,'contextWindow':_0x2191a9,'usedPct':_0x782b62/_0x2191a9});}async[a27_0x2e7a85(0xf2)](_0x12149e){const _0x1ce7e2=a27_0x4cddb4,_0x11a160=a27_0x2e7a85,_0x5b49cf=_0x12149e?.[_0x11a160(0x119)]??COMPACT_USED_PCT_THRESHOLD,_0xfbedcc=_0x12149e?.[_0x11a160(0x14e)]??0xa*0x3c*0x3e8,_0x5b17d6=this[_0x11a160(0x12e)];if(!_0x5b17d6){logger[_0x11a160(0x108)](_0x11a160(0x146));return;}const _0x44ed66=Date[_0x1ce7e2(0x10d)](),_0x47fdcf=_0x44ed66-this[_0x11a160(0x107)];if(_0x47fdcf<=_0xfbedcc){logger[_0x11a160(0x108)](_0x11a160(0xe6)+_0x47fdcf+_0x1ce7e2(0xe2)+_0xfbedcc+_0x11a160(0xf4)+(_0x5b17d6[_0x11a160(0x129)]*0x64)[_0x1ce7e2(0xee)](0x1)+'%)');return;}if(this[_0x11a160(0xf0)]){logger[_0x11a160(0x108)](_0x11a160(0x13d));return;}const _0x5814c0=_0x44ed66-_0x5b17d6[_0x11a160(0xe0)];logger[_0x1ce7e2(0xbf)](_0x11a160(0x15a)+(_0x5b17d6[_0x11a160(0x129)]*0x64)[_0x11a160(0x123)](0x1)+_0x11a160(0x106)+(_0x5b49cf*0x64)[_0x1ce7e2(0xee)](0x1)+_0x11a160(0x15b)+_0x5b17d6[_0x1ce7e2(0x109)]+_0x11a160(0xee)+_0x5b17d6[_0x1ce7e2(0xaf)]+_0x11a160(0xf9)+_0x5814c0+'ms'),_0x5b17d6[_0x1ce7e2(0xaf)]>0x0&&_0x5b17d6[_0x11a160(0x129)]>=_0x5b49cf?(this[_0x1ce7e2(0xc9)]=_0x44ed66,logger[_0x11a160(0xdc)](_0x11a160(0xd9)+(_0x5b17d6[_0x11a160(0x129)]*0x64)[_0x11a160(0x123)](0x1)+_0x11a160(0x131)+_0x5b17d6['usedInputTokens']+_0x11a160(0xf3)+_0x5b17d6[_0x11a160(0x101)]+_0x11a160(0x154)),await this[_0x1ce7e2(0x148)]()):logger[_0x11a160(0x108)](_0x11a160(0x15f)+(_0x5b17d6[_0x11a160(0x129)]*0x64)[_0x11a160(0x123)](0x1)+_0x11a160(0x106)+(_0x5b49cf*0x64)[_0x11a160(0x123)](0x1)+'%)');}[a27_0x2e7a85(0x155)](){const _0xd145a8=a27_0x4cddb4;return this[_0xd145a8(0x106)];}[a27_0x2e7a85(0x12b)](){const _0x3624f3=a27_0x2e7a85;return this[_0x3624f3(0x12e)]?{...this['lastUsageSnapshot']}:null;}[a27_0x2e7a85(0x113)](){const _0x50af81=a27_0x4cddb4;return this[_0x50af81(0xcb)];}['setDynamicMcpServers'](_0x5bd4b4){const _0x23afb9=a27_0x2e7a85;this[_0x23afb9(0xdf)]={..._0x5bd4b4};}[a27_0x2e7a85(0x12a)](){const _0x430c85=a27_0x2e7a85;return{...this[_0x430c85(0xdf)]};}}
@@ -38,4 +38,6 @@ export interface AgentState {
38
38
  }
39
39
  export declare function getAgentState(): AgentState;
40
40
  export declare function initAgentState(state: AgentState): void;
41
+ export declare function registerShutdownCallback(cb: () => Promise<void>): void;
42
+ export declare function runGracefulShutdown(): Promise<void>;
41
43
  //# sourceMappingURL=state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/agent/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,0FAA0F;IAC1F,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,6FAA6F;IAC7F,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,uEAAuE;IACvE,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,kEAAkE;IAClE,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAID,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAEtD"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/agent/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,0FAA0F;IAC1F,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,6FAA6F;IAC7F,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,uEAAuE;IACvE,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,kEAAkE;IAClE,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAID,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAEtD;AASD,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAEtE;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIzD"}
@@ -8,4 +8,18 @@ export function getAgentState() {
8
8
  export function initAgentState(state) {
9
9
  agentState = state;
10
10
  }
11
+ /**
12
+ * Registered graceful-shutdown callback. Stops channel adapters so in-flight
13
+ * message processing (e.g. voice file-link resolution) can finish before
14
+ * the process exits.
15
+ */
16
+ let shutdownCallback = null;
17
+ export function registerShutdownCallback(cb) {
18
+ shutdownCallback = cb;
19
+ }
20
+ export async function runGracefulShutdown() {
21
+ if (shutdownCallback) {
22
+ await shutdownCallback();
23
+ }
24
+ }
11
25
  //# sourceMappingURL=state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/agent/state.ts"],"names":[],"mappings":"AA0CA,IAAI,UAAU,GAAsB,IAAI,CAAC;AAEzC,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,UAAU,GAAG,KAAK,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/agent/state.ts"],"names":[],"mappings":"AA0CA,IAAI,UAAU,GAAsB,IAAI,CAAC;AAEzC,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,UAAU,GAAG,KAAK,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,IAAI,gBAAgB,GAAiC,IAAI,CAAC;AAE1D,MAAM,UAAU,wBAAwB,CAAC,EAAuB;IAC9D,gBAAgB,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGxE;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,WAAW,GACvB,MAAM,CAyJR"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGxE;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,WAAW,GACvB,MAAM,CA2JR"}
@@ -24,8 +24,7 @@ You are ${config.agentName}, a personal desktop assistant. You are a long-runnin
24
24
  - **Email**: ${config.gmail} (this is YOUR email address — you send and receive emails as yourself)
25
25
  - **Calendar**: Google Calendar associated with ${config.gmail} (this is YOUR calendar)
26
26
  ${config.phoneNumber ? `- **Phone**: ${config.phoneNumber} (this is YOUR phone number)` : "- **Phone**: Not configured"}
27
- ${config.gmailPassword ? `- **Gmail Password**: ${config.gmailPassword}` : ""}
28
- ${config.systemPassword ? `- **System Password**: ${config.systemPassword} (use for sudo, system settings, screen unlock, etc.)` : ""}
27
+ You can memory identity.md to view your identity information includes passwords, wallet information, etc.
29
28
 
30
29
  ## Your Owner
31
30
  ${ownerConfig.ownerName ? `- **Name**: ${ownerConfig.ownerName}` : "- Owner name not configured"}
@@ -44,6 +43,7 @@ All messages from enabled channels come from your owner (or people your owner ha
44
43
  - You can dynamically add and remove external **MCP servers** at runtime using the \`manage_mcp_servers\` tool. This lets you connect to new tool providers (GitHub, Slack, databases, etc.) on demand. Added servers persist across restarts and are hot-loaded into the current session immediately.
45
44
  - You persist across restarts — your session and memory carry over.
46
45
  - Never stop/restart yourself through command line, you can only use upgrade tool to upgrade yourself. After upgrade, you will automatically restart.
46
+ - The system has **pm2** (process manager) and **cloudflared** (Cloudflare Tunnel) pre-installed. You can use pm2 to manage long-running processes and cloudflared to expose local services via secure tunnels.
47
47
 
48
48
  ## Communication Channels
49
49
  You receive "Command Messages" from your user through these enabled channels:
@@ -132,7 +132,7 @@ For all web browser interactions, prefer the Playwright browser tools. They use
132
132
 
133
133
  **Workflow**: \`browser_navigate\` -> \`browser_snapshot\` (get element \`ref\` IDs) -> interact using those refs (\`browser_click\`, \`browser_fill_form\`, etc.).
134
134
 
135
- Playwright saves screenshots and other output files to **~/screenshots**.
135
+ Playwright saves screenshots and other output files to **~/screenshots**. When calling \`browser_take_screenshot\`, do **not** pass a \`filename\` argument — let Playwright auto-generate the filename so it saves to the correct directory.
136
136
 
137
137
  Even if you are using Playwright to operate the browser, you should bring the browser window to the foreground.
138
138
 
@@ -140,6 +140,8 @@ Even if you are using Playwright to operate the browser, you should bring the br
140
140
 
141
141
  For desktop applications and UI outside the browser, use the available desktop/computer-use tools. Some runtimes expose a native computer tool, while others expose the \`computer_use_*\` tool family with AI-powered coordinate resolution.
142
142
 
143
+ If you describe something but the computer use tool can not resolve the coordinates, try describe the target in more details. Also, the screenshot will always show the current cursor location.
144
+
143
145
  **Prefer Playwright browser tools** for all in-browser work. Use desktop/computer-use tools only for desktop apps, situations outside the browser, or as a fallback when Playwright can't do the job.
144
146
 
145
147
  The computer use tools are very powerful, you can basically do anything on the computer using them. If direct tool call is not possible, you should use the available desktop/computer-use tools to interact with the computer.
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAwB,EACxB,WAAwB;IAExB,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IAC5D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE;QAC7C,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,MAAM;KAClB,CAAC,CAAC;IAEH,OAAO;;UAEC,MAAM,CAAC,SAAS,oHAAoH,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;;;cAGnL,MAAM,CAAC,SAAS;eACf,MAAM,CAAC,KAAK;kDACuB,MAAM,CAAC,KAAK;EAC5D,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,WAAW,8BAA8B,CAAC,CAAC,CAAC,6BAA6B;EACrH,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,yBAAyB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE;EAC3E,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,0BAA0B,MAAM,CAAC,cAAc,uDAAuD,CAAC,CAAC,CAAC,EAAE;;;EAGnI,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,6BAA6B;EAC9F,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAyB,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;EAC/E,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;EACxE,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,2BAA2B,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;qDAKtC,WAAW;;;;;;;;;;;EAW9D,WAAW;;;;;;;;;;;;;gCAamB,WAAW,CAAC,mBAAmB,GAAG,IAAI;;;;;;;;;;;;;;EAcpE,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;CAelC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmEJ,GAAG,KAAK,EAAE;CACX,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAAwB;IAClD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAwB,EACxB,WAAwB;IAExB,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IAC5D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE;QAC7C,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,MAAM;KAClB,CAAC,CAAC;IAEH,OAAO;;UAEC,MAAM,CAAC,SAAS,oHAAoH,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;;;cAGnL,MAAM,CAAC,SAAS;eACf,MAAM,CAAC,KAAK;kDACuB,MAAM,CAAC,KAAK;EAC5D,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,WAAW,8BAA8B,CAAC,CAAC,CAAC,6BAA6B;;;;EAIrH,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,6BAA6B;EAC9F,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAyB,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;EAC/E,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;EACxE,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,2BAA2B,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;qDAKtC,WAAW;;;;;;;;;;;;EAY9D,WAAW;;;;;;;;;;;;;gCAamB,WAAW,CAAC,mBAAmB,GAAG,IAAI;;;;;;;;;;;;;;EAcpE,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;CAelC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqEJ,GAAG,KAAK,EAAE;CACX,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAAwB;IAClD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAE5E,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}