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

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 (503) 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/install/dist/app-layout.d.ts +24 -0
  103. package/node_modules/@buddi/install/dist/app-layout.d.ts.map +1 -1
  104. package/node_modules/@buddi/install/dist/app-layout.js +64 -2
  105. package/node_modules/@buddi/install/dist/app-layout.js.map +1 -1
  106. package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
  107. package/node_modules/@buddi/install/dist/launcher.js +89 -10
  108. package/node_modules/@buddi/install/dist/launcher.js.map +1 -1
  109. package/node_modules/@buddi/install/dist/linux-install.d.ts +41 -0
  110. package/node_modules/@buddi/install/dist/linux-install.d.ts.map +1 -0
  111. package/node_modules/@buddi/install/dist/linux-install.js +86 -0
  112. package/node_modules/@buddi/install/dist/linux-install.js.map +1 -0
  113. package/node_modules/@buddi/install/dist/runtime-info.d.ts +23 -0
  114. package/node_modules/@buddi/install/dist/runtime-info.d.ts.map +1 -0
  115. package/node_modules/@buddi/install/dist/runtime-info.js +69 -0
  116. package/node_modules/@buddi/install/dist/runtime-info.js.map +1 -0
  117. package/node_modules/@buddi/install/dist/supervisor.d.ts.map +1 -1
  118. package/node_modules/@buddi/install/dist/supervisor.js +8 -6
  119. package/node_modules/@buddi/install/dist/supervisor.js.map +1 -1
  120. package/node_modules/@buddi/install/dist/uninstall.d.ts +20 -0
  121. package/node_modules/@buddi/install/dist/uninstall.d.ts.map +1 -1
  122. package/node_modules/@buddi/install/dist/uninstall.js +50 -1
  123. package/node_modules/@buddi/install/dist/uninstall.js.map +1 -1
  124. package/node_modules/@buddi/install/dist/upgrade.d.ts +4 -1
  125. package/node_modules/@buddi/install/dist/upgrade.d.ts.map +1 -1
  126. package/node_modules/@buddi/install/dist/upgrade.js +77 -51
  127. package/node_modules/@buddi/install/dist/upgrade.js.map +1 -1
  128. package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
  129. package/node_modules/@buddi/runtime/dist/anthropic.d.ts +7 -0
  130. package/node_modules/@buddi/runtime/dist/anthropic.d.ts.map +1 -1
  131. package/node_modules/@buddi/runtime/dist/anthropic.js +19 -1
  132. package/node_modules/@buddi/runtime/dist/anthropic.js.map +1 -1
  133. package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
  134. package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
  135. package/node_modules/@buddi/tool-browser/dist/controller.d.ts +16 -1
  136. package/node_modules/@buddi/tool-browser/dist/controller.d.ts.map +1 -1
  137. package/node_modules/@buddi/tool-browser/dist/controller.js +59 -5
  138. package/node_modules/@buddi/tool-browser/dist/controller.js.map +1 -1
  139. package/node_modules/@buddi/tool-browser/dist/driver.d.ts +12 -0
  140. package/node_modules/@buddi/tool-browser/dist/driver.d.ts.map +1 -1
  141. package/node_modules/@buddi/tool-browser/dist/driver.js +41 -2
  142. package/node_modules/@buddi/tool-browser/dist/driver.js.map +1 -1
  143. package/node_modules/@buddi/tool-browser/dist/extension.d.ts +49 -9
  144. package/node_modules/@buddi/tool-browser/dist/extension.d.ts.map +1 -1
  145. package/node_modules/@buddi/tool-browser/dist/extension.js +145 -21
  146. package/node_modules/@buddi/tool-browser/dist/extension.js.map +1 -1
  147. package/node_modules/@buddi/tool-browser/dist/index.d.ts +10 -6
  148. package/node_modules/@buddi/tool-browser/dist/index.d.ts.map +1 -1
  149. package/node_modules/@buddi/tool-browser/dist/index.js +22 -8
  150. package/node_modules/@buddi/tool-browser/dist/index.js.map +1 -1
  151. package/node_modules/@buddi/tool-browser/dist/routes.d.ts +10 -1
  152. package/node_modules/@buddi/tool-browser/dist/routes.d.ts.map +1 -1
  153. package/node_modules/@buddi/tool-browser/dist/routes.js +24 -0
  154. package/node_modules/@buddi/tool-browser/dist/routes.js.map +1 -1
  155. package/node_modules/@buddi/tool-browser/dist/service.d.ts +48 -1
  156. package/node_modules/@buddi/tool-browser/dist/service.d.ts.map +1 -1
  157. package/node_modules/@buddi/tool-browser/dist/service.js +114 -11
  158. package/node_modules/@buddi/tool-browser/dist/service.js.map +1 -1
  159. package/node_modules/@buddi/tool-browser/dist/types.d.ts +54 -3
  160. package/node_modules/@buddi/tool-browser/dist/types.d.ts.map +1 -1
  161. package/node_modules/@buddi/tool-browser/dist/types.js +17 -1
  162. package/node_modules/@buddi/tool-browser/dist/types.js.map +1 -1
  163. package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
  164. package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
  165. package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
  166. package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
  167. package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
  168. package/node_modules/@hono/node-server/package.json +2 -2
  169. package/node_modules/@types/node/README.md +1 -1
  170. package/node_modules/@types/node/package.json +2 -2
  171. package/node_modules/@types/node/util.d.ts +6 -3
  172. package/node_modules/content-disposition/README.md +105 -35
  173. package/node_modules/content-disposition/dist/index.d.ts +72 -0
  174. package/node_modules/content-disposition/dist/index.js +388 -0
  175. package/node_modules/content-disposition/dist/index.js.map +1 -0
  176. package/node_modules/content-disposition/package.json +31 -19
  177. package/node_modules/docx/dist/index.cjs +182 -80
  178. package/node_modules/docx/dist/index.d.cts +63 -6
  179. package/node_modules/docx/dist/index.d.ts +63 -6
  180. package/node_modules/docx/dist/index.iife.js +182 -80
  181. package/node_modules/docx/dist/index.mjs +182 -80
  182. package/node_modules/docx/dist/index.umd.cjs +182 -80
  183. package/node_modules/docx/dist/layout.cjs +1 -6
  184. package/node_modules/docx/dist/layout.iife.js +1 -6
  185. package/node_modules/docx/dist/layout.mjs +1 -6
  186. package/node_modules/docx/dist/layout.umd.cjs +1 -6
  187. package/node_modules/docx/package.json +4 -3
  188. package/node_modules/express/Readme.md +15 -9
  189. package/node_modules/express/lib/application.js +2 -2
  190. package/node_modules/express/lib/request.js +32 -19
  191. package/node_modules/express/lib/response.js +27 -30
  192. package/node_modules/express/node_modules/content-type/LICENSE +22 -0
  193. package/node_modules/express/node_modules/content-type/README.md +71 -0
  194. package/node_modules/express/node_modules/content-type/dist/index.d.ts +46 -0
  195. package/node_modules/express/node_modules/content-type/dist/index.js +176 -0
  196. package/node_modules/express/node_modules/content-type/dist/index.js.map +1 -0
  197. package/node_modules/express/node_modules/content-type/package.json +52 -0
  198. package/node_modules/express/package.json +10 -10
  199. package/node_modules/imapflow/CHANGELOG.md +48 -0
  200. package/node_modules/imapflow/dist/cjs/commands/append.d.ts +1 -1
  201. package/node_modules/imapflow/dist/cjs/commands/append.js +15 -4
  202. package/node_modules/imapflow/dist/cjs/commands/compress.js +2 -2
  203. package/node_modules/imapflow/dist/cjs/commands/id.js +5 -3
  204. package/node_modules/imapflow/dist/cjs/commands/idle.js +9 -9
  205. package/node_modules/imapflow/dist/cjs/commands/list.js +2 -2
  206. package/node_modules/imapflow/dist/cjs/commands/namespace.js +18 -14
  207. package/node_modules/imapflow/dist/cjs/commands/quota.js +2 -3
  208. package/node_modules/imapflow/dist/cjs/commands/select.d.ts +3 -14
  209. package/node_modules/imapflow/dist/cjs/commands/select.js +1 -4
  210. package/node_modules/imapflow/dist/cjs/commands/status.js +2 -4
  211. package/node_modules/imapflow/dist/cjs/connection-deadline.d.ts +1 -1
  212. package/node_modules/imapflow/dist/cjs/connection-deadline.js +2 -4
  213. package/node_modules/imapflow/dist/cjs/download.js +66 -35
  214. package/node_modules/imapflow/dist/cjs/errors.d.ts +15 -0
  215. package/node_modules/imapflow/dist/cjs/errors.js +22 -0
  216. package/node_modules/imapflow/dist/cjs/handler/imap-compiler.d.ts +4 -4
  217. package/node_modules/imapflow/dist/cjs/handler/imap-compiler.js +18 -18
  218. package/node_modules/imapflow/dist/cjs/handler/imap-parser.js +28 -3
  219. package/node_modules/imapflow/dist/cjs/handler/imap-stream.js +9 -8
  220. package/node_modules/imapflow/dist/cjs/handler/limits.d.ts +1 -1
  221. package/node_modules/imapflow/dist/cjs/handler/limits.js +5 -7
  222. package/node_modules/imapflow/dist/cjs/handler/parser-instance.js +23 -38
  223. package/node_modules/imapflow/dist/cjs/handler/token-parser.d.ts +12 -0
  224. package/node_modules/imapflow/dist/cjs/handler/token-parser.js +44 -104
  225. package/node_modules/imapflow/dist/cjs/imap-flow.d.ts +4 -3
  226. package/node_modules/imapflow/dist/cjs/imap-flow.js +128 -78
  227. package/node_modules/imapflow/dist/cjs/package-info.d.ts +1 -1
  228. package/node_modules/imapflow/dist/cjs/package-info.js +1 -1
  229. package/node_modules/imapflow/dist/cjs/proxy-connection.js +2 -5
  230. package/node_modules/imapflow/dist/cjs/search-compiler.js +2 -3
  231. package/node_modules/imapflow/dist/cjs/tools.d.ts +24 -3
  232. package/node_modules/imapflow/dist/cjs/tools.js +59 -18
  233. package/node_modules/imapflow/dist/cjs/types.d.ts +20 -1
  234. package/node_modules/imapflow/dist/esm/commands/append.d.ts +1 -1
  235. package/node_modules/imapflow/dist/esm/commands/append.js +15 -4
  236. package/node_modules/imapflow/dist/esm/commands/compress.js +2 -2
  237. package/node_modules/imapflow/dist/esm/commands/id.js +6 -4
  238. package/node_modules/imapflow/dist/esm/commands/idle.js +9 -9
  239. package/node_modules/imapflow/dist/esm/commands/list.js +3 -3
  240. package/node_modules/imapflow/dist/esm/commands/namespace.js +19 -15
  241. package/node_modules/imapflow/dist/esm/commands/quota.js +3 -4
  242. package/node_modules/imapflow/dist/esm/commands/select.d.ts +3 -14
  243. package/node_modules/imapflow/dist/esm/commands/select.js +1 -4
  244. package/node_modules/imapflow/dist/esm/commands/status.js +2 -4
  245. package/node_modules/imapflow/dist/esm/connection-deadline.d.ts +1 -1
  246. package/node_modules/imapflow/dist/esm/connection-deadline.js +2 -4
  247. package/node_modules/imapflow/dist/esm/download.js +66 -35
  248. package/node_modules/imapflow/dist/esm/errors.d.ts +15 -0
  249. package/node_modules/imapflow/dist/esm/errors.js +21 -0
  250. package/node_modules/imapflow/dist/esm/handler/imap-compiler.d.ts +4 -4
  251. package/node_modules/imapflow/dist/esm/handler/imap-compiler.js +18 -18
  252. package/node_modules/imapflow/dist/esm/handler/imap-parser.js +28 -3
  253. package/node_modules/imapflow/dist/esm/handler/imap-stream.js +9 -8
  254. package/node_modules/imapflow/dist/esm/handler/limits.d.ts +1 -1
  255. package/node_modules/imapflow/dist/esm/handler/limits.js +5 -7
  256. package/node_modules/imapflow/dist/esm/handler/parser-instance.js +23 -38
  257. package/node_modules/imapflow/dist/esm/handler/token-parser.d.ts +12 -0
  258. package/node_modules/imapflow/dist/esm/handler/token-parser.js +44 -104
  259. package/node_modules/imapflow/dist/esm/imap-flow.d.ts +4 -3
  260. package/node_modules/imapflow/dist/esm/imap-flow.js +130 -80
  261. package/node_modules/imapflow/dist/esm/package-info.d.ts +1 -1
  262. package/node_modules/imapflow/dist/esm/package-info.js +1 -1
  263. package/node_modules/imapflow/dist/esm/proxy-connection.js +2 -5
  264. package/node_modules/imapflow/dist/esm/search-compiler.js +2 -3
  265. package/node_modules/imapflow/dist/esm/tools.d.ts +24 -3
  266. package/node_modules/imapflow/dist/esm/tools.js +58 -19
  267. package/node_modules/imapflow/dist/esm/types.d.ts +20 -1
  268. package/node_modules/imapflow/package.json +6 -3
  269. package/node_modules/playwright/README.md +4 -4
  270. package/node_modules/playwright/lib/agents/playwright-test-generator.agent.md +1 -1
  271. package/node_modules/playwright/lib/cli/testActions.js +8 -5
  272. package/node_modules/playwright/lib/common/index.js +37 -23
  273. package/node_modules/playwright/lib/common/index.js.txt +8 -9
  274. package/node_modules/playwright/lib/index.js +16 -4
  275. package/node_modules/playwright/lib/matchers/expect.js +13 -7
  276. package/node_modules/playwright/lib/matchers/expect.js.txt +4 -4
  277. package/node_modules/playwright/lib/program.js +2 -1
  278. package/node_modules/playwright/lib/runner/index.js +438 -244
  279. package/node_modules/playwright/lib/runner/index.js.txt +12 -11
  280. package/node_modules/playwright/lib/transform/babelBundle.js +2612 -2396
  281. package/node_modules/playwright/lib/transform/babelBundle.js.LICENSE +15 -15
  282. package/node_modules/playwright/lib/transform/babelBundle.js.txt +14 -11
  283. package/node_modules/playwright/lib/transform/esmLoader.js +17 -5
  284. package/node_modules/playwright/lib/transform/esmLoader.js.txt +3 -3
  285. package/node_modules/playwright/lib/worker/workerProcessEntry.js +17 -18
  286. package/node_modules/playwright/package.json +2 -7
  287. package/node_modules/playwright/types/test.d.ts +156 -39
  288. package/node_modules/playwright-core/browsers.json +9 -9
  289. package/node_modules/playwright-core/cli.js +1 -0
  290. package/node_modules/playwright-core/lib/bootstrap.js +61 -0
  291. package/node_modules/playwright-core/lib/coreBundle.js +6393 -4170
  292. package/node_modules/playwright-core/lib/server/electron/loader.js +4 -0
  293. package/node_modules/playwright-core/lib/tools/cli-client/cli.js +2 -1
  294. package/node_modules/playwright-core/lib/tools/cli-client/help.json +99 -12
  295. package/node_modules/playwright-core/lib/tools/cli-client/output.js +17 -16
  296. package/node_modules/playwright-core/lib/tools/cli-client/program.js +8 -4
  297. package/node_modules/playwright-core/lib/tools/cli-client/session.js +2 -0
  298. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/SKILL.md +71 -3
  299. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/pr-attachments.md +60 -0
  300. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/running-code.md +4 -0
  301. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/session-management.md +2 -0
  302. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/test-generation.md +1 -1
  303. package/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/video-recording.md +76 -3
  304. package/node_modules/playwright-core/lib/tools/skills/playwright-trace/SKILL.md +1 -1
  305. package/node_modules/playwright-core/lib/utilsBundle.js +948 -227
  306. package/node_modules/playwright-core/lib/utilsBundle.js.LICENSE +6 -6
  307. package/node_modules/playwright-core/lib/vite/htmlReport/report.js +1 -1
  308. package/node_modules/playwright-core/lib/vite/recorder/assets/{codeMirrorModule-CVQWJZAA.js → codeMirrorModule-DK72OMRi.js} +1 -1
  309. package/node_modules/playwright-core/lib/vite/recorder/assets/index-Cn0mmDuv.js +129 -0
  310. package/node_modules/playwright-core/lib/vite/recorder/index.html +1 -1
  311. package/node_modules/playwright-core/lib/vite/traceViewer/assets/{codeMirrorModule-BbkfBe3n.js → codeMirrorModule-BEB2e8M3.js} +1 -1
  312. package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-D-g2vrvf.js +184 -0
  313. package/node_modules/playwright-core/lib/vite/traceViewer/assets/{xtermModule-DywYcAf8.js → xtermModule-B794rD2Z.js} +1 -1
  314. package/node_modules/playwright-core/lib/vite/traceViewer/{defaultSettingsView.Bqk9acqE.css → defaultSettingsView.C8BeHuxd.css} +1 -1
  315. package/node_modules/playwright-core/lib/vite/traceViewer/{index.B4cLoZK3.js → index.7-c5LSTW.js} +1 -1
  316. package/node_modules/playwright-core/lib/vite/traceViewer/index.html +3 -3
  317. package/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +3 -3
  318. package/node_modules/playwright-core/lib/vite/traceViewer/{uiMode.CU5KtEkS.js → uiMode.CYwC_gH1.js} +4 -4
  319. package/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +3 -3
  320. package/node_modules/playwright-core/package.json +1 -1
  321. package/node_modules/playwright-core/types/protocol.d.ts +468 -337
  322. package/node_modules/playwright-core/types/types.d.ts +572 -37
  323. package/node_modules/process-warning/.github/workflows/ci.yml +1 -1
  324. package/node_modules/process-warning/.github/workflows/lock-threads.yml +1 -1
  325. package/node_modules/process-warning/.github/workflows/release.yml +24 -0
  326. package/node_modules/process-warning/README.md +46 -46
  327. package/node_modules/process-warning/package.json +1 -1
  328. package/package.json +2 -2
  329. package/packages/cli/dist/.tsbuildinfo +1 -1
  330. package/packages/core/dist/.tsbuildinfo +1 -1
  331. package/packages/core/dist/plugin/index.d.ts +1 -1
  332. package/packages/core/dist/plugin/index.d.ts.map +1 -1
  333. package/packages/core/dist/plugin/index.js.map +1 -1
  334. package/packages/core/dist/questions/store.d.ts +3 -1
  335. package/packages/core/dist/questions/store.d.ts.map +1 -1
  336. package/packages/core/dist/questions/store.js +3 -3
  337. package/packages/core/dist/questions/store.js.map +1 -1
  338. package/packages/core/dist/questions/types.d.ts +46 -1
  339. package/packages/core/dist/questions/types.d.ts.map +1 -1
  340. package/packages/core/dist/questions/types.js +2 -1
  341. package/packages/core/dist/questions/types.js.map +1 -1
  342. package/packages/core/dist/secrets/approval.d.ts +54 -0
  343. package/packages/core/dist/secrets/approval.d.ts.map +1 -1
  344. package/packages/core/dist/secrets/approval.js +58 -1
  345. package/packages/core/dist/secrets/approval.js.map +1 -1
  346. package/packages/core/dist/secrets/settings.d.ts +178 -0
  347. package/packages/core/dist/secrets/settings.d.ts.map +1 -1
  348. package/packages/core/dist/secrets/settings.js +63 -6
  349. package/packages/core/dist/secrets/settings.js.map +1 -1
  350. package/packages/core/dist/secrets/store.d.ts +31 -0
  351. package/packages/core/dist/secrets/store.d.ts.map +1 -1
  352. package/packages/core/dist/secrets/store.js +75 -0
  353. package/packages/core/dist/secrets/store.js.map +1 -1
  354. package/packages/core/dist/secrets/use.d.ts.map +1 -1
  355. package/packages/core/dist/secrets/use.js +68 -3
  356. package/packages/core/dist/secrets/use.js.map +1 -1
  357. package/packages/core/dist/tools.d.ts +22 -0
  358. package/packages/core/dist/tools.d.ts.map +1 -1
  359. package/packages/core/dist/tools.js.map +1 -1
  360. package/packages/core/migrations/080_secret_requests.sql +14 -0
  361. package/packages/gateway/dist/.tsbuildinfo +1 -1
  362. package/packages/gateway/dist/chat/session.d.ts.map +1 -1
  363. package/packages/gateway/dist/chat/session.js +2 -1
  364. package/packages/gateway/dist/chat/session.js.map +1 -1
  365. package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
  366. package/packages/gateway/dist/missions/execute.js +3 -1
  367. package/packages/gateway/dist/missions/execute.js.map +1 -1
  368. package/packages/gateway/dist/surfaces/browser-cards.d.ts +15 -3
  369. package/packages/gateway/dist/surfaces/browser-cards.d.ts.map +1 -1
  370. package/packages/gateway/dist/surfaces/browser-cards.js +34 -7
  371. package/packages/gateway/dist/surfaces/browser-cards.js.map +1 -1
  372. package/packages/gateway/dist/surfaces/offered-actions.d.ts.map +1 -1
  373. package/packages/gateway/dist/surfaces/offered-actions.js +8 -2
  374. package/packages/gateway/dist/surfaces/offered-actions.js.map +1 -1
  375. package/packages/gateway/dist/surfaces/pending-question.d.ts +3 -1
  376. package/packages/gateway/dist/surfaces/pending-question.d.ts.map +1 -1
  377. package/packages/gateway/dist/surfaces/pending-question.js.map +1 -1
  378. package/packages/gateway/dist/surfaces/secret-request.d.ts +173 -0
  379. package/packages/gateway/dist/surfaces/secret-request.d.ts.map +1 -0
  380. package/packages/gateway/dist/surfaces/secret-request.js +332 -0
  381. package/packages/gateway/dist/surfaces/secret-request.js.map +1 -0
  382. package/packages/gateway/dist/system-context.js +1 -1
  383. package/packages/gateway/dist/system-context.js.map +1 -1
  384. package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
  385. package/packages/gateway/dist/telegram/main.js +14 -3
  386. package/packages/gateway/dist/telegram/main.js.map +1 -1
  387. package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
  388. package/packages/gateway/dist/telegram/surface.js +4 -1
  389. package/packages/gateway/dist/telegram/surface.js.map +1 -1
  390. package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
  391. package/packages/gateway/dist/web/api-routes.js +9 -1
  392. package/packages/gateway/dist/web/api-routes.js.map +1 -1
  393. package/packages/gateway/dist/web/approval-ask.js +2 -2
  394. package/packages/gateway/dist/web/approval-ask.js.map +1 -1
  395. package/packages/gateway/dist/web/browser-capture.d.ts +13 -0
  396. package/packages/gateway/dist/web/browser-capture.d.ts.map +1 -0
  397. package/packages/gateway/dist/web/browser-capture.js +24 -0
  398. package/packages/gateway/dist/web/browser-capture.js.map +1 -0
  399. package/packages/gateway/dist/web/chat.d.ts +26 -0
  400. package/packages/gateway/dist/web/chat.d.ts.map +1 -1
  401. package/packages/gateway/dist/web/chat.js +87 -2
  402. package/packages/gateway/dist/web/chat.js.map +1 -1
  403. package/packages/gateway/dist/web/extension.d.ts +30 -0
  404. package/packages/gateway/dist/web/extension.d.ts.map +1 -1
  405. package/packages/gateway/dist/web/extension.js +86 -6
  406. package/packages/gateway/dist/web/extension.js.map +1 -1
  407. package/packages/gateway/dist/web/onboarding.js +1 -1
  408. package/packages/gateway/dist/web/onboarding.js.map +1 -1
  409. package/packages/gateway/dist/web/remote-hand.d.ts +26 -2
  410. package/packages/gateway/dist/web/remote-hand.d.ts.map +1 -1
  411. package/packages/gateway/dist/web/remote-hand.js +89 -28
  412. package/packages/gateway/dist/web/remote-hand.js.map +1 -1
  413. package/packages/gateway/dist/web/secret-request.d.ts +54 -0
  414. package/packages/gateway/dist/web/secret-request.d.ts.map +1 -0
  415. package/packages/gateway/dist/web/secret-request.js +264 -0
  416. package/packages/gateway/dist/web/secret-request.js.map +1 -0
  417. package/packages/gateway/dist/web/secrets.d.ts +1 -0
  418. package/packages/gateway/dist/web/secrets.d.ts.map +1 -1
  419. package/packages/gateway/dist/web/secrets.js +1 -1
  420. package/packages/gateway/dist/web/secrets.js.map +1 -1
  421. package/packages/gateway/dist/web/server.d.ts.map +1 -1
  422. package/packages/gateway/dist/web/server.js +72 -3
  423. package/packages/gateway/dist/web/server.js.map +1 -1
  424. package/packages/install/dist/.tsbuildinfo +1 -1
  425. package/packages/install/dist/app-layout.d.ts +24 -0
  426. package/packages/install/dist/app-layout.d.ts.map +1 -1
  427. package/packages/install/dist/app-layout.js +64 -2
  428. package/packages/install/dist/app-layout.js.map +1 -1
  429. package/packages/install/dist/launcher.d.ts.map +1 -1
  430. package/packages/install/dist/launcher.js +89 -10
  431. package/packages/install/dist/launcher.js.map +1 -1
  432. package/packages/install/dist/linux-install.d.ts +41 -0
  433. package/packages/install/dist/linux-install.d.ts.map +1 -0
  434. package/packages/install/dist/linux-install.js +86 -0
  435. package/packages/install/dist/linux-install.js.map +1 -0
  436. package/packages/install/dist/runtime-info.d.ts +23 -0
  437. package/packages/install/dist/runtime-info.d.ts.map +1 -0
  438. package/packages/install/dist/runtime-info.js +69 -0
  439. package/packages/install/dist/runtime-info.js.map +1 -0
  440. package/packages/install/dist/supervisor.d.ts.map +1 -1
  441. package/packages/install/dist/supervisor.js +8 -6
  442. package/packages/install/dist/supervisor.js.map +1 -1
  443. package/packages/install/dist/uninstall.d.ts +20 -0
  444. package/packages/install/dist/uninstall.d.ts.map +1 -1
  445. package/packages/install/dist/uninstall.js +50 -1
  446. package/packages/install/dist/uninstall.js.map +1 -1
  447. package/packages/install/dist/upgrade.d.ts +4 -1
  448. package/packages/install/dist/upgrade.d.ts.map +1 -1
  449. package/packages/install/dist/upgrade.js +77 -51
  450. package/packages/install/dist/upgrade.js.map +1 -1
  451. package/packages/runtime/dist/.tsbuildinfo +1 -1
  452. package/packages/runtime/dist/anthropic.d.ts +7 -0
  453. package/packages/runtime/dist/anthropic.d.ts.map +1 -1
  454. package/packages/runtime/dist/anthropic.js +19 -1
  455. package/packages/runtime/dist/anthropic.js.map +1 -1
  456. package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
  457. package/packages/tools/browser/dist/.tsbuildinfo +1 -1
  458. package/packages/tools/browser/dist/controller.d.ts +16 -1
  459. package/packages/tools/browser/dist/controller.d.ts.map +1 -1
  460. package/packages/tools/browser/dist/controller.js +59 -5
  461. package/packages/tools/browser/dist/controller.js.map +1 -1
  462. package/packages/tools/browser/dist/driver.d.ts +12 -0
  463. package/packages/tools/browser/dist/driver.d.ts.map +1 -1
  464. package/packages/tools/browser/dist/driver.js +41 -2
  465. package/packages/tools/browser/dist/driver.js.map +1 -1
  466. package/packages/tools/browser/dist/extension.d.ts +49 -9
  467. package/packages/tools/browser/dist/extension.d.ts.map +1 -1
  468. package/packages/tools/browser/dist/extension.js +145 -21
  469. package/packages/tools/browser/dist/extension.js.map +1 -1
  470. package/packages/tools/browser/dist/index.d.ts +10 -6
  471. package/packages/tools/browser/dist/index.d.ts.map +1 -1
  472. package/packages/tools/browser/dist/index.js +22 -8
  473. package/packages/tools/browser/dist/index.js.map +1 -1
  474. package/packages/tools/browser/dist/routes.d.ts +10 -1
  475. package/packages/tools/browser/dist/routes.d.ts.map +1 -1
  476. package/packages/tools/browser/dist/routes.js +24 -0
  477. package/packages/tools/browser/dist/routes.js.map +1 -1
  478. package/packages/tools/browser/dist/service.d.ts +48 -1
  479. package/packages/tools/browser/dist/service.d.ts.map +1 -1
  480. package/packages/tools/browser/dist/service.js +114 -11
  481. package/packages/tools/browser/dist/service.js.map +1 -1
  482. package/packages/tools/browser/dist/types.d.ts +54 -3
  483. package/packages/tools/browser/dist/types.d.ts.map +1 -1
  484. package/packages/tools/browser/dist/types.js +17 -1
  485. package/packages/tools/browser/dist/types.js.map +1 -1
  486. package/packages/tools/email/dist/.tsbuildinfo +1 -1
  487. package/packages/tools/host/dist/.tsbuildinfo +1 -1
  488. package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
  489. package/packages/tools/memory/dist/.tsbuildinfo +1 -1
  490. package/packages/tools/web/dist/.tsbuildinfo +1 -1
  491. package/packages/web/dist/assets/index-DgpPl0TR.js +155 -0
  492. package/packages/web/dist/assets/index-rMRjibNI.css +1 -0
  493. package/packages/web/dist/assets/{lottie_light-D7CS-IeP.js → lottie_light-twPed1FM.js} +1 -1
  494. package/packages/web/dist/build.json +1 -1
  495. package/packages/web/dist/index.html +2 -2
  496. package/packages/web/dist/precache.json +4 -4
  497. package/node_modules/content-disposition/index.js +0 -536
  498. package/node_modules/playwright/jsx-runtime.js +0 -42
  499. package/node_modules/playwright/jsx-runtime.mjs +0 -21
  500. package/node_modules/playwright-core/lib/vite/recorder/assets/index-hrlLqLtq.js +0 -129
  501. package/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-Ds6CBOo0.js +0 -182
  502. package/packages/web/dist/assets/index-BibqUZwt.js +0 -155
  503. 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.53",
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.53"
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