@withbuddi/buddi 0.1.0-pre.37 → 0.1.0-pre.39
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.
- package/extension/background.js +764 -32
- package/extension/manifest.json +2 -2
- package/node_modules/@buddi/cli/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/cli/dist/access-cmd.d.ts +10 -0
- package/node_modules/@buddi/cli/dist/access-cmd.d.ts.map +1 -0
- package/node_modules/@buddi/cli/dist/access-cmd.js +180 -0
- package/node_modules/@buddi/cli/dist/access-cmd.js.map +1 -0
- package/node_modules/@buddi/cli/dist/args.d.ts +10 -0
- package/node_modules/@buddi/cli/dist/args.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/args.js +34 -1
- package/node_modules/@buddi/cli/dist/args.js.map +1 -1
- package/node_modules/@buddi/cli/dist/commands.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/commands.js +39 -2
- package/node_modules/@buddi/cli/dist/commands.js.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor-probes.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor-probes.js +54 -29
- package/node_modules/@buddi/cli/dist/doctor-probes.js.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor.d.ts +36 -12
- package/node_modules/@buddi/cli/dist/doctor.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/doctor.js +32 -9
- package/node_modules/@buddi/cli/dist/doctor.js.map +1 -1
- package/node_modules/@buddi/cli/dist/main.d.ts +2 -0
- package/node_modules/@buddi/cli/dist/main.d.ts.map +1 -1
- package/node_modules/@buddi/cli/dist/main.js +20 -2
- package/node_modules/@buddi/cli/dist/main.js.map +1 -1
- package/node_modules/@buddi/core/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/core/dist/agents/catalog.d.ts +2 -0
- package/node_modules/@buddi/core/dist/agents/catalog.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/agents/catalog.js +1 -0
- package/node_modules/@buddi/core/dist/agents/catalog.js.map +1 -1
- package/node_modules/@buddi/core/dist/agents/edit.d.ts +2 -0
- package/node_modules/@buddi/core/dist/agents/edit.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/agents/edit.js +3 -1
- package/node_modules/@buddi/core/dist/agents/edit.js.map +1 -1
- package/node_modules/@buddi/core/dist/agents/frontmatter.d.ts +11 -0
- package/node_modules/@buddi/core/dist/agents/frontmatter.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/agents/frontmatter.js +7 -0
- package/node_modules/@buddi/core/dist/agents/frontmatter.js.map +1 -1
- package/node_modules/@buddi/core/dist/index.d.ts +1 -0
- package/node_modules/@buddi/core/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/index.js +1 -0
- package/node_modules/@buddi/core/dist/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/plugin/index.d.ts +3 -0
- package/node_modules/@buddi/core/dist/plugin/index.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/plugin/index.js +3 -0
- package/node_modules/@buddi/core/dist/plugin/index.js.map +1 -1
- package/node_modules/@buddi/core/dist/plugin/version.d.ts +1 -1
- package/node_modules/@buddi/core/dist/plugin/version.js +1 -1
- package/node_modules/@buddi/core/dist/questions/store.d.ts +12 -0
- package/node_modules/@buddi/core/dist/questions/store.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/questions/store.js +11 -1
- package/node_modules/@buddi/core/dist/questions/store.js.map +1 -1
- package/node_modules/@buddi/core/dist/questions/types.d.ts +8 -0
- package/node_modules/@buddi/core/dist/questions/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/questions/types.js +15 -0
- package/node_modules/@buddi/core/dist/questions/types.js.map +1 -1
- package/node_modules/@buddi/core/dist/queue/jobs.d.ts +8 -0
- package/node_modules/@buddi/core/dist/queue/jobs.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/queue/jobs.js +9 -3
- package/node_modules/@buddi/core/dist/queue/jobs.js.map +1 -1
- package/node_modules/@buddi/core/dist/queue/worker.d.ts +2 -0
- package/node_modules/@buddi/core/dist/queue/worker.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/queue/worker.js +2 -1
- package/node_modules/@buddi/core/dist/queue/worker.js.map +1 -1
- package/node_modules/@buddi/core/dist/registry.d.ts +7 -1
- package/node_modules/@buddi/core/dist/registry.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/registry.js +73 -11
- package/node_modules/@buddi/core/dist/registry.js.map +1 -1
- package/node_modules/@buddi/core/dist/routes.d.ts +153 -0
- package/node_modules/@buddi/core/dist/routes.d.ts.map +1 -0
- package/node_modules/@buddi/core/dist/routes.js +47 -0
- package/node_modules/@buddi/core/dist/routes.js.map +1 -0
- package/node_modules/@buddi/core/dist/scheduler/missions.d.ts +5 -3
- package/node_modules/@buddi/core/dist/scheduler/missions.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/scheduler/missions.js +9 -7
- package/node_modules/@buddi/core/dist/scheduler/missions.js.map +1 -1
- package/node_modules/@buddi/core/dist/scheduler/types.d.ts +7 -0
- package/node_modules/@buddi/core/dist/scheduler/types.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/scheduler/types.js +1 -0
- package/node_modules/@buddi/core/dist/scheduler/types.js.map +1 -1
- package/node_modules/@buddi/core/dist/tools.d.ts +59 -2
- package/node_modules/@buddi/core/dist/tools.d.ts.map +1 -1
- package/node_modules/@buddi/core/dist/tools.js.map +1 -1
- package/node_modules/@buddi/core/migrations/075_access_providers.sql +43 -0
- package/node_modules/@buddi/core/migrations/076_mission_browser.sql +7 -0
- package/node_modules/@buddi/gateway/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/gateway/dist/agents/canvas.d.ts +12 -12
- package/node_modules/@buddi/gateway/dist/agents/catalogue-package.d.ts +38 -20
- package/node_modules/@buddi/gateway/dist/agents/catalogue-package.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/catalogue-package.js +6 -0
- package/node_modules/@buddi/gateway/dist/agents/catalogue-package.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/delegation.d.ts +10 -0
- package/node_modules/@buddi/gateway/dist/agents/delegation.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/delegation.js +1 -0
- package/node_modules/@buddi/gateway/dist/agents/delegation.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/platform-catalogue.d.ts +7 -1
- package/node_modules/@buddi/gateway/dist/agents/platform-catalogue.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/agents/platform-catalogue.js +15 -6
- package/node_modules/@buddi/gateway/dist/agents/platform-catalogue.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/bootstrap.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/bootstrap.js +8 -0
- package/node_modules/@buddi/gateway/dist/bootstrap.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/browser-host.d.ts +30 -1
- package/node_modules/@buddi/gateway/dist/browser-host.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/browser-host.js +56 -1
- package/node_modules/@buddi/gateway/dist/browser-host.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/chat/session.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/chat/session.js +9 -5
- package/node_modules/@buddi/gateway/dist/chat/session.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/index.d.ts +2 -1
- package/node_modules/@buddi/gateway/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/index.js +2 -1
- package/node_modules/@buddi/gateway/dist/index.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/ask-cap.d.ts +26 -0
- package/node_modules/@buddi/gateway/dist/missions/ask-cap.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/missions/ask-cap.js +83 -0
- package/node_modules/@buddi/gateway/dist/missions/ask-cap.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/missions/execute.d.ts +45 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/execute.js +156 -10
- package/node_modules/@buddi/gateway/dist/missions/execute.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/missions/parked.d.ts +139 -0
- package/node_modules/@buddi/gateway/dist/missions/parked.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/missions/parked.js +255 -0
- package/node_modules/@buddi/gateway/dist/missions/parked.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/serve.d.ts +7 -0
- package/node_modules/@buddi/gateway/dist/serve.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/serve.js +49 -9
- package/node_modules/@buddi/gateway/dist/serve.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.d.ts +18 -0
- package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.js +42 -0
- package/node_modules/@buddi/gateway/dist/surfaces/browser-cards.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/surfaces/browser-continuation.js +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/browser-continuation.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/owner-request.d.ts +6 -0
- package/node_modules/@buddi/gateway/dist/surfaces/owner-request.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/surfaces/owner-request.js +7 -1
- package/node_modules/@buddi/gateway/dist/surfaces/owner-request.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/system-context.d.ts +7 -0
- package/node_modules/@buddi/gateway/dist/system-context.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/system-context.js +14 -7
- package/node_modules/@buddi/gateway/dist/system-context.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/browser-view.d.ts +17 -17
- package/node_modules/@buddi/gateway/dist/telegram/browser-view.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/browser-view.js +33 -37
- package/node_modules/@buddi/gateway/dist/telegram/browser-view.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/channel.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/channel.js +17 -1
- package/node_modules/@buddi/gateway/dist/telegram/channel.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/main.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/main.js +11 -3
- package/node_modules/@buddi/gateway/dist/telegram/main.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/surface.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/telegram/surface.js +10 -0
- package/node_modules/@buddi/gateway/dist/telegram/surface.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/tips/facts.d.ts +8 -0
- package/node_modules/@buddi/gateway/dist/tips/facts.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/tips/facts.js +8 -2
- package/node_modules/@buddi/gateway/dist/tips/facts.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/tips/rules.d.ts +2 -0
- package/node_modules/@buddi/gateway/dist/tips/rules.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/tips/rules.js +15 -0
- package/node_modules/@buddi/gateway/dist/tips/rules.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/access/arrival.d.ts +24 -0
- package/node_modules/@buddi/gateway/dist/web/access/arrival.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/arrival.js +18 -0
- package/node_modules/@buddi/gateway/dist/web/access/arrival.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-api.d.ts +124 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-api.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-api.js +206 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-api.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-setup.d.ts +163 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-setup.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-setup.js +438 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-setup.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-token.d.ts +31 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-token.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-token.js +74 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare-token.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare.d.ts +145 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare.js +474 -0
- package/node_modules/@buddi/gateway/dist/web/access/cloudflare.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/index.d.ts +9 -0
- package/node_modules/@buddi/gateway/dist/web/access/index.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/index.js +9 -0
- package/node_modules/@buddi/gateway/dist/web/access/index.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/ingress.d.ts +30 -0
- package/node_modules/@buddi/gateway/dist/web/access/ingress.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/ingress.js +76 -0
- package/node_modules/@buddi/gateway/dist/web/access/ingress.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/provider.d.ts +173 -0
- package/node_modules/@buddi/gateway/dist/web/access/provider.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/provider.js +11 -0
- package/node_modules/@buddi/gateway/dist/web/access/provider.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/registry.d.ts +33 -0
- package/node_modules/@buddi/gateway/dist/web/access/registry.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/access/registry.js +32 -0
- package/node_modules/@buddi/gateway/dist/web/access/registry.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/{tailscale.d.ts → access/tailscale.d.ts} +27 -0
- package/node_modules/@buddi/gateway/dist/web/access/tailscale.d.ts.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/{tailscale.js → access/tailscale.js} +118 -3
- package/node_modules/@buddi/gateway/dist/web/access/tailscale.js.map +1 -0
- package/node_modules/@buddi/gateway/dist/web/agents.d.ts +2 -0
- package/node_modules/@buddi/gateway/dist/web/agents.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/agents.js +19 -1
- package/node_modules/@buddi/gateway/dist/web/agents.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts +4 -3
- package/node_modules/@buddi/gateway/dist/web/api-routes.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/api-routes.js +106 -19
- package/node_modules/@buddi/gateway/dist/web/api-routes.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/attention.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/attention.js +11 -3
- package/node_modules/@buddi/gateway/dist/web/attention.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/chat.d.ts +23 -0
- package/node_modules/@buddi/gateway/dist/web/chat.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/chat.js +62 -2
- package/node_modules/@buddi/gateway/dist/web/chat.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/client-key.d.ts +3 -0
- package/node_modules/@buddi/gateway/dist/web/client-key.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/client-key.js +8 -1
- package/node_modules/@buddi/gateway/dist/web/client-key.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/extension.d.ts +21 -1
- package/node_modules/@buddi/gateway/dist/web/extension.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/extension.js +183 -3
- package/node_modules/@buddi/gateway/dist/web/extension.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/http.d.ts +7 -0
- package/node_modules/@buddi/gateway/dist/web/http.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/http.js +15 -1
- package/node_modules/@buddi/gateway/dist/web/http.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/index.d.ts +1 -1
- package/node_modules/@buddi/gateway/dist/web/index.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/index.js +1 -1
- package/node_modules/@buddi/gateway/dist/web/index.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/onboarding.js +1 -1
- package/node_modules/@buddi/gateway/dist/web/onboarding.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/remote-hand.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/remote-hand.js +45 -2
- package/node_modules/@buddi/gateway/dist/web/remote-hand.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/secrets.d.ts +26 -1
- package/node_modules/@buddi/gateway/dist/web/secrets.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/secrets.js +66 -3
- package/node_modules/@buddi/gateway/dist/web/secrets.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.d.ts +38 -2
- package/node_modules/@buddi/gateway/dist/web/server.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/server.js +634 -147
- package/node_modules/@buddi/gateway/dist/web/server.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/sessions.d.ts +24 -14
- package/node_modules/@buddi/gateway/dist/web/sessions.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/sessions.js +42 -14
- package/node_modules/@buddi/gateway/dist/web/sessions.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/signed-out.d.ts +10 -0
- package/node_modules/@buddi/gateway/dist/web/signed-out.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/signed-out.js +47 -0
- package/node_modules/@buddi/gateway/dist/web/signed-out.js.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/version.d.ts +2 -0
- package/node_modules/@buddi/gateway/dist/web/version.d.ts.map +1 -1
- package/node_modules/@buddi/gateway/dist/web/version.js +5 -1
- package/node_modules/@buddi/gateway/dist/web/version.js.map +1 -1
- package/node_modules/@buddi/install/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/install/dist/app-layout.d.ts +127 -0
- package/node_modules/@buddi/install/dist/app-layout.d.ts.map +1 -0
- package/node_modules/@buddi/install/dist/app-layout.js +323 -0
- package/node_modules/@buddi/install/dist/app-layout.js.map +1 -0
- package/node_modules/@buddi/install/dist/index.d.ts +1 -0
- package/node_modules/@buddi/install/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/index.js +1 -0
- package/node_modules/@buddi/install/dist/index.js.map +1 -1
- package/node_modules/@buddi/install/dist/launcher.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/launcher.js +18 -4
- package/node_modules/@buddi/install/dist/launcher.js.map +1 -1
- package/node_modules/@buddi/install/dist/provenance.d.ts +34 -0
- package/node_modules/@buddi/install/dist/provenance.d.ts.map +1 -0
- package/node_modules/@buddi/install/dist/provenance.js +200 -0
- package/node_modules/@buddi/install/dist/provenance.js.map +1 -0
- package/node_modules/@buddi/install/dist/supervisor.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/supervisor.js +9 -4
- package/node_modules/@buddi/install/dist/supervisor.js.map +1 -1
- package/node_modules/@buddi/install/dist/upgrade.d.ts +77 -3
- package/node_modules/@buddi/install/dist/upgrade.d.ts.map +1 -1
- package/node_modules/@buddi/install/dist/upgrade.js +325 -43
- package/node_modules/@buddi/install/dist/upgrade.js.map +1 -1
- package/node_modules/@buddi/runtime/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/runtime/dist/delegate.d.ts +8 -0
- package/node_modules/@buddi/runtime/dist/delegate.d.ts.map +1 -1
- package/node_modules/@buddi/runtime/dist/delegate.js +19 -1
- package/node_modules/@buddi/runtime/dist/delegate.js.map +1 -1
- package/node_modules/@buddi/runtime/dist/loop.d.ts +2 -0
- package/node_modules/@buddi/runtime/dist/loop.d.ts.map +1 -1
- package/node_modules/@buddi/runtime/dist/loop.js +18 -4
- package/node_modules/@buddi/runtime/dist/loop.js.map +1 -1
- package/node_modules/@buddi/tool-artifacts/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-browser/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-browser/dist/availability.d.ts +2 -2
- package/node_modules/@buddi/tool-browser/dist/availability.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/availability.js +2 -2
- package/node_modules/@buddi/tool-browser/dist/availability.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/controller.d.ts +82 -58
- package/node_modules/@buddi/tool-browser/dist/controller.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/controller.js +823 -217
- package/node_modules/@buddi/tool-browser/dist/controller.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/driver.d.ts +3 -1
- package/node_modules/@buddi/tool-browser/dist/driver.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/driver.js +82 -1
- package/node_modules/@buddi/tool-browser/dist/driver.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/extension.d.ts +70 -5
- package/node_modules/@buddi/tool-browser/dist/extension.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/extension.js +94 -9
- package/node_modules/@buddi/tool-browser/dist/extension.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/index.d.ts +17 -7
- package/node_modules/@buddi/tool-browser/dist/index.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/index.js +35 -15
- package/node_modules/@buddi/tool-browser/dist/index.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/logins.d.ts +150 -0
- package/node_modules/@buddi/tool-browser/dist/logins.d.ts.map +1 -0
- package/node_modules/@buddi/tool-browser/dist/logins.js +476 -0
- package/node_modules/@buddi/tool-browser/dist/logins.js.map +1 -0
- package/node_modules/@buddi/tool-browser/dist/manager.d.ts +39 -21
- package/node_modules/@buddi/tool-browser/dist/manager.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/manager.js +229 -136
- package/node_modules/@buddi/tool-browser/dist/manager.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/routes.d.ts +151 -0
- package/node_modules/@buddi/tool-browser/dist/routes.d.ts.map +1 -0
- package/node_modules/@buddi/tool-browser/dist/routes.js +331 -0
- package/node_modules/@buddi/tool-browser/dist/routes.js.map +1 -0
- package/node_modules/@buddi/tool-browser/dist/secrets.d.ts +3 -1
- package/node_modules/@buddi/tool-browser/dist/secrets.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/secrets.js +10 -6
- package/node_modules/@buddi/tool-browser/dist/secrets.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/service.d.ts +182 -115
- package/node_modules/@buddi/tool-browser/dist/service.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/service.js +491 -388
- package/node_modules/@buddi/tool-browser/dist/service.js.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/settings.d.ts +88 -0
- package/node_modules/@buddi/tool-browser/dist/settings.d.ts.map +1 -0
- package/node_modules/@buddi/tool-browser/dist/settings.js +86 -0
- package/node_modules/@buddi/tool-browser/dist/settings.js.map +1 -0
- package/node_modules/@buddi/tool-browser/dist/telemetry.d.ts +203 -0
- package/node_modules/@buddi/tool-browser/dist/telemetry.d.ts.map +1 -0
- package/node_modules/@buddi/tool-browser/dist/telemetry.js +142 -0
- package/node_modules/@buddi/tool-browser/dist/telemetry.js.map +1 -0
- package/node_modules/@buddi/tool-browser/dist/types.d.ts +102 -3
- package/node_modules/@buddi/tool-browser/dist/types.d.ts.map +1 -1
- package/node_modules/@buddi/tool-browser/dist/types.js +27 -9
- package/node_modules/@buddi/tool-browser/dist/types.js.map +1 -1
- package/node_modules/@buddi/tool-email/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-host/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-mcp/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-memory/dist/.tsbuildinfo +1 -1
- package/node_modules/@buddi/tool-web/dist/.tsbuildinfo +1 -1
- package/node_modules/hono/dist/cjs/hono-base.js +2 -0
- package/node_modules/hono/dist/cjs/middleware/language/language.js +1 -1
- package/node_modules/hono/dist/cjs/middleware/mount/index.js +71 -0
- package/node_modules/hono/dist/cjs/request.js +4 -4
- package/node_modules/hono/dist/hono-base.js +2 -0
- package/node_modules/hono/dist/middleware/mount/index.js +70 -0
- package/node_modules/hono/dist/request.js +4 -4
- package/node_modules/hono/dist/types/hono-base.d.ts +2 -0
- package/node_modules/hono/dist/types/jsx/base.d.ts +1 -1
- package/node_modules/hono/dist/types/middleware/mount/index.d.ts +46 -0
- package/node_modules/hono/dist/types/request.d.ts +4 -4
- package/node_modules/hono/package.json +9 -1
- package/node_modules/imapflow/CHANGELOG.md +15 -0
- package/node_modules/imapflow/dist/cjs/package-info.d.ts +1 -1
- package/node_modules/imapflow/dist/cjs/package-info.js +1 -1
- package/node_modules/imapflow/dist/cjs/search-compiler.js +21 -31
- package/node_modules/imapflow/dist/esm/package-info.d.ts +1 -1
- package/node_modules/imapflow/dist/esm/package-info.js +1 -1
- package/node_modules/imapflow/dist/esm/search-compiler.js +21 -31
- package/node_modules/imapflow/package.json +2 -2
- package/node_modules/pino/CONTRIBUTING.md +1 -5
- package/node_modules/pino/LICENSE +1 -1
- package/node_modules/pino/README.md +1 -1
- package/node_modules/pino/SECURITY.md +2 -18
- package/node_modules/pino/browser.js +8 -68
- package/node_modules/pino/docs/api.md +4 -75
- package/node_modules/pino/docs/asynchronous.md +3 -18
- package/node_modules/pino/docs/browser.md +0 -63
- package/node_modules/pino/docs/child-loggers.md +1 -22
- package/node_modules/pino/docs/ecosystem.md +0 -1
- package/node_modules/pino/docs/help.md +3 -11
- package/node_modules/pino/docs/lts.md +0 -29
- package/node_modules/pino/docs/pretty.md +0 -3
- package/node_modules/pino/docs/redaction.md +8 -3
- package/node_modules/pino/docs/transports.md +0 -71
- package/node_modules/pino/docs/web.md +14 -11
- package/node_modules/pino/eslint.config.js +7 -15
- package/node_modules/pino/lib/caller.js +0 -10
- package/node_modules/pino/lib/meta.js +1 -1
- package/node_modules/pino/lib/multistream.js +7 -15
- package/node_modules/pino/lib/redaction.js +3 -8
- package/node_modules/pino/lib/symbols.js +1 -3
- package/node_modules/pino/lib/tools.js +2 -2
- package/node_modules/pino/lib/transport.js +1 -14
- package/node_modules/pino/lib/worker.js +1 -4
- package/node_modules/pino/package.json +22 -14
- package/node_modules/pino/pino.d.ts +736 -709
- package/node_modules/pino/pino.js +2 -27
- package/node_modules/pino/test/basic.test.js +0 -66
- package/node_modules/pino/test/escaping.test.js +0 -17
- package/node_modules/pino/test/fixtures/ts/transpile.cjs +3 -3
- package/node_modules/pino/test/helper.js +2 -6
- package/node_modules/pino/test/multistream.test.js +0 -64
- package/node_modules/pino/test/redact.test.js +0 -30
- package/node_modules/pino/test/transport/core.test.js +0 -85
- package/node_modules/pino/test/transport/sync-false.test.js +0 -12
- package/node_modules/pino/test/transport/uses-pino-config.test.js +4 -4
- package/node_modules/pino/test/types/pino-import.test-d.cts +30 -0
- package/node_modules/pino/test/types/pino-multistream.test-d.ts +28 -0
- package/node_modules/pino/test/types/pino-top-export.test-d.ts +34 -0
- package/node_modules/pino/test/types/{pino-transport.tst.ts → pino-transport.test-d.ts} +70 -85
- package/node_modules/pino/test/types/pino-type-only.test-d.ts +75 -0
- package/node_modules/pino/test/types/{pino.tst.ts → pino.test-d.ts} +137 -135
- package/node_modules/pino/test/types/pino.ts +7 -14
- package/node_modules/pino/tsconfig.json +6 -6
- package/node_modules/real-require/README.md +6 -6
- package/node_modules/real-require/package.json +21 -10
- package/node_modules/real-require/src/index.js +2 -2
- package/node_modules/thread-stream/node_modules/real-require/LICENSE.md +21 -0
- package/node_modules/thread-stream/node_modules/real-require/README.md +51 -0
- package/node_modules/thread-stream/node_modules/real-require/package.json +38 -0
- package/node_modules/thread-stream/node_modules/real-require/src/index.js +14 -0
- package/package.json +2 -2
- package/packages/cli/dist/.tsbuildinfo +1 -1
- package/packages/cli/dist/access-cmd.d.ts +10 -0
- package/packages/cli/dist/access-cmd.d.ts.map +1 -0
- package/packages/cli/dist/access-cmd.js +180 -0
- package/packages/cli/dist/access-cmd.js.map +1 -0
- package/packages/cli/dist/args.d.ts +10 -0
- package/packages/cli/dist/args.d.ts.map +1 -1
- package/packages/cli/dist/args.js +34 -1
- package/packages/cli/dist/args.js.map +1 -1
- package/packages/cli/dist/commands.d.ts.map +1 -1
- package/packages/cli/dist/commands.js +39 -2
- package/packages/cli/dist/commands.js.map +1 -1
- package/packages/cli/dist/doctor-probes.d.ts.map +1 -1
- package/packages/cli/dist/doctor-probes.js +54 -29
- package/packages/cli/dist/doctor-probes.js.map +1 -1
- package/packages/cli/dist/doctor.d.ts +36 -12
- package/packages/cli/dist/doctor.d.ts.map +1 -1
- package/packages/cli/dist/doctor.js +32 -9
- package/packages/cli/dist/doctor.js.map +1 -1
- package/packages/cli/dist/main.d.ts +2 -0
- package/packages/cli/dist/main.d.ts.map +1 -1
- package/packages/cli/dist/main.js +20 -2
- package/packages/cli/dist/main.js.map +1 -1
- package/packages/core/dist/.tsbuildinfo +1 -1
- package/packages/core/dist/agents/catalog.d.ts +2 -0
- package/packages/core/dist/agents/catalog.d.ts.map +1 -1
- package/packages/core/dist/agents/catalog.js +1 -0
- package/packages/core/dist/agents/catalog.js.map +1 -1
- package/packages/core/dist/agents/edit.d.ts +2 -0
- package/packages/core/dist/agents/edit.d.ts.map +1 -1
- package/packages/core/dist/agents/edit.js +3 -1
- package/packages/core/dist/agents/edit.js.map +1 -1
- package/packages/core/dist/agents/frontmatter.d.ts +11 -0
- package/packages/core/dist/agents/frontmatter.d.ts.map +1 -1
- package/packages/core/dist/agents/frontmatter.js +7 -0
- package/packages/core/dist/agents/frontmatter.js.map +1 -1
- package/packages/core/dist/index.d.ts +1 -0
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/index.js +1 -0
- package/packages/core/dist/index.js.map +1 -1
- package/packages/core/dist/plugin/index.d.ts +3 -0
- package/packages/core/dist/plugin/index.d.ts.map +1 -1
- package/packages/core/dist/plugin/index.js +3 -0
- package/packages/core/dist/plugin/index.js.map +1 -1
- package/packages/core/dist/plugin/version.d.ts +1 -1
- package/packages/core/dist/plugin/version.js +1 -1
- package/packages/core/dist/questions/store.d.ts +12 -0
- package/packages/core/dist/questions/store.d.ts.map +1 -1
- package/packages/core/dist/questions/store.js +11 -1
- package/packages/core/dist/questions/store.js.map +1 -1
- package/packages/core/dist/questions/types.d.ts +8 -0
- package/packages/core/dist/questions/types.d.ts.map +1 -1
- package/packages/core/dist/questions/types.js +15 -0
- package/packages/core/dist/questions/types.js.map +1 -1
- package/packages/core/dist/queue/jobs.d.ts +8 -0
- package/packages/core/dist/queue/jobs.d.ts.map +1 -1
- package/packages/core/dist/queue/jobs.js +9 -3
- package/packages/core/dist/queue/jobs.js.map +1 -1
- package/packages/core/dist/queue/worker.d.ts +2 -0
- package/packages/core/dist/queue/worker.d.ts.map +1 -1
- package/packages/core/dist/queue/worker.js +2 -1
- package/packages/core/dist/queue/worker.js.map +1 -1
- package/packages/core/dist/registry.d.ts +7 -1
- package/packages/core/dist/registry.d.ts.map +1 -1
- package/packages/core/dist/registry.js +73 -11
- package/packages/core/dist/registry.js.map +1 -1
- package/packages/core/dist/routes.d.ts +153 -0
- package/packages/core/dist/routes.d.ts.map +1 -0
- package/packages/core/dist/routes.js +47 -0
- package/packages/core/dist/routes.js.map +1 -0
- package/packages/core/dist/scheduler/missions.d.ts +5 -3
- package/packages/core/dist/scheduler/missions.d.ts.map +1 -1
- package/packages/core/dist/scheduler/missions.js +9 -7
- package/packages/core/dist/scheduler/missions.js.map +1 -1
- package/packages/core/dist/scheduler/types.d.ts +7 -0
- package/packages/core/dist/scheduler/types.d.ts.map +1 -1
- package/packages/core/dist/scheduler/types.js +1 -0
- package/packages/core/dist/scheduler/types.js.map +1 -1
- package/packages/core/dist/tools.d.ts +59 -2
- package/packages/core/dist/tools.d.ts.map +1 -1
- package/packages/core/dist/tools.js.map +1 -1
- package/packages/core/migrations/075_access_providers.sql +43 -0
- package/packages/core/migrations/076_mission_browser.sql +7 -0
- package/packages/gateway/dist/.tsbuildinfo +1 -1
- package/packages/gateway/dist/agents/canvas.d.ts +12 -12
- package/packages/gateway/dist/agents/catalogue-package.d.ts +38 -20
- package/packages/gateway/dist/agents/catalogue-package.d.ts.map +1 -1
- package/packages/gateway/dist/agents/catalogue-package.js +6 -0
- package/packages/gateway/dist/agents/catalogue-package.js.map +1 -1
- package/packages/gateway/dist/agents/delegation.d.ts +10 -0
- package/packages/gateway/dist/agents/delegation.d.ts.map +1 -1
- package/packages/gateway/dist/agents/delegation.js +1 -0
- package/packages/gateway/dist/agents/delegation.js.map +1 -1
- package/packages/gateway/dist/agents/platform-catalogue.d.ts +7 -1
- package/packages/gateway/dist/agents/platform-catalogue.d.ts.map +1 -1
- package/packages/gateway/dist/agents/platform-catalogue.js +15 -6
- package/packages/gateway/dist/agents/platform-catalogue.js.map +1 -1
- package/packages/gateway/dist/bootstrap.d.ts.map +1 -1
- package/packages/gateway/dist/bootstrap.js +8 -0
- package/packages/gateway/dist/bootstrap.js.map +1 -1
- package/packages/gateway/dist/browser-host.d.ts +30 -1
- package/packages/gateway/dist/browser-host.d.ts.map +1 -1
- package/packages/gateway/dist/browser-host.js +56 -1
- package/packages/gateway/dist/browser-host.js.map +1 -1
- package/packages/gateway/dist/chat/session.d.ts.map +1 -1
- package/packages/gateway/dist/chat/session.js +9 -5
- package/packages/gateway/dist/chat/session.js.map +1 -1
- package/packages/gateway/dist/index.d.ts +2 -1
- package/packages/gateway/dist/index.d.ts.map +1 -1
- package/packages/gateway/dist/index.js +2 -1
- package/packages/gateway/dist/index.js.map +1 -1
- package/packages/gateway/dist/missions/ask-cap.d.ts +26 -0
- package/packages/gateway/dist/missions/ask-cap.d.ts.map +1 -0
- package/packages/gateway/dist/missions/ask-cap.js +83 -0
- package/packages/gateway/dist/missions/ask-cap.js.map +1 -0
- package/packages/gateway/dist/missions/execute.d.ts +45 -1
- package/packages/gateway/dist/missions/execute.d.ts.map +1 -1
- package/packages/gateway/dist/missions/execute.js +156 -10
- package/packages/gateway/dist/missions/execute.js.map +1 -1
- package/packages/gateway/dist/missions/parked.d.ts +139 -0
- package/packages/gateway/dist/missions/parked.d.ts.map +1 -0
- package/packages/gateway/dist/missions/parked.js +255 -0
- package/packages/gateway/dist/missions/parked.js.map +1 -0
- package/packages/gateway/dist/serve.d.ts +7 -0
- package/packages/gateway/dist/serve.d.ts.map +1 -1
- package/packages/gateway/dist/serve.js +49 -9
- package/packages/gateway/dist/serve.js.map +1 -1
- package/packages/gateway/dist/surfaces/browser-cards.d.ts +18 -0
- package/packages/gateway/dist/surfaces/browser-cards.d.ts.map +1 -0
- package/packages/gateway/dist/surfaces/browser-cards.js +42 -0
- package/packages/gateway/dist/surfaces/browser-cards.js.map +1 -0
- package/packages/gateway/dist/surfaces/browser-continuation.js +1 -1
- package/packages/gateway/dist/surfaces/browser-continuation.js.map +1 -1
- package/packages/gateway/dist/surfaces/owner-request.d.ts +6 -0
- package/packages/gateway/dist/surfaces/owner-request.d.ts.map +1 -1
- package/packages/gateway/dist/surfaces/owner-request.js +7 -1
- package/packages/gateway/dist/surfaces/owner-request.js.map +1 -1
- package/packages/gateway/dist/system-context.d.ts +7 -0
- package/packages/gateway/dist/system-context.d.ts.map +1 -1
- package/packages/gateway/dist/system-context.js +14 -7
- package/packages/gateway/dist/system-context.js.map +1 -1
- package/packages/gateway/dist/telegram/browser-view.d.ts +17 -17
- package/packages/gateway/dist/telegram/browser-view.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/browser-view.js +33 -37
- package/packages/gateway/dist/telegram/browser-view.js.map +1 -1
- package/packages/gateway/dist/telegram/channel.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/channel.js +17 -1
- package/packages/gateway/dist/telegram/channel.js.map +1 -1
- package/packages/gateway/dist/telegram/main.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/main.js +11 -3
- package/packages/gateway/dist/telegram/main.js.map +1 -1
- package/packages/gateway/dist/telegram/surface.d.ts.map +1 -1
- package/packages/gateway/dist/telegram/surface.js +10 -0
- package/packages/gateway/dist/telegram/surface.js.map +1 -1
- package/packages/gateway/dist/tips/facts.d.ts +8 -0
- package/packages/gateway/dist/tips/facts.d.ts.map +1 -1
- package/packages/gateway/dist/tips/facts.js +8 -2
- package/packages/gateway/dist/tips/facts.js.map +1 -1
- package/packages/gateway/dist/tips/rules.d.ts +2 -0
- package/packages/gateway/dist/tips/rules.d.ts.map +1 -1
- package/packages/gateway/dist/tips/rules.js +15 -0
- package/packages/gateway/dist/tips/rules.js.map +1 -1
- package/packages/gateway/dist/web/access/arrival.d.ts +24 -0
- package/packages/gateway/dist/web/access/arrival.d.ts.map +1 -0
- package/packages/gateway/dist/web/access/arrival.js +18 -0
- package/packages/gateway/dist/web/access/arrival.js.map +1 -0
- package/packages/gateway/dist/web/access/cloudflare-api.d.ts +124 -0
- package/packages/gateway/dist/web/access/cloudflare-api.d.ts.map +1 -0
- package/packages/gateway/dist/web/access/cloudflare-api.js +206 -0
- package/packages/gateway/dist/web/access/cloudflare-api.js.map +1 -0
- package/packages/gateway/dist/web/access/cloudflare-setup.d.ts +163 -0
- package/packages/gateway/dist/web/access/cloudflare-setup.d.ts.map +1 -0
- package/packages/gateway/dist/web/access/cloudflare-setup.js +438 -0
- package/packages/gateway/dist/web/access/cloudflare-setup.js.map +1 -0
- package/packages/gateway/dist/web/access/cloudflare-token.d.ts +31 -0
- package/packages/gateway/dist/web/access/cloudflare-token.d.ts.map +1 -0
- package/packages/gateway/dist/web/access/cloudflare-token.js +74 -0
- package/packages/gateway/dist/web/access/cloudflare-token.js.map +1 -0
- package/packages/gateway/dist/web/access/cloudflare.d.ts +145 -0
- package/packages/gateway/dist/web/access/cloudflare.d.ts.map +1 -0
- package/packages/gateway/dist/web/access/cloudflare.js +474 -0
- package/packages/gateway/dist/web/access/cloudflare.js.map +1 -0
- package/packages/gateway/dist/web/access/index.d.ts +9 -0
- package/packages/gateway/dist/web/access/index.d.ts.map +1 -0
- package/packages/gateway/dist/web/access/index.js +9 -0
- package/packages/gateway/dist/web/access/index.js.map +1 -0
- package/packages/gateway/dist/web/access/ingress.d.ts +30 -0
- package/packages/gateway/dist/web/access/ingress.d.ts.map +1 -0
- package/packages/gateway/dist/web/access/ingress.js +76 -0
- package/packages/gateway/dist/web/access/ingress.js.map +1 -0
- package/packages/gateway/dist/web/access/provider.d.ts +173 -0
- package/packages/gateway/dist/web/access/provider.d.ts.map +1 -0
- package/packages/gateway/dist/web/access/provider.js +11 -0
- package/packages/gateway/dist/web/access/provider.js.map +1 -0
- package/packages/gateway/dist/web/access/registry.d.ts +33 -0
- package/packages/gateway/dist/web/access/registry.d.ts.map +1 -0
- package/packages/gateway/dist/web/access/registry.js +32 -0
- package/packages/gateway/dist/web/access/registry.js.map +1 -0
- package/packages/gateway/dist/web/{tailscale.d.ts → access/tailscale.d.ts} +27 -0
- package/packages/gateway/dist/web/access/tailscale.d.ts.map +1 -0
- package/packages/gateway/dist/web/{tailscale.js → access/tailscale.js} +118 -3
- package/packages/gateway/dist/web/access/tailscale.js.map +1 -0
- package/packages/gateway/dist/web/agents.d.ts +2 -0
- package/packages/gateway/dist/web/agents.d.ts.map +1 -1
- package/packages/gateway/dist/web/agents.js +19 -1
- package/packages/gateway/dist/web/agents.js.map +1 -1
- package/packages/gateway/dist/web/api-routes.d.ts +4 -3
- package/packages/gateway/dist/web/api-routes.d.ts.map +1 -1
- package/packages/gateway/dist/web/api-routes.js +106 -19
- package/packages/gateway/dist/web/api-routes.js.map +1 -1
- package/packages/gateway/dist/web/attention.d.ts.map +1 -1
- package/packages/gateway/dist/web/attention.js +11 -3
- package/packages/gateway/dist/web/attention.js.map +1 -1
- package/packages/gateway/dist/web/chat.d.ts +23 -0
- package/packages/gateway/dist/web/chat.d.ts.map +1 -1
- package/packages/gateway/dist/web/chat.js +62 -2
- package/packages/gateway/dist/web/chat.js.map +1 -1
- package/packages/gateway/dist/web/client-key.d.ts +3 -0
- package/packages/gateway/dist/web/client-key.d.ts.map +1 -1
- package/packages/gateway/dist/web/client-key.js +8 -1
- package/packages/gateway/dist/web/client-key.js.map +1 -1
- package/packages/gateway/dist/web/extension.d.ts +21 -1
- package/packages/gateway/dist/web/extension.d.ts.map +1 -1
- package/packages/gateway/dist/web/extension.js +183 -3
- package/packages/gateway/dist/web/extension.js.map +1 -1
- package/packages/gateway/dist/web/http.d.ts +7 -0
- package/packages/gateway/dist/web/http.d.ts.map +1 -1
- package/packages/gateway/dist/web/http.js +15 -1
- package/packages/gateway/dist/web/http.js.map +1 -1
- package/packages/gateway/dist/web/index.d.ts +1 -1
- package/packages/gateway/dist/web/index.d.ts.map +1 -1
- package/packages/gateway/dist/web/index.js +1 -1
- package/packages/gateway/dist/web/index.js.map +1 -1
- package/packages/gateway/dist/web/onboarding.js +1 -1
- package/packages/gateway/dist/web/onboarding.js.map +1 -1
- package/packages/gateway/dist/web/remote-hand.d.ts.map +1 -1
- package/packages/gateway/dist/web/remote-hand.js +45 -2
- package/packages/gateway/dist/web/remote-hand.js.map +1 -1
- package/packages/gateway/dist/web/secrets.d.ts +26 -1
- package/packages/gateway/dist/web/secrets.d.ts.map +1 -1
- package/packages/gateway/dist/web/secrets.js +66 -3
- package/packages/gateway/dist/web/secrets.js.map +1 -1
- package/packages/gateway/dist/web/server.d.ts +38 -2
- package/packages/gateway/dist/web/server.d.ts.map +1 -1
- package/packages/gateway/dist/web/server.js +634 -147
- package/packages/gateway/dist/web/server.js.map +1 -1
- package/packages/gateway/dist/web/sessions.d.ts +24 -14
- package/packages/gateway/dist/web/sessions.d.ts.map +1 -1
- package/packages/gateway/dist/web/sessions.js +42 -14
- package/packages/gateway/dist/web/sessions.js.map +1 -1
- package/packages/gateway/dist/web/signed-out.d.ts +10 -0
- package/packages/gateway/dist/web/signed-out.d.ts.map +1 -1
- package/packages/gateway/dist/web/signed-out.js +47 -0
- package/packages/gateway/dist/web/signed-out.js.map +1 -1
- package/packages/gateway/dist/web/version.d.ts +2 -0
- package/packages/gateway/dist/web/version.d.ts.map +1 -1
- package/packages/gateway/dist/web/version.js +5 -1
- package/packages/gateway/dist/web/version.js.map +1 -1
- package/packages/install/dist/.tsbuildinfo +1 -1
- package/packages/install/dist/app-layout.d.ts +127 -0
- package/packages/install/dist/app-layout.d.ts.map +1 -0
- package/packages/install/dist/app-layout.js +323 -0
- package/packages/install/dist/app-layout.js.map +1 -0
- package/packages/install/dist/index.d.ts +1 -0
- package/packages/install/dist/index.d.ts.map +1 -1
- package/packages/install/dist/index.js +1 -0
- package/packages/install/dist/index.js.map +1 -1
- package/packages/install/dist/launcher.d.ts.map +1 -1
- package/packages/install/dist/launcher.js +18 -4
- package/packages/install/dist/launcher.js.map +1 -1
- package/packages/install/dist/provenance.d.ts +34 -0
- package/packages/install/dist/provenance.d.ts.map +1 -0
- package/packages/install/dist/provenance.js +200 -0
- package/packages/install/dist/provenance.js.map +1 -0
- package/packages/install/dist/supervisor.d.ts.map +1 -1
- package/packages/install/dist/supervisor.js +9 -4
- package/packages/install/dist/supervisor.js.map +1 -1
- package/packages/install/dist/upgrade.d.ts +77 -3
- package/packages/install/dist/upgrade.d.ts.map +1 -1
- package/packages/install/dist/upgrade.js +325 -43
- package/packages/install/dist/upgrade.js.map +1 -1
- package/packages/runtime/dist/.tsbuildinfo +1 -1
- package/packages/runtime/dist/delegate.d.ts +8 -0
- package/packages/runtime/dist/delegate.d.ts.map +1 -1
- package/packages/runtime/dist/delegate.js +19 -1
- package/packages/runtime/dist/delegate.js.map +1 -1
- package/packages/runtime/dist/loop.d.ts +2 -0
- package/packages/runtime/dist/loop.d.ts.map +1 -1
- package/packages/runtime/dist/loop.js +18 -4
- package/packages/runtime/dist/loop.js.map +1 -1
- package/packages/tools/artifacts/dist/.tsbuildinfo +1 -1
- package/packages/tools/browser/dist/.tsbuildinfo +1 -1
- package/packages/tools/browser/dist/availability.d.ts +2 -2
- package/packages/tools/browser/dist/availability.d.ts.map +1 -1
- package/packages/tools/browser/dist/availability.js +2 -2
- package/packages/tools/browser/dist/availability.js.map +1 -1
- package/packages/tools/browser/dist/controller.d.ts +82 -58
- package/packages/tools/browser/dist/controller.d.ts.map +1 -1
- package/packages/tools/browser/dist/controller.js +823 -217
- package/packages/tools/browser/dist/controller.js.map +1 -1
- package/packages/tools/browser/dist/driver.d.ts +3 -1
- package/packages/tools/browser/dist/driver.d.ts.map +1 -1
- package/packages/tools/browser/dist/driver.js +82 -1
- package/packages/tools/browser/dist/driver.js.map +1 -1
- package/packages/tools/browser/dist/extension.d.ts +70 -5
- package/packages/tools/browser/dist/extension.d.ts.map +1 -1
- package/packages/tools/browser/dist/extension.js +94 -9
- package/packages/tools/browser/dist/extension.js.map +1 -1
- package/packages/tools/browser/dist/index.d.ts +17 -7
- package/packages/tools/browser/dist/index.d.ts.map +1 -1
- package/packages/tools/browser/dist/index.js +35 -15
- package/packages/tools/browser/dist/index.js.map +1 -1
- package/packages/tools/browser/dist/logins.d.ts +150 -0
- package/packages/tools/browser/dist/logins.d.ts.map +1 -0
- package/packages/tools/browser/dist/logins.js +476 -0
- package/packages/tools/browser/dist/logins.js.map +1 -0
- package/packages/tools/browser/dist/manager.d.ts +39 -21
- package/packages/tools/browser/dist/manager.d.ts.map +1 -1
- package/packages/tools/browser/dist/manager.js +229 -136
- package/packages/tools/browser/dist/manager.js.map +1 -1
- package/packages/tools/browser/dist/routes.d.ts +151 -0
- package/packages/tools/browser/dist/routes.d.ts.map +1 -0
- package/packages/tools/browser/dist/routes.js +331 -0
- package/packages/tools/browser/dist/routes.js.map +1 -0
- package/packages/tools/browser/dist/secrets.d.ts +3 -1
- package/packages/tools/browser/dist/secrets.d.ts.map +1 -1
- package/packages/tools/browser/dist/secrets.js +10 -6
- package/packages/tools/browser/dist/secrets.js.map +1 -1
- package/packages/tools/browser/dist/service.d.ts +182 -115
- package/packages/tools/browser/dist/service.d.ts.map +1 -1
- package/packages/tools/browser/dist/service.js +491 -388
- package/packages/tools/browser/dist/service.js.map +1 -1
- package/packages/tools/browser/dist/settings.d.ts +88 -0
- package/packages/tools/browser/dist/settings.d.ts.map +1 -0
- package/packages/tools/browser/dist/settings.js +86 -0
- package/packages/tools/browser/dist/settings.js.map +1 -0
- package/packages/tools/browser/dist/telemetry.d.ts +203 -0
- package/packages/tools/browser/dist/telemetry.d.ts.map +1 -0
- package/packages/tools/browser/dist/telemetry.js +142 -0
- package/packages/tools/browser/dist/telemetry.js.map +1 -0
- package/packages/tools/browser/dist/types.d.ts +102 -3
- package/packages/tools/browser/dist/types.d.ts.map +1 -1
- package/packages/tools/browser/dist/types.js +27 -9
- package/packages/tools/browser/dist/types.js.map +1 -1
- package/packages/tools/email/dist/.tsbuildinfo +1 -1
- package/packages/tools/host/dist/.tsbuildinfo +1 -1
- package/packages/tools/mcp/dist/.tsbuildinfo +1 -1
- package/packages/tools/memory/dist/.tsbuildinfo +1 -1
- package/packages/tools/web/dist/.tsbuildinfo +1 -1
- package/packages/web/dist/assets/index-DYfeUW-0.css +1 -0
- package/packages/web/dist/assets/index-vpc904_b.js +146 -0
- package/packages/web/dist/assets/{lottie_light-CKJ88Yuk.js → lottie_light-BFAMYgLA.js} +1 -1
- package/packages/web/dist/build.json +1 -1
- package/packages/web/dist/index.html +2 -2
- package/packages/web/dist/precache.json +4 -4
- package/node_modules/@buddi/gateway/dist/web/apps.d.ts +0 -18
- package/node_modules/@buddi/gateway/dist/web/apps.d.ts.map +0 -1
- package/node_modules/@buddi/gateway/dist/web/apps.js +0 -84
- package/node_modules/@buddi/gateway/dist/web/apps.js.map +0 -1
- package/node_modules/@buddi/gateway/dist/web/tailscale.d.ts.map +0 -1
- package/node_modules/@buddi/gateway/dist/web/tailscale.js.map +0 -1
- package/node_modules/@buddi/tool-browser/dist/computer.d.ts +0 -153
- package/node_modules/@buddi/tool-browser/dist/computer.d.ts.map +0 -1
- package/node_modules/@buddi/tool-browser/dist/computer.js +0 -392
- package/node_modules/@buddi/tool-browser/dist/computer.js.map +0 -1
- package/node_modules/@buddi/tool-browser/dist/native/buddi-computer +0 -0
- package/node_modules/pino/test/browser-bindings.test.js +0 -114
- package/node_modules/pino/test/browser-redaction.test.js +0 -264
- package/node_modules/pino/test/browser-set-bindings.test.js +0 -99
- package/node_modules/pino/test/caller.test.js +0 -20
- package/node_modules/pino/test/fixtures/caller-loop.js +0 -6
- package/node_modules/pino/test/smoke.js +0 -59
- package/node_modules/pino/test/types/pino-import.tst.cts +0 -30
- package/node_modules/pino/test/types/pino-import.tst.js +0 -73
- package/node_modules/pino/test/types/pino-multistream.tst.ts +0 -49
- package/node_modules/pino/test/types/pino-top-export.tst.ts +0 -32
- package/node_modules/pino/test/types/pino-type-only.tst.ts +0 -77
- package/node_modules/pino/test/types/tsconfig.json +0 -10
- package/packages/gateway/dist/web/apps.d.ts +0 -18
- package/packages/gateway/dist/web/apps.d.ts.map +0 -1
- package/packages/gateway/dist/web/apps.js +0 -84
- package/packages/gateway/dist/web/apps.js.map +0 -1
- package/packages/gateway/dist/web/tailscale.d.ts.map +0 -1
- package/packages/gateway/dist/web/tailscale.js.map +0 -1
- package/packages/tools/browser/dist/computer.d.ts +0 -153
- package/packages/tools/browser/dist/computer.d.ts.map +0 -1
- package/packages/tools/browser/dist/computer.js +0 -392
- package/packages/tools/browser/dist/computer.js.map +0 -1
- package/packages/tools/browser/dist/native/buddi-computer +0 -0
- package/packages/web/dist/assets/index-CN1AXMI1.css +0 -1
- package/packages/web/dist/assets/index-CQRE9LJX.js +0 -145
package/extension/background.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
// src/protocol.ts
|
|
2
2
|
var COMMAND_NAMES = ["navigate", "observe", "click", "fill", "select", "press", "scroll", "tab", "close", "fieldInfo", "secretFill"];
|
|
3
|
-
var HAND_COMMANDS = ["screencast.start", "screencast.stop", "input"];
|
|
3
|
+
var HAND_COMMANDS = ["screencast.start", "screencast.stop", "input", "hold", "unhold"];
|
|
4
4
|
var PreconditionError = class extends Error {
|
|
5
5
|
};
|
|
6
|
+
var OpenedError = class extends Error {
|
|
7
|
+
constructor(message, page) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.page = page;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
6
12
|
var CancelledError = class extends Error {
|
|
7
13
|
};
|
|
8
14
|
var Cancellation = class {
|
|
@@ -148,6 +154,18 @@ var Protocol = class {
|
|
|
148
154
|
case "command":
|
|
149
155
|
await this.#command(message);
|
|
150
156
|
return;
|
|
157
|
+
case "loginAck": {
|
|
158
|
+
const id = message["id"];
|
|
159
|
+
if (!this.#authenticated || typeof id !== "string" || id.length > 64) return;
|
|
160
|
+
const ask = message["ask"];
|
|
161
|
+
if (ask === "save" || ask === "update" || ask === "none") {
|
|
162
|
+
this.#options.onLoginAck?.(id, { ask });
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const reason = typeof message["reason"] === "string" ? message["reason"].slice(0, 300) : "";
|
|
166
|
+
this.#options.onLoginAck?.(id, message["saved"] === true ? { saved: true } : { saved: false, reason: reason || "buddi could not keep that login." });
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
151
169
|
default:
|
|
152
170
|
return;
|
|
153
171
|
}
|
|
@@ -212,7 +230,14 @@ var Protocol = class {
|
|
|
212
230
|
if (error instanceof CancelledError) {
|
|
213
231
|
this.#options.send({ type: "result", id, ok: false, error: "cancelled", precondition: !cancel.dispatched });
|
|
214
232
|
} else {
|
|
215
|
-
this.#options.send({
|
|
233
|
+
this.#options.send({
|
|
234
|
+
type: "result",
|
|
235
|
+
id,
|
|
236
|
+
ok: false,
|
|
237
|
+
error: sentence(error),
|
|
238
|
+
precondition: error instanceof PreconditionError,
|
|
239
|
+
...error instanceof OpenedError ? { page: error.page } : {}
|
|
240
|
+
});
|
|
216
241
|
}
|
|
217
242
|
} finally {
|
|
218
243
|
this.#running.delete(id);
|
|
@@ -229,11 +254,477 @@ function sentence(error) {
|
|
|
229
254
|
return /[.!?]$/.test(trimmed) ? trimmed : `${trimmed}.`;
|
|
230
255
|
}
|
|
231
256
|
|
|
257
|
+
// src/bar.ts
|
|
258
|
+
var OWNER_WAIT_MS = 3e4;
|
|
259
|
+
var BAR_AFTER_MS = 3e3;
|
|
260
|
+
var BAR_POLL_MS = 500;
|
|
261
|
+
async function waitForOwner(probes, limits = {}) {
|
|
262
|
+
const waitMs = limits.waitMs ?? OWNER_WAIT_MS;
|
|
263
|
+
const barAfter = limits.barAfterMs ?? BAR_AFTER_MS;
|
|
264
|
+
const poll = limits.pollMs ?? BAR_POLL_MS;
|
|
265
|
+
const start = probes.now();
|
|
266
|
+
let shown = false;
|
|
267
|
+
const maxPolls = Math.ceil(waitMs / poll);
|
|
268
|
+
try {
|
|
269
|
+
for (let polls = 0; ; polls++) {
|
|
270
|
+
if (!await probes.watched()) return "left";
|
|
271
|
+
const elapsed = Math.max(probes.now() - start, polls * poll);
|
|
272
|
+
if (!shown && elapsed >= barAfter) {
|
|
273
|
+
shown = true;
|
|
274
|
+
await probes.show().catch(() => void 0);
|
|
275
|
+
}
|
|
276
|
+
if (shown) {
|
|
277
|
+
const choice = await probes.choice().catch(() => void 0);
|
|
278
|
+
if (choice) return choice;
|
|
279
|
+
}
|
|
280
|
+
if (elapsed >= waitMs || polls >= maxPolls) return "timeout";
|
|
281
|
+
await probes.wait(poll);
|
|
282
|
+
}
|
|
283
|
+
} finally {
|
|
284
|
+
if (shown) await probes.hide().catch(() => void 0);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
function showBar(agent) {
|
|
288
|
+
const holder = globalThis;
|
|
289
|
+
holder["__buddiBar"] = { choice: void 0 };
|
|
290
|
+
const doc = globalThis.document;
|
|
291
|
+
if (!doc || doc.getElementById("buddi-working-bar")) return;
|
|
292
|
+
const host = doc.createElement("div");
|
|
293
|
+
host.id = "buddi-working-bar";
|
|
294
|
+
host.setAttribute("style", "position:fixed;top:0;left:0;right:0;z-index:2147483647;all:initial;");
|
|
295
|
+
const root = host.attachShadow({ mode: "closed" });
|
|
296
|
+
const bar = doc.createElement("div");
|
|
297
|
+
bar.setAttribute("role", "status");
|
|
298
|
+
bar.setAttribute("style", "position:fixed;top:0;left:0;right:0;display:flex;gap:12px;align-items:center;justify-content:flex-end;padding:6px 16px;font:13px/1.4 system-ui,-apple-system,sans-serif;background:#1f2a44;color:#fff;box-shadow:0 1px 4px rgba(0,0,0,.25);");
|
|
299
|
+
const label = doc.createElement("span");
|
|
300
|
+
label.textContent = `${agent || "buddi"} is working here`;
|
|
301
|
+
label.setAttribute("style", "margin-right:auto;");
|
|
302
|
+
const button = (text2, choice, primary) => {
|
|
303
|
+
const b = doc.createElement("button");
|
|
304
|
+
b.type = "button";
|
|
305
|
+
b.textContent = text2;
|
|
306
|
+
b.setAttribute("style", `font:inherit;cursor:pointer;border-radius:6px;padding:3px 10px;border:1px solid #fff;${primary ? "background:#fff;color:#1f2a44;" : "background:transparent;color:#fff;"}`);
|
|
307
|
+
b.addEventListener("click", () => {
|
|
308
|
+
holder["__buddiBar"] = { choice };
|
|
309
|
+
});
|
|
310
|
+
return b;
|
|
311
|
+
};
|
|
312
|
+
bar.append(label, button("Take over", "takeover", false), button("Let it continue", "continue", true));
|
|
313
|
+
root.append(bar);
|
|
314
|
+
(doc.documentElement ?? doc.body).append(host);
|
|
315
|
+
}
|
|
316
|
+
function readBar() {
|
|
317
|
+
const holder = globalThis;
|
|
318
|
+
const choice = holder["__buddiBar"]?.choice;
|
|
319
|
+
if (choice) holder["__buddiBar"] = { choice: void 0 };
|
|
320
|
+
return choice;
|
|
321
|
+
}
|
|
322
|
+
function hideBar() {
|
|
323
|
+
const doc = globalThis.document;
|
|
324
|
+
doc?.getElementById("buddi-working-bar")?.remove();
|
|
325
|
+
const holder = globalThis;
|
|
326
|
+
delete holder["__buddiBar"];
|
|
327
|
+
}
|
|
328
|
+
var GIVE_BACK_MESSAGE = "buddi-give-back";
|
|
329
|
+
function showHeldBar(session) {
|
|
330
|
+
const doc = globalThis.document;
|
|
331
|
+
if (!doc || doc.getElementById("buddi-held-bar")) return;
|
|
332
|
+
const host = doc.createElement("div");
|
|
333
|
+
host.id = "buddi-held-bar";
|
|
334
|
+
host.setAttribute("style", "position:fixed;top:0;left:0;right:0;z-index:2147483647;all:initial;");
|
|
335
|
+
const root = host.attachShadow({ mode: "closed" });
|
|
336
|
+
const bar = doc.createElement("div");
|
|
337
|
+
bar.setAttribute("role", "status");
|
|
338
|
+
bar.setAttribute("style", "position:fixed;top:0;left:0;right:0;display:flex;gap:12px;align-items:center;justify-content:flex-end;padding:6px 16px;font:13px/1.4 system-ui,-apple-system,sans-serif;background:#1f2a44;color:#fff;box-shadow:0 1px 4px rgba(0,0,0,.25);");
|
|
339
|
+
const label = doc.createElement("span");
|
|
340
|
+
label.textContent = "buddi is waiting";
|
|
341
|
+
label.setAttribute("style", "margin-right:auto;");
|
|
342
|
+
const give = doc.createElement("button");
|
|
343
|
+
give.type = "button";
|
|
344
|
+
give.textContent = "Give it back";
|
|
345
|
+
give.setAttribute("style", "font:inherit;cursor:pointer;border-radius:6px;padding:3px 10px;border:1px solid #fff;background:#fff;color:#1f2a44;");
|
|
346
|
+
give.addEventListener("click", () => {
|
|
347
|
+
const runtime = globalThis.chrome?.runtime;
|
|
348
|
+
void runtime?.sendMessage({ type: "buddi-give-back", session })?.catch?.(() => void 0);
|
|
349
|
+
host.remove();
|
|
350
|
+
});
|
|
351
|
+
bar.append(label, give);
|
|
352
|
+
root.append(bar);
|
|
353
|
+
(doc.documentElement ?? doc.body).append(host);
|
|
354
|
+
const asking = [];
|
|
355
|
+
const restore = () => {
|
|
356
|
+
for (const button of asking.splice(0)) button.remove();
|
|
357
|
+
label.textContent = "buddi is waiting";
|
|
358
|
+
give.style.display = "";
|
|
359
|
+
};
|
|
360
|
+
globalThis["__buddiHeldAsk"] = (question, choices) => {
|
|
361
|
+
restore();
|
|
362
|
+
label.textContent = question;
|
|
363
|
+
give.style.display = "none";
|
|
364
|
+
for (const choice of choices) {
|
|
365
|
+
const b = doc.createElement("button");
|
|
366
|
+
b.type = "button";
|
|
367
|
+
b.textContent = choice.label;
|
|
368
|
+
b.setAttribute("style", `font:inherit;cursor:pointer;border-radius:6px;padding:3px 10px;border:1px solid #fff;${choice.primary ? "background:#fff;color:#1f2a44;" : "background:transparent;color:#fff;"}`);
|
|
369
|
+
b.addEventListener("click", () => {
|
|
370
|
+
restore();
|
|
371
|
+
choice.pick();
|
|
372
|
+
});
|
|
373
|
+
asking.push(b);
|
|
374
|
+
bar.insertBefore(b, give);
|
|
375
|
+
}
|
|
376
|
+
return restore;
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
function hideHeldBar() {
|
|
380
|
+
const doc = globalThis.document;
|
|
381
|
+
doc?.getElementById("buddi-held-bar")?.remove();
|
|
382
|
+
delete globalThis["__buddiHeldAsk"];
|
|
383
|
+
}
|
|
384
|
+
var LOGIN_MESSAGE = "buddi-login";
|
|
385
|
+
var LOGIN_PROMPT_MS = 2 * 6e4;
|
|
386
|
+
function watchHeldLogins(session, facts) {
|
|
387
|
+
const holder = globalThis;
|
|
388
|
+
const known = { never: [...facts?.never ?? []], saved: [...facts?.saved ?? []] };
|
|
389
|
+
const existing = holder["__buddiHeldLogins"];
|
|
390
|
+
if (existing) {
|
|
391
|
+
existing.session = session;
|
|
392
|
+
existing.facts = known;
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const doc = globalThis.document;
|
|
396
|
+
if (!doc) return;
|
|
397
|
+
const state = { session, facts: known, last: "", lastAt: 0, typedAt: 0, cached: void 0, timer: void 0, drop: void 0 };
|
|
398
|
+
holder["__buddiHeldLogins"] = state;
|
|
399
|
+
const runtime = () => globalThis.chrome?.runtime;
|
|
400
|
+
const call = async (message) => {
|
|
401
|
+
try {
|
|
402
|
+
return await runtime()?.sendMessage(message);
|
|
403
|
+
} catch {
|
|
404
|
+
return void 0;
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
const site = () => (globalThis.location?.hostname ?? "").toLowerCase().replace(/^www\./, "");
|
|
408
|
+
const listed = (where) => state.facts.never.some((entry) => {
|
|
409
|
+
const bare = entry.toLowerCase().replace(/^www\./, "");
|
|
410
|
+
return where === bare || where.endsWith(`.${bare}`);
|
|
411
|
+
});
|
|
412
|
+
const bar = () => {
|
|
413
|
+
const question = holder["__buddiHeldAsk"];
|
|
414
|
+
return typeof question === "function" ? question : void 0;
|
|
415
|
+
};
|
|
416
|
+
const prompt = (where, update) => {
|
|
417
|
+
const question = bar();
|
|
418
|
+
if (!question) return;
|
|
419
|
+
if (state.drop) clearTimeout(state.drop);
|
|
420
|
+
let answered = false;
|
|
421
|
+
const save = () => {
|
|
422
|
+
if (answered) return;
|
|
423
|
+
answered = true;
|
|
424
|
+
const asking = bar();
|
|
425
|
+
asking?.(update ? "Updating\u2026" : "Saving\u2026", []);
|
|
426
|
+
void call({ type: "buddi-login", session: state.session, decision: "save" }).then((reply) => {
|
|
427
|
+
const answer = reply;
|
|
428
|
+
const now = bar();
|
|
429
|
+
if (!now) return;
|
|
430
|
+
if (answer?.saved === true) {
|
|
431
|
+
const restore2 = now(update ? `Updated the login for ${where}` : `Saved the login for ${where}`, []);
|
|
432
|
+
if (state.drop) clearTimeout(state.drop);
|
|
433
|
+
state.drop = setTimeout(restore2, 2e3);
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
const reason = typeof answer?.reason === "string" && answer.reason !== "" ? answer.reason : "buddi did not answer. Try again.";
|
|
437
|
+
now(reason, [
|
|
438
|
+
{ label: "Try again", primary: true, pick: () => {
|
|
439
|
+
answered = false;
|
|
440
|
+
save();
|
|
441
|
+
} },
|
|
442
|
+
{ label: "Not now", pick: () => {
|
|
443
|
+
void call({ type: "buddi-login", session: state.session, decision: "later" });
|
|
444
|
+
} }
|
|
445
|
+
]);
|
|
446
|
+
});
|
|
447
|
+
};
|
|
448
|
+
const restore = question(update ? `Update the login for ${where}?` : `Save this login for ${where}?`, [
|
|
449
|
+
{ label: update ? "Update" : "Save", primary: true, pick: save },
|
|
450
|
+
{ label: "Not now", pick: () => {
|
|
451
|
+
answered = true;
|
|
452
|
+
void call({ type: "buddi-login", session: state.session, decision: "later" });
|
|
453
|
+
} },
|
|
454
|
+
{ label: "Never for this site", pick: () => {
|
|
455
|
+
answered = true;
|
|
456
|
+
state.facts.never.push(where);
|
|
457
|
+
void call({ type: "buddi-login", session: state.session, decision: "never" });
|
|
458
|
+
} }
|
|
459
|
+
]);
|
|
460
|
+
state.drop = setTimeout(() => {
|
|
461
|
+
if (!answered) restore();
|
|
462
|
+
}, 2 * 6e4);
|
|
463
|
+
};
|
|
464
|
+
const ask = (found) => {
|
|
465
|
+
const where = site();
|
|
466
|
+
if (where === "" || listed(where) || !bar()) return;
|
|
467
|
+
const update = state.facts.saved.some((login) => login.site === where && login.username === found.username);
|
|
468
|
+
void call({ type: "buddi-login-seen", session: state.session, username: found.username, password: found.password, update }).then((reply) => {
|
|
469
|
+
const asked = reply;
|
|
470
|
+
if (holder["__buddiHeldLogins"] !== state || !asked || typeof asked !== "object") return;
|
|
471
|
+
prompt(where, asked.update === true);
|
|
472
|
+
});
|
|
473
|
+
};
|
|
474
|
+
void call({ type: "buddi-login-pending", session: state.session }).then((reply) => {
|
|
475
|
+
const waiting = reply;
|
|
476
|
+
if (holder["__buddiHeldLogins"] !== state || !waiting || typeof waiting.site !== "string") return;
|
|
477
|
+
prompt(waiting.site, waiting.update === true);
|
|
478
|
+
});
|
|
479
|
+
const NOT_SUBMIT = /\b(show|hide|reveal|toggle|eye|forgot|reset|cancel|back|close|sign ?up|register|create)\b/i;
|
|
480
|
+
const USER = /user|email|login|account|ident|phone|mail/i;
|
|
481
|
+
const passwords = (root) => Array.from(root.querySelectorAll('input[type="password" i]'));
|
|
482
|
+
const usernameFor = (password) => {
|
|
483
|
+
const scope = password.form ?? doc;
|
|
484
|
+
const inputs = Array.from(scope.querySelectorAll("input")).filter((input) => ["text", "email", "tel", ""].includes((input.getAttribute("type") ?? "").toLowerCase()) && input.value.trim() !== "");
|
|
485
|
+
const marked = inputs.find((input) => (input.getAttribute("autocomplete") ?? "").toLowerCase().includes("username") || (input.getAttribute("type") ?? "").toLowerCase() === "email");
|
|
486
|
+
if (marked) return marked.value.trim();
|
|
487
|
+
const before = inputs.filter((input) => (input.compareDocumentPosition(password) & 4) !== 0);
|
|
488
|
+
const pick = before[before.length - 1] ?? inputs.find((input) => USER.test(`${input.name} ${input.id} ${input.getAttribute("autocomplete") ?? ""}`));
|
|
489
|
+
return pick ? pick.value.trim() : "";
|
|
490
|
+
};
|
|
491
|
+
const read = (scope) => {
|
|
492
|
+
const field = passwords(scope ?? doc).find((input) => input.value !== "");
|
|
493
|
+
return field ? { username: usernameFor(field), password: field.value } : void 0;
|
|
494
|
+
};
|
|
495
|
+
const send2 = (found) => {
|
|
496
|
+
if (holder["__buddiHeldLogins"] !== state) return;
|
|
497
|
+
if (!found || found.password === "") return;
|
|
498
|
+
const key = `${found.username}\0${found.password}`;
|
|
499
|
+
const now = Date.now();
|
|
500
|
+
if (key === state.last && now - state.lastAt < 5e3) return;
|
|
501
|
+
state.last = key;
|
|
502
|
+
state.lastAt = now;
|
|
503
|
+
state.cached = void 0;
|
|
504
|
+
ask(found);
|
|
505
|
+
};
|
|
506
|
+
doc.addEventListener("submit", (event) => {
|
|
507
|
+
send2(read(event.target) ?? state.cached);
|
|
508
|
+
}, true);
|
|
509
|
+
doc.addEventListener("keydown", (event) => {
|
|
510
|
+
if (event.key !== "Enter") return;
|
|
511
|
+
const target = event.target;
|
|
512
|
+
if (!target || target.tagName !== "INPUT") return;
|
|
513
|
+
send2(read(target.form ?? doc));
|
|
514
|
+
}, true);
|
|
515
|
+
doc.addEventListener("click", (event) => {
|
|
516
|
+
const target = event.target;
|
|
517
|
+
const button = target?.closest?.('button, input[type="submit" i], input[type="image" i], input[type="button" i], [role="button"]');
|
|
518
|
+
if (!button) return;
|
|
519
|
+
const words = `${button.textContent ?? ""} ${button.getAttribute("aria-label") ?? ""} ${button.getAttribute("value") ?? ""} ${button.getAttribute("title") ?? ""}`;
|
|
520
|
+
if (NOT_SUBMIT.test(words)) return;
|
|
521
|
+
send2(read(button.form ?? doc));
|
|
522
|
+
}, true);
|
|
523
|
+
doc.addEventListener("input", (event) => {
|
|
524
|
+
const target = event.target;
|
|
525
|
+
if ((target?.getAttribute?.("type") ?? "").toLowerCase() !== "password") return;
|
|
526
|
+
state.typedAt = Date.now();
|
|
527
|
+
state.cached = read(target.form ?? doc);
|
|
528
|
+
}, true);
|
|
529
|
+
const Observer = globalThis.PerformanceObserver;
|
|
530
|
+
if (typeof Observer === "function") {
|
|
531
|
+
try {
|
|
532
|
+
new Observer((list) => {
|
|
533
|
+
if (!state.cached || Date.now() - state.typedAt > 1e4) return;
|
|
534
|
+
const fetched = list.getEntries().some((entry) => ["fetch", "xmlhttprequest"].includes(entry.initiatorType));
|
|
535
|
+
if (!fetched) return;
|
|
536
|
+
if (state.timer) clearTimeout(state.timer);
|
|
537
|
+
state.timer = setTimeout(() => {
|
|
538
|
+
const still = passwords(doc).some((input) => input.isConnected && input.value !== "" && input.getClientRects().length > 0);
|
|
539
|
+
if (!still) send2(state.cached);
|
|
540
|
+
}, 1500);
|
|
541
|
+
}).observe({ type: "resource", buffered: false });
|
|
542
|
+
} catch {
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
var LOGIN_SEEN_MESSAGE = "buddi-login-seen";
|
|
547
|
+
var LOGIN_PENDING_MESSAGE = "buddi-login-pending";
|
|
548
|
+
function heldLoginRequest(message, sender, heldTab) {
|
|
549
|
+
const request = message;
|
|
550
|
+
if (!request || typeof request.session !== "string" || request.session === "") return void 0;
|
|
551
|
+
if (heldTab === void 0 || sender?.tab?.id !== heldTab) return void 0;
|
|
552
|
+
const session = request.session;
|
|
553
|
+
const url = sender.url ?? "";
|
|
554
|
+
if (request.type === LOGIN_SEEN_MESSAGE) {
|
|
555
|
+
if (typeof request.password !== "string" || request.password === "" || request.password.length > 1024) return void 0;
|
|
556
|
+
const username = typeof request.username === "string" ? request.username.slice(0, 200) : "";
|
|
557
|
+
return { kind: "seen", session, tabId: heldTab, url, username, password: request.password, update: request.update === true };
|
|
558
|
+
}
|
|
559
|
+
if (request.type === LOGIN_PENDING_MESSAGE) return { kind: "pending", session, tabId: heldTab, url };
|
|
560
|
+
if (request.type === LOGIN_MESSAGE && (request.decision === "save" || request.decision === "later" || request.decision === "never")) {
|
|
561
|
+
return { kind: "answer", session, tabId: heldTab, decision: request.decision };
|
|
562
|
+
}
|
|
563
|
+
return void 0;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// src/held-logins.ts
|
|
567
|
+
var HELD_LOGIN_MS = 2 * 6e4;
|
|
568
|
+
var LOGIN_ACK_MS = 2e4;
|
|
569
|
+
var LOGIN_CHECK_MS = 5e3;
|
|
570
|
+
var NO_ANSWER = "buddi did not answer. Try again.";
|
|
571
|
+
var GONE = "That question is gone; add the login in Settings \u2192 Keys and secrets.";
|
|
572
|
+
function siteName(host) {
|
|
573
|
+
return host.toLowerCase().replace(/^www\./, "");
|
|
574
|
+
}
|
|
575
|
+
function siteKey(host) {
|
|
576
|
+
const labels = siteName(host).split(".").filter(Boolean);
|
|
577
|
+
if (labels.length <= 2) return labels.join(".");
|
|
578
|
+
const [second, top] = labels.slice(-2);
|
|
579
|
+
const keep = top.length === 2 && second.length <= 3 ? 3 : 2;
|
|
580
|
+
return labels.slice(-keep).join(".");
|
|
581
|
+
}
|
|
582
|
+
function webOrigin(url) {
|
|
583
|
+
try {
|
|
584
|
+
const parsed = new URL(url ?? "");
|
|
585
|
+
return parsed.protocol === "https:" || parsed.protocol === "http:" ? parsed : void 0;
|
|
586
|
+
} catch {
|
|
587
|
+
return void 0;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
var HeldLogins = class {
|
|
591
|
+
constructor(send2, options = {}) {
|
|
592
|
+
this.send = send2;
|
|
593
|
+
this.options = options;
|
|
594
|
+
}
|
|
595
|
+
#byTab = /* @__PURE__ */ new Map();
|
|
596
|
+
/** Frames waiting for buddi's answer, by id. */
|
|
597
|
+
#waiting = /* @__PURE__ */ new Map();
|
|
598
|
+
#id() {
|
|
599
|
+
return (this.options.uuid ?? (() => crypto.randomUUID()))();
|
|
600
|
+
}
|
|
601
|
+
/** Send a frame and wait for buddi's answer to it; undefined when none comes in time or the tab's pair goes. */
|
|
602
|
+
#ask(tabId, frame, ms) {
|
|
603
|
+
const id = this.#id();
|
|
604
|
+
return new Promise((resolve) => {
|
|
605
|
+
const timer2 = setTimeout(() => {
|
|
606
|
+
this.#waiting.delete(id);
|
|
607
|
+
resolve(void 0);
|
|
608
|
+
}, ms);
|
|
609
|
+
this.#waiting.set(id, { tabId, resolve, timer: timer2 });
|
|
610
|
+
this.send({ ...frame, id });
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* A sign-in went out in a held tab: keep the pair, with the origin Chrome
|
|
615
|
+
* reports for the page (never the page's claim), and ask buddi whether it
|
|
616
|
+
* is worth a question. Replaces whatever this tab was waiting on. Resolves
|
|
617
|
+
* to the question to draw, or undefined: a page not on the web, or nothing
|
|
618
|
+
* to ask (the pair is dropped then). With no word from buddi in time, the
|
|
619
|
+
* tab asks as the hold's facts said (`pair.update`).
|
|
620
|
+
*/
|
|
621
|
+
async capture(tabId, session, url, pair) {
|
|
622
|
+
const where = webOrigin(url);
|
|
623
|
+
if (!where || pair.password === "" || pair.password.length > 1024) return void 0;
|
|
624
|
+
this.clearTab(tabId);
|
|
625
|
+
let settle = () => {
|
|
626
|
+
};
|
|
627
|
+
const entry = {
|
|
628
|
+
tabId,
|
|
629
|
+
session,
|
|
630
|
+
origin: where.origin,
|
|
631
|
+
site: siteName(where.hostname),
|
|
632
|
+
username: pair.username.slice(0, 200),
|
|
633
|
+
password: pair.password,
|
|
634
|
+
update: pair.update === true,
|
|
635
|
+
timer: setTimeout(() => this.clearTab(tabId), this.options.holdMs ?? HELD_LOGIN_MS),
|
|
636
|
+
checked: new Promise((resolve) => {
|
|
637
|
+
settle = resolve;
|
|
638
|
+
})
|
|
639
|
+
};
|
|
640
|
+
this.#byTab.set(tabId, entry);
|
|
641
|
+
const word = await this.#ask(tabId, { type: "login", session, decision: "check", origin: entry.origin, username: entry.username, password: entry.password }, this.options.checkMs ?? LOGIN_CHECK_MS);
|
|
642
|
+
if (this.#byTab.get(tabId) !== entry) {
|
|
643
|
+
settle(false);
|
|
644
|
+
return void 0;
|
|
645
|
+
}
|
|
646
|
+
if (word && "ask" in word) {
|
|
647
|
+
if (word.ask === "none") {
|
|
648
|
+
this.clearTab(tabId);
|
|
649
|
+
settle(false);
|
|
650
|
+
return void 0;
|
|
651
|
+
}
|
|
652
|
+
entry.update = word.ask === "update";
|
|
653
|
+
}
|
|
654
|
+
settle(true);
|
|
655
|
+
return { site: entry.site, username: entry.username, update: entry.update };
|
|
656
|
+
}
|
|
657
|
+
/** The question still waiting in this tab, for a page of the same site (once buddi said it is worth asking). */
|
|
658
|
+
async pending(tabId, session, url) {
|
|
659
|
+
const entry = this.#byTab.get(tabId);
|
|
660
|
+
const where = webOrigin(url);
|
|
661
|
+
if (!entry || entry.session !== session || !where || siteKey(where.hostname) !== siteKey(entry.site)) return void 0;
|
|
662
|
+
if (!await entry.checked || this.#byTab.get(tabId) !== entry) return void 0;
|
|
663
|
+
return { site: entry.site, username: entry.username, update: entry.update };
|
|
664
|
+
}
|
|
665
|
+
/** Save: the pair goes to buddi with the original origin; the answer is what buddi says became of it. */
|
|
666
|
+
async save(tabId, session) {
|
|
667
|
+
const entry = this.#byTab.get(tabId);
|
|
668
|
+
if (!entry || entry.session !== session) return { saved: false, reason: GONE };
|
|
669
|
+
const answer = await this.#ask(tabId, { type: "login", session: entry.session, decision: "save", origin: entry.origin, username: entry.username, password: entry.password }, this.options.ackMs ?? LOGIN_ACK_MS);
|
|
670
|
+
if (!answer || !("saved" in answer)) return { saved: false, reason: NO_ANSWER };
|
|
671
|
+
if (answer.saved && this.#byTab.get(tabId) === entry) this.clearTab(tabId);
|
|
672
|
+
return answer;
|
|
673
|
+
}
|
|
674
|
+
/** Never for this site: the site alone goes to buddi, and the pair is dropped. */
|
|
675
|
+
never(tabId, session) {
|
|
676
|
+
const entry = this.#byTab.get(tabId);
|
|
677
|
+
if (!entry || entry.session !== session) return false;
|
|
678
|
+
this.clearTab(tabId);
|
|
679
|
+
this.send({ type: "login", session: entry.session, decision: "never", origin: entry.origin, username: entry.username });
|
|
680
|
+
return true;
|
|
681
|
+
}
|
|
682
|
+
/** Not now: nothing goes anywhere. */
|
|
683
|
+
dismiss(tabId, session) {
|
|
684
|
+
const entry = this.#byTab.get(tabId);
|
|
685
|
+
if (entry && entry.session === session) this.clearTab(tabId);
|
|
686
|
+
}
|
|
687
|
+
/** buddi's answer to a frame this worker sent. */
|
|
688
|
+
ack(id, answer) {
|
|
689
|
+
const waiting = this.#waiting.get(id);
|
|
690
|
+
if (!waiting) return;
|
|
691
|
+
this.#waiting.delete(id);
|
|
692
|
+
clearTimeout(waiting.timer);
|
|
693
|
+
waiting.resolve(answer);
|
|
694
|
+
}
|
|
695
|
+
clearTab(tabId) {
|
|
696
|
+
const entry = this.#byTab.get(tabId);
|
|
697
|
+
if (entry) {
|
|
698
|
+
this.#byTab.delete(tabId);
|
|
699
|
+
clearTimeout(entry.timer);
|
|
700
|
+
entry.password = "";
|
|
701
|
+
}
|
|
702
|
+
for (const [id, waiting] of this.#waiting) {
|
|
703
|
+
if (waiting.tabId !== tabId) continue;
|
|
704
|
+
this.#waiting.delete(id);
|
|
705
|
+
clearTimeout(waiting.timer);
|
|
706
|
+
waiting.resolve(void 0);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
clearSession(session) {
|
|
710
|
+
for (const entry of [...this.#byTab.values()]) if (entry.session === session) this.clearTab(entry.tabId);
|
|
711
|
+
}
|
|
712
|
+
clear() {
|
|
713
|
+
for (const tabId of [...this.#byTab.keys()]) this.clearTab(tabId);
|
|
714
|
+
}
|
|
715
|
+
get size() {
|
|
716
|
+
return this.#byTab.size;
|
|
717
|
+
}
|
|
718
|
+
};
|
|
719
|
+
|
|
232
720
|
// src/commands.ts
|
|
233
721
|
var TAKEN = "The owner took this tab; observe again to continue in a new one.";
|
|
234
722
|
var MOVED = "This page has changed since that observation. Observe again.";
|
|
235
|
-
var WATCHED = "You are looking at this tab. buddi
|
|
723
|
+
var WATCHED = "You are looking at this tab. buddi waited and asked in the tab; nothing was done.";
|
|
724
|
+
var TAKEN_IN_TAB = "The owner took over this tab from the bar in it.";
|
|
236
725
|
var GROUP_TITLE = "buddi";
|
|
726
|
+
var NEW_WINDOW_NOTE = "Your Chrome couldn't open a tab in that window; opened a new window instead.";
|
|
727
|
+
var NO_WINDOW_NOTE = "Your Chrome had no ordinary window open, so the page opened in a new one, in the background.";
|
|
237
728
|
var MAX_FRAMES = 11;
|
|
238
729
|
var MAX_TREE = 32e3;
|
|
239
730
|
var MAX_TARGETS = 240;
|
|
@@ -427,14 +918,28 @@ var BrowserCommands = class {
|
|
|
427
918
|
#uuid;
|
|
428
919
|
#contentFile;
|
|
429
920
|
#onFrame;
|
|
921
|
+
#onEvent;
|
|
922
|
+
/** Sessions the owner let carry on in a tab they are looking at, by tab id. */
|
|
923
|
+
#inView = /* @__PURE__ */ new Map();
|
|
924
|
+
/** Sessions whose tab the owner holds (taken over in place), by tab id. */
|
|
925
|
+
#held = /* @__PURE__ */ new Map();
|
|
926
|
+
/** What a held tab need not ask about before offering to save a sign-in, as buddi said at the hold. */
|
|
927
|
+
#heldLogins = /* @__PURE__ */ new Map();
|
|
928
|
+
/** Sign-ins seen in held tabs, waiting for the owner's answer: one per tab, two minutes, gone on unhold or close. */
|
|
929
|
+
logins;
|
|
430
930
|
#now;
|
|
431
931
|
#wait;
|
|
432
932
|
/** How many things want the debugger on this tab. A screencast is one of them, and it outlives a command. */
|
|
433
933
|
#attached = /* @__PURE__ */ new Map();
|
|
434
934
|
#casts = /* @__PURE__ */ new Map();
|
|
435
935
|
#castsByTab = /* @__PURE__ */ new Map();
|
|
936
|
+
#ownerWaitMs;
|
|
436
937
|
constructor(chrome2, options = {}) {
|
|
437
938
|
this.#chrome = chrome2;
|
|
939
|
+
this.logins = new HeldLogins(options.onLogin ?? (() => void 0));
|
|
940
|
+
chrome2.tabs.onRemoved?.addListener((tabId) => this.logins.clearTab(tabId));
|
|
941
|
+
this.#onEvent = options.onEvent ?? (() => void 0);
|
|
942
|
+
this.#ownerWaitMs = options.ownerWaitMs;
|
|
438
943
|
this.#wait = options.wait ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
439
944
|
this.#onFrame = options.onFrame ?? (() => void 0);
|
|
440
945
|
this.#now = options.now ?? (() => Date.now());
|
|
@@ -446,6 +951,11 @@ var BrowserCommands = class {
|
|
|
446
951
|
const cast = this.#castsByTab.get(tabId);
|
|
447
952
|
if (cast) this.#forgetCast(cast);
|
|
448
953
|
});
|
|
954
|
+
chrome2.tabs.onUpdated?.addListener((tabId, change) => {
|
|
955
|
+
if (change.status !== "complete" || ![...this.#held.values()].includes(tabId)) return;
|
|
956
|
+
const session = [...this.#held].find(([, held]) => held === tabId)?.[0];
|
|
957
|
+
if (session) void this.#drawHeld(tabId, session);
|
|
958
|
+
});
|
|
449
959
|
this.#uuid = options.uuid ?? (() => crypto.randomUUID());
|
|
450
960
|
this.#contentFile = options.contentFile ?? "content.js";
|
|
451
961
|
}
|
|
@@ -482,6 +992,10 @@ var BrowserCommands = class {
|
|
|
482
992
|
}
|
|
483
993
|
case "input":
|
|
484
994
|
return this.#input(command, cancel);
|
|
995
|
+
case "hold":
|
|
996
|
+
return this.#hold(command, cancel);
|
|
997
|
+
case "unhold":
|
|
998
|
+
return this.#unhold(command.session);
|
|
485
999
|
case "close":
|
|
486
1000
|
return this.#close(command, cancel);
|
|
487
1001
|
default:
|
|
@@ -499,12 +1013,96 @@ var BrowserCommands = class {
|
|
|
499
1013
|
for (const session of [...this.#casts.keys()]) void this.#stopScreencast(session).catch(() => void 0);
|
|
500
1014
|
this.#sessions.clear();
|
|
501
1015
|
this.#refs.clear();
|
|
1016
|
+
this.#inView.clear();
|
|
1017
|
+
this.#held.clear();
|
|
1018
|
+
this.#heldLogins.clear();
|
|
1019
|
+
this.logins.clear();
|
|
1020
|
+
}
|
|
1021
|
+
/* ---- take-over in place ---- */
|
|
1022
|
+
/**
|
|
1023
|
+
* The owner takes the page where it is: the session's tab becomes the
|
|
1024
|
+
* active one, its window comes to the front, and the bar in it says buddi
|
|
1025
|
+
* is waiting, with Give it back. Nothing is streamed; it is their Chrome.
|
|
1026
|
+
*/
|
|
1027
|
+
async #hold(command, cancel) {
|
|
1028
|
+
const session = await this.#session(command.session);
|
|
1029
|
+
const tab = await this.#ownTab(session, this.#activeKey(session));
|
|
1030
|
+
const tabId = tab.id;
|
|
1031
|
+
cancel.check();
|
|
1032
|
+
cancel.dispatch();
|
|
1033
|
+
await this.#chrome.tabs.update(tabId, { active: true });
|
|
1034
|
+
if (tab.windowId !== void 0) await this.#chrome.windows.update?.(tab.windowId, { focused: true });
|
|
1035
|
+
this.#held.set(command.session, tabId);
|
|
1036
|
+
const logins = heldLoginFacts(command.args.logins);
|
|
1037
|
+
if (logins) this.#heldLogins.set(command.session, logins);
|
|
1038
|
+
else this.#heldLogins.delete(command.session);
|
|
1039
|
+
await this.#drawHeld(tabId, command.session);
|
|
1040
|
+
return {};
|
|
1041
|
+
}
|
|
1042
|
+
/**
|
|
1043
|
+
* The waiting bar in a held tab, and the watch that offers to save a sign-in
|
|
1044
|
+
* the owner makes there (docs/browser.md, "Saving a sign-in"). Drawn again on
|
|
1045
|
+
* every page the tab loads while it is held.
|
|
1046
|
+
*/
|
|
1047
|
+
async #drawHeld(tabId, session) {
|
|
1048
|
+
await this.#chrome.scripting.executeScript({ target: { tabId }, func: showHeldBar, args: [session] }).catch(() => void 0);
|
|
1049
|
+
const facts = this.#heldLogins.get(session) ?? null;
|
|
1050
|
+
await this.#chrome.scripting.executeScript({ target: { tabId }, func: watchHeldLogins, args: [session, facts] }).catch(() => void 0);
|
|
1051
|
+
}
|
|
1052
|
+
/** The tab a session holds, when the owner holds one: where a save-prompt answer may come from. */
|
|
1053
|
+
heldTab(session) {
|
|
1054
|
+
return this.#held.get(session);
|
|
1055
|
+
}
|
|
1056
|
+
/**
|
|
1057
|
+
* A sign-in message from a held tab's page (`heldLoginRequest`): a pair
|
|
1058
|
+
* seen, a page asking whether a question still waits for it, or the
|
|
1059
|
+
* owner's answer. The reply goes back to the page — a Save's is what buddi
|
|
1060
|
+
* said became of it. Undefined for a message this worker does not believe.
|
|
1061
|
+
*/
|
|
1062
|
+
loginMessage(message, sender) {
|
|
1063
|
+
const session = message?.session;
|
|
1064
|
+
const request = heldLoginRequest(message, sender, typeof session === "string" ? this.#held.get(session) : void 0);
|
|
1065
|
+
if (!request) return void 0;
|
|
1066
|
+
if (request.kind === "seen") return this.logins.capture(request.tabId, request.session, request.url, request).then((asked) => asked ?? null);
|
|
1067
|
+
if (request.kind === "pending") return this.logins.pending(request.tabId, request.session, request.url).then((asked) => asked ?? null);
|
|
1068
|
+
if (request.decision === "save") return this.logins.save(request.tabId, request.session);
|
|
1069
|
+
if (request.decision === "never") return Promise.resolve({ ok: this.logins.never(request.tabId, request.session) });
|
|
1070
|
+
this.logins.dismiss(request.tabId, request.session);
|
|
1071
|
+
return Promise.resolve({ ok: true });
|
|
1072
|
+
}
|
|
1073
|
+
/**
|
|
1074
|
+
* Given back (from the Canvas, or the bar): the bar goes, and the agent may
|
|
1075
|
+
* act in that tab although the owner is looking at it — they just handed it
|
|
1076
|
+
* over there, so waiting for them to leave it would be asking twice.
|
|
1077
|
+
*/
|
|
1078
|
+
async #unhold(session) {
|
|
1079
|
+
const tabId = this.#held.get(session);
|
|
1080
|
+
this.#held.delete(session);
|
|
1081
|
+
this.#heldLogins.delete(session);
|
|
1082
|
+
this.logins.clearSession(session);
|
|
1083
|
+
if (tabId === void 0) return {};
|
|
1084
|
+
this.#inView.set(session, tabId);
|
|
1085
|
+
await this.#chrome.scripting.executeScript({ target: { tabId }, func: hideHeldBar }).catch(() => void 0);
|
|
1086
|
+
return {};
|
|
1087
|
+
}
|
|
1088
|
+
/**
|
|
1089
|
+
* Give it back pressed in a held tab's bar. Refused from any other tab than
|
|
1090
|
+
* the one the session holds; a worker that was restarted since (and so
|
|
1091
|
+
* forgot what it held) passes it on, and the gateway resumes only a page
|
|
1092
|
+
* that is in the owner's hands. It hears it as the Canvas's Give it back.
|
|
1093
|
+
*/
|
|
1094
|
+
async giveBack(session, tabId) {
|
|
1095
|
+
const held = this.#held.get(session);
|
|
1096
|
+
if (tabId === void 0 || held !== void 0 && held !== tabId) return false;
|
|
1097
|
+
await this.#unhold(session);
|
|
1098
|
+
this.#onEvent({ type: "event", name: "giveback", session });
|
|
1099
|
+
return true;
|
|
502
1100
|
}
|
|
503
1101
|
/* ---- sessions and tabs ---- */
|
|
504
1102
|
async #session(session) {
|
|
505
1103
|
const existing = this.#sessions.get(session);
|
|
506
1104
|
if (existing) return existing;
|
|
507
|
-
const created = { groupId: -1, tabs: /* @__PURE__ */ new Map(), active: null, generation: 0 };
|
|
1105
|
+
const created = { groupId: -1, ungrouped: /* @__PURE__ */ new Set(), tabs: /* @__PURE__ */ new Map(), active: null, generation: 0 };
|
|
508
1106
|
this.#sessions.set(session, created);
|
|
509
1107
|
return created;
|
|
510
1108
|
}
|
|
@@ -528,12 +1126,17 @@ var BrowserCommands = class {
|
|
|
528
1126
|
this.#forget(session, key);
|
|
529
1127
|
throw new PreconditionError("That tab is gone. Observe again to continue in a new one.");
|
|
530
1128
|
}
|
|
531
|
-
if (session
|
|
1129
|
+
if (this.#taken(session, tab)) {
|
|
532
1130
|
this.#forget(session, key);
|
|
533
1131
|
throw new PreconditionError(TAKEN);
|
|
534
1132
|
}
|
|
535
1133
|
return tab;
|
|
536
1134
|
}
|
|
1135
|
+
/** The owner dragged this tab out of the session's group. A tab that never made it into the group cannot have been. */
|
|
1136
|
+
#taken(session, tab) {
|
|
1137
|
+
if (tab.id !== void 0 && session.ungrouped.has(tab.id)) return false;
|
|
1138
|
+
return session.groupId >= 0 && tab.groupId !== session.groupId;
|
|
1139
|
+
}
|
|
537
1140
|
#activeKey(session) {
|
|
538
1141
|
if (!session.active) throw new PreconditionError("This conversation has no browser tab yet. Navigate to open one.");
|
|
539
1142
|
return session.active;
|
|
@@ -542,31 +1145,131 @@ var BrowserCommands = class {
|
|
|
542
1145
|
* Reading a tab is harmless; typing into one the owner is reading is not.
|
|
543
1146
|
*
|
|
544
1147
|
* Unless the typing is theirs: a command marked `owner` came from the hand on
|
|
545
|
-
* the dashboard,
|
|
1148
|
+
* the dashboard. Otherwise, a tab the owner is looking at is waited on: up to
|
|
1149
|
+
* thirty seconds for them to leave it, with the bar in the tab after three
|
|
1150
|
+
* (Take over · Let it continue). Let it continue lets the agent act in view
|
|
1151
|
+
* for as long as that tab stays the one; Take over tells the gateway, which
|
|
1152
|
+
* hands the page to the owner exactly like the Canvas button.
|
|
546
1153
|
*/
|
|
547
|
-
async #background(tab,
|
|
548
|
-
if (owner) return;
|
|
549
|
-
if (tab.
|
|
1154
|
+
async #background(tab, command) {
|
|
1155
|
+
if (command.owner) return;
|
|
1156
|
+
if (tab.id === void 0 || !await this.#watched(tab.id)) return;
|
|
1157
|
+
if (this.#inView.get(command.session) === tab.id) return;
|
|
1158
|
+
const tabId = tab.id;
|
|
1159
|
+
const outcome = await waitForOwner({
|
|
1160
|
+
watched: () => this.#watched(tabId),
|
|
1161
|
+
show: async () => {
|
|
1162
|
+
await this.#chrome.scripting.executeScript({ target: { tabId }, func: showBar, args: ["buddi"] });
|
|
1163
|
+
},
|
|
1164
|
+
hide: async () => {
|
|
1165
|
+
await this.#chrome.scripting.executeScript({ target: { tabId }, func: hideBar });
|
|
1166
|
+
},
|
|
1167
|
+
choice: async () => {
|
|
1168
|
+
const [frame] = await this.#chrome.scripting.executeScript({ target: { tabId }, func: readBar });
|
|
1169
|
+
const choice = frame?.result;
|
|
1170
|
+
return choice === "continue" || choice === "takeover" ? choice : void 0;
|
|
1171
|
+
},
|
|
1172
|
+
wait: (ms) => this.#wait(ms),
|
|
1173
|
+
now: () => this.#now()
|
|
1174
|
+
}, this.#ownerWaitMs !== void 0 ? { waitMs: this.#ownerWaitMs } : {});
|
|
1175
|
+
if (outcome === "left") return;
|
|
1176
|
+
if (outcome === "continue") {
|
|
1177
|
+
this.#inView.set(command.session, tabId);
|
|
1178
|
+
return;
|
|
1179
|
+
}
|
|
1180
|
+
if (outcome === "takeover") {
|
|
1181
|
+
this.#onEvent({ type: "event", name: "takeover", session: command.session });
|
|
1182
|
+
throw new PreconditionError(TAKEN_IN_TAB);
|
|
1183
|
+
}
|
|
1184
|
+
throw new PreconditionError(WATCHED);
|
|
1185
|
+
}
|
|
1186
|
+
/** Is the owner looking at this tab right now: active, in a focused window? */
|
|
1187
|
+
async #watched(tabId) {
|
|
1188
|
+
const tab = await this.#chrome.tabs.get(tabId).catch(() => void 0);
|
|
1189
|
+
if (!tab || tab.active !== true || tab.windowId === void 0) return false;
|
|
550
1190
|
const window = await this.#chrome.windows.get(tab.windowId).catch(() => void 0);
|
|
551
|
-
|
|
1191
|
+
return window?.focused === true;
|
|
552
1192
|
}
|
|
553
1193
|
/** Where the tab actually is now, which a redirect may have changed. */
|
|
554
1194
|
#liveUrl(tab) {
|
|
555
1195
|
return checkUrl(tab.url ?? "");
|
|
556
1196
|
}
|
|
1197
|
+
/**
|
|
1198
|
+
* An ordinary window to open the tab in: the group's own when it has one,
|
|
1199
|
+
* else the one the owner used last, else any. `null` when Chrome has none
|
|
1200
|
+
* (only popups or installed apps' windows), `undefined` when this Chrome
|
|
1201
|
+
* cannot say, in which case Chrome picks as it always did.
|
|
1202
|
+
*/
|
|
1203
|
+
async #normalWindow(session) {
|
|
1204
|
+
const windows = this.#chrome.windows;
|
|
1205
|
+
if (!windows.getLastFocused && !windows.getAll) return void 0;
|
|
1206
|
+
const normal = (window) => window?.id !== void 0 && (window.type === void 0 || window.type === "normal");
|
|
1207
|
+
if (session.groupId >= 0) {
|
|
1208
|
+
const group = await this.#chrome.tabGroups.get(session.groupId).catch(() => void 0);
|
|
1209
|
+
if (group?.windowId !== void 0) {
|
|
1210
|
+
const found = await windows.get(group.windowId).catch(() => void 0);
|
|
1211
|
+
if (normal(found)) return found.id;
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
const last2 = await windows.getLastFocused?.({ windowTypes: ["normal"] }).catch(() => void 0);
|
|
1215
|
+
if (normal(last2)) return last2.id;
|
|
1216
|
+
const all = await windows.getAll?.({ windowTypes: ["normal"] }).catch(() => void 0);
|
|
1217
|
+
return all?.find(normal)?.id ?? null;
|
|
1218
|
+
}
|
|
1219
|
+
/**
|
|
1220
|
+
* One background tab, in an ordinary window, in the session's group.
|
|
1221
|
+
*
|
|
1222
|
+
* The group is cosmetic: Chrome refuses it in a window without a tab strip,
|
|
1223
|
+
* and that refusal must not undo a page that has already opened. No
|
|
1224
|
+
* ordinary window at all, or one that would not take the tab, and the page
|
|
1225
|
+
* opens in a new window that does not take the focus. Nothing here
|
|
1226
|
+
* activates a tab or focuses a window: the owner keeps working.
|
|
1227
|
+
*/
|
|
557
1228
|
async #openTab(session, url, cancel) {
|
|
1229
|
+
const windowId = await this.#normalWindow(session);
|
|
558
1230
|
cancel.dispatch();
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
if (
|
|
563
|
-
|
|
564
|
-
|
|
1231
|
+
let tab;
|
|
1232
|
+
let note;
|
|
1233
|
+
let groupable = true;
|
|
1234
|
+
if (windowId === void 0) {
|
|
1235
|
+
tab = await this.#chrome.tabs.create({ url, active: false });
|
|
1236
|
+
} else if (windowId !== null) {
|
|
1237
|
+
tab = await this.#chrome.tabs.create({ url, active: false, windowId }).catch(() => void 0);
|
|
1238
|
+
if (!tab) note = NEW_WINDOW_NOTE;
|
|
1239
|
+
} else {
|
|
1240
|
+
note = NO_WINDOW_NOTE;
|
|
1241
|
+
}
|
|
1242
|
+
if (!tab) {
|
|
1243
|
+
if (!this.#chrome.windows.create) throw new Error("Your Chrome has no ordinary window to open a tab in. Open a Chrome window and try again.");
|
|
1244
|
+
const created = await this.#chrome.windows.create({ url, focused: false, state: "normal" });
|
|
1245
|
+
tab = created.tabs?.[0];
|
|
1246
|
+
groupable = false;
|
|
1247
|
+
}
|
|
1248
|
+
if (tab?.id === void 0) throw new Error("Chrome opened a tab without an id.");
|
|
1249
|
+
const tabId = tab.id;
|
|
1250
|
+
if (groupable) {
|
|
1251
|
+
try {
|
|
1252
|
+
const groupId = await this.#chrome.tabs.group(session.groupId >= 0 ? { tabIds: [tabId], groupId: session.groupId } : { tabIds: [tabId] });
|
|
1253
|
+
if (session.groupId !== groupId) {
|
|
1254
|
+
session.groupId = groupId;
|
|
1255
|
+
await this.#chrome.tabGroups.update(groupId, { title: GROUP_TITLE, collapsed: false }).catch(() => void 0);
|
|
1256
|
+
}
|
|
1257
|
+
} catch {
|
|
1258
|
+
session.ungrouped.add(tabId);
|
|
1259
|
+
}
|
|
1260
|
+
} else {
|
|
1261
|
+
session.ungrouped.add(tabId);
|
|
565
1262
|
}
|
|
566
1263
|
const key = `tab-${this.#uuid().slice(0, 12)}`;
|
|
567
|
-
session.tabs.set(key,
|
|
1264
|
+
session.tabs.set(key, tabId);
|
|
568
1265
|
session.active = key;
|
|
569
|
-
return
|
|
1266
|
+
return { tabId, key, ...note ? { note } : {} };
|
|
1267
|
+
}
|
|
1268
|
+
/** What a failure after the tab opened carries back: the page is there. */
|
|
1269
|
+
async #openedError(error, tabId, key, url) {
|
|
1270
|
+
const tab = await this.#chrome.tabs.get(tabId).catch(() => void 0);
|
|
1271
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1272
|
+
return new OpenedError(message, { tabId: key, url: tab?.url ?? url, title: tab?.title ?? "" });
|
|
570
1273
|
}
|
|
571
1274
|
/** The key of this session's current tab, opening one when there is none to reuse. */
|
|
572
1275
|
async #reuseOrOpen(session, url, cancel) {
|
|
@@ -577,11 +1280,17 @@ var BrowserCommands = class {
|
|
|
577
1280
|
cancel.dispatch();
|
|
578
1281
|
await this.#chrome.tabs.update(tab.id, { url });
|
|
579
1282
|
await this.#waitForLoad(tab.id);
|
|
580
|
-
return;
|
|
1283
|
+
return void 0;
|
|
581
1284
|
}
|
|
582
1285
|
}
|
|
583
1286
|
const opened = await this.#openTab(session, url, cancel);
|
|
584
|
-
|
|
1287
|
+
try {
|
|
1288
|
+
await this.#waitForLoad(opened.tabId);
|
|
1289
|
+
} catch (error) {
|
|
1290
|
+
if (error instanceof CancelledError) throw error;
|
|
1291
|
+
throw await this.#openedError(error, opened.tabId, opened.key, url);
|
|
1292
|
+
}
|
|
1293
|
+
return opened.note;
|
|
585
1294
|
}
|
|
586
1295
|
/**
|
|
587
1296
|
* Wait for what the input may have started, not for what was already there.
|
|
@@ -621,8 +1330,8 @@ var BrowserCommands = class {
|
|
|
621
1330
|
session.observed = void 0;
|
|
622
1331
|
this.#refs.delete(command.session);
|
|
623
1332
|
cancel.check();
|
|
624
|
-
await this.#reuseOrOpen(session, url, cancel);
|
|
625
|
-
return {};
|
|
1333
|
+
const note = await this.#reuseOrOpen(session, url, cancel);
|
|
1334
|
+
return note ? { observation: { note } } : {};
|
|
626
1335
|
}
|
|
627
1336
|
async #tab(command) {
|
|
628
1337
|
const session = await this.#session(command.session);
|
|
@@ -636,13 +1345,14 @@ var BrowserCommands = class {
|
|
|
636
1345
|
}
|
|
637
1346
|
/** Closes this session's own tabs, and only the ones still in its group. */
|
|
638
1347
|
async #close(command, cancel) {
|
|
1348
|
+
this.#inView.delete(command.session);
|
|
639
1349
|
const session = this.#sessions.get(command.session);
|
|
640
1350
|
if (!session) return {};
|
|
641
1351
|
const ids = [];
|
|
642
1352
|
for (const [key, tabId] of [...session.tabs]) {
|
|
643
1353
|
const tab = await this.#chrome.tabs.get(tabId).catch(() => void 0);
|
|
644
1354
|
if (!tab) continue;
|
|
645
|
-
if (session
|
|
1355
|
+
if (this.#taken(session, tab)) {
|
|
646
1356
|
this.#forget(session, key);
|
|
647
1357
|
continue;
|
|
648
1358
|
}
|
|
@@ -662,7 +1372,7 @@ var BrowserCommands = class {
|
|
|
662
1372
|
const live = [];
|
|
663
1373
|
for (const [key, tabId] of [...session.tabs]) {
|
|
664
1374
|
const tab = await this.#chrome.tabs.get(tabId).catch(() => void 0);
|
|
665
|
-
if (!tab || session
|
|
1375
|
+
if (!tab || this.#taken(session, tab)) {
|
|
666
1376
|
this.#forget(session, key);
|
|
667
1377
|
continue;
|
|
668
1378
|
}
|
|
@@ -821,7 +1531,7 @@ Scroll: ${scroll.x}, ${scroll.y}`.slice(0, MAX_TREE);
|
|
|
821
1531
|
const ref = this.#ref(command.session, session, command.args["target"]);
|
|
822
1532
|
const tab = await this.#ownTab(session, ref.tabKey);
|
|
823
1533
|
if (ref.frameId === 0 && this.#liveUrl(tab) !== ref.docUrl) throw new PreconditionError(MOVED);
|
|
824
|
-
await this.#background(tab, command
|
|
1534
|
+
await this.#background(tab, command);
|
|
825
1535
|
cancel.check();
|
|
826
1536
|
return { ref, tab };
|
|
827
1537
|
}
|
|
@@ -1002,11 +1712,11 @@ Scroll: ${scroll.x}, ${scroll.y}`.slice(0, MAX_TREE);
|
|
|
1002
1712
|
await this.#stopScreencast(command.session);
|
|
1003
1713
|
throw new PreconditionError("That tab is gone. Observe again to continue in a new one.");
|
|
1004
1714
|
}
|
|
1005
|
-
if (session
|
|
1715
|
+
if (this.#taken(session, tab)) {
|
|
1006
1716
|
await this.#stopScreencast(command.session);
|
|
1007
1717
|
throw new PreconditionError(TAKEN);
|
|
1008
1718
|
}
|
|
1009
|
-
await this.#background(tab, command
|
|
1719
|
+
await this.#background(tab, command);
|
|
1010
1720
|
const event = inputEvent(command.args);
|
|
1011
1721
|
cancel.check();
|
|
1012
1722
|
cancel.dispatch();
|
|
@@ -1060,7 +1770,7 @@ Scroll: ${scroll.x}, ${scroll.y}`.slice(0, MAX_TREE);
|
|
|
1060
1770
|
const ref = this.#ref(command.session, session, { ref: str(command.args, "ref") });
|
|
1061
1771
|
const tab = await this.#ownTab(session, ref.tabKey);
|
|
1062
1772
|
if (ref.frameId === 0 && this.#liveUrl(tab) !== ref.docUrl) throw new PreconditionError(MOVED);
|
|
1063
|
-
await this.#background(tab, command
|
|
1773
|
+
await this.#background(tab, command);
|
|
1064
1774
|
cancel.check();
|
|
1065
1775
|
const [frame] = await this.#chrome.scripting.executeScript({
|
|
1066
1776
|
target: { tabId: ref.tabId, frameIds: [ref.frameId] },
|
|
@@ -1088,7 +1798,7 @@ Scroll: ${scroll.x}, ${scroll.y}`.slice(0, MAX_TREE);
|
|
|
1088
1798
|
if (value === "") throw new PreconditionError("The fill arrived with nothing in it.");
|
|
1089
1799
|
const tab = await this.#ownTab(session, ref.tabKey);
|
|
1090
1800
|
if (ref.frameId === 0 && this.#liveUrl(tab) !== ref.docUrl) throw new PreconditionError(MOVED);
|
|
1091
|
-
await this.#background(tab, command
|
|
1801
|
+
await this.#background(tab, command);
|
|
1092
1802
|
cancel.check();
|
|
1093
1803
|
cancel.dispatch();
|
|
1094
1804
|
const [frame] = await this.#chrome.scripting.executeScript({
|
|
@@ -1148,7 +1858,7 @@ Scroll: ${scroll.x}, ${scroll.y}`.slice(0, MAX_TREE);
|
|
|
1148
1858
|
if (!observed || observed.generation !== session.generation) throw new PreconditionError("Stale page observation. Observe again before scrolling.");
|
|
1149
1859
|
const tab = await this.#ownTab(session, observed.tabKey);
|
|
1150
1860
|
if (this.#liveUrl(tab) !== observed.url) throw new PreconditionError(MOVED);
|
|
1151
|
-
await this.#background(tab, command
|
|
1861
|
+
await this.#background(tab, command);
|
|
1152
1862
|
const tabId = tab.id;
|
|
1153
1863
|
const direction = str(command.args, "direction") === "up" ? "up" : "down";
|
|
1154
1864
|
cancel.check();
|
|
@@ -1235,6 +1945,13 @@ function pressRef(ref, key, code, keyCode) {
|
|
|
1235
1945
|
element.dispatchEvent(new KeyboardEvent(type, { key, code, keyCode, bubbles: true, cancelable: true }));
|
|
1236
1946
|
}
|
|
1237
1947
|
}
|
|
1948
|
+
function heldLoginFacts(raw) {
|
|
1949
|
+
if (!raw || typeof raw !== "object") return void 0;
|
|
1950
|
+
const { never, saved } = raw;
|
|
1951
|
+
const sites = Array.isArray(never) ? never.filter((site) => typeof site === "string" && site.length <= 253).slice(0, 500) : [];
|
|
1952
|
+
const kept = Array.isArray(saved) ? saved.filter((login) => typeof login?.site === "string" && typeof login?.username === "string").slice(0, 500).map(({ site, username }) => ({ site, username })) : [];
|
|
1953
|
+
return { never: sites, saved: kept };
|
|
1954
|
+
}
|
|
1238
1955
|
|
|
1239
1956
|
// src/external.ts
|
|
1240
1957
|
function isLoopbackOrigin(origin) {
|
|
@@ -1310,7 +2027,7 @@ function flush(open) {
|
|
|
1310
2027
|
}
|
|
1311
2028
|
}
|
|
1312
2029
|
}
|
|
1313
|
-
var commands = new BrowserCommands(chrome, { onFrame: send });
|
|
2030
|
+
var commands = new BrowserCommands(chrome, { onFrame: send, onEvent: send, onLogin: send });
|
|
1314
2031
|
var attempt = 0;
|
|
1315
2032
|
var timer;
|
|
1316
2033
|
var silence;
|
|
@@ -1323,6 +2040,7 @@ var protocol = new Protocol({
|
|
|
1323
2040
|
execute: (command, cancel) => commands.run(command, cancel),
|
|
1324
2041
|
// The socket ended: sessions and refs go with it. The tabs do not.
|
|
1325
2042
|
onReset: () => commands.reset(),
|
|
2043
|
+
onLoginAck: (id, answer) => commands.logins.ack(id, answer),
|
|
1326
2044
|
onState: (state) => {
|
|
1327
2045
|
last = state;
|
|
1328
2046
|
safely(() => chrome.runtime.sendMessage({ type: "buddi-state", state }).catch(() => void 0));
|
|
@@ -1416,9 +2134,23 @@ function schedule() {
|
|
|
1416
2134
|
safely(() => connect());
|
|
1417
2135
|
}, wait);
|
|
1418
2136
|
}
|
|
1419
|
-
chrome.runtime.onMessage.addListener((message,
|
|
2137
|
+
chrome.runtime.onMessage.addListener((message, sender, respond) => {
|
|
1420
2138
|
const request = message;
|
|
1421
2139
|
if (!request || typeof request.type !== "string") return;
|
|
2140
|
+
if (request.type === GIVE_BACK_MESSAGE) {
|
|
2141
|
+
const tabId = sender?.tab?.id;
|
|
2142
|
+
if (typeof request.session === "string") safely(() => commands.giveBack(request.session, tabId).then(() => void 0));
|
|
2143
|
+
return;
|
|
2144
|
+
}
|
|
2145
|
+
if (request.type === LOGIN_MESSAGE || request.type === LOGIN_SEEN_MESSAGE || request.type === LOGIN_PENDING_MESSAGE) {
|
|
2146
|
+
const reply = commands.loginMessage(message, sender);
|
|
2147
|
+
if (!reply) {
|
|
2148
|
+
respond(null);
|
|
2149
|
+
return;
|
|
2150
|
+
}
|
|
2151
|
+
safely(() => reply.then((answer) => respond(answer), () => respond(null)));
|
|
2152
|
+
return true;
|
|
2153
|
+
}
|
|
1422
2154
|
if (request.type === "buddi-get-state") {
|
|
1423
2155
|
respond({ state: last });
|
|
1424
2156
|
return;
|