agent-relay 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/bridge/spawner.d.ts +53 -0
- package/dist/bridge/spawner.d.ts.map +1 -1
- package/dist/bridge/spawner.js +203 -19
- package/dist/bridge/spawner.js.map +1 -1
- package/dist/bridge/types.d.ts +12 -0
- package/dist/bridge/types.d.ts.map +1 -1
- package/dist/cli/index.js +401 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cloud/api/auth.d.ts +3 -2
- package/dist/cloud/api/auth.d.ts.map +1 -1
- package/dist/cloud/api/auth.js +10 -98
- package/dist/cloud/api/auth.js.map +1 -1
- package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
- package/dist/cloud/api/cli-pty-runner.d.ts.map +1 -0
- package/dist/cloud/api/cli-pty-runner.js +119 -0
- package/dist/cloud/api/cli-pty-runner.js.map +1 -0
- package/dist/cloud/api/generic-webhooks.d.ts +8 -0
- package/dist/cloud/api/generic-webhooks.d.ts.map +1 -0
- package/dist/cloud/api/generic-webhooks.js +129 -0
- package/dist/cloud/api/generic-webhooks.js.map +1 -0
- package/dist/cloud/api/git.d.ts +8 -0
- package/dist/cloud/api/git.d.ts.map +1 -0
- package/dist/cloud/api/git.js +131 -0
- package/dist/cloud/api/git.js.map +1 -0
- package/dist/cloud/api/github-app.d.ts +11 -0
- package/dist/cloud/api/github-app.d.ts.map +1 -0
- package/dist/cloud/api/github-app.js +189 -0
- package/dist/cloud/api/github-app.js.map +1 -0
- package/dist/cloud/api/middleware/planLimits.d.ts +7 -0
- package/dist/cloud/api/middleware/planLimits.d.ts.map +1 -1
- package/dist/cloud/api/middleware/planLimits.js +39 -1
- package/dist/cloud/api/middleware/planLimits.js.map +1 -1
- package/dist/cloud/api/monitoring.d.ts +11 -0
- package/dist/cloud/api/monitoring.d.ts.map +1 -0
- package/dist/cloud/api/monitoring.js +578 -0
- package/dist/cloud/api/monitoring.js.map +1 -0
- package/dist/cloud/api/nango-auth.d.ts +9 -0
- package/dist/cloud/api/nango-auth.d.ts.map +1 -0
- package/dist/cloud/api/nango-auth.js +377 -0
- package/dist/cloud/api/nango-auth.js.map +1 -0
- package/dist/cloud/api/onboarding.d.ts +8 -1
- package/dist/cloud/api/onboarding.d.ts.map +1 -1
- package/dist/cloud/api/onboarding.js +300 -119
- package/dist/cloud/api/onboarding.js.map +1 -1
- package/dist/cloud/api/policy.d.ts +8 -0
- package/dist/cloud/api/policy.d.ts.map +1 -0
- package/dist/cloud/api/policy.js +229 -0
- package/dist/cloud/api/policy.js.map +1 -0
- package/dist/cloud/api/providers.js +114 -42
- package/dist/cloud/api/providers.js.map +1 -1
- package/dist/cloud/api/test-helpers.d.ts +10 -0
- package/dist/cloud/api/test-helpers.d.ts.map +1 -0
- package/dist/cloud/api/test-helpers.js +575 -0
- package/dist/cloud/api/test-helpers.js.map +1 -0
- package/dist/cloud/api/webhooks.d.ts +7 -0
- package/dist/cloud/api/webhooks.d.ts.map +1 -0
- package/dist/cloud/api/webhooks.js +496 -0
- package/dist/cloud/api/webhooks.js.map +1 -0
- package/dist/cloud/api/workspaces.js +225 -8
- package/dist/cloud/api/workspaces.js.map +1 -1
- package/dist/cloud/billing/plans.d.ts.map +1 -1
- package/dist/cloud/billing/plans.js +13 -0
- package/dist/cloud/billing/plans.js.map +1 -1
- package/dist/cloud/billing/types.d.ts +9 -3
- package/dist/cloud/billing/types.d.ts.map +1 -1
- package/dist/cloud/config.d.ts +9 -2
- package/dist/cloud/config.d.ts.map +1 -1
- package/dist/cloud/config.js +13 -4
- package/dist/cloud/config.js.map +1 -1
- package/dist/cloud/db/drizzle.d.ts +84 -1
- package/dist/cloud/db/drizzle.d.ts.map +1 -1
- package/dist/cloud/db/drizzle.js +470 -0
- package/dist/cloud/db/drizzle.js.map +1 -1
- package/dist/cloud/db/index.d.ts +9 -4
- package/dist/cloud/db/index.d.ts.map +1 -1
- package/dist/cloud/db/index.js +11 -3
- package/dist/cloud/db/index.js.map +1 -1
- package/dist/cloud/db/schema.d.ts +3283 -556
- package/dist/cloud/db/schema.d.ts.map +1 -1
- package/dist/cloud/db/schema.js +314 -1
- package/dist/cloud/db/schema.js.map +1 -1
- package/dist/cloud/index.d.ts +1 -0
- package/dist/cloud/index.d.ts.map +1 -1
- package/dist/cloud/index.js +2 -0
- package/dist/cloud/index.js.map +1 -1
- package/dist/cloud/provisioner/index.d.ts +24 -0
- package/dist/cloud/provisioner/index.d.ts.map +1 -1
- package/dist/cloud/provisioner/index.js +319 -18
- package/dist/cloud/provisioner/index.js.map +1 -1
- package/dist/cloud/server.d.ts +1 -0
- package/dist/cloud/server.d.ts.map +1 -1
- package/dist/cloud/server.js +357 -13
- package/dist/cloud/server.js.map +1 -1
- package/dist/cloud/services/auto-scaler.d.ts +152 -0
- package/dist/cloud/services/auto-scaler.d.ts.map +1 -0
- package/dist/cloud/services/auto-scaler.js +439 -0
- package/dist/cloud/services/auto-scaler.js.map +1 -0
- package/dist/cloud/services/capacity-manager.d.ts +148 -0
- package/dist/cloud/services/capacity-manager.d.ts.map +1 -0
- package/dist/cloud/services/capacity-manager.js +449 -0
- package/dist/cloud/services/capacity-manager.js.map +1 -0
- package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
- package/dist/cloud/services/ci-agent-spawner.d.ts.map +1 -0
- package/dist/cloud/services/ci-agent-spawner.js +373 -0
- package/dist/cloud/services/ci-agent-spawner.js.map +1 -0
- package/dist/cloud/services/index.d.ts +12 -0
- package/dist/cloud/services/index.d.ts.map +1 -0
- package/dist/cloud/services/index.js +15 -0
- package/dist/cloud/services/index.js.map +1 -0
- package/dist/cloud/services/mention-handler.d.ts +65 -0
- package/dist/cloud/services/mention-handler.d.ts.map +1 -0
- package/dist/cloud/services/mention-handler.js +405 -0
- package/dist/cloud/services/mention-handler.js.map +1 -0
- package/dist/cloud/services/nango.d.ts +126 -0
- package/dist/cloud/services/nango.d.ts.map +1 -0
- package/dist/cloud/services/nango.js +191 -0
- package/dist/cloud/services/nango.js.map +1 -0
- package/dist/cloud/services/persistence.d.ts +131 -0
- package/dist/cloud/services/persistence.d.ts.map +1 -0
- package/dist/cloud/services/persistence.js +200 -0
- package/dist/cloud/services/persistence.js.map +1 -0
- package/dist/cloud/services/planLimits.d.ts +15 -0
- package/dist/cloud/services/planLimits.d.ts.map +1 -1
- package/dist/cloud/services/planLimits.js +28 -0
- package/dist/cloud/services/planLimits.js.map +1 -1
- package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
- package/dist/cloud/services/scaling-orchestrator.d.ts.map +1 -0
- package/dist/cloud/services/scaling-orchestrator.js +502 -0
- package/dist/cloud/services/scaling-orchestrator.js.map +1 -0
- package/dist/cloud/services/scaling-policy.d.ts +121 -0
- package/dist/cloud/services/scaling-policy.d.ts.map +1 -0
- package/dist/cloud/services/scaling-policy.js +415 -0
- package/dist/cloud/services/scaling-policy.js.map +1 -0
- package/dist/cloud/vault/index.js +1 -1
- package/dist/cloud/vault/index.js.map +1 -1
- package/dist/cloud/webhooks/index.d.ts +24 -0
- package/dist/cloud/webhooks/index.d.ts.map +1 -0
- package/dist/cloud/webhooks/index.js +29 -0
- package/dist/cloud/webhooks/index.js.map +1 -0
- package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
- package/dist/cloud/webhooks/parsers/github.d.ts.map +1 -0
- package/dist/cloud/webhooks/parsers/github.js +234 -0
- package/dist/cloud/webhooks/parsers/github.js.map +1 -0
- package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
- package/dist/cloud/webhooks/parsers/index.d.ts.map +1 -0
- package/dist/cloud/webhooks/parsers/index.js +30 -0
- package/dist/cloud/webhooks/parsers/index.js.map +1 -0
- package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
- package/dist/cloud/webhooks/parsers/linear.d.ts.map +1 -0
- package/dist/cloud/webhooks/parsers/linear.js +258 -0
- package/dist/cloud/webhooks/parsers/linear.js.map +1 -0
- package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
- package/dist/cloud/webhooks/parsers/slack.d.ts.map +1 -0
- package/dist/cloud/webhooks/parsers/slack.js +214 -0
- package/dist/cloud/webhooks/parsers/slack.js.map +1 -0
- package/dist/cloud/webhooks/responders/github.d.ts +8 -0
- package/dist/cloud/webhooks/responders/github.d.ts.map +1 -0
- package/dist/cloud/webhooks/responders/github.js +73 -0
- package/dist/cloud/webhooks/responders/github.js.map +1 -0
- package/dist/cloud/webhooks/responders/index.d.ts +23 -0
- package/dist/cloud/webhooks/responders/index.d.ts.map +1 -0
- package/dist/cloud/webhooks/responders/index.js +30 -0
- package/dist/cloud/webhooks/responders/index.js.map +1 -0
- package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
- package/dist/cloud/webhooks/responders/linear.d.ts.map +1 -0
- package/dist/cloud/webhooks/responders/linear.js +149 -0
- package/dist/cloud/webhooks/responders/linear.js.map +1 -0
- package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
- package/dist/cloud/webhooks/responders/slack.d.ts.map +1 -0
- package/dist/cloud/webhooks/responders/slack.js +178 -0
- package/dist/cloud/webhooks/responders/slack.js.map +1 -0
- package/dist/cloud/webhooks/router.d.ts +25 -0
- package/dist/cloud/webhooks/router.d.ts.map +1 -0
- package/dist/cloud/webhooks/router.js +504 -0
- package/dist/cloud/webhooks/router.js.map +1 -0
- package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
- package/dist/cloud/webhooks/rules-engine.d.ts.map +1 -0
- package/dist/cloud/webhooks/rules-engine.js +287 -0
- package/dist/cloud/webhooks/rules-engine.js.map +1 -0
- package/dist/cloud/webhooks/types.d.ts +186 -0
- package/dist/cloud/webhooks/types.d.ts.map +1 -0
- package/dist/cloud/webhooks/types.js +8 -0
- package/dist/cloud/webhooks/types.js.map +1 -0
- package/dist/continuity/formatter.d.ts +51 -0
- package/dist/continuity/formatter.d.ts.map +1 -0
- package/dist/continuity/formatter.js +313 -0
- package/dist/continuity/formatter.js.map +1 -0
- package/dist/continuity/handoff-store.d.ts +67 -0
- package/dist/continuity/handoff-store.d.ts.map +1 -0
- package/dist/continuity/handoff-store.js +472 -0
- package/dist/continuity/handoff-store.js.map +1 -0
- package/dist/continuity/index.d.ts +45 -0
- package/dist/continuity/index.d.ts.map +1 -0
- package/dist/continuity/index.js +48 -0
- package/dist/continuity/index.js.map +1 -0
- package/dist/continuity/ledger-store.d.ts +110 -0
- package/dist/continuity/ledger-store.d.ts.map +1 -0
- package/dist/continuity/ledger-store.js +500 -0
- package/dist/continuity/ledger-store.js.map +1 -0
- package/dist/continuity/manager.d.ts +178 -0
- package/dist/continuity/manager.d.ts.map +1 -0
- package/dist/continuity/manager.js +562 -0
- package/dist/continuity/manager.js.map +1 -0
- package/dist/continuity/parser.d.ts +76 -0
- package/dist/continuity/parser.d.ts.map +1 -0
- package/dist/continuity/parser.js +579 -0
- package/dist/continuity/parser.js.map +1 -0
- package/dist/continuity/types.d.ts +180 -0
- package/dist/continuity/types.d.ts.map +1 -0
- package/dist/continuity/types.js +9 -0
- package/dist/continuity/types.js.map +1 -0
- package/dist/daemon/agent-manager.d.ts +27 -0
- package/dist/daemon/agent-manager.d.ts.map +1 -1
- package/dist/daemon/agent-manager.js +107 -6
- package/dist/daemon/agent-manager.js.map +1 -1
- package/dist/daemon/agent-registry.d.ts +32 -0
- package/dist/daemon/agent-registry.d.ts.map +1 -1
- package/dist/daemon/agent-registry.js +42 -2
- package/dist/daemon/agent-registry.js.map +1 -1
- package/dist/daemon/api.d.ts +12 -0
- package/dist/daemon/api.d.ts.map +1 -1
- package/dist/daemon/api.js +131 -2
- package/dist/daemon/api.js.map +1 -1
- package/dist/daemon/cli-auth.d.ts +67 -0
- package/dist/daemon/cli-auth.d.ts.map +1 -0
- package/dist/daemon/cli-auth.js +537 -0
- package/dist/daemon/cli-auth.js.map +1 -0
- package/dist/daemon/cloud-sync.d.ts.map +1 -1
- package/dist/daemon/cloud-sync.js +9 -7
- package/dist/daemon/cloud-sync.js.map +1 -1
- package/dist/daemon/orchestrator.d.ts.map +1 -1
- package/dist/daemon/orchestrator.js +30 -0
- package/dist/daemon/orchestrator.js.map +1 -1
- package/dist/daemon/router.d.ts +5 -0
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +78 -26
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/server.d.ts +5 -0
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +9 -1
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/browser-testing.d.ts +88 -0
- package/dist/daemon/services/browser-testing.d.ts.map +1 -0
- package/dist/daemon/services/browser-testing.js +244 -0
- package/dist/daemon/services/browser-testing.js.map +1 -0
- package/dist/daemon/services/container-spawner.d.ts +135 -0
- package/dist/daemon/services/container-spawner.d.ts.map +1 -0
- package/dist/daemon/services/container-spawner.js +313 -0
- package/dist/daemon/services/container-spawner.js.map +1 -0
- package/dist/daemon/types.d.ts +5 -1
- package/dist/daemon/types.d.ts.map +1 -1
- package/dist/dashboard/out/404.html +1 -1
- package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/480-2d4111711d4e473c.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/724-73c1ee5f60abe860.js +9 -0
- package/dist/dashboard/out/_next/static/chunks/766-c3a14283c88d815b.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/page-7120be68bea622f3.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-dc2e3a1a22478efc.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/history/{page-b6edd4dde8d08194.js → page-56a8b4616a90dc43.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/login/page-3eac37ea6f5dd153.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1081dd190a331a91.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/page-daf87e86f783f980.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-b68a681526eb145e.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/signup/page-fee4ed1709070bcd.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
- package/dist/dashboard/out/_next/static/chunks/{main-c2f423b9c9f4591b.js → main-97850e03d723ea8c.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
- package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
- package/dist/dashboard/out/_next/static/css/411ce23ffeae9f76.css +1 -0
- package/dist/dashboard/out/app.html +1 -14
- package/dist/dashboard/out/app.txt +2 -2
- package/dist/dashboard/out/connect-repos.html +1 -0
- package/dist/dashboard/out/connect-repos.txt +7 -0
- package/dist/dashboard/out/history.html +1 -1
- package/dist/dashboard/out/history.txt +2 -2
- package/dist/dashboard/out/index.html +1 -1
- package/dist/dashboard/out/index.txt +2 -2
- package/dist/dashboard/out/login.html +6 -0
- package/dist/dashboard/out/login.txt +7 -0
- package/dist/dashboard/out/metrics.html +1 -1
- package/dist/dashboard/out/metrics.txt +2 -2
- package/dist/dashboard/out/pricing.html +2 -2
- package/dist/dashboard/out/pricing.txt +2 -2
- package/dist/dashboard/out/providers.html +1 -0
- package/dist/dashboard/out/providers.txt +7 -0
- package/dist/dashboard/out/signup.html +6 -0
- package/dist/dashboard/out/signup.txt +7 -0
- package/dist/dashboard-server/server.d.ts.map +1 -1
- package/dist/dashboard-server/server.js +1308 -8
- package/dist/dashboard-server/server.js.map +1 -1
- package/dist/hooks/emitter.d.ts +40 -0
- package/dist/hooks/emitter.d.ts.map +1 -0
- package/dist/hooks/emitter.js +63 -0
- package/dist/hooks/emitter.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/registry.d.ts +173 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +476 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/trajectory-hooks.d.ts +52 -0
- package/dist/hooks/trajectory-hooks.d.ts.map +1 -0
- package/dist/hooks/trajectory-hooks.js +183 -0
- package/dist/hooks/trajectory-hooks.js.map +1 -0
- package/dist/hooks/types.d.ts +141 -0
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/memory/adapters/index.d.ts +8 -0
- package/dist/memory/adapters/index.d.ts.map +1 -0
- package/dist/memory/adapters/index.js +8 -0
- package/dist/memory/adapters/index.js.map +1 -0
- package/dist/memory/adapters/inmemory.d.ts +59 -0
- package/dist/memory/adapters/inmemory.d.ts.map +1 -0
- package/dist/memory/adapters/inmemory.js +195 -0
- package/dist/memory/adapters/inmemory.js.map +1 -0
- package/dist/memory/adapters/supermemory.d.ts +71 -0
- package/dist/memory/adapters/supermemory.d.ts.map +1 -0
- package/dist/memory/adapters/supermemory.js +338 -0
- package/dist/memory/adapters/supermemory.js.map +1 -0
- package/dist/memory/factory.d.ts +48 -0
- package/dist/memory/factory.d.ts.map +1 -0
- package/dist/memory/factory.js +143 -0
- package/dist/memory/factory.js.map +1 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +32 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/memory-hooks.d.ts +60 -0
- package/dist/memory/memory-hooks.d.ts.map +1 -0
- package/dist/memory/memory-hooks.js +313 -0
- package/dist/memory/memory-hooks.js.map +1 -0
- package/dist/memory/service.d.ts +49 -0
- package/dist/memory/service.d.ts.map +1 -0
- package/dist/memory/service.js +146 -0
- package/dist/memory/service.js.map +1 -0
- package/dist/memory/types.d.ts +195 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +8 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/policy/agent-policy.d.ts +225 -0
- package/dist/policy/agent-policy.d.ts.map +1 -0
- package/dist/policy/agent-policy.js +665 -0
- package/dist/policy/agent-policy.js.map +1 -0
- package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
- package/dist/policy/cloud-policy-fetcher.d.ts.map +1 -0
- package/dist/policy/cloud-policy-fetcher.js +64 -0
- package/dist/policy/cloud-policy-fetcher.js.map +1 -0
- package/dist/resiliency/crash-insights.d.ts +156 -0
- package/dist/resiliency/crash-insights.d.ts.map +1 -0
- package/dist/resiliency/crash-insights.js +492 -0
- package/dist/resiliency/crash-insights.js.map +1 -0
- package/dist/resiliency/gossip-health.d.ts +137 -0
- package/dist/resiliency/gossip-health.d.ts.map +1 -0
- package/dist/resiliency/gossip-health.js +241 -0
- package/dist/resiliency/gossip-health.js.map +1 -0
- package/dist/resiliency/index.d.ts +5 -0
- package/dist/resiliency/index.d.ts.map +1 -1
- package/dist/resiliency/index.js +5 -0
- package/dist/resiliency/index.js.map +1 -1
- package/dist/resiliency/leader-watchdog.d.ts +109 -0
- package/dist/resiliency/leader-watchdog.d.ts.map +1 -0
- package/dist/resiliency/leader-watchdog.js +189 -0
- package/dist/resiliency/leader-watchdog.js.map +1 -0
- package/dist/resiliency/memory-monitor.d.ts +172 -0
- package/dist/resiliency/memory-monitor.d.ts.map +1 -0
- package/dist/resiliency/memory-monitor.js +593 -0
- package/dist/resiliency/memory-monitor.js.map +1 -0
- package/dist/resiliency/stateless-lead.d.ts +149 -0
- package/dist/resiliency/stateless-lead.d.ts.map +1 -0
- package/dist/resiliency/stateless-lead.js +308 -0
- package/dist/resiliency/stateless-lead.js.map +1 -0
- package/dist/resiliency/supervisor.d.ts +38 -0
- package/dist/resiliency/supervisor.d.ts.map +1 -1
- package/dist/resiliency/supervisor.js +122 -0
- package/dist/resiliency/supervisor.js.map +1 -1
- package/dist/shared/cli-auth-config.d.ts +91 -0
- package/dist/shared/cli-auth-config.d.ts.map +1 -0
- package/dist/shared/cli-auth-config.js +264 -0
- package/dist/shared/cli-auth-config.js.map +1 -0
- package/dist/storage/adapter.d.ts +1 -1
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/trajectory/config.d.ts +84 -0
- package/dist/trajectory/config.d.ts.map +1 -0
- package/dist/trajectory/config.js +163 -0
- package/dist/trajectory/config.js.map +1 -0
- package/dist/trajectory/index.d.ts +8 -0
- package/dist/trajectory/index.d.ts.map +1 -0
- package/dist/trajectory/index.js +8 -0
- package/dist/trajectory/index.js.map +1 -0
- package/dist/trajectory/integration.d.ts +292 -0
- package/dist/trajectory/integration.d.ts.map +1 -0
- package/dist/trajectory/integration.js +834 -0
- package/dist/trajectory/integration.js.map +1 -0
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/project-namespace.d.ts +24 -0
- package/dist/utils/project-namespace.d.ts.map +1 -1
- package/dist/utils/project-namespace.js +84 -0
- package/dist/utils/project-namespace.js.map +1 -1
- package/dist/wrapper/parser.d.ts +10 -0
- package/dist/wrapper/parser.d.ts.map +1 -1
- package/dist/wrapper/parser.js +100 -33
- package/dist/wrapper/parser.js.map +1 -1
- package/dist/wrapper/pty-wrapper.d.ts +197 -16
- package/dist/wrapper/pty-wrapper.d.ts.map +1 -1
- package/dist/wrapper/pty-wrapper.js +943 -106
- package/dist/wrapper/pty-wrapper.js.map +1 -1
- package/dist/wrapper/shared.d.ts +165 -0
- package/dist/wrapper/shared.d.ts.map +1 -0
- package/dist/wrapper/shared.js +270 -0
- package/dist/wrapper/shared.js.map +1 -0
- package/dist/wrapper/tmux-wrapper.d.ts +73 -11
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
- package/dist/wrapper/tmux-wrapper.js +541 -120
- package/dist/wrapper/tmux-wrapper.js.map +1 -1
- package/docs/CLOUD-ARCHITECTURE.md +152 -0
- package/docs/HOOKS_API.md +394 -0
- package/docs/WRAPPER_EVENTS.md +358 -0
- package/docs/agent-policy-snippet.md +40 -0
- package/docs/agent-relay-protocol.md +238 -0
- package/docs/agent-relay-snippet.md +53 -47
- package/docs/archive/EXECUTIVE_SUMMARY.md +358 -0
- package/docs/archive/ROADMAP.md +329 -0
- package/docs/competitive/GASTOWN.md +451 -0
- package/docs/{COMPETITIVE_ANALYSIS.md → competitive/OVERVIEW.md} +1 -0
- package/docs/competitive/README.md +34 -0
- package/docs/competitive/TMUX_ORCHESTRATOR.md +605 -0
- package/docs/dashboard.png +0 -0
- package/docs/design/ci-failure-webhooks.md +812 -0
- package/docs/design/comprehensive-integrations.md +238 -0
- package/docs/design/e2b-sandbox-integration.md +504 -0
- package/docs/design/github-app-permissions.md +264 -0
- package/docs/local-testing.md +428 -0
- package/docs/proposals/continuous-claude-integration.md +622 -0
- package/docs/proposals/custom-commands.md +368 -0
- package/docs/tasks/global-skills-system.tasks.md +230 -0
- package/docs/tasks/webhook-integrations.tasks.md +184 -0
- package/docs/tasks/workspace-capabilities.tasks.md +121 -0
- package/docs/testing/RESILIENCY-TEST-PLAN-2026-01-01.md +366 -0
- package/package.json +16 -7
- package/scripts/cloud-setup.sh +96 -0
- package/scripts/manual-qa.sh +293 -0
- package/scripts/postinstall.js +60 -0
- package/scripts/run-cloud-qa.sh +220 -0
- package/scripts/test-cli-auth/Dockerfile +44 -0
- package/scripts/test-cli-auth/Dockerfile.real +79 -0
- package/scripts/test-cli-auth/README.md +286 -0
- package/scripts/test-cli-auth/ci-test-real-clis.ts +251 -0
- package/scripts/test-cli-auth/ci-test-runner.ts +263 -0
- package/scripts/test-cli-auth/mock-cli.sh +147 -0
- package/scripts/test-cli-auth/package.json +14 -0
- package/scripts/test-cli-auth/test-oauth-flow.ts +220 -0
- package/scripts/test-pty-input-auto.js +222 -0
- package/scripts/test-pty-input.js +150 -0
- package/dist/dashboard/out/_next/static/chunks/693-7b3301d8f6bc5014.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/webpack-a5acc2831d094776.js +0 -1
- package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +0 -1
- package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +0 -1
- /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → H5aWG0udPB4iOUIl_gytz}/_buildManifest.js +0 -0
- /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → H5aWG0udPB4iOUIl_gytz}/_ssgManifest.js +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{117-b2cd8d6485aacf2b.js → 117-b100311aff8d5c61.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{648-8f3f26864ce515e5.js → 648-a13d3c2b1be45466.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-0b990dbb71d72a98.js → page-a4973f3e3c82fb67.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/pricing/{page-d80e03a5297f95b6.js → page-4d72d5a5d8a9b618.js} +0 -0
- /package/docs/{CHANGELOG.md → archive/CHANGELOG.md} +0 -0
- /package/docs/{CLI-SIMPLIFICATION-COMPLETE.md → archive/CLI-SIMPLIFICATION-COMPLETE.md} +0 -0
- /package/docs/{DESIGN_BRIDGE_STAFFING.md → archive/DESIGN_BRIDGE_STAFFING.md} +0 -0
- /package/docs/{DESIGN_V2.md → archive/DESIGN_V2.md} +0 -0
- /package/docs/{MONETIZATION.md → archive/MONETIZATION.md} +0 -0
- /package/docs/{PROPOSAL-trajectories.md → archive/PROPOSAL-trajectories.md} +0 -0
- /package/docs/{SCALING_ANALYSIS.md → archive/SCALING_ANALYSIS.md} +0 -0
- /package/docs/{TESTING_PRESENCE_FEATURES.md → archive/TESTING_PRESENCE_FEATURES.md} +0 -0
- /package/docs/{TMUX_IMPLEMENTATION_NOTES.md → archive/TMUX_IMPLEMENTATION_NOTES.md} +0 -0
- /package/docs/{TMUX_IMPROVEMENTS.md → archive/TMUX_IMPROVEMENTS.md} +0 -0
- /package/docs/{dashboard-v2-plan.md → archive/dashboard-v2-plan.md} +0 -0
- /package/docs/{removable-code-analysis.md → archive/removable-code-analysis.md} +0 -0
- /package/docs/{competitive-analysis-mcp-agent-mail.md → competitive/MCP_AGENT_MAIL.md} +0 -0
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Auth Handler for Workspace Daemon
|
|
3
|
+
*
|
|
4
|
+
* Handles CLI-based authentication (claude, codex, etc.) via PTY.
|
|
5
|
+
* Runs inside the workspace container where CLI tools are installed.
|
|
6
|
+
*/
|
|
7
|
+
import * as pty from 'node-pty';
|
|
8
|
+
import * as crypto from 'crypto';
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import * as os from 'os';
|
|
11
|
+
import { createLogger } from '../resiliency/logger.js';
|
|
12
|
+
import { CLI_AUTH_CONFIG, stripAnsiCodes, matchesSuccessPattern, findMatchingPrompt, getSupportedProviders, } from '../shared/cli-auth-config.js';
|
|
13
|
+
const logger = createLogger('cli-auth');
|
|
14
|
+
// Re-export for consumers
|
|
15
|
+
export { CLI_AUTH_CONFIG, getSupportedProviders };
|
|
16
|
+
// Active sessions
|
|
17
|
+
const sessions = new Map();
|
|
18
|
+
// Clean up old sessions periodically
|
|
19
|
+
setInterval(() => {
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
for (const [id, session] of sessions) {
|
|
22
|
+
if (now - session.createdAt.getTime() > 10 * 60 * 1000) {
|
|
23
|
+
if (session.process) {
|
|
24
|
+
try {
|
|
25
|
+
session.process.kill();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Process may already be dead
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
sessions.delete(id);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}, 60000);
|
|
35
|
+
/**
|
|
36
|
+
* Start CLI auth flow
|
|
37
|
+
*
|
|
38
|
+
* This function waits for the auth URL to be captured before returning,
|
|
39
|
+
* ensuring the caller can immediately open the OAuth popup.
|
|
40
|
+
*/
|
|
41
|
+
export async function startCLIAuth(provider, options = {}) {
|
|
42
|
+
const config = CLI_AUTH_CONFIG[provider];
|
|
43
|
+
if (!config) {
|
|
44
|
+
throw new Error(`Unknown provider: ${provider}`);
|
|
45
|
+
}
|
|
46
|
+
const sessionId = crypto.randomUUID();
|
|
47
|
+
const session = {
|
|
48
|
+
id: sessionId,
|
|
49
|
+
provider,
|
|
50
|
+
status: 'starting',
|
|
51
|
+
output: '',
|
|
52
|
+
promptsHandled: [],
|
|
53
|
+
createdAt: new Date(),
|
|
54
|
+
};
|
|
55
|
+
sessions.set(sessionId, session);
|
|
56
|
+
logger.info('CLI auth session created', {
|
|
57
|
+
sessionId,
|
|
58
|
+
provider,
|
|
59
|
+
totalActiveSessions: sessions.size,
|
|
60
|
+
allSessionIds: Array.from(sessions.keys()),
|
|
61
|
+
});
|
|
62
|
+
// Check if already authenticated (credentials exist)
|
|
63
|
+
try {
|
|
64
|
+
const existingCreds = await extractCredentials(provider, config);
|
|
65
|
+
if (existingCreds?.token) {
|
|
66
|
+
logger.info('Already authenticated - existing credentials found', { provider, sessionId });
|
|
67
|
+
session.status = 'success';
|
|
68
|
+
session.token = existingCreds.token;
|
|
69
|
+
session.refreshToken = existingCreds.refreshToken;
|
|
70
|
+
session.tokenExpiresAt = existingCreds.expiresAt;
|
|
71
|
+
return session;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// No existing credentials, proceed with auth flow
|
|
76
|
+
}
|
|
77
|
+
// Use device flow args if requested and supported
|
|
78
|
+
const args = options.useDeviceFlow && config.deviceFlowArgs
|
|
79
|
+
? config.deviceFlowArgs
|
|
80
|
+
: config.args;
|
|
81
|
+
logger.info('Starting CLI auth', {
|
|
82
|
+
provider,
|
|
83
|
+
sessionId,
|
|
84
|
+
useDeviceFlow: options.useDeviceFlow,
|
|
85
|
+
args,
|
|
86
|
+
});
|
|
87
|
+
const respondedPrompts = new Set();
|
|
88
|
+
// Create a promise that resolves when authUrl is captured or timeout
|
|
89
|
+
let resolveAuthUrl;
|
|
90
|
+
const authUrlPromise = new Promise((resolve) => {
|
|
91
|
+
resolveAuthUrl = resolve;
|
|
92
|
+
});
|
|
93
|
+
// Timeout for waiting for auth URL (shorter than the full OAuth timeout)
|
|
94
|
+
const AUTH_URL_WAIT_TIMEOUT = 15000; // 15 seconds to capture auth URL
|
|
95
|
+
const authUrlTimeout = setTimeout(() => {
|
|
96
|
+
logger.warn('Auth URL wait timeout, returning session without URL', { provider, sessionId });
|
|
97
|
+
resolveAuthUrl();
|
|
98
|
+
}, AUTH_URL_WAIT_TIMEOUT);
|
|
99
|
+
try {
|
|
100
|
+
const proc = pty.spawn(config.command, args, {
|
|
101
|
+
name: 'xterm-256color',
|
|
102
|
+
cols: 120,
|
|
103
|
+
rows: 30,
|
|
104
|
+
cwd: process.cwd(),
|
|
105
|
+
env: {
|
|
106
|
+
...process.env,
|
|
107
|
+
NO_COLOR: '1',
|
|
108
|
+
TERM: 'xterm-256color',
|
|
109
|
+
// Don't set BROWSER - let CLI fail to open browser and fall back to manual paste mode
|
|
110
|
+
// Setting BROWSER: 'echo' caused CLI to think browser opened and wait for callback that never came
|
|
111
|
+
DISPLAY: '',
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
session.process = proc;
|
|
115
|
+
// Timeout handler - give user plenty of time to complete OAuth flow
|
|
116
|
+
// 5 minutes should be enough for even slow OAuth flows
|
|
117
|
+
const OAUTH_COMPLETION_TIMEOUT = 5 * 60 * 1000; // 5 minutes
|
|
118
|
+
const timeout = setTimeout(() => {
|
|
119
|
+
if (session.status === 'starting' || session.status === 'waiting_auth') {
|
|
120
|
+
logger.warn('CLI auth timed out', { provider, sessionId, status: session.status });
|
|
121
|
+
proc.kill();
|
|
122
|
+
session.status = 'error';
|
|
123
|
+
session.error = 'Timeout waiting for auth completion (5 minutes). Please try again.';
|
|
124
|
+
}
|
|
125
|
+
}, config.waitTimeout + OAUTH_COMPLETION_TIMEOUT);
|
|
126
|
+
// Keep-alive: Some CLIs timeout if they don't receive stdin input
|
|
127
|
+
// Send a space+backspace every 20 seconds to simulate user presence
|
|
128
|
+
const keepAliveInterval = setInterval(() => {
|
|
129
|
+
if (session.status === 'waiting_auth' && session.process) {
|
|
130
|
+
try {
|
|
131
|
+
// Send space then backspace - appears as user typing but no net effect
|
|
132
|
+
session.process.write(' \b');
|
|
133
|
+
logger.debug('Keep-alive ping sent', {
|
|
134
|
+
sessionId,
|
|
135
|
+
status: session.status,
|
|
136
|
+
ageSeconds: Math.round((Date.now() - session.createdAt.getTime()) / 1000),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Process may have exited
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}, 20000);
|
|
144
|
+
proc.onData((data) => {
|
|
145
|
+
session.output += data;
|
|
146
|
+
// Handle prompts
|
|
147
|
+
const matchingPrompt = findMatchingPrompt(data, config.prompts, respondedPrompts);
|
|
148
|
+
if (matchingPrompt) {
|
|
149
|
+
respondedPrompts.add(matchingPrompt.description);
|
|
150
|
+
session.promptsHandled.push(matchingPrompt.description);
|
|
151
|
+
logger.info('Auto-responding to prompt', { description: matchingPrompt.description });
|
|
152
|
+
const delay = matchingPrompt.delay ?? 100;
|
|
153
|
+
setTimeout(() => {
|
|
154
|
+
try {
|
|
155
|
+
proc.write(matchingPrompt.response);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Process may have exited
|
|
159
|
+
}
|
|
160
|
+
}, delay);
|
|
161
|
+
}
|
|
162
|
+
// Extract auth URL
|
|
163
|
+
const cleanText = stripAnsiCodes(data);
|
|
164
|
+
const match = cleanText.match(config.urlPattern);
|
|
165
|
+
if (match && match[1] && !session.authUrl) {
|
|
166
|
+
session.authUrl = match[1];
|
|
167
|
+
session.status = 'waiting_auth';
|
|
168
|
+
logger.info('Auth URL captured', { provider, url: session.authUrl });
|
|
169
|
+
// Signal that we have the auth URL
|
|
170
|
+
clearTimeout(authUrlTimeout);
|
|
171
|
+
resolveAuthUrl();
|
|
172
|
+
}
|
|
173
|
+
// Log all output after auth URL is captured (for debugging)
|
|
174
|
+
if (session.authUrl) {
|
|
175
|
+
const trimmedData = stripAnsiCodes(data).trim();
|
|
176
|
+
if (trimmedData.length > 0) {
|
|
177
|
+
logger.info('PTY output after auth URL', {
|
|
178
|
+
provider,
|
|
179
|
+
sessionId,
|
|
180
|
+
output: trimmedData.substring(0, 500),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Check for success and try to extract credentials
|
|
185
|
+
if (matchesSuccessPattern(data, config.successPatterns)) {
|
|
186
|
+
session.status = 'success';
|
|
187
|
+
logger.info('Success pattern detected, attempting credential extraction', { provider });
|
|
188
|
+
// Try to extract credentials immediately (CLI may not exit after success)
|
|
189
|
+
// Use a small delay to let the CLI finish writing the file
|
|
190
|
+
setTimeout(async () => {
|
|
191
|
+
try {
|
|
192
|
+
const creds = await extractCredentials(provider, config);
|
|
193
|
+
if (creds) {
|
|
194
|
+
session.token = creds.token;
|
|
195
|
+
session.refreshToken = creds.refreshToken;
|
|
196
|
+
session.tokenExpiresAt = creds.expiresAt;
|
|
197
|
+
logger.info('Credentials extracted successfully', { provider, hasRefreshToken: !!creds.refreshToken });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
logger.error('Failed to extract credentials on success', { error: String(err) });
|
|
202
|
+
}
|
|
203
|
+
}, 500);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
proc.onExit(async ({ exitCode }) => {
|
|
207
|
+
clearTimeout(timeout);
|
|
208
|
+
clearTimeout(authUrlTimeout);
|
|
209
|
+
clearInterval(keepAliveInterval);
|
|
210
|
+
// Clear process reference so submitAuthCode knows PTY is gone
|
|
211
|
+
session.process = undefined;
|
|
212
|
+
// Log full output for debugging PTY exit issues
|
|
213
|
+
const cleanOutput = stripAnsiCodes(session.output);
|
|
214
|
+
logger.info('CLI process exited', {
|
|
215
|
+
provider,
|
|
216
|
+
exitCode,
|
|
217
|
+
outputLength: session.output.length,
|
|
218
|
+
hasAuthUrl: !!session.authUrl,
|
|
219
|
+
sessionStatus: session.status,
|
|
220
|
+
promptsHandled: session.promptsHandled,
|
|
221
|
+
// Last 500 chars of output for debugging
|
|
222
|
+
outputTail: cleanOutput.slice(-500),
|
|
223
|
+
});
|
|
224
|
+
// Try to extract credentials
|
|
225
|
+
if (session.authUrl || exitCode === 0) {
|
|
226
|
+
try {
|
|
227
|
+
const creds = await extractCredentials(provider, config);
|
|
228
|
+
if (creds) {
|
|
229
|
+
session.token = creds.token;
|
|
230
|
+
session.refreshToken = creds.refreshToken;
|
|
231
|
+
session.tokenExpiresAt = creds.expiresAt;
|
|
232
|
+
session.status = 'success';
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
logger.error('Failed to extract credentials', { error: String(err) });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (!session.authUrl && !session.token && session.status !== 'error') {
|
|
240
|
+
session.status = 'error';
|
|
241
|
+
session.error = 'CLI exited without auth URL or credentials';
|
|
242
|
+
}
|
|
243
|
+
// Resolve in case we're still waiting
|
|
244
|
+
resolveAuthUrl();
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
session.status = 'error';
|
|
249
|
+
session.error = err instanceof Error ? err.message : 'Failed to spawn CLI';
|
|
250
|
+
logger.error('Failed to start CLI auth', { error: session.error });
|
|
251
|
+
clearTimeout(authUrlTimeout);
|
|
252
|
+
resolveAuthUrl();
|
|
253
|
+
}
|
|
254
|
+
// Wait for auth URL to be captured (or timeout)
|
|
255
|
+
await authUrlPromise;
|
|
256
|
+
return session;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get auth session status
|
|
260
|
+
*/
|
|
261
|
+
export function getAuthSession(sessionId) {
|
|
262
|
+
return sessions.get(sessionId) || null;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Submit auth code to a waiting session
|
|
266
|
+
* This writes the code to the PTY process stdin
|
|
267
|
+
*
|
|
268
|
+
* @returns Object with success status and optional error message
|
|
269
|
+
*/
|
|
270
|
+
export async function submitAuthCode(sessionId, code) {
|
|
271
|
+
// Log all active sessions for debugging
|
|
272
|
+
const activeSessionIds = Array.from(sessions.keys());
|
|
273
|
+
logger.info('submitAuthCode called', {
|
|
274
|
+
sessionId,
|
|
275
|
+
codeLength: code.length,
|
|
276
|
+
activeSessionCount: activeSessionIds.length,
|
|
277
|
+
activeSessionIds,
|
|
278
|
+
});
|
|
279
|
+
const session = sessions.get(sessionId);
|
|
280
|
+
if (!session) {
|
|
281
|
+
logger.warn('Auth code submission failed: session not found', {
|
|
282
|
+
sessionId,
|
|
283
|
+
activeSessionIds,
|
|
284
|
+
hint: 'Session may have been cleaned up or never created',
|
|
285
|
+
});
|
|
286
|
+
return { success: false, error: 'Session not found or expired', needsRestart: true };
|
|
287
|
+
}
|
|
288
|
+
logger.info('Session found for code submission', {
|
|
289
|
+
sessionId,
|
|
290
|
+
provider: session.provider,
|
|
291
|
+
status: session.status,
|
|
292
|
+
hasProcess: !!session.process,
|
|
293
|
+
hasAuthUrl: !!session.authUrl,
|
|
294
|
+
hasToken: !!session.token,
|
|
295
|
+
promptsHandled: session.promptsHandled,
|
|
296
|
+
createdAt: session.createdAt.toISOString(),
|
|
297
|
+
ageSeconds: Math.round((Date.now() - session.createdAt.getTime()) / 1000),
|
|
298
|
+
});
|
|
299
|
+
if (!session.process) {
|
|
300
|
+
logger.warn('Auth code submission failed: no PTY process', {
|
|
301
|
+
sessionId,
|
|
302
|
+
sessionStatus: session.status,
|
|
303
|
+
provider: session.provider,
|
|
304
|
+
outputLength: session.output?.length || 0,
|
|
305
|
+
outputTail: session.output ? stripAnsiCodes(session.output).slice(-500) : 'no output',
|
|
306
|
+
});
|
|
307
|
+
// Try to extract credentials as a fallback - maybe auth completed in browser
|
|
308
|
+
const config = CLI_AUTH_CONFIG[session.provider];
|
|
309
|
+
if (config) {
|
|
310
|
+
try {
|
|
311
|
+
const creds = await extractCredentials(session.provider, config);
|
|
312
|
+
if (creds) {
|
|
313
|
+
session.token = creds.token;
|
|
314
|
+
session.refreshToken = creds.refreshToken;
|
|
315
|
+
session.tokenExpiresAt = creds.expiresAt;
|
|
316
|
+
session.status = 'success';
|
|
317
|
+
logger.info('Credentials found despite PTY exit', { provider: session.provider });
|
|
318
|
+
return { success: true };
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// No credentials found
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// For providers like Claude that need the code pasted into CLI,
|
|
326
|
+
// if the PTY is gone, user needs to restart the auth flow
|
|
327
|
+
return {
|
|
328
|
+
success: false,
|
|
329
|
+
error: 'The authentication session has ended. The CLI process exited before the code could be entered. Please click "Try Again" to restart.',
|
|
330
|
+
needsRestart: true,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
// Clean the code - trim whitespace
|
|
335
|
+
const cleanCode = code.trim();
|
|
336
|
+
logger.info('Writing auth code to PTY', {
|
|
337
|
+
sessionId,
|
|
338
|
+
originalLength: code.length,
|
|
339
|
+
cleanLength: cleanCode.length,
|
|
340
|
+
codePreview: cleanCode.substring(0, 20) + '...',
|
|
341
|
+
});
|
|
342
|
+
// Write the auth code WITHOUT Enter first
|
|
343
|
+
// Claude CLI's Ink text input needs time to process the input
|
|
344
|
+
// before receiving Enter (tested: immediate Enter fails, delayed Enter works)
|
|
345
|
+
session.process.write(cleanCode);
|
|
346
|
+
logger.info('Auth code written, waiting before sending Enter...', { sessionId });
|
|
347
|
+
// Wait 1 second for CLI to process the typed input
|
|
348
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
349
|
+
// Now send Enter to submit
|
|
350
|
+
session.process.write('\r');
|
|
351
|
+
logger.info('Enter key sent', { sessionId });
|
|
352
|
+
// Start polling for credentials after code submission
|
|
353
|
+
// The CLI should write credentials shortly after receiving the code
|
|
354
|
+
const config = CLI_AUTH_CONFIG[session.provider];
|
|
355
|
+
if (config) {
|
|
356
|
+
pollForCredentials(session, config);
|
|
357
|
+
}
|
|
358
|
+
return { success: true };
|
|
359
|
+
}
|
|
360
|
+
catch (err) {
|
|
361
|
+
logger.error('Failed to submit auth code', { sessionId, error: String(err) });
|
|
362
|
+
return {
|
|
363
|
+
success: false,
|
|
364
|
+
error: 'Failed to write to CLI process. The process may have exited. Please try again.',
|
|
365
|
+
needsRestart: true,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Poll for credentials file after auth code submission
|
|
371
|
+
* Some CLIs don't output success patterns, so we check the file directly
|
|
372
|
+
*/
|
|
373
|
+
async function pollForCredentials(session, config) {
|
|
374
|
+
const maxAttempts = 10;
|
|
375
|
+
const pollInterval = 1000; // 1 second
|
|
376
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
377
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
378
|
+
// Skip if session already has credentials or errored
|
|
379
|
+
if (session.token || session.status === 'error') {
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
try {
|
|
383
|
+
const creds = await extractCredentials(session.provider, config);
|
|
384
|
+
if (creds) {
|
|
385
|
+
session.token = creds.token;
|
|
386
|
+
session.refreshToken = creds.refreshToken;
|
|
387
|
+
session.tokenExpiresAt = creds.expiresAt;
|
|
388
|
+
session.status = 'success';
|
|
389
|
+
logger.info('Credentials found via polling', {
|
|
390
|
+
provider: session.provider,
|
|
391
|
+
attempt: i + 1,
|
|
392
|
+
hasRefreshToken: !!creds.refreshToken,
|
|
393
|
+
});
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
// File doesn't exist yet, continue polling
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
logger.warn('Credential polling completed without finding credentials', {
|
|
402
|
+
provider: session.provider,
|
|
403
|
+
sessionId: session.id,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Complete auth session by polling for credentials
|
|
408
|
+
* Called when user indicates they've completed auth in browser
|
|
409
|
+
*/
|
|
410
|
+
export async function completeAuthSession(sessionId) {
|
|
411
|
+
const session = sessions.get(sessionId);
|
|
412
|
+
if (!session) {
|
|
413
|
+
return { success: false, error: 'Session not found or expired' };
|
|
414
|
+
}
|
|
415
|
+
// Already have credentials
|
|
416
|
+
if (session.token) {
|
|
417
|
+
return { success: true, token: session.token };
|
|
418
|
+
}
|
|
419
|
+
const config = CLI_AUTH_CONFIG[session.provider];
|
|
420
|
+
if (!config) {
|
|
421
|
+
return { success: false, error: 'Unknown provider' };
|
|
422
|
+
}
|
|
423
|
+
// Poll for credentials (user just completed auth in browser)
|
|
424
|
+
const maxAttempts = 15;
|
|
425
|
+
const pollInterval = 1000;
|
|
426
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
427
|
+
try {
|
|
428
|
+
const creds = await extractCredentials(session.provider, config);
|
|
429
|
+
if (creds) {
|
|
430
|
+
session.token = creds.token;
|
|
431
|
+
session.refreshToken = creds.refreshToken;
|
|
432
|
+
session.tokenExpiresAt = creds.expiresAt;
|
|
433
|
+
session.status = 'success';
|
|
434
|
+
logger.info('Credentials found via complete polling', {
|
|
435
|
+
provider: session.provider,
|
|
436
|
+
attempt: i + 1,
|
|
437
|
+
});
|
|
438
|
+
return { success: true, token: creds.token };
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
// File doesn't exist yet
|
|
443
|
+
}
|
|
444
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
445
|
+
}
|
|
446
|
+
return {
|
|
447
|
+
success: false,
|
|
448
|
+
error: 'Credentials not found. Please ensure you completed authentication in the browser.',
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Cancel auth session
|
|
453
|
+
*/
|
|
454
|
+
export function cancelAuthSession(sessionId) {
|
|
455
|
+
const session = sessions.get(sessionId);
|
|
456
|
+
if (!session)
|
|
457
|
+
return false;
|
|
458
|
+
if (session.process) {
|
|
459
|
+
try {
|
|
460
|
+
session.process.kill();
|
|
461
|
+
}
|
|
462
|
+
catch {
|
|
463
|
+
// Already dead
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
sessions.delete(sessionId);
|
|
467
|
+
return true;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Extract credentials from CLI credential file
|
|
471
|
+
*/
|
|
472
|
+
async function extractCredentials(provider, config) {
|
|
473
|
+
if (!config.credentialPath)
|
|
474
|
+
return null;
|
|
475
|
+
try {
|
|
476
|
+
const credPath = config.credentialPath.replace('~', os.homedir());
|
|
477
|
+
const content = await fs.readFile(credPath, 'utf8');
|
|
478
|
+
const creds = JSON.parse(content);
|
|
479
|
+
// Extract token based on provider
|
|
480
|
+
if (provider === 'anthropic') {
|
|
481
|
+
// Claude stores OAuth in: { claudeAiOauth: { accessToken: "...", refreshToken: "...", expiresAt: ... } }
|
|
482
|
+
if (creds.claudeAiOauth?.accessToken) {
|
|
483
|
+
return {
|
|
484
|
+
token: creds.claudeAiOauth.accessToken,
|
|
485
|
+
refreshToken: creds.claudeAiOauth.refreshToken,
|
|
486
|
+
expiresAt: creds.claudeAiOauth.expiresAt ? new Date(creds.claudeAiOauth.expiresAt) : undefined,
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
// Fallback to legacy formats
|
|
490
|
+
const token = creds.oauth_token || creds.access_token || creds.api_key;
|
|
491
|
+
return token ? { token } : null;
|
|
492
|
+
}
|
|
493
|
+
else if (provider === 'openai') {
|
|
494
|
+
// Codex stores OAuth in: { tokens: { access_token: "...", refresh_token: "...", ... } }
|
|
495
|
+
if (creds.tokens?.access_token) {
|
|
496
|
+
return {
|
|
497
|
+
token: creds.tokens.access_token,
|
|
498
|
+
refreshToken: creds.tokens.refresh_token,
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
// Fallback: API key or legacy formats
|
|
502
|
+
const token = creds.OPENAI_API_KEY || creds.token || creds.access_token || creds.api_key;
|
|
503
|
+
return token ? { token } : null;
|
|
504
|
+
}
|
|
505
|
+
else if (provider === 'opencode') {
|
|
506
|
+
// OpenCode stores multiple providers: { opencode: {...}, anthropic: {...}, openai: {...}, google: {...} }
|
|
507
|
+
// Check for any valid credential - prefer OpenCode Zen, then Anthropic
|
|
508
|
+
if (creds.opencode?.key) {
|
|
509
|
+
return { token: creds.opencode.key };
|
|
510
|
+
}
|
|
511
|
+
if (creds.anthropic?.access) {
|
|
512
|
+
return {
|
|
513
|
+
token: creds.anthropic.access,
|
|
514
|
+
refreshToken: creds.anthropic.refresh,
|
|
515
|
+
expiresAt: creds.anthropic.expires ? new Date(creds.anthropic.expires) : undefined,
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
if (creds.openai?.access) {
|
|
519
|
+
return {
|
|
520
|
+
token: creds.openai.access,
|
|
521
|
+
refreshToken: creds.openai.refresh,
|
|
522
|
+
expiresAt: creds.openai.expires ? new Date(creds.openai.expires) : undefined,
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
if (creds.google?.key) {
|
|
526
|
+
return { token: creds.google.key };
|
|
527
|
+
}
|
|
528
|
+
return null;
|
|
529
|
+
}
|
|
530
|
+
const token = creds.token || creds.access_token || creds.api_key;
|
|
531
|
+
return token ? { token } : null;
|
|
532
|
+
}
|
|
533
|
+
catch {
|
|
534
|
+
return null;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=cli-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-auth.js","sourceRoot":"","sources":["../../src/daemon/cli-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-sync.d.ts","sourceRoot":"","sources":["../../src/daemon/cloud-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud-sync.d.ts","sourceRoot":"","sources":["../../src/daemon/cloud-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAStC,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAA4D;IAC/E,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAcjD;;OAEG;IACH,OAAO,CAAC,YAAY;IAwBpB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5B;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAYnE;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAIhC;;OAEG;IACG,uBAAuB,CAC3B,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;YACW,aAAa;IAmD3B;;OAEG;YACW,UAAU;IA+BxB;;OAEG;YACW,aAAa;IAkB3B;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QACrC,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IA2BH;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,oBAAoB,IAAI,MAAM;CAG/B;AAKD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,gBAAgB,CAKhF"}
|
|
@@ -12,6 +12,8 @@ import * as fs from 'fs';
|
|
|
12
12
|
import * as path from 'path';
|
|
13
13
|
import * as os from 'os';
|
|
14
14
|
import { randomBytes } from 'crypto';
|
|
15
|
+
import { createLogger } from '../utils/logger.js';
|
|
16
|
+
const log = createLogger('cloud-sync');
|
|
15
17
|
export class CloudSyncService extends EventEmitter {
|
|
16
18
|
config;
|
|
17
19
|
heartbeatTimer;
|
|
@@ -57,15 +59,15 @@ export class CloudSyncService extends EventEmitter {
|
|
|
57
59
|
*/
|
|
58
60
|
async start() {
|
|
59
61
|
if (!this.config.enabled || !this.config.apiKey) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
log.info('Disabled (no API key configured)');
|
|
63
|
+
log.info('Run `agent-relay cloud link` to connect to cloud');
|
|
62
64
|
return;
|
|
63
65
|
}
|
|
64
|
-
|
|
66
|
+
log.info('Starting cloud sync', { url: this.config.cloudUrl });
|
|
65
67
|
// Initial heartbeat
|
|
66
68
|
await this.sendHeartbeat();
|
|
67
69
|
// Start periodic heartbeat
|
|
68
|
-
this.heartbeatTimer = setInterval(() => this.sendHeartbeat().catch(
|
|
70
|
+
this.heartbeatTimer = setInterval(() => this.sendHeartbeat().catch((err) => log.error('Heartbeat failed', { error: String(err) })), this.config.heartbeatInterval);
|
|
69
71
|
this.connected = true;
|
|
70
72
|
this.emit('connected');
|
|
71
73
|
}
|
|
@@ -90,7 +92,7 @@ export class CloudSyncService extends EventEmitter {
|
|
|
90
92
|
}
|
|
91
93
|
// Trigger immediate sync if connected
|
|
92
94
|
if (this.connected) {
|
|
93
|
-
this.syncAgents().catch(
|
|
95
|
+
this.syncAgents().catch((err) => log.error('Agent sync failed', { error: String(err) }));
|
|
94
96
|
}
|
|
95
97
|
}
|
|
96
98
|
/**
|
|
@@ -152,7 +154,7 @@ export class CloudSyncService extends EventEmitter {
|
|
|
152
154
|
});
|
|
153
155
|
if (!response.ok) {
|
|
154
156
|
if (response.status === 401) {
|
|
155
|
-
|
|
157
|
+
log.error('Invalid API key. Run `agent-relay cloud link` to re-authenticate.');
|
|
156
158
|
this.stop();
|
|
157
159
|
return;
|
|
158
160
|
}
|
|
@@ -172,7 +174,7 @@ export class CloudSyncService extends EventEmitter {
|
|
|
172
174
|
]);
|
|
173
175
|
}
|
|
174
176
|
catch (error) {
|
|
175
|
-
|
|
177
|
+
log.error('Heartbeat error', { error: String(error) });
|
|
176
178
|
this.emit('error', error);
|
|
177
179
|
}
|
|
178
180
|
}
|