@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
|
@@ -217,47 +217,6 @@ function backfillDefaults(rules: TrustRule[]): boolean {
|
|
|
217
217
|
return changed;
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
-
/**
|
|
221
|
-
* Update persisted starter-bundle rules whose pattern matches a known legacy
|
|
222
|
-
* format (e.g. the old "tool:**" prefix was changed to standalone "**").
|
|
223
|
-
* Returns true when at least one rule was updated.
|
|
224
|
-
*
|
|
225
|
-
* Only rules with a recognised legacy pattern are migrated. If a user has
|
|
226
|
-
* intentionally customised a starter rule's pattern (e.g. narrowed it), it is
|
|
227
|
-
* left untouched.
|
|
228
|
-
*/
|
|
229
|
-
function migrateStarterRulePatterns(rules: TrustRule[]): boolean {
|
|
230
|
-
const templatesByID = new Map(getStarterBundleRules().map((t) => [t.id, t]));
|
|
231
|
-
let changed = false;
|
|
232
|
-
for (const rule of rules) {
|
|
233
|
-
const template = templatesByID.get(rule.id);
|
|
234
|
-
if (!template || rule.pattern === template.pattern) continue;
|
|
235
|
-
// Only migrate patterns that match a known legacy format.
|
|
236
|
-
// The "tool:**" prefix (e.g. "file_read:**") was the original pattern
|
|
237
|
-
// before it was changed to standalone "**".
|
|
238
|
-
if (!isLegacyStarterPattern(rule.pattern, rule.tool)) continue;
|
|
239
|
-
log.info(
|
|
240
|
-
{
|
|
241
|
-
ruleId: rule.id,
|
|
242
|
-
oldPattern: rule.pattern,
|
|
243
|
-
newPattern: template.pattern,
|
|
244
|
-
},
|
|
245
|
-
"Migrated starter rule pattern to current template",
|
|
246
|
-
);
|
|
247
|
-
rule.pattern = template.pattern;
|
|
248
|
-
changed = true;
|
|
249
|
-
}
|
|
250
|
-
return changed;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/** Recognises legacy starter-rule patterns that should be auto-migrated. */
|
|
254
|
-
function isLegacyStarterPattern(pattern: string, tool: string): boolean {
|
|
255
|
-
// Legacy format used "tool:**" prefixes, e.g. "file_read:**", "glob:**".
|
|
256
|
-
// Only match the exact legacy pattern for this specific tool to avoid
|
|
257
|
-
// silently resetting user-customised patterns.
|
|
258
|
-
return pattern === `${tool}:**`;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
220
|
function loadFromDisk(): TrustRule[] {
|
|
262
221
|
const path = getTrustPath();
|
|
263
222
|
let rules: TrustRule[] = [];
|
|
@@ -274,33 +233,19 @@ function loadFromDisk(): TrustRule[] {
|
|
|
274
233
|
// Restore persisted starter bundle flag
|
|
275
234
|
cachedStarterBundleAccepted = data.starterBundleAccepted === true;
|
|
276
235
|
|
|
277
|
-
if (
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}));
|
|
283
|
-
needsSave = true;
|
|
284
|
-
log.info(
|
|
285
|
-
{ ruleCount: rules.length },
|
|
286
|
-
"Migrated v1 trust rules to v2 (priority=100)",
|
|
287
|
-
);
|
|
288
|
-
// Fall through to v2 → v3 migration below
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
if (data.version === 2 || (data.version === 1 && needsSave)) {
|
|
292
|
-
// Migration: v2 → v3. Existing rules have no principal fields,
|
|
293
|
-
// which is correct — missing principal fields act as wildcards.
|
|
294
|
-
if (data.version === 2) {
|
|
295
|
-
rules = rawRules;
|
|
296
|
-
}
|
|
297
|
-
needsSave = true;
|
|
298
|
-
log.info(
|
|
299
|
-
{ ruleCount: rules.length },
|
|
300
|
-
"Migrated v2 trust rules to v3 (principal fields)",
|
|
301
|
-
);
|
|
302
|
-
} else if (data.version === TRUST_FILE_VERSION) {
|
|
236
|
+
if (
|
|
237
|
+
data.version === TRUST_FILE_VERSION ||
|
|
238
|
+
data.version === 1 ||
|
|
239
|
+
data.version === 2
|
|
240
|
+
) {
|
|
303
241
|
rules = rawRules;
|
|
242
|
+
if (data.version !== TRUST_FILE_VERSION) {
|
|
243
|
+
needsSave = true;
|
|
244
|
+
log.info(
|
|
245
|
+
{ version: data.version, targetVersion: TRUST_FILE_VERSION },
|
|
246
|
+
"Migrating legacy trust file version",
|
|
247
|
+
);
|
|
248
|
+
}
|
|
304
249
|
|
|
305
250
|
// Strip legacy principal-scoped fields from persisted v3 rules.
|
|
306
251
|
// Before the principal concept was removed, rules could carry
|
|
@@ -323,7 +268,7 @@ function loadFromDisk(): TrustRule[] {
|
|
|
323
268
|
needsSave = true;
|
|
324
269
|
}
|
|
325
270
|
}
|
|
326
|
-
} else
|
|
271
|
+
} else {
|
|
327
272
|
log.warn(
|
|
328
273
|
{ version: data.version },
|
|
329
274
|
"Unknown trust file version, applying defaults in-memory only",
|
|
@@ -347,12 +292,6 @@ function loadFromDisk(): TrustRule[] {
|
|
|
347
292
|
needsSave = true;
|
|
348
293
|
}
|
|
349
294
|
|
|
350
|
-
// Migrate persisted starter rules whose pattern has drifted from the
|
|
351
|
-
// current template (e.g. old "tool:**" → "**").
|
|
352
|
-
if (migrateStarterRulePatterns(rules)) {
|
|
353
|
-
needsSave = true;
|
|
354
|
-
}
|
|
355
|
-
|
|
356
295
|
rules.sort(ruleOrder);
|
|
357
296
|
|
|
358
297
|
if (needsSave) {
|
|
@@ -711,8 +650,6 @@ export interface AcceptStarterBundleResult {
|
|
|
711
650
|
*/
|
|
712
651
|
export function acceptStarterBundle(): AcceptStarterBundleResult {
|
|
713
652
|
// Re-read from disk to avoid lost updates.
|
|
714
|
-
// loadFromDisk() also runs migrateStarterRulePatterns() to fix any
|
|
715
|
-
// stale patterns (e.g. old "tool:**" → "**") before we get here.
|
|
716
653
|
cachedRules = null;
|
|
717
654
|
cachedStarterBundleAccepted = null;
|
|
718
655
|
const rules = [...getRules()];
|
|
@@ -71,7 +71,7 @@ APP-SPECIFIC TIPS:
|
|
|
71
71
|
- Messages: Click the search bar or use cmd+n for a new message.
|
|
72
72
|
|
|
73
73
|
VERIFICATION CODES:
|
|
74
|
-
When a signup or login flow requires a verification code (email
|
|
74
|
+
When a signup or login flow requires a verification code (email or authenticator):
|
|
75
75
|
1. Use ui_show with surface_type "form" to ask the user:
|
|
76
76
|
ui_show({ surface_type: "form", title: "Verification Code", data: { fields: [{ id: "code", type: "text", label: "Enter the verification code", required: true }] } })
|
|
77
77
|
2. Wait for the user's response
|
|
@@ -2,6 +2,11 @@ import { copyFileSync, existsSync, readFileSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
|
|
4
4
|
import { CLI_HELP_REFERENCE } from "../cli/reference.js";
|
|
5
|
+
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
6
|
+
import { getBaseDataDir, getIsContainerized } from "../config/env-registry.js";
|
|
7
|
+
import { getConfig, getNestedValue, loadRawConfig } from "../config/loader.js";
|
|
8
|
+
import { skillFlagKey } from "../config/skill-state.js";
|
|
9
|
+
import { loadSkillCatalog, type SkillSummary } from "../config/skills.js";
|
|
5
10
|
import { listCredentialMetadata } from "../tools/credentials/metadata-store.js";
|
|
6
11
|
import { resolveBundledDir } from "../util/bundled-asset.js";
|
|
7
12
|
import { getLogger } from "../util/logger.js";
|
|
@@ -10,11 +15,6 @@ import {
|
|
|
10
15
|
getWorkspacePromptPath,
|
|
11
16
|
isMacOS,
|
|
12
17
|
} from "../util/platform.js";
|
|
13
|
-
import { isAssistantFeatureFlagEnabled } from "./assistant-feature-flags.js";
|
|
14
|
-
import { getBaseDataDir, getIsContainerized } from "./env-registry.js";
|
|
15
|
-
import { getConfig } from "./loader.js";
|
|
16
|
-
import { skillFlagKey } from "./skill-state.js";
|
|
17
|
-
import { loadSkillCatalog, type SkillSummary } from "./skills.js";
|
|
18
18
|
import { resolveUserPronouns, resolveUserReference } from "./user-reference.js";
|
|
19
19
|
|
|
20
20
|
const log = getLogger("system-prompt");
|
|
@@ -170,7 +170,7 @@ export function buildSystemPrompt(): string {
|
|
|
170
170
|
config,
|
|
171
171
|
)
|
|
172
172
|
) {
|
|
173
|
-
parts.push(
|
|
173
|
+
parts.push(buildVerificationRoutingSection());
|
|
174
174
|
}
|
|
175
175
|
parts.push(buildAttachmentSection());
|
|
176
176
|
parts.push(buildInChatConfigurationSection());
|
|
@@ -186,6 +186,7 @@ export function buildSystemPrompt(): string {
|
|
|
186
186
|
parts.push(buildAccessPreferenceSection());
|
|
187
187
|
parts.push(buildIntegrationSection());
|
|
188
188
|
parts.push(buildMemoryPersistenceSection());
|
|
189
|
+
parts.push(buildMemoryRecallSection());
|
|
189
190
|
parts.push(buildWorkspaceReflectionSection());
|
|
190
191
|
parts.push(buildLearningMemorySection());
|
|
191
192
|
|
|
@@ -227,7 +228,7 @@ function buildTaskScheduleReminderRoutingSection(): string {
|
|
|
227
228
|
].join("\n");
|
|
228
229
|
}
|
|
229
230
|
|
|
230
|
-
export function
|
|
231
|
+
export function buildVerificationRoutingSection(): string {
|
|
231
232
|
return [
|
|
232
233
|
"## Routing: Guardian Verification",
|
|
233
234
|
"",
|
|
@@ -238,13 +239,13 @@ export function buildGuardianVerificationRoutingSection(): string {
|
|
|
238
239
|
"### Trigger phrases",
|
|
239
240
|
'- "verify guardian"',
|
|
240
241
|
'- "verify my Telegram account"',
|
|
241
|
-
'- "verify
|
|
242
|
+
'- "verify phone channel"',
|
|
242
243
|
'- "verify my phone number"',
|
|
243
244
|
'- "set up guardian verification"',
|
|
244
245
|
"",
|
|
245
246
|
"### What it does",
|
|
246
|
-
"The skill walks through outbound guardian verification for
|
|
247
|
-
"1. Confirm channel (
|
|
247
|
+
"The skill walks through outbound guardian verification for phone or Telegram:",
|
|
248
|
+
"1. Confirm channel (phone, telegram)",
|
|
248
249
|
"2. Collect destination (phone number or Telegram handle/chat ID)",
|
|
249
250
|
"3. Start outbound verification via runtime HTTP API",
|
|
250
251
|
"4. Guide the user through code entry, resend, or cancel",
|
|
@@ -297,17 +298,16 @@ export function buildStarterTaskPlaybookSection(): string {
|
|
|
297
298
|
'- `[STARTER_TASK:research_to_ui]` — "Turn it into a webpage or interactive UI" flow',
|
|
298
299
|
"",
|
|
299
300
|
"### Playbook: make_it_yours",
|
|
300
|
-
"Goal: Help the user choose an accent color for
|
|
301
|
+
"Goal: Help the user choose an accent color preference for apps and interfaces.",
|
|
301
302
|
"",
|
|
302
303
|
"1. If the user's locale is missing or has `confidence: low` in USER.md, briefly confirm their location/language before proceeding.",
|
|
303
304
|
"2. Present a concise set of accent color options (e.g. 5-7 curated colors with names and hex codes). Keep it short and scannable.",
|
|
304
305
|
'3. Let the user pick one. Accept color names, hex values, or descriptions (e.g. "something warm").',
|
|
305
306
|
'4. Confirm the selection: "I\'ll set your accent color to **{label}** ({hex}). Sound good?"',
|
|
306
307
|
"5. On confirmation:",
|
|
307
|
-
' -
|
|
308
|
-
" -
|
|
309
|
-
"
|
|
310
|
-
"6. If the user declines or wants to skip, set `make_it_yours` to `deferred_to_dashboard` in USER.md and move on.",
|
|
308
|
+
' - Use `app_file_edit` to update the `## Dashboard Color Preference` section in USER.md with `label`, `hex`, `source: "user_selected"`, and `applied: true`.',
|
|
309
|
+
" - Use `app_file_edit` to update the `## Onboarding Tasks` section: set `make_it_yours` to `done`.",
|
|
310
|
+
"6. If the user declines or wants to skip, set `make_it_yours` to `skipped` in USER.md and move on.",
|
|
311
311
|
"",
|
|
312
312
|
"### Playbook: research_topic",
|
|
313
313
|
"Goal: Research a topic the user is interested in and summarise findings.",
|
|
@@ -403,9 +403,9 @@ export function buildPhoneCallsRoutingSection(): string {
|
|
|
403
403
|
"### Trigger phrases",
|
|
404
404
|
'- "Set up phone calling" / "enable calls"',
|
|
405
405
|
'- "Make a call to..." / "call [number/business]"',
|
|
406
|
-
'- "Configure Twilio" (in context of voice calls
|
|
406
|
+
'- "Configure Twilio" (in context of voice calls)',
|
|
407
407
|
'- "Can you make phone calls?"',
|
|
408
|
-
'- "Set up my phone number" (for calling
|
|
408
|
+
'- "Set up my phone number" (for calling)',
|
|
409
409
|
"",
|
|
410
410
|
"### What it does",
|
|
411
411
|
"The skill handles the full phone calling lifecycle:",
|
|
@@ -506,7 +506,7 @@ export function buildChannelAwarenessSection(): string {
|
|
|
506
506
|
"",
|
|
507
507
|
"### Push-to-talk awareness",
|
|
508
508
|
"- The `<channel_capabilities>` block may include `ptt_activation_key` and `ptt_enabled` fields indicating the user's push-to-talk configuration.",
|
|
509
|
-
|
|
509
|
+
'- You can change the push-to-talk activation key using the `voice_config_update` tool. The key is provided as a JSON PTTActivator payload (e.g. `{"kind":"modifierOnly","modifierFlags":8388608}` for Fn).',
|
|
510
510
|
"- When the user asks about voice input or push-to-talk settings, use the tool to apply changes directly rather than directing them to settings.",
|
|
511
511
|
"- When `microphone_permission_granted` is `false`, guide the user to grant microphone access in System Settings before using voice features.",
|
|
512
512
|
"",
|
|
@@ -633,11 +633,14 @@ function buildIntegrationSection(): string {
|
|
|
633
633
|
);
|
|
634
634
|
if (oauthCreds.length === 0) return "";
|
|
635
635
|
|
|
636
|
+
const raw = loadRawConfig();
|
|
636
637
|
const lines = ["## Connected Services", ""];
|
|
637
638
|
for (const cred of oauthCreds) {
|
|
638
|
-
const
|
|
639
|
-
|
|
640
|
-
|
|
639
|
+
const acctInfo = getNestedValue(
|
|
640
|
+
raw,
|
|
641
|
+
`integrations.accountInfo.${cred.service}`,
|
|
642
|
+
) as string | undefined;
|
|
643
|
+
const state = acctInfo ? `Connected (${acctInfo})` : "Connected";
|
|
641
644
|
lines.push(`- **${cred.service}**: ${state}`);
|
|
642
645
|
}
|
|
643
646
|
|
|
@@ -659,6 +662,21 @@ function buildMemoryPersistenceSection(): string {
|
|
|
659
662
|
].join("\n");
|
|
660
663
|
}
|
|
661
664
|
|
|
665
|
+
function buildMemoryRecallSection(): string {
|
|
666
|
+
return [
|
|
667
|
+
"## Memory Recall",
|
|
668
|
+
"",
|
|
669
|
+
"You have access to a `memory_recall` tool for deep memory retrieval. Use it when:",
|
|
670
|
+
"",
|
|
671
|
+
"- The user asks about past conversations, decisions, or context you don't have in the current window",
|
|
672
|
+
"- You need to recall specific facts, preferences, or project details",
|
|
673
|
+
"- The auto-injected memory context doesn't contain what you need",
|
|
674
|
+
"- The user references something from a previous session",
|
|
675
|
+
"",
|
|
676
|
+
"The tool searches across semantic, lexical, entity graph, and recency sources. Be specific in your query for best results.",
|
|
677
|
+
].join("\n");
|
|
678
|
+
}
|
|
679
|
+
|
|
662
680
|
function buildWorkspaceReflectionSection(): string {
|
|
663
681
|
return [
|
|
664
682
|
"## Workspace Reflection",
|
|
@@ -871,7 +889,7 @@ function appendSkillsCatalog(basePrompt: string): string {
|
|
|
871
889
|
}
|
|
872
890
|
|
|
873
891
|
function buildDynamicSkillWorkflowSection(
|
|
874
|
-
config: import("
|
|
892
|
+
config: import("../config/schema.js").AssistantConfig,
|
|
875
893
|
): string {
|
|
876
894
|
const lines = [
|
|
877
895
|
"## Dynamic Skill Authoring Workflow",
|
|
@@ -909,7 +927,7 @@ function buildDynamicSkillWorkflowSection(
|
|
|
909
927
|
lines.push(
|
|
910
928
|
"",
|
|
911
929
|
"### Messaging Skill",
|
|
912
|
-
'When the user asks about email, messaging, inbox management, or wants to read/send/search messages on any platform (Gmail, Slack, Telegram
|
|
930
|
+
'When the user asks about email, messaging, inbox management, or wants to read/send/search messages on any platform (Gmail, Slack, Telegram), load the "messaging" skill using `skill_load`. The messaging skill handles connection setup, credential flows, and all messaging operations — do not improvise setup instructions from general knowledge.',
|
|
913
931
|
);
|
|
914
932
|
}
|
|
915
933
|
|
|
@@ -953,7 +971,7 @@ function formatSkillsCatalog(skills: SkillSummary[]): string {
|
|
|
953
971
|
const lines = ["<available_skills>"];
|
|
954
972
|
for (const skill of visible) {
|
|
955
973
|
const idAttr = escapeXml(skill.id);
|
|
956
|
-
const nameAttr = escapeXml(skill.
|
|
974
|
+
const nameAttr = escapeXml(skill.displayName);
|
|
957
975
|
const descAttr =
|
|
958
976
|
skill.id === "mcp-setup"
|
|
959
977
|
? escapeXml(getMcpSetupDescription())
|
|
@@ -978,7 +996,7 @@ function formatSkillsCatalog(skills: SkillSummary[]): string {
|
|
|
978
996
|
"### Installing additional skills",
|
|
979
997
|
"If `skill_load` fails because a skill is not found, additional first-party skills may be available in the Vellum catalog.",
|
|
980
998
|
"Use `bash` to discover and install them:",
|
|
981
|
-
"- `
|
|
982
|
-
"- `
|
|
999
|
+
"- `assistant skills list` — list all available catalog skills",
|
|
1000
|
+
"- `assistant skills install <skill-id>` — install a skill, then retry `skill_load`",
|
|
983
1001
|
].join("\n");
|
|
984
1002
|
}
|
|
@@ -42,8 +42,6 @@ Then figure out together:
|
|
|
42
42
|
The two actions MUST have different labels and prompts. Double-check before calling ui_show that you are not repeating the same suggestion.
|
|
43
43
|
If `ui_show` is not available (voice, SMS, or other non-dashboard channels), present the two suggestions as plain text messages instead, numbered so the user can reply with which one they'd like. If the user types a response instead of clicking, continue via the text path. If they want to defer both suggestions and do something else entirely, that's fine too.
|
|
44
44
|
|
|
45
|
-
7. Create Home Base silently. After the suggestion interaction (user picked one, deferred, or typed something else), create their Home Base using `app_create` with `set_as_home_base: true` and `auto_open: false`. Include personalized starter tasks based on what you learned. Do NOT open it with `app_open`. Do NOT announce it, mention it, or hint that something was created. No "check this out," no "I put something together," no "here's what I came up with." Just create it quietly and move on.
|
|
46
|
-
|
|
47
45
|
## Requirements
|
|
48
46
|
|
|
49
47
|
Only your vibe is hard-required. Your name matters but don't push for it -- if the user doesn't offer one, pick one yourself. Everything else about the user is best-effort. Ask naturally, not as a form. If something is unclear, you can ask one short follow-up, but if the user declines or dodges, do not push. Just move on.
|
|
@@ -70,7 +68,6 @@ Do NOT delete this file until ALL of the following are true:
|
|
|
70
68
|
- You've figured out your vibe and adopted it
|
|
71
69
|
- 2 suggestions shown (via `ui_show` or as text if UI unavailable)
|
|
72
70
|
- The user selected one, deferred both, or typed an alternate direction
|
|
73
|
-
- Home Base has been created silently
|
|
74
71
|
|
|
75
72
|
Once every condition is met, delete this file. You're done here.
|
|
76
73
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { wrapWithLogfire } from "../logfire.js";
|
|
2
|
-
import { ConfigError } from "../util/errors.js";
|
|
2
|
+
import { ConfigError, ProviderNotConfiguredError } from "../util/errors.js";
|
|
3
3
|
import { AnthropicProvider } from "./anthropic/client.js";
|
|
4
4
|
import { FailoverProvider, type ProviderHealthStatus } from "./failover.js";
|
|
5
5
|
import { FireworksProvider } from "./fireworks/client.js";
|
|
@@ -94,9 +94,7 @@ export function getFailoverProvider(
|
|
|
94
94
|
const selection = resolveProviderSelection(primaryName, providerOrder);
|
|
95
95
|
|
|
96
96
|
if (!selection.selectedPrimary) {
|
|
97
|
-
throw new
|
|
98
|
-
`No providers available. Requested: "${primaryName}". Registered: ${listProviders().join(", ") || "none"}`,
|
|
99
|
-
);
|
|
97
|
+
throw new ProviderNotConfiguredError(primaryName, listProviders());
|
|
100
98
|
}
|
|
101
99
|
|
|
102
100
|
const orderedProviders: Provider[] = selection.availableProviders.map(
|
package/src/runtime/AGENTS.md
CHANGED
|
@@ -10,7 +10,7 @@ The single HTTP send endpoint is `POST /v1/messages`. Key behaviors:
|
|
|
10
10
|
- **Fire-and-forget**: Returns `202 { accepted: true }` immediately. The client observes progress via SSE (`GET /v1/events`).
|
|
11
11
|
- **Hub publishing**: All agent events are published to `assistantEventHub`, making them observable via SSE.
|
|
12
12
|
|
|
13
|
-
Do NOT add new send endpoints. All message ingress should go through `POST /v1/messages` (HTTP)
|
|
13
|
+
Do NOT add new send endpoints. All message ingress should go through `POST /v1/messages` (HTTP).
|
|
14
14
|
|
|
15
15
|
### Approvals (confirmations, secrets, trust rules)
|
|
16
16
|
|
|
@@ -18,9 +18,9 @@ Approvals are **orthogonal to message sending**. The assistant asks for approval
|
|
|
18
18
|
|
|
19
19
|
- **Discovery**: Clients discover pending approvals via SSE events (`confirmation_request`, `secret_request`) which include a `requestId`.
|
|
20
20
|
- **Resolution**: Clients respond via standalone endpoints keyed by `requestId`:
|
|
21
|
-
- `POST /v1/confirm` — `{ requestId, decision: "allow"
|
|
21
|
+
- `POST /v1/confirm` — `{ requestId, decision, selectedPattern?, selectedScope? }`. Valid decisions: `"allow"`, `"allow_10m"`, `"allow_thread"`, `"deny"`, `"always_allow"`, `"always_deny"`, `"always_allow_high_risk"`. For persistent decisions (`always_allow`, `always_deny`, `always_allow_high_risk`), `selectedPattern` and `selectedScope` are validated against the server-provided allowlist/scope options from the original confirmation request before trust rules are persisted.
|
|
22
22
|
- `POST /v1/secret` — `{ requestId, value, delivery }`
|
|
23
|
-
- `POST /v1/trust-rules` — `{ requestId, pattern, scope }
|
|
23
|
+
- `POST /v1/trust-rules` — `{ requestId, pattern, scope, decision, allowHighRisk? }`. Validates pattern/scope against server-provided options. Does not resolve the confirmation itself.
|
|
24
24
|
- **Tracking**: The `pending-interactions` tracker (`assistant/src/runtime/pending-interactions.ts`) maps `requestId → session`. Use `register()` to track, `resolve()` to consume, `getByConversation()` to query.
|
|
25
25
|
|
|
26
26
|
Do NOT couple approval handling to message sending. Do NOT add run/status tracking to the send path.
|
|
@@ -33,10 +33,8 @@ Channel approval flows use `requestId` (not `runId`) as the primary identifier:
|
|
|
33
33
|
- Guardian approval records in `channelGuardianApprovalRequests` link via `requestId`.
|
|
34
34
|
- The conversational approval engine classifies user intent and resolves via `session.handleConfirmationResponse(requestId, decision)`.
|
|
35
35
|
|
|
36
|
-
## HTTP-
|
|
36
|
+
## HTTP-Only Transport
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
HTTP is the sole transport for client-daemon communication. The runtime HTTP server (`assistant/src/runtime/http-server.ts`) is the canonical API surface. Clients connect via HTTP for request/response operations and SSE (`GET /v1/events`) for streaming server-to-client events.
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
When writing skills that need to call daemon configuration endpoints, use `curl` with the runtime HTTP API (JWT-authenticated via `Authorization: Bearer <jwt>`) rather than describing IPC socket protocol details. The assistant already knows how to use `curl`.
|
|
40
|
+
When writing skills that need to call daemon configuration endpoints, use `curl` with the runtime HTTP API (JWT-authenticated via `Authorization: Bearer <jwt>`). The assistant already knows how to use `curl`.
|
|
@@ -7,18 +7,13 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Access requests are a special case: they always create a canonical request
|
|
9
9
|
* and emit a notification signal, even when no same-channel guardian binding
|
|
10
|
-
* exists. Guardian identity resolution
|
|
11
|
-
*
|
|
12
|
-
* 2. Any active guardian channel (deterministic, most-recently-verified).
|
|
13
|
-
* 3. No guardian identity (trusted/vellum-only resolution path).
|
|
10
|
+
* exists. Guardian identity resolution is anchored on the assistant's vellum
|
|
11
|
+
* principal so access requests cannot bind to stale/cross-assistant contacts.
|
|
14
12
|
*/
|
|
15
13
|
|
|
16
14
|
import type { ChannelId } from "../channels/types.js";
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
listGuardianChannels,
|
|
20
|
-
} from "../contacts/contact-store.js";
|
|
21
|
-
import type { MemberStatus } from "../contacts/types.js";
|
|
15
|
+
import { findGuardianForChannel } from "../contacts/contact-store.js";
|
|
16
|
+
import type { ChannelStatus } from "../contacts/types.js";
|
|
22
17
|
import {
|
|
23
18
|
createCanonicalGuardianDelivery,
|
|
24
19
|
createCanonicalGuardianRequest,
|
|
@@ -56,7 +51,7 @@ export interface AccessRequestParams {
|
|
|
56
51
|
actorExternalId?: string;
|
|
57
52
|
actorDisplayName?: string;
|
|
58
53
|
actorUsername?: string;
|
|
59
|
-
previousMemberStatus?:
|
|
54
|
+
previousMemberStatus?: Exclude<ChannelStatus, "unverified">;
|
|
60
55
|
}
|
|
61
56
|
|
|
62
57
|
export type AccessRequestResult =
|
|
@@ -74,9 +69,9 @@ export type AccessRequestResult =
|
|
|
74
69
|
* Returns a result indicating whether the guardian was notified and whether
|
|
75
70
|
* a new request was created or an existing one was deduped.
|
|
76
71
|
*
|
|
77
|
-
* Guardian identity resolution
|
|
78
|
-
*
|
|
79
|
-
*
|
|
72
|
+
* Guardian identity resolution uses the assistant's vellum principal as the
|
|
73
|
+
* trust anchor and only accepts source-channel contacts that match it. This
|
|
74
|
+
* prevents stale or cross-assistant contacts from being bound to the request.
|
|
80
75
|
*
|
|
81
76
|
* This is intentionally synchronous with respect to the canonical store writes
|
|
82
77
|
* and fire-and-forget for the notification signal emission.
|
|
@@ -98,62 +93,52 @@ export function notifyGuardianOfAccessRequest(
|
|
|
98
93
|
return { notified: false, reason: "no_sender_id" };
|
|
99
94
|
}
|
|
100
95
|
|
|
101
|
-
// Resolve guardian identity with
|
|
102
|
-
// 1.
|
|
103
|
-
// 2.
|
|
104
|
-
// 3.
|
|
96
|
+
// Resolve guardian identity with assistant-anchored strategy:
|
|
97
|
+
// 1. Ensure the assistant has a vellum guardian principal (trust anchor)
|
|
98
|
+
// 2. Use source-channel guardian only when principal matches anchor
|
|
99
|
+
// 3. Fallback to vellum guardian identity for this assistant principal
|
|
105
100
|
let guardianExternalUserId: string | null = null;
|
|
106
101
|
let guardianPrincipalId: string | null = null;
|
|
107
102
|
let guardianBindingChannel: string | null = null;
|
|
108
|
-
let guardianResolutionSource:
|
|
109
|
-
"
|
|
103
|
+
let guardianResolutionSource:
|
|
104
|
+
| "source-channel-contact"
|
|
105
|
+
| "vellum-anchor"
|
|
106
|
+
| "none" = "none";
|
|
107
|
+
|
|
108
|
+
const assistantGuardianPrincipalId =
|
|
109
|
+
ensureVellumGuardianBinding(canonicalAssistantId);
|
|
110
110
|
|
|
111
|
-
// Try
|
|
111
|
+
// Try source-channel guardian, but only if it maps to the assistant's
|
|
112
|
+
// anchored principal. This blocks cross-assistant/stale contact selection.
|
|
112
113
|
const sourceGuardian = findGuardianForChannel(sourceChannel);
|
|
113
|
-
if (
|
|
114
|
+
if (
|
|
115
|
+
sourceGuardian &&
|
|
116
|
+
sourceGuardian.contact.principalId === assistantGuardianPrincipalId
|
|
117
|
+
) {
|
|
114
118
|
guardianExternalUserId = sourceGuardian.channel.externalUserId;
|
|
115
119
|
guardianPrincipalId = sourceGuardian.contact.principalId;
|
|
116
120
|
guardianBindingChannel = sourceGuardian.channel.type;
|
|
117
|
-
guardianResolutionSource = "
|
|
118
|
-
} else {
|
|
119
|
-
// Try contacts-first: any active guardian channel
|
|
120
|
-
const allGuardianChannels = listGuardianChannels();
|
|
121
|
-
if (allGuardianChannels && allGuardianChannels.channels.length > 0) {
|
|
122
|
-
const fallbackChannel = allGuardianChannels.channels[0];
|
|
123
|
-
guardianExternalUserId = fallbackChannel.externalUserId;
|
|
124
|
-
guardianPrincipalId = allGuardianChannels.contact.principalId;
|
|
125
|
-
guardianBindingChannel = fallbackChannel.type;
|
|
126
|
-
guardianResolutionSource = "contacts-fallback";
|
|
127
|
-
log.debug(
|
|
128
|
-
{
|
|
129
|
-
sourceChannel,
|
|
130
|
-
fallbackChannel: guardianBindingChannel,
|
|
131
|
-
canonicalAssistantId,
|
|
132
|
-
},
|
|
133
|
-
"Using cross-channel guardian contact fallback for access request",
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
// If no guardian found via contacts, guardianResolutionSource stays "none"
|
|
121
|
+
guardianResolutionSource = "source-channel-contact";
|
|
137
122
|
}
|
|
138
123
|
|
|
139
|
-
//
|
|
140
|
-
//
|
|
124
|
+
// Access requests always require a principal. If source-channel resolution
|
|
125
|
+
// did not match the assistant anchor, use the anchored vellum identity.
|
|
141
126
|
if (!guardianPrincipalId) {
|
|
142
|
-
log.info(
|
|
143
|
-
{ sourceChannel, canonicalAssistantId },
|
|
144
|
-
"No guardian principal for access request — self-healing vellum binding",
|
|
145
|
-
);
|
|
146
|
-
const healedPrincipalId = ensureVellumGuardianBinding(canonicalAssistantId);
|
|
147
127
|
const vellumGuardian = findGuardianForChannel("vellum");
|
|
148
|
-
if (
|
|
128
|
+
if (
|
|
129
|
+
vellumGuardian &&
|
|
130
|
+
vellumGuardian.contact.principalId === assistantGuardianPrincipalId
|
|
131
|
+
) {
|
|
149
132
|
guardianExternalUserId =
|
|
150
133
|
vellumGuardian.channel.externalUserId ?? guardianExternalUserId;
|
|
151
134
|
guardianPrincipalId =
|
|
152
|
-
vellumGuardian.contact.principalId ??
|
|
135
|
+
vellumGuardian.contact.principalId ?? assistantGuardianPrincipalId;
|
|
153
136
|
guardianBindingChannel = guardianBindingChannel ?? "vellum";
|
|
137
|
+
guardianResolutionSource = "vellum-anchor";
|
|
154
138
|
} else {
|
|
155
|
-
guardianPrincipalId =
|
|
139
|
+
guardianPrincipalId = assistantGuardianPrincipalId;
|
|
156
140
|
guardianBindingChannel = guardianBindingChannel ?? "vellum";
|
|
141
|
+
guardianResolutionSource = "vellum-anchor";
|
|
157
142
|
}
|
|
158
143
|
}
|
|
159
144
|
|
|
@@ -264,10 +249,6 @@ export function notifyGuardianOfAccessRequest(
|
|
|
264
249
|
continue;
|
|
265
250
|
}
|
|
266
251
|
|
|
267
|
-
if (result.channel !== "telegram" && result.channel !== "sms") {
|
|
268
|
-
continue;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
252
|
const delivery = createCanonicalGuardianDelivery({
|
|
272
253
|
requestId: canonicalRequest.id,
|
|
273
254
|
destinationChannel: result.channel,
|
|
@@ -51,16 +51,6 @@ export function isUntrustedTrustClass(
|
|
|
51
51
|
return trustClass === "trusted_contact" || trustClass === "unknown";
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/**
|
|
55
|
-
* Reason an actor was denied access during trust resolution.
|
|
56
|
-
*
|
|
57
|
-
* - `'no_binding'`: No guardian binding exists for this (assistant, channel),
|
|
58
|
-
* so trust cannot be established for any actor.
|
|
59
|
-
* - `'no_identity'`: The inbound message carried no usable identity fields
|
|
60
|
-
* (e.g. missing external user ID), so the sender could not be identified.
|
|
61
|
-
*/
|
|
62
|
-
export type DenialReason = "no_binding" | "no_identity";
|
|
63
|
-
|
|
64
54
|
/**
|
|
65
55
|
* Fully resolved trust context from the actor trust resolver.
|
|
66
56
|
*
|
|
@@ -98,8 +88,6 @@ export interface ActorTrustContext {
|
|
|
98
88
|
channel: ChannelId;
|
|
99
89
|
trustStatus: TrustClass;
|
|
100
90
|
};
|
|
101
|
-
/** Legacy denial reason for backward-compatible unverified_channel paths. */
|
|
102
|
-
denialReason?: DenialReason;
|
|
103
91
|
}
|
|
104
92
|
|
|
105
93
|
/**
|
|
@@ -176,7 +164,6 @@ export function resolveActorTrust(
|
|
|
176
164
|
channel: input.sourceChannel,
|
|
177
165
|
trustStatus: "unknown",
|
|
178
166
|
},
|
|
179
|
-
denialReason: "no_identity",
|
|
180
167
|
};
|
|
181
168
|
}
|
|
182
169
|
|
|
@@ -249,8 +236,6 @@ export function resolveActorTrust(
|
|
|
249
236
|
) === canonicalSenderId
|
|
250
237
|
: false;
|
|
251
238
|
|
|
252
|
-
// ContactChannel has no username field — the shim always set it to null.
|
|
253
|
-
const memberUsername = undefined;
|
|
254
239
|
const memberDisplayName =
|
|
255
240
|
memberMatchesSender &&
|
|
256
241
|
typeof memberRecord?.contact.displayName === "string" &&
|
|
@@ -260,7 +245,7 @@ export function resolveActorTrust(
|
|
|
260
245
|
// Prefer member profile metadata over transient sender metadata so guardian-
|
|
261
246
|
// curated contact details are canonical for assistant-facing identity —
|
|
262
247
|
// but only when the member record actually belongs to the current sender.
|
|
263
|
-
const resolvedUsername =
|
|
248
|
+
const resolvedUsername = senderUsername;
|
|
264
249
|
const resolvedDisplayName = memberDisplayName ?? senderDisplayName;
|
|
265
250
|
const resolvedIdentifier = resolvedUsername
|
|
266
251
|
? `@${resolvedUsername}`
|
|
@@ -280,12 +265,6 @@ export function resolveActorTrust(
|
|
|
280
265
|
trustClass = "unknown";
|
|
281
266
|
}
|
|
282
267
|
|
|
283
|
-
// Denial reason for legacy compatibility
|
|
284
|
-
let denialReason: DenialReason | undefined;
|
|
285
|
-
if (!isGuardian && !guardianBindingMatch) {
|
|
286
|
-
denialReason = "no_binding";
|
|
287
|
-
}
|
|
288
|
-
|
|
289
268
|
return {
|
|
290
269
|
canonicalSenderId,
|
|
291
270
|
guardianBindingMatch,
|
|
@@ -301,7 +280,6 @@ export function resolveActorTrust(
|
|
|
301
280
|
channel: input.sourceChannel,
|
|
302
281
|
trustStatus: trustClass,
|
|
303
282
|
},
|
|
304
|
-
denialReason,
|
|
305
283
|
};
|
|
306
284
|
}
|
|
307
285
|
|
|
@@ -338,6 +316,5 @@ export function toTrustContext(
|
|
|
338
316
|
requesterMemberDisplayName: ctx.actorMetadata.memberDisplayName,
|
|
339
317
|
requesterExternalUserId: ctx.canonicalSenderId ?? undefined,
|
|
340
318
|
requesterChatId: conversationExternalId,
|
|
341
|
-
denialReason: ctx.denialReason,
|
|
342
319
|
};
|
|
343
320
|
}
|
|
@@ -35,7 +35,8 @@ export type ApprovalMessageScenario =
|
|
|
35
35
|
| "guardian_deny_no_identity"
|
|
36
36
|
| "guardian_deny_no_binding"
|
|
37
37
|
| "requester_cancel"
|
|
38
|
-
| "approval_already_resolved"
|
|
38
|
+
| "approval_already_resolved"
|
|
39
|
+
| "guardian_text_unavailable";
|
|
39
40
|
|
|
40
41
|
export interface ApprovalMessageContext {
|
|
41
42
|
scenario: ApprovalMessageScenario;
|
|
@@ -257,7 +258,7 @@ export function getFallbackMessage(context: ApprovalMessageContext): string {
|
|
|
257
258
|
// Detect whether the code is a short numeric (identity-bound outbound)
|
|
258
259
|
// or a high-entropy hex (inbound challenge/bootstrap) and adjust wording.
|
|
259
260
|
const isNumeric = /^\d{4,8}$/.test(code);
|
|
260
|
-
if (context.channel === "
|
|
261
|
+
if (context.channel === "phone") {
|
|
261
262
|
if (isNumeric) {
|
|
262
263
|
return `To complete guardian verification, speak or enter the ${code.length}-digit code: ${code}.`;
|
|
263
264
|
}
|
|
@@ -289,6 +290,9 @@ export function getFallbackMessage(context: ApprovalMessageContext): string {
|
|
|
289
290
|
case "approval_already_resolved":
|
|
290
291
|
return "This approval request has already been resolved.";
|
|
291
292
|
|
|
293
|
+
case "guardian_text_unavailable":
|
|
294
|
+
return "I can't process text replies for approvals right now. Please use the approve/deny buttons above to respond.";
|
|
295
|
+
|
|
292
296
|
default: {
|
|
293
297
|
// Exhaustive check — TypeScript will flag if a scenario is missing.
|
|
294
298
|
const _exhaustive: never = context.scenario;
|