@weavetab/mcp 2.5.0-beta.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.
Files changed (281) hide show
  1. package/AGENTS.md +48 -0
  2. package/ARCHITECTURE.md +590 -0
  3. package/LICENSE +631 -0
  4. package/README.md +909 -0
  5. package/SECURITY.md +196 -0
  6. package/TROUBLESHOOTING.md +365 -0
  7. package/dist/anticaptcha/detector.d.ts +49 -0
  8. package/dist/anticaptcha/detector.js +465 -0
  9. package/dist/anticaptcha/integration.d.ts +36 -0
  10. package/dist/anticaptcha/integration.js +123 -0
  11. package/dist/anticaptcha/solver.d.ts +27 -0
  12. package/dist/anticaptcha/solver.js +552 -0
  13. package/dist/audit/logger.d.ts +13 -0
  14. package/dist/audit/logger.js +177 -0
  15. package/dist/audit/telemetry.d.ts +36 -0
  16. package/dist/audit/telemetry.js +162 -0
  17. package/dist/cdp/bridge.d.ts +16 -0
  18. package/dist/cdp/bridge.js +826 -0
  19. package/dist/cdp/confirm.d.ts +26 -0
  20. package/dist/cdp/confirm.js +79 -0
  21. package/dist/cdp/connector.d.ts +37 -0
  22. package/dist/cdp/connector.js +661 -0
  23. package/dist/cdp/extension.d.ts +36 -0
  24. package/dist/cdp/extension.js +118 -0
  25. package/dist/cdp/finder.d.ts +1 -0
  26. package/dist/cdp/finder.js +2 -0
  27. package/dist/cdp/helpers.d.ts +11 -0
  28. package/dist/cdp/helpers.js +195 -0
  29. package/dist/cdp/label_cache.d.ts +12 -0
  30. package/dist/cdp/label_cache.js +51 -0
  31. package/dist/cdp/lock.d.ts +33 -0
  32. package/dist/cdp/lock.js +206 -0
  33. package/dist/cdp/omni_broker.d.ts +17 -0
  34. package/dist/cdp/omni_broker.js +119 -0
  35. package/dist/cdp/profiles.d.ts +1 -0
  36. package/dist/cdp/profiles.js +87 -0
  37. package/dist/cdp/pruner.d.ts +41 -0
  38. package/dist/cdp/pruner.js +263 -0
  39. package/dist/cdp/ref_cache.d.ts +101 -0
  40. package/dist/cdp/ref_cache.js +234 -0
  41. package/dist/cdp/retry.d.ts +5 -0
  42. package/dist/cdp/retry.js +39 -0
  43. package/dist/cdp/retry_enhanced.d.ts +44 -0
  44. package/dist/cdp/retry_enhanced.js +102 -0
  45. package/dist/cdp/security.d.ts +50 -0
  46. package/dist/cdp/security.js +237 -0
  47. package/dist/cdp/verify.d.ts +39 -0
  48. package/dist/cdp/verify.js +143 -0
  49. package/dist/cdp/walker.d.ts +91 -0
  50. package/dist/cdp/walker.js +896 -0
  51. package/dist/cdp/walker.test.d.ts +2 -0
  52. package/dist/cdp/walker.test.js +172 -0
  53. package/dist/cdp/websocket_transport.d.ts +15 -0
  54. package/dist/cdp/websocket_transport.js +118 -0
  55. package/dist/cli/plugin.d.ts +9 -0
  56. package/dist/cli/plugin.js +1134 -0
  57. package/dist/cli/updater.d.ts +1 -0
  58. package/dist/cli/updater.js +72 -0
  59. package/dist/config/loader.d.ts +120 -0
  60. package/dist/config/loader.js +704 -0
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.js +1248 -0
  63. package/dist/intelligence/hints.d.ts +11 -0
  64. package/dist/intelligence/hints.js +39 -0
  65. package/dist/intelligence/intent.d.ts +33 -0
  66. package/dist/intelligence/intent.js +171 -0
  67. package/dist/intelligence/sessionMemory.d.ts +66 -0
  68. package/dist/intelligence/sessionMemory.js +284 -0
  69. package/dist/intelligence/sessionMemory.test.d.ts +2 -0
  70. package/dist/intelligence/sessionMemory.test.js +62 -0
  71. package/dist/intelligence/trail.d.ts +64 -0
  72. package/dist/intelligence/trail.js +233 -0
  73. package/dist/intelligence/trail.test.d.ts +2 -0
  74. package/dist/intelligence/trail.test.js +110 -0
  75. package/dist/intelligence/vision.d.ts +24 -0
  76. package/dist/intelligence/vision.js +151 -0
  77. package/dist/lifecycle/mission_manager.d.ts +16 -0
  78. package/dist/lifecycle/mission_manager.js +44 -0
  79. package/dist/overlay/bubble.d.ts +16 -0
  80. package/dist/overlay/bubble.js +37 -0
  81. package/dist/overlay/ghost.d.ts +35 -0
  82. package/dist/overlay/ghost.js +508 -0
  83. package/dist/overlay/injector.d.ts +22 -0
  84. package/dist/overlay/injector.js +198 -0
  85. package/dist/plugin/interface.d.ts +134 -0
  86. package/dist/plugin/interface.js +1 -0
  87. package/dist/plugin/loader.d.ts +18 -0
  88. package/dist/plugin/loader.js +155 -0
  89. package/dist/plugin/registry.d.ts +50 -0
  90. package/dist/plugin/registry.js +234 -0
  91. package/dist/security/blacklist.d.ts +24 -0
  92. package/dist/security/blacklist.js +80 -0
  93. package/dist/security/filter.d.ts +2 -0
  94. package/dist/security/filter.js +20 -0
  95. package/dist/security/guard.d.ts +8 -0
  96. package/dist/security/guard.js +35 -0
  97. package/dist/security/ratelimit.d.ts +11 -0
  98. package/dist/security/ratelimit.js +57 -0
  99. package/dist/security/secrets.d.ts +75 -0
  100. package/dist/security/secrets.js +365 -0
  101. package/dist/sensors/actionability.d.ts +81 -0
  102. package/dist/sensors/actionability.js +303 -0
  103. package/dist/sensors/guard.d.ts +25 -0
  104. package/dist/sensors/guard.js +168 -0
  105. package/dist/sensors/mutations.d.ts +23 -0
  106. package/dist/sensors/mutations.js +93 -0
  107. package/dist/sensors/network.d.ts +67 -0
  108. package/dist/sensors/network.js +193 -0
  109. package/dist/sensors/operation_monitor.d.ts +80 -0
  110. package/dist/sensors/operation_monitor.js +203 -0
  111. package/dist/sensors/pacing.d.ts +44 -0
  112. package/dist/sensors/pacing.js +111 -0
  113. package/dist/sensors/thoughts.d.ts +2 -0
  114. package/dist/sensors/thoughts.js +59 -0
  115. package/dist/sensors/wait.d.ts +12 -0
  116. package/dist/sensors/wait.js +44 -0
  117. package/dist/server.d.ts +7 -0
  118. package/dist/server.js +1687 -0
  119. package/dist/state/agent.d.ts +36 -0
  120. package/dist/state/agent.js +101 -0
  121. package/dist/state/cache.d.ts +16 -0
  122. package/dist/state/cache.js +92 -0
  123. package/dist/state/cache.test.d.ts +2 -0
  124. package/dist/state/cache.test.js +76 -0
  125. package/dist/state/delta.d.ts +71 -0
  126. package/dist/state/delta.js +234 -0
  127. package/dist/state/delta.test.d.ts +2 -0
  128. package/dist/state/delta.test.js +279 -0
  129. package/dist/state/groups.d.ts +15 -0
  130. package/dist/state/groups.js +80 -0
  131. package/dist/state/session.d.ts +30 -0
  132. package/dist/state/session.js +155 -0
  133. package/dist/tools/accessibility.d.ts +14 -0
  134. package/dist/tools/accessibility.js +32 -0
  135. package/dist/tools/ask.d.ts +14 -0
  136. package/dist/tools/ask.js +49 -0
  137. package/dist/tools/automation.d.ts +36 -0
  138. package/dist/tools/automation.js +218 -0
  139. package/dist/tools/browser_detect.d.ts +13 -0
  140. package/dist/tools/browser_detect.js +73 -0
  141. package/dist/tools/burst.d.ts +35 -0
  142. package/dist/tools/burst.js +344 -0
  143. package/dist/tools/canvas.d.ts +25 -0
  144. package/dist/tools/canvas.js +132 -0
  145. package/dist/tools/captcha.d.ts +38 -0
  146. package/dist/tools/captcha.js +209 -0
  147. package/dist/tools/click.d.ts +36 -0
  148. package/dist/tools/click.js +561 -0
  149. package/dist/tools/click_and_wait.d.ts +33 -0
  150. package/dist/tools/click_and_wait.js +149 -0
  151. package/dist/tools/clipboard.d.ts +29 -0
  152. package/dist/tools/clipboard.js +279 -0
  153. package/dist/tools/console.d.ts +21 -0
  154. package/dist/tools/console.js +107 -0
  155. package/dist/tools/cookies.d.ts +67 -0
  156. package/dist/tools/cookies.js +121 -0
  157. package/dist/tools/design_extract.d.ts +109 -0
  158. package/dist/tools/design_extract.js +641 -0
  159. package/dist/tools/dialog.d.ts +24 -0
  160. package/dist/tools/dialog.js +109 -0
  161. package/dist/tools/drag.d.ts +15 -0
  162. package/dist/tools/drag.js +29 -0
  163. package/dist/tools/emulation.d.ts +33 -0
  164. package/dist/tools/emulation.js +69 -0
  165. package/dist/tools/eval.d.ts +20 -0
  166. package/dist/tools/eval.js +92 -0
  167. package/dist/tools/fill.d.ts +41 -0
  168. package/dist/tools/fill.js +667 -0
  169. package/dist/tools/find.d.ts +30 -0
  170. package/dist/tools/find.js +60 -0
  171. package/dist/tools/geo.d.ts +19 -0
  172. package/dist/tools/geo.js +29 -0
  173. package/dist/tools/github/analyze.d.ts +4 -0
  174. package/dist/tools/github/analyze.js +113 -0
  175. package/dist/tools/github/cache.d.ts +21 -0
  176. package/dist/tools/github/cache.js +28 -0
  177. package/dist/tools/github/index.d.ts +4 -0
  178. package/dist/tools/github/index.js +4 -0
  179. package/dist/tools/github/issues.d.ts +9 -0
  180. package/dist/tools/github/issues.js +88 -0
  181. package/dist/tools/github/pr.d.ts +5 -0
  182. package/dist/tools/github/pr.js +88 -0
  183. package/dist/tools/github/rateLimiter.d.ts +4 -0
  184. package/dist/tools/github/rateLimiter.js +46 -0
  185. package/dist/tools/github/read.d.ts +34 -0
  186. package/dist/tools/github/read.js +74 -0
  187. package/dist/tools/github/repoContext.d.ts +20 -0
  188. package/dist/tools/github/repoContext.js +129 -0
  189. package/dist/tools/highlight.d.ts +20 -0
  190. package/dist/tools/highlight.js +140 -0
  191. package/dist/tools/hover.d.ts +19 -0
  192. package/dist/tools/hover.js +57 -0
  193. package/dist/tools/inspect.d.ts +17 -0
  194. package/dist/tools/inspect.js +125 -0
  195. package/dist/tools/integration.test.d.ts +2 -0
  196. package/dist/tools/integration.test.js +96 -0
  197. package/dist/tools/key.d.ts +25 -0
  198. package/dist/tools/key.js +173 -0
  199. package/dist/tools/macro_compiler.d.ts +7 -0
  200. package/dist/tools/macro_compiler.js +82 -0
  201. package/dist/tools/mouse.d.ts +21 -0
  202. package/dist/tools/mouse.js +62 -0
  203. package/dist/tools/navigate.d.ts +16 -0
  204. package/dist/tools/navigate.js +188 -0
  205. package/dist/tools/network_intercept.d.ts +17 -0
  206. package/dist/tools/network_intercept.js +151 -0
  207. package/dist/tools/office/index.d.ts +9 -0
  208. package/dist/tools/office/index.js +7 -0
  209. package/dist/tools/office/list.d.ts +15 -0
  210. package/dist/tools/office/list.js +41 -0
  211. package/dist/tools/office/parse.d.ts +20 -0
  212. package/dist/tools/office/parse.js +172 -0
  213. package/dist/tools/pdf.d.ts +22 -0
  214. package/dist/tools/pdf.js +42 -0
  215. package/dist/tools/performance.d.ts +12 -0
  216. package/dist/tools/performance.js +47 -0
  217. package/dist/tools/performance_test.d.ts +70 -0
  218. package/dist/tools/performance_test.js +128 -0
  219. package/dist/tools/plan.d.ts +39 -0
  220. package/dist/tools/plan.js +161 -0
  221. package/dist/tools/pointer.d.ts +35 -0
  222. package/dist/tools/pointer.js +522 -0
  223. package/dist/tools/read.d.ts +30 -0
  224. package/dist/tools/read.js +488 -0
  225. package/dist/tools/recording.d.ts +45 -0
  226. package/dist/tools/recording.js +124 -0
  227. package/dist/tools/response.d.ts +129 -0
  228. package/dist/tools/response.js +5 -0
  229. package/dist/tools/scrape.d.ts +24 -0
  230. package/dist/tools/scrape.js +140 -0
  231. package/dist/tools/screenshot.d.ts +40 -0
  232. package/dist/tools/screenshot.js +79 -0
  233. package/dist/tools/scroll.d.ts +23 -0
  234. package/dist/tools/scroll.js +196 -0
  235. package/dist/tools/select.d.ts +13 -0
  236. package/dist/tools/select.js +217 -0
  237. package/dist/tools/snapshot.d.ts +27 -0
  238. package/dist/tools/snapshot.js +99 -0
  239. package/dist/tools/storage.d.ts +18 -0
  240. package/dist/tools/storage.js +29 -0
  241. package/dist/tools/tabs.d.ts +77 -0
  242. package/dist/tools/tabs.js +342 -0
  243. package/dist/tools/thought.d.ts +16 -0
  244. package/dist/tools/thought.js +79 -0
  245. package/dist/tools/type.d.ts +65 -0
  246. package/dist/tools/type.js +1061 -0
  247. package/dist/tools/type_secret.d.ts +23 -0
  248. package/dist/tools/type_secret.js +229 -0
  249. package/dist/tools/upload.d.ts +19 -0
  250. package/dist/tools/upload.js +103 -0
  251. package/dist/tools/video_compiler.d.ts +24 -0
  252. package/dist/tools/video_compiler.js +199 -0
  253. package/dist/tools/viewport.d.ts +44 -0
  254. package/dist/tools/viewport.js +230 -0
  255. package/dist/tools/wait.d.ts +19 -0
  256. package/dist/tools/wait.js +202 -0
  257. package/dist/tools/wait_for.d.ts +23 -0
  258. package/dist/tools/wait_for.js +30 -0
  259. package/dist/tools/windows.d.ts +22 -0
  260. package/dist/tools/windows.js +57 -0
  261. package/dist/ui/index.d.ts +1 -0
  262. package/dist/ui/index.js +12 -0
  263. package/docs/DEV_MODE.md +68 -0
  264. package/docs/DOCUMENTATION.md +532 -0
  265. package/docs/PLUGINS.md +538 -0
  266. package/docs/TOOLS.md +104 -0
  267. package/docs/dev_plugin.md +310 -0
  268. package/ext-dist/background.js +467 -0
  269. package/ext-dist/content.js +3089 -0
  270. package/ext-dist/dashboard.html +583 -0
  271. package/ext-dist/hud/hud.js +73 -0
  272. package/ext-dist/hud/index.html +20 -0
  273. package/ext-dist/manifest.json +77 -0
  274. package/ext-dist/sidepanel/sidepanel.js +25 -0
  275. package/ext-dist/sidepanel.html +547 -0
  276. package/ext-dist/styles.css +218 -0
  277. package/icon.png +0 -0
  278. package/mcp.json +796 -0
  279. package/package.json +113 -0
  280. package/server.json +23 -0
  281. package/smithery.yaml +11 -0
@@ -0,0 +1,77 @@
1
+ {
2
+ "manifest_version": 3,
3
+ "name": "Weavetab Agent",
4
+ "version": "1.0.63031",
5
+ "description": "Native browser agent for Weavetab MCP",
6
+ "permissions": [
7
+ "tabs",
8
+ "tabGroups",
9
+ "scripting",
10
+ "storage",
11
+ "webNavigation",
12
+ "activeTab",
13
+ "declarativeNetRequest",
14
+ "cookies",
15
+ "notifications",
16
+ "alarms",
17
+ "contextMenus",
18
+ "downloads",
19
+ "browsingData",
20
+ "sidePanel"
21
+ ],
22
+ "host_permissions": [
23
+ "<all_urls>"
24
+ ],
25
+ "background": {
26
+ "service_worker": "background.js"
27
+ },
28
+ "side_panel": {
29
+ "default_path": "sidepanel.html"
30
+ },
31
+ "content_scripts": [
32
+ {
33
+ "matches": [
34
+ "<all_urls>"
35
+ ],
36
+ "js": [
37
+ "content.js"
38
+ ],
39
+ "css": [
40
+ "styles.css"
41
+ ],
42
+ "run_at": "document_start",
43
+ "all_frames": true
44
+ }
45
+ ],
46
+ "action": {
47
+ "default_title": "Weavetab Agent"
48
+ },
49
+ "omnibox": {
50
+ "keyword": "Weavetab"
51
+ },
52
+ "web_accessible_resources": [
53
+ {
54
+ "resources": [
55
+ "dashboard.html",
56
+ "hud/*"
57
+ ],
58
+ "matches": [
59
+ "<all_urls>"
60
+ ]
61
+ }
62
+ ],
63
+ "commands": {
64
+ "toggle-hud": {
65
+ "suggested_key": {
66
+ "default": "Alt+Shift+W"
67
+ },
68
+ "description": "Toggle WeaveTab HUD"
69
+ },
70
+ "toggle-debug": {
71
+ "suggested_key": {
72
+ "default": "Alt+Shift+D"
73
+ },
74
+ "description": "Toggle WeaveTab Debug Menu"
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";(()=>{var s=typeof browser<"u"?browser:chrome,Y=s.runtime.connect({name:"wt-sidepanel"});Y.onDisconnect.addListener(()=>{});var f=document.getElementById("tool-feed-container"),E=document.getElementById("thoughts-feed"),S=document.getElementById("notes-list"),$=document.getElementById("status-dot"),P=document.getElementById("status-label"),R=document.getElementById("badge-devmode"),w=document.getElementById("notes-input"),Z=document.getElementById("btn-send"),T=!1,c=!0,tt=500,et=200;function b(t){let e={idle:{dot:"#6b7280",label:"IDLE",color:"#6b7280"},weaving:{dot:"#3b82f6",label:"WEAVING",color:"#3b82f6"},stuck:{dot:"#f59e0b",label:"STUCK",color:"#f59e0b"},done:{dot:"#10b981",label:"DONE",color:"#10b981"}},{dot:n,label:a,color:d}=e[t]??e.idle;$.style.background=n,$.style.boxShadow=`0 0 6px ${n}`,P.textContent=a,P.style.color=d}var y=new Map;function N(t){let{name:e,status:n,args:a,result:d,id:z}=t,I=z??e,r=y.get(I),k=!r;k&&(r=document.createElement("div"),r.className="tool-call",y.set(I,r));let B={pending:{icon:"\u23F3",cls:"status-pending"},done:{icon:"\u2713",cls:"status-done"},error:{icon:"\u2717",cls:"status-error"}},{icon:J,cls:A}=B[n]??B.pending,O=a?JSON.stringify(a).slice(0,150):"",H=d?String(d).slice(0,120):"",j=new Date().toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"});if(r.innerHTML=`
2
+ <div class="tool-header">
3
+ <span style="font-weight:600;color:var(--text);">${v(e??"?")}</span>
4
+ <div style="display:flex;align-items:center;gap:6px;">
5
+ <span style="font-size:9px;color:var(--text-muted);">${j}</span>
6
+ <span class="${A}">${J}</span>
7
+ </div>
8
+ </div>
9
+ ${O?`<div class="tool-args">${v(O)}</div>`:""}
10
+ ${H?`<div class="tool-result ${A}">${v(H)}</div>`:""}
11
+ `,k){let x=f.querySelector(".empty");for(x&&x.remove(),f.prepend(r);f.children.length>tt;){let M=f.lastElementChild;if(M){let C=[...y.entries()].find(([,Q])=>Q===M)?.[0];C&&y.delete(C),M.remove()}}}}function G(t,e="thought"){let n=E.querySelector(".empty");n&&n.remove();let a=document.createElement("div");a.className=`thought-item thought-${e}`;let d=new Date().toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"});for(a.innerHTML=`<span class="thought-ts">${d}</span><span class="thought-text">${v(t)}</span>`,E.prepend(a);E.children.length>et;)E.lastElementChild?.remove()}function V(t){if(S.innerHTML="",!t?.length){S.innerHTML='<div class="task-item"><span class="task-icon" style="color:var(--text-muted)">\u25CB</span><span style="color:var(--text-muted)">No active mission</span></div>';return}t.forEach(e=>{let n=document.createElement("div");n.className="task-item",n.innerHTML=`<span class="task-icon">\u25C8</span><span>${v(e)}</span>`,S.appendChild(n)})}s.runtime.onMessage.addListener(t=>{switch(t.type){case"Weavetab_GROUP_STATE":case"WT_AGENT_STATUS":{let e=t.state??t.status;(e==="weaving"||e==="idle"||e==="stuck"||e==="done")&&b(e);break}case"Weavetab_STATE":{if(t.hud?.action){let e=String(t.hud.action).trim();if(e){let n=e.startsWith("[ERR]")?"error":e.startsWith("[OK]")?"done":"pending";N({id:`wt-state-${Date.now()}-${Math.random()}`,name:e,status:n,timestamp:Date.now()})}}break}case"TOOL_CALL_EVENT":case"WT_TOOL_CALL":{let e=t.payload??t.data??t;e?.name&&N(e),(e?.status==="pending"||e?.status==="done")&&b((e.status==="pending","weaving"));break}case"WT_THOUGHT":{t.text&&G(t.text,t.kind??"thought");break}case"WT_PLAN_UPDATE":{V(t.data?.tasks??[]);break}case"WT_CONFIG_UPDATE":case"Weavetab_CONFIG":{T=!!t.devMode,R.style.display=T?"inline-block":"none";break}}});var p=!0,l=document.getElementById("btn-master-visuals"),g=document.getElementById("btn-scripted-pill");s.storage.local.get(["wt_devMode","wt_plan","wt_agent_status","wt_scripted_pill","wt_master_visuals"],t=>{T=!!t.wt_devMode,R.style.display=T?"inline-block":"none",t.wt_plan?.tasks&&V(t.wt_plan.tasks),t.wt_agent_status&&b(t.wt_agent_status),c=t.wt_scripted_pill!==!1,F(),p=t.wt_master_visuals!==!1,U()});function U(){l&&(p?(l.textContent="Visuals: ON",l.classList.remove("off")):(l.textContent="Visuals: OFF",l.classList.add("off")))}function nt(t){s.runtime.sendMessage({type:"WT_TOGGLE_MASTER_VISUALS",enabled:t}).catch(()=>{}),s.tabs.query({},e=>{e.forEach(n=>{n.id&&s.tabs.sendMessage(n.id,{type:"WT_TOGGLE_MASTER_VISUALS",enabled:t}).catch(()=>{})})})}l&&l.addEventListener("click",()=>{p=!p,s.storage.local.set({wt_master_visuals:p}),U(),nt(p)});function F(){g&&(g.textContent=c?"Cursor Pills: ON":"Cursor Pills: OFF",g.style.opacity=c?"1":"0.5")}function st(t){s.tabs.query({},e=>{e.forEach(n=>{n.id&&s.tabs.sendMessage(n.id,{type:"WT_SCRIPTED_PILL_TOGGLE",enabled:t}).catch(()=>{})})})}g&&g.addEventListener("click",()=>{c=!c,s.storage.local.set({wt_scripted_pill:c}),F(),st(c)});var W="dom_target",u=null,i=document.getElementById("btn-snipe-trigger"),o=document.getElementById("snipe-popover"),_=document.getElementById("popover-opt-dom"),h=document.getElementById("popover-opt-vision"),L=document.getElementById("snipe-badge-container"),m=document.getElementById("snipe-badge-content"),D=document.getElementById("btn-remove-snipe");function it(t){if(t.stopPropagation(),!o)return;let e=o.style.display==="none";o.style.display=e?"flex":"none",i&&i.classList.toggle("active",e)}document.addEventListener("click",t=>{o&&o.style.display!=="none"&&!o.contains(t.target)&&t.target!==i&&(o.style.display="none",i&&i.classList.remove("active"))});i&&i.addEventListener("click",it);function q(t){W=t,o&&(o.style.display="none"),i&&i.classList.add("active"),_&&_.classList.toggle("active",t==="dom_target"),h&&h.classList.toggle("active",t==="visual_crop"),s.tabs.query({active:!0,currentWindow:!0},e=>{e[0]?.id&&s.tabs.sendMessage(e[0].id,{type:"WT_START_SNIPE",mode:W}).catch(()=>{})})}_&&_.addEventListener("click",()=>q("dom_target"));h&&h.addEventListener("click",()=>q("visual_crop"));function K(){u=null,L&&(L.style.display="none"),m&&(m.innerHTML=""),i&&i.classList.remove("active")}D&&D.addEventListener("click",K);function ot(t){if(u=t,i&&i.classList.remove("active"),!(!L||!m))if(L.style.display="flex",t.mode==="visual_crop"&&t.cropImage){let e=t.boundingRect?`${t.boundingRect.width}\xD7${t.boundingRect.height}px`:"WebP Image",n=t.cropImage?Math.round(t.cropImage.length/120):100;m.innerHTML=`
12
+ <img class="snipe-badge-thumb" src="${t.cropImage}" alt="crop preview" />
13
+ <div class="snipe-badge-meta">
14
+ <span class="snipe-badge-title">Vision Crop Attachment</span>
15
+ <span class="snipe-badge-subtitle">${e} \u2022 WebP Image (~${n} tokens)</span>
16
+ </div>
17
+ `}else{let e=t.elements?.length||0,n=t.elements?.[0]?.selector||t.elements?.[0]?.tag||"DOM Target";m.innerHTML=`
18
+ <div class="snipe-badge-icon-box">
19
+ <svg width="18" height="18" 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>
20
+ </div>
21
+ <div class="snipe-badge-meta">
22
+ <span class="snipe-badge-title">DOM Target Attachment</span>
23
+ <span class="snipe-badge-subtitle">${e} elements \u2022 0 image tokens</span>
24
+ </div>
25
+ `}}s.runtime.onMessage.addListener(t=>{t.type==="WT_SNIPE_COMPLETED"&&t.payload&&ot(t.payload)});function X(){let t=w.value.trim();if(!t&&!u)return;let e={type:"WT_USER_NOTE",text:t||"(Targeted area annotation sent)",ts:Date.now()};u&&(e.snipe=u),s.runtime.sendMessage(e).catch(()=>{}),G(`[you] ${u?"[Snipe Attached] ":""}${t||"Annotation attached"}`,"action"),w.value="",K()}Z.addEventListener("click",X);w.addEventListener("keydown",t=>{t.key==="Enter"&&X()});function v(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}b("idle");})();
@@ -0,0 +1,547 @@
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>