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.
Files changed (86) hide show
  1. package/bin/Safari Pilot.app/Contents/CodeResources +0 -0
  2. package/bin/Safari Pilot.app/Contents/Info.plist +2 -2
  3. package/bin/Safari Pilot.app/Contents/MacOS/Safari Pilot +0 -0
  4. package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Info.plist +2 -2
  5. package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/MacOS/Safari Pilot Extension +0 -0
  6. package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Resources/background.js +158 -0
  7. package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/Resources/manifest.json +19 -7
  8. package/bin/Safari Pilot.app/Contents/PlugIns/Safari Pilot Extension.appex/Contents/_CodeSignature/CodeResources +4 -4
  9. package/bin/Safari Pilot.app/Contents/Resources/Base.lproj/Main.storyboardc/Info.plist +0 -0
  10. package/bin/Safari Pilot.app/Contents/Resources/Base.lproj/Main.storyboardc/MainMenu.nib +0 -0
  11. package/bin/Safari Pilot.app/Contents/Resources/Base.lproj/Main.storyboardc/NSWindowController-B8D-0N-5wS.nib +0 -0
  12. package/bin/Safari Pilot.app/Contents/_CodeSignature/CodeResources +7 -7
  13. package/bin/Safari Pilot.zip +0 -0
  14. package/bin/SafariPilotd +0 -0
  15. package/dist/aria.js +4 -0
  16. package/dist/aria.js.map +1 -1
  17. package/dist/config.d.ts +6 -0
  18. package/dist/config.js +9 -0
  19. package/dist/config.js.map +1 -1
  20. package/dist/discovery/recipe-miner.d.ts +13 -0
  21. package/dist/discovery/recipe-miner.js +71 -0
  22. package/dist/discovery/recipe-miner.js.map +1 -0
  23. package/dist/discovery/tool-index.d.ts +18 -0
  24. package/dist/discovery/tool-index.js +52 -0
  25. package/dist/discovery/tool-index.js.map +1 -0
  26. package/dist/errors.d.ts +18 -0
  27. package/dist/errors.js +27 -0
  28. package/dist/errors.js.map +1 -1
  29. package/dist/locator.d.ts +80 -0
  30. package/dist/locator.js +324 -8
  31. package/dist/locator.js.map +1 -1
  32. package/dist/security/human-approval.d.ts +7 -0
  33. package/dist/security/human-approval.js +21 -0
  34. package/dist/security/human-approval.js.map +1 -1
  35. package/dist/security/selector-pack-validator.d.ts +4 -0
  36. package/dist/security/selector-pack-validator.js +32 -0
  37. package/dist/security/selector-pack-validator.js.map +1 -0
  38. package/dist/server.d.ts +13 -0
  39. package/dist/server.js +94 -1
  40. package/dist/server.js.map +1 -1
  41. package/dist/skills/registry.d.ts +22 -0
  42. package/dist/skills/registry.js +69 -0
  43. package/dist/skills/registry.js.map +1 -0
  44. package/dist/skills/runner.d.ts +11 -0
  45. package/dist/skills/runner.js +72 -0
  46. package/dist/skills/runner.js.map +1 -0
  47. package/dist/tools/compound.js +1 -3
  48. package/dist/tools/compound.js.map +1 -1
  49. package/dist/tools/downloads.js +1 -9
  50. package/dist/tools/downloads.js.map +1 -1
  51. package/dist/tools/extraction.d.ts +1 -0
  52. package/dist/tools/extraction.js +135 -15
  53. package/dist/tools/extraction.js.map +1 -1
  54. package/dist/tools/frames.js +2 -6
  55. package/dist/tools/frames.js.map +1 -1
  56. package/dist/tools/interaction.js +47 -42
  57. package/dist/tools/interaction.js.map +1 -1
  58. package/dist/tools/navigation.js +16 -12
  59. package/dist/tools/navigation.js.map +1 -1
  60. package/dist/tools/network.js +7 -24
  61. package/dist/tools/network.js.map +1 -1
  62. package/dist/tools/selector-pack.d.ts +23 -0
  63. package/dist/tools/selector-pack.js +96 -0
  64. package/dist/tools/selector-pack.js.map +1 -0
  65. package/dist/tools/shadow.js +2 -4
  66. package/dist/tools/shadow.js.map +1 -1
  67. package/dist/tools/skills.d.ts +20 -0
  68. package/dist/tools/skills.js +71 -0
  69. package/dist/tools/skills.js.map +1 -0
  70. package/dist/tools/storage.js +9 -24
  71. package/dist/tools/storage.js.map +1 -1
  72. package/dist/tools/structured-extraction.js +5 -13
  73. package/dist/tools/structured-extraction.js.map +1 -1
  74. package/dist/tools/tool-search.d.ts +20 -0
  75. package/dist/tools/tool-search.js +54 -0
  76. package/dist/tools/tool-search.js.map +1 -0
  77. package/dist/tools/wait.js +3 -3
  78. package/dist/tools/wait.js.map +1 -1
  79. package/dist/types.d.ts +9 -0
  80. package/extension/background.js +158 -0
  81. package/extension/manifest.json +19 -7
  82. package/package.json +8 -4
  83. package/safari-pilot.config.json +4 -0
  84. package/skills/login.SKILL.md +27 -0
  85. package/skills/paginate-and-scrape.SKILL.md +21 -0
  86. package/skills/robust-form-fill.SKILL.md +22 -0
@@ -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>
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>202605041322</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>
@@ -19,13 +19,13 @@
19
19
  <key>CFBundlePackageType</key>
20
20
  <string>XPC!</string>
21
21
  <key>CFBundleShortVersionString</key>
22
- <string>0.1.26</string>
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>202605041322</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>
@@ -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.26",
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": ["<all_urls>"],
21
+ "host_permissions": [
22
+ "<all_urls>"
23
+ ],
22
24
  "background": {
23
- "scripts": ["background.js"],
25
+ "scripts": [
26
+ "background.js"
27
+ ],
24
28
  "persistent": false
25
29
  },
26
30
  "content_scripts": [
27
31
  {
28
- "matches": ["<all_urls>"],
29
- "js": ["content-isolated.js"],
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": ["<all_urls>"],
36
- "js": ["content-main.js"],
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
- VVoUQUL6NmTSxOQi5afDcjfUj3w=
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
- S4Nu7INECPB48f0ML2QiGRBD4So=
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
- 9qWWZLXyRSwwAlwqPsjj73j67yUq2+idQL3rNYamTKM=
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
- TfppYYdRaAkLQvvjv55PaoZgk9fqDhv+SaB76twD7YE=
132
+ mrfYAmMwhQqkNTyZU2dzeThoyxd2hZYHwPgFKaNKpxE=
133
133
  </data>
134
134
  </dict>
135
135
  <key>Resources/native/SafariWebExtensionHandler.swift</key>
@@ -18,15 +18,15 @@
18
18
  </data>
19
19
  <key>Resources/Base.lproj/Main.storyboardc/Info.plist</key>
20
20
  <data>
21
- M0H5hu+bc5UZELaV4l5z060HRDY=
21
+ E7+ia1hClIvypqZ7fpu0ykYY1Jo=
22
22
  </data>
23
23
  <key>Resources/Base.lproj/Main.storyboardc/MainMenu.nib</key>
24
24
  <data>
25
- y67INuRPS9fMZDiBJvDsY1Eg3oM=
25
+ ZNKXFL6TEBryOVVZLjtCzviNbTU=
26
26
  </data>
27
27
  <key>Resources/Base.lproj/Main.storyboardc/NSWindowController-B8D-0N-5wS.nib</key>
28
28
  <data>
29
- tZXLvteoWOMz3ShvkuzTFmZfPTg=
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
- p9l7BE3LhHfFFIoHNnfn9P9Wf6s=
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
- YQNhfGLp+AnDkqCprnbRovV4EVC+6xZbzB11KMsx47Q=
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
- PSI/xmQuGlfoGc8tFaB8dKlInCgm9P/qxID2pzHOpSM=
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
- hkFW6aUKc6uoPg0Bl2JRgh8jHSWcqzueFqtV6aWPC80=
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>
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
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