@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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getTwilioPhoneNumberEnv } from "../config/env.js";
|
|
1
2
|
import { loadConfig } from "../config/loader.js";
|
|
2
3
|
import {
|
|
3
4
|
getPublicBaseUrl,
|
|
@@ -17,11 +18,35 @@ export interface TwilioConfig {
|
|
|
17
18
|
wssBaseUrl: string;
|
|
18
19
|
}
|
|
19
20
|
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the Twilio phone number using a unified fallback chain so that
|
|
23
|
+
* all callers (calls, SMS adapter, readiness checks, invite transports)
|
|
24
|
+
* agree on the same number.
|
|
25
|
+
*
|
|
26
|
+
* Resolution order:
|
|
27
|
+
* 1. TWILIO_PHONE_NUMBER env var
|
|
28
|
+
* 2. config.twilio?.phoneNumber
|
|
29
|
+
* 3. ""
|
|
30
|
+
*/
|
|
31
|
+
export function resolveTwilioPhoneNumber(): string {
|
|
32
|
+
const fromEnv = getTwilioPhoneNumberEnv();
|
|
33
|
+
if (fromEnv) return fromEnv;
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const config = loadConfig();
|
|
37
|
+
if (config.twilio?.phoneNumber) return config.twilio.phoneNumber;
|
|
38
|
+
} catch {
|
|
39
|
+
// Config may not be available yet during early startup
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return "";
|
|
43
|
+
}
|
|
44
|
+
|
|
20
45
|
export function getTwilioConfig(): TwilioConfig {
|
|
21
46
|
const config = loadConfig();
|
|
22
47
|
const accountSid = config.twilio?.accountSid || "";
|
|
23
|
-
const authToken = getSecureKey("credential:twilio:auth_token");
|
|
24
|
-
const phoneNumber =
|
|
48
|
+
const authToken = getSecureKey("credential:twilio:auth_token") || "";
|
|
49
|
+
const phoneNumber = resolveTwilioPhoneNumber();
|
|
25
50
|
const webhookBaseUrl = getPublicBaseUrl(config);
|
|
26
51
|
|
|
27
52
|
let wssBaseUrl: string;
|
|
@@ -33,7 +58,7 @@ export function getTwilioConfig(): TwilioConfig {
|
|
|
33
58
|
|
|
34
59
|
if (!accountSid || !authToken) {
|
|
35
60
|
throw new ConfigError(
|
|
36
|
-
"Twilio credentials not configured. Set twilio.accountSid via config and
|
|
61
|
+
"Twilio credentials not configured. Set twilio.accountSid via config and store auth token via credential store.",
|
|
37
62
|
);
|
|
38
63
|
}
|
|
39
64
|
if (!phoneNumber) {
|
|
@@ -16,7 +16,7 @@ const log = getLogger("twilio-provider");
|
|
|
16
16
|
* Twilio ConversationRelay voice provider.
|
|
17
17
|
*
|
|
18
18
|
* Uses the Twilio REST API directly via fetch() — no twilio npm package.
|
|
19
|
-
* Credentials are resolved lazily from
|
|
19
|
+
* Credentials are resolved lazily from config on each call.
|
|
20
20
|
*/
|
|
21
21
|
export class TwilioConversationRelayProvider implements VoiceProvider {
|
|
22
22
|
readonly name = "twilio";
|
|
@@ -275,12 +275,12 @@ export class TwilioConversationRelayProvider implements VoiceProvider {
|
|
|
275
275
|
// ── Webhook signature verification ──────────────────────────────────
|
|
276
276
|
|
|
277
277
|
/**
|
|
278
|
-
* Returns the Twilio auth token from the
|
|
279
|
-
*
|
|
280
|
-
*
|
|
278
|
+
* Returns the Twilio auth token from the credential store, or null if not configured.
|
|
279
|
+
* Exposed as a static method so callers (e.g. the HTTP server webhook
|
|
280
|
+
* middleware) can check availability independently.
|
|
281
281
|
*/
|
|
282
282
|
static getAuthToken(): string | null {
|
|
283
|
-
return getSecureKey("credential:twilio:auth_token")
|
|
283
|
+
return getSecureKey("credential:twilio:auth_token") || null;
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
/**
|
package/src/calls/twilio-rest.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Reusable Twilio REST API helpers.
|
|
3
3
|
*
|
|
4
4
|
* Provides low-level building blocks (auth header, base URL, credential
|
|
5
|
-
* resolution) shared across the voice provider
|
|
5
|
+
* resolution) shared across the voice provider and IPC
|
|
6
6
|
* config handler. Uses fetch() directly — no twilio npm package.
|
|
7
7
|
*/
|
|
8
8
|
|
|
@@ -15,27 +15,29 @@ export interface TwilioCredentials {
|
|
|
15
15
|
authToken: string;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
* Resolve the Twilio Account SID from config.
|
|
20
|
-
* Returns undefined if not found.
|
|
21
|
-
*/
|
|
18
|
+
/** Resolve the Twilio Account SID from config. */
|
|
22
19
|
function resolveAccountSid(): string | undefined {
|
|
23
20
|
try {
|
|
24
21
|
const config = loadConfig();
|
|
25
|
-
|
|
22
|
+
return config.twilio?.accountSid || undefined;
|
|
26
23
|
} catch {
|
|
27
24
|
// Config may not be available during early startup
|
|
25
|
+
return undefined;
|
|
28
26
|
}
|
|
29
|
-
return undefined;
|
|
30
27
|
}
|
|
31
28
|
|
|
32
|
-
/** Resolve Twilio
|
|
29
|
+
/** Resolve the Twilio Auth Token from the credential store. */
|
|
30
|
+
function resolveAuthToken(): string | undefined {
|
|
31
|
+
return getSecureKey("credential:twilio:auth_token") || undefined;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Resolve Twilio credentials from config (SID) and credential store (token). Throws if not configured. */
|
|
33
35
|
export function getTwilioCredentials(): TwilioCredentials {
|
|
34
36
|
const accountSid = resolveAccountSid();
|
|
35
|
-
const authToken =
|
|
37
|
+
const authToken = resolveAuthToken();
|
|
36
38
|
if (!accountSid || !authToken) {
|
|
37
39
|
throw new ConfigError(
|
|
38
|
-
"Twilio credentials not configured. Set twilio.accountSid via config and
|
|
40
|
+
"Twilio credentials not configured. Set twilio.accountSid via config and store auth token via credential store.",
|
|
39
41
|
);
|
|
40
42
|
}
|
|
41
43
|
return { accountSid, authToken };
|
|
@@ -43,9 +45,11 @@ export function getTwilioCredentials(): TwilioCredentials {
|
|
|
43
45
|
|
|
44
46
|
/** Check whether Twilio credentials are present (non-throwing). */
|
|
45
47
|
export function hasTwilioCredentials(): boolean {
|
|
46
|
-
|
|
47
|
-
!!resolveAccountSid() && !!
|
|
48
|
-
|
|
48
|
+
try {
|
|
49
|
+
return !!resolveAccountSid() && !!resolveAuthToken();
|
|
50
|
+
} catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
49
53
|
}
|
|
50
54
|
|
|
51
55
|
/** Build the HTTP Basic auth header for Twilio API requests. */
|
|
@@ -66,7 +70,7 @@ export function twilioBaseUrl(accountSid: string): string {
|
|
|
66
70
|
export interface TwilioPhoneNumber {
|
|
67
71
|
phoneNumber: string;
|
|
68
72
|
friendlyName: string;
|
|
69
|
-
capabilities: { voice: boolean
|
|
73
|
+
capabilities: { voice: boolean };
|
|
70
74
|
}
|
|
71
75
|
|
|
72
76
|
/** List incoming phone numbers owned by the account. */
|
|
@@ -95,21 +99,21 @@ export async function listIncomingPhoneNumbers(
|
|
|
95
99
|
incoming_phone_numbers: Array<{
|
|
96
100
|
phone_number: string;
|
|
97
101
|
friendly_name: string;
|
|
98
|
-
capabilities: { voice: boolean
|
|
102
|
+
capabilities: { voice: boolean };
|
|
99
103
|
}>;
|
|
100
104
|
};
|
|
101
105
|
|
|
102
106
|
return data.incoming_phone_numbers.map((n) => ({
|
|
103
107
|
phoneNumber: n.phone_number,
|
|
104
108
|
friendlyName: n.friendly_name,
|
|
105
|
-
capabilities: { voice: n.capabilities.voice
|
|
109
|
+
capabilities: { voice: n.capabilities.voice },
|
|
106
110
|
}));
|
|
107
111
|
}
|
|
108
112
|
|
|
109
113
|
export interface AvailablePhoneNumber {
|
|
110
114
|
phoneNumber: string;
|
|
111
115
|
friendlyName: string;
|
|
112
|
-
capabilities: { voice: boolean
|
|
116
|
+
capabilities: { voice: boolean };
|
|
113
117
|
}
|
|
114
118
|
|
|
115
119
|
/** Search for available phone numbers to purchase. */
|
|
@@ -148,14 +152,14 @@ export async function searchAvailableNumbers(
|
|
|
148
152
|
available_phone_numbers: Array<{
|
|
149
153
|
phone_number: string;
|
|
150
154
|
friendly_name: string;
|
|
151
|
-
capabilities: { voice: boolean
|
|
155
|
+
capabilities: { voice: boolean };
|
|
152
156
|
}>;
|
|
153
157
|
};
|
|
154
158
|
|
|
155
159
|
return data.available_phone_numbers.map((n) => ({
|
|
156
160
|
phoneNumber: n.phone_number,
|
|
157
161
|
friendlyName: n.friendly_name,
|
|
158
|
-
capabilities: { voice: n.capabilities.voice
|
|
162
|
+
capabilities: { voice: n.capabilities.voice },
|
|
159
163
|
}));
|
|
160
164
|
}
|
|
161
165
|
|
|
@@ -191,7 +195,7 @@ export async function provisionPhoneNumber(
|
|
|
191
195
|
const data = (await res.json()) as {
|
|
192
196
|
phone_number: string;
|
|
193
197
|
friendly_name: string;
|
|
194
|
-
capabilities: { voice: boolean
|
|
198
|
+
capabilities: { voice: boolean };
|
|
195
199
|
};
|
|
196
200
|
|
|
197
201
|
return {
|
|
@@ -199,7 +203,6 @@ export async function provisionPhoneNumber(
|
|
|
199
203
|
friendlyName: data.friendly_name,
|
|
200
204
|
capabilities: {
|
|
201
205
|
voice: data.capabilities.voice,
|
|
202
|
-
sms: data.capabilities.sms,
|
|
203
206
|
},
|
|
204
207
|
};
|
|
205
208
|
}
|
|
@@ -245,15 +248,13 @@ export async function fetchMessageStatus(
|
|
|
245
248
|
export interface WebhookUrls {
|
|
246
249
|
voiceUrl: string;
|
|
247
250
|
statusCallbackUrl: string;
|
|
248
|
-
smsUrl: string;
|
|
249
251
|
}
|
|
250
252
|
|
|
251
253
|
/**
|
|
252
254
|
* Update the webhook URLs on a Twilio IncomingPhoneNumber.
|
|
253
255
|
*
|
|
254
|
-
* Configures voice webhook
|
|
255
|
-
*
|
|
256
|
-
* gateway endpoints.
|
|
256
|
+
* Configures voice webhook and voice status callback so that Twilio
|
|
257
|
+
* routes inbound calls to the assistant's gateway endpoints.
|
|
257
258
|
*/
|
|
258
259
|
export async function updatePhoneNumberWebhooks(
|
|
259
260
|
accountSid: string,
|
|
@@ -303,8 +304,6 @@ export async function updatePhoneNumberWebhooks(
|
|
|
303
304
|
VoiceMethod: "POST",
|
|
304
305
|
StatusCallback: webhooks.statusCallbackUrl,
|
|
305
306
|
StatusCallbackMethod: "POST",
|
|
306
|
-
SmsUrl: webhooks.smsUrl,
|
|
307
|
-
SmsMethod: "POST",
|
|
308
307
|
});
|
|
309
308
|
|
|
310
309
|
const updateRes = await fetch(
|
|
@@ -27,7 +27,6 @@ import {
|
|
|
27
27
|
releaseCallbackClaim,
|
|
28
28
|
updateCallSession,
|
|
29
29
|
} from "./call-store.js";
|
|
30
|
-
import { getTwilioConfig } from "./twilio-config.js";
|
|
31
30
|
import type { CallStatus } from "./types.js";
|
|
32
31
|
import { resolveVoiceQualityProfile } from "./voice-quality.js";
|
|
33
32
|
|
|
@@ -115,22 +114,6 @@ export function buildWelcomeGreeting(
|
|
|
115
114
|
return "";
|
|
116
115
|
}
|
|
117
116
|
|
|
118
|
-
/**
|
|
119
|
-
* Resolve the WebSocket relay URL from Twilio config.
|
|
120
|
-
*
|
|
121
|
-
* Treats wssBaseUrl as present only when it is non-empty after trimming.
|
|
122
|
-
* Falls back to webhookBaseUrl, normalizing the scheme from http(s) to ws(s)
|
|
123
|
-
* and stripping any trailing slash.
|
|
124
|
-
*/
|
|
125
|
-
export function resolveRelayUrl(
|
|
126
|
-
wssBaseUrl: string,
|
|
127
|
-
webhookBaseUrl: string,
|
|
128
|
-
): string {
|
|
129
|
-
const base = wssBaseUrl.trim() || webhookBaseUrl;
|
|
130
|
-
const normalized = base.replace(/\/$/, "").replace(/^http(s?)/, "ws$1");
|
|
131
|
-
return `${normalized}/v1/calls/relay`;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
117
|
/**
|
|
135
118
|
* Map Twilio call status strings to our internal CallStatus.
|
|
136
119
|
*/
|
|
@@ -198,7 +181,7 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
|
|
|
198
181
|
return buildVoiceWebhookTwiml(
|
|
199
182
|
session.id,
|
|
200
183
|
session.task,
|
|
201
|
-
session.
|
|
184
|
+
session.verificationSessionId,
|
|
202
185
|
);
|
|
203
186
|
}
|
|
204
187
|
|
|
@@ -226,7 +209,7 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
|
|
|
226
209
|
return buildVoiceWebhookTwiml(
|
|
227
210
|
callSessionId,
|
|
228
211
|
session.task,
|
|
229
|
-
session.
|
|
212
|
+
session.verificationSessionId,
|
|
230
213
|
);
|
|
231
214
|
}
|
|
232
215
|
|
|
@@ -235,7 +218,7 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
|
|
|
235
218
|
* Resolves voice quality profile, relay URL, and welcome greeting,
|
|
236
219
|
* then returns a Response with the generated TwiML.
|
|
237
220
|
*
|
|
238
|
-
* When `
|
|
221
|
+
* When `verificationSessionId` is provided, it is included as a
|
|
239
222
|
* `<Parameter>` in the TwiML for observability and compatibility with
|
|
240
223
|
* the Twilio setup payload. The persisted call session mode is the
|
|
241
224
|
* primary signal for deterministic flow selection in the relay server.
|
|
@@ -243,7 +226,7 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
|
|
|
243
226
|
function buildVoiceWebhookTwiml(
|
|
244
227
|
callSessionId: string,
|
|
245
228
|
task: string | null,
|
|
246
|
-
|
|
229
|
+
verificationSessionId?: string | null,
|
|
247
230
|
): Response {
|
|
248
231
|
const profile = resolveVoiceQualityProfile(loadConfig());
|
|
249
232
|
|
|
@@ -252,28 +235,16 @@ function buildVoiceWebhookTwiml(
|
|
|
252
235
|
"Voice quality profile resolved",
|
|
253
236
|
);
|
|
254
237
|
|
|
255
|
-
const
|
|
256
|
-
let relayUrl: string;
|
|
257
|
-
try {
|
|
258
|
-
relayUrl = getTwilioRelayUrl(loadConfig());
|
|
259
|
-
} catch {
|
|
260
|
-
// Fallback to legacy resolution when ingress is not configured
|
|
261
|
-
relayUrl = resolveRelayUrl(
|
|
262
|
-
twilioConfig.wssBaseUrl,
|
|
263
|
-
twilioConfig.webhookBaseUrl,
|
|
264
|
-
);
|
|
265
|
-
}
|
|
238
|
+
const relayUrl = getTwilioRelayUrl(loadConfig());
|
|
266
239
|
const welcomeGreeting = buildWelcomeGreeting(task, getCallWelcomeGreeting());
|
|
267
240
|
|
|
268
241
|
const relayToken = mintEdgeRelayToken();
|
|
269
242
|
|
|
270
|
-
// Propagate
|
|
243
|
+
// Propagate verificationSessionId as a TwiML <Parameter> for
|
|
271
244
|
// observability. This is not the sole source of truth; the relay
|
|
272
245
|
// server reads the persisted call_mode from the call session first.
|
|
273
246
|
const customParameters: Record<string, string> | undefined =
|
|
274
|
-
|
|
275
|
-
? { guardianVerificationSessionId }
|
|
276
|
-
: undefined;
|
|
247
|
+
verificationSessionId ? { verificationSessionId } : undefined;
|
|
277
248
|
|
|
278
249
|
const twiml = generateTwiML(
|
|
279
250
|
callSessionId,
|
|
@@ -348,6 +319,7 @@ export async function handleStatusCallback(req: Request): Promise<Response> {
|
|
|
348
319
|
return new Response(null, { status: 200 });
|
|
349
320
|
}
|
|
350
321
|
|
|
322
|
+
let eventPersisted = false;
|
|
351
323
|
try {
|
|
352
324
|
const wasTerminal = isTerminalState(session.status);
|
|
353
325
|
|
|
@@ -366,9 +338,6 @@ export async function handleStatusCallback(req: Request): Promise<Response> {
|
|
|
366
338
|
updates.endedAt = Date.now();
|
|
367
339
|
}
|
|
368
340
|
|
|
369
|
-
updateCallSession(session.id, updates);
|
|
370
|
-
|
|
371
|
-
// Record event
|
|
372
341
|
const eventType = isTerminal
|
|
373
342
|
? mappedStatus === "completed"
|
|
374
343
|
? "call_ended"
|
|
@@ -377,18 +346,32 @@ export async function handleStatusCallback(req: Request): Promise<Response> {
|
|
|
377
346
|
? "call_connected"
|
|
378
347
|
: "call_started";
|
|
379
348
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
349
|
+
// Record event after DB update but before lease sync: avoids duplicate
|
|
350
|
+
// events on retry (if update fails we never record), while ensuring the
|
|
351
|
+
// lease is only released after persistence so vellum sleep doesn't proceed
|
|
352
|
+
// before the call is fully recorded.
|
|
353
|
+
updateCallSession(session.id, updates, {
|
|
354
|
+
beforeLeaseSync: () => {
|
|
355
|
+
recordCallEvent(session.id, eventType, {
|
|
356
|
+
twilioStatus: callStatus,
|
|
357
|
+
callSid,
|
|
358
|
+
});
|
|
359
|
+
eventPersisted = true;
|
|
360
|
+
},
|
|
383
361
|
});
|
|
384
362
|
|
|
385
|
-
//
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
if (
|
|
390
|
-
|
|
391
|
-
|
|
363
|
+
// Post-persistence processing is best-effort — failures must not
|
|
364
|
+
// propagate to the outer catch block, which would incorrectly treat
|
|
365
|
+
// them as lease-sync failures and finalize the dedupe claim.
|
|
366
|
+
try {
|
|
367
|
+
if (isTerminal) {
|
|
368
|
+
expirePendingQuestions(session.id);
|
|
369
|
+
|
|
370
|
+
if (!wasTerminal) {
|
|
371
|
+
persistCallCompletionMessage(
|
|
372
|
+
session.conversationId,
|
|
373
|
+
session.id,
|
|
374
|
+
).catch((err) => {
|
|
392
375
|
log.error(
|
|
393
376
|
{
|
|
394
377
|
err,
|
|
@@ -397,10 +380,15 @@ export async function handleStatusCallback(req: Request): Promise<Response> {
|
|
|
397
380
|
},
|
|
398
381
|
"Failed to persist call completion message",
|
|
399
382
|
);
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
|
|
383
|
+
});
|
|
384
|
+
fireCallCompletionNotifier(session.conversationId, session.id);
|
|
385
|
+
}
|
|
403
386
|
}
|
|
387
|
+
} catch (postErr) {
|
|
388
|
+
log.error(
|
|
389
|
+
{ err: postErr, callSid, callStatus, callSessionId: session.id },
|
|
390
|
+
"Post-persistence processing failed — event and claim are intact, but side effects may be incomplete",
|
|
391
|
+
);
|
|
404
392
|
}
|
|
405
393
|
|
|
406
394
|
// Mark the claim as permanently processed so it never expires.
|
|
@@ -416,8 +404,33 @@ export async function handleStatusCallback(req: Request): Promise<Response> {
|
|
|
416
404
|
);
|
|
417
405
|
}
|
|
418
406
|
} catch (err) {
|
|
419
|
-
|
|
420
|
-
|
|
407
|
+
if (eventPersisted) {
|
|
408
|
+
// Event already written — releasing the claim would let Twilio
|
|
409
|
+
// retries insert a duplicate event. Finalize instead so the
|
|
410
|
+
// dedupe guard blocks subsequent attempts.
|
|
411
|
+
try {
|
|
412
|
+
finalizeCallbackClaim(dedupeKey, claimId);
|
|
413
|
+
log.warn(
|
|
414
|
+
{ dedupeKey, claimId, callSid, callStatus, err },
|
|
415
|
+
"Post-persistence error — claim finalized to prevent duplicate events on retry",
|
|
416
|
+
);
|
|
417
|
+
} catch (finalizeErr) {
|
|
418
|
+
log.error(
|
|
419
|
+
{ dedupeKey, claimId, callSid, callStatus, finalizeErr },
|
|
420
|
+
"Failed to finalize claim after event persistence — original error will still be re-thrown",
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
} else {
|
|
424
|
+
// Nothing persisted yet — safe to release so retries can reprocess
|
|
425
|
+
try {
|
|
426
|
+
releaseCallbackClaim(dedupeKey, claimId);
|
|
427
|
+
} catch (releaseErr) {
|
|
428
|
+
log.error(
|
|
429
|
+
{ dedupeKey, claimId, callSid, callStatus, releaseErr },
|
|
430
|
+
"Failed to release claim — original error will still be re-thrown",
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
421
434
|
throw err;
|
|
422
435
|
}
|
|
423
436
|
|
package/src/calls/types.ts
CHANGED
|
@@ -19,12 +19,12 @@ export type CallEventType =
|
|
|
19
19
|
| "callee_verification_started"
|
|
20
20
|
| "callee_verification_succeeded"
|
|
21
21
|
| "callee_verification_failed"
|
|
22
|
-
| "
|
|
23
|
-
| "
|
|
24
|
-
| "
|
|
25
|
-
| "
|
|
26
|
-
| "
|
|
27
|
-
| "
|
|
22
|
+
| "voice_verification_started"
|
|
23
|
+
| "voice_verification_succeeded"
|
|
24
|
+
| "voice_verification_failed"
|
|
25
|
+
| "outbound_voice_verification_started"
|
|
26
|
+
| "outbound_voice_verification_succeeded"
|
|
27
|
+
| "outbound_voice_verification_failed"
|
|
28
28
|
| "guardian_consultation_timed_out"
|
|
29
29
|
| "guardian_unavailable_skipped"
|
|
30
30
|
| "guardian_consult_deferred"
|
|
@@ -58,7 +58,7 @@ export type PendingQuestionStatus =
|
|
|
58
58
|
* uses this as the primary signal for deterministic flow selection,
|
|
59
59
|
* with Twilio setup custom parameters as a secondary/observability signal.
|
|
60
60
|
*/
|
|
61
|
-
export type CallMode = "normal" | "
|
|
61
|
+
export type CallMode = "normal" | "verification";
|
|
62
62
|
|
|
63
63
|
export interface CallSession {
|
|
64
64
|
id: string;
|
|
@@ -70,7 +70,7 @@ export interface CallSession {
|
|
|
70
70
|
task: string | null;
|
|
71
71
|
status: CallStatus;
|
|
72
72
|
callMode: CallMode | null;
|
|
73
|
-
|
|
73
|
+
verificationSessionId: string | null;
|
|
74
74
|
callerIdentityMode: string | null;
|
|
75
75
|
callerIdentitySource: string | null;
|
|
76
76
|
initiatedFromConversationId?: string | null;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { loadConfig } from "../config/loader.js";
|
|
2
|
+
import type { AssistantConfig } from "../config/types.js";
|
|
3
|
+
import { shouldUsePlatformCallbacks } from "../inbound/platform-callback-registration.js";
|
|
4
|
+
import { getPublicBaseUrl } from "../inbound/public-ingress-urls.js";
|
|
5
|
+
|
|
6
|
+
const SERVICE_UNAVAILABLE_STATUS = 503 as const;
|
|
7
|
+
|
|
8
|
+
export interface VoiceIngressPreflightSuccess {
|
|
9
|
+
ok: true;
|
|
10
|
+
ingressConfig: AssistantConfig;
|
|
11
|
+
publicBaseUrl: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface VoiceIngressPreflightFailure {
|
|
15
|
+
ok: false;
|
|
16
|
+
error: string;
|
|
17
|
+
status: typeof SERVICE_UNAVAILABLE_STATUS;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type VoiceIngressPreflightResult =
|
|
21
|
+
| VoiceIngressPreflightSuccess
|
|
22
|
+
| VoiceIngressPreflightFailure;
|
|
23
|
+
|
|
24
|
+
function fail(error: string): VoiceIngressPreflightFailure {
|
|
25
|
+
return {
|
|
26
|
+
ok: false,
|
|
27
|
+
error,
|
|
28
|
+
status: SERVICE_UNAVAILABLE_STATUS,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function buildGatewayUnhealthyMessage(
|
|
33
|
+
target: string,
|
|
34
|
+
error: string | undefined,
|
|
35
|
+
afterRecoveryAttempt: boolean,
|
|
36
|
+
): string {
|
|
37
|
+
const detail = error ?? "Unknown gateway health check failure";
|
|
38
|
+
if (afterRecoveryAttempt) {
|
|
39
|
+
return `Voice callback gateway is still unhealthy at ${target} after a local recovery attempt: ${detail}`;
|
|
40
|
+
}
|
|
41
|
+
return `Voice callback gateway is unhealthy at ${target}: ${detail}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function preflightVoiceIngress(): Promise<VoiceIngressPreflightResult> {
|
|
45
|
+
const ingressConfig = loadConfig();
|
|
46
|
+
|
|
47
|
+
// Platform-callback deployments register routes with the platform and receive
|
|
48
|
+
// stable callback URLs. No public ingress URL or local gateway is involved.
|
|
49
|
+
if (shouldUsePlatformCallbacks()) {
|
|
50
|
+
return {
|
|
51
|
+
ok: true,
|
|
52
|
+
ingressConfig,
|
|
53
|
+
publicBaseUrl: "",
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let publicBaseUrl: string;
|
|
58
|
+
try {
|
|
59
|
+
publicBaseUrl = getPublicBaseUrl(ingressConfig);
|
|
60
|
+
} catch (err) {
|
|
61
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
62
|
+
return fail(
|
|
63
|
+
msg ||
|
|
64
|
+
"Outbound voice calls require public ingress to be enabled and a public base URL (ingress.publicBaseUrl or INGRESS_PUBLIC_BASE_URL).",
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const { ensureLocalGatewayReady, probeLocalGatewayHealth } =
|
|
69
|
+
await import("../runtime/local-gateway-health.js");
|
|
70
|
+
|
|
71
|
+
const initialHealth = await probeLocalGatewayHealth();
|
|
72
|
+
if (!initialHealth.healthy && !initialHealth.localDeployment) {
|
|
73
|
+
return fail(
|
|
74
|
+
buildGatewayUnhealthyMessage(
|
|
75
|
+
initialHealth.target,
|
|
76
|
+
initialHealth.error,
|
|
77
|
+
false,
|
|
78
|
+
),
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (initialHealth.localDeployment) {
|
|
83
|
+
const recovery = await ensureLocalGatewayReady();
|
|
84
|
+
// Re-probe after the wake flow so the dial path only continues when the
|
|
85
|
+
// current gateway process is demonstrably serving the callback stack.
|
|
86
|
+
const confirmedHealth = await probeLocalGatewayHealth();
|
|
87
|
+
if (!confirmedHealth.healthy) {
|
|
88
|
+
return fail(
|
|
89
|
+
buildGatewayUnhealthyMessage(
|
|
90
|
+
confirmedHealth.target,
|
|
91
|
+
confirmedHealth.error ?? recovery.error,
|
|
92
|
+
recovery.recoveryAttempted,
|
|
93
|
+
),
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
ok: true,
|
|
100
|
+
ingressConfig: {
|
|
101
|
+
...ingressConfig,
|
|
102
|
+
ingress: {
|
|
103
|
+
...(ingressConfig.ingress ?? {}),
|
|
104
|
+
enabled: true,
|
|
105
|
+
publicBaseUrl,
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
publicBaseUrl,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { consumeGrantForInvocation } from "../approvals/approval-primitive.js";
|
|
14
14
|
import type { ChannelId } from "../channels/types.js";
|
|
15
15
|
import { getConfig } from "../config/loader.js";
|
|
16
|
-
import type { ServerMessage } from "../daemon/
|
|
16
|
+
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
17
17
|
import type { Session } from "../daemon/session.js";
|
|
18
18
|
import type { TrustContext } from "../daemon/session-runtime-assembly.js";
|
|
19
19
|
import { resolveChannelCapabilities } from "../daemon/session-runtime-assembly.js";
|
|
@@ -219,7 +219,7 @@ function buildVoiceCallControlPrompt(opts: {
|
|
|
219
219
|
* Execute a single voice turn through the daemon session pipeline.
|
|
220
220
|
*
|
|
221
221
|
* Manages the session directly with voice-specific defaults:
|
|
222
|
-
* - sourceChannel: '
|
|
222
|
+
* - sourceChannel: 'phone'
|
|
223
223
|
* - event sink wired to the provided callbacks
|
|
224
224
|
* - abort propagated from the returned handle
|
|
225
225
|
*
|
|
@@ -283,7 +283,7 @@ export async function startVoiceTurn(
|
|
|
283
283
|
|
|
284
284
|
// Get or create the session
|
|
285
285
|
const transport = {
|
|
286
|
-
channelId: "
|
|
286
|
+
channelId: "phone" as ChannelId,
|
|
287
287
|
};
|
|
288
288
|
const session = await deps.getOrCreateSession(opts.conversationId, transport);
|
|
289
289
|
|
|
@@ -321,11 +321,11 @@ export async function startVoiceTurn(
|
|
|
321
321
|
session.setTrustContext(opts.trustContext ?? null);
|
|
322
322
|
session.setCommandIntent(null);
|
|
323
323
|
session.setTurnChannelContext({
|
|
324
|
-
userMessageChannel: "
|
|
325
|
-
assistantMessageChannel: "
|
|
324
|
+
userMessageChannel: "phone",
|
|
325
|
+
assistantMessageChannel: "phone",
|
|
326
326
|
});
|
|
327
327
|
session.setChannelCapabilities(
|
|
328
|
-
resolveChannelCapabilities("
|
|
328
|
+
resolveChannelCapabilities("phone", undefined),
|
|
329
329
|
);
|
|
330
330
|
session.setVoiceCallControlPrompt(voiceCallControlPrompt);
|
|
331
331
|
|
|
@@ -392,7 +392,7 @@ export async function startVoiceTurn(
|
|
|
392
392
|
toolName: msg.toolName,
|
|
393
393
|
inputDigest,
|
|
394
394
|
consumingRequestId: msg.requestId,
|
|
395
|
-
executionChannel: "
|
|
395
|
+
executionChannel: "phone",
|
|
396
396
|
conversationId: opts.conversationId,
|
|
397
397
|
callSessionId: opts.callSessionId,
|
|
398
398
|
requesterExternalUserId:
|
package/src/channels/config.ts
CHANGED
|
@@ -45,15 +45,6 @@ const CHANNEL_POLICIES = {
|
|
|
45
45
|
codeRedemptionEnabled: true,
|
|
46
46
|
},
|
|
47
47
|
},
|
|
48
|
-
sms: {
|
|
49
|
-
notification: {
|
|
50
|
-
deliveryEnabled: true,
|
|
51
|
-
conversationStrategy: "continue_existing_conversation",
|
|
52
|
-
},
|
|
53
|
-
invite: {
|
|
54
|
-
codeRedemptionEnabled: true,
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
48
|
whatsapp: {
|
|
58
49
|
notification: {
|
|
59
50
|
deliveryEnabled: false,
|
|
@@ -81,7 +72,7 @@ const CHANNEL_POLICIES = {
|
|
|
81
72
|
codeRedemptionEnabled: true,
|
|
82
73
|
},
|
|
83
74
|
},
|
|
84
|
-
|
|
75
|
+
phone: {
|
|
85
76
|
notification: {
|
|
86
77
|
deliveryEnabled: false,
|
|
87
78
|
conversationStrategy: "not_deliverable",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* Each entry maps a channel ID to a ChannelPermissionProfile.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import { getConfig, saveConfig } from "
|
|
14
|
+
import { getConfig, saveConfig } from "../config/loader.js";
|
|
15
15
|
|
|
16
16
|
// ── Types ───────────────────────────────────────────────────────────
|
|
17
17
|
|