@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
|
@@ -33,9 +33,23 @@ export interface MemoryRecallCandiateDebug {
|
|
|
33
33
|
recency: number;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
export type DegradationReason =
|
|
37
|
+
| "embedding_provider_down"
|
|
38
|
+
| "qdrant_unavailable"
|
|
39
|
+
| "embedding_generation_failed";
|
|
40
|
+
|
|
41
|
+
export type FallbackSource = "lexical" | "recency" | "direct_item" | "entity";
|
|
42
|
+
|
|
43
|
+
export interface DegradationStatus {
|
|
44
|
+
semanticUnavailable: boolean;
|
|
45
|
+
reason: DegradationReason;
|
|
46
|
+
fallbackSources: FallbackSource[];
|
|
47
|
+
}
|
|
48
|
+
|
|
36
49
|
export interface MemoryRecallResult {
|
|
37
50
|
enabled: boolean;
|
|
38
51
|
degraded: boolean;
|
|
52
|
+
degradation?: DegradationStatus;
|
|
39
53
|
reason?: string;
|
|
40
54
|
provider?: string;
|
|
41
55
|
model?: string;
|
|
@@ -96,6 +110,10 @@ export interface CollectedCandidates {
|
|
|
96
110
|
earlyTerminated: boolean;
|
|
97
111
|
/** True when semantic search was attempted but threw an error. */
|
|
98
112
|
semanticSearchFailed: boolean;
|
|
113
|
+
/** True when semantic search was known to be unavailable before retrieval (no vector or breaker open). */
|
|
114
|
+
semanticUnavailable: boolean;
|
|
115
|
+
/** The error that caused semantic search to fail, if any. */
|
|
116
|
+
semanticSearchError?: unknown;
|
|
99
117
|
merged: Candidate[];
|
|
100
118
|
}
|
|
101
119
|
|
|
@@ -122,23 +140,6 @@ export interface ItemMetadata {
|
|
|
122
140
|
verificationState: string;
|
|
123
141
|
}
|
|
124
142
|
|
|
125
|
-
export interface MemorySearchResult {
|
|
126
|
-
id: string;
|
|
127
|
-
type: CandidateType;
|
|
128
|
-
kind: string;
|
|
129
|
-
text: string;
|
|
130
|
-
confidence: number;
|
|
131
|
-
importance: number;
|
|
132
|
-
createdAt: number;
|
|
133
|
-
finalScore: number;
|
|
134
|
-
/** Per-source scores for provenance/debugging */
|
|
135
|
-
scores: {
|
|
136
|
-
lexical: number;
|
|
137
|
-
semantic: number;
|
|
138
|
-
recency: number;
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
143
|
import type { EntityRelationType, EntityType } from "../entity-extractor.js";
|
|
143
144
|
|
|
144
145
|
export interface TraversalOptions {
|
|
@@ -128,7 +128,7 @@ export const telegramBotMessagingProvider: MessagingProvider = {
|
|
|
128
128
|
// conversation key mapping and binding exist for the next inbound.
|
|
129
129
|
try {
|
|
130
130
|
const sourceChannel = "telegram";
|
|
131
|
-
const conversationKey =
|
|
131
|
+
const conversationKey = `asst:self:${sourceChannel}:${conversationId}`;
|
|
132
132
|
const { conversationId: internalId } =
|
|
133
133
|
getOrCreateConversation(conversationKey);
|
|
134
134
|
externalConversationStore.upsertOutboundBinding({
|
|
@@ -107,10 +107,7 @@ export const whatsappMessagingProvider: MessagingProvider = {
|
|
|
107
107
|
// exists for the next inbound WhatsApp message from this number.
|
|
108
108
|
try {
|
|
109
109
|
const sourceChannel = "whatsapp";
|
|
110
|
-
const conversationKey =
|
|
111
|
-
assistantId && assistantId !== "self"
|
|
112
|
-
? `asst:${assistantId}:${sourceChannel}:${conversationId}`
|
|
113
|
-
: `${sourceChannel}:${conversationId}`;
|
|
110
|
+
const conversationKey = `asst:${assistantId ?? "self"}:${sourceChannel}:${conversationId}`;
|
|
114
111
|
const { conversationId: internalId } =
|
|
115
112
|
getOrCreateConversation(conversationKey);
|
|
116
113
|
if (!assistantId || assistantId === "self") {
|
|
@@ -14,7 +14,6 @@ import type { MessagingProvider } from "./provider.js";
|
|
|
14
14
|
const PLATFORM_FLAG_KEYS: Record<string, string> = {
|
|
15
15
|
gmail: "feature_flags.messaging.gmail.enabled",
|
|
16
16
|
telegram: "feature_flags.messaging.telegram.enabled",
|
|
17
|
-
sms: "feature_flags.sms.enabled",
|
|
18
17
|
};
|
|
19
18
|
|
|
20
19
|
const providers = new Map<string, MessagingProvider>();
|
|
@@ -86,11 +86,11 @@ Each policy defines:
|
|
|
86
86
|
|
|
87
87
|
### Conversation Strategy Types
|
|
88
88
|
|
|
89
|
-
| Strategy | Behavior | Used by
|
|
90
|
-
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
91
|
-
| `start_new_conversation` | Creates a fresh conversation per delivery. The thread is surfaced via
|
|
92
|
-
| `continue_existing_conversation` | Looks up a previously bound conversation by binding key (sourceChannel + externalChatId) and appends to it. When no bound conversation exists (first delivery to a destination), creates a new one and upserts the binding for future reuse. | `telegram`, `
|
|
93
|
-
| `not_deliverable` | Channel cannot receive notifications. Pairing returns null IDs. | `
|
|
89
|
+
| Strategy | Behavior | Used by |
|
|
90
|
+
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- |
|
|
91
|
+
| `start_new_conversation` | Creates a fresh conversation per delivery. The thread is surfaced via SSE. | `vellum` |
|
|
92
|
+
| `continue_existing_conversation` | Looks up a previously bound conversation by binding key (sourceChannel + externalChatId) and appends to it. When no bound conversation exists (first delivery to a destination), creates a new one and upserts the binding for future reuse. | `telegram`, `whatsapp`, `slack`, `email` |
|
|
93
|
+
| `not_deliverable` | Channel cannot receive notifications. Pairing returns null IDs. | `phone` |
|
|
94
94
|
|
|
95
95
|
### Helper Functions
|
|
96
96
|
|
|
@@ -264,7 +264,7 @@ The `enforceRoutingIntent()` function in `decision-engine.ts` runs after the LLM
|
|
|
264
264
|
- **`multi_channel`**: If the LLM selected fewer than 2 channels but 2+ are connected, expands `selectedChannels` to at least two connected channels.
|
|
265
265
|
- **`single_channel`**: No override -- the LLM's selection stands.
|
|
266
266
|
|
|
267
|
-
When enforcement changes the decision, the updated channel selection is re-persisted to the `notification_decisions` table so the stored decision matches what was actually dispatched. The `reasoningSummary` is annotated with the enforcement action (e.g. `[routing_intent=all_channels enforced: vellum, telegram
|
|
267
|
+
When enforcement changes the decision, the updated channel selection is re-persisted to the `notification_decisions` table so the stored decision matches what was actually dispatched. The `reasoningSummary` is annotated with the enforcement action (e.g. `[routing_intent=all_channels enforced: vellum, telegram]`).
|
|
268
268
|
|
|
269
269
|
### Single-Reminder Fanout
|
|
270
270
|
|
|
@@ -300,19 +300,12 @@ The macOS/iOS client posts a native `UNUserNotificationCenter` notification from
|
|
|
300
300
|
|
|
301
301
|
HTTP POST to the gateway's `/deliver/telegram` endpoint. The `TelegramAdapter` sends channel-native text (`deliveryText` when present) to the guardian's chat ID (resolved from the active guardian binding), with deterministic fallbacks when model copy is unavailable.
|
|
302
302
|
|
|
303
|
-
### SMS (when guardian binding exists)
|
|
304
|
-
|
|
305
|
-
HTTP POST to the gateway's `/deliver/sms` endpoint. The `SmsAdapter` follows the same pattern as the Telegram adapter: it resolves a phone number from the active guardian binding and sends text via the gateway, which forwards to the Twilio Messages API. The adapter resolves message text via a priority chain: `deliveryText` > `body` > `title` > humanized event name. The `assistantId` is threaded through the `ChannelDeliveryPayload` so the gateway can resolve the correct outbound phone number for multi-assistant deployments.
|
|
306
|
-
|
|
307
|
-
SMS delivery is text-only (no MMS). Graceful degradation: when the gateway is unreachable or SMS is not configured, the adapter returns a failed `DeliveryResult` without throwing, so the broadcaster continues delivering to other channels.
|
|
308
|
-
|
|
309
303
|
### Channel Connectivity
|
|
310
304
|
|
|
311
305
|
Connected channels are resolved at signal emission time by `getConnectedChannels()` in `emit-signal.ts`:
|
|
312
306
|
|
|
313
307
|
- **Vellum** is always considered connected (IPC socket is always available when the daemon is running)
|
|
314
308
|
- **Telegram** is considered connected only when an active guardian binding exists for the assistant (checked via `getActiveBinding()`)
|
|
315
|
-
- **SMS** is considered connected only when an active guardian binding exists for the assistant (same check as Telegram)
|
|
316
309
|
|
|
317
310
|
## Conversation Materialization
|
|
318
311
|
|
|
@@ -383,7 +376,7 @@ Each `guardian_action_request` is assigned a unique 6-character hex code (e.g. `
|
|
|
383
376
|
|
|
384
377
|
### Disambiguation Flow
|
|
385
378
|
|
|
386
|
-
The disambiguation logic is identical on all channels — mac/vellum (`session-process.ts`)
|
|
379
|
+
The disambiguation logic is identical on all channels — mac/vellum (`session-process.ts`) and Telegram (`inbound-message-handler.ts`):
|
|
387
380
|
|
|
388
381
|
1. **Single pending delivery in the thread**: The guardian's reply is matched to the sole pending request automatically. No request code prefix is needed. This is the **single-match fast path**.
|
|
389
382
|
|
|
@@ -397,7 +390,6 @@ The disambiguation invariant is enforced identically across:
|
|
|
397
390
|
|
|
398
391
|
- **Mac/Vellum** (`session-process.ts`): Intercepts user messages in conversations with pending guardian action deliveries before the agent loop runs.
|
|
399
392
|
- **Telegram** (`inbound-message-handler.ts`): Intercepts inbound messages matched to conversations with pending guardian action deliveries.
|
|
400
|
-
- **SMS** (`inbound-message-handler.ts`): Same codepath as Telegram.
|
|
401
393
|
|
|
402
394
|
All three paths use the same pattern: look up pending deliveries by conversation, apply single-match fast path or request-code prefix matching, and send disambiguation messages via the guardian action message composer when ambiguous.
|
|
403
395
|
|
|
@@ -424,13 +416,12 @@ All disambiguation messages are generated through `composeGuardianActionMessageG
|
|
|
424
416
|
| `decision-engine.ts` | LLM-based routing with forced tool_choice; deterministic fallback |
|
|
425
417
|
| `deterministic-checks.ts` | Pre-send gate checks (dedupe, source-active, channel availability) |
|
|
426
418
|
| `runtime-dispatch.ts` | Dispatch gating (no-op decisions, empty channels) |
|
|
427
|
-
| `broadcaster.ts` | Fan-out to channel adapters with delivery audit trail; emits `notification_thread_created`
|
|
428
|
-
| `copy-composer.ts` | Template-based fallback notification copy when LLM copy is unavailable
|
|
429
|
-
| `thread-seed-composer.ts` | Surface-aware thread seed generation (richer than notification copy)
|
|
430
|
-
| `destination-resolver.ts` | Resolves per-channel endpoints (vellum
|
|
431
|
-
| `adapters/macos.ts` | Vellum adapter -- broadcasts `notification_intent` via
|
|
419
|
+
| `broadcaster.ts` | Fan-out to channel adapters with delivery audit trail; emits `notification_thread_created` SSE event |
|
|
420
|
+
| `copy-composer.ts` | Template-based fallback notification copy when LLM copy is unavailable |
|
|
421
|
+
| `thread-seed-composer.ts` | Surface-aware thread seed generation (richer than notification copy) |
|
|
422
|
+
| `destination-resolver.ts` | Resolves per-channel endpoints (vellum SSE, Telegram chat ID) |
|
|
423
|
+
| `adapters/macos.ts` | Vellum adapter -- broadcasts `notification_intent` via SSE with deep-link metadata |
|
|
432
424
|
| `adapters/telegram.ts` | Telegram adapter -- POSTs to gateway `/deliver/telegram` |
|
|
433
|
-
| `adapters/sms.ts` | SMS adapter -- POSTs to gateway `/deliver/sms` via Twilio Messages API |
|
|
434
425
|
| `preference-extractor.ts` | Detects notification preferences in conversation messages |
|
|
435
426
|
| `preference-summary.ts` | Builds preference context string for the decision engine prompt |
|
|
436
427
|
| `preferences-store.ts` | CRUD for `notification_preferences` table |
|
|
@@ -461,7 +452,7 @@ await emitNotificationSignal({
|
|
|
461
452
|
},
|
|
462
453
|
// Optional: control multi-channel fanout behavior
|
|
463
454
|
routingIntent: "multi_channel", // 'single_channel' | 'multi_channel' | 'all_channels'
|
|
464
|
-
routingHints: { preferredChannels: ["telegram"
|
|
455
|
+
routingHints: { preferredChannels: ["telegram"] },
|
|
465
456
|
});
|
|
466
457
|
```
|
|
467
458
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* does not match their own identity.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import type { ServerMessage } from "../../daemon/
|
|
16
|
+
import type { ServerMessage } from "../../daemon/message-protocol.js";
|
|
17
17
|
import { getLogger } from "../../util/logger.js";
|
|
18
18
|
import type {
|
|
19
19
|
ChannelAdapter,
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
addMessage,
|
|
22
22
|
createConversation,
|
|
23
23
|
getConversation,
|
|
24
|
-
} from "../memory/conversation-
|
|
24
|
+
} from "../memory/conversation-crud.js";
|
|
25
25
|
import {
|
|
26
26
|
getBindingByChannelChat,
|
|
27
27
|
upsertOutboundBinding,
|
|
@@ -42,7 +42,7 @@ const log = getLogger("notification-conversation-pairing");
|
|
|
42
42
|
* Prefix applied to sourceChannel values in notification bindings so they
|
|
43
43
|
* occupy a separate namespace from messaging adapter bindings in the
|
|
44
44
|
* external_conversation_bindings table. Without this, notification pairing
|
|
45
|
-
* and messaging adapters (Telegram,
|
|
45
|
+
* and messaging adapters (Telegram, Slack, etc.) would destructively overwrite
|
|
46
46
|
* each other's bindings since both use (sourceChannel, externalChatId) as key.
|
|
47
47
|
*/
|
|
48
48
|
const NOTIFICATION_CHANNEL_PREFIX = "notification:";
|
|
@@ -82,7 +82,7 @@ export function buildAccessRequestIdentityLine(
|
|
|
82
82
|
: undefined,
|
|
83
83
|
);
|
|
84
84
|
|
|
85
|
-
if (sourceChannel === "
|
|
85
|
+
if (sourceChannel === "phone" && callerName) {
|
|
86
86
|
const safeName = sanitizeIdentityField(callerName);
|
|
87
87
|
const safeId = sanitizeIdentityField(
|
|
88
88
|
str(payload.actorExternalId, requester),
|
|
@@ -391,7 +391,7 @@ function applyChannelDefaults(
|
|
|
391
391
|
): RenderedChannelCopy {
|
|
392
392
|
const copy: RenderedChannelCopy = { ...baseCopy };
|
|
393
393
|
|
|
394
|
-
if (channel === "telegram"
|
|
394
|
+
if (channel === "telegram") {
|
|
395
395
|
copy.deliveryText = buildChatSurfaceFallbackDeliveryText(baseCopy, signal);
|
|
396
396
|
}
|
|
397
397
|
|
|
@@ -95,7 +95,7 @@ function buildSystemPrompt(
|
|
|
95
95
|
`- \`title\` and \`body\` are for native notification popups (e.g. vellum desktop/mobile) — keep them short and glanceable (title ≤ 8 words, body ≤ 2 sentences).`,
|
|
96
96
|
`- \`deliveryText\` is the channel-native message for chat channels (e.g. telegram). It must read naturally as a standalone message.`,
|
|
97
97
|
` - Do not prepend mechanical labels like "Thread:".`,
|
|
98
|
-
` - Do not mention channel or transport names (e.g. Telegram,
|
|
98
|
+
` - Do not mention channel or transport names (e.g. Telegram, Slack, email) unless the event context explicitly requires it.`,
|
|
99
99
|
` - Do not repeat title/body verbatim unless that repetition is truly necessary.`,
|
|
100
100
|
` - Avoid meta-send phrasing (e.g. "I'd like to send a notification", "May I go ahead with that?"). Write the recipient-facing message directly.`,
|
|
101
101
|
` - For telegram: 1-2 concise sentences.`,
|
|
@@ -546,15 +546,6 @@ function enforceGuardianRequestCode(
|
|
|
546
546
|
const modeResolution = resolveGuardianQuestionInstructionMode(
|
|
547
547
|
signal.contextPayload,
|
|
548
548
|
);
|
|
549
|
-
if (modeResolution.legacyFallbackUsed) {
|
|
550
|
-
log.warn(
|
|
551
|
-
{
|
|
552
|
-
signalId: signal.signalId,
|
|
553
|
-
requestKind: modeResolution.requestKind,
|
|
554
|
-
},
|
|
555
|
-
"guardian.question payload missing/invalid typed fields; using legacy instruction-mode fallback",
|
|
556
|
-
);
|
|
557
|
-
}
|
|
558
549
|
const nextCopy: Partial<Record<NotificationChannel, RenderedChannelCopy>> = {
|
|
559
550
|
...decision.renderedCopy,
|
|
560
551
|
};
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* broadcast mechanism to connected desktop/mobile clients. The
|
|
8
8
|
* guardianPrincipalId is included in metadata so downstream adapters
|
|
9
9
|
* can scope guardian-sensitive notifications to bound guardian devices.
|
|
10
|
-
* - Binding-based channels (telegram
|
|
10
|
+
* - Binding-based channels (telegram): require a chat/delivery ID
|
|
11
11
|
* sourced from the guardian contact's channel record.
|
|
12
12
|
*/
|
|
13
13
|
|
|
@@ -62,8 +62,7 @@ export function resolveDestinations(
|
|
|
62
62
|
);
|
|
63
63
|
break;
|
|
64
64
|
}
|
|
65
|
-
case "telegram":
|
|
66
|
-
case "sms": {
|
|
65
|
+
case "telegram": {
|
|
67
66
|
const guardianResult = findGuardianForChannel(channel);
|
|
68
67
|
if (guardianResult && guardianResult.channel.externalChatId) {
|
|
69
68
|
const externalChatId = guardianResult.channel.externalChatId;
|
|
@@ -16,7 +16,6 @@ import { findGuardianForChannel } from "../contacts/contact-store.js";
|
|
|
16
16
|
import { getLogger } from "../util/logger.js";
|
|
17
17
|
import { type BroadcastFn, VellumAdapter } from "./adapters/macos.js";
|
|
18
18
|
import { SlackAdapter } from "./adapters/slack.js";
|
|
19
|
-
import { SmsAdapter } from "./adapters/sms.js";
|
|
20
19
|
import { TelegramAdapter } from "./adapters/telegram.js";
|
|
21
20
|
import {
|
|
22
21
|
NotificationBroadcaster,
|
|
@@ -62,11 +61,7 @@ export function registerBroadcastFn(fn: BroadcastFn): void {
|
|
|
62
61
|
|
|
63
62
|
function getBroadcaster(): NotificationBroadcaster {
|
|
64
63
|
if (!broadcasterInstance) {
|
|
65
|
-
const adapters = [
|
|
66
|
-
new TelegramAdapter(),
|
|
67
|
-
new SmsAdapter(),
|
|
68
|
-
new SlackAdapter(),
|
|
69
|
-
];
|
|
64
|
+
const adapters = [new TelegramAdapter(), new SlackAdapter()];
|
|
70
65
|
if (registeredBroadcastFn) {
|
|
71
66
|
adapters.unshift(new VellumAdapter(registeredBroadcastFn));
|
|
72
67
|
}
|
|
@@ -113,8 +108,7 @@ function getConnectedChannels(): NotificationChannel[] {
|
|
|
113
108
|
// available when the daemon is running).
|
|
114
109
|
channels.push(channel);
|
|
115
110
|
break;
|
|
116
|
-
case "telegram":
|
|
117
|
-
case "sms": {
|
|
111
|
+
case "telegram": {
|
|
118
112
|
// A binding-based channel is connected when the guardian has an
|
|
119
113
|
// active channel entry with a valid delivery endpoint. The
|
|
120
114
|
// externalChatId check ensures we don't report a channel as
|
|
@@ -143,7 +143,6 @@ export type GuardianQuestionPayload =
|
|
|
143
143
|
export interface GuardianQuestionModeResolution {
|
|
144
144
|
mode: GuardianQuestionInstructionMode;
|
|
145
145
|
requestKind: GuardianQuestionRequestKind | null;
|
|
146
|
-
legacyFallbackUsed: boolean;
|
|
147
146
|
}
|
|
148
147
|
|
|
149
148
|
function nonEmptyString(value: unknown): string | null {
|
|
@@ -427,8 +426,10 @@ export function stripConflictingGuardianRequestInstructions(
|
|
|
427
426
|
/**
|
|
428
427
|
* Resolve guardian reply instruction mode from request kind.
|
|
429
428
|
*
|
|
430
|
-
*
|
|
431
|
-
*
|
|
429
|
+
* Requires a valid requestKind in the payload. When the payload cannot be
|
|
430
|
+
* fully parsed as a typed guardian question, falls back to field-level
|
|
431
|
+
* requestKind resolution. If requestKind is missing or unknown, defaults
|
|
432
|
+
* to "approval" mode.
|
|
432
433
|
*/
|
|
433
434
|
export function resolveGuardianQuestionInstructionMode(
|
|
434
435
|
payload: Record<string, unknown>,
|
|
@@ -444,7 +445,6 @@ export function resolveGuardianQuestionInstructionMode(
|
|
|
444
445
|
parsedToolName,
|
|
445
446
|
),
|
|
446
447
|
requestKind: parsed.requestKind,
|
|
447
|
-
legacyFallbackUsed: false,
|
|
448
448
|
};
|
|
449
449
|
}
|
|
450
450
|
|
|
@@ -456,14 +456,11 @@ export function resolveGuardianQuestionInstructionMode(
|
|
|
456
456
|
return {
|
|
457
457
|
mode: requestKindResolution.mode,
|
|
458
458
|
requestKind: requestKindResolution.requestKind,
|
|
459
|
-
legacyFallbackUsed: true,
|
|
460
459
|
};
|
|
461
460
|
}
|
|
462
461
|
|
|
463
|
-
const toolName = nonEmptyString(payload.toolName);
|
|
464
462
|
return {
|
|
465
|
-
mode:
|
|
463
|
+
mode: "approval",
|
|
466
464
|
requestKind: null,
|
|
467
|
-
legacyFallbackUsed: true,
|
|
468
465
|
};
|
|
469
466
|
}
|
|
@@ -11,9 +11,8 @@ import type { GuardianQuestionPayload } from "./guardian-question-mode.js";
|
|
|
11
11
|
export const NOTIFICATION_SOURCE_CHANNELS = [
|
|
12
12
|
{ id: "assistant_tool", description: "Assistant skill/tool invocation" },
|
|
13
13
|
{ id: "vellum", description: "Vellum native client (macOS/iOS)" },
|
|
14
|
-
{ id: "
|
|
14
|
+
{ id: "phone", description: "Phone call pipeline" },
|
|
15
15
|
{ id: "telegram", description: "Telegram channel" },
|
|
16
|
-
{ id: "sms", description: "SMS channel" },
|
|
17
16
|
{ id: "slack", description: "Slack channel" },
|
|
18
17
|
{ id: "scheduler", description: "Scheduled task runner (reminders, cron)" },
|
|
19
18
|
{ id: "watcher", description: "File/event watcher subsystem" },
|
|
@@ -61,7 +61,7 @@ export interface ChannelDestination {
|
|
|
61
61
|
* conversations keyed by (sourceChannel, externalChatId).
|
|
62
62
|
*/
|
|
63
63
|
export interface DestinationBindingContext {
|
|
64
|
-
/** The channel this binding belongs to (e.g. "telegram", "
|
|
64
|
+
/** The channel this binding belongs to (e.g. "telegram", "slack"). */
|
|
65
65
|
sourceChannel: NotificationChannel;
|
|
66
66
|
/** The channel-specific chat/thread identifier (e.g. Telegram chat ID, phone number). */
|
|
67
67
|
externalChatId: string;
|
|
@@ -119,7 +119,6 @@ export async function storeOAuth2Tokens(
|
|
|
119
119
|
allowedTools: allowedTools ?? [],
|
|
120
120
|
expiresAt,
|
|
121
121
|
grantedScopes,
|
|
122
|
-
accountInfo: accountInfo ?? params.identityAccountInfo ?? null,
|
|
123
122
|
oauth2TokenUrl: tokenUrl,
|
|
124
123
|
oauth2ClientId: clientId,
|
|
125
124
|
oauth2ClientSecret: clientSecret ?? null,
|
|
@@ -131,6 +130,31 @@ export async function storeOAuth2Tokens(
|
|
|
131
130
|
: {}),
|
|
132
131
|
});
|
|
133
132
|
|
|
133
|
+
// Write accountInfo to config using a namespaced key (dynamic import to
|
|
134
|
+
// avoid circular dependencies — the config loader may transitively depend
|
|
135
|
+
// on credential modules).
|
|
136
|
+
const resolvedAccountInfo = accountInfo ?? params.identityAccountInfo;
|
|
137
|
+
if (resolvedAccountInfo) {
|
|
138
|
+
try {
|
|
139
|
+
const {
|
|
140
|
+
invalidateConfigCache,
|
|
141
|
+
loadRawConfig,
|
|
142
|
+
saveRawConfig,
|
|
143
|
+
setNestedValue,
|
|
144
|
+
} = await import("../config/loader.js");
|
|
145
|
+
const raw = loadRawConfig();
|
|
146
|
+
setNestedValue(
|
|
147
|
+
raw,
|
|
148
|
+
`integrations.accountInfo.${service}`,
|
|
149
|
+
resolvedAccountInfo,
|
|
150
|
+
);
|
|
151
|
+
saveRawConfig(raw);
|
|
152
|
+
invalidateConfigCache();
|
|
153
|
+
} catch {
|
|
154
|
+
// Non-fatal — tokens stored even if config write fails
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
134
158
|
if (tokens.refreshToken) {
|
|
135
159
|
const refreshStored = await setSecureKeyAsync(
|
|
136
160
|
`credential:${service}:refresh_token`,
|
|
@@ -363,13 +363,9 @@ async function buildCommandCandidates(
|
|
|
363
363
|
targets.push("");
|
|
364
364
|
} else {
|
|
365
365
|
const resolved = resolveSkillIdAndHash(rawSelector);
|
|
366
|
-
if (resolved) {
|
|
366
|
+
if (resolved && resolved.versionHash) {
|
|
367
367
|
// Version-specific candidate lets rules pin to an exact skill version
|
|
368
|
-
|
|
369
|
-
targets.push(`${resolved.id}@${resolved.versionHash}`);
|
|
370
|
-
}
|
|
371
|
-
// Bare skill id candidate for backward compat / any-version rules
|
|
372
|
-
targets.push(resolved.id);
|
|
368
|
+
targets.push(`${resolved.id}@${resolved.versionHash}`);
|
|
373
369
|
}
|
|
374
370
|
targets.push(rawSelector);
|
|
375
371
|
}
|
|
@@ -812,26 +808,6 @@ export async function check(
|
|
|
812
808
|
}
|
|
813
809
|
}
|
|
814
810
|
|
|
815
|
-
// Any unrecognized mode (including raw "legacy" that somehow bypassed loader
|
|
816
|
-
// migration) is treated as workspace mode — fail-closed relative to the old
|
|
817
|
-
// risk-only fallthrough that would auto-allow low-risk operations everywhere.
|
|
818
|
-
if (
|
|
819
|
-
permissionsMode !== "strict" &&
|
|
820
|
-
permissionsMode !== "workspace" &&
|
|
821
|
-
!matchedRule &&
|
|
822
|
-
risk !== RiskLevel.High
|
|
823
|
-
) {
|
|
824
|
-
if (toolName === "bash" && !getConfig().sandbox.enabled) {
|
|
825
|
-
// Fall through to risk-based policy below
|
|
826
|
-
} else if (isWorkspaceScopedInvocation(toolName, input, workingDir)) {
|
|
827
|
-
return {
|
|
828
|
-
decision: "allow",
|
|
829
|
-
reason:
|
|
830
|
-
"Workspace mode (normalized): workspace-scoped operation auto-allowed",
|
|
831
|
-
};
|
|
832
|
-
}
|
|
833
|
-
}
|
|
834
|
-
|
|
835
811
|
// Auto-allow low-risk bundled skill tools even without explicit trust rules.
|
|
836
812
|
// These are first-party tools with a vetted risk declaration — applying the
|
|
837
813
|
// same policy as the per-tool default allow rules for browser tools, but
|
|
@@ -1025,12 +1001,11 @@ function skillLoadAllowlistStrategy(
|
|
|
1025
1001
|
},
|
|
1026
1002
|
];
|
|
1027
1003
|
}
|
|
1028
|
-
const id = resolved ? resolved.id : rawSelector;
|
|
1029
1004
|
return [
|
|
1030
1005
|
{
|
|
1031
|
-
label:
|
|
1006
|
+
label: rawSelector,
|
|
1032
1007
|
description: "This skill",
|
|
1033
|
-
pattern: `skill_load:${
|
|
1008
|
+
pattern: `skill_load:${rawSelector}`,
|
|
1034
1009
|
},
|
|
1035
1010
|
];
|
|
1036
1011
|
}
|
|
@@ -278,11 +278,11 @@ export function getDefaultRuleTemplates(): DefaultRuleTemplate[] {
|
|
|
278
278
|
priority: 100,
|
|
279
279
|
};
|
|
280
280
|
|
|
281
|
-
//
|
|
282
|
-
const
|
|
283
|
-
id: "default:allow-
|
|
284
|
-
tool: "
|
|
285
|
-
pattern: "
|
|
281
|
+
// memory_recall is a read-only tool — always allow without prompting.
|
|
282
|
+
const memoryRecallRule: DefaultRuleTemplate = {
|
|
283
|
+
id: "default:allow-memory_recall-global",
|
|
284
|
+
tool: "memory_recall",
|
|
285
|
+
pattern: "memory_recall:*",
|
|
286
286
|
scope: "everywhere",
|
|
287
287
|
decision: "allow",
|
|
288
288
|
priority: 100,
|
|
@@ -303,6 +303,6 @@ export function getDefaultRuleTemplates(): DefaultRuleTemplate[] {
|
|
|
303
303
|
...browserToolRules,
|
|
304
304
|
...uiSurfaceRules,
|
|
305
305
|
viewImageRule,
|
|
306
|
-
|
|
306
|
+
memoryRecallRule,
|
|
307
307
|
];
|
|
308
308
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { v4 as uuid } from "uuid";
|
|
2
2
|
|
|
3
3
|
import { getConfig } from "../config/loader.js";
|
|
4
|
-
import type { ServerMessage } from "../daemon/
|
|
4
|
+
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
5
5
|
import { redactSensitiveFields } from "../security/redaction.js";
|
|
6
6
|
import type { ExecutionTarget } from "../tools/types.js";
|
|
7
7
|
import { AssistantError, ErrorCode } from "../util/errors.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { v4 as uuid } from "uuid";
|
|
2
2
|
|
|
3
3
|
import { getConfig } from "../config/loader.js";
|
|
4
|
-
import type { ServerMessage } from "../daemon/
|
|
4
|
+
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
5
5
|
import { AssistantError, ErrorCode } from "../util/errors.js";
|
|
6
6
|
import { getLogger } from "../util/logger.js";
|
|
7
7
|
|
|
@@ -193,7 +193,7 @@ export function deriveShellActionKeys(
|
|
|
193
193
|
* Build an ordered list of command candidates for trust-rule matching.
|
|
194
194
|
*
|
|
195
195
|
* Candidate ordering:
|
|
196
|
-
* 1. Raw command (
|
|
196
|
+
* 1. Raw command (most specific match — the full command as written)
|
|
197
197
|
* 2. Canonical primary command (if simple action) — the full primary segment text
|
|
198
198
|
* 3. Action keys from narrowest to broadest (if simple action)
|
|
199
199
|
*
|
|
@@ -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()];
|