@vellumai/assistant 0.4.42 → 0.4.44
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 +140 -403
- package/Dockerfile +0 -1
- package/README.md +81 -92
- package/bun.lock +8 -2
- package/docs/architecture/integrations.md +81 -104
- 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 -3
- 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-asset.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 +41 -35
- 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 +7 -7
- 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 +10 -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__/error-handler-friendly-messages.test.ts +46 -0
- 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__/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 +357 -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 -12
- 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__/provider-fail-open-selection.test.ts +12 -2
- 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 -4
- 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 +17 -49
- 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 +10 -20
- 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 +7 -12
- 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 +48 -399
- 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 +475 -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/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} +14 -54
- package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
- package/src/cli/commands/amazon/session.ts +108 -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} +15 -17
- 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/cli/commands/twitter/__tests__/cli-read-routing.test.ts +345 -0
- package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +252 -0
- package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -48
- package/src/cli/commands/twitter/index.ts +420 -0
- package/src/{twitter → cli/commands/twitter}/oauth-client.ts +1 -35
- package/src/cli/commands/twitter/router.ts +351 -0
- package/src/cli/commands/twitter/types.ts +30 -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 -6
- package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +4 -9
- package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
- 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 +23 -77
- 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 -12
- package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -90
- package/src/config/bundled-skills/doordash/doordash-cli.ts +132 -109
- package/src/config/bundled-skills/doordash/lib/session.ts +22 -19
- 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 +73 -144
- 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 +8 -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 +196 -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 +151 -105
- 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 +155 -55
- package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
- package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -25
- 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 +30 -20
- 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 +7 -1
- package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
- package/src/daemon/{ipc-contract → message-types}/surfaces.ts +2 -0
- 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 +42 -14
- package/src/daemon/seed-files.ts +3 -27
- package/src/daemon/server.ts +134 -524
- package/src/daemon/session-agent-loop-handlers.ts +46 -9
- 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 -32
- package/src/daemon/session-surfaces.ts +187 -35
- package/src/daemon/session-tool-setup.ts +1 -1
- package/src/daemon/session-usage.ts +119 -18
- package/src/daemon/session.ts +11 -33
- 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 -60
- 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/schema/infrastructure.ts +0 -8
- 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 +9 -9
- 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 +44 -26
- package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -3
- package/src/providers/registry.ts +2 -4
- 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__/guard-tests.test.ts +1 -0
- package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
- package/src/runtime/auth/__tests__/scopes.test.ts +2 -1
- package/src/runtime/auth/__tests__/subject.test.ts +32 -0
- package/src/runtime/auth/route-policy.ts +137 -25
- package/src/runtime/auth/scopes.ts +1 -0
- package/src/runtime/auth/subject.ts +9 -0
- package/src/runtime/auth/token-service.ts +12 -1
- 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 +44 -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/error-handler.ts +14 -1
- 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 +918 -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/brain-graph/brain-graph.html +1845 -0
- package/src/runtime/routes/brain-graph-routes.ts +4 -42
- 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 +20 -24
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +890 -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 +887 -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/AGENTS.md +38 -0
- package/src/tools/apps/executors.ts +0 -6
- 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/document/editor-template.ts +10 -8
- 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 +408 -0
- package/src/usage/types.ts +21 -0
- package/src/util/canonicalize-identity.ts +2 -6
- package/src/util/errors.ts +12 -0
- 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__/home-base-bootstrap.test.ts +0 -86
- 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__/prebuilt-home-base-seed.test.ts +0 -79
- 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__/twitter-cli-error-shaping.test.ts +0 -224
- package/src/__tests__/twitter-cli-routing.test.ts +0 -286
- 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/cli/twitter.ts +0 -1111
- 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 -783
- 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/home-base/app-link-store.ts +0 -78
- package/src/home-base/bootstrap.ts +0 -74
- package/src/home-base/prebuilt/brain-graph.html +0 -1483
- package/src/home-base/prebuilt/index.html +0 -702
- package/src/home-base/prebuilt/seed-metadata.json +0 -21
- package/src/home-base/prebuilt/seed.ts +0 -122
- package/src/home-base/prebuilt-home-base-updater.ts +0 -36
- 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/client.ts +0 -979
- package/src/twitter/router.ts +0 -131
- package/src/twitter/session.ts +0 -54
- package/src/util/cookie-session.ts +0 -114
- 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/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}/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}/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/IDENTITY.md +0 -0
- /package/src/{config → prompts}/templates/SOUL.md +0 -0
- /package/src/{config → prompts}/templates/UPDATES.md +0 -0
- /package/src/{config → prompts}/templates/USER.md +0 -0
- /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
- /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
- /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
- /package/src/{config → prompts}/update-bulletin.ts +0 -0
- /package/src/{config → prompts}/user-reference.ts +0 -0
|
@@ -5,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);
|
|
@@ -87,10 +87,9 @@ describe("guardian-question-mode", () => {
|
|
|
87
87
|
|
|
88
88
|
expect(resolved.mode).toBe("answer");
|
|
89
89
|
expect(resolved.requestKind).toBe("pending_question");
|
|
90
|
-
expect(resolved.legacyFallbackUsed).toBe(false);
|
|
91
90
|
});
|
|
92
91
|
|
|
93
|
-
test("resolve mode
|
|
92
|
+
test("resolve mode defaults to approval when requestKind is missing", () => {
|
|
94
93
|
const resolved = resolveGuardianQuestionInstructionMode({
|
|
95
94
|
requestCode: "A1B2C3",
|
|
96
95
|
questionText: "Allow host bash?",
|
|
@@ -99,7 +98,6 @@ describe("guardian-question-mode", () => {
|
|
|
99
98
|
|
|
100
99
|
expect(resolved.mode).toBe("approval");
|
|
101
100
|
expect(resolved.requestKind).toBeNull();
|
|
102
|
-
expect(resolved.legacyFallbackUsed).toBe(true);
|
|
103
101
|
});
|
|
104
102
|
|
|
105
103
|
test("resolve mode treats pending_question with toolName as approval-mode", () => {
|
|
@@ -115,7 +113,6 @@ describe("guardian-question-mode", () => {
|
|
|
115
113
|
|
|
116
114
|
expect(resolved.mode).toBe("approval");
|
|
117
115
|
expect(resolved.requestKind).toBe("pending_question");
|
|
118
|
-
expect(resolved.legacyFallbackUsed).toBe(false);
|
|
119
116
|
});
|
|
120
117
|
|
|
121
118
|
test("resolveGuardianInstructionModeFromFields returns null for unknown request kind", () => {
|
|
@@ -36,8 +36,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
36
36
|
getDbPath: () => join(testDir, "test.db"),
|
|
37
37
|
getLogPath: () => join(testDir, "test.log"),
|
|
38
38
|
ensureDataDir: () => {},
|
|
39
|
-
migrateToDataLayout: () => {},
|
|
40
|
-
migrateToWorkspaceLayout: () => {},
|
|
41
39
|
}));
|
|
42
40
|
|
|
43
41
|
mock.module("../util/logger.js", () => ({
|
|
@@ -178,7 +176,7 @@ describe("routing invariant: all decision paths reference applyCanonicalGuardian
|
|
|
178
176
|
path: string;
|
|
179
177
|
symbols: string[];
|
|
180
178
|
}> = [
|
|
181
|
-
// Inbound channel router (Telegram/
|
|
179
|
+
// Inbound channel router (Telegram/WhatsApp)
|
|
182
180
|
{
|
|
183
181
|
path: "runtime/guardian-reply-router.ts",
|
|
184
182
|
symbols: ["applyCanonicalGuardianDecision"],
|
|
@@ -189,12 +187,6 @@ describe("routing invariant: all decision paths reference applyCanonicalGuardian
|
|
|
189
187
|
path: "runtime/routes/guardian-action-routes.ts",
|
|
190
188
|
symbols: ["processGuardianDecision"],
|
|
191
189
|
},
|
|
192
|
-
// IPC handler (desktop socket clients) — uses processGuardianDecision
|
|
193
|
-
// which is a shared wrapper around applyCanonicalGuardianDecision
|
|
194
|
-
{
|
|
195
|
-
path: "daemon/handlers/guardian-actions.ts",
|
|
196
|
-
symbols: ["processGuardianDecision"],
|
|
197
|
-
},
|
|
198
190
|
// Shared service where processGuardianDecision is defined — must route
|
|
199
191
|
// through the canonical primitive to complete the chain:
|
|
200
192
|
// entrypoint → processGuardianDecision → applyCanonicalGuardianDecision
|
|
@@ -525,7 +517,7 @@ describe("routing invariant: code-only messages return clarification", () => {
|
|
|
525
517
|
const req = createCanonicalGuardianRequest({
|
|
526
518
|
kind: "pending_question",
|
|
527
519
|
sourceType: "voice",
|
|
528
|
-
sourceChannel: "
|
|
520
|
+
sourceChannel: "phone",
|
|
529
521
|
conversationId: "conv-1",
|
|
530
522
|
guardianExternalUserId: "guardian-1",
|
|
531
523
|
guardianPrincipalId: TEST_PRINCIPAL_ID,
|
|
@@ -559,7 +551,7 @@ describe("routing invariant: code-only messages return clarification", () => {
|
|
|
559
551
|
const req = createCanonicalGuardianRequest({
|
|
560
552
|
kind: "pending_question",
|
|
561
553
|
sourceType: "voice",
|
|
562
|
-
sourceChannel: "
|
|
554
|
+
sourceChannel: "phone",
|
|
563
555
|
conversationId: "conv-1",
|
|
564
556
|
guardianExternalUserId: "guardian-1",
|
|
565
557
|
guardianPrincipalId: TEST_PRINCIPAL_ID,
|
|
@@ -843,7 +835,7 @@ describe("routing invariant: disambiguation stays fail-closed", () => {
|
|
|
843
835
|
const answerRequest = createCanonicalGuardianRequest({
|
|
844
836
|
kind: "pending_question",
|
|
845
837
|
sourceType: "voice",
|
|
846
|
-
sourceChannel: "
|
|
838
|
+
sourceChannel: "phone",
|
|
847
839
|
conversationId: "conv-1",
|
|
848
840
|
guardianExternalUserId: "guardian-1",
|
|
849
841
|
guardianPrincipalId: TEST_PRINCIPAL_ID,
|
|
@@ -857,7 +849,7 @@ describe("routing invariant: disambiguation stays fail-closed", () => {
|
|
|
857
849
|
const approvalRequest = createCanonicalGuardianRequest({
|
|
858
850
|
kind: "pending_question",
|
|
859
851
|
sourceType: "voice",
|
|
860
|
-
sourceChannel: "
|
|
852
|
+
sourceChannel: "phone",
|
|
861
853
|
conversationId: "conv-1",
|
|
862
854
|
guardianExternalUserId: "guardian-1",
|
|
863
855
|
guardianPrincipalId: TEST_PRINCIPAL_ID,
|
|
@@ -40,8 +40,8 @@ mock.module("../security/secret-ingress.js", () => ({
|
|
|
40
40
|
import { upsertContact } from "../contacts/contact-store.js";
|
|
41
41
|
import { createGuardianBinding } from "../contacts/contacts-write.js";
|
|
42
42
|
import type { TrustContext } from "../daemon/session-runtime-assembly.js";
|
|
43
|
-
import * as channelDeliveryStore from "../memory/channel-delivery-store.js";
|
|
44
43
|
import { getDb, initializeDb, resetDb } from "../memory/db.js";
|
|
44
|
+
import * as deliveryCrud from "../memory/delivery-crud.js";
|
|
45
45
|
import { channelInboundEvents, messages } from "../memory/schema.js";
|
|
46
46
|
import { sweepFailedEvents } from "../runtime/channel-retry-sweep.js";
|
|
47
47
|
import { handleChannelInbound } from "../runtime/routes/channel-routes.js";
|
|
@@ -402,12 +402,12 @@ describe("channel-retry-sweep routing state", () => {
|
|
|
402
402
|
trustClass: "guardian" | "trusted_contact" | "unknown",
|
|
403
403
|
guardianExternalUserId?: string,
|
|
404
404
|
): string {
|
|
405
|
-
const inbound =
|
|
405
|
+
const inbound = deliveryCrud.recordInbound(
|
|
406
406
|
"telegram",
|
|
407
407
|
`chat-${trustClass}`,
|
|
408
408
|
`msg-${trustClass}-${Date.now()}`,
|
|
409
409
|
);
|
|
410
|
-
|
|
410
|
+
deliveryCrud.storePayload(inbound.eventId, {
|
|
411
411
|
content: "retry me",
|
|
412
412
|
sourceChannel: "telegram",
|
|
413
413
|
interface: "telegram",
|