@withbuddi/buddi 0.1.0-pre.50 → 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 (462) 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/cli/dist/commands.d.ts.map +1 -1
  8. package/node_modules/@buddi/cli/dist/commands.js +11 -1
  9. package/node_modules/@buddi/cli/dist/commands.js.map +1 -1
  10. package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
  11. package/node_modules/@buddi/core/dist/plugin/index.d.ts +1 -1
  12. package/node_modules/@buddi/core/dist/plugin/index.d.ts.map +1 -1
  13. package/node_modules/@buddi/core/dist/plugin/index.js.map +1 -1
  14. package/node_modules/@buddi/core/dist/questions/store.d.ts +3 -1
  15. package/node_modules/@buddi/core/dist/questions/store.d.ts.map +1 -1
  16. package/node_modules/@buddi/core/dist/questions/store.js +3 -3
  17. package/node_modules/@buddi/core/dist/questions/store.js.map +1 -1
  18. package/node_modules/@buddi/core/dist/questions/types.d.ts +46 -1
  19. package/node_modules/@buddi/core/dist/questions/types.d.ts.map +1 -1
  20. package/node_modules/@buddi/core/dist/questions/types.js +2 -1
  21. package/node_modules/@buddi/core/dist/questions/types.js.map +1 -1
  22. package/node_modules/@buddi/core/dist/registry.d.ts.map +1 -1
  23. package/node_modules/@buddi/core/dist/registry.js +11 -2
  24. package/node_modules/@buddi/core/dist/registry.js.map +1 -1
  25. package/node_modules/@buddi/core/dist/scheduler/index.d.ts +1 -0
  26. package/node_modules/@buddi/core/dist/scheduler/index.d.ts.map +1 -1
  27. package/node_modules/@buddi/core/dist/scheduler/index.js +1 -0
  28. package/node_modules/@buddi/core/dist/scheduler/index.js.map +1 -1
  29. package/node_modules/@buddi/core/dist/scheduler/manual.d.ts +50 -0
  30. package/node_modules/@buddi/core/dist/scheduler/manual.d.ts.map +1 -0
  31. package/node_modules/@buddi/core/dist/scheduler/manual.js +73 -0
  32. package/node_modules/@buddi/core/dist/scheduler/manual.js.map +1 -0
  33. package/node_modules/@buddi/core/dist/secrets/approval.d.ts +54 -0
  34. package/node_modules/@buddi/core/dist/secrets/approval.d.ts.map +1 -1
  35. package/node_modules/@buddi/core/dist/secrets/approval.js +58 -1
  36. package/node_modules/@buddi/core/dist/secrets/approval.js.map +1 -1
  37. package/node_modules/@buddi/core/dist/secrets/settings.d.ts +178 -0
  38. package/node_modules/@buddi/core/dist/secrets/settings.d.ts.map +1 -1
  39. package/node_modules/@buddi/core/dist/secrets/settings.js +63 -6
  40. package/node_modules/@buddi/core/dist/secrets/settings.js.map +1 -1
  41. package/node_modules/@buddi/core/dist/secrets/store.d.ts +31 -0
  42. package/node_modules/@buddi/core/dist/secrets/store.d.ts.map +1 -1
  43. package/node_modules/@buddi/core/dist/secrets/store.js +75 -0
  44. package/node_modules/@buddi/core/dist/secrets/store.js.map +1 -1
  45. package/node_modules/@buddi/core/dist/secrets/use.d.ts.map +1 -1
  46. package/node_modules/@buddi/core/dist/secrets/use.js +68 -3
  47. package/node_modules/@buddi/core/dist/secrets/use.js.map +1 -1
  48. package/node_modules/@buddi/core/dist/tools.d.ts +22 -0
  49. package/node_modules/@buddi/core/dist/tools.d.ts.map +1 -1
  50. package/node_modules/@buddi/core/dist/tools.js.map +1 -1
  51. package/node_modules/@buddi/core/migrations/080_secret_requests.sql +14 -0
  52. package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
  53. package/node_modules/@buddi/gateway/dist/chat/session.d.ts.map +1 -1
  54. package/node_modules/@buddi/gateway/dist/chat/session.js +2 -1
  55. package/node_modules/@buddi/gateway/dist/chat/session.js.map +1 -1
  56. package/node_modules/@buddi/gateway/dist/mcp/requests.d.ts.map +1 -1
  57. package/node_modules/@buddi/gateway/dist/mcp/requests.js +9 -1
  58. package/node_modules/@buddi/gateway/dist/mcp/requests.js.map +1 -1
  59. package/node_modules/@buddi/gateway/dist/missions/execute.d.ts.map +1 -1
  60. package/node_modules/@buddi/gateway/dist/missions/execute.js +3 -1
  61. package/node_modules/@buddi/gateway/dist/missions/execute.js.map +1 -1
  62. package/node_modules/@buddi/gateway/dist/missions/reminders.d.ts +7 -2
  63. package/node_modules/@buddi/gateway/dist/missions/reminders.d.ts.map +1 -1
  64. package/node_modules/@buddi/gateway/dist/missions/reminders.js +27 -9
  65. package/node_modules/@buddi/gateway/dist/missions/reminders.js.map +1 -1
  66. package/node_modules/@buddi/gateway/dist/missions/run-now.d.ts +38 -0
  67. package/node_modules/@buddi/gateway/dist/missions/run-now.d.ts.map +1 -0
  68. package/node_modules/@buddi/gateway/dist/missions/run-now.js +62 -0
  69. package/node_modules/@buddi/gateway/dist/missions/run-now.js.map +1 -0
  70. package/node_modules/@buddi/gateway/dist/missions-cli.d.ts +1 -1
  71. package/node_modules/@buddi/gateway/dist/missions-cli.d.ts.map +1 -1
  72. package/node_modules/@buddi/gateway/dist/missions-cli.js +21 -10
  73. package/node_modules/@buddi/gateway/dist/missions-cli.js.map +1 -1
  74. package/node_modules/@buddi/gateway/dist/serve.d.ts +3 -12
  75. package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
  76. package/node_modules/@buddi/gateway/dist/serve.js +2 -21
  77. package/node_modules/@buddi/gateway/dist/serve.js.map +1 -1
  78. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.d.ts +15 -3
  79. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.d.ts.map +1 -1
  80. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.js +34 -7
  81. package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.js.map +1 -1
  82. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  83. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js +8 -2
  84. package/node_modules/@buddi/gateway/dist/surfaces/offered-actions.js.map +1 -1
  85. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.d.ts +3 -1
  86. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
  87. package/node_modules/@buddi/gateway/dist/surfaces/pending-question.js.map +1 -1
  88. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.d.ts +173 -0
  89. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.d.ts.map +1 -0
  90. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.js +332 -0
  91. package/node_modules/@buddi/gateway/dist/surfaces/secret-request.js.map +1 -0
  92. package/node_modules/@buddi/gateway/dist/system-context.js +1 -1
  93. package/node_modules/@buddi/gateway/dist/system-context.js.map +1 -1
  94. package/node_modules/@buddi/gateway/dist/telegram/main.d.ts.map +1 -1
  95. package/node_modules/@buddi/gateway/dist/telegram/main.js +14 -3
  96. package/node_modules/@buddi/gateway/dist/telegram/main.js.map +1 -1
  97. package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
  98. package/node_modules/@buddi/gateway/dist/telegram/surface.js +4 -1
  99. package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
  100. package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts.map +1 -1
  101. package/node_modules/@buddi/gateway/dist/web/api-routes.js +16 -1
  102. package/node_modules/@buddi/gateway/dist/web/api-routes.js.map +1 -1
  103. package/node_modules/@buddi/gateway/dist/web/approval-ask.js +2 -2
  104. package/node_modules/@buddi/gateway/dist/web/approval-ask.js.map +1 -1
  105. package/node_modules/@buddi/gateway/dist/web/browser-capture.d.ts +13 -0
  106. package/node_modules/@buddi/gateway/dist/web/browser-capture.d.ts.map +1 -0
  107. package/node_modules/@buddi/gateway/dist/web/browser-capture.js +24 -0
  108. package/node_modules/@buddi/gateway/dist/web/browser-capture.js.map +1 -0
  109. package/node_modules/@buddi/gateway/dist/web/chat.d.ts +26 -0
  110. package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
  111. package/node_modules/@buddi/gateway/dist/web/chat.js +87 -2
  112. package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
  113. package/node_modules/@buddi/gateway/dist/web/extension.d.ts +30 -0
  114. package/node_modules/@buddi/gateway/dist/web/extension.d.ts.map +1 -1
  115. package/node_modules/@buddi/gateway/dist/web/extension.js +86 -6
  116. package/node_modules/@buddi/gateway/dist/web/extension.js.map +1 -1
  117. package/node_modules/@buddi/gateway/dist/web/onboarding.js +1 -1
  118. package/node_modules/@buddi/gateway/dist/web/onboarding.js.map +1 -1
  119. package/node_modules/@buddi/gateway/dist/web/read.d.ts +2 -0
  120. package/node_modules/@buddi/gateway/dist/web/read.d.ts.map +1 -1
  121. package/node_modules/@buddi/gateway/dist/web/read.js +2 -1
  122. package/node_modules/@buddi/gateway/dist/web/read.js.map +1 -1
  123. package/node_modules/@buddi/gateway/dist/web/remote-hand.d.ts +26 -2
  124. package/node_modules/@buddi/gateway/dist/web/remote-hand.d.ts.map +1 -1
  125. package/node_modules/@buddi/gateway/dist/web/remote-hand.js +89 -28
  126. package/node_modules/@buddi/gateway/dist/web/remote-hand.js.map +1 -1
  127. package/node_modules/@buddi/gateway/dist/web/secret-request.d.ts +54 -0
  128. package/node_modules/@buddi/gateway/dist/web/secret-request.d.ts.map +1 -0
  129. package/node_modules/@buddi/gateway/dist/web/secret-request.js +264 -0
  130. package/node_modules/@buddi/gateway/dist/web/secret-request.js.map +1 -0
  131. package/node_modules/@buddi/gateway/dist/web/secrets.d.ts +1 -0
  132. package/node_modules/@buddi/gateway/dist/web/secrets.d.ts.map +1 -1
  133. package/node_modules/@buddi/gateway/dist/web/secrets.js +1 -1
  134. package/node_modules/@buddi/gateway/dist/web/secrets.js.map +1 -1
  135. package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
  136. package/node_modules/@buddi/gateway/dist/web/server.js +76 -4
  137. package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
  138. package/node_modules/@buddi/gateway/dist/web/write.d.ts +14 -0
  139. package/node_modules/@buddi/gateway/dist/web/write.d.ts.map +1 -1
  140. package/node_modules/@buddi/gateway/dist/web/write.js +21 -0
  141. package/node_modules/@buddi/gateway/dist/web/write.js.map +1 -1
  142. package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
  143. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  144. package/node_modules/@buddi/runtime/dist/anthropic.d.ts +7 -0
  145. package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
  146. package/node_modules/@buddi/runtime/dist/anthropic.js +19 -1
  147. package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
  148. package/node_modules/@buddi/runtime/dist/codex-direct.d.ts +1 -1
  149. package/node_modules/@buddi/runtime/dist/codex-direct.js +1 -1
  150. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  151. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  152. package/node_modules/@buddi/tool-browser/dist/controller.d.ts +16 -1
  153. package/node_modules/@buddi/tool-browser/dist/controller.d.ts.map +1 -1
  154. package/node_modules/@buddi/tool-browser/dist/controller.js +59 -5
  155. package/node_modules/@buddi/tool-browser/dist/controller.js.map +1 -1
  156. package/node_modules/@buddi/tool-browser/dist/driver.d.ts +12 -0
  157. package/node_modules/@buddi/tool-browser/dist/driver.d.ts.map +1 -1
  158. package/node_modules/@buddi/tool-browser/dist/driver.js +41 -2
  159. package/node_modules/@buddi/tool-browser/dist/driver.js.map +1 -1
  160. package/node_modules/@buddi/tool-browser/dist/extension.d.ts +49 -9
  161. package/node_modules/@buddi/tool-browser/dist/extension.d.ts.map +1 -1
  162. package/node_modules/@buddi/tool-browser/dist/extension.js +145 -21
  163. package/node_modules/@buddi/tool-browser/dist/extension.js.map +1 -1
  164. package/node_modules/@buddi/tool-browser/dist/index.d.ts +10 -6
  165. package/node_modules/@buddi/tool-browser/dist/index.d.ts.map +1 -1
  166. package/node_modules/@buddi/tool-browser/dist/index.js +22 -8
  167. package/node_modules/@buddi/tool-browser/dist/index.js.map +1 -1
  168. package/node_modules/@buddi/tool-browser/dist/routes.d.ts +10 -1
  169. package/node_modules/@buddi/tool-browser/dist/routes.d.ts.map +1 -1
  170. package/node_modules/@buddi/tool-browser/dist/routes.js +24 -0
  171. package/node_modules/@buddi/tool-browser/dist/routes.js.map +1 -1
  172. package/node_modules/@buddi/tool-browser/dist/service.d.ts +48 -1
  173. package/node_modules/@buddi/tool-browser/dist/service.d.ts.map +1 -1
  174. package/node_modules/@buddi/tool-browser/dist/service.js +114 -11
  175. package/node_modules/@buddi/tool-browser/dist/service.js.map +1 -1
  176. package/node_modules/@buddi/tool-browser/dist/types.d.ts +54 -3
  177. package/node_modules/@buddi/tool-browser/dist/types.d.ts.map +1 -1
  178. package/node_modules/@buddi/tool-browser/dist/types.js +17 -1
  179. package/node_modules/@buddi/tool-browser/dist/types.js.map +1 -1
  180. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  181. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  182. package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
  183. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  184. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  185. package/node_modules/imapflow/CHANGELOG.md +30 -0
  186. package/node_modules/imapflow/dist/cjs/commands/authenticate.js +15 -4
  187. package/node_modules/imapflow/dist/cjs/commands/enable.js +6 -0
  188. package/node_modules/imapflow/dist/cjs/commands/fetch.js +22 -5
  189. package/node_modules/imapflow/dist/cjs/commands/select.d.ts +3 -14
  190. package/node_modules/imapflow/dist/cjs/commands/select.js +1 -4
  191. package/node_modules/imapflow/dist/cjs/commands/store.js +7 -6
  192. package/node_modules/imapflow/dist/cjs/download.js +139 -5
  193. package/node_modules/imapflow/dist/cjs/imap-flow.d.ts +2 -2
  194. package/node_modules/imapflow/dist/cjs/imap-flow.js +51 -12
  195. package/node_modules/imapflow/dist/cjs/package-info.d.ts +1 -1
  196. package/node_modules/imapflow/dist/cjs/package-info.js +1 -1
  197. package/node_modules/imapflow/dist/cjs/search-compiler.js +6 -3
  198. package/node_modules/imapflow/dist/cjs/tools.d.ts +14 -3
  199. package/node_modules/imapflow/dist/cjs/tools.js +68 -6
  200. package/node_modules/imapflow/dist/cjs/types.d.ts +9 -1
  201. package/node_modules/imapflow/dist/esm/commands/authenticate.js +15 -4
  202. package/node_modules/imapflow/dist/esm/commands/enable.js +6 -0
  203. package/node_modules/imapflow/dist/esm/commands/fetch.js +22 -5
  204. package/node_modules/imapflow/dist/esm/commands/select.d.ts +3 -14
  205. package/node_modules/imapflow/dist/esm/commands/select.js +1 -4
  206. package/node_modules/imapflow/dist/esm/commands/store.js +8 -7
  207. package/node_modules/imapflow/dist/esm/download.js +139 -5
  208. package/node_modules/imapflow/dist/esm/imap-flow.d.ts +2 -2
  209. package/node_modules/imapflow/dist/esm/imap-flow.js +52 -13
  210. package/node_modules/imapflow/dist/esm/package-info.d.ts +1 -1
  211. package/node_modules/imapflow/dist/esm/package-info.js +1 -1
  212. package/node_modules/imapflow/dist/esm/search-compiler.js +6 -3
  213. package/node_modules/imapflow/dist/esm/tools.d.ts +14 -3
  214. package/node_modules/imapflow/dist/esm/tools.js +67 -6
  215. package/node_modules/imapflow/dist/esm/types.d.ts +9 -1
  216. package/node_modules/imapflow/package.json +5 -3
  217. package/node_modules/playwright/README.md +4 -4
  218. package/node_modules/playwright/lib/agents/playwright-test-generator.agent.md +1 -1
  219. package/node_modules/playwright/lib/cli/testActions.js +8 -5
  220. package/node_modules/playwright/lib/common/index.js +37 -23
  221. package/node_modules/playwright/lib/common/index.js.txt +8 -9
  222. package/node_modules/playwright/lib/index.js +16 -4
  223. package/node_modules/playwright/lib/matchers/expect.js +13 -7
  224. package/node_modules/playwright/lib/matchers/expect.js.txt +4 -4
  225. package/node_modules/playwright/lib/program.js +2 -1
  226. package/node_modules/playwright/lib/runner/index.js +438 -244
  227. package/node_modules/playwright/lib/runner/index.js.txt +12 -11
  228. package/node_modules/playwright/lib/transform/babelBundle.js +2612 -2396
  229. package/node_modules/playwright/lib/transform/babelBundle.js.LICENSE +15 -15
  230. package/node_modules/playwright/lib/transform/babelBundle.js.txt +14 -11
  231. package/node_modules/playwright/lib/transform/esmLoader.js +17 -5
  232. package/node_modules/playwright/lib/transform/esmLoader.js.txt +3 -3
  233. package/node_modules/playwright/lib/worker/workerProcessEntry.js +17 -18
  234. package/node_modules/playwright/package.json +2 -7
  235. package/node_modules/playwright/types/test.d.ts +156 -39
  236. package/node_modules/playwright-core/browsers.json +9 -9
  237. package/node_modules/playwright-core/cli.js +1 -0
  238. package/node_modules/playwright-core/lib/bootstrap.js +61 -0
  239. package/node_modules/playwright-core/lib/coreBundle.js +6393 -4170
  240. package/node_modules/playwright-core/lib/server/electron/loader.js +4 -0
  241. package/node_modules/playwright-core/lib/tools/cli-client/cli.js +2 -1
  242. package/node_modules/playwright-core/lib/tools/cli-client/help.json +99 -12
  243. package/node_modules/playwright-core/lib/tools/cli-client/output.js +17 -16
  244. package/node_modules/playwright-core/lib/tools/cli-client/program.js +8 -4
  245. package/node_modules/playwright-core/lib/tools/cli-client/session.js +2 -0
  246. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/SKILL.md +71 -3
  247. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/pr-attachments.md +60 -0
  248. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/running-code.md +4 -0
  249. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/session-management.md +2 -0
  250. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/test-generation.md +1 -1
  251. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/video-recording.md +76 -3
  252. package/node_modules/playwright-core/lib/tools/skills/playwright-trace/SKILL.md +1 -1
  253. package/node_modules/playwright-core/lib/utilsBundle.js +948 -227
  254. package/node_modules/playwright-core/lib/utilsBundle.js.LICENSE +6 -6
  255. package/node_modules/playwright-core/lib/vite/htmlReport/report.js +1 -1
  256. package/node_modules/playwright-core/lib/vite/recorder/assets/{codeMirrorModule-CVQWJZAA.js → codeMirrorModule-DK72OMRi.js} +1 -1
  257. package/node_modules/playwright-core/lib/vite/recorder/assets/index-Cn0mmDuv.js +129 -0
  258. package/node_modules/playwright-core/lib/vite/recorder/index.html +1 -1
  259. package/node_modules/playwright-core/lib/vite/traceViewer/assets/{codeMirrorModule-BbkfBe3n.js → codeMirrorModule-BEB2e8M3.js} +1 -1
  260. package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-D-g2vrvf.js +184 -0
  261. package/node_modules/playwright-core/lib/vite/traceViewer/assets/{xtermModule-DywYcAf8.js → xtermModule-B794rD2Z.js} +1 -1
  262. package/node_modules/playwright-core/lib/vite/traceViewer/{defaultSettingsView.Bqk9acqE.css → defaultSettingsView.C8BeHuxd.css} +1 -1
  263. package/node_modules/playwright-core/lib/vite/traceViewer/{index.B4cLoZK3.js → index.7-c5LSTW.js} +1 -1
  264. package/node_modules/playwright-core/lib/vite/traceViewer/index.html +3 -3
  265. package/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +3 -3
  266. package/node_modules/playwright-core/lib/vite/traceViewer/{uiMode.CU5KtEkS.js → uiMode.CYwC_gH1.js} +4 -4
  267. package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +3 -3
  268. package/node_modules/playwright-core/package.json +1 -1
  269. package/node_modules/playwright-core/types/protocol.d.ts +468 -337
  270. package/node_modules/playwright-core/types/types.d.ts +572 -37
  271. package/package.json +2 -2
  272. package/packages/cli/dist/.tsbuildinfo +1 -1
  273. package/packages/cli/dist/commands.d.ts.map +1 -1
  274. package/packages/cli/dist/commands.js +11 -1
  275. package/packages/cli/dist/commands.js.map +1 -1
  276. package/packages/core/dist/.tsbuildinfo +1 -1
  277. package/packages/core/dist/plugin/index.d.ts +1 -1
  278. package/packages/core/dist/plugin/index.d.ts.map +1 -1
  279. package/packages/core/dist/plugin/index.js.map +1 -1
  280. package/packages/core/dist/questions/store.d.ts +3 -1
  281. package/packages/core/dist/questions/store.d.ts.map +1 -1
  282. package/packages/core/dist/questions/store.js +3 -3
  283. package/packages/core/dist/questions/store.js.map +1 -1
  284. package/packages/core/dist/questions/types.d.ts +46 -1
  285. package/packages/core/dist/questions/types.d.ts.map +1 -1
  286. package/packages/core/dist/questions/types.js +2 -1
  287. package/packages/core/dist/questions/types.js.map +1 -1
  288. package/packages/core/dist/registry.d.ts.map +1 -1
  289. package/packages/core/dist/registry.js +11 -2
  290. package/packages/core/dist/registry.js.map +1 -1
  291. package/packages/core/dist/scheduler/index.d.ts +1 -0
  292. package/packages/core/dist/scheduler/index.d.ts.map +1 -1
  293. package/packages/core/dist/scheduler/index.js +1 -0
  294. package/packages/core/dist/scheduler/index.js.map +1 -1
  295. package/packages/core/dist/scheduler/manual.d.ts +50 -0
  296. package/packages/core/dist/scheduler/manual.d.ts.map +1 -0
  297. package/packages/core/dist/scheduler/manual.js +73 -0
  298. package/packages/core/dist/scheduler/manual.js.map +1 -0
  299. package/packages/core/dist/secrets/approval.d.ts +54 -0
  300. package/packages/core/dist/secrets/approval.d.ts.map +1 -1
  301. package/packages/core/dist/secrets/approval.js +58 -1
  302. package/packages/core/dist/secrets/approval.js.map +1 -1
  303. package/packages/core/dist/secrets/settings.d.ts +178 -0
  304. package/packages/core/dist/secrets/settings.d.ts.map +1 -1
  305. package/packages/core/dist/secrets/settings.js +63 -6
  306. package/packages/core/dist/secrets/settings.js.map +1 -1
  307. package/packages/core/dist/secrets/store.d.ts +31 -0
  308. package/packages/core/dist/secrets/store.d.ts.map +1 -1
  309. package/packages/core/dist/secrets/store.js +75 -0
  310. package/packages/core/dist/secrets/store.js.map +1 -1
  311. package/packages/core/dist/secrets/use.d.ts.map +1 -1
  312. package/packages/core/dist/secrets/use.js +68 -3
  313. package/packages/core/dist/secrets/use.js.map +1 -1
  314. package/packages/core/dist/tools.d.ts +22 -0
  315. package/packages/core/dist/tools.d.ts.map +1 -1
  316. package/packages/core/dist/tools.js.map +1 -1
  317. package/packages/core/migrations/080_secret_requests.sql +14 -0
  318. package/packages/gateway/dist/.tsbuildinfo +1 -1
  319. package/packages/gateway/dist/chat/session.d.ts.map +1 -1
  320. package/packages/gateway/dist/chat/session.js +2 -1
  321. package/packages/gateway/dist/chat/session.js.map +1 -1
  322. package/packages/gateway/dist/mcp/requests.d.ts.map +1 -1
  323. package/packages/gateway/dist/mcp/requests.js +9 -1
  324. package/packages/gateway/dist/mcp/requests.js.map +1 -1
  325. package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
  326. package/packages/gateway/dist/missions/execute.js +3 -1
  327. package/packages/gateway/dist/missions/execute.js.map +1 -1
  328. package/packages/gateway/dist/missions/reminders.d.ts +7 -2
  329. package/packages/gateway/dist/missions/reminders.d.ts.map +1 -1
  330. package/packages/gateway/dist/missions/reminders.js +27 -9
  331. package/packages/gateway/dist/missions/reminders.js.map +1 -1
  332. package/packages/gateway/dist/missions/run-now.d.ts +38 -0
  333. package/packages/gateway/dist/missions/run-now.d.ts.map +1 -0
  334. package/packages/gateway/dist/missions/run-now.js +62 -0
  335. package/packages/gateway/dist/missions/run-now.js.map +1 -0
  336. package/packages/gateway/dist/missions-cli.d.ts +1 -1
  337. package/packages/gateway/dist/missions-cli.d.ts.map +1 -1
  338. package/packages/gateway/dist/missions-cli.js +21 -10
  339. package/packages/gateway/dist/missions-cli.js.map +1 -1
  340. package/packages/gateway/dist/serve.d.ts +3 -12
  341. package/packages/gateway/dist/serve.d.ts.map +1 -1
  342. package/packages/gateway/dist/serve.js +2 -21
  343. package/packages/gateway/dist/serve.js.map +1 -1
  344. package/packages/gateway/dist/surfaces/browser-cards.d.ts +15 -3
  345. package/packages/gateway/dist/surfaces/browser-cards.d.ts.map +1 -1
  346. package/packages/gateway/dist/surfaces/browser-cards.js +34 -7
  347. package/packages/gateway/dist/surfaces/browser-cards.js.map +1 -1
  348. package/packages/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  349. package/packages/gateway/dist/surfaces/offered-actions.js +8 -2
  350. package/packages/gateway/dist/surfaces/offered-actions.js.map +1 -1
  351. package/packages/gateway/dist/surfaces/pending-question.d.ts +3 -1
  352. package/packages/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
  353. package/packages/gateway/dist/surfaces/pending-question.js.map +1 -1
  354. package/packages/gateway/dist/surfaces/secret-request.d.ts +173 -0
  355. package/packages/gateway/dist/surfaces/secret-request.d.ts.map +1 -0
  356. package/packages/gateway/dist/surfaces/secret-request.js +332 -0
  357. package/packages/gateway/dist/surfaces/secret-request.js.map +1 -0
  358. package/packages/gateway/dist/system-context.js +1 -1
  359. package/packages/gateway/dist/system-context.js.map +1 -1
  360. package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
  361. package/packages/gateway/dist/telegram/main.js +14 -3
  362. package/packages/gateway/dist/telegram/main.js.map +1 -1
  363. package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
  364. package/packages/gateway/dist/telegram/surface.js +4 -1
  365. package/packages/gateway/dist/telegram/surface.js.map +1 -1
  366. package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
  367. package/packages/gateway/dist/web/api-routes.js +16 -1
  368. package/packages/gateway/dist/web/api-routes.js.map +1 -1
  369. package/packages/gateway/dist/web/approval-ask.js +2 -2
  370. package/packages/gateway/dist/web/approval-ask.js.map +1 -1
  371. package/packages/gateway/dist/web/browser-capture.d.ts +13 -0
  372. package/packages/gateway/dist/web/browser-capture.d.ts.map +1 -0
  373. package/packages/gateway/dist/web/browser-capture.js +24 -0
  374. package/packages/gateway/dist/web/browser-capture.js.map +1 -0
  375. package/packages/gateway/dist/web/chat.d.ts +26 -0
  376. package/packages/gateway/dist/web/chat.d.ts.map +1 -1
  377. package/packages/gateway/dist/web/chat.js +87 -2
  378. package/packages/gateway/dist/web/chat.js.map +1 -1
  379. package/packages/gateway/dist/web/extension.d.ts +30 -0
  380. package/packages/gateway/dist/web/extension.d.ts.map +1 -1
  381. package/packages/gateway/dist/web/extension.js +86 -6
  382. package/packages/gateway/dist/web/extension.js.map +1 -1
  383. package/packages/gateway/dist/web/onboarding.js +1 -1
  384. package/packages/gateway/dist/web/onboarding.js.map +1 -1
  385. package/packages/gateway/dist/web/read.d.ts +2 -0
  386. package/packages/gateway/dist/web/read.d.ts.map +1 -1
  387. package/packages/gateway/dist/web/read.js +2 -1
  388. package/packages/gateway/dist/web/read.js.map +1 -1
  389. package/packages/gateway/dist/web/remote-hand.d.ts +26 -2
  390. package/packages/gateway/dist/web/remote-hand.d.ts.map +1 -1
  391. package/packages/gateway/dist/web/remote-hand.js +89 -28
  392. package/packages/gateway/dist/web/remote-hand.js.map +1 -1
  393. package/packages/gateway/dist/web/secret-request.d.ts +54 -0
  394. package/packages/gateway/dist/web/secret-request.d.ts.map +1 -0
  395. package/packages/gateway/dist/web/secret-request.js +264 -0
  396. package/packages/gateway/dist/web/secret-request.js.map +1 -0
  397. package/packages/gateway/dist/web/secrets.d.ts +1 -0
  398. package/packages/gateway/dist/web/secrets.d.ts.map +1 -1
  399. package/packages/gateway/dist/web/secrets.js +1 -1
  400. package/packages/gateway/dist/web/secrets.js.map +1 -1
  401. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  402. package/packages/gateway/dist/web/server.js +76 -4
  403. package/packages/gateway/dist/web/server.js.map +1 -1
  404. package/packages/gateway/dist/web/write.d.ts +14 -0
  405. package/packages/gateway/dist/web/write.d.ts.map +1 -1
  406. package/packages/gateway/dist/web/write.js +21 -0
  407. package/packages/gateway/dist/web/write.js.map +1 -1
  408. package/packages/install/dist/.tsbuildinfo +1 -1
  409. package/packages/runtime/dist/.tsbuildinfo +1 -1
  410. package/packages/runtime/dist/anthropic.d.ts +7 -0
  411. package/packages/runtime/dist/anthropic.d.ts.map +1 -1
  412. package/packages/runtime/dist/anthropic.js +19 -1
  413. package/packages/runtime/dist/anthropic.js.map +1 -1
  414. package/packages/runtime/dist/codex-direct.d.ts +1 -1
  415. package/packages/runtime/dist/codex-direct.js +1 -1
  416. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  417. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  418. package/packages/tools/browser/dist/controller.d.ts +16 -1
  419. package/packages/tools/browser/dist/controller.d.ts.map +1 -1
  420. package/packages/tools/browser/dist/controller.js +59 -5
  421. package/packages/tools/browser/dist/controller.js.map +1 -1
  422. package/packages/tools/browser/dist/driver.d.ts +12 -0
  423. package/packages/tools/browser/dist/driver.d.ts.map +1 -1
  424. package/packages/tools/browser/dist/driver.js +41 -2
  425. package/packages/tools/browser/dist/driver.js.map +1 -1
  426. package/packages/tools/browser/dist/extension.d.ts +49 -9
  427. package/packages/tools/browser/dist/extension.d.ts.map +1 -1
  428. package/packages/tools/browser/dist/extension.js +145 -21
  429. package/packages/tools/browser/dist/extension.js.map +1 -1
  430. package/packages/tools/browser/dist/index.d.ts +10 -6
  431. package/packages/tools/browser/dist/index.d.ts.map +1 -1
  432. package/packages/tools/browser/dist/index.js +22 -8
  433. package/packages/tools/browser/dist/index.js.map +1 -1
  434. package/packages/tools/browser/dist/routes.d.ts +10 -1
  435. package/packages/tools/browser/dist/routes.d.ts.map +1 -1
  436. package/packages/tools/browser/dist/routes.js +24 -0
  437. package/packages/tools/browser/dist/routes.js.map +1 -1
  438. package/packages/tools/browser/dist/service.d.ts +48 -1
  439. package/packages/tools/browser/dist/service.d.ts.map +1 -1
  440. package/packages/tools/browser/dist/service.js +114 -11
  441. package/packages/tools/browser/dist/service.js.map +1 -1
  442. package/packages/tools/browser/dist/types.d.ts +54 -3
  443. package/packages/tools/browser/dist/types.d.ts.map +1 -1
  444. package/packages/tools/browser/dist/types.js +17 -1
  445. package/packages/tools/browser/dist/types.js.map +1 -1
  446. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  447. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  448. package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
  449. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  450. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  451. package/packages/web/dist/assets/index-oxmxR39o.js +155 -0
  452. package/packages/web/dist/assets/index-rMRjibNI.css +1 -0
  453. package/packages/web/dist/assets/{lottie_light-BJaxbmZQ.js → lottie_light-DROBTM6Y.js} +1 -1
  454. package/packages/web/dist/build.json +1 -1
  455. package/packages/web/dist/index.html +2 -2
  456. package/packages/web/dist/precache.json +4 -4
  457. package/node_modules/playwright/jsx-runtime.js +0 -42
  458. package/node_modules/playwright/jsx-runtime.mjs +0 -21
  459. package/node_modules/playwright-core/lib/vite/recorder/assets/index-hrlLqLtq.js +0 -129
  460. package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-Ds6CBOo0.js +0 -182
  461. package/packages/web/dist/assets/index-DBVZzTau.css +0 -1
  462. package/packages/web/dist/assets/index-DqoP9iYJ.js +0 -155
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "buddi",
4
- "version": "0.1.0.50",
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.50"
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