@weavetab/mcp 2.5.0-beta.1 → 2.5.0-beta.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.
Files changed (156) hide show
  1. package/AGENTS.md +2 -1
  2. package/ARCHITECTURE.md +6 -6
  3. package/LICENSE +1 -1
  4. package/README.md +164 -802
  5. package/SECURITY.md +33 -22
  6. package/TROUBLESHOOTING.md +3 -3
  7. package/dist/cdp/bridge.d.ts +10 -0
  8. package/dist/cdp/bridge.js +285 -78
  9. package/dist/cdp/connector.d.ts +7 -3
  10. package/dist/cdp/connector.js +196 -75
  11. package/dist/cdp/helpers.d.ts +4 -0
  12. package/dist/cdp/helpers.js +181 -0
  13. package/dist/cdp/lock.d.ts +9 -6
  14. package/dist/cdp/lock.js +72 -59
  15. package/dist/cdp/omni_broker.d.ts +2 -1
  16. package/dist/cdp/omni_broker.js +13 -7
  17. package/dist/cdp/profiles.d.ts +10 -0
  18. package/dist/cdp/profiles.js +65 -0
  19. package/dist/cdp/walker.d.ts +25 -1
  20. package/dist/cdp/walker.js +354 -7
  21. package/dist/cli/plugin.d.ts +0 -2
  22. package/dist/cli/plugin.js +51 -696
  23. package/dist/cli/updater.d.ts +1 -1
  24. package/dist/cli/updater.js +27 -7
  25. package/dist/config/loader.d.ts +33 -6
  26. package/dist/config/loader.js +174 -22
  27. package/dist/desktop/discovery.d.ts +44 -0
  28. package/dist/desktop/discovery.js +364 -0
  29. package/dist/index.js +140 -64
  30. package/dist/intelligence/marks.d.ts +36 -0
  31. package/dist/intelligence/marks.js +30 -0
  32. package/dist/intelligence/patternCompiler.d.ts +118 -0
  33. package/dist/intelligence/patternCompiler.js +259 -0
  34. package/dist/intelligence/sessionMemory.d.ts +2 -0
  35. package/dist/intelligence/sessionMemory.js +18 -8
  36. package/dist/overlay/ghost.js +2 -2
  37. package/dist/overlay/injector.js +3 -5
  38. package/dist/plugin/extension_bridge.d.ts +40 -0
  39. package/dist/plugin/extension_bridge.js +158 -0
  40. package/dist/plugin/interface.d.ts +151 -15
  41. package/dist/plugin/loader.d.ts +19 -1
  42. package/dist/plugin/loader.js +331 -63
  43. package/dist/plugin/pipeline.d.ts +75 -0
  44. package/dist/plugin/pipeline.js +183 -0
  45. package/dist/plugin/registry.js +12 -1
  46. package/dist/plugin/storage.d.ts +51 -0
  47. package/dist/plugin/storage.js +164 -0
  48. package/dist/security/secrets.d.ts +1 -0
  49. package/dist/security/secrets.js +13 -0
  50. package/dist/sensors/actionability.js +1 -2
  51. package/dist/sensors/guard.js +4 -10
  52. package/dist/sensors/mutations.js +12 -0
  53. package/dist/sensors/operation_monitor.js +1 -0
  54. package/dist/server.d.ts +1 -1
  55. package/dist/server.js +600 -236
  56. package/dist/state/agent.d.ts +1 -0
  57. package/dist/state/agent.js +3 -0
  58. package/dist/state/delta.d.ts +12 -4
  59. package/dist/state/delta.js +67 -14
  60. package/dist/state/session.d.ts +8 -2
  61. package/dist/state/session.js +60 -13
  62. package/dist/tools/browser_detect.d.ts +16 -2
  63. package/dist/tools/browser_detect.js +54 -6
  64. package/dist/tools/burst.d.ts +17 -7
  65. package/dist/tools/burst.js +240 -83
  66. package/dist/tools/checkpoint.d.ts +38 -0
  67. package/dist/tools/checkpoint.js +271 -0
  68. package/dist/tools/click.d.ts +1 -0
  69. package/dist/tools/click.js +97 -98
  70. package/dist/tools/clipboard.js +31 -24
  71. package/dist/tools/design_extract.js +1 -1
  72. package/dist/tools/eval.js +1 -1
  73. package/dist/tools/fill.d.ts +20 -1
  74. package/dist/tools/fill.js +199 -40
  75. package/dist/tools/find.d.ts +16 -0
  76. package/dist/tools/find.js +67 -44
  77. package/dist/tools/github/index.d.ts +19 -4
  78. package/dist/tools/github/index.js +40 -4
  79. package/dist/tools/highlight.d.ts +6 -2
  80. package/dist/tools/highlight.js +158 -72
  81. package/dist/tools/inspect.js +1 -1
  82. package/dist/tools/key.js +65 -56
  83. package/dist/tools/navigate.d.ts +1 -1
  84. package/dist/tools/navigate.js +57 -44
  85. package/dist/tools/pdf.js +21 -13
  86. package/dist/tools/pointer.d.ts +18 -3
  87. package/dist/tools/pointer.js +89 -1
  88. package/dist/tools/read.d.ts +28 -8
  89. package/dist/tools/read.js +230 -56
  90. package/dist/tools/scrape.js +67 -13
  91. package/dist/tools/screenshot.js +21 -16
  92. package/dist/tools/scroll.js +6 -11
  93. package/dist/tools/select.js +8 -2
  94. package/dist/tools/snapshot.js +3 -34
  95. package/dist/tools/tabs.d.ts +10 -10
  96. package/dist/tools/tabs.js +55 -39
  97. package/dist/tools/thought.d.ts +2 -0
  98. package/dist/tools/thought.js +13 -14
  99. package/dist/tools/type.d.ts +2 -0
  100. package/dist/tools/type.js +109 -60
  101. package/dist/tools/type_secret.js +42 -76
  102. package/dist/tools/upload.js +1 -1
  103. package/dist/tools/video_compiler.d.ts +1 -1
  104. package/dist/tools/video_compiler.js +11 -12
  105. package/dist/version.d.ts +5 -0
  106. package/dist/version.js +5 -0
  107. package/docs/DOCUMENTATION.md +82 -36
  108. package/docs/PLUGINS.md +82 -499
  109. package/docs/TOOLS.md +51 -99
  110. package/docs/architecture/blind-injection.md +83 -0
  111. package/docs/architecture/dual-injection.md +32 -0
  112. package/docs/architecture/overview.md +49 -0
  113. package/docs/architecture/security.md +35 -0
  114. package/docs/architecture/transport.md +37 -0
  115. package/docs/captcha-stealth/captcha-solver.md +75 -0
  116. package/docs/captcha-stealth/stealth-physics.md +60 -0
  117. package/docs/cli/cli-commands.md +44 -0
  118. package/docs/cli/cli-flags.md +20 -0
  119. package/docs/cli/cli-introduction.md +20 -0
  120. package/docs/cli/cli-scripting.md +32 -0
  121. package/docs/cli/g-ide/ide-antigravity.md +24 -0
  122. package/docs/cli/g-ide/ide-claude-code.md +24 -0
  123. package/docs/cli/g-ide/ide-claude-desktop.md +32 -0
  124. package/docs/cli/g-ide/ide-cursor.md +31 -0
  125. package/docs/cli/g-ide/ide-generic.md +34 -0
  126. package/docs/cli/g-ide/ide-opencode.md +24 -0
  127. package/docs/cli/g-ide/ide-vscode-copilot.md +24 -0
  128. package/docs/cli/g-ide/ide-windsurf.md +24 -0
  129. package/docs/configuration/config-locations.md +24 -0
  130. package/docs/configuration/configuration.md +73 -0
  131. package/docs/configuration/env-variables.md +19 -0
  132. package/docs/configuration/folders.md +55 -0
  133. package/docs/desktop-automation/electron-apps.md +217 -0
  134. package/docs/get-started/installation.md +47 -0
  135. package/docs/get-started/introduction.md +60 -0
  136. package/docs/get-started/quickstart.md +54 -0
  137. package/docs/get-started/setup-wizard.md +26 -0
  138. package/docs/intelligence/site-profiles.md +151 -0
  139. package/docs/skills-ecosystem/skills-overview.md +35 -0
  140. package/docs/skills-ecosystem/skills-recipes.md +36 -0
  141. package/docs/tools/tools.md +631 -0
  142. package/docs/troubleshooting/trouble-browser.md +27 -0
  143. package/docs/troubleshooting/trouble-config.md +20 -0
  144. package/docs/troubleshooting/trouble-loop.md +31 -0
  145. package/ext-dist/background.js +10 -62
  146. package/ext-dist/content.js +333 -921
  147. package/ext-dist/hud/hud.js +9 -9
  148. package/ext-dist/manifest.json +2 -6
  149. package/ext-dist/styles.css +6 -1
  150. package/mcp.json +108 -72
  151. package/package.json +14 -9
  152. package/server.json +3 -3
  153. package/docs/DEV_MODE.md +0 -68
  154. package/docs/dev_plugin.md +0 -310
  155. package/ext-dist/sidepanel/sidepanel.js +0 -25
  156. package/ext-dist/sidepanel.html +0 -547
@@ -1,547 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <title>WEAVETAB_OS</title>
6
- <link rel="preconnect" href="https://fonts.googleapis.com">
7
- <style>
8
- @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&display=swap');
9
-
10
- :root {
11
- --bg: #0d0d10;
12
- --bg-panel: #111113;
13
- --bg-hover: #1c1c1f;
14
- --border: #252529;
15
- --text: #e2e2ee;
16
- --text-muted: #52525b;
17
- --accent: #3b82f6;
18
- --accent-hover: #2563eb;
19
- --green: #10b981;
20
- --amber: #f59e0b;
21
- --red: #ef4444;
22
- --font: 'IBM Plex Mono', Consolas, monospace;
23
- }
24
-
25
- * { box-sizing: border-box; margin: 0; padding: 0; }
26
-
27
- body {
28
- background: var(--bg);
29
- color: var(--text);
30
- font-family: var(--font);
31
- font-size: 11px;
32
- display: flex;
33
- flex-direction: column;
34
- height: 100vh;
35
- overflow: hidden;
36
- }
37
-
38
- /* ── Header ─────────────────────────────────────────────────── */
39
- .header {
40
- display: flex;
41
- align-items: center;
42
- gap: 8px;
43
- padding: 10px 14px;
44
- border-bottom: 1px solid var(--border);
45
- flex-shrink: 0;
46
- }
47
- #status-dot {
48
- width: 7px; height: 7px;
49
- border-radius: 50%;
50
- background: #6b7280;
51
- flex-shrink: 0;
52
- transition: background .3s, box-shadow .3s;
53
- }
54
- .title {
55
- font-size: 12px;
56
- font-weight: 600;
57
- letter-spacing: 0.06em;
58
- color: var(--text);
59
- flex: 1;
60
- }
61
- #status-label {
62
- font-size: 10px;
63
- font-weight: 600;
64
- letter-spacing: 0.08em;
65
- color: var(--text-muted);
66
- transition: color .3s;
67
- }
68
-
69
- /* ── Controls row ────────────────────────────────────────────── */
70
- .controls-row {
71
- display: flex;
72
- align-items: center;
73
- gap: 6px;
74
- padding: 7px 14px;
75
- border-bottom: 1px solid var(--border);
76
- flex-shrink: 0;
77
- }
78
- .badge {
79
- font-size: 9px;
80
- font-weight: 700;
81
- padding: 2px 7px;
82
- text-transform: uppercase;
83
- letter-spacing: 0.06em;
84
- }
85
- .badge.devmode { background: var(--accent); color: #fff; display: none; }
86
- .badge.beta { background: #78350f; color: #fbbf24; }
87
-
88
- /* ── Scripted pill toggle ────────────────────────────────────── */
89
- .pill-toggle-bar {
90
- display: flex;
91
- align-items: center;
92
- gap: 8px;
93
- padding: 5px 14px 4px;
94
- border-bottom: 1px solid var(--border);
95
- flex-shrink: 0;
96
- }
97
- #btn-master-visuals {
98
- background: rgba(59, 130, 246, 0.12);
99
- border: 1px solid var(--accent);
100
- color: var(--accent);
101
- font-family: var(--font);
102
- font-size: 10px;
103
- font-weight: 600;
104
- padding: 3px 10px;
105
- cursor: pointer;
106
- letter-spacing: 0.04em;
107
- border-radius: 4px;
108
- transition: all .15s ease;
109
- }
110
- #btn-master-visuals:hover {
111
- background: rgba(59, 130, 246, 0.25);
112
- }
113
- #btn-master-visuals.off {
114
- border-color: var(--red);
115
- color: var(--red);
116
- background: rgba(239, 68, 68, 0.12);
117
- }
118
- #btn-scripted-pill {
119
- background: transparent;
120
- border: 1px solid var(--border);
121
- color: var(--text-muted);
122
- font-family: var(--font);
123
- font-size: 9px;
124
- padding: 2px 8px;
125
- cursor: pointer;
126
- letter-spacing: 0.04em;
127
- transition: color .15s, border-color .15s;
128
- }
129
- #btn-scripted-pill:hover { color: var(--text); border-color: #3f3f46; }
130
-
131
-
132
- /* ── Content area ────────────────────────────────────────────── */
133
- .content-area {
134
- flex: 1;
135
- overflow-y: auto;
136
- display: flex;
137
- flex-direction: column;
138
- }
139
- .content-area::-webkit-scrollbar { width: 3px; }
140
- .content-area::-webkit-scrollbar-thumb { background: var(--border); }
141
-
142
- /* ── Section ─────────────────────────────────────────────────── */
143
- .section { border-bottom: 1px solid var(--border); }
144
- .section-header {
145
- display: flex;
146
- align-items: center;
147
- gap: 6px;
148
- padding: 9px 14px;
149
- color: var(--text-muted);
150
- font-size: 10px;
151
- text-transform: uppercase;
152
- letter-spacing: 0.08em;
153
- cursor: pointer;
154
- user-select: none;
155
- transition: color .15s;
156
- }
157
- .section-header:hover { color: var(--text); }
158
- .section-arrow { font-size: 8px; }
159
- .section-body {
160
- padding: 0 14px 10px;
161
- display: flex;
162
- flex-direction: column;
163
- gap: 4px;
164
- }
165
- .section.collapsed .section-body { display: none; }
166
- .section.collapsed .section-arrow::before { content: '▶'; }
167
- .section-arrow::before { content: '▼'; }
168
-
169
- /* ── Tasks ───────────────────────────────────────────────────── */
170
- .task-item {
171
- display: flex;
172
- align-items: flex-start;
173
- gap: 8px;
174
- color: var(--text-muted);
175
- padding: 2px 0;
176
- }
177
- .task-icon { flex-shrink: 0; color: var(--accent); }
178
-
179
- /* ── Thoughts ────────────────────────────────────────────────── */
180
- .thought-item {
181
- display: flex;
182
- gap: 8px;
183
- padding: 3px 0;
184
- border-bottom: 1px solid #1a1a1e;
185
- line-height: 1.5;
186
- }
187
- .thought-ts {
188
- color: var(--text-muted);
189
- flex-shrink: 0;
190
- font-size: 10px;
191
- }
192
- .thought-text { color: var(--text); word-break: break-word; }
193
- .thought-action .thought-text { color: var(--accent); }
194
-
195
- /* ── Tool calls ──────────────────────────────────────────────── */
196
- .tool-call {
197
- border: 1px solid var(--border);
198
- background: #111116;
199
- padding: 6px 8px;
200
- margin-bottom: 4px;
201
- }
202
- .tool-header {
203
- display: flex;
204
- justify-content: space-between;
205
- align-items: center;
206
- color: var(--text);
207
- font-weight: 500;
208
- margin-bottom: 3px;
209
- }
210
- .tool-args, .tool-result {
211
- font-size: 10px;
212
- color: var(--text-muted);
213
- word-break: break-all;
214
- white-space: pre-wrap;
215
- }
216
- .tool-result.status-done { color: var(--green); }
217
- .tool-result.status-error { color: var(--red); }
218
- .status-pending { color: var(--amber); }
219
- .status-done { color: var(--green); }
220
- .status-error { color: var(--red); }
221
-
222
- /* ── Message input ───────────────────────────────────────────── */
223
- .chat-bottom-bar {
224
- padding: 10px 14px;
225
- border-top: 1px solid var(--border);
226
- background: var(--bg-panel);
227
- flex-shrink: 0;
228
- }
229
- .chat-input-wrapper {
230
- display: flex;
231
- align-items: center;
232
- border: 1px solid var(--border);
233
- background: #18181b;
234
- transition: border-color .15s;
235
- border-radius: 4px;
236
- }
237
- .chat-input-wrapper:focus-within { border-color: var(--accent); }
238
- .chat-input {
239
- flex: 1;
240
- background: transparent;
241
- border: none;
242
- color: var(--text);
243
- font-family: var(--font);
244
- font-size: 11px;
245
- padding: 7px 10px;
246
- outline: none;
247
- }
248
- .chat-input::placeholder { color: #3f3f46; }
249
- .chat-send {
250
- background: transparent;
251
- border: none;
252
- width: 30px;
253
- height: 30px;
254
- display: flex;
255
- align-items: center;
256
- justify-content: center;
257
- cursor: pointer;
258
- color: var(--text-muted);
259
- font-size: 14px;
260
- flex-shrink: 0;
261
- transition: color .15s;
262
- }
263
- .chat-send:hover { color: var(--accent); }
264
-
265
- /* ── Snipe Popover & Attachment Chip ────────────────────────── */
266
- .snipe-popover {
267
- position: absolute;
268
- bottom: 54px;
269
- left: 10px;
270
- background: rgba(24, 24, 27, 0.95);
271
- backdrop-filter: blur(16px);
272
- border: 1px solid rgba(255, 255, 255, 0.14);
273
- border-radius: 10px;
274
- padding: 6px;
275
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.7), 0 0 1px rgba(255,255,255,0.2);
276
- display: flex;
277
- flex-direction: column;
278
- gap: 4px;
279
- z-index: 1000;
280
- min-width: 175px;
281
- animation: popoverIn 0.18s cubic-bezier(0.16, 1, 0.3, 1);
282
- }
283
- @keyframes popoverIn {
284
- from { opacity: 0; transform: translateY(6px) scale(0.97); }
285
- to { opacity: 1; transform: translateY(0) scale(1); }
286
- }
287
- .snipe-popover-item {
288
- display: flex;
289
- align-items: center;
290
- gap: 10px;
291
- background: transparent;
292
- border: 1px solid transparent;
293
- color: #e4e4e7;
294
- font-family: var(--font);
295
- font-size: 11px;
296
- font-weight: 500;
297
- padding: 8px 10px;
298
- border-radius: 7px;
299
- cursor: pointer;
300
- transition: all 0.15s ease;
301
- width: 100%;
302
- text-align: left;
303
- }
304
- .snipe-popover-item:hover {
305
- background: rgba(255, 255, 255, 0.08);
306
- color: #ffffff;
307
- }
308
- .snipe-popover-item.active {
309
- background: rgba(56, 189, 248, 0.15);
310
- color: #38bdf8;
311
- border-color: rgba(56, 189, 248, 0.35);
312
- }
313
- .snipe-popover-tag {
314
- margin-left: auto;
315
- font-size: 9px;
316
- font-weight: 600;
317
- opacity: 0.8;
318
- text-transform: uppercase;
319
- letter-spacing: 0.04em;
320
- padding: 2px 6px;
321
- border-radius: 4px;
322
- background: rgba(255,255,255,0.06);
323
- }
324
- .chat-input-btn {
325
- background: transparent;
326
- border: none;
327
- width: 30px;
328
- height: 30px;
329
- display: flex;
330
- align-items: center;
331
- justify-content: center;
332
- cursor: pointer;
333
- color: #a1a1aa;
334
- flex-shrink: 0;
335
- transition: all 0.15s ease;
336
- border-radius: 6px;
337
- margin-left: 2px;
338
- }
339
- .chat-input-btn:hover {
340
- color: #38bdf8;
341
- background: rgba(56, 189, 248, 0.12);
342
- }
343
- .chat-input-btn.active {
344
- color: #38bdf8;
345
- background: rgba(56, 189, 248, 0.22);
346
- }
347
- .snipe-badge-container {
348
- display: flex;
349
- align-items: center;
350
- justify-content: space-between;
351
- background: rgba(39, 39, 42, 0.85);
352
- backdrop-filter: blur(12px);
353
- border: 1px solid rgba(255, 255, 255, 0.12);
354
- padding: 8px 12px;
355
- border-radius: 10px;
356
- margin-bottom: 8px;
357
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4);
358
- animation: chipIn 0.2s cubic-bezier(0.16, 1, 0.3, 1);
359
- }
360
- @keyframes chipIn {
361
- from { opacity: 0; transform: translateY(4px); }
362
- to { opacity: 1; transform: translateY(0); }
363
- }
364
- .snipe-badge-content {
365
- display: flex;
366
- align-items: center;
367
- gap: 10px;
368
- overflow: hidden;
369
- }
370
- .snipe-badge-thumb {
371
- width: 36px;
372
- height: 36px;
373
- object-fit: cover;
374
- border-radius: 6px;
375
- border: 1px solid rgba(255,255,255,0.18);
376
- box-shadow: 0 2px 8px rgba(0,0,0,0.5);
377
- flex-shrink: 0;
378
- }
379
- .snipe-badge-icon-box {
380
- width: 36px;
381
- height: 36px;
382
- border-radius: 6px;
383
- background: rgba(56, 189, 248, 0.12);
384
- border: 1px solid rgba(56, 189, 248, 0.3);
385
- display: flex;
386
- align-items: center;
387
- justify-content: center;
388
- color: #38bdf8;
389
- flex-shrink: 0;
390
- }
391
- .snipe-badge-meta {
392
- display: flex;
393
- flex-direction: column;
394
- gap: 2px;
395
- overflow: hidden;
396
- }
397
- .snipe-badge-title {
398
- font-weight: 600;
399
- font-size: 11px;
400
- color: #f4f4f5;
401
- white-space: nowrap;
402
- overflow: hidden;
403
- text-overflow: ellipsis;
404
- }
405
- .snipe-badge-subtitle {
406
- font-size: 9px;
407
- color: #a1a1aa;
408
- white-space: nowrap;
409
- overflow: hidden;
410
- text-overflow: ellipsis;
411
- }
412
- .snipe-badge-remove {
413
- background: rgba(255, 255, 255, 0.06);
414
- border: 1px solid rgba(255, 255, 255, 0.12);
415
- color: #a1a1aa;
416
- cursor: pointer;
417
- width: 22px;
418
- height: 22px;
419
- border-radius: 50%;
420
- display: flex;
421
- align-items: center;
422
- justify-content: center;
423
- transition: all 0.15s ease;
424
- flex-shrink: 0;
425
- margin-left: 8px;
426
- }
427
- .snipe-badge-remove:hover {
428
- background: rgba(239, 68, 68, 0.2);
429
- color: #f87171;
430
- border-color: rgba(239, 68, 68, 0.4);
431
- }
432
- .snipe-badge-remove:hover {
433
- background: rgba(239, 68, 68, 0.15);
434
- }
435
-
436
- /* ── Empty state ─────────────────────────────────────────────── */
437
- .empty { color: var(--text-muted); padding: 2px 0; }
438
- </style>
439
- </head>
440
- <body>
441
-
442
- <!-- Header: status indicator -->
443
- <div class="header">
444
- <div id="status-dot"></div>
445
- <div class="title">WEAVETAB_OS</div>
446
- <div id="status-label">IDLE</div>
447
- </div>
448
-
449
- <!-- Controls -->
450
- <div class="controls-row">
451
- <div class="badge devmode" id="badge-devmode">DEVMODE</div>
452
- <div class="badge beta">BETA</div>
453
- </div>
454
-
455
- <!-- Scrollable content -->
456
- <div class="content-area">
457
-
458
- <!-- THOUGHTS (live agent thought stream) -->
459
- <div class="section" id="sec-thoughts">
460
- <div class="section-header">
461
- <span class="section-arrow"></span>THOUGHTS
462
- </div>
463
- <div class="section-body">
464
- <div id="thoughts-feed">
465
- <div class="empty">Waiting for agent activity…</div>
466
- </div>
467
- </div>
468
- </div>
469
-
470
- <!-- TOOL CALLS -->
471
- <div class="section" id="tool-feed-section">
472
- <div class="section-header">
473
- <span class="section-arrow"></span>TOOL CALLS
474
- </div>
475
- <div class="section-body">
476
- <div id="tool-feed-container">
477
- <div class="empty">No tool calls yet.</div>
478
- </div>
479
- </div>
480
- </div>
481
-
482
- <!-- TASKS -->
483
- <div class="section" id="sec-tasks">
484
- <div class="section-header">
485
- <span class="section-arrow"></span>TASKS
486
- </div>
487
- <div class="section-body">
488
- <div id="notes-list">
489
- <div class="task-item">
490
- <span class="task-icon">○</span>
491
- <span class="empty">No active mission</span>
492
- </div>
493
- </div>
494
- </div>
495
- </div>
496
-
497
- </div>
498
-
499
- <div class="pill-toggle-bar">
500
- <button id="btn-master-visuals">Visuals: ON</button>
501
- <button id="btn-scripted-pill">Cursor Pills: ON</button>
502
- </div>
503
-
504
- <div class="chat-bottom-bar" style="position: relative;">
505
-
506
- <!-- Mode Selector Popover -->
507
- <div id="snipe-popover" class="snipe-popover" style="display: none;">
508
- <button class="snipe-popover-item active" id="popover-opt-dom" title="Target Page Elements (0 Image Tokens)">
509
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>
510
- <span>DOM Target</span>
511
- <span class="snipe-popover-tag">0 Tokens</span>
512
- </button>
513
- <button class="snipe-popover-item" id="popover-opt-vision" title="Crop Visual WebP Image">
514
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg>
515
- <span>Vision Crop</span>
516
- <span class="snipe-popover-tag">WebP</span>
517
- </button>
518
- </div>
519
-
520
- <!-- Attachment Badge -->
521
- <div id="snipe-badge-container" class="snipe-badge-container" style="display:none;">
522
- <div class="snipe-badge-content" id="snipe-badge-content"></div>
523
- <button class="snipe-badge-remove" id="btn-remove-snipe" title="Remove attachment">
524
- <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
525
- </button>
526
- </div>
527
-
528
- <div class="chat-input-wrapper">
529
- <button id="btn-snipe-trigger" class="chat-input-btn" title="Target Area on Tab (Alt+S)">
530
- <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 7V5a2 2 0 0 1 2-2h2"/><path d="M17 3h2a2 2 0 0 1 2 2v2"/><path d="M21 17v2a2 2 0 0 1-2 2h-2"/><path d="M7 21H5a2 2 0 0 1-2-2v-2"/><rect x="7" y="7" width="10" height="10" rx="1"/></svg>
531
- </button>
532
- <input type="text" class="chat-input" id="notes-input" placeholder="Send a message or snipe instruction...">
533
- <button class="chat-send" id="btn-send">↵</button>
534
- </div>
535
- </div>
536
-
537
- <script src="sidepanel/sidepanel.js"></script>
538
- <script>
539
- // Collapsible section toggle
540
- document.querySelectorAll('.section-header').forEach(h => {
541
- h.addEventListener('click', () => {
542
- h.closest('.section').classList.toggle('collapsed');
543
- });
544
- });
545
- </script>
546
- </body>
547
- </html>