@vellumai/assistant 0.4.41 → 0.4.43
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/.env.example +1 -6
- package/.prettierignore +3 -0
- package/ARCHITECTURE.md +131 -393
- package/Dockerfile +0 -1
- package/README.md +73 -83
- package/bun.lock +8 -2
- package/docs/architecture/integrations.md +16 -21
- package/docs/architecture/memory.md +1 -1
- package/docs/architecture/scheduling.md +63 -63
- package/docs/architecture/security.md +3 -3
- package/docs/runbook-trusted-contacts.md +11 -12
- package/docs/trusted-contact-access.md +39 -39
- package/package.json +5 -8
- package/src/__tests__/access-request-decision.test.ts +4 -4
- package/src/__tests__/active-skill-tools.test.ts +49 -34
- package/src/__tests__/actor-token-service.test.ts +55 -85
- package/src/__tests__/amazon-cdp-integration.test.ts +14 -26
- package/src/__tests__/app-bundler.test.ts +14 -368
- package/src/__tests__/app-compiler.test.ts +0 -1
- package/src/__tests__/app-executors.test.ts +10 -1
- package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
- package/src/__tests__/approval-primitive.test.ts +2 -4
- package/src/__tests__/approval-routes-http.test.ts +1 -1
- package/src/__tests__/asset-materialize-tool.test.ts +1 -4
- package/src/__tests__/asset-search-tool.test.ts +1 -4
- package/src/__tests__/assistant-attachments.test.ts +23 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +4 -8
- package/src/__tests__/assistant-id-boundary-guard.test.ts +5 -5
- package/src/__tests__/attachments-store.test.ts +1 -4
- package/src/__tests__/avatar-e2e.test.ts +43 -23
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -9
- package/src/__tests__/call-controller.test.ts +4 -8
- package/src/__tests__/call-conversation-messages.test.ts +1 -1
- package/src/__tests__/call-domain.test.ts +250 -8
- package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
- package/src/__tests__/call-pointer-messages.test.ts +7 -11
- package/src/__tests__/call-recovery.test.ts +47 -0
- package/src/__tests__/call-routes-http.test.ts +13 -0
- package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
- package/src/__tests__/callback-handoff-copy.test.ts +5 -5
- package/src/__tests__/canonical-guardian-store.test.ts +3 -3
- package/src/__tests__/channel-approval-routes.test.ts +101 -134
- package/src/__tests__/channel-approval.test.ts +0 -201
- package/src/__tests__/channel-approvals.test.ts +2 -2
- package/src/__tests__/channel-delivery-store.test.ts +16 -24
- package/src/__tests__/channel-guardian.test.ts +641 -740
- package/src/__tests__/channel-invite-transport.test.ts +1 -2
- package/src/__tests__/channel-policy.test.ts +9 -12
- package/src/__tests__/channel-readiness-service.test.ts +156 -45
- package/src/__tests__/channel-reply-delivery.test.ts +3 -3
- package/src/__tests__/channel-retry-sweep.test.ts +7 -7
- package/src/__tests__/checker.test.ts +10 -7
- package/src/__tests__/chrome-cdp.test.ts +57 -17
- package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
- package/src/__tests__/compaction.benchmark.test.ts +25 -5
- package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
- package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
- package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
- package/src/__tests__/config-loader-backfill.test.ts +310 -0
- package/src/__tests__/config-watcher.test.ts +1 -5
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
- package/src/__tests__/connection-policy.test.ts +3 -62
- package/src/__tests__/contacts-tools.test.ts +0 -2
- package/src/__tests__/context-memory-e2e.test.ts +11 -7
- package/src/__tests__/context-overflow-policy.test.ts +2 -2
- package/src/__tests__/context-window-manager.test.ts +220 -61
- package/src/__tests__/conversation-attention-store.test.ts +178 -2
- package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
- package/src/__tests__/conversation-pairing.test.ts +14 -14
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +2 -2
- package/src/__tests__/conversation-unread-route.test.ts +155 -0
- package/src/__tests__/credential-metadata-store.test.ts +0 -2
- package/src/__tests__/credential-security-invariants.test.ts +9 -16
- package/src/__tests__/credentials-cli.test.ts +49 -5
- package/src/__tests__/daemon-assistant-events.test.ts +4 -22
- package/src/__tests__/db-migration-rollback.test.ts +2 -2
- package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
- package/src/__tests__/dictation-mode-detection.test.ts +1 -1
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
- package/src/__tests__/email-cli.test.ts +12 -12
- package/src/__tests__/email-service-config-fallback.test.ts +1 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
- package/src/__tests__/event-bus.test.ts +0 -1
- package/src/__tests__/followup-tools.test.ts +0 -2
- package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
- package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
- package/src/__tests__/gateway-only-guard.test.ts +5 -0
- package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
- package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
- package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
- package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
- package/src/__tests__/guardian-action-store.test.ts +2 -2
- package/src/__tests__/guardian-action-sweep.test.ts +5 -5
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
- package/src/__tests__/guardian-dispatch.test.ts +5 -46
- package/src/__tests__/guardian-grant-minting.test.ts +5 -44
- package/src/__tests__/guardian-outbound-http.test.ts +95 -114
- package/src/__tests__/guardian-question-mode.test.ts +1 -4
- package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
- package/src/__tests__/guardian-routing-state.test.ts +3 -3
- package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
- package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
- package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/headless-browser-navigate.test.ts +1 -1
- package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
- package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +1 -1
- package/src/__tests__/home-base-bootstrap.test.ts +0 -2
- package/src/__tests__/host-shell-tool.test.ts +3 -12
- package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
- package/src/__tests__/ingress-url-consistency.test.ts +0 -64
- package/src/__tests__/integration-status.test.ts +8 -8
- package/src/__tests__/intent-routing.test.ts +9 -13
- package/src/__tests__/invite-redemption-service.test.ts +4 -4
- package/src/__tests__/invite-routes-http.test.ts +10 -10
- package/src/__tests__/llm-usage-store.test.ts +45 -9
- package/src/__tests__/local-gateway-health.test.ts +209 -0
- package/src/__tests__/managed-avatar-client.test.ts +23 -12
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
- package/src/__tests__/managed-store.test.ts +29 -12
- package/src/__tests__/managed-twitter-guardrails.test.ts +353 -0
- package/src/__tests__/mcp-cli.test.ts +1 -1
- package/src/__tests__/mcp-health-check.test.ts +1 -1
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
- package/src/__tests__/memory-regressions.test.ts +1 -166
- package/src/__tests__/messaging-send-tool.test.ts +8 -4
- package/src/__tests__/migration-export-http.test.ts +2 -2
- package/src/__tests__/migration-transport.test.ts +44 -0
- package/src/__tests__/non-member-access-request.test.ts +49 -36
- package/src/__tests__/notification-broadcaster.test.ts +15 -15
- package/src/__tests__/notification-decision-fallback.test.ts +2 -2
- package/src/__tests__/notification-decision-strategy.test.ts +4 -4
- package/src/__tests__/notification-deep-link.test.ts +3 -3
- package/src/__tests__/notification-guardian-path.test.ts +6 -44
- package/src/__tests__/notification-routing-intent.test.ts +11 -7
- package/src/__tests__/oauth-cli.test.ts +1 -1
- package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
- package/src/__tests__/onboarding-template-contract.test.ts +2 -2
- package/src/__tests__/platform.test.ts +168 -5
- package/src/__tests__/playbook-execution.test.ts +0 -2
- package/src/__tests__/playbook-tools.test.ts +0 -2
- package/src/__tests__/pricing.test.ts +125 -0
- package/src/__tests__/provider-error-scenarios.test.ts +9 -3
- package/src/__tests__/recording-handler.test.ts +46 -80
- package/src/__tests__/recording-state-machine.test.ts +112 -183
- package/src/__tests__/registry.test.ts +1 -1
- package/src/__tests__/relay-server.test.ts +69 -71
- package/src/__tests__/reminder-store.test.ts +3 -3
- package/src/__tests__/request-file-tool.test.ts +2 -2
- package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
- package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
- package/src/__tests__/schedule-store.test.ts +13 -4
- package/src/__tests__/schedule-tools.test.ts +0 -2
- package/src/__tests__/scheduler-recurrence.test.ts +3 -4
- package/src/__tests__/scoped-approval-grants.test.ts +3 -5
- package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
- package/src/__tests__/secret-response-routing.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +1 -1
- package/src/__tests__/sequence-store.test.ts +0 -2
- package/src/__tests__/server-history-render.test.ts +2 -199
- package/src/__tests__/session-abort-tool-results.test.ts +9 -3
- package/src/__tests__/session-agent-loop.test.ts +107 -3
- package/src/__tests__/session-confirmation-signals.test.ts +10 -4
- package/src/__tests__/session-conflict-gate.test.ts +9 -3
- package/src/__tests__/session-init.benchmark.test.ts +22 -13
- package/src/__tests__/session-load-history-repair.test.ts +6 -3
- package/src/__tests__/session-pre-run-repair.test.ts +9 -3
- package/src/__tests__/session-profile-injection.test.ts +9 -3
- package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
- package/src/__tests__/session-queue.test.ts +10 -4
- package/src/__tests__/session-runtime-assembly.test.ts +28 -18
- package/src/__tests__/session-skill-tools.test.ts +2 -3
- package/src/__tests__/session-slash-known.test.ts +11 -4
- package/src/__tests__/session-slash-queue.test.ts +11 -4
- package/src/__tests__/session-slash-unknown.test.ts +12 -4
- package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
- package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
- package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
- package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
- package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
- package/src/__tests__/session-usage.test.ts +180 -0
- package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
- package/src/__tests__/session-workspace-injection.test.ts +8 -2
- package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
- package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
- package/src/__tests__/skill-feature-flags.test.ts +1 -0
- package/src/__tests__/skill-include-graph.test.ts +1 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
- package/src/__tests__/skill-load-tool.test.ts +90 -12
- package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
- package/src/__tests__/skills-uninstall.test.ts +131 -0
- package/src/__tests__/skills.test.ts +32 -16
- package/src/__tests__/slack-block-formatting.test.ts +1 -1
- package/src/__tests__/slack-channel-config.test.ts +71 -12
- package/src/__tests__/slack-inbound-verification.test.ts +7 -7
- package/src/__tests__/slack-share-routes.test.ts +1 -1
- package/src/__tests__/slack-skill.test.ts +2 -2
- package/src/__tests__/slash-commands-catalog.test.ts +1 -0
- package/src/__tests__/slash-commands-resolver.test.ts +1 -0
- package/src/__tests__/starter-task-flow.test.ts +1 -1
- package/src/__tests__/subagent-manager-notify.test.ts +1 -1
- package/src/__tests__/subagent-tools.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +4 -8
- package/src/__tests__/task-compiler.test.ts +0 -2
- package/src/__tests__/task-management-tools.test.ts +0 -2
- package/src/__tests__/task-runner.test.ts +0 -2
- package/src/__tests__/task-scheduler.test.ts +2 -2
- package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
- package/src/__tests__/terminal-tools.test.ts +1 -11
- package/src/__tests__/thread-seed-composer.test.ts +3 -1
- package/src/__tests__/tool-approval-handler.test.ts +5 -7
- package/src/__tests__/tool-executor.test.ts +2 -2
- package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
- package/src/__tests__/tool-notification-listener.test.ts +1 -1
- package/src/__tests__/tool-profiling-listener.test.ts +1 -1
- package/src/__tests__/tool-trace-listener.test.ts +1 -2
- package/src/__tests__/trace-emitter.test.ts +1 -1
- package/src/__tests__/trust-context-guards.test.ts +1 -1
- package/src/__tests__/trust-store.test.ts +44 -395
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
- package/src/__tests__/trusted-contact-verification.test.ts +12 -12
- package/src/__tests__/twilio-config.test.ts +11 -2
- package/src/__tests__/twilio-provider.test.ts +6 -4
- package/src/__tests__/twilio-routes.test.ts +408 -86
- package/src/__tests__/twitter-platform-proxy-client.test.ts +450 -0
- package/src/__tests__/update-bulletin-format.test.ts +1 -1
- package/src/__tests__/update-bulletin-state.test.ts +1 -1
- package/src/__tests__/update-bulletin.test.ts +4 -8
- package/src/__tests__/update-template-contract.test.ts +1 -1
- package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
- package/src/__tests__/usage-routes.test.ts +23 -5
- package/src/__tests__/user-reference.test.ts +1 -1
- package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
- package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
- package/src/__tests__/view-image-tool.test.ts +0 -2
- package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
- package/src/__tests__/voice-invite-redemption.test.ts +18 -18
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
- package/src/__tests__/voice-session-bridge.test.ts +14 -16
- package/src/__tests__/workspace-policy.test.ts +1 -1
- package/src/approvals/AGENTS.md +4 -4
- package/src/approvals/approval-primitive.ts +2 -2
- package/src/approvals/guardian-decision-primitive.ts +1 -1
- package/src/approvals/guardian-request-resolvers.ts +3 -4
- package/src/bundler/app-bundler.ts +29 -217
- package/src/bundler/app-compiler.ts +131 -103
- package/src/bundler/compiler-tools.ts +248 -0
- package/src/calls/active-call-lease.ts +207 -0
- package/src/calls/call-constants.ts +0 -7
- package/src/calls/call-controller.ts +1 -1
- package/src/calls/call-conversation-messages.ts +6 -6
- package/src/calls/call-domain.ts +73 -38
- package/src/calls/call-pointer-message-composer.ts +6 -6
- package/src/calls/call-pointer-messages.ts +14 -13
- package/src/calls/call-recovery.ts +2 -0
- package/src/calls/call-store.ts +21 -28
- package/src/calls/guardian-action-sweep.ts +6 -8
- package/src/calls/guardian-dispatch.ts +2 -6
- package/src/calls/relay-access-wait.ts +4 -4
- package/src/calls/relay-server.ts +69 -80
- package/src/calls/relay-setup-router.ts +16 -21
- package/src/calls/relay-verification.ts +27 -28
- package/src/calls/twilio-config.ts +28 -3
- package/src/calls/twilio-provider.ts +5 -5
- package/src/calls/twilio-rest.ts +26 -27
- package/src/calls/twilio-routes.ts +67 -54
- package/src/calls/types.ts +8 -8
- package/src/calls/voice-ingress-preflight.ts +110 -0
- package/src/calls/voice-session-bridge.ts +7 -7
- package/src/channels/config.ts +1 -10
- package/src/{config/channel-permission-profiles.ts → channels/permission-profiles.ts} +1 -1
- package/src/channels/types.ts +2 -13
- package/src/cli/__tests__/notifications.test.ts +1 -1
- package/src/{amazon → cli/commands/amazon}/client.ts +99 -42
- package/src/cli/{amazon.ts → commands/amazon/index.ts} +12 -17
- package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
- package/src/cli/commands/amazon/session.ts +116 -0
- package/src/cli/{audit.ts → commands/audit.ts} +2 -4
- package/src/cli/{autonomy.ts → commands/autonomy.ts} +1 -3
- package/src/cli/commands/browser-relay.ts +520 -0
- package/src/cli/commands/channel-verification-sessions.ts +442 -0
- package/src/cli/{completions.ts → commands/completions.ts} +1 -3
- package/src/cli/{config.ts → commands/config.ts} +3 -5
- package/src/cli/{contacts.ts → commands/contacts.ts} +263 -16
- package/src/cli/{credentials.ts → commands/credentials.ts} +9 -10
- package/src/cli/{default-action.ts → commands/default-action.ts} +3 -3
- package/src/cli/{dev.ts → commands/dev.ts} +4 -6
- package/src/cli/{doctor.ts → commands/doctor.ts} +36 -60
- package/src/cli/{email.ts → commands/email.ts} +2 -2
- package/src/cli/{keys.ts → commands/keys.ts} +6 -6
- package/src/cli/{map.ts → commands/map.ts} +85 -93
- package/src/cli/{mcp.ts → commands/mcp.ts} +5 -7
- package/src/cli/{memory.ts → commands/memory.ts} +6 -7
- package/src/cli/{notifications.ts → commands/notifications.ts} +8 -10
- package/src/cli/{oauth.ts → commands/oauth.ts} +2 -2
- package/src/cli/commands/platform.ts +176 -0
- package/src/cli/{sequence.ts → commands/sequence.ts} +3 -3
- package/src/cli/{sessions.ts → commands/sessions.ts} +32 -52
- package/src/cli/commands/skills.ts +498 -0
- package/src/cli/{trust.ts → commands/trust.ts} +2 -4
- package/src/{__tests__/twitter-cli-error-shaping.test.ts → cli/commands/twitter/__tests__/cli-error-shaping.test.ts} +43 -2
- package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +483 -0
- package/src/{__tests__/twitter-cli-routing.test.ts → cli/commands/twitter/__tests__/cli-routing.test.ts} +130 -4
- package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -2
- package/src/{twitter → cli/commands/twitter}/client.ts +17 -7
- package/src/cli/{twitter.ts → commands/twitter/index.ts} +322 -273
- package/src/cli/commands/twitter/router.ts +396 -0
- package/src/cli/commands/twitter/session.ts +121 -0
- package/src/cli/db.ts +1 -0
- package/src/cli/http-client.ts +87 -0
- package/src/cli/logger.ts +6 -0
- package/src/cli/main-screen.tsx +4 -3
- package/src/cli/output.ts +19 -0
- package/src/cli/program.ts +29 -27
- package/src/cli/reference.ts +27 -37
- package/src/cli.ts +452 -240
- package/src/config/assistant-feature-flags.ts +3 -15
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
- package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
- package/src/config/bundled-skills/amazon/SKILL.md +15 -5
- package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +21 -6
- package/src/config/bundled-skills/browser/SKILL.md +4 -5
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +4 -4
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
- package/src/config/bundled-skills/claude-code/SKILL.md +4 -4
- package/src/config/bundled-skills/cli-discover/SKILL.md +4 -4
- package/src/config/bundled-skills/computer-use/SKILL.md +4 -4
- package/src/config/bundled-skills/contacts/SKILL.md +87 -229
- package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +4 -4
- package/src/config/bundled-skills/document/SKILL.md +4 -3
- package/src/config/bundled-skills/document-writer/SKILL.md +4 -4
- package/src/config/bundled-skills/doordash/SKILL.md +4 -11
- package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +8 -16
- package/src/config/bundled-skills/doordash/doordash-cli.ts +120 -86
- package/src/config/bundled-skills/doordash/lib/session.ts +1 -2
- package/src/config/bundled-skills/doordash/lib/shared/platform.ts +26 -9
- package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +140 -0
- package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
- package/src/config/bundled-skills/followups/SKILL.md +4 -3
- package/src/config/bundled-skills/frontend-design/SKILL.md +2 -0
- package/src/config/bundled-skills/google-calendar/SKILL.md +4 -4
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +4 -6
- package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +26 -41
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -5
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -1
- package/src/config/bundled-skills/influencer/SKILL.md +19 -19
- package/src/{influencer → config/bundled-skills/influencer/scripts}/client.ts +73 -56
- package/src/config/bundled-skills/influencer/scripts/influencer.ts +267 -0
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -2
- package/src/config/bundled-skills/macos-automation/SKILL.md +4 -5
- package/src/config/bundled-skills/mcp-setup/SKILL.md +4 -4
- package/src/config/bundled-skills/media-processing/SKILL.md +3 -2
- package/src/config/bundled-skills/messaging/SKILL.md +6 -33
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -5
- package/src/config/bundled-skills/notifications/SKILL.md +4 -4
- package/src/config/bundled-skills/notion/SKILL.md +4 -4
- package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +4 -5
- package/src/config/bundled-skills/oauth-setup/SKILL.md +4 -5
- package/src/config/bundled-skills/phone-calls/SKILL.md +24 -458
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +83 -0
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +57 -0
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +67 -0
- package/src/config/bundled-skills/playbooks/SKILL.md +4 -3
- package/src/config/bundled-skills/public-ingress/SKILL.md +65 -14
- package/src/config/bundled-skills/reminder/SKILL.md +4 -3
- package/src/config/bundled-skills/restaurant-reservation/SKILL.md +4 -6
- package/src/config/bundled-skills/schedule/SKILL.md +4 -3
- package/src/config/bundled-skills/screen-recording/SKILL.md +4 -3
- package/src/config/bundled-skills/self-upgrade/SKILL.md +4 -4
- package/src/config/bundled-skills/skills-catalog/SKILL.md +4 -4
- package/src/config/bundled-skills/slack/SKILL.md +4 -8
- package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +1 -1
- package/src/config/bundled-skills/slack-app-setup/SKILL.md +66 -88
- package/src/config/bundled-skills/slack-digest-setup/SKILL.md +4 -5
- package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +4 -5
- package/src/config/bundled-skills/start-the-day/SKILL.md +4 -4
- package/src/config/bundled-skills/subagent/SKILL.md +4 -3
- package/src/config/bundled-skills/tasks/SKILL.md +4 -3
- package/src/config/bundled-skills/telegram-setup/SKILL.md +63 -112
- package/src/config/bundled-skills/time-based-actions/SKILL.md +4 -3
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -3
- package/src/config/bundled-skills/twilio-setup/SKILL.md +23 -50
- package/src/config/bundled-skills/twitter/SKILL.md +56 -14
- package/src/config/bundled-skills/typescript-eval/SKILL.md +4 -4
- package/src/config/bundled-skills/vercel-token-setup/SKILL.md +4 -5
- package/src/config/bundled-skills/voice-setup/SKILL.md +19 -45
- package/src/config/bundled-skills/watcher/SKILL.md +4 -3
- package/src/config/env-registry.ts +1 -10
- package/src/config/feature-flag-registry.json +0 -16
- package/src/config/loader.ts +78 -38
- package/src/config/schema.ts +143 -106
- package/src/config/schemas/channels.ts +80 -0
- package/src/config/schemas/heartbeat.ts +51 -0
- package/src/config/schemas/inference.ts +136 -0
- package/src/config/schemas/ingress.ts +81 -0
- package/src/config/schemas/logging.ts +21 -0
- package/src/config/schemas/memory-lifecycle.ts +67 -0
- package/src/config/schemas/memory-processing.ts +215 -0
- package/src/config/schemas/memory-retrieval.ts +222 -0
- package/src/config/schemas/memory-storage.ts +83 -0
- package/src/config/schemas/memory.ts +58 -0
- package/src/config/schemas/platform.ts +64 -0
- package/src/config/schemas/security.ts +54 -0
- package/src/config/schemas/swarm.ts +50 -0
- package/src/config/schemas/timeouts.ts +47 -0
- package/src/config/{agent-schema.ts → schemas/workspace-git.ts} +0 -97
- package/src/config/skill-state.ts +3 -13
- package/src/config/skills.ts +233 -75
- package/src/config/types.ts +1 -20
- package/src/contacts/contact-store.ts +12 -49
- package/src/contacts/contacts-write.ts +1 -5
- package/src/contacts/index.ts +0 -2
- package/src/contacts/types.ts +0 -8
- package/src/context/window-manager.ts +73 -14
- package/src/daemon/assistant-attachments.ts +9 -0
- package/src/daemon/computer-use-session.ts +3 -3
- package/src/daemon/connection-policy.ts +6 -21
- package/src/daemon/context-overflow-policy.ts +1 -1
- package/src/daemon/daemon-control.ts +46 -54
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/handlers/config-channels.ts +407 -71
- package/src/daemon/handlers/config-ingress.ts +17 -85
- package/src/daemon/handlers/config-model.ts +145 -123
- package/src/daemon/handlers/config-slack-channel.ts +43 -29
- package/src/daemon/handlers/config-telegram.ts +32 -27
- package/src/daemon/handlers/config-voice.ts +1 -4
- package/src/daemon/handlers/dictation.ts +11 -16
- package/src/daemon/handlers/identity.ts +5 -6
- package/src/daemon/handlers/pairing.ts +5 -13
- package/src/daemon/handlers/recording.ts +97 -199
- package/src/daemon/handlers/session-history.ts +110 -96
- package/src/daemon/handlers/session-user-message.ts +29 -57
- package/src/daemon/handlers/sessions.ts +240 -137
- package/src/daemon/handlers/shared.ts +62 -95
- package/src/daemon/handlers/skills.ts +492 -543
- package/src/daemon/lifecycle.ts +168 -55
- package/src/daemon/main.ts +1 -0
- package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
- package/src/daemon/{ipc-contract → message-types}/computer-use.ts +0 -3
- package/src/daemon/{ipc-contract → message-types}/diagnostics.ts +0 -16
- package/src/daemon/{ipc-contract → message-types}/integrations.ts +29 -13
- package/src/daemon/{ipc-contract → message-types}/memory.ts +8 -0
- package/src/daemon/{ipc-contract → message-types}/notifications.ts +15 -1
- package/src/daemon/{ipc-contract → message-types}/sessions.ts +1 -0
- package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
- package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
- package/src/daemon/providers-setup.ts +0 -5
- package/src/daemon/recording-executor.ts +0 -7
- package/src/daemon/ride-shotgun-handler.ts +9 -13
- package/src/daemon/server.ts +136 -510
- package/src/daemon/session-agent-loop-handlers.ts +22 -7
- package/src/daemon/session-agent-loop.ts +86 -24
- package/src/daemon/session-attachments.ts +1 -1
- package/src/daemon/session-error.ts +1 -1
- package/src/daemon/session-history.ts +20 -15
- package/src/daemon/session-lifecycle.ts +9 -7
- package/src/daemon/session-memory.ts +15 -1
- package/src/daemon/session-messaging.ts +10 -6
- package/src/daemon/session-notifiers.ts +10 -8
- package/src/daemon/session-process.ts +34 -25
- package/src/daemon/session-queue-manager.ts +1 -1
- package/src/daemon/session-runtime-assembly.ts +6 -25
- package/src/daemon/session-surfaces.ts +2 -2
- package/src/daemon/session-tool-setup.ts +1 -1
- package/src/daemon/session-usage.ts +119 -18
- package/src/daemon/session.ts +13 -9
- package/src/daemon/tool-side-effects.ts +6 -5
- package/src/daemon/trace-emitter.ts +1 -1
- package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
- package/src/daemon/watch-handler.ts +2 -5
- package/src/email/service.ts +8 -8
- package/src/events/domain-events.ts +0 -1
- package/src/events/tool-notification-listener.ts +1 -1
- package/src/followups/followup-store.ts +1 -2
- package/src/followups/types.ts +0 -6
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/inbound/platform-callback-registration.ts +1 -1
- package/src/inbound/public-ingress-urls.ts +0 -8
- package/src/index.ts +12 -0
- package/src/mcp/client.ts +1 -1
- package/src/mcp/manager.ts +1 -1
- package/src/memory/app-store.ts +1 -42
- package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
- package/src/memory/conversation-attention-store.ts +154 -0
- package/src/memory/conversation-bootstrap.ts +1 -1
- package/src/memory/conversation-crud.ts +53 -1
- package/src/memory/conversation-display-order-migration.ts +2 -3
- package/src/memory/conversation-queries.ts +1 -29
- package/src/memory/conversation-title-service.ts +26 -21
- package/src/memory/db-connection.ts +1 -8
- package/src/memory/db-init.ts +20 -0
- package/src/memory/delivery-crud.ts +4 -34
- package/src/memory/external-conversation-store.ts +1 -1
- package/src/memory/format-recall.ts +47 -0
- package/src/memory/guardian-action-store.ts +4 -5
- package/src/memory/guardian-rate-limits.ts +0 -3
- package/src/memory/invite-store.ts +1 -1
- package/src/memory/job-handlers/backfill.ts +9 -2
- package/src/memory/job-handlers/extraction.ts +2 -7
- package/src/memory/job-handlers/summarization.ts +1 -1
- package/src/memory/llm-usage-store.ts +11 -0
- package/src/memory/migrations/114-notifications.ts +12 -40
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
- package/src/memory/migrations/141-rename-verification-table.ts +55 -0
- package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
- package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
- package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
- package/src/memory/migrations/index.ts +5 -0
- package/src/memory/migrations/registry.ts +30 -0
- package/src/memory/qdrant-circuit-breaker.ts +5 -0
- package/src/memory/retriever.test.ts +707 -0
- package/src/memory/retriever.ts +120 -116
- package/src/memory/schema/calls.ts +3 -7
- package/src/memory/schema/guardian.ts +2 -2
- package/src/memory/search/lexical.ts +4 -1
- package/src/memory/search/query-expansion.test.ts +70 -0
- package/src/memory/search/query-expansion.ts +118 -0
- package/src/memory/search/types.ts +18 -17
- package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
- package/src/messaging/providers/whatsapp/adapter.ts +1 -4
- package/src/messaging/registry.ts +0 -1
- package/src/notifications/README.md +13 -22
- package/src/notifications/adapters/macos.ts +1 -1
- package/src/notifications/conversation-pairing.ts +2 -2
- package/src/notifications/copy-composer.ts +2 -2
- package/src/notifications/decision-engine.ts +1 -10
- package/src/notifications/destination-resolver.ts +2 -3
- package/src/notifications/emit-signal.ts +2 -8
- package/src/notifications/guardian-question-mode.ts +5 -8
- package/src/notifications/signal.ts +1 -2
- package/src/notifications/types.ts +1 -1
- package/src/oauth/token-persistence.ts +25 -1
- package/src/permissions/checker.ts +4 -29
- package/src/permissions/defaults.ts +6 -6
- package/src/permissions/prompter.ts +1 -1
- package/src/permissions/secret-prompter.ts +1 -1
- package/src/permissions/shell-identity.ts +1 -1
- package/src/permissions/trust-store.ts +13 -76
- package/src/permissions/workspace-policy.ts +1 -1
- package/src/{config → prompts}/computer-use-prompt.ts +1 -1
- package/src/{config → prompts}/system-prompt.ts +40 -21
- package/src/runtime/AGENTS.md +6 -8
- package/src/runtime/access-request-helper.ts +36 -55
- package/src/runtime/actor-trust-resolver.ts +1 -24
- package/src/runtime/approval-message-composer.ts +6 -2
- package/src/runtime/assistant-event.ts +1 -1
- package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
- package/src/runtime/auth/__tests__/subject.test.ts +32 -0
- package/src/runtime/auth/route-policy.ts +140 -24
- package/src/runtime/auth/subject.ts +9 -0
- package/src/runtime/auth/token-service.ts +11 -0
- package/src/runtime/auth/types.ts +1 -1
- package/src/runtime/channel-approval-types.ts +1 -1
- package/src/runtime/channel-approvals.ts +1 -1
- package/src/runtime/channel-invite-transport.ts +0 -2
- package/src/runtime/channel-invite-transports/slack.ts +5 -19
- package/src/runtime/channel-invite-transports/telegram.ts +17 -34
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-readiness-service.ts +24 -159
- package/src/runtime/channel-readiness-types.ts +5 -1
- package/src/runtime/channel-reply-delivery.ts +43 -3
- package/src/runtime/channel-retry-sweep.ts +14 -22
- package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
- package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
- package/src/runtime/gateway-client.ts +12 -15
- package/src/runtime/guardian-action-followup-executor.ts +8 -73
- package/src/runtime/guardian-action-grant-minter.ts +45 -61
- package/src/runtime/guardian-action-message-composer.ts +4 -4
- package/src/runtime/guardian-reply-router.ts +3 -3
- package/src/runtime/http-server.ts +133 -24
- package/src/runtime/http-types.ts +34 -1
- package/src/runtime/invite-instruction-generator.ts +1 -3
- package/src/runtime/invite-redemption-service.ts +5 -5
- package/src/runtime/invite-service.ts +7 -7
- package/src/runtime/local-actor-identity.ts +28 -2
- package/src/runtime/local-gateway-health.ts +275 -0
- package/src/runtime/middleware/twilio-validation.ts +3 -3
- package/src/runtime/migrations/migration-transport.ts +18 -3
- package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
- package/src/runtime/nl-approval-parser.ts +2 -3
- package/src/runtime/routes/access-request-decision.ts +2 -2
- package/src/runtime/routes/app-management-routes.ts +921 -0
- package/src/runtime/routes/approval-routes.ts +76 -7
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
- package/src/runtime/routes/channel-delivery-routes.ts +5 -4
- package/src/runtime/routes/channel-route-shared.ts +1 -3
- package/src/runtime/routes/channel-routes.ts +1 -4
- package/src/runtime/routes/channel-verification-routes.ts +257 -0
- package/src/runtime/routes/computer-use-routes.ts +595 -0
- package/src/runtime/routes/contact-routes.ts +1 -317
- package/src/runtime/routes/conversation-attention-routes.ts +6 -5
- package/src/runtime/routes/conversation-routes.ts +11 -18
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +813 -0
- package/src/runtime/routes/documents-routes.ts +227 -0
- package/src/runtime/routes/guardian-approval-interception.ts +25 -48
- package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
- package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
- package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
- package/src/runtime/routes/inbound-conversation.ts +3 -10
- package/src/runtime/routes/inbound-message-handler.ts +7 -6
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
- package/src/runtime/routes/integrations/slack/channel.ts +72 -0
- package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
- package/src/runtime/routes/integrations/telegram.ts +111 -0
- package/src/runtime/routes/integrations/twilio.ts +451 -0
- package/src/runtime/routes/invite-routes.ts +2 -2
- package/src/runtime/routes/pairing-routes.ts +1 -1
- package/src/runtime/routes/recording-routes.ts +332 -0
- package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
- package/src/runtime/routes/session-management-routes.ts +167 -0
- package/src/runtime/routes/session-query-routes.ts +204 -0
- package/src/runtime/routes/settings-routes.ts +977 -0
- package/src/runtime/routes/skills-routes.ts +266 -0
- package/src/runtime/routes/subagents-routes.ts +246 -0
- package/src/runtime/routes/surface-action-routes.ts +100 -10
- package/src/runtime/routes/surface-content-routes.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +809 -0
- package/src/runtime/routes/workspace-routes.test.ts +778 -0
- package/src/runtime/routes/workspace-routes.ts +410 -0
- package/src/runtime/routes/workspace-utils.ts +88 -0
- package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
- package/src/runtime/telegram-streaming-delivery.ts +380 -0
- package/src/runtime/tool-grant-request-helper.ts +1 -2
- package/src/runtime/trust-context-resolver.ts +0 -1
- package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
- package/src/runtime/verification-rate-limiter.ts +2 -2
- package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
- package/src/schedule/integration-status.ts +2 -2
- package/src/schedule/schedule-store.ts +7 -9
- package/src/sequence/engine.ts +1 -1
- package/src/skills/active-skill-tools.ts +0 -8
- package/src/skills/clawhub.ts +1 -10
- package/src/skills/managed-store.ts +14 -4
- package/src/skills/slash-commands.ts +1 -1
- package/src/subagent/manager.ts +1 -1
- package/src/subagent/types.ts +1 -1
- package/src/tasks/SPEC.md +10 -10
- package/src/tasks/task-scheduler.ts +1 -1
- package/src/telegram/bot-username.ts +13 -0
- package/src/tools/assets/materialize.ts +1 -1
- package/src/tools/assets/search.ts +1 -1
- package/src/tools/browser/browser-execution.ts +2 -2
- package/src/tools/browser/browser-manager.ts +88 -11
- package/src/tools/browser/browser-screencast.ts +1 -1
- package/src/tools/browser/headless-browser.ts +0 -17
- package/src/tools/browser/jit-auth.ts +1 -1
- package/src/tools/browser/recording-store.ts +19 -1
- package/src/tools/browser/runtime-check.ts +4 -2
- package/src/tools/calls/call-start.ts +3 -3
- package/src/tools/credentials/metadata-store.ts +0 -13
- package/src/tools/credentials/vault.ts +7 -31
- package/src/tools/followups/followup_create.ts +0 -8
- package/src/tools/mcp/mcp-tool-factory.ts +1 -1
- package/src/tools/memory/definitions.ts +32 -10
- package/src/tools/memory/handlers.test.ts +573 -0
- package/src/tools/memory/handlers.ts +222 -65
- package/src/tools/memory/register.ts +53 -24
- package/src/tools/network/script-proxy/session-manager.ts +1 -12
- package/src/tools/schedule/update.ts +0 -8
- package/src/tools/skills/load.ts +3 -3
- package/src/tools/subagent/read.ts +1 -1
- package/src/tools/system/voice-config.ts +2 -14
- package/src/tools/terminal/safe-env.ts +5 -18
- package/src/tools/tool-approval-handler.ts +4 -4
- package/src/tools/tool-manifest.ts +4 -2
- package/src/tools/types.ts +1 -1
- package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
- package/src/twitter/platform-proxy-client.ts +405 -0
- package/src/usage/types.ts +21 -0
- package/src/util/canonicalize-identity.ts +2 -6
- package/src/util/cookie-session.ts +35 -51
- package/src/util/platform.ts +93 -86
- package/src/util/pricing.ts +180 -43
- package/src/work-items/work-item-runner.ts +1 -1
- package/scripts/ipc/check-contract-inventory.ts +0 -107
- package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
- package/scripts/ipc/generate-swift.ts +0 -528
- package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
- package/src/__tests__/app-migration.test.ts +0 -148
- package/src/__tests__/config-loader-migration.test.ts +0 -85
- package/src/__tests__/daemon-lifecycle.test.ts +0 -715
- package/src/__tests__/daemon-server-session-init.test.ts +0 -864
- package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
- package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
- package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
- package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
- package/src/__tests__/handlers-slack-config.test.ts +0 -140
- package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
- package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
- package/src/__tests__/ingress-reconcile.test.ts +0 -606
- package/src/__tests__/integrations-cli.test.ts +0 -232
- package/src/__tests__/ipc-blob-store.test.ts +0 -329
- package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
- package/src/__tests__/ipc-contract.test.ts +0 -76
- package/src/__tests__/ipc-protocol.test.ts +0 -120
- package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
- package/src/__tests__/ipc-snapshot.test.ts +0 -2197
- package/src/__tests__/ipc-validate.test.ts +0 -471
- package/src/__tests__/migration-cli-flows.test.ts +0 -186
- package/src/__tests__/migration-ordering.test.ts +0 -267
- package/src/__tests__/oauth-connect-handler.test.ts +0 -361
- package/src/__tests__/platform-move-helper.test.ts +0 -108
- package/src/__tests__/platform-socket-path.test.ts +0 -52
- package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
- package/src/__tests__/recording-intent-handler.test.ts +0 -1155
- package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
- package/src/__tests__/sms-messaging-provider.test.ts +0 -156
- package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
- package/src/__tests__/twitter-auth-handler.test.ts +0 -561
- package/src/__tests__/work-item-output.test.ts +0 -150
- package/src/amazon/session.ts +0 -58
- package/src/cli/channels.ts +0 -51
- package/src/cli/influencer.ts +0 -319
- package/src/cli/integrations.ts +0 -372
- package/src/cli/ipc-client.ts +0 -88
- package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
- package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
- package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
- package/src/config/core-schema.ts +0 -434
- package/src/config/memory-schema.ts +0 -617
- package/src/daemon/auth-manager.ts +0 -106
- package/src/daemon/handlers/apps.ts +0 -758
- package/src/daemon/handlers/avatar.ts +0 -73
- package/src/daemon/handlers/browser.ts +0 -3
- package/src/daemon/handlers/computer-use.ts +0 -231
- package/src/daemon/handlers/config-dispatch.ts +0 -29
- package/src/daemon/handlers/config-heartbeat.ts +0 -299
- package/src/daemon/handlers/config-inbox.ts +0 -457
- package/src/daemon/handlers/config-integrations.ts +0 -409
- package/src/daemon/handlers/config-platform.ts +0 -77
- package/src/daemon/handlers/config-slack.ts +0 -41
- package/src/daemon/handlers/config-tools.ts +0 -226
- package/src/daemon/handlers/config-trust.ts +0 -135
- package/src/daemon/handlers/config.ts +0 -64
- package/src/daemon/handlers/contacts.ts +0 -193
- package/src/daemon/handlers/diagnostics.ts +0 -382
- package/src/daemon/handlers/documents.ts +0 -188
- package/src/daemon/handlers/guardian-actions.ts +0 -82
- package/src/daemon/handlers/home-base.ts +0 -82
- package/src/daemon/handlers/index.ts +0 -222
- package/src/daemon/handlers/misc.ts +0 -1139
- package/src/daemon/handlers/navigate-settings.ts +0 -29
- package/src/daemon/handlers/oauth-connect.ts +0 -202
- package/src/daemon/handlers/open-bundle-handler.ts +0 -88
- package/src/daemon/handlers/publish.ts +0 -176
- package/src/daemon/handlers/signing.ts +0 -56
- package/src/daemon/handlers/subagents.ts +0 -286
- package/src/daemon/handlers/twitter-auth.ts +0 -220
- package/src/daemon/handlers/work-items.ts +0 -796
- package/src/daemon/handlers/workspace-files.ts +0 -84
- package/src/daemon/handlers.ts +0 -16
- package/src/daemon/ipc-blob-store.ts +0 -246
- package/src/daemon/ipc-contract-inventory.json +0 -348
- package/src/daemon/ipc-contract-inventory.ts +0 -202
- package/src/daemon/ipc-handler.ts +0 -120
- package/src/daemon/ipc-protocol.ts +0 -85
- package/src/daemon/ipc-validate.ts +0 -254
- package/src/memory/app-migration.ts +0 -114
- package/src/memory/channel-delivery-store.ts +0 -40
- package/src/memory/channel-guardian-store.ts +0 -83
- package/src/memory/conversation-store.ts +0 -102
- package/src/memory/schema-migration.ts +0 -38
- package/src/messaging/providers/sms/adapter.ts +0 -232
- package/src/messaging/providers/sms/client.ts +0 -93
- package/src/messaging/providers/sms/types.ts +0 -7
- package/src/migrations/config-merge.ts +0 -62
- package/src/migrations/data-layout.ts +0 -89
- package/src/migrations/data-merge.ts +0 -44
- package/src/migrations/hooks-merge.ts +0 -118
- package/src/migrations/index.ts +0 -6
- package/src/migrations/log.ts +0 -28
- package/src/migrations/skills-merge.ts +0 -44
- package/src/migrations/workspace-layout.ts +0 -94
- package/src/notifications/adapters/sms.ts +0 -94
- package/src/runtime/channel-approval-parser.ts +0 -123
- package/src/runtime/channel-invite-transports/sms.ts +0 -53
- package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
- package/src/runtime/routes/integration-routes.ts +0 -381
- package/src/runtime/routes/twilio-routes.ts +0 -1251
- package/src/twitter/router.ts +0 -131
- package/src/twitter/session.ts +0 -54
- package/src/watcher/providers/slack.ts +0 -282
- /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
- /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
- /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
- /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
- /package/src/{twitter → cli/commands/twitter}/oauth-client.ts +0 -0
- /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
- /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
- /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
- /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
- /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
- /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
- /package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/surfaces.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
- /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
- /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
- /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
- /package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -0
- /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
- /package/src/{config → prompts}/templates/SOUL.md +0 -0
- /package/src/{config → prompts}/templates/UPDATES.md +0 -0
- /package/src/{config → prompts}/templates/USER.md +0 -0
- /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
- /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
- /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
- /package/src/{config → prompts}/update-bulletin.ts +0 -0
- /package/src/{config → prompts}/user-reference.ts +0 -0
|
@@ -5,11 +5,14 @@
|
|
|
5
5
|
* All commands output JSON to stdout. Use --json for machine-readable output.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import
|
|
8
|
+
import { execFile } from "node:child_process";
|
|
9
|
+
import { promisify } from "node:util";
|
|
9
10
|
|
|
10
11
|
import { Command } from "commander";
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
const execFileAsync = promisify(execFile);
|
|
14
|
+
|
|
15
|
+
import { httpSend } from "../../http-client.js";
|
|
13
16
|
import {
|
|
14
17
|
getBookmarks,
|
|
15
18
|
getFollowers,
|
|
@@ -17,21 +20,19 @@ import {
|
|
|
17
20
|
getHomeTimeline,
|
|
18
21
|
getLikes,
|
|
19
22
|
getNotifications,
|
|
20
|
-
getTweetDetail,
|
|
21
23
|
getUserByScreenName,
|
|
22
24
|
getUserMedia,
|
|
23
|
-
getUserTweets,
|
|
24
|
-
searchTweets,
|
|
25
25
|
SessionExpiredError,
|
|
26
|
-
} from "
|
|
27
|
-
import type { TwitterStrategy } from "
|
|
28
|
-
import { routedPostTweet } from "../twitter/router.js";
|
|
26
|
+
} from "./client.js";
|
|
27
|
+
import type { TwitterStrategy } from "./router.js";
|
|
29
28
|
import {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
routedGetTweetDetail,
|
|
30
|
+
routedGetUserByScreenName,
|
|
31
|
+
routedGetUserTweets,
|
|
32
|
+
routedPostTweet,
|
|
33
|
+
routedSearchTweets,
|
|
34
|
+
} from "./router.js";
|
|
35
|
+
import { clearSession, importFromRecording, loadSession } from "./session.js";
|
|
35
36
|
|
|
36
37
|
// ---------------------------------------------------------------------------
|
|
37
38
|
// Helpers
|
|
@@ -88,7 +89,8 @@ async function run(cmd: Command, fn: () => Promise<unknown>): Promise<void> {
|
|
|
88
89
|
err instanceof Error &&
|
|
89
90
|
(meta.pathUsed !== undefined ||
|
|
90
91
|
meta.suggestAlternative !== undefined ||
|
|
91
|
-
meta.oauthError !== undefined
|
|
92
|
+
meta.oauthError !== undefined ||
|
|
93
|
+
meta.proxyErrorCode !== undefined)
|
|
92
94
|
) {
|
|
93
95
|
const payload: Record<string, unknown> = {
|
|
94
96
|
ok: false,
|
|
@@ -98,6 +100,9 @@ async function run(cmd: Command, fn: () => Promise<unknown>): Promise<void> {
|
|
|
98
100
|
if (meta.suggestAlternative !== undefined)
|
|
99
101
|
payload.suggestAlternative = meta.suggestAlternative;
|
|
100
102
|
if (meta.oauthError !== undefined) payload.oauthError = meta.oauthError;
|
|
103
|
+
if (meta.proxyErrorCode !== undefined)
|
|
104
|
+
payload.proxyErrorCode = meta.proxyErrorCode;
|
|
105
|
+
if (meta.retryable !== undefined) payload.retryable = meta.retryable;
|
|
101
106
|
output(payload, getJson(cmd));
|
|
102
107
|
process.exitCode = 1;
|
|
103
108
|
return;
|
|
@@ -115,22 +120,25 @@ export function registerTwitterCommand(program: Command): void {
|
|
|
115
120
|
.command("x")
|
|
116
121
|
.alias("twitter")
|
|
117
122
|
.description(
|
|
118
|
-
"Post on X and manage connections. Supports OAuth (official API) and browser session paths.",
|
|
123
|
+
"Post on X and manage connections. Supports managed (platform proxy), OAuth (official API), and browser session paths.",
|
|
119
124
|
)
|
|
120
125
|
.option("--json", "Machine-readable JSON output");
|
|
121
126
|
|
|
122
127
|
tw.addHelpText(
|
|
123
128
|
"after",
|
|
124
129
|
`
|
|
125
|
-
Twitter (X)
|
|
130
|
+
Twitter (X) supports multiple paths for interacting with the platform:
|
|
126
131
|
|
|
127
|
-
1.
|
|
132
|
+
1. Managed (platform proxy) — routes Twitter API calls through the platform,
|
|
133
|
+
which holds the OAuth credentials. Used when integrationMode is "managed".
|
|
134
|
+
2. OAuth (official API) — uses an authenticated Twitter OAuth application for
|
|
128
135
|
posting and replying. Requires a connected OAuth credential.
|
|
129
|
-
|
|
136
|
+
3. Browser session (Ride Shotgun) — uses cookies captured from a real Chrome
|
|
130
137
|
session to call Twitter's internal GraphQL API. Supports all read operations
|
|
131
138
|
and posting as a fallback.
|
|
132
139
|
|
|
133
|
-
The strategy system controls which path is used for operations that support
|
|
140
|
+
The strategy system controls which path is used for operations that support multiple:
|
|
141
|
+
managed — route through the platform proxy (platform holds credentials)
|
|
134
142
|
oauth — always use the OAuth API; fail if unavailable
|
|
135
143
|
browser — always use the browser session; fail if unavailable
|
|
136
144
|
auto — try OAuth first, fall back to browser session (default)
|
|
@@ -144,7 +152,8 @@ Session management:
|
|
|
144
152
|
|
|
145
153
|
Examples:
|
|
146
154
|
$ assistant x status
|
|
147
|
-
$ assistant x post "Hello world"
|
|
155
|
+
$ assistant x post "Hello world" --strategy managed
|
|
156
|
+
$ assistant x post "Hello world" --strategy auto
|
|
148
157
|
$ assistant x timeline elonmusk --count 10
|
|
149
158
|
$ assistant x search "from:vaborsh AI agents" --product Latest
|
|
150
159
|
$ assistant x strategy set oauth`,
|
|
@@ -172,11 +181,10 @@ Examples:
|
|
|
172
181
|
)
|
|
173
182
|
.action(async (opts: { recording: string }, cmd: Command) => {
|
|
174
183
|
await run(cmd, async () => {
|
|
175
|
-
const session = importFromRecording(opts.recording);
|
|
184
|
+
const session = await importFromRecording(opts.recording);
|
|
176
185
|
return {
|
|
177
186
|
message: "Session imported successfully",
|
|
178
187
|
cookieCount: session.cookies.length,
|
|
179
|
-
recordingId: session.recordingId,
|
|
180
188
|
};
|
|
181
189
|
});
|
|
182
190
|
});
|
|
@@ -196,8 +204,8 @@ OAuth credentials are not affected.
|
|
|
196
204
|
Examples:
|
|
197
205
|
$ assistant x logout`,
|
|
198
206
|
)
|
|
199
|
-
.action((_opts: unknown, cmd: Command) => {
|
|
200
|
-
clearSession();
|
|
207
|
+
.action(async (_opts: unknown, cmd: Command) => {
|
|
208
|
+
await clearSession();
|
|
201
209
|
output({ ok: true, message: "Session cleared" }, getJson(cmd));
|
|
202
210
|
});
|
|
203
211
|
|
|
@@ -236,11 +244,11 @@ Examples:
|
|
|
236
244
|
try {
|
|
237
245
|
const result = await startLearnSession(duration);
|
|
238
246
|
if (result.recordingPath) {
|
|
239
|
-
const session = importFromRecording(result.recordingPath);
|
|
247
|
+
const session = await importFromRecording(result.recordingPath);
|
|
240
248
|
|
|
241
249
|
// Hide Chrome after capturing session
|
|
242
250
|
try {
|
|
243
|
-
await
|
|
251
|
+
await minimizeChrome();
|
|
244
252
|
} catch {
|
|
245
253
|
/* best-effort */
|
|
246
254
|
}
|
|
@@ -250,7 +258,6 @@ Examples:
|
|
|
250
258
|
ok: true,
|
|
251
259
|
message: "Session refreshed successfully",
|
|
252
260
|
cookieCount: session.cookies.length,
|
|
253
|
-
recordingId: result.recordingId,
|
|
254
261
|
},
|
|
255
262
|
json,
|
|
256
263
|
);
|
|
@@ -259,7 +266,6 @@ Examples:
|
|
|
259
266
|
{
|
|
260
267
|
ok: false,
|
|
261
268
|
error: "Recording completed but no recording path returned",
|
|
262
|
-
recordingId: result.recordingId,
|
|
263
269
|
},
|
|
264
270
|
json,
|
|
265
271
|
);
|
|
@@ -280,8 +286,7 @@ Examples:
|
|
|
280
286
|
`
|
|
281
287
|
Shows the current state of both authentication paths:
|
|
282
288
|
|
|
283
|
-
Browser session — whether cookies are loaded
|
|
284
|
-
and the recording ID they came from.
|
|
289
|
+
Browser session — whether cookies are loaded and the cookie count.
|
|
285
290
|
OAuth — whether an OAuth credential is connected, the linked account, the
|
|
286
291
|
current strategy setting, and whether a strategy has been explicitly configured.
|
|
287
292
|
|
|
@@ -292,27 +297,18 @@ Examples:
|
|
|
292
297
|
$ assistant x status --json`,
|
|
293
298
|
)
|
|
294
299
|
.action(async (_opts: unknown, cmd: Command) => {
|
|
295
|
-
const session = loadSession();
|
|
300
|
+
const session = await loadSession();
|
|
296
301
|
const browserInfo: Record<string, unknown> = session
|
|
297
302
|
? {
|
|
298
303
|
browserSessionActive: true,
|
|
299
304
|
cookieCount: session.cookies.length,
|
|
300
|
-
importedAt: session.importedAt,
|
|
301
|
-
recordingId: session.recordingId,
|
|
302
305
|
}
|
|
303
306
|
: { browserSessionActive: false };
|
|
304
307
|
|
|
305
308
|
// Query daemon for OAuth / strategy config
|
|
306
309
|
let oauthInfo: Record<string, unknown> = {};
|
|
307
310
|
try {
|
|
308
|
-
const
|
|
309
|
-
{
|
|
310
|
-
type: "twitter_integration_config",
|
|
311
|
-
action: "get",
|
|
312
|
-
} as import("../daemon/ipc-protocol.js").ClientMessage,
|
|
313
|
-
"twitter_integration_config_response",
|
|
314
|
-
);
|
|
315
|
-
const r = daemonResponse as Record<string, unknown>;
|
|
311
|
+
const r = await sendTwitterConfigRequest("get");
|
|
316
312
|
oauthInfo = {
|
|
317
313
|
oauthConnected: r.connected ?? false,
|
|
318
314
|
oauthAccount: r.accountInfo ?? undefined,
|
|
@@ -346,7 +342,7 @@ Examples:
|
|
|
346
342
|
const strategyCli = tw
|
|
347
343
|
.command("strategy")
|
|
348
344
|
.description(
|
|
349
|
-
"Get or set the Twitter operation strategy (oauth, browser, auto)",
|
|
345
|
+
"Get or set the Twitter operation strategy (managed, oauth, browser, auto)",
|
|
350
346
|
)
|
|
351
347
|
.addHelpText(
|
|
352
348
|
"after",
|
|
@@ -354,6 +350,7 @@ Examples:
|
|
|
354
350
|
The strategy controls which authentication path is used for operations that
|
|
355
351
|
support both OAuth and browser session:
|
|
356
352
|
|
|
353
|
+
managed — route through the platform proxy (platform holds OAuth credentials).
|
|
357
354
|
oauth — always use the official Twitter OAuth API. Fails if no OAuth
|
|
358
355
|
credential is connected. Best for reliable posting.
|
|
359
356
|
browser — always use the browser session (captured cookies). Fails if no
|
|
@@ -371,14 +368,7 @@ Examples:
|
|
|
371
368
|
.action(async (_opts: unknown, cmd: Command) => {
|
|
372
369
|
const json = getJson(cmd);
|
|
373
370
|
try {
|
|
374
|
-
const
|
|
375
|
-
{
|
|
376
|
-
type: "twitter_integration_config",
|
|
377
|
-
action: "get_strategy",
|
|
378
|
-
} as import("../daemon/ipc-protocol.js").ClientMessage,
|
|
379
|
-
"twitter_integration_config_response",
|
|
380
|
-
);
|
|
381
|
-
const r = daemonResponse as Record<string, unknown>;
|
|
371
|
+
const r = await sendTwitterConfigRequest("get_strategy");
|
|
382
372
|
output({ ok: true, strategy: r.strategy ?? "auto" }, json);
|
|
383
373
|
} catch (err) {
|
|
384
374
|
outputError(err instanceof Error ? err.message : String(err));
|
|
@@ -397,7 +387,8 @@ Arguments:
|
|
|
397
387
|
|
|
398
388
|
Sets the preferred strategy for Twitter operations that support dual-path
|
|
399
389
|
routing. The setting is persisted by the assistant and applies to all subsequent
|
|
400
|
-
operations until changed.
|
|
390
|
+
operations until changed. Note: "managed" is determined by integration mode
|
|
391
|
+
and cannot be set manually.
|
|
401
392
|
|
|
402
393
|
Examples:
|
|
403
394
|
$ assistant x strategy set oauth
|
|
@@ -407,15 +398,9 @@ Examples:
|
|
|
407
398
|
.action(async (value: string, _opts: unknown, cmd: Command) => {
|
|
408
399
|
const json = getJson(cmd);
|
|
409
400
|
try {
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
action: "set_strategy",
|
|
414
|
-
strategy: value,
|
|
415
|
-
} as import("../daemon/ipc-protocol.js").ClientMessage,
|
|
416
|
-
"twitter_integration_config_response",
|
|
417
|
-
);
|
|
418
|
-
const r = daemonResponse as Record<string, unknown>;
|
|
401
|
+
const r = await sendTwitterConfigRequest("set_strategy", {
|
|
402
|
+
strategy: value,
|
|
403
|
+
});
|
|
419
404
|
if (r.success) {
|
|
420
405
|
output({ ok: true, strategy: r.strategy }, json);
|
|
421
406
|
} else {
|
|
@@ -438,7 +423,7 @@ Examples:
|
|
|
438
423
|
.argument("<text>", "Tweet text")
|
|
439
424
|
.requiredOption(
|
|
440
425
|
"--strategy <strategy>",
|
|
441
|
-
"Operation strategy: oauth, browser, or
|
|
426
|
+
"Operation strategy: oauth, browser, auto, or managed",
|
|
442
427
|
)
|
|
443
428
|
.option(
|
|
444
429
|
"--oauth-token <token>",
|
|
@@ -450,14 +435,20 @@ Examples:
|
|
|
450
435
|
Arguments:
|
|
451
436
|
text The tweet text to post (max 280 characters)
|
|
452
437
|
|
|
453
|
-
Posts a new tweet using the routed
|
|
454
|
-
|
|
455
|
-
|
|
438
|
+
Posts a new tweet using the routed system. The --strategy flag controls which
|
|
439
|
+
path is used. The response includes the tweet ID, URL, and which path was used.
|
|
440
|
+
|
|
441
|
+
Strategies:
|
|
442
|
+
oauth — use the local OAuth token directly
|
|
443
|
+
browser — use the browser session (CDP)
|
|
444
|
+
auto — try OAuth first, fall back to browser
|
|
445
|
+
managed — route through the platform proxy (platform holds OAuth credentials)
|
|
456
446
|
|
|
457
447
|
Examples:
|
|
458
448
|
$ assistant x post "Hello world" --strategy browser
|
|
459
449
|
$ assistant x post "Hello world" --strategy oauth --oauth-token "$TOKEN"
|
|
460
|
-
$ assistant x post "Hello world" --strategy auto --oauth-token "$TOKEN"
|
|
450
|
+
$ assistant x post "Hello world" --strategy auto --oauth-token "$TOKEN"
|
|
451
|
+
$ assistant x post "Hello world" --strategy managed`,
|
|
461
452
|
)
|
|
462
453
|
.action(
|
|
463
454
|
async (
|
|
@@ -470,10 +461,11 @@ Examples:
|
|
|
470
461
|
if (
|
|
471
462
|
strategy !== "oauth" &&
|
|
472
463
|
strategy !== "browser" &&
|
|
473
|
-
strategy !== "auto"
|
|
464
|
+
strategy !== "auto" &&
|
|
465
|
+
strategy !== "managed"
|
|
474
466
|
) {
|
|
475
467
|
throw new Error(
|
|
476
|
-
`Invalid strategy "${opts.strategy}". Must be oauth, browser, or
|
|
468
|
+
`Invalid strategy "${opts.strategy}". Must be oauth, browser, auto, or managed.`,
|
|
477
469
|
);
|
|
478
470
|
}
|
|
479
471
|
const { result, pathUsed } = await routedPostTweet(text, {
|
|
@@ -499,7 +491,7 @@ Examples:
|
|
|
499
491
|
.argument("<text>", "Reply text")
|
|
500
492
|
.requiredOption(
|
|
501
493
|
"--strategy <strategy>",
|
|
502
|
-
"Operation strategy: oauth, browser, or
|
|
494
|
+
"Operation strategy: oauth, browser, auto, or managed",
|
|
503
495
|
)
|
|
504
496
|
.option(
|
|
505
497
|
"--oauth-token <token>",
|
|
@@ -518,7 +510,8 @@ URL. The --strategy flag controls which path is used.
|
|
|
518
510
|
|
|
519
511
|
Examples:
|
|
520
512
|
$ assistant x reply https://x.com/elonmusk/status/1234567890 "Great point!" --strategy browser
|
|
521
|
-
$ assistant x reply 1234567890 "Interesting thread" --strategy oauth --oauth-token "$TOKEN"
|
|
513
|
+
$ assistant x reply 1234567890 "Interesting thread" --strategy oauth --oauth-token "$TOKEN"
|
|
514
|
+
$ assistant x reply 1234567890 "Nice!" --strategy managed`,
|
|
522
515
|
)
|
|
523
516
|
.action(
|
|
524
517
|
async (
|
|
@@ -532,10 +525,11 @@ Examples:
|
|
|
532
525
|
if (
|
|
533
526
|
strategy !== "oauth" &&
|
|
534
527
|
strategy !== "browser" &&
|
|
535
|
-
strategy !== "auto"
|
|
528
|
+
strategy !== "auto" &&
|
|
529
|
+
strategy !== "managed"
|
|
536
530
|
) {
|
|
537
531
|
throw new Error(
|
|
538
|
-
`Invalid strategy "${opts.strategy}". Must be oauth, browser, or
|
|
532
|
+
`Invalid strategy "${opts.strategy}". Must be oauth, browser, auto, or managed.`,
|
|
539
533
|
);
|
|
540
534
|
}
|
|
541
535
|
// Extract tweet ID: either a bare numeric ID or the last numeric segment of a URL
|
|
@@ -566,30 +560,54 @@ Examples:
|
|
|
566
560
|
.description("Fetch a user's recent tweets")
|
|
567
561
|
.argument("<screenName>", "Twitter screen name (without @)")
|
|
568
562
|
.option("--count <n>", "Number of tweets to fetch", "20")
|
|
563
|
+
.option(
|
|
564
|
+
"--strategy <strategy>",
|
|
565
|
+
"Operation strategy: managed or browser (default: browser)",
|
|
566
|
+
)
|
|
569
567
|
.addHelpText(
|
|
570
568
|
"after",
|
|
571
569
|
`
|
|
572
570
|
Arguments:
|
|
573
571
|
screenName Twitter screen name without the @ prefix (e.g. "elonmusk", not "@elonmusk")
|
|
574
572
|
|
|
575
|
-
Fetches a user's recent tweets
|
|
576
|
-
|
|
577
|
-
|
|
573
|
+
Fetches a user's recent tweets. Resolves the screen name to a user ID first,
|
|
574
|
+
then retrieves their tweet timeline. The --count flag controls how many tweets
|
|
575
|
+
to return (default: 20). Use --strategy managed to route through the platform proxy.
|
|
578
576
|
|
|
579
577
|
Examples:
|
|
580
578
|
$ assistant x timeline elonmusk
|
|
581
579
|
$ assistant x timeline vaborsh --count 50
|
|
582
|
-
$ assistant x timeline openai --count 10 --json
|
|
580
|
+
$ assistant x timeline openai --count 10 --json
|
|
581
|
+
$ assistant x timeline elonmusk --strategy managed`,
|
|
583
582
|
)
|
|
584
583
|
.action(
|
|
585
|
-
async (
|
|
584
|
+
async (
|
|
585
|
+
screenName: string,
|
|
586
|
+
opts: { count: string; strategy?: string },
|
|
587
|
+
cmd: Command,
|
|
588
|
+
) => {
|
|
586
589
|
await run(cmd, async () => {
|
|
587
|
-
const
|
|
588
|
-
|
|
590
|
+
const strategy = (opts.strategy ?? "browser") as TwitterStrategy;
|
|
591
|
+
if (
|
|
592
|
+
strategy !== "oauth" &&
|
|
593
|
+
strategy !== "browser" &&
|
|
594
|
+
strategy !== "auto" &&
|
|
595
|
+
strategy !== "managed"
|
|
596
|
+
) {
|
|
597
|
+
throw new Error(
|
|
598
|
+
`Invalid strategy "${opts.strategy}". Must be oauth, browser, auto, or managed.`,
|
|
599
|
+
);
|
|
600
|
+
}
|
|
601
|
+
const { result: user, pathUsed } = await routedGetUserByScreenName(
|
|
602
|
+
screenName.replace(/^@/, ""),
|
|
603
|
+
{ strategy },
|
|
604
|
+
);
|
|
605
|
+
const { result: tweets } = await routedGetUserTweets(
|
|
589
606
|
user.userId,
|
|
590
607
|
parseInt(opts.count, 10),
|
|
608
|
+
{ strategy },
|
|
591
609
|
);
|
|
592
|
-
return { user, tweets };
|
|
610
|
+
return { user, tweets, pathUsed };
|
|
593
611
|
});
|
|
594
612
|
},
|
|
595
613
|
);
|
|
@@ -600,6 +618,10 @@ Examples:
|
|
|
600
618
|
tw.command("tweet")
|
|
601
619
|
.description("Fetch a tweet and its reply thread")
|
|
602
620
|
.argument("<tweetIdOrUrl>", "Tweet ID or URL")
|
|
621
|
+
.option(
|
|
622
|
+
"--strategy <strategy>",
|
|
623
|
+
"Operation strategy: managed or browser (default: browser)",
|
|
624
|
+
)
|
|
603
625
|
.addHelpText(
|
|
604
626
|
"after",
|
|
605
627
|
`
|
|
@@ -607,24 +629,45 @@ Arguments:
|
|
|
607
629
|
tweetIdOrUrl A bare tweet ID (e.g. 1234567890) or a full tweet URL
|
|
608
630
|
(e.g. https://x.com/user/status/1234567890)
|
|
609
631
|
|
|
610
|
-
Fetches a single tweet and its reply thread
|
|
611
|
-
|
|
612
|
-
|
|
632
|
+
Fetches a single tweet and its reply thread. The tweet ID is extracted from the
|
|
633
|
+
last numeric segment of the input. Returns an array of tweets representing the
|
|
634
|
+
conversation thread. Use --strategy managed to route through the platform proxy.
|
|
613
635
|
|
|
614
636
|
Examples:
|
|
615
637
|
$ assistant x tweet 1234567890
|
|
616
638
|
$ assistant x tweet https://x.com/elonmusk/status/1234567890
|
|
617
|
-
$ assistant x tweet https://x.com/openai/status/9876543210 --json
|
|
639
|
+
$ assistant x tweet https://x.com/openai/status/9876543210 --json
|
|
640
|
+
$ assistant x tweet 1234567890 --strategy managed`,
|
|
618
641
|
)
|
|
619
|
-
.action(
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
642
|
+
.action(
|
|
643
|
+
async (
|
|
644
|
+
tweetIdOrUrl: string,
|
|
645
|
+
opts: { strategy?: string },
|
|
646
|
+
cmd: Command,
|
|
647
|
+
) => {
|
|
648
|
+
await run(cmd, async () => {
|
|
649
|
+
const idMatch = tweetIdOrUrl.match(/(\d+)\s*$/);
|
|
650
|
+
if (!idMatch)
|
|
651
|
+
throw new Error(`Could not extract tweet ID from: ${tweetIdOrUrl}`);
|
|
652
|
+
const strategy = (opts.strategy ?? "browser") as TwitterStrategy;
|
|
653
|
+
if (
|
|
654
|
+
strategy !== "oauth" &&
|
|
655
|
+
strategy !== "browser" &&
|
|
656
|
+
strategy !== "auto" &&
|
|
657
|
+
strategy !== "managed"
|
|
658
|
+
) {
|
|
659
|
+
throw new Error(
|
|
660
|
+
`Invalid strategy "${opts.strategy}". Must be oauth, browser, auto, or managed.`,
|
|
661
|
+
);
|
|
662
|
+
}
|
|
663
|
+
const { result: tweets, pathUsed } = await routedGetTweetDetail(
|
|
664
|
+
idMatch[1],
|
|
665
|
+
{ strategy },
|
|
666
|
+
);
|
|
667
|
+
return { tweets, pathUsed };
|
|
668
|
+
});
|
|
669
|
+
},
|
|
670
|
+
);
|
|
628
671
|
|
|
629
672
|
// =========================================================================
|
|
630
673
|
// search — search tweets
|
|
@@ -633,6 +676,10 @@ Examples:
|
|
|
633
676
|
.description("Search tweets")
|
|
634
677
|
.argument("<query>", "Search query")
|
|
635
678
|
.option("--product <type>", "Top, Latest, People, or Media", "Top")
|
|
679
|
+
.option(
|
|
680
|
+
"--strategy <strategy>",
|
|
681
|
+
"Operation strategy: managed or browser (default: browser)",
|
|
682
|
+
)
|
|
636
683
|
.addHelpText(
|
|
637
684
|
"after",
|
|
638
685
|
`
|
|
@@ -646,22 +693,43 @@ The --product flag selects the search result type:
|
|
|
646
693
|
People — user accounts matching the query
|
|
647
694
|
Media — tweets containing images or video
|
|
648
695
|
|
|
649
|
-
|
|
696
|
+
Use --strategy managed to route through the platform proxy (uses Twitter's
|
|
697
|
+
recent search API).
|
|
650
698
|
|
|
651
699
|
Examples:
|
|
652
700
|
$ assistant x search "AI agents"
|
|
653
701
|
$ assistant x search "from:elonmusk SpaceX" --product Latest
|
|
654
|
-
$ assistant x search "machine learning" --product Media --json
|
|
702
|
+
$ assistant x search "machine learning" --product Media --json
|
|
703
|
+
$ assistant x search "AI agents" --strategy managed`,
|
|
655
704
|
)
|
|
656
|
-
.action(
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
705
|
+
.action(
|
|
706
|
+
async (
|
|
707
|
+
query: string,
|
|
708
|
+
opts: { product: string; strategy?: string },
|
|
709
|
+
cmd: Command,
|
|
710
|
+
) => {
|
|
711
|
+
await run(cmd, async () => {
|
|
712
|
+
const strategy = (opts.strategy ?? "browser") as TwitterStrategy;
|
|
713
|
+
if (
|
|
714
|
+
strategy !== "oauth" &&
|
|
715
|
+
strategy !== "browser" &&
|
|
716
|
+
strategy !== "auto" &&
|
|
717
|
+
strategy !== "managed"
|
|
718
|
+
) {
|
|
719
|
+
throw new Error(
|
|
720
|
+
`Invalid strategy "${opts.strategy}". Must be oauth, browser, auto, or managed.`,
|
|
721
|
+
);
|
|
722
|
+
}
|
|
723
|
+
const product = opts.product as "Top" | "Latest" | "People" | "Media";
|
|
724
|
+
const { result: tweets, pathUsed } = await routedSearchTweets(
|
|
725
|
+
query,
|
|
726
|
+
product,
|
|
727
|
+
{ strategy },
|
|
728
|
+
);
|
|
729
|
+
return { query, tweets, pathUsed };
|
|
730
|
+
});
|
|
731
|
+
},
|
|
732
|
+
);
|
|
665
733
|
|
|
666
734
|
// =========================================================================
|
|
667
735
|
// bookmarks — fetch bookmarks
|
|
@@ -875,108 +943,94 @@ Examples:
|
|
|
875
943
|
}
|
|
876
944
|
|
|
877
945
|
// ---------------------------------------------------------------------------
|
|
878
|
-
// Daemon
|
|
946
|
+
// Daemon HTTP helper — send requests to the daemon's HTTP API
|
|
879
947
|
// ---------------------------------------------------------------------------
|
|
880
948
|
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
949
|
+
/**
|
|
950
|
+
* Send a Twitter integration config request to the daemon via HTTP.
|
|
951
|
+
*
|
|
952
|
+
* Maps the old IPC `twitter_integration_config` message actions to HTTP
|
|
953
|
+
* endpoints on the settings routes:
|
|
954
|
+
* - "get" / "get_strategy" → GET /v1/integrations/twitter/auth/status
|
|
955
|
+
* - "set_strategy" → PUT /v1/settings/client (key=twitter.strategy)
|
|
956
|
+
*/
|
|
957
|
+
async function sendTwitterConfigRequest(
|
|
958
|
+
action: string,
|
|
959
|
+
extra?: Record<string, unknown>,
|
|
884
960
|
): Promise<Record<string, unknown>> {
|
|
885
|
-
|
|
886
|
-
const
|
|
887
|
-
|
|
888
|
-
const socket = net.createConnection(socketPath);
|
|
889
|
-
const parser = createMessageParser();
|
|
890
|
-
|
|
891
|
-
const timeoutHandle = setTimeout(() => {
|
|
892
|
-
socket.destroy();
|
|
893
|
-
reject(new Error("Request timed out after 10s"));
|
|
894
|
-
}, 10_000);
|
|
895
|
-
timeoutHandle.unref();
|
|
896
|
-
|
|
897
|
-
let authenticated = !sessionToken;
|
|
898
|
-
let messageSent = false;
|
|
899
|
-
|
|
900
|
-
const sendPayload = () => {
|
|
901
|
-
if (messageSent) return;
|
|
902
|
-
messageSent = true;
|
|
903
|
-
socket.write(serialize(message));
|
|
904
|
-
};
|
|
905
|
-
|
|
906
|
-
socket.on("error", (err) => {
|
|
907
|
-
clearTimeout(timeoutHandle);
|
|
908
|
-
reject(
|
|
909
|
-
new Error(
|
|
910
|
-
`Cannot connect to assistant: ${err.message}. Is the assistant running?`,
|
|
911
|
-
),
|
|
912
|
-
);
|
|
961
|
+
if (action === "get" || action === "get_strategy") {
|
|
962
|
+
const response = await httpSend("/v1/integrations/twitter/auth/status", {
|
|
963
|
+
method: "GET",
|
|
913
964
|
});
|
|
965
|
+
if (!response.ok) {
|
|
966
|
+
const text = await response.text();
|
|
967
|
+
throw new Error(`Assistant returned an error: ${text}`);
|
|
968
|
+
}
|
|
969
|
+
const data = (await response.json()) as Record<string, unknown>;
|
|
970
|
+
// Map the HTTP response shape to the old IPC response shape
|
|
971
|
+
return {
|
|
972
|
+
type: "twitter_integration_config_response",
|
|
973
|
+
success: true,
|
|
974
|
+
connected: data.connected ?? false,
|
|
975
|
+
accountInfo: data.accountInfo,
|
|
976
|
+
strategy: data.strategy ?? "auto",
|
|
977
|
+
strategyConfigured: data.strategyConfigured ?? false,
|
|
978
|
+
mode: data.mode,
|
|
979
|
+
managedAvailable: data.managedAvailable ?? false,
|
|
980
|
+
managedPrerequisites: data.managedPrerequisites,
|
|
981
|
+
localClientConfigured: data.localClientConfigured ?? false,
|
|
982
|
+
};
|
|
983
|
+
}
|
|
914
984
|
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
if ((m as { success: boolean }).success) {
|
|
922
|
-
authenticated = true;
|
|
923
|
-
sendPayload();
|
|
924
|
-
} else {
|
|
925
|
-
clearTimeout(timeoutHandle);
|
|
926
|
-
socket.destroy();
|
|
927
|
-
reject(new Error("Authentication failed"));
|
|
928
|
-
}
|
|
929
|
-
continue;
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
// Reject immediately on daemon error frames so the CLI surfaces the
|
|
933
|
-
// real failure reason instead of hanging until the timeout fires.
|
|
934
|
-
if (m.type === "error") {
|
|
935
|
-
clearTimeout(timeoutHandle);
|
|
936
|
-
socket.destroy();
|
|
937
|
-
reject(
|
|
938
|
-
new Error(
|
|
939
|
-
(m as { message?: string }).message ??
|
|
940
|
-
"Assistant returned an error",
|
|
941
|
-
),
|
|
942
|
-
);
|
|
943
|
-
return;
|
|
944
|
-
}
|
|
945
|
-
|
|
946
|
-
// Only resolve on the expected response type; skip everything else
|
|
947
|
-
if (m.type === expectedResponseType) {
|
|
948
|
-
clearTimeout(timeoutHandle);
|
|
949
|
-
socket.destroy();
|
|
950
|
-
resolve(m);
|
|
951
|
-
return;
|
|
952
|
-
}
|
|
953
|
-
// Skip all other message types (auth_result, daemon_status, pong, session_info, tasks_changed, etc.)
|
|
954
|
-
}
|
|
985
|
+
if (action === "set_strategy") {
|
|
986
|
+
const strategy = extra?.strategy as string | undefined;
|
|
987
|
+
if (!strategy) throw new Error("strategy is required for set_strategy");
|
|
988
|
+
const response = await httpSend("/v1/settings/client", {
|
|
989
|
+
method: "PUT",
|
|
990
|
+
body: JSON.stringify({ key: "twitter.strategy", value: strategy }),
|
|
955
991
|
});
|
|
992
|
+
if (!response.ok) {
|
|
993
|
+
const text = await response.text();
|
|
994
|
+
throw new Error(`Assistant returned an error: ${text}`);
|
|
995
|
+
}
|
|
996
|
+
return {
|
|
997
|
+
type: "twitter_integration_config_response",
|
|
998
|
+
success: true,
|
|
999
|
+
strategy,
|
|
1000
|
+
};
|
|
1001
|
+
}
|
|
956
1002
|
|
|
957
|
-
|
|
958
|
-
if (sessionToken) {
|
|
959
|
-
socket.write(
|
|
960
|
-
serialize({
|
|
961
|
-
type: "auth",
|
|
962
|
-
token: sessionToken,
|
|
963
|
-
} as unknown as import("../daemon/ipc-protocol.js").ClientMessage),
|
|
964
|
-
);
|
|
965
|
-
} else {
|
|
966
|
-
sendPayload();
|
|
967
|
-
}
|
|
968
|
-
});
|
|
969
|
-
});
|
|
1003
|
+
throw new Error(`Unsupported twitter_integration_config action: ${action}`);
|
|
970
1004
|
}
|
|
971
1005
|
|
|
972
1006
|
// ---------------------------------------------------------------------------
|
|
973
|
-
// Chrome CDP helpers (
|
|
1007
|
+
// Chrome CDP helpers (via `assistant browser chrome` CLI)
|
|
974
1008
|
// ---------------------------------------------------------------------------
|
|
975
1009
|
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
1010
|
+
async function launchChromeCdp(
|
|
1011
|
+
startUrl?: string,
|
|
1012
|
+
): Promise<{ baseUrl: string }> {
|
|
1013
|
+
const args = ["browser", "chrome", "launch"];
|
|
1014
|
+
if (startUrl) args.push("--start-url", startUrl);
|
|
1015
|
+
const { stdout } = await execFileAsync("assistant", args);
|
|
1016
|
+
const result = JSON.parse(stdout) as {
|
|
1017
|
+
ok: boolean;
|
|
1018
|
+
baseUrl?: string;
|
|
1019
|
+
error?: string;
|
|
1020
|
+
};
|
|
1021
|
+
if (!result.ok || !result.baseUrl) {
|
|
1022
|
+
throw new Error(result.error ?? "Failed to launch Chrome with CDP");
|
|
1023
|
+
}
|
|
1024
|
+
return { baseUrl: result.baseUrl };
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
async function minimizeChrome(): Promise<void> {
|
|
1028
|
+
try {
|
|
1029
|
+
await execFileAsync("assistant", ["browser", "chrome", "minimize"]);
|
|
1030
|
+
} catch {
|
|
1031
|
+
// best-effort — same as the original
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
980
1034
|
|
|
981
1035
|
// ---------------------------------------------------------------------------
|
|
982
1036
|
// Ride Shotgun learn session helper
|
|
@@ -1012,100 +1066,95 @@ async function navigateToX(cdpBase: string): Promise<void> {
|
|
|
1012
1066
|
async function startLearnSession(
|
|
1013
1067
|
durationSeconds: number,
|
|
1014
1068
|
): Promise<LearnResult> {
|
|
1015
|
-
const cdpSession = await
|
|
1016
|
-
startUrl: "https://x.com/login",
|
|
1017
|
-
});
|
|
1069
|
+
const cdpSession = await launchChromeCdp("https://x.com/login");
|
|
1018
1070
|
await navigateToX(cdpSession.baseUrl);
|
|
1019
1071
|
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1072
|
+
// Start ride shotgun via HTTP
|
|
1073
|
+
const response = await httpSend("/v1/computer-use/ride-shotgun/start", {
|
|
1074
|
+
method: "POST",
|
|
1075
|
+
body: JSON.stringify({
|
|
1076
|
+
durationSeconds,
|
|
1077
|
+
intervalSeconds: 5,
|
|
1078
|
+
mode: "learn",
|
|
1079
|
+
targetDomain: "x.com",
|
|
1080
|
+
}),
|
|
1081
|
+
});
|
|
1082
|
+
|
|
1083
|
+
if (!response.ok) {
|
|
1084
|
+
const body = await response.text();
|
|
1085
|
+
throw new Error(
|
|
1086
|
+
`Cannot connect to assistant: ${response.status} ${body}. Is the assistant running?`,
|
|
1087
|
+
);
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
const startResult = (await response.json()) as {
|
|
1091
|
+
watchId?: string;
|
|
1092
|
+
sessionId?: string;
|
|
1093
|
+
};
|
|
1033
1094
|
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1095
|
+
if (!startResult.watchId) {
|
|
1096
|
+
throw new Error("Ride-shotgun start response missing watchId");
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
// Poll the status endpoint using watchId to correlate completion
|
|
1100
|
+
const { watchId } = startResult;
|
|
1101
|
+
const timeoutMs = (durationSeconds + 30) * 1000;
|
|
1102
|
+
const pollIntervalMs = 2000;
|
|
1103
|
+
const startTime = Date.now();
|
|
1104
|
+
|
|
1105
|
+
return new Promise<LearnResult>((resolve, reject) => {
|
|
1106
|
+
const tick = async () => {
|
|
1107
|
+
if (Date.now() - startTime > timeoutMs) {
|
|
1037
1108
|
reject(
|
|
1038
1109
|
new Error(`Learn session timed out after ${durationSeconds + 30}s`),
|
|
1039
1110
|
);
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
);
|
|
1043
|
-
timeoutHandle.unref();
|
|
1044
|
-
|
|
1045
|
-
let authenticated = !sessionToken;
|
|
1046
|
-
|
|
1047
|
-
const sendStartCommand = () => {
|
|
1048
|
-
socket.write(
|
|
1049
|
-
serialize({
|
|
1050
|
-
type: "ride_shotgun_start",
|
|
1051
|
-
durationSeconds,
|
|
1052
|
-
intervalSeconds: 5,
|
|
1053
|
-
mode: "learn",
|
|
1054
|
-
targetDomain: "x.com",
|
|
1055
|
-
} as unknown as import("../daemon/ipc-protocol.js").ClientMessage),
|
|
1056
|
-
);
|
|
1057
|
-
};
|
|
1058
|
-
|
|
1059
|
-
socket.on("data", (chunk) => {
|
|
1060
|
-
const messages = parser.feed(chunk.toString("utf-8"));
|
|
1061
|
-
for (const msg of messages) {
|
|
1062
|
-
const m = msg as unknown as Record<string, unknown>;
|
|
1111
|
+
return;
|
|
1112
|
+
}
|
|
1063
1113
|
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
}
|
|
1073
|
-
continue;
|
|
1114
|
+
try {
|
|
1115
|
+
const statusRes = await httpSend(
|
|
1116
|
+
`/v1/computer-use/ride-shotgun/status/${watchId}`,
|
|
1117
|
+
{ method: "GET" },
|
|
1118
|
+
);
|
|
1119
|
+
if (!statusRes.ok) {
|
|
1120
|
+
setTimeout(tick, pollIntervalMs);
|
|
1121
|
+
return;
|
|
1074
1122
|
}
|
|
1075
1123
|
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1124
|
+
const status = (await statusRes.json()) as {
|
|
1125
|
+
status: string;
|
|
1126
|
+
recordingId?: string;
|
|
1127
|
+
savedRecordingPath?: string;
|
|
1128
|
+
bootstrapFailureReason?: string;
|
|
1129
|
+
};
|
|
1079
1130
|
|
|
1080
|
-
if (
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1131
|
+
if (status.bootstrapFailureReason) {
|
|
1132
|
+
reject(
|
|
1133
|
+
new Error(`Learn session failed: ${status.bootstrapFailureReason}`),
|
|
1134
|
+
);
|
|
1135
|
+
return;
|
|
1085
1136
|
}
|
|
1086
1137
|
|
|
1087
|
-
if (
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
}
|
|
1138
|
+
if (status.status === "completed") {
|
|
1139
|
+
if (status.recordingId) {
|
|
1140
|
+
resolve({
|
|
1141
|
+
recordingId: status.recordingId,
|
|
1142
|
+
recordingPath: status.savedRecordingPath,
|
|
1143
|
+
});
|
|
1144
|
+
} else {
|
|
1145
|
+
reject(
|
|
1146
|
+
new Error("Learn session completed but no recording was saved."),
|
|
1147
|
+
);
|
|
1148
|
+
}
|
|
1149
|
+
return;
|
|
1094
1150
|
}
|
|
1151
|
+
} catch {
|
|
1152
|
+
// Status endpoint not reachable — continue polling
|
|
1095
1153
|
}
|
|
1096
|
-
});
|
|
1097
1154
|
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
type: "auth",
|
|
1103
|
-
token: sessionToken,
|
|
1104
|
-
} as unknown as import("../daemon/ipc-protocol.js").ClientMessage),
|
|
1105
|
-
);
|
|
1106
|
-
} else {
|
|
1107
|
-
sendStartCommand();
|
|
1108
|
-
}
|
|
1109
|
-
});
|
|
1155
|
+
setTimeout(tick, pollIntervalMs);
|
|
1156
|
+
};
|
|
1157
|
+
|
|
1158
|
+
setTimeout(tick, pollIntervalMs);
|
|
1110
1159
|
});
|
|
1111
1160
|
}
|