safari-pilot 0.1.0
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/.claude-plugin/plugin.json +35 -0
- package/.mcp.json +11 -0
- package/LICENSE +21 -0
- package/README.md +324 -0
- package/bin/.gitkeep +0 -0
- package/bin/Safari Pilot.app/Contents/CodeResources +0 -0
- package/bin/Safari Pilot.app/Contents/Info.plist +58 -0
- package/bin/Safari Pilot.app/Contents/MacOS/Safari Pilot +0 -0
- package/bin/Safari Pilot.app/Contents/PkgInfo +1 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Info.plist +55 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/MacOS/Safari Pilot Extension +0 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Resources/background.js +294 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Resources/content-isolated.js +80 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Resources/content-main.js +310 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Resources/icons/icon-128.png +0 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Resources/icons/icon-48.png +0 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Resources/icons/icon-96.png +0 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Resources/manifest.json +39 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/_CodeSignature/CodeResources +194 -0
- package/bin/Safari Pilot.app/Contents/Resources/AppIcon.icns +0 -0
- package/bin/Safari Pilot.app/Contents/Resources/Assets.car +0 -0
- package/bin/Safari Pilot.app/Contents/Resources/Base.lproj/Main.html +19 -0
- package/bin/Safari Pilot.app/Contents/Resources/Base.lproj/Main.storyboardc/Info.plist +0 -0
- package/bin/Safari Pilot.app/Contents/Resources/Base.lproj/Main.storyboardc/MainMenu.nib +0 -0
- package/bin/Safari Pilot.app/Contents/Resources/Base.lproj/Main.storyboardc/NSWindowController-B8D-0N-5wS.nib +0 -0
- package/bin/Safari Pilot.app/Contents/Resources/Base.lproj/Main.storyboardc/XfG-lQ-9wD-view-m2S-Jp-Qdl.nib +0 -0
- package/bin/Safari Pilot.app/Contents/Resources/Icon.png +0 -0
- package/bin/Safari Pilot.app/Contents/Resources/Script.js +22 -0
- package/bin/Safari Pilot.app/Contents/Resources/Style.css +45 -0
- package/bin/Safari Pilot.app/Contents/_CodeSignature/CodeResources +236 -0
- package/bin/Safari Pilot.zip +0 -0
- package/bin/SafariPilotd +0 -0
- package/dist/engine-selector.d.ts +10 -0
- package/dist/engine-selector.js +55 -0
- package/dist/engine-selector.js.map +1 -0
- package/dist/engines/applescript.d.ts +53 -0
- package/dist/engines/applescript.js +290 -0
- package/dist/engines/applescript.js.map +1 -0
- package/dist/engines/daemon.d.ts +19 -0
- package/dist/engines/daemon.js +187 -0
- package/dist/engines/daemon.js.map +1 -0
- package/dist/engines/engine.d.ts +15 -0
- package/dist/engines/engine.js +42 -0
- package/dist/engines/engine.js.map +1 -0
- package/dist/engines/extension.d.ts +34 -0
- package/dist/engines/extension.js +66 -0
- package/dist/engines/extension.js.map +1 -0
- package/dist/errors.d.ts +128 -0
- package/dist/errors.js +250 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/security/audit-log.d.ts +23 -0
- package/dist/security/audit-log.js +68 -0
- package/dist/security/audit-log.js.map +1 -0
- package/dist/security/circuit-breaker.d.ts +29 -0
- package/dist/security/circuit-breaker.js +114 -0
- package/dist/security/circuit-breaker.js.map +1 -0
- package/dist/security/domain-policy.d.ts +29 -0
- package/dist/security/domain-policy.js +96 -0
- package/dist/security/domain-policy.js.map +1 -0
- package/dist/security/human-approval.d.ts +20 -0
- package/dist/security/human-approval.js +150 -0
- package/dist/security/human-approval.js.map +1 -0
- package/dist/security/idpi-scanner.d.ts +20 -0
- package/dist/security/idpi-scanner.js +102 -0
- package/dist/security/idpi-scanner.js.map +1 -0
- package/dist/security/kill-switch.d.ts +51 -0
- package/dist/security/kill-switch.js +103 -0
- package/dist/security/kill-switch.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +30 -0
- package/dist/security/rate-limiter.js +70 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/security/screenshot-redaction.d.ts +42 -0
- package/dist/security/screenshot-redaction.js +134 -0
- package/dist/security/screenshot-redaction.js.map +1 -0
- package/dist/security/tab-ownership.d.ts +46 -0
- package/dist/security/tab-ownership.js +85 -0
- package/dist/security/tab-ownership.js.map +1 -0
- package/dist/server.d.ts +53 -0
- package/dist/server.js +347 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/clipboard.d.ts +15 -0
- package/dist/tools/clipboard.js +128 -0
- package/dist/tools/clipboard.js.map +1 -0
- package/dist/tools/compound.d.ts +68 -0
- package/dist/tools/compound.js +491 -0
- package/dist/tools/compound.js.map +1 -0
- package/dist/tools/extraction.d.ts +26 -0
- package/dist/tools/extraction.js +414 -0
- package/dist/tools/extraction.js.map +1 -0
- package/dist/tools/frames.d.ts +22 -0
- package/dist/tools/frames.js +165 -0
- package/dist/tools/frames.js.map +1 -0
- package/dist/tools/interaction.d.ts +30 -0
- package/dist/tools/interaction.js +651 -0
- package/dist/tools/interaction.js.map +1 -0
- package/dist/tools/navigation.d.ts +41 -0
- package/dist/tools/navigation.js +316 -0
- package/dist/tools/navigation.js.map +1 -0
- package/dist/tools/network.d.ts +27 -0
- package/dist/tools/network.js +721 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/performance.d.ts +16 -0
- package/dist/tools/performance.js +240 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/tools/permissions.d.ts +25 -0
- package/dist/tools/permissions.js +308 -0
- package/dist/tools/permissions.js.map +1 -0
- package/dist/tools/service-workers.d.ts +15 -0
- package/dist/tools/service-workers.js +136 -0
- package/dist/tools/service-workers.js.map +1 -0
- package/dist/tools/shadow.d.ts +21 -0
- package/dist/tools/shadow.js +126 -0
- package/dist/tools/shadow.js.map +1 -0
- package/dist/tools/storage.d.ts +30 -0
- package/dist/tools/storage.js +679 -0
- package/dist/tools/storage.js.map +1 -0
- package/dist/tools/structured-extraction.d.ts +22 -0
- package/dist/tools/structured-extraction.js +433 -0
- package/dist/tools/structured-extraction.js.map +1 -0
- package/dist/tools/wait.d.ts +18 -0
- package/dist/tools/wait.js +182 -0
- package/dist/tools/wait.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/extension/background.js +294 -0
- package/extension/content-isolated.js +80 -0
- package/extension/content-main.js +310 -0
- package/extension/icons/icon-128.png +0 -0
- package/extension/icons/icon-48.png +0 -0
- package/extension/icons/icon-96.png +0 -0
- package/extension/manifest.json +39 -0
- package/hooks/session-end.sh +67 -0
- package/hooks/session-start.sh +66 -0
- package/package.json +46 -0
- package/scripts/build-extension.sh +135 -0
- package/scripts/postinstall.sh +91 -0
- package/scripts/preuninstall.sh +25 -0
- package/scripts/update-daemon.sh +62 -0
- package/skills/safari-pilot/SKILL.md +157 -0
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
// ── Constants ────────────────────────────────────────────────────────────────
|
|
2
|
+
const WAIT_NAVIGATE_MS = 1000;
|
|
3
|
+
const DEFAULT_POLL_INTERVAL_MS = 1000;
|
|
4
|
+
const DEFAULT_MAX_CHECKS = 10;
|
|
5
|
+
const DEFAULT_MAX_PAGES = 5;
|
|
6
|
+
export class CompoundTools {
|
|
7
|
+
engine;
|
|
8
|
+
constructor(engine) {
|
|
9
|
+
this.engine = engine;
|
|
10
|
+
}
|
|
11
|
+
// ── Public API ──────────────────────────────────────────────────────────────
|
|
12
|
+
getDefinitions() {
|
|
13
|
+
return [
|
|
14
|
+
{
|
|
15
|
+
name: 'safari_test_flow',
|
|
16
|
+
description: 'Execute a sequence of steps (navigate, click, fill, wait, assert) on a page ' +
|
|
17
|
+
'and verify assertions at each step. Returns pass/fail status with per-step results.',
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {
|
|
21
|
+
tabUrl: { type: 'string', description: 'Current URL of the tab to test in' },
|
|
22
|
+
steps: {
|
|
23
|
+
type: 'array',
|
|
24
|
+
description: 'Ordered list of steps to execute',
|
|
25
|
+
items: {
|
|
26
|
+
type: 'object',
|
|
27
|
+
properties: {
|
|
28
|
+
action: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
enum: ['navigate', 'click', 'fill', 'wait', 'assert'],
|
|
31
|
+
},
|
|
32
|
+
selector: { type: 'string', description: 'CSS selector for click/fill/assert steps' },
|
|
33
|
+
value: { type: 'string', description: 'URL for navigate, text for fill, ms for wait' },
|
|
34
|
+
assert: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
type: { type: 'string', enum: ['text', 'element', 'url'] },
|
|
38
|
+
expected: { type: 'string' },
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
required: ['action'],
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
required: ['tabUrl', 'steps'],
|
|
47
|
+
},
|
|
48
|
+
requirements: {},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'safari_monitor_page',
|
|
52
|
+
description: 'Watch a page for changes by polling at an interval. Can monitor DOM mutations, ' +
|
|
53
|
+
'text content changes, attribute changes, or network requests. Returns detected diffs.',
|
|
54
|
+
inputSchema: {
|
|
55
|
+
type: 'object',
|
|
56
|
+
properties: {
|
|
57
|
+
tabUrl: { type: 'string', description: 'URL of the tab to monitor' },
|
|
58
|
+
watch: {
|
|
59
|
+
type: 'string',
|
|
60
|
+
enum: ['dom', 'text', 'attribute', 'network'],
|
|
61
|
+
description: 'What to watch for changes',
|
|
62
|
+
},
|
|
63
|
+
selector: { type: 'string', description: 'CSS selector to scope monitoring (optional)' },
|
|
64
|
+
interval: {
|
|
65
|
+
type: 'number',
|
|
66
|
+
description: 'Poll interval in milliseconds (default 1000)',
|
|
67
|
+
default: 1000,
|
|
68
|
+
},
|
|
69
|
+
maxChecks: {
|
|
70
|
+
type: 'number',
|
|
71
|
+
description: 'Maximum number of poll checks before stopping (default 10)',
|
|
72
|
+
default: 10,
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
required: ['tabUrl', 'watch'],
|
|
76
|
+
},
|
|
77
|
+
requirements: {},
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'safari_paginate_scrape',
|
|
81
|
+
description: 'Follow pagination through a multi-page result set, extracting data from each page. ' +
|
|
82
|
+
'Runs extractScript on each page, then clicks the nextSelector to advance. ' +
|
|
83
|
+
'Returns all collected data with page URLs.',
|
|
84
|
+
inputSchema: {
|
|
85
|
+
type: 'object',
|
|
86
|
+
properties: {
|
|
87
|
+
tabUrl: { type: 'string', description: 'URL of the first page' },
|
|
88
|
+
extractScript: {
|
|
89
|
+
type: 'string',
|
|
90
|
+
description: 'JavaScript to run on each page. Must return the data to collect.',
|
|
91
|
+
},
|
|
92
|
+
nextSelector: {
|
|
93
|
+
type: 'string',
|
|
94
|
+
description: 'CSS selector for the "next page" button or link',
|
|
95
|
+
},
|
|
96
|
+
maxPages: {
|
|
97
|
+
type: 'number',
|
|
98
|
+
description: 'Maximum number of pages to scrape (default 5)',
|
|
99
|
+
default: 5,
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
required: ['tabUrl', 'extractScript', 'nextSelector'],
|
|
103
|
+
},
|
|
104
|
+
requirements: {},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'safari_media_control',
|
|
108
|
+
description: 'Control media playback (video/audio) on a page. Supports play, pause, mute, ' +
|
|
109
|
+
'unmute, seek to a time, and setting playback speed. Returns current media state.',
|
|
110
|
+
inputSchema: {
|
|
111
|
+
type: 'object',
|
|
112
|
+
properties: {
|
|
113
|
+
tabUrl: { type: 'string', description: 'URL of the tab containing the media' },
|
|
114
|
+
action: {
|
|
115
|
+
type: 'string',
|
|
116
|
+
enum: ['play', 'pause', 'mute', 'unmute', 'seek', 'speed'],
|
|
117
|
+
description: 'Playback control action to execute',
|
|
118
|
+
},
|
|
119
|
+
selector: {
|
|
120
|
+
type: 'string',
|
|
121
|
+
description: 'CSS selector for a specific video/audio element (default: first on page)',
|
|
122
|
+
},
|
|
123
|
+
value: {
|
|
124
|
+
type: 'number',
|
|
125
|
+
description: 'Seek time in seconds (for seek), or speed multiplier (for speed)',
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
required: ['tabUrl', 'action'],
|
|
129
|
+
},
|
|
130
|
+
requirements: {},
|
|
131
|
+
},
|
|
132
|
+
];
|
|
133
|
+
}
|
|
134
|
+
getHandler(name) {
|
|
135
|
+
switch (name) {
|
|
136
|
+
case 'safari_test_flow':
|
|
137
|
+
return (p) => this.handleTestFlow(p);
|
|
138
|
+
case 'safari_monitor_page':
|
|
139
|
+
return (p) => this.handleMonitorPage(p);
|
|
140
|
+
case 'safari_paginate_scrape':
|
|
141
|
+
return (p) => this.handlePaginateScrape(p);
|
|
142
|
+
case 'safari_media_control':
|
|
143
|
+
return (p) => this.handleMediaControl(p);
|
|
144
|
+
default:
|
|
145
|
+
throw new Error(`CompoundTools: unknown tool "${name}"`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// ── Handlers ────────────────────────────────────────────────────────────────
|
|
149
|
+
async handleTestFlow(params) {
|
|
150
|
+
const start = Date.now();
|
|
151
|
+
const tabUrl = params['tabUrl'];
|
|
152
|
+
const steps = params['steps'];
|
|
153
|
+
const stepResults = [];
|
|
154
|
+
let passed = true;
|
|
155
|
+
let failedAt;
|
|
156
|
+
for (let i = 0; i < steps.length; i++) {
|
|
157
|
+
const step = steps[i];
|
|
158
|
+
let stepPassed = true;
|
|
159
|
+
let result = 'ok';
|
|
160
|
+
try {
|
|
161
|
+
switch (step.action) {
|
|
162
|
+
case 'navigate': {
|
|
163
|
+
const url = step.value ?? '';
|
|
164
|
+
const script = this.engine.buildNavigateScript(url);
|
|
165
|
+
const res = await this.engine.execute(script);
|
|
166
|
+
if (!res.ok) {
|
|
167
|
+
stepPassed = false;
|
|
168
|
+
result = res.error?.message ?? 'navigation failed';
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
await sleep(WAIT_NAVIGATE_MS);
|
|
172
|
+
}
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
case 'click': {
|
|
176
|
+
const clickJs = `
|
|
177
|
+
var el = document.querySelector(${JSON.stringify(step.selector ?? '')});
|
|
178
|
+
if (!el) throw new Error('Element not found: ${step.selector}');
|
|
179
|
+
el.click();
|
|
180
|
+
return 'clicked';
|
|
181
|
+
`;
|
|
182
|
+
const res = await this.engine.executeJsInTab(tabUrl, clickJs);
|
|
183
|
+
if (!res.ok) {
|
|
184
|
+
stepPassed = false;
|
|
185
|
+
result = res.error?.message ?? 'click failed';
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
result = res.value ?? 'clicked';
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case 'fill': {
|
|
193
|
+
const fillJs = `
|
|
194
|
+
var el = document.querySelector(${JSON.stringify(step.selector ?? '')});
|
|
195
|
+
if (!el) throw new Error('Element not found: ${step.selector}');
|
|
196
|
+
el.value = ${JSON.stringify(step.value ?? '')};
|
|
197
|
+
el.dispatchEvent(new Event('input', {bubbles: true}));
|
|
198
|
+
el.dispatchEvent(new Event('change', {bubbles: true}));
|
|
199
|
+
return 'filled';
|
|
200
|
+
`;
|
|
201
|
+
const res = await this.engine.executeJsInTab(tabUrl, fillJs);
|
|
202
|
+
if (!res.ok) {
|
|
203
|
+
stepPassed = false;
|
|
204
|
+
result = res.error?.message ?? 'fill failed';
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
result = res.value ?? 'filled';
|
|
208
|
+
}
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
case 'wait': {
|
|
212
|
+
const ms = parseInt(step.value ?? '500', 10);
|
|
213
|
+
await sleep(isNaN(ms) ? 500 : ms);
|
|
214
|
+
result = `waited ${ms}ms`;
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
case 'assert': {
|
|
218
|
+
const assertion = step.assert;
|
|
219
|
+
if (!assertion) {
|
|
220
|
+
result = 'no assertion defined';
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
if (assertion.type === 'url') {
|
|
224
|
+
const urlJs = 'return location.href';
|
|
225
|
+
const res = await this.engine.executeJsInTab(tabUrl, urlJs);
|
|
226
|
+
const actual = res.value ?? '';
|
|
227
|
+
if (!actual.includes(assertion.expected)) {
|
|
228
|
+
stepPassed = false;
|
|
229
|
+
result = `url assertion failed: expected "${assertion.expected}" in "${actual}"`;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
result = `url ok: ${actual}`;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else if (assertion.type === 'text') {
|
|
236
|
+
const textJs = `
|
|
237
|
+
var el = ${step.selector
|
|
238
|
+
? `document.querySelector(${JSON.stringify(step.selector)})`
|
|
239
|
+
: 'document.body'};
|
|
240
|
+
if (!el) throw new Error('Element not found');
|
|
241
|
+
return el.textContent || '';
|
|
242
|
+
`;
|
|
243
|
+
const res = await this.engine.executeJsInTab(tabUrl, textJs);
|
|
244
|
+
const actual = res.value ?? '';
|
|
245
|
+
if (!actual.includes(assertion.expected)) {
|
|
246
|
+
stepPassed = false;
|
|
247
|
+
result = `text assertion failed: expected "${assertion.expected}" in content`;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
result = `text ok`;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else if (assertion.type === 'element') {
|
|
254
|
+
const elJs = `
|
|
255
|
+
var el = document.querySelector(${JSON.stringify(assertion.expected)});
|
|
256
|
+
return el ? 'found' : 'not found';
|
|
257
|
+
`;
|
|
258
|
+
const res = await this.engine.executeJsInTab(tabUrl, elJs);
|
|
259
|
+
if (res.value !== 'found') {
|
|
260
|
+
stepPassed = false;
|
|
261
|
+
result = `element assertion failed: "${assertion.expected}" not found`;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
result = `element found: ${assertion.expected}`;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (err) {
|
|
272
|
+
stepPassed = false;
|
|
273
|
+
result = err instanceof Error ? err.message : String(err);
|
|
274
|
+
}
|
|
275
|
+
stepResults.push({ step: i + 1, result, passed: stepPassed });
|
|
276
|
+
if (!stepPassed) {
|
|
277
|
+
passed = false;
|
|
278
|
+
failedAt = i + 1;
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const data = { passed, steps: stepResults };
|
|
283
|
+
if (failedAt !== undefined)
|
|
284
|
+
data.failedAt = failedAt;
|
|
285
|
+
return {
|
|
286
|
+
content: [{ type: 'text', text: JSON.stringify(data) }],
|
|
287
|
+
metadata: { engine: 'applescript', degraded: !passed, latencyMs: Date.now() - start },
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
async handleMonitorPage(params) {
|
|
291
|
+
const start = Date.now();
|
|
292
|
+
const tabUrl = params['tabUrl'];
|
|
293
|
+
const watch = params['watch'];
|
|
294
|
+
const selector = params['selector'];
|
|
295
|
+
const interval = typeof params['interval'] === 'number' ? params['interval'] : DEFAULT_POLL_INTERVAL_MS;
|
|
296
|
+
const maxChecks = typeof params['maxChecks'] === 'number' ? params['maxChecks'] : DEFAULT_MAX_CHECKS;
|
|
297
|
+
const snapshotJs = buildSnapshotScript(watch, selector);
|
|
298
|
+
const changes = [];
|
|
299
|
+
// Take initial snapshot
|
|
300
|
+
const initialRes = await this.engine.executeJsInTab(tabUrl, snapshotJs);
|
|
301
|
+
let previousSnapshot = initialRes.value ?? '';
|
|
302
|
+
for (let check = 1; check <= maxChecks; check++) {
|
|
303
|
+
await sleep(interval);
|
|
304
|
+
const res = await this.engine.executeJsInTab(tabUrl, snapshotJs);
|
|
305
|
+
const currentSnapshot = res.value ?? '';
|
|
306
|
+
if (currentSnapshot !== previousSnapshot) {
|
|
307
|
+
changes.push({
|
|
308
|
+
check,
|
|
309
|
+
timestamp: new Date().toISOString(),
|
|
310
|
+
diff: buildDiff(previousSnapshot, currentSnapshot),
|
|
311
|
+
});
|
|
312
|
+
previousSnapshot = currentSnapshot;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const data = {
|
|
316
|
+
changes,
|
|
317
|
+
checksPerformed: maxChecks,
|
|
318
|
+
finalSnapshot: previousSnapshot,
|
|
319
|
+
};
|
|
320
|
+
return {
|
|
321
|
+
content: [{ type: 'text', text: JSON.stringify(data) }],
|
|
322
|
+
metadata: { engine: 'applescript', degraded: false, latencyMs: Date.now() - start },
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
async handlePaginateScrape(params) {
|
|
326
|
+
const start = Date.now();
|
|
327
|
+
const tabUrl = params['tabUrl'];
|
|
328
|
+
const extractScript = params['extractScript'];
|
|
329
|
+
const nextSelector = params['nextSelector'];
|
|
330
|
+
const maxPages = typeof params['maxPages'] === 'number' ? params['maxPages'] : DEFAULT_MAX_PAGES;
|
|
331
|
+
const pages = [];
|
|
332
|
+
let currentUrl = tabUrl;
|
|
333
|
+
for (let pageNum = 1; pageNum <= maxPages; pageNum++) {
|
|
334
|
+
// Extract data from current page
|
|
335
|
+
const extractRes = await this.engine.executeJsInTab(currentUrl, extractScript);
|
|
336
|
+
let pageData = extractRes.value ?? null;
|
|
337
|
+
// Try to parse if it looks like JSON
|
|
338
|
+
if (typeof pageData === 'string') {
|
|
339
|
+
try {
|
|
340
|
+
pageData = JSON.parse(pageData);
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// keep as string
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
pages.push({ pageNum, url: currentUrl, data: pageData });
|
|
347
|
+
// Check if there's a next page
|
|
348
|
+
const hasNextJs = `
|
|
349
|
+
var el = document.querySelector(${JSON.stringify(nextSelector)});
|
|
350
|
+
return el ? 'found' : 'not found';
|
|
351
|
+
`;
|
|
352
|
+
const hasNextRes = await this.engine.executeJsInTab(currentUrl, hasNextJs);
|
|
353
|
+
if (hasNextRes.value !== 'found') {
|
|
354
|
+
// No next button — stop pagination
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
if (pageNum < maxPages) {
|
|
358
|
+
// Click next and wait for navigation
|
|
359
|
+
const clickNextJs = `
|
|
360
|
+
var el = document.querySelector(${JSON.stringify(nextSelector)});
|
|
361
|
+
if (!el) throw new Error('Next selector not found');
|
|
362
|
+
el.click();
|
|
363
|
+
return 'clicked';
|
|
364
|
+
`;
|
|
365
|
+
const clickRes = await this.engine.executeJsInTab(currentUrl, clickNextJs);
|
|
366
|
+
if (!clickRes.ok)
|
|
367
|
+
break;
|
|
368
|
+
await sleep(WAIT_NAVIGATE_MS);
|
|
369
|
+
// Update current URL after navigation
|
|
370
|
+
const urlRes = await this.engine.executeJsInTab(currentUrl, 'return location.href');
|
|
371
|
+
currentUrl = urlRes.value ?? currentUrl;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
const data = { pages, totalPages: pages.length };
|
|
375
|
+
return {
|
|
376
|
+
content: [{ type: 'text', text: JSON.stringify(data) }],
|
|
377
|
+
metadata: { engine: 'applescript', degraded: false, latencyMs: Date.now() - start },
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
async handleMediaControl(params) {
|
|
381
|
+
const start = Date.now();
|
|
382
|
+
const tabUrl = params['tabUrl'];
|
|
383
|
+
const action = params['action'];
|
|
384
|
+
const selector = params['selector'];
|
|
385
|
+
const value = params['value'];
|
|
386
|
+
const selectorExpr = selector
|
|
387
|
+
? `document.querySelector(${JSON.stringify(selector)})`
|
|
388
|
+
: `document.querySelector('video, audio')`;
|
|
389
|
+
const controlJs = buildMediaControlScript(selectorExpr, action, value);
|
|
390
|
+
const res = await this.engine.executeJsInTab(tabUrl, controlJs);
|
|
391
|
+
if (!res.ok) {
|
|
392
|
+
return {
|
|
393
|
+
content: [{ type: 'text', text: JSON.stringify({ error: res.error?.message ?? 'Media control failed' }) }],
|
|
394
|
+
metadata: { engine: 'applescript', degraded: true, latencyMs: Date.now() - start },
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
let state;
|
|
398
|
+
try {
|
|
399
|
+
const parsed = JSON.parse(res.value ?? '{}');
|
|
400
|
+
state = parsed;
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
state = {
|
|
404
|
+
action,
|
|
405
|
+
currentTime: 0,
|
|
406
|
+
duration: 0,
|
|
407
|
+
paused: true,
|
|
408
|
+
muted: false,
|
|
409
|
+
volume: 1,
|
|
410
|
+
playbackRate: 1,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
return {
|
|
414
|
+
content: [{ type: 'text', text: JSON.stringify(state) }],
|
|
415
|
+
metadata: { engine: 'applescript', degraded: false, latencyMs: Date.now() - start },
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// ── Module-level helpers ─────────────────────────────────────────────────────
|
|
420
|
+
function sleep(ms) {
|
|
421
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
422
|
+
}
|
|
423
|
+
function buildSnapshotScript(watch, selector) {
|
|
424
|
+
const targetExpr = selector
|
|
425
|
+
? `document.querySelector(${JSON.stringify(selector)})`
|
|
426
|
+
: `document.body`;
|
|
427
|
+
switch (watch) {
|
|
428
|
+
case 'text':
|
|
429
|
+
return `
|
|
430
|
+
var el = ${targetExpr};
|
|
431
|
+
return el ? (el.textContent || '') : '';
|
|
432
|
+
`;
|
|
433
|
+
case 'attribute':
|
|
434
|
+
return `
|
|
435
|
+
var el = ${targetExpr};
|
|
436
|
+
if (!el) return '{}';
|
|
437
|
+
var attrs = {};
|
|
438
|
+
for (var i = 0; i < el.attributes.length; i++) {
|
|
439
|
+
attrs[el.attributes[i].name] = el.attributes[i].value;
|
|
440
|
+
}
|
|
441
|
+
return JSON.stringify(attrs);
|
|
442
|
+
`;
|
|
443
|
+
case 'network':
|
|
444
|
+
// Snapshot performance entries as a proxy for network activity
|
|
445
|
+
return `
|
|
446
|
+
var entries = performance.getEntriesByType('resource');
|
|
447
|
+
return JSON.stringify(entries.map(function(e) { return {name: e.name, duration: e.duration}; }));
|
|
448
|
+
`;
|
|
449
|
+
case 'dom':
|
|
450
|
+
default:
|
|
451
|
+
return `
|
|
452
|
+
var el = ${targetExpr};
|
|
453
|
+
return el ? el.innerHTML : '';
|
|
454
|
+
`;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
function buildDiff(prev, current) {
|
|
458
|
+
if (prev === current)
|
|
459
|
+
return '(no change)';
|
|
460
|
+
const prevLen = prev.length;
|
|
461
|
+
const curLen = current.length;
|
|
462
|
+
return `content changed (${prevLen} -> ${curLen} chars)`;
|
|
463
|
+
}
|
|
464
|
+
function buildMediaControlScript(selectorExpr, action, value) {
|
|
465
|
+
const actionCode = (() => {
|
|
466
|
+
switch (action) {
|
|
467
|
+
case 'play': return 'el.play();';
|
|
468
|
+
case 'pause': return 'el.pause();';
|
|
469
|
+
case 'mute': return 'el.muted = true;';
|
|
470
|
+
case 'unmute': return 'el.muted = false;';
|
|
471
|
+
case 'seek': return `el.currentTime = ${value ?? 0};`;
|
|
472
|
+
case 'speed': return `el.playbackRate = ${value ?? 1};`;
|
|
473
|
+
default: return '';
|
|
474
|
+
}
|
|
475
|
+
})();
|
|
476
|
+
return `
|
|
477
|
+
var el = ${selectorExpr};
|
|
478
|
+
if (!el) throw new Error('No media element found');
|
|
479
|
+
${actionCode}
|
|
480
|
+
return JSON.stringify({
|
|
481
|
+
action: ${JSON.stringify(action)},
|
|
482
|
+
currentTime: el.currentTime,
|
|
483
|
+
duration: el.duration || 0,
|
|
484
|
+
paused: el.paused,
|
|
485
|
+
muted: el.muted,
|
|
486
|
+
volume: el.volume,
|
|
487
|
+
playbackRate: el.playbackRate
|
|
488
|
+
});
|
|
489
|
+
`;
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=compound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compound.js","sourceRoot":"","sources":["../../src/tools/compound.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AppleScriptEngine } from '../engines/applescript.js';
|
|
2
|
+
import type { ToolResponse, ToolRequirements } from '../types.js';
|
|
3
|
+
export interface ToolDefinition {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: Record<string, unknown>;
|
|
7
|
+
requirements: ToolRequirements;
|
|
8
|
+
}
|
|
9
|
+
type Handler = (params: Record<string, unknown>) => Promise<ToolResponse>;
|
|
10
|
+
export declare class ExtractionTools {
|
|
11
|
+
private engine;
|
|
12
|
+
private handlers;
|
|
13
|
+
constructor(engine: AppleScriptEngine);
|
|
14
|
+
private registerHandlers;
|
|
15
|
+
getDefinitions(): ToolDefinition[];
|
|
16
|
+
getHandler(name: string): Handler | undefined;
|
|
17
|
+
private handleSnapshot;
|
|
18
|
+
private handleGetText;
|
|
19
|
+
private handleGetHtml;
|
|
20
|
+
private handleGetAttribute;
|
|
21
|
+
private handleEvaluate;
|
|
22
|
+
private handleTakeScreenshot;
|
|
23
|
+
private handleGetConsoleMessages;
|
|
24
|
+
private makeResponse;
|
|
25
|
+
}
|
|
26
|
+
export {};
|