@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,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Channel
|
|
2
|
+
* Channel verification service.
|
|
3
3
|
*
|
|
4
|
-
* Encapsulates the business logic for the
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Encapsulates the business logic for the verification session lifecycle:
|
|
5
|
+
* creating sessions with cryptographic secrets, validating and consuming
|
|
6
|
+
* them, and managing guardian bindings.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { createHash, randomBytes } from "crypto";
|
|
@@ -15,27 +15,29 @@ import type {
|
|
|
15
15
|
GuardianBinding,
|
|
16
16
|
IdentityBindingStatus,
|
|
17
17
|
SessionStatus,
|
|
18
|
-
VerificationChallenge,
|
|
19
18
|
VerificationPurpose,
|
|
20
|
-
|
|
19
|
+
VerificationSession,
|
|
20
|
+
} from "../memory/channel-verification-sessions.js";
|
|
21
21
|
import {
|
|
22
22
|
bindSessionIdentity as storeBindSessionIdentity,
|
|
23
|
-
|
|
23
|
+
consumeSession,
|
|
24
24
|
countRecentSendsToDestination as storeCountRecentSendsToDestination,
|
|
25
|
-
|
|
25
|
+
createInboundSession,
|
|
26
26
|
createVerificationSession,
|
|
27
27
|
findActiveSession as storeFindActiveSession,
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
findPendingSessionByHash,
|
|
29
|
+
findPendingSessionForChannel,
|
|
30
30
|
findSessionByBootstrapTokenHash as storeFindSessionByBootstrapTokenHash,
|
|
31
31
|
findSessionByIdentity as storeFindSessionByIdentity,
|
|
32
|
+
revokePendingSessions as storeRevokePendingSessions,
|
|
33
|
+
updateSessionDelivery as storeUpdateSessionDelivery,
|
|
34
|
+
updateSessionStatus as storeUpdateSessionStatus,
|
|
35
|
+
} from "../memory/channel-verification-sessions.js";
|
|
36
|
+
import {
|
|
32
37
|
getRateLimit,
|
|
33
38
|
recordInvalidAttempt,
|
|
34
39
|
resetRateLimit,
|
|
35
|
-
|
|
36
|
-
updateSessionDelivery as storeUpdateSessionDelivery,
|
|
37
|
-
updateSessionStatus as storeUpdateSessionStatus,
|
|
38
|
-
} from "../memory/channel-guardian-store.js";
|
|
40
|
+
} from "../memory/guardian-rate-limits.js";
|
|
39
41
|
import { composeApprovalMessage } from "./approval-message-composer.js";
|
|
40
42
|
|
|
41
43
|
// ---------------------------------------------------------------------------
|
|
@@ -58,7 +60,7 @@ const RATE_LIMIT_LOCKOUT_MS = 30 * 60 * 1000;
|
|
|
58
60
|
// Types
|
|
59
61
|
// ---------------------------------------------------------------------------
|
|
60
62
|
|
|
61
|
-
export interface
|
|
63
|
+
export interface CreateVerificationSessionResult {
|
|
62
64
|
challengeId: string;
|
|
63
65
|
secret: string;
|
|
64
66
|
verifyCommand: string;
|
|
@@ -66,7 +68,7 @@ export interface CreateChallengeResult {
|
|
|
66
68
|
instruction: string;
|
|
67
69
|
}
|
|
68
70
|
|
|
69
|
-
export type
|
|
71
|
+
export type ValidateVerificationResult =
|
|
70
72
|
| { success: true; verificationType: "guardian" | "trusted_contact" }
|
|
71
73
|
| { success: false; reason: string };
|
|
72
74
|
|
|
@@ -96,24 +98,24 @@ function generateNumericSecret(digits: number = 6): string {
|
|
|
96
98
|
}
|
|
97
99
|
|
|
98
100
|
/**
|
|
99
|
-
* Create a new verification
|
|
101
|
+
* Create a new inbound verification session for a guardian candidate.
|
|
100
102
|
*
|
|
101
|
-
* Inbound
|
|
102
|
-
* skips the identity check
|
|
103
|
-
*
|
|
104
|
-
*
|
|
103
|
+
* Inbound sessions are not identity-bound (`identityBindingStatus: null`),
|
|
104
|
+
* so `validateAndConsumeVerification` skips the identity check and code
|
|
105
|
+
* secrecy is the only protection against brute-force guessing during the
|
|
106
|
+
* TTL window. A 32-byte hex secret provides ~2^128 entropy, making
|
|
105
107
|
* enumeration infeasible. Identity-bound outbound sessions (created via
|
|
106
108
|
* `createOutboundSession`) use shorter 6-digit numeric codes because the
|
|
107
109
|
* identity check adds a second layer of protection.
|
|
108
110
|
*
|
|
109
|
-
* Hashes the secret (SHA-256) and stores the
|
|
111
|
+
* Hashes the secret (SHA-256) and stores the session record with a
|
|
110
112
|
* 10-minute TTL. The raw secret is returned so it can be displayed to
|
|
111
113
|
* the user; only the hash is persisted.
|
|
112
114
|
*/
|
|
113
|
-
export function
|
|
115
|
+
export function createInboundVerificationSession(
|
|
114
116
|
channel: string,
|
|
115
117
|
sessionId?: string,
|
|
116
|
-
):
|
|
118
|
+
): CreateVerificationSessionResult {
|
|
117
119
|
// High-entropy hex for unbound inbound challenges — 6-digit numeric
|
|
118
120
|
// codes are only safe when identity binding provides a second factor.
|
|
119
121
|
const secret = randomBytes(32).toString("hex");
|
|
@@ -121,7 +123,7 @@ export function createVerificationChallenge(
|
|
|
121
123
|
const challengeId = uuid();
|
|
122
124
|
const expiresAt = Date.now() + CHALLENGE_TTL_MS;
|
|
123
125
|
|
|
124
|
-
|
|
126
|
+
createInboundSession({
|
|
125
127
|
id: challengeId,
|
|
126
128
|
channel,
|
|
127
129
|
challengeHash,
|
|
@@ -159,14 +161,14 @@ export function createVerificationChallenge(
|
|
|
159
161
|
* exceeding the threshold the actor is locked out for a cooldown
|
|
160
162
|
* period. On success the counter resets.
|
|
161
163
|
*/
|
|
162
|
-
export function
|
|
164
|
+
export function validateAndConsumeVerification(
|
|
163
165
|
channel: string,
|
|
164
166
|
secret: string,
|
|
165
167
|
actorExternalUserId: string,
|
|
166
168
|
actorChatId: string,
|
|
167
169
|
_actorUsername?: string,
|
|
168
170
|
_actorDisplayName?: string,
|
|
169
|
-
):
|
|
171
|
+
): ValidateVerificationResult {
|
|
170
172
|
// ── Rate-limit check ──
|
|
171
173
|
const existing = getRateLimit(channel, actorExternalUserId, actorChatId);
|
|
172
174
|
if (
|
|
@@ -187,7 +189,7 @@ export function validateAndConsumeChallenge(
|
|
|
187
189
|
|
|
188
190
|
const challengeHash = hashSecret(secret);
|
|
189
191
|
|
|
190
|
-
const challenge =
|
|
192
|
+
const challenge = findPendingSessionByHash(channel, challengeHash);
|
|
191
193
|
if (!challenge) {
|
|
192
194
|
recordInvalidAttempt(
|
|
193
195
|
channel,
|
|
@@ -225,11 +227,11 @@ export function validateAndConsumeChallenge(
|
|
|
225
227
|
}
|
|
226
228
|
|
|
227
229
|
// ── Expected-identity check (outbound sessions) ──
|
|
228
|
-
// If the session
|
|
229
|
-
// verify the actor matches
|
|
230
|
-
//
|
|
231
|
-
//
|
|
232
|
-
//
|
|
230
|
+
// If the session is in 'bound' state AND has at least one expected-identity
|
|
231
|
+
// field, verify the actor matches. Inbound-only sessions have no expected
|
|
232
|
+
// identity and rely on code secrecy alone. If identity_binding_status is
|
|
233
|
+
// 'pending_bootstrap', allow consumption (bootstrap path handles binding
|
|
234
|
+
// separately).
|
|
233
235
|
const hasExpectedIdentity =
|
|
234
236
|
challenge.expectedExternalUserId != null ||
|
|
235
237
|
challenge.expectedChatId != null ||
|
|
@@ -238,7 +240,7 @@ export function validateAndConsumeChallenge(
|
|
|
238
240
|
if (hasExpectedIdentity && challenge.identityBindingStatus === "bound") {
|
|
239
241
|
let identityMatch = false;
|
|
240
242
|
|
|
241
|
-
// For
|
|
243
|
+
// For voice: verify actorExternalUserId matches expectedPhoneE164
|
|
242
244
|
// OR actorExternalUserId matches expectedExternalUserId
|
|
243
245
|
if (challenge.expectedPhoneE164 != null) {
|
|
244
246
|
if (
|
|
@@ -298,10 +300,9 @@ export function validateAndConsumeChallenge(
|
|
|
298
300
|
}
|
|
299
301
|
}
|
|
300
302
|
// pending_bootstrap: allow consumption without identity check
|
|
301
|
-
// no expected identity: legacy/inbound-only, skip identity check
|
|
302
303
|
|
|
303
304
|
// Consume the challenge so it cannot be reused
|
|
304
|
-
|
|
305
|
+
consumeSession(challenge.id, actorExternalUserId, actorChatId);
|
|
305
306
|
|
|
306
307
|
// Reset the rate-limit counter on success
|
|
307
308
|
resetRateLimit(channel, actorExternalUserId, actorChatId);
|
|
@@ -321,7 +322,7 @@ export function validateAndConsumeChallenge(
|
|
|
321
322
|
/**
|
|
322
323
|
* Look up the active guardian binding for a given assistant and channel.
|
|
323
324
|
* Reads from the contacts table via findGuardianForChannel and
|
|
324
|
-
* synthesizes a GuardianBinding-shaped object
|
|
325
|
+
* synthesizes a GuardianBinding-shaped object.
|
|
325
326
|
* Returns null when no contacts match.
|
|
326
327
|
*/
|
|
327
328
|
export function getGuardianBinding(
|
|
@@ -374,23 +375,21 @@ export function revokeBinding(assistantId: string, channel: string): boolean {
|
|
|
374
375
|
}
|
|
375
376
|
|
|
376
377
|
/**
|
|
377
|
-
* Revoke all pending
|
|
378
|
-
* Called when the user cancels verification so that stale
|
|
378
|
+
* Revoke all pending sessions for a given channel.
|
|
379
|
+
* Called when the user cancels verification so that stale sessions
|
|
379
380
|
* don't gate inbound calls.
|
|
380
381
|
*/
|
|
381
|
-
export function
|
|
382
|
-
|
|
382
|
+
export function revokePendingSessions(channel: string): void {
|
|
383
|
+
storeRevokePendingSessions(channel);
|
|
383
384
|
}
|
|
384
385
|
|
|
385
386
|
/**
|
|
386
|
-
* Look up a pending (non-expired) verification
|
|
387
|
+
* Look up a pending (non-expired) verification session for a given
|
|
387
388
|
* channel. Used by relay setup to detect whether an active
|
|
388
389
|
* voice verification session exists.
|
|
389
390
|
*/
|
|
390
|
-
export function
|
|
391
|
-
channel
|
|
392
|
-
): VerificationChallenge | null {
|
|
393
|
-
return findPendingChallengeForChannel(channel);
|
|
391
|
+
export function getPendingSession(channel: string): VerificationSession | null {
|
|
392
|
+
return findPendingSessionForChannel(channel);
|
|
394
393
|
}
|
|
395
394
|
|
|
396
395
|
// ---------------------------------------------------------------------------
|
|
@@ -409,7 +408,7 @@ export interface CreateOutboundSessionResult {
|
|
|
409
408
|
* Create an outbound verification session with expected identity pre-set.
|
|
410
409
|
* Returns session info including the secret for outbound delivery.
|
|
411
410
|
*
|
|
412
|
-
* Channels where identity is pre-bound (
|
|
411
|
+
* Channels where identity is pre-bound (voice, Telegram with known
|
|
413
412
|
* chat ID) use 6-digit numeric codes for ease of entry. Unbound bootstrap
|
|
414
413
|
* sessions (e.g. Telegram handle where identity is not yet known) use
|
|
415
414
|
* high-entropy 32-byte hex secrets to prevent brute-force guessing during
|
|
@@ -470,9 +469,7 @@ export function createOutboundSession(params: {
|
|
|
470
469
|
/**
|
|
471
470
|
* Find the most recent active outbound session for a given channel.
|
|
472
471
|
*/
|
|
473
|
-
export function findActiveSession(
|
|
474
|
-
channel: string,
|
|
475
|
-
): VerificationChallenge | null {
|
|
472
|
+
export function findActiveSession(channel: string): VerificationSession | null {
|
|
476
473
|
return storeFindActiveSession(channel);
|
|
477
474
|
}
|
|
478
475
|
|
|
@@ -484,7 +481,7 @@ export function findSessionByIdentity(
|
|
|
484
481
|
externalUserId?: string,
|
|
485
482
|
chatId?: string,
|
|
486
483
|
phoneE164?: string,
|
|
487
|
-
):
|
|
484
|
+
): VerificationSession | null {
|
|
488
485
|
return storeFindSessionByIdentity(channel, externalUserId, chatId, phoneE164);
|
|
489
486
|
}
|
|
490
487
|
|
|
@@ -515,7 +512,7 @@ export function updateSessionDelivery(
|
|
|
515
512
|
}
|
|
516
513
|
|
|
517
514
|
/**
|
|
518
|
-
* Count total
|
|
515
|
+
* Count total sends to a destination across all sessions within a
|
|
519
516
|
* rolling time window. Prevents circumvention of per-session limits by
|
|
520
517
|
* repeatedly creating new sessions to the same phone number.
|
|
521
518
|
*/
|
|
@@ -550,7 +547,7 @@ export function bindSessionIdentity(
|
|
|
550
547
|
export function resolveBootstrapToken(
|
|
551
548
|
channel: string,
|
|
552
549
|
token: string,
|
|
553
|
-
):
|
|
550
|
+
): VerificationSession | null {
|
|
554
551
|
const tokenHash = hashSecret(token);
|
|
555
552
|
return storeFindSessionByBootstrapTokenHash(channel, tokenHash);
|
|
556
553
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* When a trusted-contact channel session creates a confirmation_request (tool approval),
|
|
5
5
|
* this helper emits a guardian.question notification signal and persists canonical
|
|
6
|
-
* delivery rows to guardian destinations (Telegram/
|
|
6
|
+
* delivery rows to guardian destinations (Telegram/Slack/Vellum), enabling the guardian
|
|
7
7
|
* to approve via callback/request-code path.
|
|
8
8
|
*
|
|
9
9
|
* Modeled after the tool-grant-request-helper pattern. Designed to be called from
|
|
@@ -22,7 +22,7 @@ import type { NotificationSourceChannel } from "../notifications/signal.js";
|
|
|
22
22
|
import { canonicalizeInboundIdentity } from "../util/canonicalize-identity.js";
|
|
23
23
|
import { getLogger } from "../util/logger.js";
|
|
24
24
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "./assistant-scope.js";
|
|
25
|
-
import { getGuardianBinding } from "./channel-
|
|
25
|
+
import { getGuardianBinding } from "./channel-verification-service.js";
|
|
26
26
|
|
|
27
27
|
const log = getLogger("confirmation-request-guardian-bridge");
|
|
28
28
|
|
|
@@ -181,7 +181,6 @@ export function bridgeConfirmationRequestToGuardian(
|
|
|
181
181
|
.then((signalResult) => {
|
|
182
182
|
for (const result of signalResult.deliveryResults) {
|
|
183
183
|
if (result.channel === "vellum") continue; // handled in onThreadCreated
|
|
184
|
-
if (result.channel !== "telegram" && result.channel !== "sms") continue;
|
|
185
184
|
createCanonicalGuardianDelivery({
|
|
186
185
|
requestId: canonicalRequest.id,
|
|
187
186
|
destinationChannel: result.channel,
|
|
@@ -13,8 +13,6 @@ const MANAGED_CALLBACK_TOKEN_HEADER = "X-Managed-Gateway-Callback-Token";
|
|
|
13
13
|
const MANAGED_IDEMPOTENCY_HEADER = "X-Idempotency-Key";
|
|
14
14
|
const MANAGED_OUTBOUND_MAX_ATTEMPTS = 3;
|
|
15
15
|
const MANAGED_OUTBOUND_RETRY_BASE_MS = 150;
|
|
16
|
-
const SMS_ATTACHMENTS_FALLBACK_TEXT =
|
|
17
|
-
"I have a media attachment to share, but SMS currently supports text only.";
|
|
18
16
|
|
|
19
17
|
export interface ChannelReplyPayload {
|
|
20
18
|
chatId: string;
|
|
@@ -33,6 +31,8 @@ export interface ChannelReplyPayload {
|
|
|
33
31
|
ephemeral?: boolean;
|
|
34
32
|
/** Slack user ID — required when `ephemeral` is true. */
|
|
35
33
|
user?: string;
|
|
34
|
+
/** Telegram message_id for editing an existing message instead of sending a new one. */
|
|
35
|
+
messageId?: number;
|
|
36
36
|
/** When provided, instructs the delivery endpoint to update an existing message instead of posting a new one. */
|
|
37
37
|
messageTs?: string;
|
|
38
38
|
/** When true, auto-generate Block Kit blocks from text via textToBlocks(). */
|
|
@@ -45,13 +45,15 @@ export interface ChannelDeliveryResult {
|
|
|
45
45
|
ok: boolean;
|
|
46
46
|
/** The message timestamp returned by the delivery endpoint (e.g. Slack message ts). */
|
|
47
47
|
ts?: string;
|
|
48
|
+
/** The Telegram message_id returned when a new message was sent. */
|
|
49
|
+
messageId?: number;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
interface ManagedOutboundCallbackContext {
|
|
51
53
|
requestUrl: string;
|
|
52
54
|
routeId: string;
|
|
53
55
|
assistantId: string;
|
|
54
|
-
sourceChannel: "
|
|
56
|
+
sourceChannel: "phone";
|
|
55
57
|
sourceUpdateId?: string;
|
|
56
58
|
callbackToken?: string;
|
|
57
59
|
}
|
|
@@ -92,11 +94,14 @@ export async function deliverChannelReply(
|
|
|
92
94
|
);
|
|
93
95
|
}
|
|
94
96
|
|
|
95
|
-
|
|
97
|
+
const result: ChannelDeliveryResult = { ok: true };
|
|
96
98
|
try {
|
|
97
99
|
const responseBody = (await response.json()) as Record<string, unknown>;
|
|
98
100
|
if (typeof responseBody.ts === "string") {
|
|
99
|
-
result =
|
|
101
|
+
result.ts = responseBody.ts;
|
|
102
|
+
}
|
|
103
|
+
if (typeof responseBody.messageId === "number") {
|
|
104
|
+
result.messageId = responseBody.messageId;
|
|
100
105
|
}
|
|
101
106
|
} catch {
|
|
102
107
|
// Response may not be JSON for non-Slack channels; that's fine.
|
|
@@ -138,11 +143,7 @@ function parseManagedOutboundCallback(
|
|
|
138
143
|
const assistantId = parsed.searchParams.get("assistant_id")?.trim();
|
|
139
144
|
const sourceChannel = parsed.searchParams.get("source_channel")?.trim();
|
|
140
145
|
|
|
141
|
-
if (
|
|
142
|
-
!routeId ||
|
|
143
|
-
!assistantId ||
|
|
144
|
-
(sourceChannel !== "sms" && sourceChannel !== "voice")
|
|
145
|
-
) {
|
|
146
|
+
if (!routeId || !assistantId || sourceChannel !== "phone") {
|
|
146
147
|
throw new Error(
|
|
147
148
|
"Managed outbound callback URL is missing required route_id, assistant_id, or source_channel.",
|
|
148
149
|
);
|
|
@@ -185,11 +186,7 @@ async function deliverManagedOutboundReply(
|
|
|
185
186
|
Array.isArray(payload.attachments) && payload.attachments.length > 0;
|
|
186
187
|
const text = payload.approval?.plainTextFallback ?? payload.text;
|
|
187
188
|
const normalizedText =
|
|
188
|
-
typeof text === "string" && text.trim().length > 0
|
|
189
|
-
? text
|
|
190
|
-
: hasAttachments
|
|
191
|
-
? SMS_ATTACHMENTS_FALLBACK_TEXT
|
|
192
|
-
: "";
|
|
189
|
+
typeof text === "string" && text.trim().length > 0 ? text : "";
|
|
193
190
|
if (!normalizedText) {
|
|
194
191
|
throw new Error(
|
|
195
192
|
"Managed outbound delivery requires text or plainTextFallback.",
|
|
@@ -2,11 +2,9 @@
|
|
|
2
2
|
* Guardian action follow-up executor.
|
|
3
3
|
*
|
|
4
4
|
* After the conversation engine classifies the guardian's reply as
|
|
5
|
-
* `call_back`
|
|
6
|
-
*
|
|
5
|
+
* `call_back` and transitions the follow-up state to `dispatching`,
|
|
6
|
+
* this module executes the actual action:
|
|
7
7
|
*
|
|
8
|
-
* - **message_back**: Generates outbound SMS text and sends it to the
|
|
9
|
-
* counterparty phone number via the gateway's /deliver/sms endpoint.
|
|
10
8
|
* - **call_back**: Starts an outbound call to the counterparty with
|
|
11
9
|
* context about the guardian's answer.
|
|
12
10
|
*
|
|
@@ -14,13 +12,12 @@
|
|
|
14
12
|
* dispatches the appropriate action, and returns a result with generated
|
|
15
13
|
* reply text for the guardian's confirmation message.
|
|
16
14
|
*
|
|
17
|
-
* This module is channel-agnostic: both inbound-message-handler (Telegram
|
|
18
|
-
*
|
|
15
|
+
* This module is channel-agnostic: both inbound-message-handler (Telegram
|
|
16
|
+
* channels) and session-process (mac/IPC channel) use it.
|
|
19
17
|
*/
|
|
20
18
|
|
|
21
19
|
import { startCall } from "../calls/call-domain.js";
|
|
22
20
|
import { getCallSession } from "../calls/call-store.js";
|
|
23
|
-
import { getGatewayInternalBaseUrl } from "../config/env.js";
|
|
24
21
|
import { getOrCreateConversation } from "../memory/conversation-key-store.js";
|
|
25
22
|
import {
|
|
26
23
|
finalizeFollowup,
|
|
@@ -30,8 +27,6 @@ import {
|
|
|
30
27
|
} from "../memory/guardian-action-store.js";
|
|
31
28
|
import { getLogger } from "../util/logger.js";
|
|
32
29
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "./assistant-scope.js";
|
|
33
|
-
import { mintDaemonDeliveryToken } from "./auth/token-service.js";
|
|
34
|
-
import { deliverChannelReply } from "./gateway-client.js";
|
|
35
30
|
import { composeGuardianActionMessageGenerative } from "./guardian-action-message-composer.js";
|
|
36
31
|
import type { GuardianActionCopyGenerator } from "./http-types.js";
|
|
37
32
|
|
|
@@ -105,62 +100,6 @@ export function resolveCounterparty(
|
|
|
105
100
|
// Action dispatchers
|
|
106
101
|
// ---------------------------------------------------------------------------
|
|
107
102
|
|
|
108
|
-
/**
|
|
109
|
-
* Send an SMS to the counterparty with the guardian's answer context.
|
|
110
|
-
* Uses the gateway's /deliver/sms endpoint (same path as the SMS notification adapter).
|
|
111
|
-
*/
|
|
112
|
-
async function executeMessageBack(
|
|
113
|
-
request: GuardianActionRequest,
|
|
114
|
-
counterparty: CounterpartyInfo,
|
|
115
|
-
generator?: GuardianActionCopyGenerator,
|
|
116
|
-
): Promise<{ ok: true } | { ok: false; error: string }> {
|
|
117
|
-
try {
|
|
118
|
-
// Generate the outbound SMS text using the composer
|
|
119
|
-
const messageText = await composeGuardianActionMessageGenerative(
|
|
120
|
-
{
|
|
121
|
-
scenario: "outbound_message_copy",
|
|
122
|
-
questionText: request.questionText,
|
|
123
|
-
lateAnswerText: request.lateAnswerText ?? undefined,
|
|
124
|
-
callerIdentifier: counterparty.displayIdentifier,
|
|
125
|
-
},
|
|
126
|
-
{},
|
|
127
|
-
generator,
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
const gatewayBase = getGatewayInternalBaseUrl();
|
|
131
|
-
const deliverUrl = `${gatewayBase}/deliver/sms`;
|
|
132
|
-
const bearerToken = mintDaemonDeliveryToken();
|
|
133
|
-
|
|
134
|
-
await deliverChannelReply(
|
|
135
|
-
deliverUrl,
|
|
136
|
-
{
|
|
137
|
-
chatId: counterparty.phoneNumber,
|
|
138
|
-
text: messageText,
|
|
139
|
-
assistantId: DAEMON_INTERNAL_ASSISTANT_ID,
|
|
140
|
-
},
|
|
141
|
-
bearerToken,
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
log.info(
|
|
145
|
-
{ requestId: request.id, counterpartyPhone: counterparty.phoneNumber },
|
|
146
|
-
"Follow-up message_back SMS sent successfully",
|
|
147
|
-
);
|
|
148
|
-
|
|
149
|
-
return { ok: true };
|
|
150
|
-
} catch (err) {
|
|
151
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
152
|
-
log.error(
|
|
153
|
-
{
|
|
154
|
-
err,
|
|
155
|
-
requestId: request.id,
|
|
156
|
-
counterpartyPhone: counterparty.phoneNumber,
|
|
157
|
-
},
|
|
158
|
-
"Failed to send follow-up message_back SMS",
|
|
159
|
-
);
|
|
160
|
-
return { ok: false, error: message };
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
103
|
/**
|
|
165
104
|
* Start an outbound call to the counterparty with context about the
|
|
166
105
|
* guardian's answer. Uses the existing call start domain flow.
|
|
@@ -307,12 +246,11 @@ export async function executeFollowupAction(
|
|
|
307
246
|
// Execute the action
|
|
308
247
|
let actionResult: { ok: true } | { ok: false; error: string };
|
|
309
248
|
|
|
310
|
-
if (action === "
|
|
311
|
-
actionResult = await executeMessageBack(request, counterparty, generator);
|
|
312
|
-
} else if (action === "call_back") {
|
|
249
|
+
if (action === "call_back") {
|
|
313
250
|
actionResult = await executeCallBack(request, counterparty);
|
|
314
251
|
} else {
|
|
315
|
-
// decline is already handled in M5 — should not reach the executor
|
|
252
|
+
// decline is already handled in M5 — should not reach the executor.
|
|
253
|
+
// message_back (SMS) is no longer supported.
|
|
316
254
|
finalizeFollowup(requestId, "failed");
|
|
317
255
|
const errorText = await composeGuardianActionMessageGenerative(
|
|
318
256
|
{
|
|
@@ -333,10 +271,7 @@ export async function executeFollowupAction(
|
|
|
333
271
|
if (actionResult.ok) {
|
|
334
272
|
finalizeFollowup(requestId, "completed");
|
|
335
273
|
|
|
336
|
-
const scenario =
|
|
337
|
-
action === "message_back"
|
|
338
|
-
? ("followup_message_sent" as const)
|
|
339
|
-
: ("followup_call_started" as const);
|
|
274
|
+
const scenario = "followup_call_started" as const;
|
|
340
275
|
const confirmText = await composeGuardianActionMessageGenerative(
|
|
341
276
|
{
|
|
342
277
|
scenario,
|
|
@@ -11,7 +11,6 @@ import { mintGrantFromDecision } from "../approvals/approval-primitive.js";
|
|
|
11
11
|
import type { GuardianActionRequest } from "../memory/guardian-action-store.js";
|
|
12
12
|
import { getLogger } from "../util/logger.js";
|
|
13
13
|
import { runApprovalConversationTurn } from "./approval-conversation-turn.js";
|
|
14
|
-
import { parseApprovalDecision } from "./channel-approval-parser.js";
|
|
15
14
|
import type { ApprovalConversationGenerator } from "./http-types.js";
|
|
16
15
|
|
|
17
16
|
const log = getLogger("guardian-action-grant-minter");
|
|
@@ -23,14 +22,13 @@ export const GUARDIAN_ACTION_GRANT_TTL_MS = 5 * 60 * 1000;
|
|
|
23
22
|
* Mint a `tool_signature` scoped grant when a guardian-action request is
|
|
24
23
|
* resolved and the request carries tool metadata (toolName + inputDigest).
|
|
25
24
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* parser returns null and an approvalConversationGenerator is provided.
|
|
25
|
+
* Classifies the guardian's answer via the conversational approval engine
|
|
26
|
+
* (`runApprovalConversationTurn`). Only `approve_once` produces a grant —
|
|
27
|
+
* guardian-action grants are always single-use `tool_signature` scoped.
|
|
30
28
|
*
|
|
31
29
|
* Skips silently when:
|
|
32
30
|
* - The resolved request has no toolName/inputDigest (informational consult).
|
|
33
|
-
* - The guardian's answer is not classified as approval
|
|
31
|
+
* - The guardian's answer is not classified as approval (fail-closed).
|
|
34
32
|
*
|
|
35
33
|
* Fails silently on error -- grant minting is best-effort and must never
|
|
36
34
|
* block the guardian-action answer flow.
|
|
@@ -40,7 +38,7 @@ export async function tryMintGuardianActionGrant(params: {
|
|
|
40
38
|
answerText: string;
|
|
41
39
|
decisionChannel: string;
|
|
42
40
|
guardianExternalUserId?: string;
|
|
43
|
-
approvalConversationGenerator
|
|
41
|
+
approvalConversationGenerator: ApprovalConversationGenerator;
|
|
44
42
|
}): Promise<void> {
|
|
45
43
|
const {
|
|
46
44
|
request,
|
|
@@ -56,63 +54,50 @@ export async function tryMintGuardianActionGrant(params: {
|
|
|
56
54
|
return;
|
|
57
55
|
}
|
|
58
56
|
|
|
59
|
-
//
|
|
60
|
-
// Guardian-action invariant: grants are always one-time `tool_signature`
|
|
61
|
-
// scoped. We treat `approve_always` from the deterministic parser the
|
|
62
|
-
// same as `approve_once` -- the grant is still single-use. This keeps
|
|
63
|
-
// the guardian-action path aligned with the primary approval interception
|
|
64
|
-
// flow where guardians are limited to approve_once / reject.
|
|
65
|
-
const decision = parseApprovalDecision(answerText);
|
|
66
|
-
let isApproval =
|
|
67
|
-
decision?.action === "approve_once" ||
|
|
68
|
-
decision?.action === "approve_always";
|
|
69
|
-
|
|
70
|
-
// Tier 2: LLM fallback -- when the deterministic parser found no match
|
|
71
|
-
// and a generator is available, delegate to the conversational engine.
|
|
57
|
+
// Classify the guardian's answer via the conversational approval engine.
|
|
72
58
|
// Only allow approve_once (not approve_always) to keep guardian-action
|
|
73
59
|
// grants strictly one-time and consistent with guardian policy.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
60
|
+
let isApproval = false;
|
|
61
|
+
try {
|
|
62
|
+
const llmResult = await runApprovalConversationTurn(
|
|
63
|
+
{
|
|
64
|
+
toolName: request.toolName,
|
|
65
|
+
allowedActions: ["approve_once", "reject"],
|
|
66
|
+
role: "guardian",
|
|
67
|
+
pendingApprovals: [
|
|
68
|
+
{ requestId: request.id, toolName: request.toolName },
|
|
69
|
+
],
|
|
70
|
+
userMessage: answerText,
|
|
71
|
+
},
|
|
72
|
+
approvalConversationGenerator,
|
|
73
|
+
);
|
|
88
74
|
|
|
89
|
-
|
|
75
|
+
isApproval = llmResult.disposition === "approve_once";
|
|
90
76
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
77
|
+
log.info(
|
|
78
|
+
{
|
|
79
|
+
event: "guardian_action_grant_classification",
|
|
80
|
+
toolName: request.toolName,
|
|
81
|
+
requestId: request.id,
|
|
82
|
+
answerText,
|
|
83
|
+
llmDisposition: llmResult.disposition,
|
|
84
|
+
matched: isApproval,
|
|
85
|
+
decisionChannel,
|
|
86
|
+
},
|
|
87
|
+
`Approval classifier returned disposition: ${llmResult.disposition}`,
|
|
88
|
+
);
|
|
89
|
+
} catch (err) {
|
|
90
|
+
// Fail-closed: generator errors must not produce grants.
|
|
91
|
+
log.warn(
|
|
92
|
+
{
|
|
93
|
+
event: "guardian_action_grant_classification_error",
|
|
94
|
+
toolName: request.toolName,
|
|
95
|
+
requestId: request.id,
|
|
96
|
+
err,
|
|
97
|
+
decisionChannel,
|
|
98
|
+
},
|
|
99
|
+
"Approval classifier threw an error; treating as non-approval (fail-closed)",
|
|
100
|
+
);
|
|
116
101
|
}
|
|
117
102
|
|
|
118
103
|
if (!isApproval) {
|
|
@@ -122,7 +107,6 @@ export async function tryMintGuardianActionGrant(params: {
|
|
|
122
107
|
toolName: request.toolName,
|
|
123
108
|
requestId: request.id,
|
|
124
109
|
answerText,
|
|
125
|
-
parsedAction: decision?.action ?? null,
|
|
126
110
|
decisionChannel,
|
|
127
111
|
},
|
|
128
112
|
"Skipped grant minting: guardian answer not classified as approval",
|