@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
package/src/memory/retriever.ts
CHANGED
|
@@ -15,6 +15,11 @@ import {
|
|
|
15
15
|
getMemoryBackendStatus,
|
|
16
16
|
logMemoryEmbeddingWarning,
|
|
17
17
|
} from "./embedding-backend.js";
|
|
18
|
+
import { formatRecallText } from "./format-recall.js";
|
|
19
|
+
import {
|
|
20
|
+
isQdrantBreakerOpen,
|
|
21
|
+
QdrantCircuitOpenError,
|
|
22
|
+
} from "./qdrant-circuit-breaker.js";
|
|
18
23
|
import {
|
|
19
24
|
getCachedRecall,
|
|
20
25
|
getMemoryVersion,
|
|
@@ -22,27 +27,28 @@ import {
|
|
|
22
27
|
} from "./recall-cache.js";
|
|
23
28
|
import { memoryItemSources } from "./schema.js";
|
|
24
29
|
import { entitySearch } from "./search/entity.js";
|
|
25
|
-
import {
|
|
30
|
+
import { MEMORY_CONTEXT_ACK } from "./search/formatting.js";
|
|
26
31
|
import {
|
|
27
32
|
directItemSearch,
|
|
28
33
|
lexicalSearch,
|
|
29
34
|
recencySearch,
|
|
30
35
|
} from "./search/lexical.js";
|
|
36
|
+
import { buildFTSQuery, expandQueryForFTS } from "./search/query-expansion.js";
|
|
31
37
|
import {
|
|
32
38
|
applySourceCaps,
|
|
33
|
-
markItemUsage,
|
|
34
39
|
mergeCandidates,
|
|
35
40
|
rerankWithLLM,
|
|
36
|
-
trimToTokenBudget,
|
|
37
41
|
} from "./search/ranking.js";
|
|
38
42
|
import { isQdrantConnectionError, semanticSearch } from "./search/semantic.js";
|
|
39
43
|
import type {
|
|
40
44
|
Candidate,
|
|
41
45
|
CollectedCandidates,
|
|
46
|
+
DegradationReason,
|
|
47
|
+
DegradationStatus,
|
|
48
|
+
FallbackSource,
|
|
42
49
|
MemoryRecallCandiateDebug,
|
|
43
50
|
MemoryRecallOptions,
|
|
44
51
|
MemoryRecallResult,
|
|
45
|
-
MemorySearchResult,
|
|
46
52
|
ScopePolicyOverride,
|
|
47
53
|
} from "./search/types.js";
|
|
48
54
|
|
|
@@ -53,9 +59,11 @@ export {
|
|
|
53
59
|
formatRelativeTime,
|
|
54
60
|
} from "./search/formatting.js";
|
|
55
61
|
export type {
|
|
62
|
+
DegradationReason,
|
|
63
|
+
DegradationStatus,
|
|
64
|
+
FallbackSource,
|
|
56
65
|
MemoryRecallCandiateDebug,
|
|
57
66
|
MemoryRecallResult,
|
|
58
|
-
MemorySearchResult,
|
|
59
67
|
ScopePolicyOverride,
|
|
60
68
|
} from "./search/types.js";
|
|
61
69
|
|
|
@@ -84,7 +92,7 @@ const EMBED_BASE_DELAY_MS = 500;
|
|
|
84
92
|
* Wrap embedWithBackend with retry + exponential backoff for transient failures
|
|
85
93
|
* (network errors, 429s, 5xx). Aborts immediately if the caller's signal fires.
|
|
86
94
|
*/
|
|
87
|
-
async function embedWithRetry(
|
|
95
|
+
export async function embedWithRetry(
|
|
88
96
|
config: AssistantConfig,
|
|
89
97
|
texts: string[],
|
|
90
98
|
opts?: { signal?: AbortSignal },
|
|
@@ -146,10 +154,9 @@ function buildScopeFilter(
|
|
|
146
154
|
/**
|
|
147
155
|
* Shared retrieval pipeline: collect candidates from all available sources
|
|
148
156
|
* (lexical, recency, semantic, entity, direct item search) and merge them
|
|
149
|
-
* using RRF.
|
|
150
|
-
* `searchMemoryItems()` (memory_search tool) for consistent behavior.
|
|
157
|
+
* using RRF.
|
|
151
158
|
*/
|
|
152
|
-
async function collectAndMergeCandidates(
|
|
159
|
+
export async function collectAndMergeCandidates(
|
|
153
160
|
query: string,
|
|
154
161
|
config: AssistantConfig,
|
|
155
162
|
opts?: {
|
|
@@ -175,19 +182,46 @@ async function collectAndMergeCandidates(
|
|
|
175
182
|
);
|
|
176
183
|
|
|
177
184
|
let semanticSearchFailed = false;
|
|
185
|
+
let semanticSearchError: unknown;
|
|
186
|
+
|
|
187
|
+
// Detect when semantic search won't be available so we can compensate
|
|
188
|
+
// by boosting lexical/recency/direct item limits.
|
|
189
|
+
const semanticUnavailable = !queryVector || isQdrantBreakerOpen();
|
|
190
|
+
if (semanticUnavailable) {
|
|
191
|
+
log.debug("Semantic search unavailable — boosting lexical limits");
|
|
192
|
+
}
|
|
178
193
|
|
|
179
194
|
// -- Phase 1: cheap local searches (always run) --
|
|
195
|
+
const lexicalTopK = semanticUnavailable
|
|
196
|
+
? config.memory.retrieval.lexicalTopK * 2
|
|
197
|
+
: config.memory.retrieval.lexicalTopK;
|
|
198
|
+
|
|
199
|
+
// When semantic search is unavailable, expand the conversational query
|
|
200
|
+
// into meaningful keywords for better FTS recall. This compensates for
|
|
201
|
+
// the lack of vector-based semantic matching.
|
|
202
|
+
const expandedFtsQuery = semanticUnavailable
|
|
203
|
+
? buildFTSQuery(expandQueryForFTS(query))
|
|
204
|
+
: undefined;
|
|
205
|
+
|
|
180
206
|
const lexical = lexicalSearch(
|
|
181
207
|
query,
|
|
182
|
-
|
|
208
|
+
lexicalTopK,
|
|
183
209
|
excludeMessageIds,
|
|
184
210
|
scopeIds,
|
|
211
|
+
expandedFtsQuery,
|
|
185
212
|
);
|
|
186
213
|
|
|
214
|
+
const baseRecencyLimit = Math.max(
|
|
215
|
+
10,
|
|
216
|
+
Math.floor(config.memory.retrieval.semanticTopK / 2),
|
|
217
|
+
);
|
|
218
|
+
const recencyLimit = semanticUnavailable
|
|
219
|
+
? Math.ceil(baseRecencyLimit * 1.5)
|
|
220
|
+
: baseRecencyLimit;
|
|
187
221
|
const recency = opts?.conversationId
|
|
188
222
|
? recencySearch(
|
|
189
223
|
opts.conversationId,
|
|
190
|
-
|
|
224
|
+
recencyLimit,
|
|
191
225
|
excludeMessageIds,
|
|
192
226
|
scopeIds,
|
|
193
227
|
)
|
|
@@ -196,7 +230,10 @@ async function collectAndMergeCandidates(
|
|
|
196
230
|
// Direct item search supplements FTS with LIKE-based matching.
|
|
197
231
|
// When exclusions are present, adaptively increase the fetch size until
|
|
198
232
|
// we collect directLimit valid (non-excluded) items or exhaust the DB.
|
|
199
|
-
const
|
|
233
|
+
const baseDirectLimit = Math.max(10, config.memory.retrieval.lexicalTopK);
|
|
234
|
+
const directLimit = semanticUnavailable
|
|
235
|
+
? baseDirectLimit * 2
|
|
236
|
+
: baseDirectLimit;
|
|
200
237
|
|
|
201
238
|
// Helper: filter fetched direct items to those with at least one non-excluded source.
|
|
202
239
|
const filterDirectItems = (items: Candidate[]): Candidate[] => {
|
|
@@ -301,8 +338,14 @@ async function collectAndMergeCandidates(
|
|
|
301
338
|
// not query-match relevance. Common tokens can produce many high-confidence
|
|
302
339
|
// but weakly relevant items that would skip semantic search exactly when
|
|
303
340
|
// it's needed most. Instead, check lexical score (query-match relevance).
|
|
341
|
+
//
|
|
342
|
+
// Disable early termination when semantic search is unavailable: boosted
|
|
343
|
+
// limits inflate cheap candidate counts, making this gate trigger more
|
|
344
|
+
// easily. Skipping entity retrieval on top of losing semantic search
|
|
345
|
+
// would reduce recall quality further.
|
|
304
346
|
const canTerminateEarly =
|
|
305
347
|
etConfig.enabled &&
|
|
348
|
+
!semanticUnavailable &&
|
|
306
349
|
cheapCandidates.length >= etConfig.minCandidates &&
|
|
307
350
|
cheapCandidates.filter((c) => c.lexical >= etConfig.confidenceThreshold)
|
|
308
351
|
.length >= etConfig.minHighConfidence;
|
|
@@ -329,6 +372,7 @@ async function collectAndMergeCandidates(
|
|
|
329
372
|
scopeIds,
|
|
330
373
|
).catch((err): Candidate[] => {
|
|
331
374
|
semanticSearchFailed = true;
|
|
375
|
+
semanticSearchError = err;
|
|
332
376
|
if (isQdrantConnectionError(err)) {
|
|
333
377
|
log.warn(
|
|
334
378
|
{ err },
|
|
@@ -411,16 +455,42 @@ async function collectAndMergeCandidates(
|
|
|
411
455
|
relationExpandedItemCount,
|
|
412
456
|
earlyTerminated: canTerminateEarly,
|
|
413
457
|
semanticSearchFailed,
|
|
458
|
+
semanticUnavailable,
|
|
459
|
+
semanticSearchError,
|
|
414
460
|
merged,
|
|
415
461
|
};
|
|
416
462
|
}
|
|
417
463
|
|
|
464
|
+
/**
|
|
465
|
+
* Build a structured degradation status describing which retrieval
|
|
466
|
+
* capabilities are unavailable and what fallback sources remain.
|
|
467
|
+
*/
|
|
468
|
+
function buildDegradationStatus(
|
|
469
|
+
reason: DegradationReason,
|
|
470
|
+
config: AssistantConfig,
|
|
471
|
+
): DegradationStatus {
|
|
472
|
+
const fallbackSources: FallbackSource[] = [
|
|
473
|
+
"lexical",
|
|
474
|
+
"recency",
|
|
475
|
+
"direct_item",
|
|
476
|
+
];
|
|
477
|
+
if (config.memory.entity.enabled) {
|
|
478
|
+
fallbackSources.push("entity");
|
|
479
|
+
}
|
|
480
|
+
return {
|
|
481
|
+
semanticUnavailable: true,
|
|
482
|
+
reason,
|
|
483
|
+
fallbackSources,
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
|
|
418
487
|
/** Result of the embedding generation stage. */
|
|
419
488
|
interface EmbeddingResult {
|
|
420
489
|
queryVector: number[] | null;
|
|
421
490
|
provider: string | undefined;
|
|
422
491
|
model: string | undefined;
|
|
423
492
|
degraded: boolean;
|
|
493
|
+
degradation: DegradationStatus | undefined;
|
|
424
494
|
reason: string | undefined;
|
|
425
495
|
}
|
|
426
496
|
|
|
@@ -443,6 +513,7 @@ async function generateQueryEmbedding(
|
|
|
443
513
|
let provider: string | undefined;
|
|
444
514
|
let model: string | undefined;
|
|
445
515
|
let degraded = backendStatus.degraded;
|
|
516
|
+
let degradation: DegradationStatus | undefined;
|
|
446
517
|
let reason = backendStatus.reason ?? undefined;
|
|
447
518
|
|
|
448
519
|
if (backendStatus.provider) {
|
|
@@ -471,11 +542,16 @@ async function generateQueryEmbedding(
|
|
|
471
542
|
reason = `memory.embedding_failure: ${
|
|
472
543
|
err instanceof Error ? err.message : String(err)
|
|
473
544
|
}`;
|
|
545
|
+
degradation = buildDegradationStatus(
|
|
546
|
+
"embedding_generation_failed",
|
|
547
|
+
config,
|
|
548
|
+
);
|
|
474
549
|
if (config.memory.embeddings.required) {
|
|
475
550
|
return {
|
|
476
551
|
earlyExit: emptyResult({
|
|
477
552
|
enabled: true,
|
|
478
553
|
degraded,
|
|
554
|
+
degradation,
|
|
479
555
|
reason,
|
|
480
556
|
provider: backendStatus.provider,
|
|
481
557
|
model: backendStatus.model ?? undefined,
|
|
@@ -485,17 +561,19 @@ async function generateQueryEmbedding(
|
|
|
485
561
|
}
|
|
486
562
|
}
|
|
487
563
|
} else if (config.memory.embeddings.required) {
|
|
564
|
+
degradation = buildDegradationStatus("embedding_provider_down", config);
|
|
488
565
|
return {
|
|
489
566
|
earlyExit: emptyResult({
|
|
490
567
|
enabled: true,
|
|
491
568
|
degraded: true,
|
|
569
|
+
degradation,
|
|
492
570
|
reason: reason ?? "memory.embedding_backend_missing",
|
|
493
571
|
latencyMs: Date.now() - start,
|
|
494
572
|
}),
|
|
495
573
|
};
|
|
496
574
|
}
|
|
497
575
|
|
|
498
|
-
return { queryVector, provider, model, degraded, reason };
|
|
576
|
+
return { queryVector, provider, model, degraded, degradation, reason };
|
|
499
577
|
}
|
|
500
578
|
|
|
501
579
|
/** Result of the re-ranking stage. */
|
|
@@ -586,48 +664,12 @@ function formatRecallResult(
|
|
|
586
664
|
),
|
|
587
665
|
);
|
|
588
666
|
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
const
|
|
595
|
-
? estimateTextTokens(degradationNotice)
|
|
596
|
-
: 0;
|
|
597
|
-
// +2 for '\n\n' separator — only needed when candidates are also present
|
|
598
|
-
const noticeTokenCost = noticeOnlyTokenCost + (degradationNotice ? 2 : 0);
|
|
599
|
-
// When the notice alone exceeds the budget, skip it entirely so
|
|
600
|
-
// injectedText never exceeds maxInjectTokens.
|
|
601
|
-
const budgetForNotice = noticeTokenCost <= maxInjectTokens;
|
|
602
|
-
const candidateBudget = budgetForNotice
|
|
603
|
-
? maxInjectTokens - noticeTokenCost
|
|
604
|
-
: maxInjectTokens;
|
|
605
|
-
|
|
606
|
-
const selected = trimToTokenBudget(
|
|
607
|
-
merged,
|
|
608
|
-
candidateBudget,
|
|
609
|
-
config.memory.retrieval.injectionFormat,
|
|
610
|
-
);
|
|
611
|
-
markItemUsage(selected);
|
|
612
|
-
|
|
613
|
-
let injectedText = buildInjectedText(
|
|
614
|
-
selected,
|
|
615
|
-
config.memory.retrieval.injectionFormat,
|
|
616
|
-
);
|
|
617
|
-
|
|
618
|
-
// Show the notice if it fits: when candidates are present the separator
|
|
619
|
-
// cost was already reserved; when no candidates were selected, the notice
|
|
620
|
-
// alone (without separator) may still fit even if the full cost didn't.
|
|
621
|
-
const canShowNotice =
|
|
622
|
-
degradationNotice &&
|
|
623
|
-
(budgetForNotice ||
|
|
624
|
-
(selected.length === 0 && noticeOnlyTokenCost <= maxInjectTokens));
|
|
625
|
-
if (canShowNotice) {
|
|
626
|
-
injectedText =
|
|
627
|
-
injectedText.length > 0
|
|
628
|
-
? injectedText + "\n\n" + degradationNotice
|
|
629
|
-
: degradationNotice;
|
|
630
|
-
}
|
|
667
|
+
const formatted = formatRecallText(merged, {
|
|
668
|
+
format: config.memory.retrieval.injectionFormat,
|
|
669
|
+
maxTokens: maxInjectTokens,
|
|
670
|
+
});
|
|
671
|
+
const { selected } = formatted;
|
|
672
|
+
const injectedText = formatted.text;
|
|
631
673
|
|
|
632
674
|
const topCandidates: MemoryRecallCandiateDebug[] = selected
|
|
633
675
|
.slice(0, 10)
|
|
@@ -667,6 +709,7 @@ function formatRecallResult(
|
|
|
667
709
|
return {
|
|
668
710
|
enabled: true,
|
|
669
711
|
degraded: embedding.degraded,
|
|
712
|
+
degradation: embedding.degradation,
|
|
670
713
|
reason: embedding.reason,
|
|
671
714
|
provider: embedding.provider,
|
|
672
715
|
model: embedding.model,
|
|
@@ -781,11 +824,29 @@ export async function buildMemoryRecall(
|
|
|
781
824
|
});
|
|
782
825
|
}
|
|
783
826
|
|
|
784
|
-
// Propagate semantic search failure
|
|
785
|
-
|
|
827
|
+
// Propagate semantic search failure or breaker-based unavailability into
|
|
828
|
+
// degradation state. This ensures results computed with boosted limits
|
|
829
|
+
// are marked degraded and excluded from the recall cache — preventing
|
|
830
|
+
// stale boosted results from being served after the breaker closes.
|
|
831
|
+
if (collected.semanticSearchFailed || collected.semanticUnavailable) {
|
|
786
832
|
embeddingResult.degraded = true;
|
|
787
833
|
embeddingResult.reason =
|
|
788
|
-
embeddingResult.reason ??
|
|
834
|
+
embeddingResult.reason ??
|
|
835
|
+
(collected.semanticUnavailable
|
|
836
|
+
? embeddingResult.queryVector != null
|
|
837
|
+
? "memory.qdrant_circuit_open"
|
|
838
|
+
: "memory.embedding_unavailable"
|
|
839
|
+
: "memory.semantic_search_failure");
|
|
840
|
+
if (!embeddingResult.degradation) {
|
|
841
|
+
const isQdrantIssue =
|
|
842
|
+
embeddingResult.queryVector != null ||
|
|
843
|
+
isQdrantConnectionError(collected.semanticSearchError) ||
|
|
844
|
+
collected.semanticSearchError instanceof QdrantCircuitOpenError;
|
|
845
|
+
const reason: DegradationReason = isQdrantIssue
|
|
846
|
+
? "qdrant_unavailable"
|
|
847
|
+
: "embedding_generation_failed";
|
|
848
|
+
embeddingResult.degradation = buildDegradationStatus(reason, config);
|
|
849
|
+
}
|
|
789
850
|
}
|
|
790
851
|
|
|
791
852
|
// Stage 3: Source caps + LLM re-ranking
|
|
@@ -967,64 +1028,6 @@ export function queryMemoryForCli(
|
|
|
967
1028
|
return buildMemoryRecall(query, conversationId, config);
|
|
968
1029
|
}
|
|
969
1030
|
|
|
970
|
-
/**
|
|
971
|
-
* Search memory items using the same unified retrieval pipeline as
|
|
972
|
-
* automatic recall: lexical, recency, semantic (when available), entity,
|
|
973
|
-
* and direct item search -- merged via RRF.
|
|
974
|
-
* Returns a simplified result set suitable for the memory_search tool.
|
|
975
|
-
*/
|
|
976
|
-
export async function searchMemoryItems(
|
|
977
|
-
query: string,
|
|
978
|
-
limit: number,
|
|
979
|
-
config: AssistantConfig,
|
|
980
|
-
scopeId?: string,
|
|
981
|
-
scopePolicyOverride?: ScopePolicyOverride,
|
|
982
|
-
): Promise<MemorySearchResult[]> {
|
|
983
|
-
const trimmed = query.trim();
|
|
984
|
-
if (trimmed.length === 0 || limit <= 0) return [];
|
|
985
|
-
|
|
986
|
-
// Compute embedding vector when available (same as auto recall)
|
|
987
|
-
let queryVector: number[] | null = null;
|
|
988
|
-
let provider: string | undefined;
|
|
989
|
-
let model: string | undefined;
|
|
990
|
-
const backendStatus = getMemoryBackendStatus(config);
|
|
991
|
-
if (backendStatus.provider) {
|
|
992
|
-
try {
|
|
993
|
-
const embedded = await embedWithRetry(config, [trimmed]);
|
|
994
|
-
queryVector = embedded.vectors[0] ?? null;
|
|
995
|
-
provider = embedded.provider;
|
|
996
|
-
model = embedded.model;
|
|
997
|
-
} catch {
|
|
998
|
-
// Gracefully degrade to non-semantic search
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
|
|
1002
|
-
const result = await collectAndMergeCandidates(trimmed, config, {
|
|
1003
|
-
queryVector,
|
|
1004
|
-
provider,
|
|
1005
|
-
model,
|
|
1006
|
-
scopeId,
|
|
1007
|
-
scopePolicyOverride,
|
|
1008
|
-
});
|
|
1009
|
-
const merged = result.merged;
|
|
1010
|
-
|
|
1011
|
-
return merged.slice(0, limit).map((c) => ({
|
|
1012
|
-
id: c.id,
|
|
1013
|
-
type: c.type,
|
|
1014
|
-
kind: c.kind,
|
|
1015
|
-
text: c.text,
|
|
1016
|
-
confidence: c.confidence,
|
|
1017
|
-
importance: c.importance,
|
|
1018
|
-
createdAt: c.createdAt,
|
|
1019
|
-
finalScore: c.finalScore,
|
|
1020
|
-
scores: {
|
|
1021
|
-
lexical: c.lexical,
|
|
1022
|
-
semantic: c.semantic,
|
|
1023
|
-
recency: c.recency,
|
|
1024
|
-
},
|
|
1025
|
-
}));
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
1031
|
function emptyResult(
|
|
1029
1032
|
init: Partial<MemoryRecallResult> &
|
|
1030
1033
|
Pick<MemoryRecallResult, "enabled" | "degraded" | "latencyMs">,
|
|
@@ -1032,6 +1035,7 @@ function emptyResult(
|
|
|
1032
1035
|
return {
|
|
1033
1036
|
enabled: init.enabled,
|
|
1034
1037
|
degraded: init.degraded,
|
|
1038
|
+
degradation: init.degradation,
|
|
1035
1039
|
reason: init.reason,
|
|
1036
1040
|
provider: init.provider,
|
|
1037
1041
|
model: init.model,
|
|
@@ -22,7 +22,7 @@ export const callSessions = sqliteTable(
|
|
|
22
22
|
task: text("task"),
|
|
23
23
|
status: text("status").notNull().default("initiated"),
|
|
24
24
|
callMode: text("call_mode"),
|
|
25
|
-
|
|
25
|
+
verificationSessionId: text("verification_session_id"),
|
|
26
26
|
callerIdentityMode: text("caller_identity_mode"),
|
|
27
27
|
callerIdentitySource: text("caller_identity_source"),
|
|
28
28
|
initiatedFromConversationId: text("initiated_from_conversation_id"),
|
|
@@ -85,8 +85,8 @@ export const externalConversationBindings = sqliteTable(
|
|
|
85
85
|
},
|
|
86
86
|
);
|
|
87
87
|
|
|
88
|
-
export const
|
|
89
|
-
"
|
|
88
|
+
export const channelVerificationSessions = sqliteTable(
|
|
89
|
+
"channel_verification_sessions",
|
|
90
90
|
{
|
|
91
91
|
id: text("id").primaryKey(),
|
|
92
92
|
channel: text("channel").notNull(),
|
|
@@ -148,10 +148,6 @@ export const channelGuardianRateLimits = sqliteTable(
|
|
|
148
148
|
channel: text("channel").notNull(),
|
|
149
149
|
actorExternalUserId: text("actor_external_user_id").notNull(),
|
|
150
150
|
actorChatId: text("actor_chat_id").notNull(),
|
|
151
|
-
// Legacy columns kept with defaults for backward compatibility with upgraded databases
|
|
152
|
-
// that still have the old NOT NULL columns without DEFAULT. Not read by app logic.
|
|
153
|
-
invalidAttempts: integer("invalid_attempts").notNull().default(0),
|
|
154
|
-
windowStartedAt: integer("window_started_at").notNull().default(0),
|
|
155
151
|
attemptTimestampsJson: text("attempt_timestamps_json")
|
|
156
152
|
.notNull()
|
|
157
153
|
.default("[]"),
|
|
@@ -7,7 +7,7 @@ export const guardianActionRequests = sqliteTable(
|
|
|
7
7
|
{
|
|
8
8
|
id: text("id").primaryKey(),
|
|
9
9
|
kind: text("kind").notNull(), // 'ask_guardian'
|
|
10
|
-
sourceChannel: text("source_channel").notNull(), // '
|
|
10
|
+
sourceChannel: text("source_channel").notNull(), // 'phone'
|
|
11
11
|
sourceConversationId: text("source_conversation_id").notNull(),
|
|
12
12
|
callSessionId: text("call_session_id")
|
|
13
13
|
.notNull()
|
|
@@ -52,7 +52,7 @@ export const guardianActionDeliveries = sqliteTable(
|
|
|
52
52
|
requestId: text("request_id")
|
|
53
53
|
.notNull()
|
|
54
54
|
.references(() => guardianActionRequests.id, { onDelete: "cascade" }),
|
|
55
|
-
destinationChannel: text("destination_channel").notNull(), // 'telegram' | '
|
|
55
|
+
destinationChannel: text("destination_channel").notNull(), // 'telegram' | 'vellum'
|
|
56
56
|
destinationConversationId: text("destination_conversation_id"),
|
|
57
57
|
destinationChatId: text("destination_chat_id"),
|
|
58
58
|
destinationExternalUserId: text("destination_external_user_id"),
|
|
@@ -42,10 +42,13 @@ export function lexicalSearch(
|
|
|
42
42
|
limit: number,
|
|
43
43
|
excludedMessageIds: string[] = [],
|
|
44
44
|
scopeIds?: string[],
|
|
45
|
+
expandedQuery?: string,
|
|
45
46
|
): Candidate[] {
|
|
46
47
|
const trimmed = query.trim();
|
|
47
48
|
if (trimmed.length === 0 || limit <= 0) return [];
|
|
48
|
-
|
|
49
|
+
// When an expanded query is provided (e.g. from query expansion in degraded
|
|
50
|
+
// mode), use it instead of building one from the raw conversational query.
|
|
51
|
+
const matchQuery = expandedQuery ?? buildFtsMatchQuery(trimmed);
|
|
49
52
|
if (!matchQuery) return [];
|
|
50
53
|
const excluded = new Set(excludedMessageIds);
|
|
51
54
|
const scopeClause = scopeIds
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
import { buildFTSQuery, expandQueryForFTS } from "./query-expansion.js";
|
|
4
|
+
|
|
5
|
+
describe("expandQueryForFTS", () => {
|
|
6
|
+
test("extracts meaningful keywords from conversational input", () => {
|
|
7
|
+
const result = expandQueryForFTS(
|
|
8
|
+
"what did we discuss about the API design?",
|
|
9
|
+
);
|
|
10
|
+
expect(result).toEqual(["discuss", "API", "design"]);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test("extracts all tokens from technical input (no stop words)", () => {
|
|
14
|
+
const result = expandQueryForFTS("React component lifecycle hooks");
|
|
15
|
+
expect(result).toEqual(["React", "component", "lifecycle", "hooks"]);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test("returns single keyword as-is", () => {
|
|
19
|
+
const result = expandQueryForFTS("authentication");
|
|
20
|
+
expect(result).toEqual(["authentication"]);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("returns empty array for empty input", () => {
|
|
24
|
+
expect(expandQueryForFTS("")).toEqual([]);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("returns empty array for whitespace-only input", () => {
|
|
28
|
+
expect(expandQueryForFTS(" ")).toEqual([]);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("returns empty array for punctuation-only input", () => {
|
|
32
|
+
expect(expandQueryForFTS("???")).toEqual([]);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("returns original tokens when all are stop words", () => {
|
|
36
|
+
const result = expandQueryForFTS("what is the");
|
|
37
|
+
expect(result).toEqual(["what", "is", "the"]);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("splits punctuation-delimited words into separate tokens", () => {
|
|
41
|
+
const result = expandQueryForFTS("error-handling config.yaml");
|
|
42
|
+
expect(result).toEqual(["error", "handling", "config", "yaml"]);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("normalizes contractions instead of splitting on apostrophes", () => {
|
|
46
|
+
const result = expandQueryForFTS("can't we discuss what's happening?");
|
|
47
|
+
expect(result).toEqual(["cant", "discuss", "whats", "happening"]);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
describe("buildFTSQuery", () => {
|
|
52
|
+
test("joins multiple keywords with OR", () => {
|
|
53
|
+
const result = buildFTSQuery(["API", "design"]);
|
|
54
|
+
expect(result).toBe('"API" OR "design"');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("wraps single keyword in quotes", () => {
|
|
58
|
+
const result = buildFTSQuery(["auth"]);
|
|
59
|
+
expect(result).toBe('"auth"');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("strips double-quote characters from keywords", () => {
|
|
63
|
+
const result = buildFTSQuery(['say "hello"', "world"]);
|
|
64
|
+
expect(result).toBe('"say hello" OR "world"');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("returns undefined for empty keywords", () => {
|
|
68
|
+
expect(buildFTSQuery([])).toBeUndefined();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// Stop words filtered out during query expansion to focus on meaningful keywords.
|
|
2
|
+
const STOP_WORDS = new Set([
|
|
3
|
+
"a",
|
|
4
|
+
"an",
|
|
5
|
+
"the",
|
|
6
|
+
"is",
|
|
7
|
+
"are",
|
|
8
|
+
"was",
|
|
9
|
+
"were",
|
|
10
|
+
"be",
|
|
11
|
+
"been",
|
|
12
|
+
"being",
|
|
13
|
+
"do",
|
|
14
|
+
"does",
|
|
15
|
+
"did",
|
|
16
|
+
"have",
|
|
17
|
+
"has",
|
|
18
|
+
"had",
|
|
19
|
+
"will",
|
|
20
|
+
"would",
|
|
21
|
+
"could",
|
|
22
|
+
"should",
|
|
23
|
+
"can",
|
|
24
|
+
"may",
|
|
25
|
+
"might",
|
|
26
|
+
"shall",
|
|
27
|
+
"that",
|
|
28
|
+
"this",
|
|
29
|
+
"these",
|
|
30
|
+
"those",
|
|
31
|
+
"which",
|
|
32
|
+
"what",
|
|
33
|
+
"how",
|
|
34
|
+
"who",
|
|
35
|
+
"whom",
|
|
36
|
+
"where",
|
|
37
|
+
"when",
|
|
38
|
+
"why",
|
|
39
|
+
"it",
|
|
40
|
+
"its",
|
|
41
|
+
"i",
|
|
42
|
+
"me",
|
|
43
|
+
"my",
|
|
44
|
+
"we",
|
|
45
|
+
"us",
|
|
46
|
+
"our",
|
|
47
|
+
"you",
|
|
48
|
+
"your",
|
|
49
|
+
"he",
|
|
50
|
+
"she",
|
|
51
|
+
"they",
|
|
52
|
+
"them",
|
|
53
|
+
"his",
|
|
54
|
+
"her",
|
|
55
|
+
"of",
|
|
56
|
+
"in",
|
|
57
|
+
"on",
|
|
58
|
+
"at",
|
|
59
|
+
"to",
|
|
60
|
+
"for",
|
|
61
|
+
"with",
|
|
62
|
+
"by",
|
|
63
|
+
"from",
|
|
64
|
+
"about",
|
|
65
|
+
"and",
|
|
66
|
+
"or",
|
|
67
|
+
"but",
|
|
68
|
+
"not",
|
|
69
|
+
"so",
|
|
70
|
+
"if",
|
|
71
|
+
"then",
|
|
72
|
+
]);
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Extract meaningful keywords from a conversational query by tokenizing,
|
|
76
|
+
* stripping punctuation, and removing stop words.
|
|
77
|
+
*
|
|
78
|
+
* Returns an empty array for empty/punctuation-only input so the caller
|
|
79
|
+
* can fall through to the default FTS query builder.
|
|
80
|
+
*/
|
|
81
|
+
export function expandQueryForFTS(query: string): string[] {
|
|
82
|
+
const trimmed = query.trim();
|
|
83
|
+
if (trimmed.length === 0) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const normalized = trimmed.replace(/(\w)'(\w)/g, "$1$2");
|
|
88
|
+
const tokens = normalized.split(/[^\w]+/).filter((token) => token.length > 0);
|
|
89
|
+
|
|
90
|
+
if (tokens.length === 0) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const keywords = tokens.filter(
|
|
95
|
+
(token) => !STOP_WORDS.has(token.toLowerCase()),
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
// If every token was a stop word, return the original tokens rather than
|
|
99
|
+
// discarding the entire query.
|
|
100
|
+
if (keywords.length === 0) {
|
|
101
|
+
return tokens;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return keywords;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Build an FTS5 query string from keywords using OR operators.
|
|
109
|
+
*
|
|
110
|
+
* Example: `["discuss", "API", "design"]` -> `"discuss" OR "API" OR "design"`
|
|
111
|
+
*/
|
|
112
|
+
export function buildFTSQuery(keywords: string[]): string | undefined {
|
|
113
|
+
if (keywords.length === 0) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return keywords.map((kw) => `"${kw.replaceAll('"', "")}"`).join(" OR ");
|
|
118
|
+
}
|