safari-pilot 0.1.26 → 0.1.29
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/bin/Safari Pilot.app/Contents/CodeResources +0 -0
- package/bin/Safari Pilot.app/Contents/Info.plist +2 -2
- package/bin/Safari Pilot.app/Contents/MacOS/Safari Pilot +0 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Info.plist +2 -2
- 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 +158 -0
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Resources/manifest.json +19 -7
- package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/_CodeSignature/CodeResources +4 -4
- 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/_CodeSignature/CodeResources +7 -7
- package/bin/Safari Pilot.zip +0 -0
- package/bin/SafariPilotd +0 -0
- package/dist/aria.js +4 -0
- package/dist/aria.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/discovery/recipe-miner.d.ts +13 -0
- package/dist/discovery/recipe-miner.js +71 -0
- package/dist/discovery/recipe-miner.js.map +1 -0
- package/dist/discovery/tool-index.d.ts +18 -0
- package/dist/discovery/tool-index.js +52 -0
- package/dist/discovery/tool-index.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.js +27 -0
- package/dist/errors.js.map +1 -1
- package/dist/locator.d.ts +80 -0
- package/dist/locator.js +324 -8
- package/dist/locator.js.map +1 -1
- package/dist/security/human-approval.d.ts +7 -0
- package/dist/security/human-approval.js +21 -0
- package/dist/security/human-approval.js.map +1 -1
- package/dist/security/selector-pack-validator.d.ts +4 -0
- package/dist/security/selector-pack-validator.js +32 -0
- package/dist/security/selector-pack-validator.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.js +94 -1
- package/dist/server.js.map +1 -1
- package/dist/skills/registry.d.ts +22 -0
- package/dist/skills/registry.js +69 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/runner.d.ts +11 -0
- package/dist/skills/runner.js +72 -0
- package/dist/skills/runner.js.map +1 -0
- package/dist/tools/compound.js +1 -3
- package/dist/tools/compound.js.map +1 -1
- package/dist/tools/downloads.js +1 -9
- package/dist/tools/downloads.js.map +1 -1
- package/dist/tools/extraction.d.ts +1 -0
- package/dist/tools/extraction.js +135 -15
- package/dist/tools/extraction.js.map +1 -1
- package/dist/tools/frames.js +2 -6
- package/dist/tools/frames.js.map +1 -1
- package/dist/tools/interaction.js +47 -42
- package/dist/tools/interaction.js.map +1 -1
- package/dist/tools/navigation.js +16 -12
- package/dist/tools/navigation.js.map +1 -1
- package/dist/tools/network.js +7 -24
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/selector-pack.d.ts +23 -0
- package/dist/tools/selector-pack.js +96 -0
- package/dist/tools/selector-pack.js.map +1 -0
- package/dist/tools/shadow.js +2 -4
- package/dist/tools/shadow.js.map +1 -1
- package/dist/tools/skills.d.ts +20 -0
- package/dist/tools/skills.js +71 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/storage.js +9 -24
- package/dist/tools/storage.js.map +1 -1
- package/dist/tools/structured-extraction.js +5 -13
- package/dist/tools/structured-extraction.js.map +1 -1
- package/dist/tools/tool-search.d.ts +20 -0
- package/dist/tools/tool-search.js +54 -0
- package/dist/tools/tool-search.js.map +1 -0
- package/dist/tools/wait.js +3 -3
- package/dist/tools/wait.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/extension/background.js +158 -0
- package/extension/manifest.json +19 -7
- package/package.json +8 -4
- package/safari-pilot.config.json +4 -0
- package/skills/login.SKILL.md +27 -0
- package/skills/paginate-and-scrape.SKILL.md +21 -0
- package/skills/robust-form-fill.SKILL.md +22 -0
|
Binary file
|
|
@@ -23,13 +23,13 @@
|
|
|
23
23
|
<key>CFBundlePackageType</key>
|
|
24
24
|
<string>APPL</string>
|
|
25
25
|
<key>CFBundleShortVersionString</key>
|
|
26
|
-
<string>0.1.
|
|
26
|
+
<string>0.1.29</string>
|
|
27
27
|
<key>CFBundleSupportedPlatforms</key>
|
|
28
28
|
<array>
|
|
29
29
|
<string>MacOSX</string>
|
|
30
30
|
</array>
|
|
31
31
|
<key>CFBundleVersion</key>
|
|
32
|
-
<string>
|
|
32
|
+
<string>202605060230</string>
|
|
33
33
|
<key>DTCompiler</key>
|
|
34
34
|
<string>com.apple.compilers.llvm.clang.1_0</string>
|
|
35
35
|
<key>DTPlatformBuild</key>
|
|
Binary file
|
package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Info.plist
CHANGED
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
<key>CFBundlePackageType</key>
|
|
20
20
|
<string>XPC!</string>
|
|
21
21
|
<key>CFBundleShortVersionString</key>
|
|
22
|
-
<string>0.1.
|
|
22
|
+
<string>0.1.29</string>
|
|
23
23
|
<key>CFBundleSupportedPlatforms</key>
|
|
24
24
|
<array>
|
|
25
25
|
<string>MacOSX</string>
|
|
26
26
|
</array>
|
|
27
27
|
<key>CFBundleVersion</key>
|
|
28
|
-
<string>
|
|
28
|
+
<string>202605060230</string>
|
|
29
29
|
<key>DTCompiler</key>
|
|
30
30
|
<string>com.apple.compilers.llvm.clang.1_0</string>
|
|
31
31
|
<key>DTPlatformBuild</key>
|
|
Binary file
|
|
@@ -88,6 +88,72 @@ browser.tabs.onRemoved.addListener((tabId) => {
|
|
|
88
88
|
saveTabCache();
|
|
89
89
|
});
|
|
90
90
|
|
|
91
|
+
// T79: clear tab-scoped selectorPack storage on tab close. Keys live under
|
|
92
|
+
// prefix `sp_pack_<tabId>_<name>`. Multiple listeners can be added to the
|
|
93
|
+
// same event; this one runs independently of the tab-cache listener above.
|
|
94
|
+
browser.tabs.onRemoved.addListener(async (tabId) => {
|
|
95
|
+
try {
|
|
96
|
+
const all = await browser.storage.local.get(null);
|
|
97
|
+
const toRemove = Object.keys(all).filter((k) => k.startsWith('sp_pack_' + tabId + '_'));
|
|
98
|
+
if (toRemove.length > 0) {
|
|
99
|
+
await browser.storage.local.remove(toRemove);
|
|
100
|
+
emitTrace('__cleanup__', 'selector_pack_cleared', { layer: 'extension-bg', data: { tabId, count: toRemove.length } });
|
|
101
|
+
}
|
|
102
|
+
} catch (e) {
|
|
103
|
+
emitTrace('__cleanup__', 'selector_pack_clear_failed', { layer: 'extension-bg', data: { tabId, error: e && e.message ? e.message : String(e) } });
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// T79 Cluster D: re-inject persisted packs into window.__sp_pack on every
|
|
108
|
+
// completed navigation. Runs purely from the extension-bg context — no MCP
|
|
109
|
+
// command involved. Reads sp_pack_<tabId>_<name> keys and re-injects each
|
|
110
|
+
// via the same storage-bus execute_script flow used everywhere else.
|
|
111
|
+
browser.tabs.onUpdated.addListener(async (tabId, changeInfo) => {
|
|
112
|
+
if (changeInfo.status !== 'complete') return;
|
|
113
|
+
let stored;
|
|
114
|
+
try {
|
|
115
|
+
stored = await browser.storage.local.get(null);
|
|
116
|
+
} catch (e) {
|
|
117
|
+
emitTrace('__rehydrate__', 'pack_rehydrate_storage_get_failed', { layer: 'extension-bg', data: { tabId, error: e && e.message ? e.message : String(e) } });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const prefix = 'sp_pack_' + tabId + '_';
|
|
121
|
+
const keys = Object.keys(stored).filter((k) => k.startsWith(prefix));
|
|
122
|
+
if (keys.length === 0) return;
|
|
123
|
+
for (const key of keys) {
|
|
124
|
+
const name = key.slice(prefix.length);
|
|
125
|
+
const body = stored[key];
|
|
126
|
+
if (typeof body !== 'string' || !body) continue;
|
|
127
|
+
const injectionScript =
|
|
128
|
+
'window.__sp_pack=window.__sp_pack||{};' +
|
|
129
|
+
'try{' +
|
|
130
|
+
'window.__sp_pack[' + JSON.stringify(name) + ']=new Function(\'root\',\'arg\',' + JSON.stringify(body) + ');' +
|
|
131
|
+
'return JSON.stringify({ok:true,rehydrated:true});' +
|
|
132
|
+
'}catch(e){' +
|
|
133
|
+
'return JSON.stringify({ok:false,error:e&&e.message?e.message:String(e)});' +
|
|
134
|
+
'}';
|
|
135
|
+
const rehydrateCmdId = '__rehydrate_' + tabId + '_' + name + '_' + Date.now();
|
|
136
|
+
const cmdKey = 'sp_cmd_' + rehydrateCmdId;
|
|
137
|
+
const storageCmd = {
|
|
138
|
+
commandId: rehydrateCmdId,
|
|
139
|
+
tabId,
|
|
140
|
+
method: 'execute_script',
|
|
141
|
+
params: { script: injectionScript, commandId: rehydrateCmdId },
|
|
142
|
+
timestamp: Date.now(),
|
|
143
|
+
deadline: Date.now() + 5000,
|
|
144
|
+
};
|
|
145
|
+
try {
|
|
146
|
+
await browser.storage.local.set({ [cmdKey]: storageCmd });
|
|
147
|
+
emitTrace(rehydrateCmdId, 'pack_rehydrated', { layer: 'extension-bg', data: { tabId, name } });
|
|
148
|
+
// Fire-and-forget — content-isolated picks it up, runs the injection.
|
|
149
|
+
// Cleanup the cmd key after a short delay to keep storage lean.
|
|
150
|
+
setTimeout(() => { browser.storage.local.remove([cmdKey, 'sp_result_' + rehydrateCmdId]).catch(() => {}); }, 6000);
|
|
151
|
+
} catch (e) {
|
|
152
|
+
emitTrace(rehydrateCmdId, 'pack_rehydrate_failed', { layer: 'extension-bg', data: { tabId, name, error: e && e.message ? e.message : String(e) } });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
|
|
91
157
|
// ─── HTTP IPC to daemon ─────────────────────────────────────────────────────
|
|
92
158
|
const HTTP_URL = 'http://127.0.0.1:19475';
|
|
93
159
|
|
|
@@ -477,6 +543,98 @@ async function executeCommand(cmd) {
|
|
|
477
543
|
return result;
|
|
478
544
|
}
|
|
479
545
|
|
|
546
|
+
// T79 Cluster D: selectorPack register/unregister sentinels.
|
|
547
|
+
// Pack registration writes both to (a) page-scope window.__sp_pack[name] for
|
|
548
|
+
// immediate use AND (b) browser.storage.local sp_pack_<tabId>_<name>=body for
|
|
549
|
+
// persistence across navigations. The tabs.onUpdated listener below
|
|
550
|
+
// re-injects (a) from (b) on every navigation. The existing tabs.onRemoved
|
|
551
|
+
// listener cleans up (b) on tab close.
|
|
552
|
+
//
|
|
553
|
+
// Body must be a string already validated upstream by validatePackBody (the
|
|
554
|
+
// MCP-side selector-pack tool). The extension does NOT re-validate — it
|
|
555
|
+
// trusts that ANY script that reaches this sentinel passed validation.
|
|
556
|
+
// Single source of truth on the MCP side avoids drift.
|
|
557
|
+
if (typeof cmd.script === 'string' && cmd.script.startsWith('__SP_PACK_')) {
|
|
558
|
+
const colonIdx = cmd.script.indexOf(':');
|
|
559
|
+
const sentinel = colonIdx > 0 ? cmd.script.slice(0, colonIdx) : cmd.script;
|
|
560
|
+
let parsed = {};
|
|
561
|
+
if (colonIdx > 0) {
|
|
562
|
+
try { parsed = JSON.parse(cmd.script.slice(colonIdx + 1)); }
|
|
563
|
+
catch (e) {
|
|
564
|
+
const result = { ok: false, error: { name: 'PACK_PARAM_PARSE', message: `Failed to parse pack params: ${e?.message ?? String(e)}` } };
|
|
565
|
+
await updatePendingEntry(commandId, { status: 'completed', result });
|
|
566
|
+
return result;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
const name = parsed.name;
|
|
571
|
+
const body = parsed.body;
|
|
572
|
+
if (typeof name !== 'string' || !name) {
|
|
573
|
+
const result = { ok: false, error: { name: 'PACK_INVALID_NAME', message: 'pack sentinel requires non-empty name' } };
|
|
574
|
+
await updatePendingEntry(commandId, { status: 'completed', result });
|
|
575
|
+
return result;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
const storageKey = 'sp_pack_' + tab.id + '_' + name;
|
|
579
|
+
|
|
580
|
+
if (sentinel === '__SP_PACK_REGISTER__') {
|
|
581
|
+
if (typeof body !== 'string' || !body) {
|
|
582
|
+
const result = { ok: false, error: { name: 'PACK_INVALID_BODY', message: 'pack register sentinel requires non-empty body' } };
|
|
583
|
+
await updatePendingEntry(commandId, { status: 'completed', result });
|
|
584
|
+
return result;
|
|
585
|
+
}
|
|
586
|
+
try {
|
|
587
|
+
// Persist for re-injection on navigation.
|
|
588
|
+
await browser.storage.local.set({ [storageKey]: body });
|
|
589
|
+
} catch (e) {
|
|
590
|
+
const result = { ok: false, error: { name: 'PACK_STORAGE_WRITE_FAILED', message: e?.message ?? String(e) } };
|
|
591
|
+
await updatePendingEntry(commandId, { status: 'completed', result });
|
|
592
|
+
return result;
|
|
593
|
+
}
|
|
594
|
+
// Inject into page now via the standard storage-bus execute path. The
|
|
595
|
+
// page-side evaluator (content-main.js) wraps scripts in `new
|
|
596
|
+
// Function(script)()`, so the script must use a top-level `return` —
|
|
597
|
+
// an IIFE expression statement would have its result discarded.
|
|
598
|
+
// Embed name + body via JSON.stringify so quotes / backslashes survive
|
|
599
|
+
// the round-trip without bespoke escaping.
|
|
600
|
+
const injectionScript =
|
|
601
|
+
'window.__sp_pack=window.__sp_pack||{};' +
|
|
602
|
+
'try{' +
|
|
603
|
+
'window.__sp_pack[' + JSON.stringify(name) + ']=new Function(\'root\',\'arg\',' + JSON.stringify(body) + ');' +
|
|
604
|
+
'return JSON.stringify({ok:true,name:' + JSON.stringify(name) + '});' +
|
|
605
|
+
'}catch(e){' +
|
|
606
|
+
'return JSON.stringify({ok:false,error:e&&e.message?e.message:String(e)});' +
|
|
607
|
+
'}';
|
|
608
|
+
// Replace cmd.script and fall through to the regular execute path so
|
|
609
|
+
// the inject runs through the storage-bus content-script flow.
|
|
610
|
+
cmd.script = injectionScript;
|
|
611
|
+
emitTrace(commandId, 'pack_registered', { layer: 'extension-bg', data: { tabId: tab.id, name, bodyBytes: body.length } });
|
|
612
|
+
// Fall through — the regular execute path runs `cmd.script` in-page.
|
|
613
|
+
} else if (sentinel === '__SP_PACK_UNREGISTER__') {
|
|
614
|
+
try {
|
|
615
|
+
await browser.storage.local.remove([storageKey]);
|
|
616
|
+
} catch (e) {
|
|
617
|
+
const result = { ok: false, error: { name: 'PACK_STORAGE_REMOVE_FAILED', message: e?.message ?? String(e) } };
|
|
618
|
+
await updatePendingEntry(commandId, { status: 'completed', result });
|
|
619
|
+
return result;
|
|
620
|
+
}
|
|
621
|
+
const removalScript =
|
|
622
|
+
'var __removed=false;' +
|
|
623
|
+
'if(window.__sp_pack&&window.__sp_pack[' + JSON.stringify(name) + ']){' +
|
|
624
|
+
'delete window.__sp_pack[' + JSON.stringify(name) + '];' +
|
|
625
|
+
'__removed=true;' +
|
|
626
|
+
'}' +
|
|
627
|
+
'return JSON.stringify({ok:true,removed:__removed});';
|
|
628
|
+
cmd.script = removalScript;
|
|
629
|
+
emitTrace(commandId, 'pack_unregistered', { layer: 'extension-bg', data: { tabId: tab.id, name } });
|
|
630
|
+
// Fall through — regular execute path runs the removal.
|
|
631
|
+
} else {
|
|
632
|
+
const r = { ok: false, error: { name: 'UNKNOWN_PACK_SENTINEL', message: `Unknown pack sentinel: ${sentinel}` } };
|
|
633
|
+
await updatePendingEntry(commandId, { status: 'completed', result: r });
|
|
634
|
+
return r;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
480
638
|
// T55a: validate frameId at dispatch time. Missing frame → fast-fail
|
|
481
639
|
// before any storage-bus traffic. Re-resolve frame.url so content-isolated.js's
|
|
482
640
|
// mutation guard has the authoritative value when comparing to location.href.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "Safari Pilot",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.29",
|
|
5
5
|
"description": "Native Safari automation for AI agents",
|
|
6
6
|
"permissions": [
|
|
7
7
|
"activeTab",
|
|
@@ -18,22 +18,34 @@
|
|
|
18
18
|
"content_security_policy": {
|
|
19
19
|
"extension_pages": "script-src 'self'; connect-src 'self' http://localhost:19475 http://127.0.0.1:19475"
|
|
20
20
|
},
|
|
21
|
-
"host_permissions": [
|
|
21
|
+
"host_permissions": [
|
|
22
|
+
"<all_urls>"
|
|
23
|
+
],
|
|
22
24
|
"background": {
|
|
23
|
-
"scripts": [
|
|
25
|
+
"scripts": [
|
|
26
|
+
"background.js"
|
|
27
|
+
],
|
|
24
28
|
"persistent": false
|
|
25
29
|
},
|
|
26
30
|
"content_scripts": [
|
|
27
31
|
{
|
|
28
|
-
"matches": [
|
|
29
|
-
|
|
32
|
+
"matches": [
|
|
33
|
+
"<all_urls>"
|
|
34
|
+
],
|
|
35
|
+
"js": [
|
|
36
|
+
"content-isolated.js"
|
|
37
|
+
],
|
|
30
38
|
"run_at": "document_idle",
|
|
31
39
|
"world": "ISOLATED",
|
|
32
40
|
"all_frames": true
|
|
33
41
|
},
|
|
34
42
|
{
|
|
35
|
-
"matches": [
|
|
36
|
-
|
|
43
|
+
"matches": [
|
|
44
|
+
"<all_urls>"
|
|
45
|
+
],
|
|
46
|
+
"js": [
|
|
47
|
+
"content-main.js"
|
|
48
|
+
],
|
|
37
49
|
"run_at": "document_idle",
|
|
38
50
|
"world": "MAIN",
|
|
39
51
|
"all_frames": true
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<dict>
|
|
7
7
|
<key>Resources/background.js</key>
|
|
8
8
|
<data>
|
|
9
|
-
|
|
9
|
+
S+yhMSyT4yM0o29NjtVWT9pto7E=
|
|
10
10
|
</data>
|
|
11
11
|
<key>Resources/build.config.js</key>
|
|
12
12
|
<data>
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
</data>
|
|
47
47
|
<key>Resources/manifest.json</key>
|
|
48
48
|
<data>
|
|
49
|
-
|
|
49
|
+
+aLtOWURQx+rJpvnmelFssvw6sY=
|
|
50
50
|
</data>
|
|
51
51
|
<key>Resources/native/SafariWebExtensionHandler.swift</key>
|
|
52
52
|
<data>
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
<dict>
|
|
60
60
|
<key>hash2</key>
|
|
61
61
|
<data>
|
|
62
|
-
|
|
62
|
+
wGGys1VHHjcourMlcj2w6IUjnjahEI8V1cj6WRb+/lU=
|
|
63
63
|
</data>
|
|
64
64
|
</dict>
|
|
65
65
|
<key>Resources/build.config.js</key>
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
<dict>
|
|
130
130
|
<key>hash2</key>
|
|
131
131
|
<data>
|
|
132
|
-
|
|
132
|
+
mrfYAmMwhQqkNTyZU2dzeThoyxd2hZYHwPgFKaNKpxE=
|
|
133
133
|
</data>
|
|
134
134
|
</dict>
|
|
135
135
|
<key>Resources/native/SafariWebExtensionHandler.swift</key>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -18,15 +18,15 @@
|
|
|
18
18
|
</data>
|
|
19
19
|
<key>Resources/Base.lproj/Main.storyboardc/Info.plist</key>
|
|
20
20
|
<data>
|
|
21
|
-
|
|
21
|
+
E7+ia1hClIvypqZ7fpu0ykYY1Jo=
|
|
22
22
|
</data>
|
|
23
23
|
<key>Resources/Base.lproj/Main.storyboardc/MainMenu.nib</key>
|
|
24
24
|
<data>
|
|
25
|
-
|
|
25
|
+
ZNKXFL6TEBryOVVZLjtCzviNbTU=
|
|
26
26
|
</data>
|
|
27
27
|
<key>Resources/Base.lproj/Main.storyboardc/NSWindowController-B8D-0N-5wS.nib</key>
|
|
28
28
|
<data>
|
|
29
|
-
|
|
29
|
+
B+v01Kjcwm0FLJsbuBG9NZchRD0=
|
|
30
30
|
</data>
|
|
31
31
|
<key>Resources/Base.lproj/Main.storyboardc/XfG-lQ-9wD-view-m2S-Jp-Qdl.nib</key>
|
|
32
32
|
<data>
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
<dict>
|
|
52
52
|
<key>cdhash</key>
|
|
53
53
|
<data>
|
|
54
|
-
|
|
54
|
+
NpksfTnkkjY5muDgSJktoSnJnSo=
|
|
55
55
|
</data>
|
|
56
56
|
<key>requirement</key>
|
|
57
57
|
<string>anchor apple generic and identifier "com.safari-pilot.app.Extension" and (certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = V37WLKRXUJ)</string>
|
|
@@ -81,21 +81,21 @@
|
|
|
81
81
|
<dict>
|
|
82
82
|
<key>hash2</key>
|
|
83
83
|
<data>
|
|
84
|
-
|
|
84
|
+
ofN6kk0Yg0dmJF0e6J3yaZ0HWcwDs9vk3OVOSaapviI=
|
|
85
85
|
</data>
|
|
86
86
|
</dict>
|
|
87
87
|
<key>Resources/Base.lproj/Main.storyboardc/MainMenu.nib</key>
|
|
88
88
|
<dict>
|
|
89
89
|
<key>hash2</key>
|
|
90
90
|
<data>
|
|
91
|
-
|
|
91
|
+
JutHRKOObLSCTpKJVIiQRRyzEBJKgzdTdsbgK218f2M=
|
|
92
92
|
</data>
|
|
93
93
|
</dict>
|
|
94
94
|
<key>Resources/Base.lproj/Main.storyboardc/NSWindowController-B8D-0N-5wS.nib</key>
|
|
95
95
|
<dict>
|
|
96
96
|
<key>hash2</key>
|
|
97
97
|
<data>
|
|
98
|
-
|
|
98
|
+
ZQQSp+jq0L/MX6J66senkEoiNwFY6A1DMHS63B664YA=
|
|
99
99
|
</data>
|
|
100
100
|
</dict>
|
|
101
101
|
<key>Resources/Base.lproj/Main.storyboardc/XfG-lQ-9wD-view-m2S-Jp-Qdl.nib</key>
|
package/bin/Safari Pilot.zip
CHANGED
|
Binary file
|
package/bin/SafariPilotd
CHANGED
|
Binary file
|
package/dist/aria.js
CHANGED
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
* Safe for use in `querySelector()` or tool parameters.
|
|
16
16
|
*/
|
|
17
17
|
export function buildRefSelector(ref) {
|
|
18
|
+
// T78: passthrough for fully-qualified data-sp-ref selectors so callers can
|
|
19
|
+
// hand in either the bare ref or the resolved selector form.
|
|
20
|
+
if (ref.startsWith('[data-sp-ref='))
|
|
21
|
+
return ref;
|
|
18
22
|
return '[data-sp-ref="' + ref + '"]';
|
|
19
23
|
}
|
|
20
24
|
/**
|
package/dist/aria.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aria.js","sourceRoot":"","sources":["../src/aria.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"aria.js","sourceRoot":"","sources":["../src/aria.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -31,6 +31,11 @@ export interface ExtensionConfig {
|
|
|
31
31
|
enabled: boolean;
|
|
32
32
|
killSwitchVersion: string;
|
|
33
33
|
}
|
|
34
|
+
export interface SelectorPackConfig {
|
|
35
|
+
/** T79: feature-flag for safari_register_selector / safari_unregister_selector tools.
|
|
36
|
+
* Defaults to false. JS-injection surface — only enable for trusted environments. */
|
|
37
|
+
enabled: boolean;
|
|
38
|
+
}
|
|
34
39
|
export interface SafariPilotConfig {
|
|
35
40
|
schemaVersion: string;
|
|
36
41
|
rateLimit: RateLimitConfig;
|
|
@@ -41,6 +46,7 @@ export interface SafariPilotConfig {
|
|
|
41
46
|
daemon: DaemonConfig;
|
|
42
47
|
healthCheck: HealthCheckConfig;
|
|
43
48
|
extension: ExtensionConfig;
|
|
49
|
+
selectorPack: SelectorPackConfig;
|
|
44
50
|
screenshotPolicy?: {
|
|
45
51
|
blockedPatterns?: string[];
|
|
46
52
|
};
|
package/dist/config.js
CHANGED
|
@@ -37,6 +37,9 @@ export const DEFAULT_CONFIG = {
|
|
|
37
37
|
enabled: true,
|
|
38
38
|
killSwitchVersion: '0.1.5',
|
|
39
39
|
},
|
|
40
|
+
selectorPack: {
|
|
41
|
+
enabled: false,
|
|
42
|
+
},
|
|
40
43
|
};
|
|
41
44
|
// ─── Deep merge ──────────────────────────────────────────────────────────────
|
|
42
45
|
function isPlainObject(val) {
|
|
@@ -166,6 +169,12 @@ export function loadConfig(configPath) {
|
|
|
166
169
|
// File not found or unreadable → use defaults silently
|
|
167
170
|
}
|
|
168
171
|
const merged = deepMerge(DEFAULT_CONFIG, userConfig);
|
|
172
|
+
// T79: selectorPack.enabled is a JS-injection-surface flag. Enforce strict
|
|
173
|
+
// boolean — anything other than literal `true` reverts to false (fail-safe).
|
|
174
|
+
const mergedRecord = merged;
|
|
175
|
+
const sp = mergedRecord['selectorPack'];
|
|
176
|
+
if (sp)
|
|
177
|
+
sp['enabled'] = sp['enabled'] === true;
|
|
169
178
|
validate(merged);
|
|
170
179
|
return deepFreeze(resolveConfigPaths(merged));
|
|
171
180
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface MineOptions {
|
|
2
|
+
minOccurrences: number;
|
|
3
|
+
minLength: number;
|
|
4
|
+
}
|
|
5
|
+
export interface RecipeCandidate {
|
|
6
|
+
host: string;
|
|
7
|
+
steps: Array<{
|
|
8
|
+
tool: string;
|
|
9
|
+
argSignature: string;
|
|
10
|
+
}>;
|
|
11
|
+
occurrences: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function mineRecipes(rootDir: string, opts: MineOptions): Promise<RecipeCandidate[]>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// src/discovery/recipe-miner.ts
|
|
2
|
+
// Port of Browser Use's browser-harness pattern: read execution traces,
|
|
3
|
+
// extract recurring successful tool sequences, emit candidate skills.
|
|
4
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
5
|
+
import { stat } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
export async function mineRecipes(rootDir, opts) {
|
|
8
|
+
const traces = await collectTraces(rootDir);
|
|
9
|
+
const counts = new Map();
|
|
10
|
+
for (const trace of traces) {
|
|
11
|
+
if (trace.steps.length < opts.minLength)
|
|
12
|
+
continue;
|
|
13
|
+
const key = trace.host + '|' + trace.steps.map((s) => `${s.tool}:${s.argSignature}`).join('>');
|
|
14
|
+
const existing = counts.get(key);
|
|
15
|
+
if (existing)
|
|
16
|
+
existing.occurrences++;
|
|
17
|
+
else
|
|
18
|
+
counts.set(key, { host: trace.host, steps: trace.steps, occurrences: 1 });
|
|
19
|
+
}
|
|
20
|
+
return [...counts.values()].filter((c) => c.occurrences >= opts.minOccurrences);
|
|
21
|
+
}
|
|
22
|
+
async function collectTraces(root) {
|
|
23
|
+
const out = [];
|
|
24
|
+
let entries;
|
|
25
|
+
try {
|
|
26
|
+
entries = await readdir(root);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
for (const e of entries) {
|
|
32
|
+
const p = join(root, e);
|
|
33
|
+
const s = await stat(p).catch(() => null);
|
|
34
|
+
if (!s || !s.isDirectory())
|
|
35
|
+
continue;
|
|
36
|
+
try {
|
|
37
|
+
const score = JSON.parse(await readFile(join(p, 'score.json'), 'utf8'));
|
|
38
|
+
if (!score['success'])
|
|
39
|
+
continue;
|
|
40
|
+
const traceText = await readFile(join(p, 'tool-calls.jsonl'), 'utf8');
|
|
41
|
+
const steps = traceText
|
|
42
|
+
.split('\n')
|
|
43
|
+
.filter(Boolean)
|
|
44
|
+
.map((line) => {
|
|
45
|
+
const entry = JSON.parse(line);
|
|
46
|
+
return {
|
|
47
|
+
tool: String(entry.tool),
|
|
48
|
+
argSignature: signature(entry.args),
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
const host = inferHost(traceText);
|
|
52
|
+
out.push({ host, steps });
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
/* skip incomplete run dirs */
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
function signature(args) {
|
|
61
|
+
if (!args || typeof args !== 'object')
|
|
62
|
+
return '';
|
|
63
|
+
return Object.keys(args)
|
|
64
|
+
.sort()
|
|
65
|
+
.join(',');
|
|
66
|
+
}
|
|
67
|
+
function inferHost(trace) {
|
|
68
|
+
const m = trace.match(/"url"\s*:\s*"https?:\/\/([^/"]+)/);
|
|
69
|
+
return m?.[1] ?? 'unknown';
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=recipe-miner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-miner.js","sourceRoot":"","sources":["../../src/discovery/recipe-miner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ToolEntry {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
tags?: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface ToolHit extends ToolEntry {
|
|
7
|
+
score: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class ToolIndex {
|
|
10
|
+
private entries;
|
|
11
|
+
constructor(entries: ToolEntry[]);
|
|
12
|
+
size(): number;
|
|
13
|
+
tagsFor(name: string): string[];
|
|
14
|
+
search(query: string, topK?: number): ToolHit[];
|
|
15
|
+
private inferTags;
|
|
16
|
+
private tokenize;
|
|
17
|
+
private score;
|
|
18
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// src/discovery/tool-index.ts
|
|
2
|
+
// In-memory tool index for safari_tool_search meta-tool.
|
|
3
|
+
// Keyword overlap scoring with name + tag boost.
|
|
4
|
+
export class ToolIndex {
|
|
5
|
+
entries;
|
|
6
|
+
constructor(entries) {
|
|
7
|
+
this.entries = entries.map((e) => ({
|
|
8
|
+
...e,
|
|
9
|
+
tags: e.tags ?? this.inferTags(e.name),
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
size() {
|
|
13
|
+
return this.entries.length;
|
|
14
|
+
}
|
|
15
|
+
tagsFor(name) {
|
|
16
|
+
return this.entries.find((e) => e.name === name)?.tags ?? [];
|
|
17
|
+
}
|
|
18
|
+
search(query, topK = 8) {
|
|
19
|
+
const tokens = this.tokenize(query);
|
|
20
|
+
if (tokens.length === 0)
|
|
21
|
+
return [];
|
|
22
|
+
const scored = this.entries
|
|
23
|
+
.map((e) => ({ ...e, score: this.score(tokens, e) }))
|
|
24
|
+
.filter((h) => h.score > 0);
|
|
25
|
+
scored.sort((a, b) => b.score - a.score);
|
|
26
|
+
return scored.slice(0, topK);
|
|
27
|
+
}
|
|
28
|
+
inferTags(name) {
|
|
29
|
+
const parts = name.replace(/^safari_/, '').split('_');
|
|
30
|
+
return parts[0] ? [parts[0]] : [];
|
|
31
|
+
}
|
|
32
|
+
tokenize(s) {
|
|
33
|
+
return s
|
|
34
|
+
.toLowerCase()
|
|
35
|
+
.split(/[^a-z0-9]+/)
|
|
36
|
+
.filter((t) => t.length > 1);
|
|
37
|
+
}
|
|
38
|
+
score(queryTokens, e) {
|
|
39
|
+
const haystack = (e.name + ' ' + e.description + ' ' + (e.tags ?? []).join(' ')).toLowerCase();
|
|
40
|
+
let s = 0;
|
|
41
|
+
for (const t of queryTokens) {
|
|
42
|
+
if (haystack.includes(t))
|
|
43
|
+
s += 1;
|
|
44
|
+
if (e.name.toLowerCase().includes(t))
|
|
45
|
+
s += 1; // boost name match
|
|
46
|
+
if (e.tags?.includes(t))
|
|
47
|
+
s += 0.5;
|
|
48
|
+
}
|
|
49
|
+
return s;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=tool-index.js.map
|