@withbuddi/buddi 0.1.0-pre.51 → 0.1.0-pre.52

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 (362) hide show
  1. package/extension/background.js +1604 -847
  2. package/extension/manifest.json +3 -3
  3. package/extension/popup.css +91 -3
  4. package/extension/popup.html +49 -32
  5. package/extension/popup.js +215 -123
  6. package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
  7. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  8. package/node_modules/@buddi/core/dist/plugin/index.d.ts +1 -1
  9. package/node_modules/@buddi/core/dist/plugin/index.d.ts.map +1 -1
  10. package/node_modules/@buddi/core/dist/plugin/index.js.map +1 -1
  11. package/node_modules/@buddi/core/dist/questions/store.d.ts +3 -1
  12. package/node_modules/@buddi/core/dist/questions/store.d.ts.map +1 -1
  13. package/node_modules/@buddi/core/dist/questions/store.js +3 -3
  14. package/node_modules/@buddi/core/dist/questions/store.js.map +1 -1
  15. package/node_modules/@buddi/core/dist/questions/types.d.ts +46 -1
  16. package/node_modules/@buddi/core/dist/questions/types.d.ts.map +1 -1
  17. package/node_modules/@buddi/core/dist/questions/types.js +2 -1
  18. package/node_modules/@buddi/core/dist/questions/types.js.map +1 -1
  19. package/node_modules/@buddi/core/dist/secrets/approval.d.ts +54 -0
  20. package/node_modules/@buddi/core/dist/secrets/approval.d.ts.map +1 -1
  21. package/node_modules/@buddi/core/dist/secrets/approval.js +58 -1
  22. package/node_modules/@buddi/core/dist/secrets/approval.js.map +1 -1
  23. package/node_modules/@buddi/core/dist/secrets/settings.d.ts +178 -0
  24. package/node_modules/@buddi/core/dist/secrets/settings.d.ts.map +1 -1
  25. package/node_modules/@buddi/core/dist/secrets/settings.js +63 -6
  26. package/node_modules/@buddi/core/dist/secrets/settings.js.map +1 -1
  27. package/node_modules/@buddi/core/dist/secrets/store.d.ts +31 -0
  28. package/node_modules/@buddi/core/dist/secrets/store.d.ts.map +1 -1
  29. package/node_modules/@buddi/core/dist/secrets/store.js +75 -0
  30. package/node_modules/@buddi/core/dist/secrets/store.js.map +1 -1
  31. package/node_modules/@buddi/core/dist/secrets/use.d.ts.map +1 -1
  32. package/node_modules/@buddi/core/dist/secrets/use.js +68 -3
  33. package/node_modules/@buddi/core/dist/secrets/use.js.map +1 -1
  34. package/node_modules/@buddi/core/dist/tools.d.ts +22 -0
  35. package/node_modules/@buddi/core/dist/tools.d.ts.map +1 -1
  36. package/node_modules/@buddi/core/dist/tools.js.map +1 -1
  37. package/node_modules/@buddi/core/migrations/080_secret_requests.sql +14 -0
  38. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  39. package/node_modules/@buddi/gateway/dist/chat/session.d.ts.map +1 -1
  40. package/node_modules/@buddi/gateway/dist/chat/session.js +2 -1
  41. package/node_modules/@buddi/gateway/dist/chat/session.js.map +1 -1
  42. package/node_modules/@buddi/gateway/dist/missions/execute.d.ts.map +1 -1
  43. package/node_modules/@buddi/gateway/dist/missions/execute.js +3 -1
  44. package/node_modules/@buddi/gateway/dist/missions/execute.js.map +1 -1
  45. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.d.ts +15 -3
  46. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.d.ts.map +1 -1
  47. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.js +34 -7
  48. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.js.map +1 -1
  49. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  50. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js +8 -2
  51. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js.map +1 -1
  52. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.d.ts +3 -1
  53. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
  54. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.js.map +1 -1
  55. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.d.ts +173 -0
  56. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.d.ts.map +1 -0
  57. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.js +332 -0
  58. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.js.map +1 -0
  59. package/node_modules/@buddi/gateway/dist/system-context.js +1 -1
  60. package/node_modules/@buddi/gateway/dist/system-context.js.map +1 -1
  61. package/node_modules/@buddi/gateway/dist/telegram/main.d.ts.map +1 -1
  62. package/node_modules/@buddi/gateway/dist/telegram/main.js +14 -3
  63. package/node_modules/@buddi/gateway/dist/telegram/main.js.map +1 -1
  64. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
  65. package/node_modules/@buddi/gateway/dist/telegram/surface.js +4 -1
  66. package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
  67. package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts.map +1 -1
  68. package/node_modules/@buddi/gateway/dist/web/api-routes.js +9 -1
  69. package/node_modules/@buddi/gateway/dist/web/api-routes.js.map +1 -1
  70. package/node_modules/@buddi/gateway/dist/web/approval-ask.js +2 -2
  71. package/node_modules/@buddi/gateway/dist/web/approval-ask.js.map +1 -1
  72. package/node_modules/@buddi/gateway/dist/web/browser-capture.d.ts +13 -0
  73. package/node_modules/@buddi/gateway/dist/web/browser-capture.d.ts.map +1 -0
  74. package/node_modules/@buddi/gateway/dist/web/browser-capture.js +24 -0
  75. package/node_modules/@buddi/gateway/dist/web/browser-capture.js.map +1 -0
  76. package/node_modules/@buddi/gateway/dist/web/chat.d.ts +26 -0
  77. package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
  78. package/node_modules/@buddi/gateway/dist/web/chat.js +87 -2
  79. package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
  80. package/node_modules/@buddi/gateway/dist/web/extension.d.ts +30 -0
  81. package/node_modules/@buddi/gateway/dist/web/extension.d.ts.map +1 -1
  82. package/node_modules/@buddi/gateway/dist/web/extension.js +86 -6
  83. package/node_modules/@buddi/gateway/dist/web/extension.js.map +1 -1
  84. package/node_modules/@buddi/gateway/dist/web/onboarding.js +1 -1
  85. package/node_modules/@buddi/gateway/dist/web/onboarding.js.map +1 -1
  86. package/node_modules/@buddi/gateway/dist/web/remote-hand.d.ts +26 -2
  87. package/node_modules/@buddi/gateway/dist/web/remote-hand.d.ts.map +1 -1
  88. package/node_modules/@buddi/gateway/dist/web/remote-hand.js +89 -28
  89. package/node_modules/@buddi/gateway/dist/web/remote-hand.js.map +1 -1
  90. package/node_modules/@buddi/gateway/dist/web/secret-request.d.ts +54 -0
  91. package/node_modules/@buddi/gateway/dist/web/secret-request.d.ts.map +1 -0
  92. package/node_modules/@buddi/gateway/dist/web/secret-request.js +264 -0
  93. package/node_modules/@buddi/gateway/dist/web/secret-request.js.map +1 -0
  94. package/node_modules/@buddi/gateway/dist/web/secrets.d.ts +1 -0
  95. package/node_modules/@buddi/gateway/dist/web/secrets.d.ts.map +1 -1
  96. package/node_modules/@buddi/gateway/dist/web/secrets.js +1 -1
  97. package/node_modules/@buddi/gateway/dist/web/secrets.js.map +1 -1
  98. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  99. package/node_modules/@buddi/gateway/dist/web/server.js +72 -3
  100. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  101. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  102. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  103. package/node_modules/@buddi/runtime/dist/anthropic.d.ts +7 -0
  104. package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
  105. package/node_modules/@buddi/runtime/dist/anthropic.js +19 -1
  106. package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
  107. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  108. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  109. package/node_modules/@buddi/tool-browser/dist/controller.d.ts +16 -1
  110. package/node_modules/@buddi/tool-browser/dist/controller.d.ts.map +1 -1
  111. package/node_modules/@buddi/tool-browser/dist/controller.js +59 -5
  112. package/node_modules/@buddi/tool-browser/dist/controller.js.map +1 -1
  113. package/node_modules/@buddi/tool-browser/dist/driver.d.ts +12 -0
  114. package/node_modules/@buddi/tool-browser/dist/driver.d.ts.map +1 -1
  115. package/node_modules/@buddi/tool-browser/dist/driver.js +41 -2
  116. package/node_modules/@buddi/tool-browser/dist/driver.js.map +1 -1
  117. package/node_modules/@buddi/tool-browser/dist/extension.d.ts +49 -9
  118. package/node_modules/@buddi/tool-browser/dist/extension.d.ts.map +1 -1
  119. package/node_modules/@buddi/tool-browser/dist/extension.js +145 -21
  120. package/node_modules/@buddi/tool-browser/dist/extension.js.map +1 -1
  121. package/node_modules/@buddi/tool-browser/dist/index.d.ts +10 -6
  122. package/node_modules/@buddi/tool-browser/dist/index.d.ts.map +1 -1
  123. package/node_modules/@buddi/tool-browser/dist/index.js +22 -8
  124. package/node_modules/@buddi/tool-browser/dist/index.js.map +1 -1
  125. package/node_modules/@buddi/tool-browser/dist/routes.d.ts +10 -1
  126. package/node_modules/@buddi/tool-browser/dist/routes.d.ts.map +1 -1
  127. package/node_modules/@buddi/tool-browser/dist/routes.js +24 -0
  128. package/node_modules/@buddi/tool-browser/dist/routes.js.map +1 -1
  129. package/node_modules/@buddi/tool-browser/dist/service.d.ts +48 -1
  130. package/node_modules/@buddi/tool-browser/dist/service.d.ts.map +1 -1
  131. package/node_modules/@buddi/tool-browser/dist/service.js +114 -11
  132. package/node_modules/@buddi/tool-browser/dist/service.js.map +1 -1
  133. package/node_modules/@buddi/tool-browser/dist/types.d.ts +54 -3
  134. package/node_modules/@buddi/tool-browser/dist/types.d.ts.map +1 -1
  135. package/node_modules/@buddi/tool-browser/dist/types.js +17 -1
  136. package/node_modules/@buddi/tool-browser/dist/types.js.map +1 -1
  137. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  138. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  139. package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
  140. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  141. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  142. package/node_modules/imapflow/CHANGELOG.md +15 -0
  143. package/node_modules/imapflow/dist/cjs/commands/select.d.ts +3 -14
  144. package/node_modules/imapflow/dist/cjs/commands/select.js +1 -4
  145. package/node_modules/imapflow/dist/cjs/imap-flow.js +30 -6
  146. package/node_modules/imapflow/dist/cjs/package-info.d.ts +1 -1
  147. package/node_modules/imapflow/dist/cjs/package-info.js +1 -1
  148. package/node_modules/imapflow/dist/cjs/tools.d.ts +10 -0
  149. package/node_modules/imapflow/dist/cjs/tools.js +29 -0
  150. package/node_modules/imapflow/dist/cjs/types.d.ts +9 -1
  151. package/node_modules/imapflow/dist/esm/commands/select.d.ts +3 -14
  152. package/node_modules/imapflow/dist/esm/commands/select.js +1 -4
  153. package/node_modules/imapflow/dist/esm/imap-flow.js +31 -7
  154. package/node_modules/imapflow/dist/esm/package-info.d.ts +1 -1
  155. package/node_modules/imapflow/dist/esm/package-info.js +1 -1
  156. package/node_modules/imapflow/dist/esm/tools.d.ts +10 -0
  157. package/node_modules/imapflow/dist/esm/tools.js +28 -0
  158. package/node_modules/imapflow/dist/esm/types.d.ts +9 -1
  159. package/node_modules/imapflow/package.json +2 -2
  160. package/node_modules/playwright/README.md +4 -4
  161. package/node_modules/playwright/lib/agents/playwright-test-generator.agent.md +1 -1
  162. package/node_modules/playwright/lib/cli/testActions.js +8 -5
  163. package/node_modules/playwright/lib/common/index.js +37 -23
  164. package/node_modules/playwright/lib/common/index.js.txt +8 -9
  165. package/node_modules/playwright/lib/index.js +16 -4
  166. package/node_modules/playwright/lib/matchers/expect.js +13 -7
  167. package/node_modules/playwright/lib/matchers/expect.js.txt +4 -4
  168. package/node_modules/playwright/lib/program.js +2 -1
  169. package/node_modules/playwright/lib/runner/index.js +438 -244
  170. package/node_modules/playwright/lib/runner/index.js.txt +12 -11
  171. package/node_modules/playwright/lib/transform/babelBundle.js +2612 -2396
  172. package/node_modules/playwright/lib/transform/babelBundle.js.LICENSE +15 -15
  173. package/node_modules/playwright/lib/transform/babelBundle.js.txt +14 -11
  174. package/node_modules/playwright/lib/transform/esmLoader.js +17 -5
  175. package/node_modules/playwright/lib/transform/esmLoader.js.txt +3 -3
  176. package/node_modules/playwright/lib/worker/workerProcessEntry.js +17 -18
  177. package/node_modules/playwright/package.json +2 -7
  178. package/node_modules/playwright/types/test.d.ts +156 -39
  179. package/node_modules/playwright-core/browsers.json +9 -9
  180. package/node_modules/playwright-core/cli.js +1 -0
  181. package/node_modules/playwright-core/lib/bootstrap.js +61 -0
  182. package/node_modules/playwright-core/lib/coreBundle.js +6393 -4170
  183. package/node_modules/playwright-core/lib/server/electron/loader.js +4 -0
  184. package/node_modules/playwright-core/lib/tools/cli-client/cli.js +2 -1
  185. package/node_modules/playwright-core/lib/tools/cli-client/help.json +99 -12
  186. package/node_modules/playwright-core/lib/tools/cli-client/output.js +17 -16
  187. package/node_modules/playwright-core/lib/tools/cli-client/program.js +8 -4
  188. package/node_modules/playwright-core/lib/tools/cli-client/session.js +2 -0
  189. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/SKILL.md +71 -3
  190. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/pr-attachments.md +60 -0
  191. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/running-code.md +4 -0
  192. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/session-management.md +2 -0
  193. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/test-generation.md +1 -1
  194. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/video-recording.md +76 -3
  195. package/node_modules/playwright-core/lib/tools/skills/playwright-trace/SKILL.md +1 -1
  196. package/node_modules/playwright-core/lib/utilsBundle.js +948 -227
  197. package/node_modules/playwright-core/lib/utilsBundle.js.LICENSE +6 -6
  198. package/node_modules/playwright-core/lib/vite/htmlReport/report.js +1 -1
  199. package/node_modules/playwright-core/lib/vite/recorder/assets/{codeMirrorModule-CVQWJZAA.js → codeMirrorModule-DK72OMRi.js} +1 -1
  200. package/node_modules/playwright-core/lib/vite/recorder/assets/index-Cn0mmDuv.js +129 -0
  201. package/node_modules/playwright-core/lib/vite/recorder/index.html +1 -1
  202. package/node_modules/playwright-core/lib/vite/traceViewer/assets/{codeMirrorModule-BbkfBe3n.js → codeMirrorModule-BEB2e8M3.js} +1 -1
  203. package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-D-g2vrvf.js +184 -0
  204. package/node_modules/playwright-core/lib/vite/traceViewer/assets/{xtermModule-DywYcAf8.js → xtermModule-B794rD2Z.js} +1 -1
  205. package/node_modules/playwright-core/lib/vite/traceViewer/{defaultSettingsView.Bqk9acqE.css → defaultSettingsView.C8BeHuxd.css} +1 -1
  206. package/node_modules/playwright-core/lib/vite/traceViewer/{index.B4cLoZK3.js → index.7-c5LSTW.js} +1 -1
  207. package/node_modules/playwright-core/lib/vite/traceViewer/index.html +3 -3
  208. package/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +3 -3
  209. package/node_modules/playwright-core/lib/vite/traceViewer/{uiMode.CU5KtEkS.js → uiMode.CYwC_gH1.js} +4 -4
  210. package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +3 -3
  211. package/node_modules/playwright-core/package.json +1 -1
  212. package/node_modules/playwright-core/types/protocol.d.ts +468 -337
  213. package/node_modules/playwright-core/types/types.d.ts +572 -37
  214. package/package.json +2 -2
  215. package/packages/cli/dist/.tsbuildinfo +1 -1
  216. package/packages/core/dist/.tsbuildinfo +1 -1
  217. package/packages/core/dist/plugin/index.d.ts +1 -1
  218. package/packages/core/dist/plugin/index.d.ts.map +1 -1
  219. package/packages/core/dist/plugin/index.js.map +1 -1
  220. package/packages/core/dist/questions/store.d.ts +3 -1
  221. package/packages/core/dist/questions/store.d.ts.map +1 -1
  222. package/packages/core/dist/questions/store.js +3 -3
  223. package/packages/core/dist/questions/store.js.map +1 -1
  224. package/packages/core/dist/questions/types.d.ts +46 -1
  225. package/packages/core/dist/questions/types.d.ts.map +1 -1
  226. package/packages/core/dist/questions/types.js +2 -1
  227. package/packages/core/dist/questions/types.js.map +1 -1
  228. package/packages/core/dist/secrets/approval.d.ts +54 -0
  229. package/packages/core/dist/secrets/approval.d.ts.map +1 -1
  230. package/packages/core/dist/secrets/approval.js +58 -1
  231. package/packages/core/dist/secrets/approval.js.map +1 -1
  232. package/packages/core/dist/secrets/settings.d.ts +178 -0
  233. package/packages/core/dist/secrets/settings.d.ts.map +1 -1
  234. package/packages/core/dist/secrets/settings.js +63 -6
  235. package/packages/core/dist/secrets/settings.js.map +1 -1
  236. package/packages/core/dist/secrets/store.d.ts +31 -0
  237. package/packages/core/dist/secrets/store.d.ts.map +1 -1
  238. package/packages/core/dist/secrets/store.js +75 -0
  239. package/packages/core/dist/secrets/store.js.map +1 -1
  240. package/packages/core/dist/secrets/use.d.ts.map +1 -1
  241. package/packages/core/dist/secrets/use.js +68 -3
  242. package/packages/core/dist/secrets/use.js.map +1 -1
  243. package/packages/core/dist/tools.d.ts +22 -0
  244. package/packages/core/dist/tools.d.ts.map +1 -1
  245. package/packages/core/dist/tools.js.map +1 -1
  246. package/packages/core/migrations/080_secret_requests.sql +14 -0
  247. package/packages/gateway/dist/.tsbuildinfo +1 -1
  248. package/packages/gateway/dist/chat/session.d.ts.map +1 -1
  249. package/packages/gateway/dist/chat/session.js +2 -1
  250. package/packages/gateway/dist/chat/session.js.map +1 -1
  251. package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
  252. package/packages/gateway/dist/missions/execute.js +3 -1
  253. package/packages/gateway/dist/missions/execute.js.map +1 -1
  254. package/packages/gateway/dist/surfaces/browser-cards.d.ts +15 -3
  255. package/packages/gateway/dist/surfaces/browser-cards.d.ts.map +1 -1
  256. package/packages/gateway/dist/surfaces/browser-cards.js +34 -7
  257. package/packages/gateway/dist/surfaces/browser-cards.js.map +1 -1
  258. package/packages/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  259. package/packages/gateway/dist/surfaces/offered-actions.js +8 -2
  260. package/packages/gateway/dist/surfaces/offered-actions.js.map +1 -1
  261. package/packages/gateway/dist/surfaces/pending-question.d.ts +3 -1
  262. package/packages/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
  263. package/packages/gateway/dist/surfaces/pending-question.js.map +1 -1
  264. package/packages/gateway/dist/surfaces/secret-request.d.ts +173 -0
  265. package/packages/gateway/dist/surfaces/secret-request.d.ts.map +1 -0
  266. package/packages/gateway/dist/surfaces/secret-request.js +332 -0
  267. package/packages/gateway/dist/surfaces/secret-request.js.map +1 -0
  268. package/packages/gateway/dist/system-context.js +1 -1
  269. package/packages/gateway/dist/system-context.js.map +1 -1
  270. package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
  271. package/packages/gateway/dist/telegram/main.js +14 -3
  272. package/packages/gateway/dist/telegram/main.js.map +1 -1
  273. package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
  274. package/packages/gateway/dist/telegram/surface.js +4 -1
  275. package/packages/gateway/dist/telegram/surface.js.map +1 -1
  276. package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
  277. package/packages/gateway/dist/web/api-routes.js +9 -1
  278. package/packages/gateway/dist/web/api-routes.js.map +1 -1
  279. package/packages/gateway/dist/web/approval-ask.js +2 -2
  280. package/packages/gateway/dist/web/approval-ask.js.map +1 -1
  281. package/packages/gateway/dist/web/browser-capture.d.ts +13 -0
  282. package/packages/gateway/dist/web/browser-capture.d.ts.map +1 -0
  283. package/packages/gateway/dist/web/browser-capture.js +24 -0
  284. package/packages/gateway/dist/web/browser-capture.js.map +1 -0
  285. package/packages/gateway/dist/web/chat.d.ts +26 -0
  286. package/packages/gateway/dist/web/chat.d.ts.map +1 -1
  287. package/packages/gateway/dist/web/chat.js +87 -2
  288. package/packages/gateway/dist/web/chat.js.map +1 -1
  289. package/packages/gateway/dist/web/extension.d.ts +30 -0
  290. package/packages/gateway/dist/web/extension.d.ts.map +1 -1
  291. package/packages/gateway/dist/web/extension.js +86 -6
  292. package/packages/gateway/dist/web/extension.js.map +1 -1
  293. package/packages/gateway/dist/web/onboarding.js +1 -1
  294. package/packages/gateway/dist/web/onboarding.js.map +1 -1
  295. package/packages/gateway/dist/web/remote-hand.d.ts +26 -2
  296. package/packages/gateway/dist/web/remote-hand.d.ts.map +1 -1
  297. package/packages/gateway/dist/web/remote-hand.js +89 -28
  298. package/packages/gateway/dist/web/remote-hand.js.map +1 -1
  299. package/packages/gateway/dist/web/secret-request.d.ts +54 -0
  300. package/packages/gateway/dist/web/secret-request.d.ts.map +1 -0
  301. package/packages/gateway/dist/web/secret-request.js +264 -0
  302. package/packages/gateway/dist/web/secret-request.js.map +1 -0
  303. package/packages/gateway/dist/web/secrets.d.ts +1 -0
  304. package/packages/gateway/dist/web/secrets.d.ts.map +1 -1
  305. package/packages/gateway/dist/web/secrets.js +1 -1
  306. package/packages/gateway/dist/web/secrets.js.map +1 -1
  307. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  308. package/packages/gateway/dist/web/server.js +72 -3
  309. package/packages/gateway/dist/web/server.js.map +1 -1
  310. package/packages/install/dist/.tsbuildinfo +1 -1
  311. package/packages/runtime/dist/.tsbuildinfo +1 -1
  312. package/packages/runtime/dist/anthropic.d.ts +7 -0
  313. package/packages/runtime/dist/anthropic.d.ts.map +1 -1
  314. package/packages/runtime/dist/anthropic.js +19 -1
  315. package/packages/runtime/dist/anthropic.js.map +1 -1
  316. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  317. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  318. package/packages/tools/browser/dist/controller.d.ts +16 -1
  319. package/packages/tools/browser/dist/controller.d.ts.map +1 -1
  320. package/packages/tools/browser/dist/controller.js +59 -5
  321. package/packages/tools/browser/dist/controller.js.map +1 -1
  322. package/packages/tools/browser/dist/driver.d.ts +12 -0
  323. package/packages/tools/browser/dist/driver.d.ts.map +1 -1
  324. package/packages/tools/browser/dist/driver.js +41 -2
  325. package/packages/tools/browser/dist/driver.js.map +1 -1
  326. package/packages/tools/browser/dist/extension.d.ts +49 -9
  327. package/packages/tools/browser/dist/extension.d.ts.map +1 -1
  328. package/packages/tools/browser/dist/extension.js +145 -21
  329. package/packages/tools/browser/dist/extension.js.map +1 -1
  330. package/packages/tools/browser/dist/index.d.ts +10 -6
  331. package/packages/tools/browser/dist/index.d.ts.map +1 -1
  332. package/packages/tools/browser/dist/index.js +22 -8
  333. package/packages/tools/browser/dist/index.js.map +1 -1
  334. package/packages/tools/browser/dist/routes.d.ts +10 -1
  335. package/packages/tools/browser/dist/routes.d.ts.map +1 -1
  336. package/packages/tools/browser/dist/routes.js +24 -0
  337. package/packages/tools/browser/dist/routes.js.map +1 -1
  338. package/packages/tools/browser/dist/service.d.ts +48 -1
  339. package/packages/tools/browser/dist/service.d.ts.map +1 -1
  340. package/packages/tools/browser/dist/service.js +114 -11
  341. package/packages/tools/browser/dist/service.js.map +1 -1
  342. package/packages/tools/browser/dist/types.d.ts +54 -3
  343. package/packages/tools/browser/dist/types.d.ts.map +1 -1
  344. package/packages/tools/browser/dist/types.js +17 -1
  345. package/packages/tools/browser/dist/types.js.map +1 -1
  346. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  347. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  348. package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
  349. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  350. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  351. package/packages/web/dist/assets/index-oxmxR39o.js +155 -0
  352. package/packages/web/dist/assets/index-rMRjibNI.css +1 -0
  353. package/packages/web/dist/assets/{lottie_light-D7CS-IeP.js → lottie_light-DROBTM6Y.js} +1 -1
  354. package/packages/web/dist/build.json +1 -1
  355. package/packages/web/dist/index.html +2 -2
  356. package/packages/web/dist/precache.json +4 -4
  357. package/node_modules/playwright/jsx-runtime.js +0 -42
  358. package/node_modules/playwright/jsx-runtime.mjs +0 -21
  359. package/node_modules/playwright-core/lib/vite/recorder/assets/index-hrlLqLtq.js +0 -129
  360. package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-Ds6CBOo0.js +0 -182
  361. package/packages/web/dist/assets/index-BibqUZwt.js +0 -155
  362. package/packages/web/dist/assets/index-DBVZzTau.css +0 -1
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "buddi",
4
- "version": "0.1.0.51",
5
- "description": "Lets your buddi work in background tabs of this browser. The sites it opens are the ones you ask it for; it opens none on its own.",
4
+ "version": "0.1.0.52",
5
+ "description": "Lets the buddis on this computer work in background tabs of this browser, opening only the sites you ask them for.",
6
6
  "minimum_chrome_version": "116",
7
7
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwR4JT/OlKKPcZQ33euO9mSv7RrSIWNVanldhT2Uzc9YfzF/X0lg5NfXLc+G/UGFjB8v+uMCbpMhRBZ2SVwDHQH3buv3VEUzuOIDTPHgv99T5lq5imZrDxmIE+EL/fWrsjhcXaIB4e4fn0tJqw6ivJUGmYpG5XhWn65nlLniHfFBKMpZ/y7bVnvfzAgMQUa13qTAVxPTpMRtNl/flQq4Q/vWYm28H7W7OzygDV+/4X2azUrB8yPk67QsipbdDLxiX2GMxjXuKK6iD5CQiytoxTsAqUzB886HbOZsxJfQpRIjrUgBmGjLyaKuz617ZGJW9zS23LmnlL6mkX3+ggca1AQIDAQAB",
8
8
  "permissions": [
@@ -45,5 +45,5 @@
45
45
  "48": "icons/48.png",
46
46
  "128": "icons/128.png"
47
47
  },
48
- "version_name": "0.1.0-pre.51"
48
+ "version_name": "0.1.0-pre.52"
49
49
  }
@@ -107,6 +107,22 @@
107
107
 
108
108
  --focus-ring: #2b6fe6;
109
109
 
110
+ /* Chrome's own tab-group colours, so a buddi's swatch matches its group. */
111
+ --group-grey: #5f6368;
112
+ --group-blue: #1a73e8;
113
+ --group-red: #d93025;
114
+ --group-yellow: #f9ab00;
115
+ --group-green: #188038;
116
+ --group-pink: #d01884;
117
+ --group-purple: #a142f4;
118
+ --group-cyan: #007b83;
119
+ --group-orange: #fa903e;
120
+
121
+ --swatch: 10px;
122
+ --switch-w: 30px;
123
+ --switch-h: 18px;
124
+ --switch-knob: 14px;
125
+
110
126
  color-scheme: light;
111
127
  }
112
128
 
@@ -211,7 +227,8 @@ p { margin: 0; }
211
227
  @keyframes view-in { from { opacity: 0; } to { opacity: 1; } }
212
228
 
213
229
  @media (prefers-reduced-motion: reduce) {
214
- .view { animation: none; }
230
+ .view, .buddi, .add { animation: none; }
231
+ .switch-track, .switch-track::after { transition: none; }
215
232
  .btn { transition: none; }
216
233
  }
217
234
 
@@ -312,7 +329,78 @@ p { margin: 0; }
312
329
  .fact { font-size: var(--text-base); font-weight: var(--weight-medium); overflow-wrap: anywhere; }
313
330
 
314
331
  .foot {
315
- margin: 0 calc(var(--space-4) * -1) calc(var(--space-4) * -1);
316
- padding: var(--space-2) var(--space-4);
332
+ display: flex;
333
+ flex-direction: column;
334
+ gap: var(--space-2);
335
+ padding: var(--space-3) var(--space-4);
336
+ border-top: 1px solid var(--line);
337
+ }
338
+
339
+ .btn[data-variant='ghost'] { border-color: transparent; background: none; }
340
+
341
+ /* ---- the buddis: one row each, a hairline between them ---- */
342
+
343
+ .buddis { margin: 0; padding: 0; list-style: none; }
344
+ .buddi {
345
+ display: flex;
346
+ flex-direction: column;
347
+ gap: var(--space-2);
348
+ padding: var(--space-3) var(--space-4);
349
+ animation: view-in var(--dur-view) var(--ease);
350
+ }
351
+ .buddi + .buddi { border-top: 1px solid var(--line); }
352
+ .buddi[data-enabled='false'] .buddi-who { opacity: 0.55; }
353
+
354
+ .buddi-head { display: flex; align-items: center; gap: var(--space-2); }
355
+ .buddi-who { display: flex; flex-direction: column; min-width: 0; flex: 1; }
356
+ .buddi-name { font-size: var(--text-base); font-weight: var(--weight-semibold); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
357
+ .buddi-address { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
358
+ .buddi-pill { margin-left: 0; }
359
+ .buddi-body { display: flex; flex-direction: column; gap: var(--space-2); }
360
+ .buddi-body:empty { display: none; }
361
+ .actions-gap { flex: 1; }
362
+
363
+ .swatch { width: var(--swatch); height: var(--swatch); flex: none; border-radius: 50%; background: var(--group-grey); }
364
+ .buddi[data-colour='blue'] .swatch { background: var(--group-blue); }
365
+ .buddi[data-colour='red'] .swatch { background: var(--group-red); }
366
+ .buddi[data-colour='yellow'] .swatch { background: var(--group-yellow); }
367
+ .buddi[data-colour='green'] .swatch { background: var(--group-green); }
368
+ .buddi[data-colour='pink'] .swatch { background: var(--group-pink); }
369
+ .buddi[data-colour='purple'] .swatch { background: var(--group-purple); }
370
+ .buddi[data-colour='cyan'] .swatch { background: var(--group-cyan); }
371
+ .buddi[data-colour='orange'] .swatch { background: var(--group-orange); }
372
+
373
+ /* The switch: a checkbox underneath, so the keyboard and a screen reader get one for free. */
374
+ .switch { position: relative; display: inline-flex; flex: none; cursor: pointer; }
375
+ .switch input { position: absolute; inset: 0; margin: 0; opacity: 0; cursor: pointer; }
376
+ .switch-track {
377
+ position: relative;
378
+ width: var(--switch-w);
379
+ height: var(--switch-h);
380
+ border-radius: var(--radius-pill);
381
+ background: var(--line-strong);
382
+ transition: background-color var(--dur-fast) ease;
383
+ }
384
+ .switch-track::after {
385
+ content: '';
386
+ position: absolute;
387
+ top: calc((var(--switch-h) - var(--switch-knob)) / 2);
388
+ left: calc((var(--switch-h) - var(--switch-knob)) / 2);
389
+ width: var(--switch-knob);
390
+ height: var(--switch-knob);
391
+ border-radius: 50%;
392
+ background: var(--surface);
393
+ transition: transform var(--dur-fast) var(--ease);
394
+ }
395
+ .switch input:checked + .switch-track { background: var(--accent); }
396
+ .switch input:checked + .switch-track::after { transform: translateX(calc(var(--switch-w) - var(--switch-h))); }
397
+ .switch input:focus-visible + .switch-track { outline: 2px solid var(--focus-ring); outline-offset: 1px; }
398
+
399
+ .add {
400
+ display: flex;
401
+ flex-direction: column;
402
+ gap: var(--space-3);
403
+ padding: var(--space-3) var(--space-4);
317
404
  border-top: 1px solid var(--line);
405
+ animation: view-in var(--dur-view) var(--ease);
318
406
  }
@@ -6,57 +6,74 @@
6
6
  <title>buddi</title>
7
7
  <link rel="stylesheet" href="popup.css" />
8
8
  </head>
9
- <body data-view="address">
9
+ <body>
10
10
  <header class="head">
11
11
  <img class="blob" src="blob.png" alt="" width="28" height="28" />
12
12
  <span class="wordmark">buddi</span>
13
13
  <span class="pill" id="pill" data-tone="idle" role="status">Not connected</span>
14
14
  </header>
15
15
 
16
- <!-- Not connected, and Connecting: the address of the buddi to pair with. -->
17
- <section class="view" id="view-address" data-view="address">
16
+ <!-- Every buddi this browser knows, one row each: its name, its address, how it stands, and its switch. -->
17
+ <ul class="buddis" id="buddis" aria-label="Your buddis"></ul>
18
+
19
+ <!-- Add a buddi: the address of another buddi on this machine. -->
20
+ <section class="add" id="add" hidden>
18
21
  <div class="field-group">
19
- <label class="label" for="gateway">Your buddi</label>
22
+ <label class="label" for="gateway">Address of the buddi to add</label>
20
23
  <input class="field" id="gateway" type="url" value="http://127.0.0.1:4317" placeholder="http://127.0.0.1:4317" spellcheck="false" autocomplete="off" />
21
- <p class="hint" id="hint">The address of the buddi running on this machine.</p>
24
+ <p class="hint" id="hint">A buddi running on this machine. Each buddi you add gets its own tab group.</p>
22
25
  </div>
23
26
  <p class="notice" id="notice" data-tone="critical" role="alert" hidden></p>
24
- <p class="quiet" id="asking" hidden>Asking your buddi for a code…</p>
25
- <div class="actions" id="address-actions">
27
+ <div class="actions">
28
+ <button class="btn" data-variant="ghost" id="add-cancel" type="button">Cancel</button>
26
29
  <button class="btn" data-variant="accent" id="connect" type="button">Connect</button>
27
30
  </div>
28
31
  </section>
29
32
 
30
- <!-- Pairing: the six digits to type into buddi. -->
31
- <section class="view" id="view-pairing" data-view="pairing" hidden>
32
- <div class="code-tile">
33
- <p class="code" id="code" aria-label="Pairing code"></p>
34
- <button class="btn" data-size="sm" id="copy" type="button">Copy</button>
35
- </div>
36
- <p class="hint">Type it into buddi under Settings → Browser&nbsp;&amp;&nbsp;apps, within five minutes. Open buddi settings may open buddi.app: if Chrome asks, allow it.</p>
37
- <div class="actions actions-split">
38
- <button class="link" id="not-this" type="button">Not this buddi</button>
39
- <button class="btn" id="open-settings" type="button">Open buddi settings</button>
40
- </div>
41
- </section>
42
-
43
- <!-- Connected: which buddi, and what it is doing here. -->
44
- <section class="view" id="view-paired" data-view="paired" hidden>
45
- <div class="facts">
46
- <p class="fact" id="paired-to"></p>
47
- <p class="quiet" id="working">Nothing open right now.</p>
48
- </div>
33
+ <footer class="foot">
49
34
  <div class="facts" id="downloads-box" hidden>
50
35
  <p class="quiet" id="downloads-note">Let agents hand buddi the files they download in your Chrome, like a bank statement. Only downloads an agent's click starts are read; yours are never touched.</p>
51
36
  </div>
52
37
  <div class="actions">
53
- <button class="btn" id="allow-downloads" type="button" hidden>Allow downloads</button>
54
- <button class="btn" id="open-buddi" type="button">Open buddi</button>
38
+ <button class="btn" data-size="sm" id="allow-downloads" type="button" hidden>Allow downloads</button>
39
+ <button class="btn" data-size="sm" id="add-open" type="button">Add a buddi</button>
55
40
  </div>
56
- <footer class="foot">
57
- <button class="link" id="forget" type="button">Forget this buddi</button>
58
- </footer>
59
- </section>
41
+ </footer>
42
+
43
+ <!-- One buddi. Filled with textContent only: names and codes come from a socket. -->
44
+ <template id="buddi-row">
45
+ <li class="buddi" data-state="offline">
46
+ <div class="buddi-head">
47
+ <span class="swatch" aria-hidden="true"></span>
48
+ <span class="buddi-who">
49
+ <span class="buddi-name"></span>
50
+ <span class="buddi-address"></span>
51
+ </span>
52
+ <span class="pill buddi-pill" data-tone="idle"></span>
53
+ <label class="switch">
54
+ <input class="buddi-switch" type="checkbox" role="switch" />
55
+ <span class="switch-track" aria-hidden="true"></span>
56
+ </label>
57
+ </div>
58
+ <div class="buddi-body">
59
+ <div class="code-tile buddi-pairing" hidden>
60
+ <p class="code" aria-label="Pairing code"></p>
61
+ <button class="btn buddi-copy" data-size="sm" type="button">Copy</button>
62
+ </div>
63
+ <p class="hint buddi-pairing-hint" hidden>Type it into this buddi under Settings → Browser&nbsp;&amp;&nbsp;apps, within five minutes. Open buddi settings may open buddi.app: if Chrome asks, allow it.</p>
64
+ <p class="quiet buddi-asking" hidden>Asking this buddi for a code…</p>
65
+ <p class="quiet buddi-working" hidden></p>
66
+ <p class="notice buddi-error" data-tone="critical" role="alert" hidden></p>
67
+ <div class="actions">
68
+ <button class="link buddi-remove" type="button">Remove</button>
69
+ <span class="actions-gap"></span>
70
+ <button class="btn buddi-retry" data-size="sm" type="button" hidden>Try again</button>
71
+ <button class="btn buddi-settings" data-size="sm" type="button" hidden>Open buddi settings</button>
72
+ <button class="btn buddi-open" data-size="sm" type="button" hidden>Open buddi</button>
73
+ </div>
74
+ </div>
75
+ </li>
76
+ </template>
60
77
 
61
78
  <script src="popup.js" type="module"></script>
62
79
  </body>
@@ -4,17 +4,30 @@ var DOWNLOADS_PERMISSION = "downloads";
4
4
  // src/popup.ts
5
5
  var SETTINGS_HASH = "#/settings/computer";
6
6
  var PILL = {
7
- offline: { word: "Not connected", tone: "idle" },
7
+ off: { word: "Off", tone: "idle" },
8
+ address: { word: "Not connected", tone: "idle" },
8
9
  connecting: { word: "Connecting\u2026", tone: "waiting" },
9
- pairing: { word: "Pairing", tone: "waiting" },
10
+ pairing: { word: "Needs pairing", tone: "waiting" },
10
11
  paired: { word: "Connected", tone: "good" }
11
12
  };
12
- function viewOf(model) {
13
- const { connection, code } = model.state;
13
+ function rowView(entry) {
14
+ if (!entry.enabled) return "off";
15
+ const { connection, code } = entry.state;
14
16
  if (connection === "paired") return "paired";
15
- if (connection === "pairing" && code && !model.editing) return "pairing";
17
+ if (connection === "pairing" && code) return "pairing";
18
+ if (connection === "connecting" || connection === "pairing") return "connecting";
16
19
  return "address";
17
20
  }
21
+ function summary(pairings) {
22
+ const views = pairings.map(rowView);
23
+ const connected = views.filter((view) => view === "paired").length;
24
+ if (connected > 1) return { word: `${connected} connected`, tone: "good" };
25
+ if (connected === 1) return PILL.paired;
26
+ if (views.includes("pairing")) return PILL.pairing;
27
+ if (views.includes("connecting")) return PILL.connecting;
28
+ const failed = pairings.some((entry) => entry.enabled && entry.state.connection === "offline" && entry.state.error);
29
+ return { word: "Not connected", tone: failed ? "bad" : "idle" };
30
+ }
18
31
  function dashboardUrl(gateway, hash = "") {
19
32
  try {
20
33
  const url = new URL(gateway);
@@ -40,28 +53,65 @@ function workingLine(tabs) {
40
53
  return tabs === 1 ? "Working in 1 tab" : `Working in ${tabs} tabs`;
41
54
  }
42
55
  var byId = (doc, id) => doc.getElementById(id);
56
+ var part = (row, name) => row.querySelector(`.${name}`);
43
57
  function render(model, doc = document) {
44
- const { state } = model;
45
- const view = viewOf(model);
46
58
  const pill = byId(doc, "pill");
47
- const { word, tone } = PILL[state.connection] ?? PILL.offline;
48
- const failure = model.refused ?? (state.connection === "offline" ? state.error : null);
59
+ const { word, tone } = summary(model.pairings);
49
60
  pill.textContent = word;
50
- pill.dataset["tone"] = failure ? "bad" : tone;
51
- for (const section of doc.querySelectorAll(".view")) section.hidden = section.dataset["view"] !== view;
52
- doc.body.dataset["view"] = view;
53
- const connecting = view === "address" && state.connection === "connecting" && !model.editing;
54
- const field = byId(doc, "gateway");
55
- field.disabled = connecting;
61
+ pill.dataset["tone"] = tone;
62
+ const list = byId(doc, "buddis");
63
+ const template = byId(doc, "buddi-row");
64
+ const existing = new Map([...list.querySelectorAll(".buddi")].map((row) => [row.dataset["id"] ?? "", row]));
65
+ const wanted = new Set(model.pairings.map((entry) => entry.id));
66
+ for (const [id, row] of existing) if (!wanted.has(id)) row.remove();
67
+ for (const entry of model.pairings) {
68
+ let row = existing.get(entry.id);
69
+ if (!row) {
70
+ row = template.content.firstElementChild.cloneNode(true);
71
+ row.dataset["id"] = entry.id;
72
+ }
73
+ list.appendChild(row);
74
+ drawRow(row, entry);
75
+ }
76
+ list.hidden = model.pairings.length === 0;
77
+ const adding = model.adding || model.pairings.length === 0;
78
+ byId(doc, "add").hidden = !adding;
79
+ byId(doc, "add-open").hidden = adding;
80
+ byId(doc, "add-cancel").hidden = model.pairings.length === 0;
56
81
  const notice = byId(doc, "notice");
57
- notice.hidden = !failure || connecting;
58
- notice.textContent = failure ?? "";
59
- byId(doc, "asking").hidden = !connecting;
60
- byId(doc, "address-actions").hidden = connecting;
61
- byId(doc, "connect").textContent = failure ? "Try again" : "Connect";
62
- byId(doc, "code").textContent = view === "pairing" ? groupCode(state.code ?? "") : "";
63
- byId(doc, "paired-to").textContent = view === "paired" ? `Your buddi at ${state.installation ?? hostOf(model.gateway)}` : "";
64
- byId(doc, "working").textContent = workingLine(model.tabs);
82
+ notice.hidden = !model.refused;
83
+ notice.textContent = model.refused ?? "";
84
+ byId(doc, "hint").textContent = model.asked ? `The buddi at ${hostOf(model.asked)} asked to be added. Each buddi you add gets its own tab group.` : "A buddi running on this machine. Each buddi you add gets its own tab group.";
85
+ }
86
+ function drawRow(row, entry) {
87
+ const view = rowView(entry);
88
+ row.dataset["state"] = view;
89
+ row.dataset["enabled"] = entry.enabled ? "true" : "false";
90
+ row.dataset["colour"] = entry.colour;
91
+ part(row, "buddi-name").textContent = entry.name;
92
+ const address = part(row, "buddi-address");
93
+ address.textContent = hostOf(entry.origin);
94
+ address.hidden = entry.name === hostOf(entry.origin);
95
+ const failure = view === "address" ? entry.state.error : null;
96
+ const pill = part(row, "buddi-pill");
97
+ pill.textContent = PILL[view].word;
98
+ pill.dataset["tone"] = failure ? "bad" : PILL[view].tone;
99
+ const toggle = part(row, "buddi-switch");
100
+ toggle.checked = entry.enabled;
101
+ toggle.setAttribute("aria-label", `Work for ${entry.name}`);
102
+ part(row, "buddi-pairing").hidden = view !== "pairing";
103
+ part(row, "code").textContent = view === "pairing" ? groupCode(entry.state.code ?? "") : "";
104
+ part(row, "buddi-pairing-hint").hidden = view !== "pairing";
105
+ part(row, "buddi-asking").hidden = view !== "connecting";
106
+ const working = part(row, "buddi-working");
107
+ working.hidden = view !== "paired";
108
+ working.textContent = view === "paired" ? entry.state.older ? `${workingLine(entry.tabs).replace(/\.$/, "")} \xB7 older buddi: live view off` : workingLine(entry.tabs) : "";
109
+ const error = part(row, "buddi-error");
110
+ error.hidden = !failure;
111
+ error.textContent = failure ?? "";
112
+ part(row, "buddi-retry").hidden = view !== "address";
113
+ part(row, "buddi-settings").hidden = view !== "pairing";
114
+ part(row, "buddi-open").hidden = view !== "paired";
65
115
  }
66
116
  var APP_WAIT_MS = 1500;
67
117
  function digitsOf(code) {
@@ -110,23 +160,25 @@ function openSettings(options) {
110
160
  });
111
161
  }
112
162
  var COPIED_FOR = 2e3;
163
+ var restores = /* @__PURE__ */ new WeakMap();
164
+ function copyInto(button, read) {
165
+ void (async () => {
166
+ try {
167
+ await navigator.clipboard.writeText(read());
168
+ } catch {
169
+ return;
170
+ }
171
+ button.textContent = "Copied";
172
+ const pending = restores.get(button);
173
+ if (pending) clearTimeout(pending);
174
+ restores.set(button, setTimeout(() => {
175
+ button.textContent = "Copy";
176
+ restores.delete(button);
177
+ }, COPIED_FOR));
178
+ })();
179
+ }
113
180
  function wireCopy(button, read) {
114
- let restore;
115
- button.addEventListener("click", () => {
116
- void (async () => {
117
- try {
118
- await navigator.clipboard.writeText(read());
119
- } catch {
120
- return;
121
- }
122
- button.textContent = "Copied";
123
- if (restore) clearTimeout(restore);
124
- restore = setTimeout(() => {
125
- button.textContent = "Copy";
126
- restore = void 0;
127
- }, COPIED_FOR);
128
- })();
129
- });
181
+ button.addEventListener("click", () => copyInto(button, read));
130
182
  }
131
183
  async function wireDownloads(doc, permissions) {
132
184
  const box = byId(doc, "downloads-box");
@@ -141,14 +193,25 @@ async function wireDownloads(doc, permissions) {
141
193
  void permissions.request({ permissions: [DOWNLOADS_PERMISSION] }).then(show, () => void 0);
142
194
  });
143
195
  }
144
- async function countBuddiTabs(api) {
145
- try {
146
- const groups = new Set((await api.tabGroups.query({ title: "buddi" })).map((group) => group.id));
147
- if (groups.size === 0) return 0;
148
- return (await api.tabs.query({})).filter((tab) => tab.groupId !== void 0 && groups.has(tab.groupId)).length;
149
- } catch {
150
- return null;
151
- }
196
+ var REDRAW_MS = 1e3;
197
+ function throttle(run, ms, clock = { now: () => Date.now(), later: (fn, wait) => setTimeout(fn, wait) }) {
198
+ let last = -Infinity;
199
+ let waiting = false;
200
+ return () => {
201
+ const now = clock.now();
202
+ if (now - last >= ms && !waiting) {
203
+ last = now;
204
+ run();
205
+ return;
206
+ }
207
+ if (waiting) return;
208
+ waiting = true;
209
+ clock.later(() => {
210
+ waiting = false;
211
+ last = clock.now();
212
+ run();
213
+ }, Math.max(0, ms - (now - last)));
214
+ };
152
215
  }
153
216
  async function ask(message) {
154
217
  try {
@@ -157,118 +220,147 @@ async function ask(message) {
157
220
  return void 0;
158
221
  }
159
222
  }
223
+ function rowOf(target, model) {
224
+ const row = target?.closest?.(".buddi");
225
+ const entry = row ? model.pairings.find((candidate) => candidate.id === row.dataset["id"]) : void 0;
226
+ return row && entry ? { row, entry } : null;
227
+ }
160
228
  async function main() {
161
229
  const field = byId(document, "gateway");
162
- const model = {
163
- state: { connection: "offline", code: null, installation: null, error: null },
164
- gateway: field.value,
165
- editing: false,
166
- tabs: null,
167
- refused: null
168
- };
230
+ const model = { pairings: [], adding: false, asked: null, refused: null };
169
231
  const draw = () => render(model, document);
170
- const recount = async () => {
171
- if (model.state.connection !== "paired") return;
172
- model.tabs = await countBuddiTabs(chrome);
232
+ const take = (answer) => {
233
+ if (!answer) return;
234
+ if (answer.pairings) model.pairings = answer.pairings;
235
+ if (answer.asked !== void 0) model.asked = answer.asked;
236
+ if (model.asked && !model.adding && document.activeElement !== field) field.value = model.asked;
237
+ };
238
+ const refresh = async () => {
239
+ take(await ask({ type: "buddi-get-state" }));
173
240
  draw();
174
241
  };
175
- const address = await ask({ type: "buddi-gateway" });
176
- if (address?.gateway) {
177
- model.gateway = address.gateway;
178
- field.value = address.gateway;
179
- }
180
- const current = await ask({ type: "buddi-get-state" });
181
- if (current?.state) model.state = current.state;
242
+ const pushed = throttle(() => {
243
+ void refresh();
244
+ }, REDRAW_MS);
245
+ await refresh();
246
+ if (model.asked) model.adding = true;
182
247
  draw();
183
- void recount();
184
248
  chrome.runtime.onMessage.addListener((message) => {
185
- const frame = message;
186
- if (frame?.type !== "buddi-state" || !frame.state) return;
187
- model.state = frame.state;
188
- draw();
189
- void recount();
249
+ if (message?.type === "buddi-state") pushed();
190
250
  });
191
251
  setInterval(() => {
192
- void ask({ type: "buddi-get-state" }).then((answer) => {
193
- if (!answer?.state || JSON.stringify(answer.state) === JSON.stringify(model.state)) return;
194
- model.state = answer.state;
252
+ pushed();
253
+ }, 3e3);
254
+ const list = byId(document, "buddis");
255
+ list.addEventListener("change", (event) => {
256
+ const hit = rowOf(event.target, model);
257
+ if (!hit || !event.target.classList.contains("buddi-switch")) return;
258
+ void ask({ type: "buddi-enable", id: hit.entry.id, enabled: event.target.checked }).then((answer) => {
259
+ take(answer);
195
260
  draw();
196
- void recount();
197
261
  });
198
- }, 3e3);
199
- wireCopy(byId(document, "copy"), () => byId(document, "code").textContent ?? "");
200
- byId(document, "connect").addEventListener("click", async () => {
201
- const gateway = field.value.trim();
262
+ });
263
+ list.addEventListener("click", (event) => {
264
+ const hit = rowOf(event.target, model);
265
+ const button = event.target?.closest?.("button");
266
+ if (!hit || !button) return;
267
+ const { entry, row } = hit;
268
+ if (button.classList.contains("buddi-copy")) {
269
+ copyInto(button, () => part(row, "code").textContent ?? "");
270
+ return;
271
+ }
272
+ if (button.classList.contains("buddi-retry")) {
273
+ void ask({ type: "buddi-retry", id: entry.id }).then((answer) => {
274
+ take(answer);
275
+ draw();
276
+ });
277
+ return;
278
+ }
279
+ if (button.classList.contains("buddi-remove")) {
280
+ void ask({ type: "buddi-remove", id: entry.id }).then((answer) => {
281
+ take(answer);
282
+ draw();
283
+ });
284
+ return;
285
+ }
286
+ if (button.classList.contains("buddi-open")) {
287
+ const url = dashboardUrl(entry.origin);
288
+ if (url) void chrome.tabs.create({ url });
289
+ return;
290
+ }
291
+ if (button.classList.contains("buddi-settings")) {
292
+ let lost = false;
293
+ const away = () => {
294
+ lost = true;
295
+ };
296
+ window.addEventListener("blur", away, { once: true });
297
+ document.addEventListener("visibilitychange", away, { once: true });
298
+ openSettings({
299
+ gateway: entry.origin,
300
+ code: entry.state.connection === "pairing" ? entry.state.code : null,
301
+ userAgent: navigator.userAgent,
302
+ // A link clicked in this page: Chrome hands buddi:// to the app registered for it, or does nothing.
303
+ launch: (url) => {
304
+ const link = document.createElement("a");
305
+ link.href = url;
306
+ link.rel = "noopener";
307
+ link.click();
308
+ },
309
+ openTab: (url) => {
310
+ void chrome.tabs.create({ url });
311
+ },
312
+ focusLost: () => lost || !document.hasFocus()
313
+ });
314
+ }
315
+ });
316
+ const connect = async () => {
202
317
  model.refused = null;
203
- model.editing = false;
204
- const answer = await ask({ type: "buddi-connect", gateway });
318
+ const answer = await ask({ type: "buddi-add", gateway: field.value.trim() });
205
319
  if (answer?.error) model.refused = answer.error;
206
- else model.gateway = gateway || model.gateway;
207
- if (answer?.state) model.state = answer.state;
320
+ else {
321
+ model.adding = false;
322
+ model.asked = null;
323
+ }
324
+ take(answer);
208
325
  draw();
326
+ };
327
+ byId(document, "connect").addEventListener("click", () => {
328
+ void connect();
209
329
  });
210
330
  field.addEventListener("keydown", (event) => {
211
- if (event.key === "Enter") byId(document, "connect").click();
331
+ if (event.key === "Enter") void connect();
212
332
  });
213
- byId(document, "not-this").addEventListener("click", () => {
214
- model.editing = true;
333
+ byId(document, "add-open").addEventListener("click", () => {
334
+ model.adding = true;
335
+ model.refused = null;
215
336
  draw();
216
337
  field.focus();
217
338
  field.select();
218
339
  });
219
- const open = (hash) => {
220
- const url = dashboardUrl(model.gateway, hash);
221
- if (url) void chrome.tabs.create({ url });
222
- };
223
- byId(document, "open-settings").addEventListener("click", () => {
224
- let lost = false;
225
- const away = () => {
226
- lost = true;
227
- };
228
- window.addEventListener("blur", away, { once: true });
229
- document.addEventListener("visibilitychange", away, { once: true });
230
- openSettings({
231
- gateway: model.gateway,
232
- code: model.state.connection === "pairing" ? model.state.code : null,
233
- userAgent: navigator.userAgent,
234
- // A link clicked in this page: Chrome hands buddi:// to the app registered for it, or does nothing.
235
- launch: (url) => {
236
- const link = document.createElement("a");
237
- link.href = url;
238
- link.rel = "noopener";
239
- link.click();
240
- },
241
- openTab: (url) => {
242
- void chrome.tabs.create({ url });
243
- },
244
- focusLost: () => lost || !document.hasFocus()
245
- });
340
+ byId(document, "add-cancel").addEventListener("click", () => {
341
+ model.adding = false;
342
+ model.refused = null;
343
+ draw();
246
344
  });
247
- byId(document, "open-buddi").addEventListener("click", () => open(""));
248
345
  void wireDownloads(document, chrome.permissions);
249
- byId(document, "forget").addEventListener("click", async () => {
250
- const answer = await ask({ type: "buddi-forget" });
251
- if (answer?.state) {
252
- model.state = answer.state;
253
- model.tabs = null;
254
- draw();
255
- }
256
- });
257
346
  }
258
347
  if (typeof chrome !== "undefined" && chrome?.runtime?.onMessage) void main();
259
348
  export {
260
349
  APP_WAIT_MS,
261
350
  COPIED_FOR,
351
+ REDRAW_MS,
262
352
  SETTINGS_HASH,
263
353
  appSettingsLink,
264
- countBuddiTabs,
354
+ copyInto,
265
355
  dashboardUrl,
266
356
  groupCode,
267
357
  openSettings,
268
358
  render,
359
+ rowView,
269
360
  settingsWebUrl,
361
+ summary,
362
+ throttle,
270
363
  triesApp,
271
- viewOf,
272
364
  wireCopy,
273
365
  wireDownloads,
274
366
  workingLine