@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
|
@@ -27,30 +27,9 @@ mock.module("../util/logger.js", () => ({
|
|
|
27
27
|
}),
|
|
28
28
|
}));
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
mock.module("../memory/channel-guardian-store.js", () => ({
|
|
35
|
-
getActiveBinding: (_assistantId: string, channel: string) => {
|
|
36
|
-
if (channel === "telegram") return mockTelegramBinding;
|
|
37
|
-
if (channel === "sms") return mockSmsBinding;
|
|
38
|
-
if (channel === "vellum") return mockVellumBinding;
|
|
39
|
-
return null;
|
|
40
|
-
},
|
|
41
|
-
createBinding: (params: Record<string, unknown>) => ({
|
|
42
|
-
id: `binding-${Date.now()}`,
|
|
43
|
-
...params,
|
|
44
|
-
status: "active",
|
|
45
|
-
verifiedAt: Date.now(),
|
|
46
|
-
verifiedVia: "test",
|
|
47
|
-
metadataJson: null,
|
|
48
|
-
createdAt: Date.now(),
|
|
49
|
-
updatedAt: Date.now(),
|
|
50
|
-
}),
|
|
51
|
-
listActiveBindingsByAssistant: () =>
|
|
52
|
-
mockVellumBinding ? [mockVellumBinding] : [],
|
|
53
|
-
}));
|
|
30
|
+
// Note: stale mock for channel-guardian-store.js removed — the barrel was
|
|
31
|
+
// deleted and none of the functions it mocked (getActiveBinding, createBinding,
|
|
32
|
+
// listActiveBindingsByAssistant) existed in the barrel.
|
|
54
33
|
|
|
55
34
|
mock.module("../config/loader.js", () => ({
|
|
56
35
|
getConfig: () => ({
|
|
@@ -138,24 +117,8 @@ function resetTables(): void {
|
|
|
138
117
|
db.run("DELETE FROM call_sessions");
|
|
139
118
|
db.run("DELETE FROM conversations");
|
|
140
119
|
|
|
141
|
-
mockTelegramBinding
|
|
142
|
-
|
|
143
|
-
// Pre-seed vellum binding so the self-healing path in dispatchGuardianQuestion
|
|
144
|
-
// never triggers (avoids UNIQUE constraint violations on repeated dispatches).
|
|
145
|
-
mockVellumBinding = {
|
|
146
|
-
id: "binding-vellum-test",
|
|
147
|
-
assistantId: "self",
|
|
148
|
-
channel: "vellum",
|
|
149
|
-
guardianExternalUserId: "vellum-guardian",
|
|
150
|
-
guardianDeliveryChatId: "local",
|
|
151
|
-
guardianPrincipalId: "test-principal-id",
|
|
152
|
-
status: "active",
|
|
153
|
-
verifiedAt: Date.now(),
|
|
154
|
-
verifiedVia: "test",
|
|
155
|
-
metadataJson: null,
|
|
156
|
-
createdAt: Date.now(),
|
|
157
|
-
updatedAt: Date.now(),
|
|
158
|
-
};
|
|
120
|
+
// Note: mockTelegramBinding/mockVoiceBinding/mockVellumBinding assignments
|
|
121
|
+
// removed — they only fed the stale channel-guardian-store mock.
|
|
159
122
|
emitCalls.length = 0;
|
|
160
123
|
threadCreatedFromMock = null;
|
|
161
124
|
mockEmitResult = {
|
|
@@ -241,10 +204,6 @@ describe("guardian-dispatch", () => {
|
|
|
241
204
|
const convId = "conv-dispatch-2";
|
|
242
205
|
ensureConversation(convId);
|
|
243
206
|
|
|
244
|
-
mockTelegramBinding = {
|
|
245
|
-
guardianDeliveryChatId: "tg-chat-999",
|
|
246
|
-
guardianExternalUserId: "tg-user-888",
|
|
247
|
-
};
|
|
248
207
|
mockEmitResult = {
|
|
249
208
|
signalId: "sig-2",
|
|
250
209
|
deduplicated: false,
|
|
@@ -48,11 +48,11 @@ mock.module("../util/logger.js", () => ({
|
|
|
48
48
|
import { GRANT_TTL_MS } from "../approvals/guardian-decision-primitive.js";
|
|
49
49
|
import type { Session } from "../daemon/session.js";
|
|
50
50
|
import type { TrustContext } from "../daemon/session-runtime-assembly.js";
|
|
51
|
+
import { getDb, initializeDb, resetDb } from "../memory/db.js";
|
|
51
52
|
import {
|
|
52
53
|
createApprovalRequest,
|
|
53
54
|
type GuardianApprovalRequest,
|
|
54
|
-
} from "../memory/
|
|
55
|
-
import { getDb, initializeDb, resetDb } from "../memory/db.js";
|
|
55
|
+
} from "../memory/guardian-approvals.js";
|
|
56
56
|
import * as approvalMessageComposer from "../runtime/approval-message-composer.js";
|
|
57
57
|
import * as gatewayClient from "../runtime/gateway-client.js";
|
|
58
58
|
import * as pendingInteractions from "../runtime/pending-interactions.js";
|
|
@@ -148,7 +148,6 @@ function makeTrustContext(): TrustContext {
|
|
|
148
148
|
return {
|
|
149
149
|
sourceChannel: "telegram",
|
|
150
150
|
trustClass: "guardian",
|
|
151
|
-
denialReason: undefined,
|
|
152
151
|
};
|
|
153
152
|
}
|
|
154
153
|
|
|
@@ -505,46 +504,7 @@ describe("guardian grant minting on tool-approval decisions", () => {
|
|
|
505
504
|
composeSpy.mockRestore();
|
|
506
505
|
});
|
|
507
506
|
|
|
508
|
-
// ── 8.
|
|
509
|
-
|
|
510
|
-
test("approve_once via legacy parser mints a scoped grant", async () => {
|
|
511
|
-
const requestId = "req-grant-leg-1";
|
|
512
|
-
createTestGuardianApproval(requestId);
|
|
513
|
-
registerPendingInteraction(
|
|
514
|
-
requestId,
|
|
515
|
-
CONVERSATION_ID,
|
|
516
|
-
TOOL_NAME,
|
|
517
|
-
TOOL_INPUT,
|
|
518
|
-
);
|
|
519
|
-
|
|
520
|
-
// No approvalConversationGenerator => legacy parser path
|
|
521
|
-
const result = await handleApprovalInterception({
|
|
522
|
-
conversationId: "guardian-conv-8",
|
|
523
|
-
content: "yes",
|
|
524
|
-
conversationExternalId: GUARDIAN_CHAT,
|
|
525
|
-
sourceChannel: "telegram",
|
|
526
|
-
actorExternalId: GUARDIAN_USER,
|
|
527
|
-
replyCallbackUrl: "https://gateway.test/deliver",
|
|
528
|
-
trustCtx: makeTrustContext(),
|
|
529
|
-
assistantId: ASSISTANT_ID,
|
|
530
|
-
});
|
|
531
|
-
|
|
532
|
-
expect(result.handled).toBe(true);
|
|
533
|
-
expect(result.type).toBe("guardian_decision_applied");
|
|
534
|
-
|
|
535
|
-
// Verify a grant was minted
|
|
536
|
-
expect(countGrants()).toBe(1);
|
|
537
|
-
|
|
538
|
-
const grant = getLatestGrant();
|
|
539
|
-
expect(grant).not.toBeNull();
|
|
540
|
-
expect(grant!.scope_mode).toBe("tool_signature");
|
|
541
|
-
expect(grant!.tool_name).toBe(TOOL_NAME);
|
|
542
|
-
|
|
543
|
-
deliverSpy.mockRestore();
|
|
544
|
-
composeSpy.mockRestore();
|
|
545
|
-
});
|
|
546
|
-
|
|
547
|
-
// ── 9. Grant TTL is approximately 5 minutes ──
|
|
507
|
+
// ── 8. Grant TTL is approximately 5 minutes ──
|
|
548
508
|
|
|
549
509
|
test("minted grant has approximately 5-minute TTL", async () => {
|
|
550
510
|
const requestId = "req-grant-ttl-1";
|
|
@@ -621,6 +581,8 @@ describe("approval interception trust-class regression coverage", () => {
|
|
|
621
581
|
trustCtx: {
|
|
622
582
|
sourceChannel: "telegram",
|
|
623
583
|
trustClass: "unknown",
|
|
584
|
+
requesterExternalUserId: "intruder-user-1",
|
|
585
|
+
guardianExternalUserId: "guardian-1",
|
|
624
586
|
},
|
|
625
587
|
assistantId: ASSISTANT_ID,
|
|
626
588
|
});
|
|
@@ -653,7 +615,6 @@ describe("approval interception trust-class regression coverage", () => {
|
|
|
653
615
|
trustCtx: {
|
|
654
616
|
sourceChannel: "telegram",
|
|
655
617
|
trustClass: "unknown",
|
|
656
|
-
denialReason: "no_identity",
|
|
657
618
|
},
|
|
658
619
|
assistantId: ASSISTANT_ID,
|
|
659
620
|
});
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Verifies:
|
|
6
6
|
* - startOutbound / resendOutbound / cancelOutbound return correct result
|
|
7
7
|
* shapes and stable error codes.
|
|
8
|
-
* - HTTP route handlers (
|
|
9
|
-
*
|
|
8
|
+
* - HTTP route handlers (handleCreateVerificationSession / handleResendVerificationSession /
|
|
9
|
+
* handleCancelVerificationSession) wire through to the shared module and return
|
|
10
10
|
* appropriate HTTP status codes.
|
|
11
11
|
* - Rate limiting, missing/invalid destination, already_bound, and
|
|
12
12
|
* no_active_session error paths all produce the expected error codes.
|
|
@@ -43,50 +43,28 @@ mock.module("../util/logger.js", () => ({
|
|
|
43
43
|
}),
|
|
44
44
|
}));
|
|
45
45
|
|
|
46
|
-
// SMS client mock — track calls
|
|
47
|
-
const smsSendCalls: Array<{
|
|
48
|
-
to: string;
|
|
49
|
-
text: string;
|
|
50
|
-
assistantId?: string;
|
|
51
|
-
}> = [];
|
|
52
|
-
mock.module("../messaging/providers/sms/client.js", () => ({
|
|
53
|
-
sendMessage: async (
|
|
54
|
-
_gatewayUrl: string,
|
|
55
|
-
_bearerToken: string,
|
|
56
|
-
to: string,
|
|
57
|
-
text: string,
|
|
58
|
-
assistantId?: string,
|
|
59
|
-
) => {
|
|
60
|
-
smsSendCalls.push({ to, text, assistantId });
|
|
61
|
-
return { messageSid: "SM-mock", status: "queued" };
|
|
62
|
-
},
|
|
63
|
-
}));
|
|
64
|
-
|
|
65
46
|
mock.module("../config/env.js", () => ({
|
|
66
47
|
isHttpAuthDisabled: () => true,
|
|
67
48
|
getGatewayInternalBaseUrl: () => "http://127.0.0.1:7830",
|
|
68
49
|
}));
|
|
69
50
|
|
|
70
|
-
// Telegram
|
|
51
|
+
// Telegram bot username mock — production code now reads from config via getTelegramBotUsername()
|
|
71
52
|
let mockBotUsername: string | undefined = "test_bot";
|
|
72
|
-
mock.module("../
|
|
73
|
-
|
|
74
|
-
mockBotUsername ? { accountInfo: mockBotUsername } : null,
|
|
75
|
-
upsertCredentialMetadata: () => {},
|
|
76
|
-
deleteCredentialMetadata: () => {},
|
|
53
|
+
mock.module("../telegram/bot-username.js", () => ({
|
|
54
|
+
getTelegramBotUsername: () => mockBotUsername,
|
|
77
55
|
}));
|
|
78
56
|
|
|
79
57
|
// Voice call mock
|
|
80
58
|
const voiceCallInitCalls: Array<{
|
|
81
59
|
phoneNumber: string;
|
|
82
|
-
|
|
60
|
+
verificationSessionId: string;
|
|
83
61
|
assistantId?: string;
|
|
84
62
|
originConversationId?: string;
|
|
85
63
|
}> = [];
|
|
86
64
|
mock.module("../calls/call-domain.js", () => ({
|
|
87
|
-
|
|
65
|
+
startVerificationCall: async (input: {
|
|
88
66
|
phoneNumber: string;
|
|
89
|
-
|
|
67
|
+
verificationSessionId: string;
|
|
90
68
|
assistantId?: string;
|
|
91
69
|
originConversationId?: string;
|
|
92
70
|
}) => {
|
|
@@ -129,17 +107,17 @@ globalThis.fetch = (async (
|
|
|
129
107
|
// ---------------------------------------------------------------------------
|
|
130
108
|
|
|
131
109
|
import { getDb, initializeDb, resetDb } from "../memory/db.js";
|
|
132
|
-
import { updateSessionDelivery } from "../runtime/channel-
|
|
110
|
+
import { updateSessionDelivery } from "../runtime/channel-verification-service.js";
|
|
111
|
+
import {
|
|
112
|
+
handleCancelVerificationSession,
|
|
113
|
+
handleCreateVerificationSession,
|
|
114
|
+
handleResendVerificationSession,
|
|
115
|
+
} from "../runtime/routes/channel-verification-routes.js";
|
|
133
116
|
import {
|
|
134
117
|
cancelOutbound,
|
|
135
118
|
resendOutbound,
|
|
136
119
|
startOutbound,
|
|
137
|
-
} from "../runtime/
|
|
138
|
-
import {
|
|
139
|
-
handleCancelOutbound,
|
|
140
|
-
handleResendOutbound,
|
|
141
|
-
handleStartOutbound,
|
|
142
|
-
} from "../runtime/routes/integration-routes.js";
|
|
120
|
+
} from "../runtime/verification-outbound-actions.js";
|
|
143
121
|
|
|
144
122
|
// Initialize the database (creates all tables)
|
|
145
123
|
initializeDb();
|
|
@@ -156,7 +134,7 @@ afterAll(() => {
|
|
|
156
134
|
|
|
157
135
|
function resetTables(): void {
|
|
158
136
|
const db = getDb();
|
|
159
|
-
db.run("DELETE FROM
|
|
137
|
+
db.run("DELETE FROM channel_verification_sessions");
|
|
160
138
|
try {
|
|
161
139
|
db.run("DELETE FROM channel_guardian_approval_requests");
|
|
162
140
|
} catch {
|
|
@@ -184,7 +162,6 @@ function jsonRequest(body: Record<string, unknown>): Request {
|
|
|
184
162
|
// Reset mutable state between tests
|
|
185
163
|
beforeEach(() => {
|
|
186
164
|
resetTables();
|
|
187
|
-
smsSendCalls.length = 0;
|
|
188
165
|
telegramDeliverCalls.length = 0;
|
|
189
166
|
voiceCallInitCalls.length = 0;
|
|
190
167
|
mockBotUsername = "test_bot";
|
|
@@ -195,25 +172,25 @@ beforeEach(() => {
|
|
|
195
172
|
// ===========================================================================
|
|
196
173
|
|
|
197
174
|
describe("startOutbound", () => {
|
|
198
|
-
test("
|
|
199
|
-
const result = await startOutbound({ channel: "
|
|
175
|
+
test("Voice: returns missing_destination when destination is absent", async () => {
|
|
176
|
+
const result = await startOutbound({ channel: "phone" });
|
|
200
177
|
expect(result.success).toBe(false);
|
|
201
178
|
expect(result.error).toBe("missing_destination");
|
|
202
|
-
expect(result.channel).toBe("
|
|
179
|
+
expect(result.channel).toBe("phone");
|
|
203
180
|
});
|
|
204
181
|
|
|
205
|
-
test("
|
|
182
|
+
test("Voice: returns invalid_destination for garbage phone number", async () => {
|
|
206
183
|
const result = await startOutbound({
|
|
207
|
-
channel: "
|
|
184
|
+
channel: "phone",
|
|
208
185
|
destination: "notaphone",
|
|
209
186
|
});
|
|
210
187
|
expect(result.success).toBe(false);
|
|
211
188
|
expect(result.error).toBe("invalid_destination");
|
|
212
189
|
});
|
|
213
190
|
|
|
214
|
-
test("
|
|
191
|
+
test("Voice: succeeds with valid E.164 number", async () => {
|
|
215
192
|
const result = await startOutbound({
|
|
216
|
-
channel: "
|
|
193
|
+
channel: "phone",
|
|
217
194
|
destination: "+15551234567",
|
|
218
195
|
});
|
|
219
196
|
expect(result.success).toBe(true);
|
|
@@ -222,12 +199,12 @@ describe("startOutbound", () => {
|
|
|
222
199
|
expect(result.expiresAt).toBeGreaterThan(Date.now());
|
|
223
200
|
expect(result.nextResendAt).toBeGreaterThan(Date.now());
|
|
224
201
|
expect(result.sendCount).toBe(1);
|
|
225
|
-
expect(result.channel).toBe("
|
|
202
|
+
expect(result.channel).toBe("phone");
|
|
226
203
|
});
|
|
227
204
|
|
|
228
|
-
test("
|
|
205
|
+
test("Voice: succeeds with loose phone format (parentheses + dashes)", async () => {
|
|
229
206
|
const result = await startOutbound({
|
|
230
|
-
channel: "
|
|
207
|
+
channel: "phone",
|
|
231
208
|
destination: "(555) 987-6543",
|
|
232
209
|
});
|
|
233
210
|
expect(result.success).toBe(true);
|
|
@@ -284,14 +261,14 @@ describe("startOutbound", () => {
|
|
|
284
261
|
});
|
|
285
262
|
|
|
286
263
|
test("voice: returns missing_destination when absent", async () => {
|
|
287
|
-
const result = await startOutbound({ channel: "
|
|
264
|
+
const result = await startOutbound({ channel: "phone" });
|
|
288
265
|
expect(result.success).toBe(false);
|
|
289
266
|
expect(result.error).toBe("missing_destination");
|
|
290
267
|
});
|
|
291
268
|
|
|
292
269
|
test("voice: returns invalid_destination for garbage", async () => {
|
|
293
270
|
const result = await startOutbound({
|
|
294
|
-
channel: "
|
|
271
|
+
channel: "phone",
|
|
295
272
|
destination: "badphone",
|
|
296
273
|
});
|
|
297
274
|
expect(result.success).toBe(false);
|
|
@@ -300,7 +277,7 @@ describe("startOutbound", () => {
|
|
|
300
277
|
|
|
301
278
|
test("voice: succeeds with valid phone", async () => {
|
|
302
279
|
const result = await startOutbound({
|
|
303
|
-
channel: "
|
|
280
|
+
channel: "phone",
|
|
304
281
|
destination: "+15559876543",
|
|
305
282
|
});
|
|
306
283
|
expect(result.success).toBe(true);
|
|
@@ -309,10 +286,10 @@ describe("startOutbound", () => {
|
|
|
309
286
|
expect(result.sendCount).toBe(1);
|
|
310
287
|
});
|
|
311
288
|
|
|
312
|
-
test("voice: passes originConversationId to
|
|
289
|
+
test("voice: passes originConversationId to startVerificationCall", async () => {
|
|
313
290
|
voiceCallInitCalls.length = 0;
|
|
314
291
|
const result = await startOutbound({
|
|
315
|
-
channel: "
|
|
292
|
+
channel: "phone",
|
|
316
293
|
destination: "+15559876543",
|
|
317
294
|
originConversationId: "conv-origin-linkage-test",
|
|
318
295
|
});
|
|
@@ -325,7 +302,7 @@ describe("startOutbound", () => {
|
|
|
325
302
|
test("voice: succeeds without originConversationId (backward compat)", async () => {
|
|
326
303
|
voiceCallInitCalls.length = 0;
|
|
327
304
|
const result = await startOutbound({
|
|
328
|
-
channel: "
|
|
305
|
+
channel: "phone",
|
|
329
306
|
destination: "+15551119999",
|
|
330
307
|
});
|
|
331
308
|
expect(result.success).toBe(true);
|
|
@@ -346,15 +323,15 @@ describe("startOutbound", () => {
|
|
|
346
323
|
|
|
347
324
|
describe("resendOutbound", () => {
|
|
348
325
|
test("returns no_active_session when no session exists", () => {
|
|
349
|
-
const result = resendOutbound({ channel: "
|
|
326
|
+
const result = resendOutbound({ channel: "phone" });
|
|
350
327
|
expect(result.success).toBe(false);
|
|
351
328
|
expect(result.error).toBe("no_active_session");
|
|
352
329
|
});
|
|
353
330
|
|
|
354
|
-
test("
|
|
331
|
+
test("Voice: succeeds when an active session exists and cooldown has passed", async () => {
|
|
355
332
|
// Start a session first
|
|
356
333
|
const startResult = await startOutbound({
|
|
357
|
-
channel: "
|
|
334
|
+
channel: "phone",
|
|
358
335
|
destination: "+15551112222",
|
|
359
336
|
});
|
|
360
337
|
expect(startResult.success).toBe(true);
|
|
@@ -369,15 +346,15 @@ describe("resendOutbound", () => {
|
|
|
369
346
|
);
|
|
370
347
|
}
|
|
371
348
|
|
|
372
|
-
const resendResult = resendOutbound({ channel: "
|
|
349
|
+
const resendResult = resendOutbound({ channel: "phone" });
|
|
373
350
|
expect(resendResult.success).toBe(true);
|
|
374
351
|
expect(resendResult.verificationSessionId).toBeDefined();
|
|
375
352
|
expect(resendResult.sendCount).toBe(2);
|
|
376
353
|
});
|
|
377
354
|
|
|
378
|
-
test("
|
|
355
|
+
test("Voice: preserves originConversationId on resend", async () => {
|
|
379
356
|
const startResult = await startOutbound({
|
|
380
|
-
channel: "
|
|
357
|
+
channel: "phone",
|
|
381
358
|
destination: "+15551113333",
|
|
382
359
|
});
|
|
383
360
|
expect(startResult.success).toBe(true);
|
|
@@ -392,17 +369,17 @@ describe("resendOutbound", () => {
|
|
|
392
369
|
}
|
|
393
370
|
|
|
394
371
|
const resendResult = resendOutbound({
|
|
395
|
-
channel: "
|
|
396
|
-
originConversationId: "conv-resend-
|
|
372
|
+
channel: "phone",
|
|
373
|
+
originConversationId: "conv-resend-voice-origin",
|
|
397
374
|
});
|
|
398
375
|
expect(resendResult.success).toBe(true);
|
|
399
|
-
expect(resendResult.originConversationId).toBe("conv-resend-
|
|
376
|
+
expect(resendResult.originConversationId).toBe("conv-resend-voice-origin");
|
|
400
377
|
});
|
|
401
378
|
|
|
402
379
|
test("voice: preserves originConversationId on resend and passes it to call initiation", async () => {
|
|
403
380
|
voiceCallInitCalls.length = 0;
|
|
404
381
|
const startResult = await startOutbound({
|
|
405
|
-
channel: "
|
|
382
|
+
channel: "phone",
|
|
406
383
|
destination: "+15559991111",
|
|
407
384
|
});
|
|
408
385
|
expect(startResult.success).toBe(true);
|
|
@@ -417,7 +394,7 @@ describe("resendOutbound", () => {
|
|
|
417
394
|
}
|
|
418
395
|
|
|
419
396
|
const resendResult = resendOutbound({
|
|
420
|
-
channel: "
|
|
397
|
+
channel: "phone",
|
|
421
398
|
originConversationId: "conv-resend-voice-origin",
|
|
422
399
|
});
|
|
423
400
|
expect(resendResult.success).toBe(true);
|
|
@@ -441,21 +418,21 @@ describe("resendOutbound", () => {
|
|
|
441
418
|
|
|
442
419
|
describe("cancelOutbound", () => {
|
|
443
420
|
test("returns no_active_session when no session exists", () => {
|
|
444
|
-
const result = cancelOutbound({ channel: "
|
|
421
|
+
const result = cancelOutbound({ channel: "phone" });
|
|
445
422
|
expect(result.success).toBe(false);
|
|
446
423
|
expect(result.error).toBe("no_active_session");
|
|
447
424
|
});
|
|
448
425
|
|
|
449
426
|
test("succeeds when an active session exists", async () => {
|
|
450
427
|
const startResult = await startOutbound({
|
|
451
|
-
channel: "
|
|
428
|
+
channel: "phone",
|
|
452
429
|
destination: "+15553334444",
|
|
453
430
|
});
|
|
454
431
|
expect(startResult.success).toBe(true);
|
|
455
432
|
|
|
456
|
-
const cancelResult = cancelOutbound({ channel: "
|
|
433
|
+
const cancelResult = cancelOutbound({ channel: "phone" });
|
|
457
434
|
expect(cancelResult.success).toBe(true);
|
|
458
|
-
expect(cancelResult.channel).toBe("
|
|
435
|
+
expect(cancelResult.channel).toBe("phone");
|
|
459
436
|
});
|
|
460
437
|
});
|
|
461
438
|
|
|
@@ -463,10 +440,10 @@ describe("cancelOutbound", () => {
|
|
|
463
440
|
// HTTP route handlers
|
|
464
441
|
// ===========================================================================
|
|
465
442
|
|
|
466
|
-
describe("HTTP route:
|
|
443
|
+
describe("HTTP route: handleCreateVerificationSession (guardian path)", () => {
|
|
467
444
|
test("returns 400 when channel is missing", async () => {
|
|
468
445
|
const req = jsonRequest({ destination: "+15551234567" });
|
|
469
|
-
const resp = await
|
|
446
|
+
const resp = await handleCreateVerificationSession(req, "self");
|
|
470
447
|
expect(resp.status).toBe(400);
|
|
471
448
|
const body = (await resp.json()) as {
|
|
472
449
|
error: { message: string; code: string };
|
|
@@ -475,17 +452,19 @@ describe("HTTP route: handleStartOutbound", () => {
|
|
|
475
452
|
expect(body.error.message).toContain("channel");
|
|
476
453
|
});
|
|
477
454
|
|
|
478
|
-
test("
|
|
479
|
-
|
|
480
|
-
const
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
455
|
+
test("creates inbound challenge when destination is absent", async () => {
|
|
456
|
+
// Without a destination, the unified handler takes the inbound challenge path.
|
|
457
|
+
const req = jsonRequest({ channel: "phone" });
|
|
458
|
+
const resp = await handleCreateVerificationSession(req, "self");
|
|
459
|
+
expect(resp.status).toBe(200);
|
|
460
|
+
const body = (await resp.json()) as Record<string, unknown>;
|
|
461
|
+
expect(body.success).toBe(true);
|
|
462
|
+
expect(body.channel).toBe("phone");
|
|
484
463
|
});
|
|
485
464
|
|
|
486
|
-
test("returns 200 for valid
|
|
487
|
-
const req = jsonRequest({ channel: "
|
|
488
|
-
const resp = await
|
|
465
|
+
test("returns 200 for valid voice start", async () => {
|
|
466
|
+
const req = jsonRequest({ channel: "phone", destination: "+15559999999" });
|
|
467
|
+
const resp = await handleCreateVerificationSession(req, "self");
|
|
489
468
|
expect(resp.status).toBe(200);
|
|
490
469
|
const body = (await resp.json()) as Record<string, unknown>;
|
|
491
470
|
expect(body.success).toBe(true);
|
|
@@ -493,10 +472,10 @@ describe("HTTP route: handleStartOutbound", () => {
|
|
|
493
472
|
});
|
|
494
473
|
});
|
|
495
474
|
|
|
496
|
-
describe("HTTP route:
|
|
475
|
+
describe("HTTP route: handleResendVerificationSession (guardian path)", () => {
|
|
497
476
|
test("returns 400 when channel is missing", async () => {
|
|
498
477
|
const req = jsonRequest({});
|
|
499
|
-
const resp = await
|
|
478
|
+
const resp = await handleResendVerificationSession(req);
|
|
500
479
|
expect(resp.status).toBe(400);
|
|
501
480
|
const body = (await resp.json()) as {
|
|
502
481
|
error: { message: string; code: string };
|
|
@@ -506,8 +485,8 @@ describe("HTTP route: handleResendOutbound", () => {
|
|
|
506
485
|
});
|
|
507
486
|
|
|
508
487
|
test("returns 400 for no_active_session", async () => {
|
|
509
|
-
const req = jsonRequest({ channel: "
|
|
510
|
-
const resp = await
|
|
488
|
+
const req = jsonRequest({ channel: "phone" });
|
|
489
|
+
const resp = await handleResendVerificationSession(req);
|
|
511
490
|
expect(resp.status).toBe(400);
|
|
512
491
|
const body = (await resp.json()) as { error?: string };
|
|
513
492
|
expect(body.error).toBe("no_active_session");
|
|
@@ -516,10 +495,10 @@ describe("HTTP route: handleResendOutbound", () => {
|
|
|
516
495
|
test("passes originConversationId through on successful resend", async () => {
|
|
517
496
|
// Start a session first
|
|
518
497
|
const startReq = jsonRequest({
|
|
519
|
-
channel: "
|
|
498
|
+
channel: "phone",
|
|
520
499
|
destination: "+15556667777",
|
|
521
500
|
});
|
|
522
|
-
const startResp = await
|
|
501
|
+
const startResp = await handleCreateVerificationSession(startReq, "self");
|
|
523
502
|
expect(startResp.status).toBe(200);
|
|
524
503
|
const startBody = (await startResp.json()) as Record<string, unknown>;
|
|
525
504
|
|
|
@@ -534,10 +513,10 @@ describe("HTTP route: handleResendOutbound", () => {
|
|
|
534
513
|
}
|
|
535
514
|
|
|
536
515
|
const resendReq = jsonRequest({
|
|
537
|
-
channel: "
|
|
516
|
+
channel: "phone",
|
|
538
517
|
originConversationId: "conv-resend-http-origin",
|
|
539
518
|
});
|
|
540
|
-
const resendResp = await
|
|
519
|
+
const resendResp = await handleResendVerificationSession(resendReq);
|
|
541
520
|
expect(resendResp.status).toBe(200);
|
|
542
521
|
const resendBody = (await resendResp.json()) as Record<string, unknown>;
|
|
543
522
|
expect(resendBody.success).toBe(true);
|
|
@@ -545,10 +524,10 @@ describe("HTTP route: handleResendOutbound", () => {
|
|
|
545
524
|
});
|
|
546
525
|
});
|
|
547
526
|
|
|
548
|
-
describe("HTTP route:
|
|
527
|
+
describe("HTTP route: handleCancelVerificationSession (guardian path)", () => {
|
|
549
528
|
test("returns 400 when channel is missing", async () => {
|
|
550
529
|
const req = jsonRequest({});
|
|
551
|
-
const resp = await
|
|
530
|
+
const resp = await handleCancelVerificationSession(req);
|
|
552
531
|
expect(resp.status).toBe(400);
|
|
553
532
|
const body = (await resp.json()) as {
|
|
554
533
|
error: { message: string; code: string };
|
|
@@ -557,26 +536,28 @@ describe("HTTP route: handleCancelOutbound", () => {
|
|
|
557
536
|
expect(body.error.message).toContain("channel");
|
|
558
537
|
});
|
|
559
538
|
|
|
560
|
-
test("returns
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
const
|
|
565
|
-
expect(
|
|
539
|
+
test("returns 200 even when no active session exists", async () => {
|
|
540
|
+
// The unified cancel handler silently cancels both inbound and outbound —
|
|
541
|
+
// no error if nothing is active.
|
|
542
|
+
const req = jsonRequest({ channel: "phone" });
|
|
543
|
+
const resp = await handleCancelVerificationSession(req);
|
|
544
|
+
expect(resp.status).toBe(200);
|
|
545
|
+
const body = (await resp.json()) as Record<string, unknown>;
|
|
546
|
+
expect(body.success).toBe(true);
|
|
566
547
|
});
|
|
567
548
|
|
|
568
549
|
test("returns 200 when active session is cancelled", async () => {
|
|
569
550
|
// Start a session
|
|
570
551
|
const startReq = jsonRequest({
|
|
571
|
-
channel: "
|
|
552
|
+
channel: "phone",
|
|
572
553
|
destination: "+15558887777",
|
|
573
554
|
});
|
|
574
|
-
const startResp = await
|
|
555
|
+
const startResp = await handleCreateVerificationSession(startReq, "self");
|
|
575
556
|
expect(startResp.status).toBe(200);
|
|
576
557
|
|
|
577
558
|
// Cancel it
|
|
578
|
-
const cancelReq = jsonRequest({ channel: "
|
|
579
|
-
const cancelResp = await
|
|
559
|
+
const cancelReq = jsonRequest({ channel: "phone" });
|
|
560
|
+
const cancelResp = await handleCancelVerificationSession(cancelReq);
|
|
580
561
|
expect(cancelResp.status).toBe(200);
|
|
581
562
|
const body = (await cancelResp.json()) as Record<string, unknown>;
|
|
582
563
|
expect(body.success).toBe(true);
|
|
@@ -588,19 +569,19 @@ describe("HTTP route: handleCancelOutbound", () => {
|
|
|
588
569
|
// ===========================================================================
|
|
589
570
|
|
|
590
571
|
describe("origin conversation linkage", () => {
|
|
591
|
-
test("startOutbound
|
|
572
|
+
test("startOutbound voice echoes originConversationId in result (first number)", async () => {
|
|
592
573
|
const result = await startOutbound({
|
|
593
|
-
channel: "
|
|
574
|
+
channel: "phone",
|
|
594
575
|
destination: "+15551119999",
|
|
595
|
-
originConversationId: "conv-origin-
|
|
576
|
+
originConversationId: "conv-origin-voice-test-1",
|
|
596
577
|
});
|
|
597
578
|
expect(result.success).toBe(true);
|
|
598
|
-
expect(result.originConversationId).toBe("conv-origin-
|
|
579
|
+
expect(result.originConversationId).toBe("conv-origin-voice-test-1");
|
|
599
580
|
});
|
|
600
581
|
|
|
601
|
-
test("startOutbound voice echoes originConversationId in result", async () => {
|
|
582
|
+
test("startOutbound voice echoes originConversationId in result (second number)", async () => {
|
|
602
583
|
const result = await startOutbound({
|
|
603
|
-
channel: "
|
|
584
|
+
channel: "phone",
|
|
604
585
|
destination: "+15552229999",
|
|
605
586
|
originConversationId: "conv-origin-voice-test",
|
|
606
587
|
});
|
|
@@ -620,20 +601,20 @@ describe("origin conversation linkage", () => {
|
|
|
620
601
|
|
|
621
602
|
test("startOutbound without originConversationId returns undefined for field", async () => {
|
|
622
603
|
const result = await startOutbound({
|
|
623
|
-
channel: "
|
|
604
|
+
channel: "phone",
|
|
624
605
|
destination: "+15553338888",
|
|
625
606
|
});
|
|
626
607
|
expect(result.success).toBe(true);
|
|
627
608
|
expect(result.originConversationId).toBeUndefined();
|
|
628
609
|
});
|
|
629
610
|
|
|
630
|
-
test("HTTP
|
|
611
|
+
test("HTTP handleCreateVerificationSession passes originConversationId through", async () => {
|
|
631
612
|
const req = jsonRequest({
|
|
632
|
-
channel: "
|
|
613
|
+
channel: "phone",
|
|
633
614
|
destination: "+15557776666",
|
|
634
615
|
originConversationId: "conv-origin-http-test",
|
|
635
616
|
});
|
|
636
|
-
const resp = await
|
|
617
|
+
const resp = await handleCreateVerificationSession(req, "self");
|
|
637
618
|
expect(resp.status).toBe(200);
|
|
638
619
|
const body = (await resp.json()) as Record<string, unknown>;
|
|
639
620
|
expect(body.success).toBe(true);
|
|
@@ -642,7 +623,7 @@ describe("origin conversation linkage", () => {
|
|
|
642
623
|
|
|
643
624
|
test("voice call initiation receives originConversationId", async () => {
|
|
644
625
|
const result = await startOutbound({
|
|
645
|
-
channel: "
|
|
626
|
+
channel: "phone",
|
|
646
627
|
destination: "+15554443333",
|
|
647
628
|
originConversationId: "conv-origin-voice-init",
|
|
648
629
|
});
|
|
@@ -663,7 +644,7 @@ describe("origin conversation linkage", () => {
|
|
|
663
644
|
|
|
664
645
|
// Start a voice session (no origin initially)
|
|
665
646
|
const startResult = await startOutbound({
|
|
666
|
-
channel: "
|
|
647
|
+
channel: "phone",
|
|
667
648
|
destination: "+15552228888",
|
|
668
649
|
});
|
|
669
650
|
expect(startResult.success).toBe(true);
|
|
@@ -680,7 +661,7 @@ describe("origin conversation linkage", () => {
|
|
|
680
661
|
|
|
681
662
|
// Resend with origin conversation ID
|
|
682
663
|
const resendResult = resendOutbound({
|
|
683
|
-
channel: "
|
|
664
|
+
channel: "phone",
|
|
684
665
|
originConversationId: "conv-resend-origin-linkage",
|
|
685
666
|
});
|
|
686
667
|
expect(resendResult.success).toBe(true);
|