@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,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { resolveVerificationSessionIntent } from "../daemon/verification-session-intent.js";
|
|
4
4
|
|
|
5
5
|
// =====================================================================
|
|
6
6
|
// 1. Direct guardian setup phrases => forced skill flow
|
|
@@ -30,7 +30,7 @@ describe("direct guardian setup phrases trigger forced routing", () => {
|
|
|
30
30
|
|
|
31
31
|
for (const phrase of directSetupPhrases) {
|
|
32
32
|
test(`"${phrase}" => direct_setup`, () => {
|
|
33
|
-
const result =
|
|
33
|
+
const result = resolveVerificationSessionIntent(phrase);
|
|
34
34
|
expect(result.kind).toBe("direct_setup");
|
|
35
35
|
if (result.kind === "direct_setup") {
|
|
36
36
|
expect(result.rewrittenContent).toContain("guardian-verify-setup");
|
|
@@ -62,7 +62,7 @@ describe("conceptual questions do NOT trigger forced routing", () => {
|
|
|
62
62
|
|
|
63
63
|
for (const phrase of conceptualPhrases) {
|
|
64
64
|
test(`"${phrase}" => none`, () => {
|
|
65
|
-
const result =
|
|
65
|
+
const result = resolveVerificationSessionIntent(phrase);
|
|
66
66
|
expect(result.kind).toBe("none");
|
|
67
67
|
});
|
|
68
68
|
}
|
|
@@ -88,7 +88,7 @@ describe("non-guardian messages are not intercepted", () => {
|
|
|
88
88
|
|
|
89
89
|
for (const phrase of unrelatedPhrases) {
|
|
90
90
|
test(`"${phrase}" => none`, () => {
|
|
91
|
-
const result =
|
|
91
|
+
const result = resolveVerificationSessionIntent(phrase);
|
|
92
92
|
expect(result.kind).toBe("none");
|
|
93
93
|
});
|
|
94
94
|
}
|
|
@@ -108,7 +108,7 @@ describe("ambiguous verify phrases without guardian context do NOT trigger force
|
|
|
108
108
|
|
|
109
109
|
for (const phrase of ambiguousPhrases) {
|
|
110
110
|
test(`"${phrase}" => none`, () => {
|
|
111
|
-
const result =
|
|
111
|
+
const result = resolveVerificationSessionIntent(phrase);
|
|
112
112
|
expect(result.kind).toBe("none");
|
|
113
113
|
});
|
|
114
114
|
}
|
|
@@ -128,7 +128,7 @@ describe("slash commands are never intercepted", () => {
|
|
|
128
128
|
|
|
129
129
|
for (const cmd of slashCommands) {
|
|
130
130
|
test(`"${cmd}" => none`, () => {
|
|
131
|
-
const result =
|
|
131
|
+
const result = resolveVerificationSessionIntent(cmd);
|
|
132
132
|
expect(result.kind).toBe("none");
|
|
133
133
|
});
|
|
134
134
|
}
|
|
@@ -139,31 +139,31 @@ describe("slash commands are never intercepted", () => {
|
|
|
139
139
|
// =====================================================================
|
|
140
140
|
|
|
141
141
|
describe("channel hint extraction", () => {
|
|
142
|
-
test("
|
|
143
|
-
const result =
|
|
144
|
-
"set me as guardian for
|
|
142
|
+
test("unsupported channel keyword triggers setup but yields no channel hint", () => {
|
|
143
|
+
const result = resolveVerificationSessionIntent(
|
|
144
|
+
"set me as guardian for text",
|
|
145
145
|
);
|
|
146
146
|
expect(result.kind).toBe("direct_setup");
|
|
147
147
|
if (result.kind === "direct_setup") {
|
|
148
|
-
//
|
|
149
|
-
//
|
|
148
|
+
// "text" matches the guardian setup pattern but is not a supported
|
|
149
|
+
// channel, so no channel hint is extracted.
|
|
150
150
|
expect(result.channelHint).toBeUndefined();
|
|
151
151
|
}
|
|
152
152
|
});
|
|
153
153
|
|
|
154
154
|
test("detects voice channel hint", () => {
|
|
155
|
-
const result =
|
|
155
|
+
const result = resolveVerificationSessionIntent(
|
|
156
156
|
"set me as guardian for voice",
|
|
157
157
|
);
|
|
158
158
|
expect(result.kind).toBe("direct_setup");
|
|
159
159
|
if (result.kind === "direct_setup") {
|
|
160
|
-
expect(result.channelHint).toBe("
|
|
161
|
-
expect(result.rewrittenContent).toContain("
|
|
160
|
+
expect(result.channelHint).toBe("phone");
|
|
161
|
+
expect(result.rewrittenContent).toContain("phone channel");
|
|
162
162
|
}
|
|
163
163
|
});
|
|
164
164
|
|
|
165
165
|
test("detects Telegram channel hint", () => {
|
|
166
|
-
const result =
|
|
166
|
+
const result = resolveVerificationSessionIntent(
|
|
167
167
|
"set me as guardian for telegram",
|
|
168
168
|
);
|
|
169
169
|
expect(result.kind).toBe("direct_setup");
|
|
@@ -174,7 +174,7 @@ describe("channel hint extraction", () => {
|
|
|
174
174
|
});
|
|
175
175
|
|
|
176
176
|
test("no channel hint when unspecified", () => {
|
|
177
|
-
const result =
|
|
177
|
+
const result = resolveVerificationSessionIntent("verify me as guardian");
|
|
178
178
|
expect(result.kind).toBe("direct_setup");
|
|
179
179
|
if (result.kind === "direct_setup") {
|
|
180
180
|
expect(result.channelHint).toBeUndefined();
|
|
@@ -22,8 +22,6 @@ mock.module("../util/platform.js", () => ({
|
|
|
22
22
|
getDbPath: () => join(testDir, "test.db"),
|
|
23
23
|
getLogPath: () => join(testDir, "test.log"),
|
|
24
24
|
ensureDataDir: () => {},
|
|
25
|
-
migrateToDataLayout: () => {},
|
|
26
|
-
migrateToWorkspaceLayout: () => {},
|
|
27
25
|
}));
|
|
28
26
|
|
|
29
27
|
mock.module("../util/logger.js", () => ({
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
let mockLoadConfig: () => unknown;
|
|
4
|
+
let mockShouldUsePlatformCallbacks: () => boolean;
|
|
5
|
+
|
|
6
|
+
mock.module("../config/loader.js", () => ({
|
|
7
|
+
loadConfig: () => mockLoadConfig(),
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
mock.module("../inbound/platform-callback-registration.js", () => ({
|
|
11
|
+
shouldUsePlatformCallbacks: () => mockShouldUsePlatformCallbacks(),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
import { preflightVoiceIngress } from "../calls/voice-ingress-preflight.js";
|
|
15
|
+
|
|
16
|
+
describe("voice ingress preflight", () => {
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
mockLoadConfig = () => ({
|
|
19
|
+
ingress: { enabled: true, publicBaseUrl: "https://example.com" },
|
|
20
|
+
});
|
|
21
|
+
mockShouldUsePlatformCallbacks = () => false;
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("returns success immediately for platform-callback deployments", async () => {
|
|
25
|
+
mockShouldUsePlatformCallbacks = () => true;
|
|
26
|
+
mockLoadConfig = () => ({ ingress: { enabled: false } });
|
|
27
|
+
|
|
28
|
+
const result = await preflightVoiceIngress();
|
|
29
|
+
|
|
30
|
+
expect(result.ok).toBe(true);
|
|
31
|
+
if (result.ok) {
|
|
32
|
+
expect(result.publicBaseUrl).toBe("");
|
|
33
|
+
expect(result.ingressConfig.ingress?.enabled).toBe(false);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -148,7 +148,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
148
148
|
const codeHash = hashVoiceCode(code);
|
|
149
149
|
|
|
150
150
|
const { invite } = createInvite({
|
|
151
|
-
sourceChannel: "
|
|
151
|
+
sourceChannel: "phone",
|
|
152
152
|
maxUses: opts.maxUses ?? 1,
|
|
153
153
|
expiresInMs: opts.expiresInMs,
|
|
154
154
|
expectedExternalUserId: opts.callerPhone ?? "+15551234567",
|
|
@@ -165,7 +165,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
165
165
|
|
|
166
166
|
const result = redeemVoiceInviteCode({
|
|
167
167
|
callerExternalUserId: phone,
|
|
168
|
-
sourceChannel: "
|
|
168
|
+
sourceChannel: "phone",
|
|
169
169
|
code,
|
|
170
170
|
});
|
|
171
171
|
|
|
@@ -184,14 +184,14 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
184
184
|
|
|
185
185
|
const result = redeemVoiceInviteCode({
|
|
186
186
|
callerExternalUserId: phone,
|
|
187
|
-
sourceChannel: "
|
|
187
|
+
sourceChannel: "phone",
|
|
188
188
|
code,
|
|
189
189
|
});
|
|
190
190
|
|
|
191
191
|
expect(result.ok).toBe(true);
|
|
192
192
|
|
|
193
193
|
const channelResult = findContactChannel({
|
|
194
|
-
channelType: "
|
|
194
|
+
channelType: "phone",
|
|
195
195
|
externalUserId: phone,
|
|
196
196
|
});
|
|
197
197
|
|
|
@@ -206,7 +206,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
206
206
|
|
|
207
207
|
const result = redeemVoiceInviteCode({
|
|
208
208
|
callerExternalUserId: "+19999999999",
|
|
209
|
-
sourceChannel: "
|
|
209
|
+
sourceChannel: "phone",
|
|
210
210
|
code,
|
|
211
211
|
});
|
|
212
212
|
|
|
@@ -218,7 +218,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
218
218
|
|
|
219
219
|
const result = redeemVoiceInviteCode({
|
|
220
220
|
callerExternalUserId: "+15551234567",
|
|
221
|
-
sourceChannel: "
|
|
221
|
+
sourceChannel: "phone",
|
|
222
222
|
code: "000000",
|
|
223
223
|
});
|
|
224
224
|
|
|
@@ -231,7 +231,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
231
231
|
|
|
232
232
|
const result = redeemVoiceInviteCode({
|
|
233
233
|
callerExternalUserId: phone,
|
|
234
|
-
sourceChannel: "
|
|
234
|
+
sourceChannel: "phone",
|
|
235
235
|
code,
|
|
236
236
|
});
|
|
237
237
|
|
|
@@ -245,7 +245,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
245
245
|
// First redemption succeeds
|
|
246
246
|
const first = redeemVoiceInviteCode({
|
|
247
247
|
callerExternalUserId: phone,
|
|
248
|
-
sourceChannel: "
|
|
248
|
+
sourceChannel: "phone",
|
|
249
249
|
code,
|
|
250
250
|
});
|
|
251
251
|
expect(first.ok).toBe(true);
|
|
@@ -253,7 +253,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
253
253
|
// Second redemption fails — max uses exhausted
|
|
254
254
|
const second = redeemVoiceInviteCode({
|
|
255
255
|
callerExternalUserId: phone,
|
|
256
|
-
sourceChannel: "
|
|
256
|
+
sourceChannel: "phone",
|
|
257
257
|
code,
|
|
258
258
|
});
|
|
259
259
|
expect(second).toEqual({ ok: false, reason: "invalid_or_expired" });
|
|
@@ -267,7 +267,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
267
267
|
|
|
268
268
|
const result = redeemVoiceInviteCode({
|
|
269
269
|
callerExternalUserId: phone,
|
|
270
|
-
sourceChannel: "
|
|
270
|
+
sourceChannel: "phone",
|
|
271
271
|
code,
|
|
272
272
|
});
|
|
273
273
|
|
|
@@ -277,7 +277,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
277
277
|
test("voice-only invite cannot be redeemed if sourceChannel on invite is not voice", () => {
|
|
278
278
|
// Create a non-voice invite with voice code metadata to simulate a
|
|
279
279
|
// hypothetical misconfiguration. The redemption service filters by
|
|
280
|
-
// sourceChannel='
|
|
280
|
+
// sourceChannel='phone', so non-phone invites are invisible.
|
|
281
281
|
const code = generateVoiceCode(6);
|
|
282
282
|
const codeHash = hashVoiceCode(code);
|
|
283
283
|
|
|
@@ -291,11 +291,11 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
291
291
|
|
|
292
292
|
const result = redeemVoiceInviteCode({
|
|
293
293
|
callerExternalUserId: "+15551234567",
|
|
294
|
-
sourceChannel: "
|
|
294
|
+
sourceChannel: "phone",
|
|
295
295
|
code,
|
|
296
296
|
});
|
|
297
297
|
|
|
298
|
-
// findActiveVoiceInvites filters by sourceChannel='
|
|
298
|
+
// findActiveVoiceInvites filters by sourceChannel='phone', so the
|
|
299
299
|
// telegram invite won't be found.
|
|
300
300
|
expect(result).toEqual({ ok: false, reason: "invalid_or_expired" });
|
|
301
301
|
});
|
|
@@ -306,7 +306,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
306
306
|
|
|
307
307
|
// Pre-create an active member for this phone on voice channel
|
|
308
308
|
upsertContactChannel({
|
|
309
|
-
sourceChannel: "
|
|
309
|
+
sourceChannel: "phone",
|
|
310
310
|
externalUserId: phone,
|
|
311
311
|
status: "active",
|
|
312
312
|
policy: "allow",
|
|
@@ -314,7 +314,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
314
314
|
|
|
315
315
|
const result = redeemVoiceInviteCode({
|
|
316
316
|
callerExternalUserId: phone,
|
|
317
|
-
sourceChannel: "
|
|
317
|
+
sourceChannel: "phone",
|
|
318
318
|
code,
|
|
319
319
|
});
|
|
320
320
|
|
|
@@ -331,7 +331,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
331
331
|
const { code } = createVoiceInvite({ callerPhone: phone });
|
|
332
332
|
|
|
333
333
|
upsertContactChannel({
|
|
334
|
-
sourceChannel: "
|
|
334
|
+
sourceChannel: "phone",
|
|
335
335
|
externalUserId: phone,
|
|
336
336
|
status: "blocked",
|
|
337
337
|
policy: "deny",
|
|
@@ -339,7 +339,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
339
339
|
|
|
340
340
|
const result = redeemVoiceInviteCode({
|
|
341
341
|
callerExternalUserId: phone,
|
|
342
|
-
sourceChannel: "
|
|
342
|
+
sourceChannel: "phone",
|
|
343
343
|
code,
|
|
344
344
|
});
|
|
345
345
|
|
|
@@ -349,7 +349,7 @@ describe("redeemVoiceInviteCode", () => {
|
|
|
349
349
|
test("empty callerExternalUserId fails", () => {
|
|
350
350
|
const result = redeemVoiceInviteCode({
|
|
351
351
|
callerExternalUserId: "",
|
|
352
|
-
sourceChannel: "
|
|
352
|
+
sourceChannel: "phone",
|
|
353
353
|
code: "123456",
|
|
354
354
|
});
|
|
355
355
|
|
|
@@ -109,7 +109,7 @@ import {
|
|
|
109
109
|
setVoiceBridgeDeps,
|
|
110
110
|
startVoiceTurn,
|
|
111
111
|
} from "../calls/voice-session-bridge.js";
|
|
112
|
-
import type { ServerMessage } from "../daemon/
|
|
112
|
+
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
113
113
|
import type { TrustContext } from "../daemon/session-runtime-assembly.js";
|
|
114
114
|
import { getDb, initializeDb, resetDb } from "../memory/db.js";
|
|
115
115
|
import { scopedApprovalGrants } from "../memory/schema.js";
|
|
@@ -257,9 +257,9 @@ function grantParams(
|
|
|
257
257
|
scopeMode: "tool_signature",
|
|
258
258
|
toolName: TOOL_NAME,
|
|
259
259
|
inputDigest: computeToolApprovalDigest(TOOL_NAME, TOOL_INPUT),
|
|
260
|
-
requestChannel: "
|
|
260
|
+
requestChannel: "phone",
|
|
261
261
|
decisionChannel: "telegram",
|
|
262
|
-
executionChannel: "
|
|
262
|
+
executionChannel: "phone",
|
|
263
263
|
conversationId: CONVERSATION_ID,
|
|
264
264
|
callSessionId: CALL_SESSION_ID,
|
|
265
265
|
expiresAt: futureExpiry,
|
|
@@ -285,7 +285,7 @@ describe("voice bridge confirmation handling (grant consumption via primitive)",
|
|
|
285
285
|
setupBridgeDeps(() => mockData.session);
|
|
286
286
|
|
|
287
287
|
const trustContext: TrustContext = {
|
|
288
|
-
sourceChannel: "
|
|
288
|
+
sourceChannel: "phone",
|
|
289
289
|
trustClass: "trusted_contact",
|
|
290
290
|
requesterExternalUserId: "caller-123",
|
|
291
291
|
};
|
|
@@ -329,7 +329,7 @@ describe("voice bridge confirmation handling (grant consumption via primitive)",
|
|
|
329
329
|
setupBridgeDeps(() => mockData.session);
|
|
330
330
|
|
|
331
331
|
const trustContext: TrustContext = {
|
|
332
|
-
sourceChannel: "
|
|
332
|
+
sourceChannel: "phone",
|
|
333
333
|
trustClass: "trusted_contact",
|
|
334
334
|
requesterExternalUserId: "caller-123",
|
|
335
335
|
};
|
|
@@ -367,7 +367,7 @@ describe("voice bridge confirmation handling (grant consumption via primitive)",
|
|
|
367
367
|
setupBridgeDeps(() => mockData.session);
|
|
368
368
|
|
|
369
369
|
const trustContext: TrustContext = {
|
|
370
|
-
sourceChannel: "
|
|
370
|
+
sourceChannel: "phone",
|
|
371
371
|
trustClass: "trusted_contact",
|
|
372
372
|
};
|
|
373
373
|
|
|
@@ -397,7 +397,7 @@ describe("voice bridge confirmation handling (grant consumption via primitive)",
|
|
|
397
397
|
setupBridgeDeps(() => mockData.session);
|
|
398
398
|
|
|
399
399
|
const trustContext: TrustContext = {
|
|
400
|
-
sourceChannel: "
|
|
400
|
+
sourceChannel: "phone",
|
|
401
401
|
trustClass: "guardian",
|
|
402
402
|
};
|
|
403
403
|
|
|
@@ -3,7 +3,7 @@ import { tmpdir } from "node:os";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
5
5
|
|
|
6
|
-
import type { ServerMessage } from "../daemon/
|
|
6
|
+
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
7
7
|
import type { Session } from "../daemon/session.js";
|
|
8
8
|
|
|
9
9
|
const testDir = mkdtempSync(join(tmpdir(), "voice-bridge-test-"));
|
|
@@ -48,7 +48,7 @@ import {
|
|
|
48
48
|
setVoiceBridgeDeps,
|
|
49
49
|
startVoiceTurn,
|
|
50
50
|
} from "../calls/voice-session-bridge.js";
|
|
51
|
-
import { createConversation } from "../memory/conversation-
|
|
51
|
+
import { createConversation } from "../memory/conversation-crud.js";
|
|
52
52
|
import { getDb, initializeDb, resetDb } from "../memory/db.js";
|
|
53
53
|
|
|
54
54
|
initializeDb();
|
|
@@ -323,8 +323,8 @@ describe("voice-session-bridge", () => {
|
|
|
323
323
|
await new Promise((r) => setTimeout(r, 50));
|
|
324
324
|
|
|
325
325
|
expect(capturedTurnChannelContext).toEqual({
|
|
326
|
-
userMessageChannel: "
|
|
327
|
-
assistantMessageChannel: "
|
|
326
|
+
userMessageChannel: "phone",
|
|
327
|
+
assistantMessageChannel: "phone",
|
|
328
328
|
});
|
|
329
329
|
});
|
|
330
330
|
|
|
@@ -358,7 +358,7 @@ describe("voice-session-bridge", () => {
|
|
|
358
358
|
content: "Hello",
|
|
359
359
|
isInbound: true,
|
|
360
360
|
trustContext: {
|
|
361
|
-
sourceChannel: "
|
|
361
|
+
sourceChannel: "phone",
|
|
362
362
|
trustClass: "trusted_contact",
|
|
363
363
|
guardianExternalUserId: "+15550009999",
|
|
364
364
|
guardianChatId: "+15550009999",
|
|
@@ -404,9 +404,8 @@ describe("voice-session-bridge", () => {
|
|
|
404
404
|
content: "Hello",
|
|
405
405
|
isInbound: true,
|
|
406
406
|
trustContext: {
|
|
407
|
-
sourceChannel: "
|
|
407
|
+
sourceChannel: "phone",
|
|
408
408
|
trustClass: "unknown",
|
|
409
|
-
denialReason: "no_binding",
|
|
410
409
|
},
|
|
411
410
|
onTextDelta: () => {},
|
|
412
411
|
onComplete: () => {},
|
|
@@ -448,7 +447,7 @@ describe("voice-session-bridge", () => {
|
|
|
448
447
|
content: "Hello",
|
|
449
448
|
isInbound: true,
|
|
450
449
|
trustContext: {
|
|
451
|
-
sourceChannel: "
|
|
450
|
+
sourceChannel: "phone",
|
|
452
451
|
trustClass: "guardian",
|
|
453
452
|
guardianExternalUserId: "+15550001111",
|
|
454
453
|
guardianChatId: "+15550001111",
|
|
@@ -483,7 +482,7 @@ describe("voice-session-bridge", () => {
|
|
|
483
482
|
injectDeps(() => session);
|
|
484
483
|
|
|
485
484
|
const trustCtx = {
|
|
486
|
-
sourceChannel: "
|
|
485
|
+
sourceChannel: "phone" as const,
|
|
487
486
|
trustClass: "guardian" as const,
|
|
488
487
|
guardianExternalUserId: "+15550001111",
|
|
489
488
|
guardianChatId: "+15550001111",
|
|
@@ -528,7 +527,7 @@ describe("voice-session-bridge", () => {
|
|
|
528
527
|
content: "Hello there",
|
|
529
528
|
isInbound: true,
|
|
530
529
|
trustContext: {
|
|
531
|
-
sourceChannel: "
|
|
530
|
+
sourceChannel: "phone",
|
|
532
531
|
trustClass: "trusted_contact",
|
|
533
532
|
},
|
|
534
533
|
onTextDelta: () => {},
|
|
@@ -588,7 +587,7 @@ describe("voice-session-bridge", () => {
|
|
|
588
587
|
content: "Hi",
|
|
589
588
|
isInbound: true,
|
|
590
589
|
trustContext: {
|
|
591
|
-
sourceChannel: "
|
|
590
|
+
sourceChannel: "phone",
|
|
592
591
|
trustClass: "trusted_contact",
|
|
593
592
|
},
|
|
594
593
|
onTextDelta: () => {},
|
|
@@ -676,7 +675,7 @@ describe("voice-session-bridge", () => {
|
|
|
676
675
|
content: "Delete everything",
|
|
677
676
|
isInbound: true,
|
|
678
677
|
trustContext: {
|
|
679
|
-
sourceChannel: "
|
|
678
|
+
sourceChannel: "phone",
|
|
680
679
|
trustClass: "trusted_contact",
|
|
681
680
|
guardianExternalUserId: "+15550009999",
|
|
682
681
|
guardianChatId: "+15550009999",
|
|
@@ -749,9 +748,8 @@ describe("voice-session-bridge", () => {
|
|
|
749
748
|
content: "Make a request",
|
|
750
749
|
isInbound: true,
|
|
751
750
|
trustContext: {
|
|
752
|
-
sourceChannel: "
|
|
751
|
+
sourceChannel: "phone",
|
|
753
752
|
trustClass: "unknown",
|
|
754
|
-
denialReason: "no_binding",
|
|
755
753
|
},
|
|
756
754
|
onTextDelta: () => {},
|
|
757
755
|
onComplete: () => {},
|
|
@@ -882,7 +880,7 @@ describe("voice-session-bridge", () => {
|
|
|
882
880
|
content: "List files",
|
|
883
881
|
isInbound: true,
|
|
884
882
|
trustContext: {
|
|
885
|
-
sourceChannel: "
|
|
883
|
+
sourceChannel: "phone",
|
|
886
884
|
trustClass: "guardian",
|
|
887
885
|
guardianExternalUserId: "+15550001111",
|
|
888
886
|
guardianChatId: "+15550001111",
|
|
@@ -955,7 +953,7 @@ describe("voice-session-bridge", () => {
|
|
|
955
953
|
content: "check github status",
|
|
956
954
|
isInbound: true,
|
|
957
955
|
trustContext: {
|
|
958
|
-
sourceChannel: "
|
|
956
|
+
sourceChannel: "phone",
|
|
959
957
|
trustClass: "guardian",
|
|
960
958
|
guardianExternalUserId: "+15550001111",
|
|
961
959
|
guardianChatId: "+15550001111",
|
package/src/approvals/AGENTS.md
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
## Approval Flow Resilience
|
|
4
4
|
|
|
5
|
-
- **Rich delivery failures must degrade gracefully.** If delivering a rich approval prompt (e.g., Telegram inline buttons) fails, fall back to plain text with
|
|
6
|
-
- **Non-rich channels** (SMS, http-api) receive plain-text approval prompts
|
|
5
|
+
- **Rich delivery failures must degrade gracefully.** If delivering a rich approval prompt (e.g., Telegram inline buttons) fails, fall back to plain text with instructions (e.g., `Reply "yes" to approve`) — never auto-deny.
|
|
6
|
+
- **Non-rich channels** (SMS, http-api) receive plain-text approval prompts. The conversational approval engine handles free-text responses.
|
|
7
7
|
- **Race conditions:** Always check whether a decision has already been resolved before delivering the engine's optimistic reply. If `handleChannelDecision` returns `applied: false`, deliver an "already resolved" notice and return `stale_ignored`.
|
|
8
8
|
- **Requester self-cancel:** A requester with a pending guardian approval must be able to cancel their own request (but not self-approve).
|
|
9
|
-
- **Unified guardian decision primitive:** All guardian decision paths (callback buttons, conversational engine,
|
|
9
|
+
- **Unified guardian decision primitive:** All guardian decision paths (callback buttons, conversational engine, requester self-cancel) must route through `applyGuardianDecision()` in `assistant/src/approvals/guardian-decision-primitive.ts`. Do not inline decision logic (approve_always downgrade, approval record updates, grant minting) at individual callsites.
|
|
10
10
|
|
|
11
11
|
## Guardian Verification Invariant
|
|
12
12
|
|
|
13
13
|
Guardian verification consumption must be identity-bound to the expected recipient identity. Every outbound verification session stores the expected identity (phone E.164, Telegram user/chat ID), and the consume path rejects attempts where the responding actor's identity does not match.
|
|
14
14
|
|
|
15
|
-
Conversational guardian verification control-plane invocation is guardian-only. Non-guardian and unverified-channel actors cannot invoke
|
|
15
|
+
Conversational guardian verification control-plane invocation is guardian-only. Non-guardian and unverified-channel actors cannot invoke channel verification endpoints (`/v1/channel-verification-sessions/*`) conversationally via tools. Enforcement is a deterministic gate in the tool execution layer (`assistant/src/tools/executor.ts`) using actor-role context — only `guardian` and `undefined` (desktop/trusted) actor roles pass. The policy module is at `assistant/src/tools/verification-control-plane-policy.ts`.
|
|
16
16
|
|
|
17
17
|
## Memory Provenance Invariant
|
|
18
18
|
|
|
@@ -306,7 +306,7 @@ const GRANT_RETRY_MAX_WAIT_MS = 10_000;
|
|
|
306
306
|
* polling to handle the voice pipeline race condition where the grant
|
|
307
307
|
* may still be in-flight: `answerCall()` triggers the voice turn as
|
|
308
308
|
* fire-and-forget, and the voice LLM can attempt tool execution before
|
|
309
|
-
* `tryMintGuardianActionGrant`'s
|
|
309
|
+
* `tryMintGuardianActionGrant`'s classifier finishes minting the
|
|
310
310
|
* grant. Polling bridges this timing gap without changing the
|
|
311
311
|
* fire-and-forget architecture.
|
|
312
312
|
*/
|
|
@@ -315,7 +315,7 @@ export async function consumeGrantForInvocation(
|
|
|
315
315
|
options?: { maxWaitMs?: number; intervalMs?: number; signal?: AbortSignal },
|
|
316
316
|
): Promise<ConsumeGrantResult> {
|
|
317
317
|
// Fast path: try once synchronously — covers the common case where the
|
|
318
|
-
// grant already exists
|
|
318
|
+
// grant already exists.
|
|
319
319
|
const first = consumeGrantSync(params);
|
|
320
320
|
if (first.ok) {
|
|
321
321
|
return first;
|
|
@@ -27,7 +27,7 @@ import { addRule } from "../permissions/trust-store.js";
|
|
|
27
27
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
28
28
|
import { mintDaemonDeliveryToken } from "../runtime/auth/token-service.js";
|
|
29
29
|
import type { ApprovalAction } from "../runtime/channel-approval-types.js";
|
|
30
|
-
import { createOutboundSession } from "../runtime/channel-
|
|
30
|
+
import { createOutboundSession } from "../runtime/channel-verification-service.js";
|
|
31
31
|
import { deliverChannelReply } from "../runtime/gateway-client.js";
|
|
32
32
|
import * as pendingInteractions from "../runtime/pending-interactions.js";
|
|
33
33
|
import { getTool } from "../tools/registry.js";
|
|
@@ -110,7 +110,6 @@ export type ResolverResult =
|
|
|
110
110
|
function resolveDeliverCallbackUrlForChannel(channel: string): string | null {
|
|
111
111
|
switch (channel) {
|
|
112
112
|
case "telegram":
|
|
113
|
-
case "sms":
|
|
114
113
|
case "whatsapp":
|
|
115
114
|
case "slack":
|
|
116
115
|
return `${getGatewayInternalBaseUrl()}/deliver/${channel}`;
|
|
@@ -457,10 +456,10 @@ const accessRequestResolver: GuardianRequestResolver = {
|
|
|
457
456
|
// Voice approvals: directly activate the trusted contact without minting
|
|
458
457
|
// a verification session. The caller is already on the line and the
|
|
459
458
|
// relay server's in-call wait loop will detect the approved status.
|
|
460
|
-
if (channel === "
|
|
459
|
+
if (channel === "phone") {
|
|
461
460
|
try {
|
|
462
461
|
upsertContactChannel({
|
|
463
|
-
sourceChannel: "
|
|
462
|
+
sourceChannel: "phone",
|
|
464
463
|
externalUserId: requesterExternalUserId,
|
|
465
464
|
externalChatId: requesterChatId,
|
|
466
465
|
status: "active",
|