openchrome-mcp 1.7.16 → 1.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cdp/client.d.ts +36 -1
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +212 -8
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/tab-health-monitor.d.ts +63 -0
- package/dist/cdp/tab-health-monitor.d.ts.map +1 -0
- package/dist/cdp/tab-health-monitor.js +131 -0
- package/dist/cdp/tab-health-monitor.js.map +1 -0
- package/dist/chrome/launcher.d.ts +11 -0
- package/dist/chrome/launcher.d.ts.map +1 -1
- package/dist/chrome/launcher.js +17 -0
- package/dist/chrome/launcher.js.map +1 -1
- package/dist/chrome/pool.d.ts +17 -0
- package/dist/chrome/pool.d.ts.map +1 -1
- package/dist/chrome/pool.js +85 -2
- package/dist/chrome/pool.js.map +1 -1
- package/dist/chrome/process-watchdog.d.ts +63 -0
- package/dist/chrome/process-watchdog.d.ts.map +1 -0
- package/dist/chrome/process-watchdog.js +121 -0
- package/dist/chrome/process-watchdog.js.map +1 -0
- package/dist/cli/index.js +0 -0
- package/dist/config/defaults.d.ts +59 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +62 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/tool-tiers.d.ts.map +1 -1
- package/dist/config/tool-tiers.js +3 -0
- package/dist/config/tool-tiers.js.map +1 -1
- package/dist/dom/dom-serializer.js +1 -1
- package/dist/dom/dom-serializer.js.map +1 -1
- package/dist/index.js +111 -0
- package/dist/index.js.map +1 -1
- package/dist/journal/task-journal.d.ts +79 -0
- package/dist/journal/task-journal.d.ts.map +1 -0
- package/dist/journal/task-journal.js +246 -0
- package/dist/journal/task-journal.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +129 -7
- package/dist/mcp-server.js.map +1 -1
- package/dist/self-healing.d.ts +14 -0
- package/dist/self-healing.d.ts.map +1 -0
- package/dist/self-healing.js +17 -0
- package/dist/self-healing.js.map +1 -0
- package/dist/session-manager.d.ts +14 -3
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +98 -27
- package/dist/session-manager.js.map +1 -1
- package/dist/session-state-persistence.d.ts +92 -0
- package/dist/session-state-persistence.d.ts.map +1 -0
- package/dist/session-state-persistence.js +206 -0
- package/dist/session-state-persistence.js.map +1 -0
- package/dist/storage-state/storage-state-manager.d.ts +1 -1
- package/dist/storage-state/storage-state-manager.d.ts.map +1 -1
- package/dist/storage-state/storage-state-manager.js +40 -16
- package/dist/storage-state/storage-state-manager.js.map +1 -1
- package/dist/tools/click-element.d.ts.map +1 -1
- package/dist/tools/click-element.js +59 -2
- package/dist/tools/click-element.js.map +1 -1
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +27 -0
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/interact.d.ts.map +1 -1
- package/dist/tools/interact.js +93 -2
- package/dist/tools/interact.js.map +1 -1
- package/dist/tools/journal.d.ts +8 -0
- package/dist/tools/journal.d.ts.map +1 -0
- package/dist/tools/journal.js +112 -0
- package/dist/tools/journal.js.map +1 -0
- package/dist/tools/list-profiles.d.ts.map +1 -1
- package/dist/tools/list-profiles.js +2 -1
- package/dist/tools/list-profiles.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +42 -7
- package/dist/tools/navigate.js.map +1 -1
- package/dist/tools/profile-status.d.ts.map +1 -1
- package/dist/tools/profile-status.js +18 -0
- package/dist/tools/profile-status.js.map +1 -1
- package/dist/tools/session-resume.d.ts +42 -0
- package/dist/tools/session-resume.d.ts.map +1 -0
- package/dist/tools/session-resume.js +248 -0
- package/dist/tools/session-resume.js.map +1 -0
- package/dist/tools/session-snapshot.d.ts +35 -0
- package/dist/tools/session-snapshot.d.ts.map +1 -0
- package/dist/tools/session-snapshot.js +232 -0
- package/dist/tools/session-snapshot.js.map +1 -0
- package/dist/tools/tabs-create.d.ts.map +1 -1
- package/dist/tools/tabs-create.js +13 -2
- package/dist/tools/tabs-create.js.map +1 -1
- package/dist/tools/wait-and-click.d.ts.map +1 -1
- package/dist/tools/wait-and-click.js +47 -4
- package/dist/tools/wait-and-click.js.map +1 -1
- package/dist/types/session.d.ts +2 -0
- package/dist/types/session.d.ts.map +1 -1
- package/dist/utils/ax-element-resolver.d.ts +96 -0
- package/dist/utils/ax-element-resolver.d.ts.map +1 -0
- package/dist/utils/ax-element-resolver.js +256 -0
- package/dist/utils/ax-element-resolver.js.map +1 -0
- package/dist/utils/element-discovery.d.ts.map +1 -1
- package/dist/utils/element-discovery.js +4 -0
- package/dist/utils/element-discovery.js.map +1 -1
- package/dist/utils/ralph/circuit-breaker.d.ts +99 -0
- package/dist/utils/ralph/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/ralph/circuit-breaker.js +234 -0
- package/dist/utils/ralph/circuit-breaker.js.map +1 -0
- package/dist/utils/ralph/hitl-escalation.d.ts +51 -0
- package/dist/utils/ralph/hitl-escalation.d.ts.map +1 -0
- package/dist/utils/ralph/hitl-escalation.js +114 -0
- package/dist/utils/ralph/hitl-escalation.js.map +1 -0
- package/dist/utils/ralph/outcome-classifier.d.ts +44 -0
- package/dist/utils/ralph/outcome-classifier.d.ts.map +1 -0
- package/dist/utils/ralph/outcome-classifier.js +123 -0
- package/dist/utils/ralph/outcome-classifier.js.map +1 -0
- package/dist/utils/ralph/ralph-engine.d.ts +50 -0
- package/dist/utils/ralph/ralph-engine.d.ts.map +1 -0
- package/dist/utils/ralph/ralph-engine.js +341 -0
- package/dist/utils/ralph/ralph-engine.js.map +1 -0
- package/dist/utils/ralph/strategy-learner.d.ts +40 -0
- package/dist/utils/ralph/strategy-learner.d.ts.map +1 -0
- package/dist/utils/ralph/strategy-learner.js +80 -0
- package/dist/utils/ralph/strategy-learner.js.map +1 -0
- package/dist/utils/ralph/timeout-budget.d.ts +43 -0
- package/dist/utils/ralph/timeout-budget.d.ts.map +1 -0
- package/dist/utils/ralph/timeout-budget.js +80 -0
- package/dist/utils/ralph/timeout-budget.js.map +1 -0
- package/dist/watchdog/event-loop-monitor.d.ts +58 -0
- package/dist/watchdog/event-loop-monitor.d.ts.map +1 -0
- package/dist/watchdog/event-loop-monitor.js +85 -0
- package/dist/watchdog/event-loop-monitor.js.map +1 -0
- package/dist/watchdog/health-endpoint.d.ts +44 -0
- package/dist/watchdog/health-endpoint.d.ts.map +1 -0
- package/dist/watchdog/health-endpoint.js +119 -0
- package/dist/watchdog/health-endpoint.js.map +1 -0
- package/package.json +3 -2
- package/dist/chrome/sqlite-cookie-copy.d.ts +0 -46
- package/dist/chrome/sqlite-cookie-copy.d.ts.map +0 -1
- package/dist/chrome/sqlite-cookie-copy.js +0 -151
- package/dist/chrome/sqlite-cookie-copy.js.map +0 -1
- package/dist/config/config-recovery.d.ts +0 -69
- package/dist/config/config-recovery.d.ts.map +0 -1
- package/dist/config/config-recovery.js +0 -302
- package/dist/config/config-recovery.js.map +0 -1
- package/dist/config/session-isolator.d.ts +0 -76
- package/dist/config/session-isolator.d.ts.map +0 -1
- package/dist/config/session-isolator.js +0 -268
- package/dist/config/session-isolator.js.map +0 -1
- package/dist/tools/selector-query.d.ts +0 -6
- package/dist/tools/selector-query.d.ts.map +0 -1
- package/dist/tools/selector-query.js +0 -214
- package/dist/tools/selector-query.js.map +0 -1
- package/dist/tools/worker-create.d.ts +0 -7
- package/dist/tools/worker-create.d.ts.map +0 -1
- package/dist/tools/worker-create.js +0 -62
- package/dist/tools/worker-create.js.map +0 -1
- package/dist/tools/worker-delete.d.ts +0 -6
- package/dist/tools/worker-delete.d.ts.map +0 -1
- package/dist/tools/worker-delete.js +0 -80
- package/dist/tools/worker-delete.js.map +0 -1
- package/dist/tools/worker-list.d.ts +0 -6
- package/dist/tools/worker-list.d.ts.map +0 -1
- package/dist/tools/worker-list.js +0 -67
- package/dist/tools/worker-list.js.map +0 -1
- package/dist/tools/xpath-query.d.ts +0 -6
- package/dist/tools/xpath-query.d.ts.map +0 -1
- package/dist/tools/xpath-query.js +0 -225
- package/dist/tools/xpath-query.js.map +0 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Resume Tool — restores browser context after compaction.
|
|
3
|
+
* Reads a snapshot, cross-references with live state, generates resume guide.
|
|
4
|
+
* Part of #355: AI Agent Continuity.
|
|
5
|
+
*/
|
|
6
|
+
import { MCPServer } from '../mcp-server';
|
|
7
|
+
interface SnapshotTab {
|
|
8
|
+
targetId: string;
|
|
9
|
+
workerId: string;
|
|
10
|
+
sessionId: string;
|
|
11
|
+
url: string;
|
|
12
|
+
title: string;
|
|
13
|
+
}
|
|
14
|
+
interface SnapshotMemo {
|
|
15
|
+
objective: string;
|
|
16
|
+
currentStep: string;
|
|
17
|
+
nextActions: string[];
|
|
18
|
+
completedSteps?: string[];
|
|
19
|
+
notes?: string;
|
|
20
|
+
}
|
|
21
|
+
interface SessionSnapshot {
|
|
22
|
+
version: 1;
|
|
23
|
+
id: string;
|
|
24
|
+
timestamp: number;
|
|
25
|
+
tabs: SnapshotTab[];
|
|
26
|
+
memo: SnapshotMemo;
|
|
27
|
+
label?: string;
|
|
28
|
+
}
|
|
29
|
+
type TabStatus = 'LIVE' | 'REMAPPED' | 'CLOSED';
|
|
30
|
+
interface TabAnalysis {
|
|
31
|
+
saved: SnapshotTab;
|
|
32
|
+
status: TabStatus;
|
|
33
|
+
currentTargetId?: string;
|
|
34
|
+
currentUrl?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare const SNAPSHOT_DIR: string;
|
|
37
|
+
export declare function loadSnapshot(snapshotId?: string): SessionSnapshot | null;
|
|
38
|
+
export declare function analyzeTabs(savedTabs: SnapshotTab[]): Promise<TabAnalysis[]>;
|
|
39
|
+
export declare function generateResumeGuide(snapshot: SessionSnapshot, tabAnalysis: TabAnalysis[]): string;
|
|
40
|
+
export declare function registerSessionResumeTool(server: MCPServer): void;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=session-resume.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-resume.d.ts","sourceRoot":"","sources":["../../src/tools/session-resume.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAM1C,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,YAAY;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,CAAC,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,KAAK,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEhD,UAAU,WAAW;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyBD,eAAO,MAAM,YAAY,QAAsD,CAAC;AAEhF,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAYxE;AAID,wBAAsB,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAmElF;AAID,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,MAAM,CAsEjG;AA2CD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEjE"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session Resume Tool — restores browser context after compaction.
|
|
4
|
+
* Reads a snapshot, cross-references with live state, generates resume guide.
|
|
5
|
+
* Part of #355: AI Agent Continuity.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.SNAPSHOT_DIR = void 0;
|
|
42
|
+
exports.loadSnapshot = loadSnapshot;
|
|
43
|
+
exports.analyzeTabs = analyzeTabs;
|
|
44
|
+
exports.generateResumeGuide = generateResumeGuide;
|
|
45
|
+
exports.registerSessionResumeTool = registerSessionResumeTool;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const os = __importStar(require("os"));
|
|
49
|
+
const session_manager_1 = require("../session-manager");
|
|
50
|
+
// ─── Tool Definition ───────────────────────────────────────────────────────
|
|
51
|
+
const definition = {
|
|
52
|
+
name: 'oc_session_resume',
|
|
53
|
+
description: 'Restore working context after context compaction. ' +
|
|
54
|
+
'Reads the last oc_session_snapshot, checks which tabs are still alive, ' +
|
|
55
|
+
'and returns a resume guide with your objective, progress, and tab status. ' +
|
|
56
|
+
'Call this after compaction to continue where you left off.',
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {
|
|
60
|
+
snapshotId: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
description: 'Specific snapshot ID to restore (default: latest)',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
required: [],
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
// ─── Snapshot Loading ──────────────────────────────────────────────────────
|
|
69
|
+
exports.SNAPSHOT_DIR = path.join(os.homedir(), '.openchrome', 'snapshots');
|
|
70
|
+
function loadSnapshot(snapshotId) {
|
|
71
|
+
try {
|
|
72
|
+
const filename = snapshotId ? `${snapshotId}.json` : 'latest.json';
|
|
73
|
+
const filepath = path.join(exports.SNAPSHOT_DIR, filename);
|
|
74
|
+
const content = fs.readFileSync(filepath, 'utf-8');
|
|
75
|
+
const snapshot = JSON.parse(content);
|
|
76
|
+
if (snapshot.version !== 1)
|
|
77
|
+
return null;
|
|
78
|
+
return snapshot;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// ─── Tab Analysis ──────────────────────────────────────────────────────────
|
|
85
|
+
async function analyzeTabs(savedTabs) {
|
|
86
|
+
const results = [];
|
|
87
|
+
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
88
|
+
for (const saved of savedTabs) {
|
|
89
|
+
// Step 1: Try exact targetId match using the saved sessionId
|
|
90
|
+
let foundLive = false;
|
|
91
|
+
try {
|
|
92
|
+
const page = await sessionManager.getPage(saved.sessionId, saved.targetId, saved.workerId);
|
|
93
|
+
if (page) {
|
|
94
|
+
const currentUrl = page.url() || 'about:blank';
|
|
95
|
+
results.push({
|
|
96
|
+
saved,
|
|
97
|
+
status: 'LIVE',
|
|
98
|
+
currentTargetId: saved.targetId,
|
|
99
|
+
currentUrl,
|
|
100
|
+
});
|
|
101
|
+
foundLive = true;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Target not found or session mismatch — try URL remapping below
|
|
106
|
+
}
|
|
107
|
+
if (foundLive)
|
|
108
|
+
continue;
|
|
109
|
+
// Step 2: Try URL-based remapping across all sessions/workers/targets
|
|
110
|
+
let remapped = false;
|
|
111
|
+
try {
|
|
112
|
+
const allSessionInfos = sessionManager.getAllSessionInfos();
|
|
113
|
+
outer: for (const sessionInfo of allSessionInfos) {
|
|
114
|
+
for (const workerInfo of sessionInfo.workers) {
|
|
115
|
+
const targetIds = sessionManager.getWorkerTargetIds(sessionInfo.id, workerInfo.id);
|
|
116
|
+
for (const targetId of targetIds) {
|
|
117
|
+
try {
|
|
118
|
+
const page = await sessionManager.getPage(sessionInfo.id, targetId);
|
|
119
|
+
if (page && page.url() === saved.url) {
|
|
120
|
+
results.push({
|
|
121
|
+
saved,
|
|
122
|
+
status: 'REMAPPED',
|
|
123
|
+
currentTargetId: targetId,
|
|
124
|
+
currentUrl: page.url(),
|
|
125
|
+
});
|
|
126
|
+
remapped = true;
|
|
127
|
+
break outer;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Skip unreachable targets
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Session manager error during URL scan — fall through to CLOSED
|
|
139
|
+
}
|
|
140
|
+
if (remapped)
|
|
141
|
+
continue;
|
|
142
|
+
// Step 3: Tab is gone
|
|
143
|
+
results.push({
|
|
144
|
+
saved,
|
|
145
|
+
status: 'CLOSED',
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return results;
|
|
149
|
+
}
|
|
150
|
+
// ─── Resume Guide Generation ───────────────────────────────────────────────
|
|
151
|
+
function generateResumeGuide(snapshot, tabAnalysis) {
|
|
152
|
+
const lines = [];
|
|
153
|
+
const age = Date.now() - snapshot.timestamp;
|
|
154
|
+
const ageStr = age < 60000 ? `${Math.round(age / 1000)}s` :
|
|
155
|
+
age < 3600000 ? `${Math.round(age / 60000)}m` :
|
|
156
|
+
`${Math.round(age / 3600000)}h`;
|
|
157
|
+
lines.push('=== CONTEXT RESTORED ===');
|
|
158
|
+
lines.push('');
|
|
159
|
+
lines.push(`Objective: ${snapshot.memo.objective}`);
|
|
160
|
+
lines.push(`Last step: ${snapshot.memo.currentStep}`);
|
|
161
|
+
lines.push(`Snapshot age: ${ageStr}${snapshot.label ? ` (${snapshot.label})` : ''}`);
|
|
162
|
+
if (age > 24 * 3600000) {
|
|
163
|
+
lines.push('WARNING: Snapshot is over 24 hours old. Tab states may be inaccurate.');
|
|
164
|
+
}
|
|
165
|
+
// Tab status
|
|
166
|
+
const live = tabAnalysis.filter(t => t.status === 'LIVE');
|
|
167
|
+
const remapped = tabAnalysis.filter(t => t.status === 'REMAPPED');
|
|
168
|
+
const closed = tabAnalysis.filter(t => t.status === 'CLOSED');
|
|
169
|
+
lines.push('');
|
|
170
|
+
lines.push(`Tabs: ${live.length} LIVE, ${remapped.length} REMAPPED, ${closed.length} CLOSED`);
|
|
171
|
+
if (tabAnalysis.length > 0) {
|
|
172
|
+
lines.push('');
|
|
173
|
+
for (const tab of tabAnalysis) {
|
|
174
|
+
const statusLabel = tab.status === 'LIVE' ? 'LIVE ' :
|
|
175
|
+
tab.status === 'REMAPPED' ? 'REMAPPED' :
|
|
176
|
+
'CLOSED ';
|
|
177
|
+
const url = tab.saved.url;
|
|
178
|
+
const title = tab.saved.title ? ` "${tab.saved.title}"` : '';
|
|
179
|
+
if (tab.status === 'REMAPPED') {
|
|
180
|
+
lines.push(` [${statusLabel}] ${tab.saved.targetId} -> ${tab.currentTargetId} ${url}${title}`);
|
|
181
|
+
}
|
|
182
|
+
else if (tab.status === 'CLOSED') {
|
|
183
|
+
lines.push(` [${statusLabel}] ${url}${title}`);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
lines.push(` [${statusLabel}] ${tab.currentTargetId} ${url}${title}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Completed steps
|
|
191
|
+
if (snapshot.memo.completedSteps && snapshot.memo.completedSteps.length > 0) {
|
|
192
|
+
lines.push('');
|
|
193
|
+
lines.push('Completed:');
|
|
194
|
+
for (const step of snapshot.memo.completedSteps) {
|
|
195
|
+
lines.push(` - ${step}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Next actions
|
|
199
|
+
if (snapshot.memo.nextActions.length > 0) {
|
|
200
|
+
lines.push('');
|
|
201
|
+
lines.push('Next actions:');
|
|
202
|
+
snapshot.memo.nextActions.forEach((action, i) => {
|
|
203
|
+
lines.push(` ${i + 1}. ${action}`);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// Notes
|
|
207
|
+
if (snapshot.memo.notes) {
|
|
208
|
+
lines.push('');
|
|
209
|
+
lines.push(`Notes: ${snapshot.memo.notes}`);
|
|
210
|
+
}
|
|
211
|
+
return lines.join('\n');
|
|
212
|
+
}
|
|
213
|
+
// ─── Handler ───────────────────────────────────────────────────────────────
|
|
214
|
+
const handler = async (_sessionId, args) => {
|
|
215
|
+
const snapshotId = args.snapshotId;
|
|
216
|
+
const snapshot = loadSnapshot(snapshotId);
|
|
217
|
+
if (!snapshot) {
|
|
218
|
+
return {
|
|
219
|
+
content: [{
|
|
220
|
+
type: 'text',
|
|
221
|
+
text: 'No snapshot found.' +
|
|
222
|
+
(snapshotId ? ` Snapshot "${snapshotId}" does not exist.` : '') +
|
|
223
|
+
' Use oc_session_snapshot to save state before long operations.',
|
|
224
|
+
}],
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
let tabAnalysis;
|
|
228
|
+
try {
|
|
229
|
+
tabAnalysis = await analyzeTabs(snapshot.tabs);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// Can't analyze tabs (Chrome disconnected) — return snapshot data as-is
|
|
233
|
+
tabAnalysis = snapshot.tabs.map(tab => ({
|
|
234
|
+
saved: tab,
|
|
235
|
+
status: 'CLOSED',
|
|
236
|
+
}));
|
|
237
|
+
}
|
|
238
|
+
const guide = generateResumeGuide(snapshot, tabAnalysis);
|
|
239
|
+
return {
|
|
240
|
+
content: [{ type: 'text', text: guide }],
|
|
241
|
+
_snapshotId: snapshot.id,
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
// ─── Registration ──────────────────────────────────────────────────────────
|
|
245
|
+
function registerSessionResumeTool(server) {
|
|
246
|
+
server.registerTool(definition.name, handler, definition);
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=session-resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-resume.js","sourceRoot":"","sources":["../../src/tools/session-resume.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Snapshot Tool — captures browser state for context recovery.
|
|
3
|
+
* Part of #355: AI Agent Continuity.
|
|
4
|
+
*/
|
|
5
|
+
import { MCPServer } from '../mcp-server';
|
|
6
|
+
export interface SnapshotTab {
|
|
7
|
+
targetId: string;
|
|
8
|
+
workerId: string;
|
|
9
|
+
sessionId: string;
|
|
10
|
+
url: string;
|
|
11
|
+
title: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SnapshotMemo {
|
|
14
|
+
objective: string;
|
|
15
|
+
currentStep: string;
|
|
16
|
+
nextActions: string[];
|
|
17
|
+
completedSteps?: string[];
|
|
18
|
+
notes?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SessionSnapshot {
|
|
21
|
+
version: 1;
|
|
22
|
+
id: string;
|
|
23
|
+
timestamp: number;
|
|
24
|
+
tabs: SnapshotTab[];
|
|
25
|
+
memo: SnapshotMemo;
|
|
26
|
+
label?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const SNAPSHOT_DIR: string;
|
|
29
|
+
export declare const MAX_SNAPSHOTS = 10;
|
|
30
|
+
export declare function generateSnapshotId(): string;
|
|
31
|
+
export declare function collectTabs(): Promise<SnapshotTab[]>;
|
|
32
|
+
export declare function saveSnapshot(snapshot: SessionSnapshot): Promise<void>;
|
|
33
|
+
export declare function pruneSnapshots(): Promise<void>;
|
|
34
|
+
export declare function registerSessionSnapshotTool(server: MCPServer): void;
|
|
35
|
+
//# sourceMappingURL=session-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-snapshot.d.ts","sourceRoot":"","sources":["../../src/tools/session-snapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAO1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+CD,eAAO,MAAM,YAAY,QAAsD,CAAC;AAChF,eAAO,MAAM,aAAa,KAAK,CAAC;AAGhC,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAID,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAgD1D;AAQD,wBAAsB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3E;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA+BpD;AAgDD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEnE"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session Snapshot Tool — captures browser state for context recovery.
|
|
4
|
+
* Part of #355: AI Agent Continuity.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.MAX_SNAPSHOTS = exports.SNAPSHOT_DIR = void 0;
|
|
41
|
+
exports.generateSnapshotId = generateSnapshotId;
|
|
42
|
+
exports.collectTabs = collectTabs;
|
|
43
|
+
exports.saveSnapshot = saveSnapshot;
|
|
44
|
+
exports.pruneSnapshots = pruneSnapshots;
|
|
45
|
+
exports.registerSessionSnapshotTool = registerSessionSnapshotTool;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const os = __importStar(require("os"));
|
|
49
|
+
const session_manager_1 = require("../session-manager");
|
|
50
|
+
const atomic_file_1 = require("../utils/atomic-file");
|
|
51
|
+
// ─── Tool Definition ───────────────────────────────────────────────────────
|
|
52
|
+
const definition = {
|
|
53
|
+
name: 'oc_session_snapshot',
|
|
54
|
+
description: 'Save browser state snapshot for context recovery after compaction. ' +
|
|
55
|
+
'Captures open tabs, worker state, and your task memo. ' +
|
|
56
|
+
'Use before long operations or periodically during multi-step tasks. ' +
|
|
57
|
+
'Restore with oc_session_resume.',
|
|
58
|
+
inputSchema: {
|
|
59
|
+
type: 'object',
|
|
60
|
+
properties: {
|
|
61
|
+
objective: {
|
|
62
|
+
type: 'string',
|
|
63
|
+
description: 'What you are trying to accomplish',
|
|
64
|
+
},
|
|
65
|
+
currentStep: {
|
|
66
|
+
type: 'string',
|
|
67
|
+
description: 'What step you are currently on',
|
|
68
|
+
},
|
|
69
|
+
nextActions: {
|
|
70
|
+
type: 'array',
|
|
71
|
+
items: { type: 'string' },
|
|
72
|
+
description: 'Planned next actions',
|
|
73
|
+
},
|
|
74
|
+
completedSteps: {
|
|
75
|
+
type: 'array',
|
|
76
|
+
items: { type: 'string' },
|
|
77
|
+
description: 'Steps already completed',
|
|
78
|
+
},
|
|
79
|
+
notes: {
|
|
80
|
+
type: 'string',
|
|
81
|
+
description: 'Additional context or notes',
|
|
82
|
+
},
|
|
83
|
+
label: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
description: 'Optional label for this snapshot',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
required: ['objective', 'currentStep', 'nextActions'],
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
// ─── Snapshot Directory ────────────────────────────────────────────────────
|
|
92
|
+
exports.SNAPSHOT_DIR = path.join(os.homedir(), '.openchrome', 'snapshots');
|
|
93
|
+
exports.MAX_SNAPSHOTS = 10;
|
|
94
|
+
const MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000; // 30 days
|
|
95
|
+
function generateSnapshotId() {
|
|
96
|
+
const now = new Date();
|
|
97
|
+
const ts = now.toISOString().replace(/[-:]/g, '').replace('T', '-').slice(0, 15);
|
|
98
|
+
const hex = Math.random().toString(16).slice(2, 6);
|
|
99
|
+
return `snap-${ts}-${hex}`;
|
|
100
|
+
}
|
|
101
|
+
// ─── Tab Collection ────────────────────────────────────────────────────────
|
|
102
|
+
async function collectTabs() {
|
|
103
|
+
const tabs = [];
|
|
104
|
+
try {
|
|
105
|
+
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
106
|
+
const allSessionInfos = sessionManager.getAllSessionInfos();
|
|
107
|
+
for (const sessionInfo of allSessionInfos) {
|
|
108
|
+
const sessionId = sessionInfo.id;
|
|
109
|
+
for (const workerInfo of sessionInfo.workers) {
|
|
110
|
+
const workerId = workerInfo.id;
|
|
111
|
+
const targetIds = sessionManager.getWorkerTargetIds(sessionId, workerId);
|
|
112
|
+
for (const targetId of targetIds) {
|
|
113
|
+
let url = 'about:blank';
|
|
114
|
+
let title = '';
|
|
115
|
+
try {
|
|
116
|
+
const page = await sessionManager.getPage(sessionId, targetId, workerId);
|
|
117
|
+
if (page) {
|
|
118
|
+
url = page.url() || 'about:blank';
|
|
119
|
+
try {
|
|
120
|
+
title = await page.title();
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
title = '';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Page may be closed or crashed
|
|
129
|
+
}
|
|
130
|
+
tabs.push({
|
|
131
|
+
targetId,
|
|
132
|
+
workerId,
|
|
133
|
+
sessionId,
|
|
134
|
+
url,
|
|
135
|
+
title,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
// Session manager may not be initialized or Chrome not connected
|
|
143
|
+
console.error('[SessionSnapshot] collectTabs error (graceful fallback):', err instanceof Error ? err.message : String(err));
|
|
144
|
+
}
|
|
145
|
+
return tabs;
|
|
146
|
+
}
|
|
147
|
+
// ─── File Management ───────────────────────────────────────────────────────
|
|
148
|
+
async function ensureDir() {
|
|
149
|
+
await fs.promises.mkdir(exports.SNAPSHOT_DIR, { recursive: true });
|
|
150
|
+
}
|
|
151
|
+
async function saveSnapshot(snapshot) {
|
|
152
|
+
await ensureDir();
|
|
153
|
+
// Save as latest.json (atomic overwrite)
|
|
154
|
+
const latestPath = path.join(exports.SNAPSHOT_DIR, 'latest.json');
|
|
155
|
+
await (0, atomic_file_1.writeFileAtomicSafe)(latestPath, snapshot);
|
|
156
|
+
// Save history copy
|
|
157
|
+
const historyPath = path.join(exports.SNAPSHOT_DIR, `${snapshot.id}.json`);
|
|
158
|
+
await (0, atomic_file_1.writeFileAtomicSafe)(historyPath, snapshot);
|
|
159
|
+
// Prune old snapshots
|
|
160
|
+
await pruneSnapshots();
|
|
161
|
+
}
|
|
162
|
+
async function pruneSnapshots() {
|
|
163
|
+
try {
|
|
164
|
+
const files = await fs.promises.readdir(exports.SNAPSHOT_DIR);
|
|
165
|
+
const snapFiles = files
|
|
166
|
+
.filter(f => f.startsWith('snap-') && f.endsWith('.json'))
|
|
167
|
+
.sort(); // Lexicographic sort = chronological for our ID format
|
|
168
|
+
// Remove excess snapshots (keep MAX_SNAPSHOTS most recent)
|
|
169
|
+
if (snapFiles.length > exports.MAX_SNAPSHOTS) {
|
|
170
|
+
const toRemove = snapFiles.slice(0, snapFiles.length - exports.MAX_SNAPSHOTS);
|
|
171
|
+
for (const file of toRemove) {
|
|
172
|
+
await fs.promises.unlink(path.join(exports.SNAPSHOT_DIR, file)).catch(() => { });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Remove snapshots older than MAX_AGE_MS
|
|
176
|
+
const cutoff = Date.now() - MAX_AGE_MS;
|
|
177
|
+
for (const file of snapFiles) {
|
|
178
|
+
const filePath = path.join(exports.SNAPSHOT_DIR, file);
|
|
179
|
+
try {
|
|
180
|
+
const stat = await fs.promises.stat(filePath);
|
|
181
|
+
if (stat.mtimeMs < cutoff) {
|
|
182
|
+
await fs.promises.unlink(filePath);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Skip
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// Best-effort pruning
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// ─── Handler ───────────────────────────────────────────────────────────────
|
|
195
|
+
const handler = async (_sessionId, args) => {
|
|
196
|
+
const memo = {
|
|
197
|
+
objective: args.objective,
|
|
198
|
+
currentStep: args.currentStep,
|
|
199
|
+
nextActions: args.nextActions || [],
|
|
200
|
+
completedSteps: args.completedSteps || undefined,
|
|
201
|
+
notes: args.notes || undefined,
|
|
202
|
+
};
|
|
203
|
+
const tabs = await collectTabs();
|
|
204
|
+
const snapshotId = generateSnapshotId();
|
|
205
|
+
const snapshot = {
|
|
206
|
+
version: 1,
|
|
207
|
+
id: snapshotId,
|
|
208
|
+
timestamp: Date.now(),
|
|
209
|
+
tabs,
|
|
210
|
+
memo,
|
|
211
|
+
label: args.label || undefined,
|
|
212
|
+
};
|
|
213
|
+
await saveSnapshot(snapshot);
|
|
214
|
+
const text = [
|
|
215
|
+
`Snapshot saved: ${snapshotId}`,
|
|
216
|
+
`Tabs: ${tabs.length}`,
|
|
217
|
+
`Objective: ${memo.objective}`,
|
|
218
|
+
`Step: ${memo.currentStep}`,
|
|
219
|
+
`Next: ${memo.nextActions.join(', ')}`,
|
|
220
|
+
'',
|
|
221
|
+
'Use oc_session_resume to restore this context after compaction.',
|
|
222
|
+
].join('\n');
|
|
223
|
+
return {
|
|
224
|
+
content: [{ type: 'text', text }],
|
|
225
|
+
_snapshotId: snapshotId,
|
|
226
|
+
};
|
|
227
|
+
};
|
|
228
|
+
// ─── Registration ──────────────────────────────────────────────────────────
|
|
229
|
+
function registerSessionSnapshotTool(server) {
|
|
230
|
+
server.registerTool(definition.name, handler, definition);
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=session-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-snapshot.js","sourceRoot":"","sources":["../../src/tools/session-snapshot.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFH,gDAKC;AAID,kCAgDC;AAQD,oCAaC;AAED,wCA+BC;AAgDD,kEAEC;AArPD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAGzB,wDAAuD;AACvD,sDAA2D;AA6B3D,8EAA8E;AAE9E,MAAM,UAAU,GAAsB;IACpC,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EACT,qEAAqE;QACrE,wDAAwD;QACxD,sEAAsE;QACtE,iCAAiC;IACnC,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mCAAmC;aACjD;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gCAAgC;aAC9C;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,sBAAsB;aACpC;YACD,cAAc,EAAE;gBACd,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,yBAAyB;aACvC;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6BAA6B;aAC3C;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAChD;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC;KACtD;CACF,CAAC;AAEF,8EAA8E;AAEjE,QAAA,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AACnE,QAAA,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU;AAEvD,SAAgB,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjF,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;AAC7B,CAAC;AAED,8EAA8E;AAEvE,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAkB,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,IAAA,mCAAiB,GAAE,CAAC;QAC3C,MAAM,eAAe,GAAG,cAAc,CAAC,kBAAkB,EAAE,CAAC;QAE5D,KAAK,MAAM,WAAW,IAAI,eAAe,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC;YAEjC,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,cAAc,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAEzE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,IAAI,GAAG,GAAG,aAAa,CAAC;oBACxB,IAAI,KAAK,GAAG,EAAE,CAAC;oBAEf,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;wBACzE,IAAI,IAAI,EAAE,CAAC;4BACT,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,aAAa,CAAC;4BAClC,IAAI,CAAC;gCACH,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;4BAC7B,CAAC;4BAAC,MAAM,CAAC;gCACP,KAAK,GAAG,EAAE,CAAC;4BACb,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,gCAAgC;oBAClC,CAAC;oBAED,IAAI,CAAC,IAAI,CAAC;wBACR,QAAQ;wBACR,QAAQ;wBACR,SAAS;wBACT,GAAG;wBACH,KAAK;qBACN,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,iEAAiE;QACjE,OAAO,CAAC,KAAK,CAAC,0DAA0D,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9H,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,SAAS;IACtB,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,oBAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,QAAyB;IAC1D,MAAM,SAAS,EAAE,CAAC;IAElB,yCAAyC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,aAAa,CAAC,CAAC;IAC1D,MAAM,IAAA,iCAAmB,EAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEhD,oBAAoB;IACpB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,GAAG,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,IAAA,iCAAmB,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEjD,sBAAsB;IACtB,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC;AAEM,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAY,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,KAAK;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACzD,IAAI,EAAE,CAAC,CAAC,uDAAuD;QAElE,2DAA2D;QAC3D,IAAI,SAAS,CAAC,MAAM,GAAG,qBAAa,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,qBAAa,CAAC,CAAC;YACtE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,IAAI,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9C,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;oBAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,MAAM,OAAO,GAAgB,KAAK,EAChC,UAAkB,EAClB,IAA6B,EACT,EAAE;IACtB,MAAM,IAAI,GAAiB;QACzB,SAAS,EAAE,IAAI,CAAC,SAAmB;QACnC,WAAW,EAAE,IAAI,CAAC,WAAqB;QACvC,WAAW,EAAG,IAAI,CAAC,WAAwB,IAAI,EAAE;QACjD,cAAc,EAAG,IAAI,CAAC,cAA2B,IAAI,SAAS;QAC9D,KAAK,EAAG,IAAI,CAAC,KAAgB,IAAI,SAAS;KAC3C,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,MAAM,QAAQ,GAAoB;QAChC,OAAO,EAAE,CAAC;QACV,EAAE,EAAE,UAAU;QACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI;QACJ,IAAI;QACJ,KAAK,EAAG,IAAI,CAAC,KAAgB,IAAI,SAAS;KAC3C,CAAC;IAEF,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE7B,MAAM,IAAI,GAAG;QACX,mBAAmB,UAAU,EAAE;QAC/B,SAAS,IAAI,CAAC,MAAM,EAAE;QACtB,cAAc,IAAI,CAAC,SAAS,EAAE;QAC9B,SAAS,IAAI,CAAC,WAAW,EAAE;QAC3B,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACtC,EAAE;QACF,iEAAiE;KAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjC,WAAW,EAAE,UAAU;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF,8EAA8E;AAE9E,SAAgB,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs-create.d.ts","sourceRoot":"","sources":["../../src/tools/tabs-create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"tabs-create.d.ts","sourceRoot":"","sources":["../../src/tools/tabs-create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAyG1C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAE9D"}
|
|
@@ -21,6 +21,10 @@ const definition = {
|
|
|
21
21
|
type: 'string',
|
|
22
22
|
description: 'Worker ID for parallel ops. Default: default',
|
|
23
23
|
},
|
|
24
|
+
profileDirectory: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'Chrome profile directory name (e.g., "Profile 1"). Use list_profiles to see available profiles. Launches a separate Chrome instance for each profile. If omitted, uses the server default. Cannot be combined with workerId.',
|
|
27
|
+
},
|
|
24
28
|
},
|
|
25
29
|
required: ['url'],
|
|
26
30
|
},
|
|
@@ -28,7 +32,14 @@ const definition = {
|
|
|
28
32
|
const handler = async (sessionId, args) => {
|
|
29
33
|
const sessionManager = (0, session_manager_1.getSessionManager)();
|
|
30
34
|
const url = args.url;
|
|
31
|
-
const
|
|
35
|
+
const profileDirectory = args.profileDirectory;
|
|
36
|
+
if (args.workerId && profileDirectory) {
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: 'text', text: 'Error: workerId and profileDirectory cannot be used together. Use profileDirectory alone (a worker is auto-created per profile).' }],
|
|
39
|
+
isError: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const workerId = args.workerId || (profileDirectory ? `profile:${profileDirectory}` : undefined);
|
|
32
43
|
// URL is required
|
|
33
44
|
if (!url) {
|
|
34
45
|
return {
|
|
@@ -57,7 +68,7 @@ const handler = async (sessionId, args) => {
|
|
|
57
68
|
};
|
|
58
69
|
}
|
|
59
70
|
try {
|
|
60
|
-
const { targetId, page, workerId: assignedWorkerId } = await sessionManager.createTarget(sessionId, url, workerId);
|
|
71
|
+
const { targetId, page, workerId: assignedWorkerId } = await sessionManager.createTarget(sessionId, url, workerId, profileDirectory);
|
|
61
72
|
return {
|
|
62
73
|
content: [
|
|
63
74
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs-create.js","sourceRoot":"","sources":["../../src/tools/tabs-create.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"tabs-create.js","sourceRoot":"","sources":["../../src/tools/tabs-create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait-and-click.d.ts","sourceRoot":"","sources":["../../src/tools/wait-and-click.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"wait-and-click.d.ts","sourceRoot":"","sources":["../../src/tools/wait-and-click.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAyO1C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAEhE"}
|