@vellumai/assistant 0.10.4 → 0.10.5-dev.202607022329.d89bf2f
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/ARCHITECTURE.md +94 -91
- package/Dockerfile +5 -16
- package/README.md +7 -10
- package/bun.lock +0 -4
- package/docs/architecture/security.md +20 -20
- package/docs/stt-provider-onboarding.md +4 -5
- package/docs/trusted-contact-access.md +7 -7
- package/eslint-rules/cli-no-daemon-internals.js +4 -0
- package/eslint.config.mjs +7 -1
- package/knip.json +0 -1
- package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +36 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/invite-contract.test.ts +233 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +40 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +20 -8
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +10 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +33 -0
- package/node_modules/@vellumai/gateway-client/src/invite-contract.ts +216 -0
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +91 -0
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +39 -3
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +0 -8
- package/node_modules/@vellumai/service-contracts/src/__tests__/package-boundary.test.ts +1 -5
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +3 -14
- package/openapi.yaml +1073 -225
- package/package.json +1 -4
- package/scripts/test.sh +35 -13
- package/src/__tests__/access-request-seed-content-blocks.test.ts +60 -4
- package/src/__tests__/acp-session.test.ts +4 -1
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +0 -6
- package/src/__tests__/add-message-preassigned-id.test.ts +56 -0
- package/src/__tests__/agent-loop-set-system-prompt.test.ts +139 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +3 -0
- package/src/__tests__/app-source-watcher.test.ts +11 -0
- package/src/__tests__/approval-interception-trust-gates.test.ts +148 -3
- package/src/__tests__/assistant-attachments.test.ts +62 -4
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -1
- package/src/__tests__/attachments-store-heic-normalize.test.ts +230 -0
- package/src/__tests__/attachments-store.test.ts +3 -0
- package/src/__tests__/background-shell-bash.test.ts +34 -0
- package/src/__tests__/background-shell-host-bash.test.ts +12 -0
- package/src/__tests__/background-tool-registry.test.ts +97 -0
- package/src/__tests__/background-tool-routes.test.ts +72 -1
- package/src/__tests__/background-workers-disk-pressure.test.ts +2 -1
- package/src/__tests__/btw-routes.test.ts +57 -3
- package/src/__tests__/call-controller.test.ts +474 -84
- package/src/__tests__/call-domain.test.ts +48 -1
- package/src/__tests__/call-pointer-messages.test.ts +57 -19
- package/src/__tests__/call-pointer-no-hardcoded-copy.guard.test.ts +2 -6
- package/src/__tests__/call-routes-http.test.ts +15 -14
- package/src/__tests__/call-setup-flow-invite.test.ts +568 -0
- package/src/__tests__/call-setup-flow-midcall-trust.test.ts +231 -0
- package/src/__tests__/call-setup-flow-name-capture.test.ts +754 -0
- package/src/__tests__/call-setup-flow-verification.test.ts +925 -0
- package/src/__tests__/call-setup-flow.test.ts +311 -0
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +0 -1
- package/src/__tests__/channel-guardian.test.ts +4 -7
- package/src/__tests__/channel-readiness-service.test.ts +0 -6
- package/src/__tests__/channel-readiness-slack-remote.test.ts +0 -4
- package/src/__tests__/channel-retry-sweep.test.ts +76 -64
- package/src/__tests__/channel-setup-panel-ack.test.ts +184 -0
- package/src/__tests__/clear-all-lexical.test.ts +90 -0
- package/src/__tests__/compactor-media-strip.test.ts +177 -0
- package/src/__tests__/config-loader-backfill.test.ts +5 -5
- package/src/__tests__/config-schema.test.ts +17 -0
- package/src/__tests__/contact-store-interaction-info.test.ts +27 -70
- package/src/__tests__/contacts-relay-reads.test.ts +188 -23
- package/src/__tests__/contacts-tools.test.ts +42 -1
- package/src/__tests__/contacts-write.test.ts +181 -0
- package/src/__tests__/context-search-conversations-source.test.ts +220 -81
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop.test.ts +39 -0
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -1
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -0
- package/src/__tests__/conversation-clear-safety.test.ts +0 -1
- package/src/__tests__/conversation-crud-enabled-plugins.test.ts +60 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -1
- package/src/__tests__/conversation-disk-view.test.ts +1 -0
- package/src/__tests__/conversation-enabledplugins-route.test.ts +184 -0
- package/src/__tests__/conversation-error.test.ts +0 -18
- package/src/__tests__/conversation-fork-crud.test.ts +67 -0
- package/src/__tests__/conversation-history-web-search.test.ts +7 -137
- package/src/__tests__/conversation-initial-prompt.test.ts +110 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +191 -0
- package/src/__tests__/conversation-process-callsite.test.ts +37 -0
- package/src/__tests__/conversation-queue.test.ts +149 -0
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +392 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +84 -0
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +407 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +36 -16
- package/src/__tests__/conversation-skill-tools.test.ts +73 -0
- package/src/__tests__/conversation-wipe.test.ts +20 -5
- package/src/__tests__/credential-prompt-route.test.ts +69 -0
- package/src/__tests__/credential-security-invariants.test.ts +1 -3
- package/src/__tests__/db-drop-messages-fts.test.ts +115 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +1 -62
- package/src/__tests__/edit-propagation.test.ts +56 -2
- package/src/__tests__/empty-state-greeting-cache.test.ts +9 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +15 -110
- package/src/__tests__/guardian-expiry-notifier.test.ts +1 -0
- package/src/__tests__/guardian-question-mode.test.ts +57 -0
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
- package/src/__tests__/guardian-wait-controller.test.ts +619 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +33 -2
- package/src/__tests__/heic-fixture.ts +55 -0
- package/src/__tests__/helpers/seed-contact-channel.ts +0 -2
- package/src/__tests__/http-conversation-lineage.test.ts +6 -1
- package/src/__tests__/image-conversion.test.ts +170 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +72 -341
- package/src/__tests__/introduction-card-resolver.test.ts +354 -0
- package/src/__tests__/invite-redeemed-ipc.test.ts +97 -0
- package/src/__tests__/invite-routes-http.test.ts +246 -420
- package/src/__tests__/job-handler-registration-guard.test.ts +104 -0
- package/src/__tests__/lexical-index-dual-write.test.ts +426 -0
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +2 -2
- package/src/__tests__/list-messages-attachments.test.ts +159 -0
- package/src/__tests__/list-messages-background-tool-completion.test.ts +141 -0
- package/src/__tests__/list-messages-queued.test.ts +25 -0
- package/src/__tests__/managed-store.test.ts +129 -1
- package/src/__tests__/media-stream-audio-transcode.test.ts +113 -0
- package/src/__tests__/media-stream-output.test.ts +350 -19
- package/src/__tests__/media-stream-server-integration.test.ts +943 -169
- package/src/__tests__/media-stream-stt-session.test.ts +498 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +2 -2
- package/src/__tests__/model-intents.test.ts +1 -1
- package/src/__tests__/mtime-cache.test.ts +19 -0
- package/src/__tests__/non-member-access-request.test.ts +349 -3
- package/src/__tests__/notification-decision-fallback.test.ts +104 -8
- package/src/__tests__/notification-decision-strategy.test.ts +57 -8
- package/src/__tests__/onboarding-template-contract.test.ts +27 -43
- package/src/__tests__/openai-provider.test.ts +33 -0
- package/src/__tests__/openai-responses-provider.test.ts +40 -0
- package/src/__tests__/persistence-layering-guard.test.ts +29 -20
- package/src/__tests__/persona-resolver.test.ts +56 -2
- package/src/__tests__/personal-memory-auth-bypass.test.ts +62 -0
- package/src/__tests__/phone.test.ts +1 -15
- package/src/__tests__/plugin-bootstrap.test.ts +25 -196
- package/src/__tests__/plugin-disabled-state.test.ts +33 -0
- package/src/__tests__/plugin-effective-enabled-set.test.ts +227 -0
- package/src/__tests__/plugin-event-hub-facade.test.ts +323 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +156 -42
- package/src/__tests__/plugin-injector-contribution.test.ts +4 -20
- package/src/__tests__/plugin-pipeline.test.ts +63 -1
- package/src/__tests__/plugin-route-contribution.test.ts +62 -115
- package/src/__tests__/plugin-tool-contribution.test.ts +0 -22
- package/src/__tests__/plugin-types.test.ts +0 -1
- package/src/__tests__/pointer-conversation-trust.test.ts +38 -6
- package/src/__tests__/pre-model-call-sanitize.test.ts +1 -1
- package/src/__tests__/prune-old-tool-invocations-job.test.ts +97 -0
- package/src/__tests__/public-ingress-urls.test.ts +0 -48
- package/src/__tests__/qdrant-collection-migration.test.ts +145 -2
- package/src/__tests__/reaction-intercept-member-verdict-warm.test.ts +0 -1
- package/src/__tests__/resolve-trust-class.test.ts +28 -10
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +137 -0
- package/src/__tests__/schedule-retry.test.ts +38 -14
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +3 -3
- package/src/__tests__/schedule-routes.test.ts +14 -6
- package/src/__tests__/schedule-store.test.ts +3 -1
- package/src/__tests__/scheduler-disk-pressure.test.ts +17 -6
- package/src/__tests__/scheduler-recurrence.test.ts +57 -107
- package/src/__tests__/scheduler-reuse-conversation.test.ts +51 -46
- package/src/__tests__/scheduler-wake.test.ts +13 -23
- package/src/__tests__/scheduler-worker-standdown.test.ts +220 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -1
- package/src/__tests__/shell-observability.test.ts +1 -0
- package/src/__tests__/skill-boundary-guard.test.ts +3 -4
- package/src/__tests__/skill-load-plugin-scope.test.ts +238 -0
- package/src/__tests__/skill-projection-feature-flag.test.ts +2 -0
- package/src/__tests__/skill-script-runner-host.test.ts +53 -0
- package/src/__tests__/skill-script-runner-sandbox.test.ts +5 -2
- package/src/__tests__/skill-tool-factory.test.ts +73 -1
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +37 -14
- package/src/__tests__/slack-inbound-verification.test.ts +36 -0
- package/src/__tests__/slack-notification-approval-card.test.ts +89 -2
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +51 -1
- package/src/__tests__/stt-hints.test.ts +2 -256
- package/src/__tests__/subagent-allowlist-validation.test.ts +47 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +72 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +14 -2
- package/src/__tests__/subagent-persistence.test.ts +122 -0
- package/src/__tests__/subagent-spawn-and-await.test.ts +1 -0
- package/src/__tests__/subagent-terminal-message.test.ts +99 -0
- package/src/__tests__/subagent-tool-gate-mode.test.ts +78 -1
- package/src/__tests__/system-prompt.test.ts +17 -118
- package/src/__tests__/task-scheduler.test.ts +68 -89
- package/src/__tests__/telephony-credential-preflight.test.ts +312 -0
- package/src/__tests__/telephony-tts-guard.test.ts +538 -0
- package/src/__tests__/title-generate-hook.test.ts +16 -0
- package/src/__tests__/tool-approval-handler.test.ts +87 -1
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +45 -20
- package/src/__tests__/tool-grant-request-escalation.test.ts +39 -0
- package/src/__tests__/trust-context-guards.test.ts +21 -10
- package/src/__tests__/trusted-contact-multichannel.test.ts +4 -0
- package/src/__tests__/twilio-provider.test.ts +17 -17
- package/src/__tests__/twilio-routes-twiml.test.ts +6 -543
- package/src/__tests__/twilio-routes.test.ts +257 -387
- package/src/__tests__/twilio-validation.test.ts +1 -1
- package/src/__tests__/unified-turn-context-client-os.test.ts +45 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +5 -0
- package/src/__tests__/voice-approval-resolver-relay.test.ts +150 -0
- package/src/__tests__/voice-ingress-preflight.test.ts +61 -0
- package/src/__tests__/voice-quality.test.ts +2 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -7
- package/src/__tests__/voice-session-bridge-processing-wait.test.ts +27 -0
- package/src/__tests__/voice-session-bridge.test.ts +1 -10
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -0
- package/src/__tests__/workspace-migration-118-seed-now-md.test.ts +120 -0
- package/src/__tests__/workspace-migration-120-revise-onboarding-threads.test.ts +175 -0
- package/src/__tests__/workspace-migration-121-seed-default-user-guardrails.test.ts +118 -0
- package/src/__tests__/workspace-migration-122-relocate-default-user-boundary.test.ts +119 -0
- package/src/__tests__/workspace-migration-123-swap-quality-profile-to-fable.test.ts +191 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +235 -241
- package/src/acp/__tests__/prepare-agent-env.test.ts +0 -97
- package/src/acp/__tests__/session-manager-persistence.test.ts +2 -0
- package/src/acp/__tests__/session-manager-resume.test.ts +8 -0
- package/src/acp/__tests__/session-manager-usage.test.ts +6 -0
- package/src/acp/__tests__/session-manager.test.ts +6 -0
- package/src/acp/agent-process.test.ts +116 -0
- package/src/acp/agent-process.ts +71 -0
- package/src/acp/auto-install.ts +12 -8
- package/src/acp/failure-error.test.ts +109 -0
- package/src/acp/failure-error.ts +111 -0
- package/src/acp/prepare-agent-env.ts +0 -12
- package/src/acp/resolve-agent.test.ts +6 -45
- package/src/acp/resolve-agent.ts +2 -4
- package/src/acp/session-manager.test.ts +312 -0
- package/src/acp/session-manager.ts +102 -46
- package/src/agent/ax-tree-compaction.test.ts +4 -1
- package/src/agent/image-optimize.ts +17 -127
- package/src/agent/loop.ts +45 -192
- package/src/api/events/background-tool-completed.test.ts +51 -0
- package/src/api/events/background-tool-completed.ts +29 -0
- package/src/api/events/background-tool-started.test.ts +36 -0
- package/src/api/events/background-tool-started.ts +28 -0
- package/src/api/events/conversation-error.ts +0 -1
- package/src/api/events/open-panel.ts +33 -0
- package/src/api/events/subagent-status-changed.ts +4 -1
- package/src/api/index.ts +19 -0
- package/src/api/responses/conversation-message.ts +34 -0
- package/src/approvals/guardian-decision-primitive.ts +74 -24
- package/src/approvals/guardian-request-resolvers.ts +450 -122
- package/src/apps/app-store.ts +1 -0
- package/src/apps/shared-app-links-store.ts +1 -0
- package/src/avatar/identity-avatar.ts +3 -7
- package/src/background-wake/wake-intent-hooks.test.ts +1 -1
- package/src/calls/__tests__/fish-audio-client.test.ts +73 -0
- package/src/calls/__tests__/gateway-invite-reader.test.ts +170 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +126 -102
- package/src/calls/call-controller.ts +134 -48
- package/src/calls/call-domain.ts +18 -42
- package/src/calls/call-pointer-messages.ts +51 -67
- package/src/calls/call-setup-flow-types.ts +76 -0
- package/src/calls/call-setup-flow.ts +1743 -0
- package/src/calls/call-speech-output.ts +87 -23
- package/src/calls/call-store.ts +4 -0
- package/src/calls/call-transport.ts +22 -36
- package/src/calls/fish-audio-client.ts +3 -0
- package/src/calls/gateway-invite-reader.ts +98 -0
- package/src/calls/guardian-wait-controller.ts +451 -0
- package/src/calls/media-stream-audio-transcode.ts +82 -2
- package/src/calls/media-stream-output.ts +142 -36
- package/src/calls/media-stream-server.ts +297 -178
- package/src/calls/media-stream-stt-session.ts +393 -50
- package/src/calls/media-turn-detector.ts +4 -6
- package/src/calls/relay-access-wait.ts +3 -4
- package/src/calls/relay-setup-router.ts +22 -43
- package/src/calls/relay-verification.ts +17 -24
- package/src/calls/resolve-call-tts-provider.ts +96 -29
- package/src/calls/stt-hints.ts +24 -87
- package/src/calls/telephony-credential-preflight.ts +159 -0
- package/src/calls/telephony-tts-capability.ts +183 -0
- package/src/calls/tts-call-strategy.ts +18 -20
- package/src/calls/twilio-provider.ts +3 -2
- package/src/calls/twilio-routes.ts +47 -351
- package/src/calls/types.ts +5 -3
- package/src/calls/voice-ingress-preflight.ts +9 -0
- package/src/calls/voice-quality.ts +13 -18
- package/src/calls/voice-session-bridge.ts +25 -35
- package/src/channels/__tests__/types.test.ts +28 -0
- package/src/channels/channel-verification-sessions.ts +7 -2
- package/src/channels/config.ts +0 -42
- package/src/channels/slack-thread-store.ts +12 -0
- package/src/channels/types.ts +23 -0
- package/src/cli/commands/__tests__/conversations-slack.test.ts +1 -1
- package/src/cli/commands/__tests__/schedules.test.ts +83 -34
- package/src/cli/commands/__tests__/status.test.ts +42 -2
- package/src/cli/commands/contacts.ts +2 -2
- package/src/cli/commands/credentials.ts +17 -0
- package/src/cli/commands/monitoring.ts +191 -0
- package/src/cli/commands/schedules-worker.ts +175 -0
- package/src/cli/commands/schedules.ts +169 -43
- package/src/cli/commands/status.ts +12 -1
- package/src/cli/commands/tools.ts +5 -1
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +1 -0
- package/src/cli/lib/__tests__/search-plugins.test.ts +29 -1
- package/src/cli/lib/__tests__/toggle-plugin.test.ts +7 -0
- package/src/cli/lib/search-plugins.ts +6 -0
- package/src/cli/lib/toggle-plugin.ts +21 -2
- package/src/cli/program.ts +3 -1
- package/src/config/__tests__/deployment-context-defaults.test.ts +23 -0
- package/src/config/acp-defaults.test.ts +0 -10
- package/src/config/acp-defaults.ts +0 -6
- package/src/config/bundled-skills/acp/SKILL.md +13 -45
- package/src/config/bundled-skills/acp/TOOLS.json +3 -3
- package/src/config/bundled-skills/app-builder/SKILL.md +3 -3
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +9 -9
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +1 -1
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +1 -1
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -9
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +10 -7
- package/src/config/bundled-skills/skill-management/TOOLS.json +10 -0
- package/src/config/call-site-defaults.ts +0 -2
- package/src/config/feature-flag-registry.json +16 -8
- package/src/config/loader.ts +11 -0
- package/src/config/schema.ts +9 -1
- package/src/config/schemas/__tests__/memory-v2.test.ts +2 -2
- package/src/config/schemas/__tests__/memory-v3.test.ts +64 -0
- package/src/config/schemas/call-site-catalog.ts +0 -12
- package/src/config/schemas/calls.ts +8 -0
- package/src/config/schemas/elevenlabs.ts +1 -1
- package/src/config/schemas/llm.ts +0 -2
- package/src/config/schemas/memory-v2.ts +1 -1
- package/src/config/schemas/memory-v3.ts +82 -0
- package/src/config/schemas/monitoring.ts +61 -0
- package/src/config/schemas/schedules.ts +35 -0
- package/src/config/seed-inference-profiles.ts +2 -2
- package/src/config/skills-plugin-filter.test.ts +96 -0
- package/src/config/skills.ts +26 -0
- package/src/contacts/__tests__/member-write-relay.test.ts +156 -4
- package/src/contacts/canonical-guardian-store.ts +5 -0
- package/src/contacts/contact-store.ts +81 -35
- package/src/contacts/contacts-write.ts +50 -25
- package/src/contacts/member-write-relay.ts +115 -31
- package/src/contacts/types.ts +0 -8
- package/src/context/compactor.ts +29 -15
- package/src/context/outbound-sanitize.ts +202 -0
- package/src/daemon/__tests__/abort-null-controller.test.ts +167 -0
- package/src/daemon/__tests__/conversation-tool-setup-plugin-scope.test.ts +122 -0
- package/src/daemon/__tests__/embedding-reconcile.test.ts +99 -16
- package/src/daemon/__tests__/wake-conversation-ops-completion.test.ts +107 -0
- package/src/daemon/abort-watchdog.ts +7 -0
- package/src/daemon/app-source-watcher.ts +9 -0
- package/src/daemon/assistant-attachments.ts +42 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +256 -147
- package/src/daemon/conversation-agent-loop.ts +61 -68
- package/src/daemon/conversation-error.ts +1 -15
- package/src/daemon/conversation-history.ts +32 -236
- package/src/daemon/conversation-initial-prompt.ts +77 -0
- package/src/daemon/conversation-lifecycle.ts +25 -1
- package/src/daemon/conversation-messaging.ts +2 -2
- package/src/daemon/conversation-plugin-scope.ts +38 -0
- package/src/daemon/conversation-process.ts +50 -14
- package/src/daemon/conversation-runtime-assembly.ts +36 -6
- package/src/daemon/conversation-skill-tools.ts +19 -3
- package/src/daemon/conversation-store.ts +3 -3
- package/src/daemon/conversation-surfaces.ts +171 -0
- package/src/daemon/conversation-tool-setup.test.ts +95 -0
- package/src/daemon/conversation-tool-setup.ts +116 -1
- package/src/daemon/conversation-turn-finalize.ts +211 -0
- package/src/daemon/conversation.ts +92 -1
- package/src/daemon/disk-pressure-policy.ts +2 -1
- package/src/daemon/event-loop-watchdog.ts +22 -6
- package/src/daemon/external-plugins-bootstrap.ts +47 -134
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +26 -14
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +27 -14
- package/src/daemon/handlers/__tests__/config-channels.test.ts +0 -5
- package/src/daemon/handlers/config-a2a.ts +7 -14
- package/src/daemon/handlers/config-channels.ts +2 -10
- package/src/daemon/handlers/conversation-history.ts +3 -1
- package/src/daemon/handlers/conversations.ts +0 -52
- package/src/daemon/handlers/shared.ts +4 -24
- package/src/daemon/handlers/skills.ts +4 -1
- package/src/daemon/host-cu-proxy.ts +1 -1
- package/src/daemon/lifecycle.ts +59 -472
- package/src/daemon/message-protocol.ts +3 -3
- package/src/daemon/message-provenance.ts +12 -14
- package/src/daemon/message-types/background-tools.ts +28 -0
- package/src/daemon/message-types/contacts.ts +2 -10
- package/src/daemon/message-types/conversations.ts +10 -0
- package/src/daemon/message-types/integrations.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +1 -0
- package/src/daemon/message-types/sync.ts +1 -0
- package/src/daemon/pointer-conversation-trust.ts +23 -9
- package/src/daemon/pointer-turn-runner.ts +174 -0
- package/src/daemon/providers-setup.ts +16 -0
- package/src/daemon/shutdown-handlers.ts +139 -47
- package/src/daemon/skill-memory-refresh.ts +2 -2
- package/src/daemon/sqlite-corruption-watchdog.test.ts +217 -0
- package/src/daemon/sqlite-corruption-watchdog.ts +155 -0
- package/src/daemon/tool-setup-types.ts +8 -0
- package/src/daemon/trust-context.ts +21 -6
- package/src/daemon/turn-latency-tracker.test.ts +93 -0
- package/src/daemon/turn-latency-tracker.ts +38 -0
- package/src/daemon/wake-conversation-ops.ts +10 -8
- package/src/documents/document-comments-store.test.ts +7 -1
- package/src/documents/document-comments-store.ts +8 -0
- package/src/documents/document-store.ts +15 -0
- package/src/export/__tests__/transcript-formatter.test.ts +11 -0
- package/src/export/transcript-formatter.ts +49 -67
- package/src/home/__tests__/feed-writer.test.ts +247 -1
- package/src/home/conversation-starter-checkpoints.ts +1 -0
- package/src/home/feed-writer.ts +61 -0
- package/src/home/job-handlers/conversation-starters.ts +1 -0
- package/src/hooks/hook-loader.ts +12 -0
- package/src/hooks/registry.ts +32 -4
- package/src/inbound/public-ingress-urls.ts +0 -17
- package/src/ipc/__tests__/contacts-info-ipc.test.ts +285 -0
- package/src/ipc/assistant-server.ts +28 -7
- package/src/ipc/routes/__tests__/contacts-mirror-apply-atomicity.test.ts +62 -0
- package/src/ipc/routes/__tests__/contacts-mirror-apply.test.ts +272 -0
- package/src/ipc/routes/__tests__/contacts-mirror-ipc-routes.test.ts +322 -0
- package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +60 -4
- package/src/ipc/routes/contacts-info-ipc-routes.ts +239 -0
- package/src/ipc/routes/contacts-mirror-ipc-routes.ts +202 -0
- package/src/ipc/routes/db-proxy.ts +5 -2
- package/src/ipc/routes/invite-ipc-routes.ts +53 -39
- package/src/jobs/worker.ts +9 -2
- package/src/live-voice/__tests__/live-voice-archive.test.ts +10 -1
- package/src/live-voice/live-voice-archive.ts +5 -0
- package/src/messaging/providers/__tests__/transport-dispatch.test.ts +22 -6
- package/src/messaging/providers/channel-transport.ts +6 -0
- package/src/messaging/providers/index.ts +3 -0
- package/src/messaging/providers/slack/api.test.ts +49 -1
- package/src/messaging/providers/slack/api.ts +110 -0
- package/src/messaging/providers/slack/send.test.ts +85 -0
- package/src/messaging/providers/slack/send.ts +100 -28
- package/src/messaging/providers/slack/transport.ts +7 -13
- package/src/messaging/providers/whatsapp/send.ts +29 -9
- package/src/monitoring/__tests__/control.test.ts +235 -0
- package/src/monitoring/__tests__/sample-ring-buffer.test.ts +96 -0
- package/src/monitoring/control.ts +105 -0
- package/src/monitoring/resource-sampler.ts +258 -0
- package/src/monitoring/sample-ring-buffer.ts +108 -0
- package/src/monitoring/worker.ts +94 -0
- package/src/notifications/README.md +1 -1
- package/src/notifications/access-request-copy.ts +94 -23
- package/src/notifications/adapters/slack.ts +89 -21
- package/src/notifications/approval-card-builder.ts +33 -18
- package/src/notifications/approval-card-data.ts +48 -15
- package/src/notifications/broadcaster.ts +25 -16
- package/src/notifications/decision-engine.ts +131 -32
- package/src/notifications/guardian-question-mode.ts +58 -10
- package/src/permissions/approval-policy.ts +8 -1
- package/src/permissions/checker.ts +2 -0
- package/src/permissions/gateway-threshold-reader.ts +7 -6
- package/src/permissions/ipc-risk-types.ts +1 -0
- package/src/permissions/secret-prompter.ts +11 -3
- package/src/permissions/types.ts +2 -2
- package/src/persistence/__tests__/conversation-queries-search.test.ts +397 -0
- package/src/persistence/__tests__/conversation-search-lexical.test.ts +103 -0
- package/src/persistence/__tests__/jobs-worker-memory-disabled.test.ts +95 -0
- package/src/persistence/__tests__/slow-query-log.test.ts +266 -0
- package/src/persistence/__tests__/slow-sync-log.test.ts +155 -0
- package/src/persistence/a2a-invite-store.ts +205 -0
- package/src/persistence/attachments-store.ts +94 -10
- package/src/persistence/checkpoints.ts +45 -0
- package/src/persistence/conversation-crud.ts +453 -260
- package/src/persistence/conversation-display-order-migration.ts +8 -2
- package/src/persistence/conversation-group-migration.test.ts +8 -0
- package/src/persistence/conversation-group-migration.ts +9 -0
- package/src/persistence/conversation-queries.ts +244 -125
- package/src/persistence/conversation-row-batch-delete.ts +9 -5
- package/src/persistence/conversation-search-lexical.ts +49 -0
- package/src/persistence/db-async-query.ts +42 -0
- package/src/persistence/db-connection.ts +13 -0
- package/src/persistence/delivery-channels.ts +0 -82
- package/src/persistence/delivery-crud.ts +27 -6
- package/src/persistence/embeddings/__tests__/embedding-identity.test.ts +18 -5
- package/src/persistence/embeddings/__tests__/messages-lexical-index.test.ts +334 -0
- package/src/persistence/embeddings/embedding-identity.ts +17 -5
- package/src/persistence/embeddings/embedding-runtime-manager.ts +31 -0
- package/src/persistence/embeddings/messages-lexical-index.ts +396 -0
- package/src/persistence/embeddings/qdrant-client.ts +81 -5
- package/src/persistence/group-crud.ts +13 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +506 -0
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +164 -0
- package/src/persistence/job-handlers/__tests__/message-lexical.test.ts +259 -0
- package/src/persistence/job-handlers/cleanup.ts +57 -9
- package/src/persistence/job-handlers/message-lexical-backfill.ts +187 -0
- package/src/persistence/job-handlers/message-lexical.ts +251 -0
- package/src/persistence/jobs-store.ts +102 -8
- package/src/persistence/jobs-worker.ts +68 -28
- package/src/persistence/llm-request-log-store.ts +35 -19
- package/src/persistence/llm-usage-store.ts +11 -0
- package/src/persistence/memory-lifecycle-hooks.test.ts +65 -0
- package/src/persistence/memory-lifecycle-hooks.ts +55 -1
- package/src/persistence/migrations/028-call-session-mode.ts +1 -1
- package/src/persistence/migrations/116-messages-fts.ts +8 -1
- package/src/persistence/migrations/311-create-subagents-table.ts +50 -0
- package/src/persistence/migrations/312-drop-inbox-conversation-state-table.ts +15 -0
- package/src/persistence/migrations/313-drop-messages-fts.ts +17 -0
- package/src/persistence/migrations/314-add-conversation-enabled-plugins.ts +25 -0
- package/src/persistence/migrations/315-create-a2a-invites.ts +58 -0
- package/src/persistence/migrations/316-drop-contact-channels-invite-id.ts +28 -0
- package/src/persistence/migrations/317-canonical-guardian-requester-signals.ts +24 -0
- package/src/persistence/migrations/318-drop-contact-channel-telemetry.ts +32 -0
- package/src/persistence/migrations/__tests__/315-create-a2a-invites.test.ts +161 -0
- package/src/persistence/migrations/__tests__/316-drop-contact-channels-invite-id.test.ts +156 -0
- package/src/persistence/migrations/__tests__/318-drop-contact-channel-telemetry.test.ts +134 -0
- package/src/persistence/migrations/__tests__/migration-prefix-guard.test.ts +99 -0
- package/src/persistence/raw-query.ts +50 -11
- package/src/persistence/schema/a2a.ts +14 -0
- package/src/persistence/schema/contacts.ts +0 -62
- package/src/persistence/schema/conversation-groups.ts +12 -0
- package/src/persistence/schema/conversations.ts +2 -0
- package/src/persistence/schema/documents.ts +65 -0
- package/src/persistence/schema/guardian.ts +4 -0
- package/src/persistence/schema/index.ts +4 -0
- package/src/persistence/schema/memory-injection.ts +62 -0
- package/src/persistence/schema/workflows.ts +55 -0
- package/src/persistence/slow-query-log.ts +437 -0
- package/src/persistence/slow-sync-log.ts +204 -0
- package/src/persistence/steps.ts +16 -0
- package/src/persistence/subagent-store.ts +125 -0
- package/src/persistence/worker-control.ts +45 -238
- package/src/plugin-api/event-hub-facade.ts +172 -0
- package/src/plugin-api/index.ts +9 -1
- package/src/plugin-api/types.ts +40 -9
- package/src/plugins/defaults/default-plugin-names.ts +60 -0
- package/src/plugins/defaults/index.ts +19 -29
- package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +46 -67
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/find-most-recent-retrospective-for.test.ts +2 -4
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +9 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +7 -4
- package/src/plugins/defaults/memory/config.ts +11 -0
- package/src/plugins/defaults/memory/context-search/agent-runner.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +124 -113
- package/src/plugins/defaults/memory/embeddings.ts +77 -0
- package/src/plugins/defaults/memory/find-most-recent-retrospective-for.ts +66 -0
- package/src/plugins/defaults/memory/frontmatter.ts +50 -0
- package/src/plugins/defaults/memory/graph/bootstrap.test.ts +36 -10
- package/src/plugins/defaults/memory/graph/bootstrap.ts +6 -5
- package/src/plugins/defaults/memory/graph/consolidation.ts +3 -5
- package/src/plugins/defaults/memory/graph/extraction.ts +3 -6
- package/src/plugins/defaults/memory/graph/graph-search.ts +12 -23
- package/src/plugins/defaults/memory/graph/narrative.ts +3 -5
- package/src/plugins/defaults/memory/graph/pattern-scan.ts +3 -5
- package/src/plugins/defaults/memory/graph/retriever.test.ts +1 -6
- package/src/plugins/defaults/memory/graph/retriever.ts +5 -10
- package/src/plugins/defaults/memory/graph/tools.ts +1 -1
- package/src/plugins/defaults/memory/hooks/init.ts +31 -5
- package/src/plugins/defaults/memory/indexer.ts +2 -3
- package/src/plugins/defaults/memory/injectors.ts +2 -2
- package/src/plugins/defaults/memory/job-handler-registration.ts +96 -0
- package/src/plugins/defaults/memory/job-handlers/backfill.ts +4 -26
- package/src/plugins/defaults/memory/job-handlers/embedding.test.ts +6 -19
- package/src/plugins/defaults/memory/job-handlers/embedding.ts +9 -22
- package/src/plugins/defaults/memory/job-handlers/index-maintenance.ts +2 -3
- package/src/plugins/defaults/memory/job-handlers.ts +13 -12
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +1 -1
- package/src/plugins/defaults/memory/llm-helpers.ts +76 -0
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +8 -5
- package/src/plugins/defaults/memory/memory-retrospective-startup-cleanup.ts +2 -2
- package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +2 -0
- package/src/plugins/defaults/memory/persistence-hooks.ts +46 -1
- package/src/plugins/defaults/memory/pkb/pkb-index.ts +1 -5
- package/src/plugins/defaults/memory/pkb/pkb-search.ts +2 -2
- package/src/plugins/defaults/memory/routes/__tests__/memory-v2-simulate-route.test.ts +4 -6
- package/src/plugins/defaults/memory/routes/memory-item-routes.ts +1 -1
- package/src/plugins/defaults/memory/search/semantic.ts +2 -2
- package/src/plugins/defaults/memory/startup.ts +244 -0
- package/src/plugins/defaults/memory/task-memory-cleanup.ts +8 -0
- package/src/{daemon → plugins/defaults/memory/v2}/__tests__/memory-v2-startup.test.ts +6 -6
- package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +2 -13
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +4 -5
- package/src/plugins/defaults/memory/v2/__tests__/sweep-job.test.ts +1 -8
- package/src/plugins/defaults/memory/v2/activation.ts +2 -4
- package/src/plugins/defaults/memory/v2/cli-command-store.ts +2 -4
- package/src/plugins/defaults/memory/v2/frontmatter-sweep.ts +1 -1
- package/src/{daemon → plugins/defaults/memory/v2}/memory-v2-startup.test.ts +8 -8
- package/src/{daemon → plugins/defaults/memory/v2}/memory-v2-startup.ts +20 -22
- package/src/plugins/defaults/memory/v2/migration.ts +2 -5
- package/src/plugins/defaults/memory/v2/page-store.ts +1 -1
- package/src/plugins/defaults/memory/v2/qdrant.ts +2 -3
- package/src/plugins/defaults/memory/v2/router.ts +5 -5
- package/src/plugins/defaults/memory/v2/sim.ts +2 -4
- package/src/plugins/defaults/memory/v2/skill-store.ts +2 -4
- package/src/plugins/defaults/memory/v2/sweep-job.ts +6 -6
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +11 -9
- package/src/plugins/defaults/memory/v3/__tests__/dense.test.ts +107 -2
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +69 -0
- package/src/plugins/defaults/memory/v3/__tests__/gate.test.ts +181 -0
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +7 -3
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +345 -8
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +1 -4
- package/src/plugins/defaults/memory/v3/__tests__/section-needle.test.ts +64 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +18 -13
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +62 -1
- package/src/plugins/defaults/memory/v3/card.ts +1 -4
- package/src/plugins/defaults/memory/v3/dense.ts +60 -25
- package/src/plugins/defaults/memory/v3/edge.ts +1 -1
- package/src/plugins/defaults/memory/v3/gate-flag.ts +20 -0
- package/src/plugins/defaults/memory/v3/gate.ts +158 -0
- package/src/plugins/defaults/memory/v3/maintain-job.ts +2 -4
- package/src/plugins/defaults/memory/v3/orchestrate.ts +186 -25
- package/src/plugins/defaults/memory/v3/pool-select.test.ts +7 -9
- package/src/plugins/defaults/memory/v3/pool-select.ts +6 -6
- package/src/plugins/defaults/memory/v3/prune.ts +2 -2
- package/src/plugins/defaults/memory/v3/section-dense-store.ts +8 -11
- package/src/plugins/defaults/memory/v3/section-needle.ts +27 -7
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +10 -0
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +1 -4
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +5 -0
- package/src/plugins/defaults/turn-context/injectors.ts +1 -0
- package/src/plugins/defaults/turn-context/unified-turn-context.ts +12 -0
- package/src/plugins/injector-registry.ts +13 -2
- package/src/plugins/mtime-cache.ts +36 -47
- package/src/plugins/pipeline.ts +15 -1
- package/src/plugins/types.ts +14 -23
- package/src/prompts/__tests__/system-prompt.test.ts +170 -32
- package/src/prompts/persona-resolver.ts +13 -9
- package/src/prompts/system-prompt.ts +30 -9
- package/src/prompts/templates/BOOTSTRAP.md +16 -119
- package/src/prompts/templates/SOUL.md +43 -13
- package/src/prompts/templates/system-sections.ts +32 -27
- package/src/prompts/templates/users/default.md +19 -0
- package/src/providers/__tests__/placeholder-sentinels.test.ts +56 -0
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +96 -1
- package/src/providers/model-intents.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +14 -1
- package/src/providers/openai/responses-provider.ts +18 -0
- package/src/providers/placeholder-sentinels.ts +18 -8
- package/src/providers/retry.ts +1 -0
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +0 -64
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +92 -79
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +98 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +62 -3
- package/src/providers/speech-to-text/provider-catalog.ts +0 -89
- package/src/providers/speech-to-text/resolve.ts +55 -0
- package/src/providers/tool-progress-events.test.ts +50 -0
- package/src/providers/tool-progress-events.ts +99 -0
- package/src/providers/types.ts +1 -1
- package/src/providers/vellum-model-routing.test.ts +51 -0
- package/src/providers/vellum-model-routing.ts +84 -0
- package/src/runtime/AGENTS.md +5 -4
- package/src/runtime/__tests__/agent-wake.test.ts +158 -1
- package/src/runtime/__tests__/channel-verification-service.test.ts +2 -2
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +37 -8
- package/src/runtime/access-request-helper.ts +154 -3
- package/src/runtime/actor-trust-resolver.ts +7 -21
- package/src/runtime/agent-wake.ts +41 -1
- package/src/runtime/assistant-event.ts +86 -12
- package/src/runtime/auth/__tests__/route-policy.test.ts +31 -0
- package/src/runtime/channel-approval-types.ts +52 -2
- package/src/runtime/channel-approvals.ts +23 -8
- package/src/runtime/channel-invite-transport.ts +2 -2
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-readiness-service.ts +3 -5
- package/src/runtime/channel-retry-sweep.ts +18 -24
- package/src/runtime/channel-verification-service.ts +9 -11
- package/src/runtime/finalize-event-delivery.ts +30 -16
- package/src/runtime/guardian-action-service.ts +10 -11
- package/src/runtime/guardian-reply-router.ts +122 -21
- package/src/runtime/http-server.ts +44 -101
- package/src/runtime/introduction-policy.test.ts +214 -0
- package/src/runtime/introduction-policy.ts +284 -0
- package/src/runtime/invite-service.ts +104 -361
- package/src/runtime/local-actor-identity.test.ts +38 -0
- package/src/runtime/local-actor-identity.ts +14 -0
- package/src/runtime/middleware/__tests__/rate-limiter.test.ts +22 -0
- package/src/runtime/middleware/rate-limiter.ts +30 -0
- package/src/runtime/middleware/twilio-validation.ts +5 -7
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +28 -0
- package/src/runtime/migrations/origin-mode.ts +6 -6
- package/src/runtime/pre-first-message-gate.ts +1 -0
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +6 -35
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +24 -3
- package/src/runtime/routes/__tests__/contact-routes.test.ts +80 -15
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +7 -1
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -3
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +142 -1
- package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +119 -30
- package/src/runtime/routes/__tests__/migration-import-allowed-hosts-env.test.ts +70 -0
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +194 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +755 -29
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +4 -0
- package/src/runtime/routes/__tests__/schedule-routes-create.test.ts +70 -0
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +161 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +1 -1
- package/src/runtime/routes/acp-routes.ts +15 -3
- package/src/runtime/routes/app-management-routes.ts +4 -7
- package/src/runtime/routes/approval-routes.ts +4 -0
- package/src/runtime/routes/attachment-routes.ts +54 -3
- package/src/runtime/routes/avatar-routes.ts +0 -4
- package/src/runtime/routes/background-tool-routes.ts +34 -5
- package/src/runtime/routes/btw-routes.ts +32 -4
- package/src/runtime/routes/channel-route-shared.ts +18 -14
- package/src/runtime/routes/channel-verification-routes.ts +0 -3
- package/src/runtime/routes/contact-routes.ts +298 -117
- package/src/runtime/routes/conversation-list-routes.ts +6 -0
- package/src/runtime/routes/conversation-management-routes.ts +74 -37
- package/src/runtime/routes/conversation-query-routes.ts +5 -2
- package/src/runtime/routes/conversation-routes.ts +222 -82
- package/src/runtime/routes/conversations-import-routes.ts +8 -1
- package/src/runtime/routes/credential-prompt-routes.ts +20 -5
- package/src/runtime/routes/debug-routes.ts +1 -0
- package/src/runtime/routes/documents-routes.ts +5 -2
- package/src/runtime/routes/empty-state-greeting-cache.ts +37 -10
- package/src/runtime/routes/global-search-routes.ts +2 -1
- package/src/runtime/routes/guardian-approval-interception.ts +51 -0
- package/src/runtime/routes/home-feed-routes.ts +60 -1
- package/src/runtime/routes/identity-routes.ts +4 -87
- package/src/runtime/routes/inbound-message-handler.ts +82 -41
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +430 -57
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +302 -572
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +76 -270
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +21 -116
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +9 -1
- package/src/runtime/routes/inbound-stages/escalation-intercept.test.ts +158 -0
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +22 -1
- package/src/runtime/routes/index.ts +6 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +22 -16
- package/src/runtime/routes/internal-twilio-routes.ts +0 -15
- package/src/runtime/routes/messages-lexical-routes.ts +75 -0
- package/src/runtime/routes/migration-routes.ts +69 -6
- package/src/runtime/routes/monitoring-routes.ts +237 -0
- package/src/runtime/routes/plugins-routes.ts +329 -8
- package/src/runtime/routes/schedule-routes.ts +49 -8
- package/src/runtime/routes/schedule-worker-routes.ts +210 -0
- package/src/runtime/routes/secret-routes.ts +1 -1
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +54 -9
- package/src/runtime/services/__tests__/auto-analysis-enqueue.test.ts +30 -6
- package/src/runtime/services/__tests__/conversation-analyze-job.test.ts +43 -8
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +20 -0
- package/src/runtime/services/analyze-conversation.ts +14 -4
- package/src/runtime/services/conversation-serializer.ts +5 -0
- package/src/runtime/slack-no-response.ts +47 -0
- package/src/runtime/slack-reply-session.test.ts +633 -0
- package/src/runtime/slack-reply-session.ts +382 -0
- package/src/runtime/slack-task-progress.ts +95 -0
- package/src/runtime/sync/resource-sync-events.ts +25 -0
- package/src/runtime/tool-grant-request-helper.ts +17 -1
- package/src/runtime/trust-class.test.ts +141 -0
- package/src/runtime/trust-class.ts +121 -0
- package/src/runtime/trust-verdict-consumer.ts +7 -6
- package/src/schedule/__tests__/run-script.test.ts +21 -0
- package/src/schedule/__tests__/worker-control.test.ts +241 -0
- package/src/schedule/run-script.ts +13 -6
- package/src/schedule/schedule-usage-store.ts +1 -0
- package/src/schedule/scheduler.ts +178 -127
- package/src/schedule/worker-control.ts +118 -0
- package/src/schedule/worker.ts +131 -0
- package/src/skills/__tests__/categories-cache.test.ts +38 -0
- package/src/skills/categories-cache.ts +40 -5
- package/src/skills/managed-store.ts +41 -6
- package/src/skills/validate-input.ts +47 -0
- package/src/stt/types.ts +5 -9
- package/src/subagent/manager.ts +267 -39
- package/src/subagent/types.ts +6 -2
- package/src/subagent/validate-allowlists.ts +65 -0
- package/src/telemetry/watchdog-direct-emit.test.ts +109 -0
- package/src/telemetry/watchdog-direct-emit.ts +89 -0
- package/src/tools/acp/list-agents.test.ts +0 -6
- package/src/tools/background-tool-registry.ts +61 -0
- package/src/tools/document/document-comment-tool.test.ts +4 -0
- package/src/tools/host-terminal/host-shell.test.ts +397 -0
- package/src/tools/host-terminal/host-shell.ts +203 -14
- package/src/tools/skills/find-similar-skills.test.ts +152 -1
- package/src/tools/skills/find-similar-skills.ts +30 -4
- package/src/tools/skills/load.ts +36 -0
- package/src/tools/skills/scaffold-managed.ts +66 -34
- package/src/tools/skills/skill-script-runner.ts +17 -0
- package/src/tools/skills/skill-tool-factory.ts +5 -1
- package/src/tools/terminal/safe-env.ts +3 -0
- package/src/tools/terminal/shell.test.ts +177 -0
- package/src/tools/terminal/shell.ts +98 -4
- package/src/tools/tool-approval-handler.ts +106 -29
- package/{node_modules/@vellumai/skill-host-contracts/src → src/tools}/tool-types.ts +16 -17
- package/src/tools/types.ts +29 -17
- package/src/tools/ui-surface/definitions.ts +3 -1
- package/src/tts/__tests__/provider-adapters.test.ts +37 -0
- package/src/tts/__tests__/provider-catalog.test.ts +21 -0
- package/src/tts/provider-catalog.ts +40 -9
- package/src/tts/providers/fish-audio-provider.ts +19 -10
- package/src/tts/types.ts +3 -4
- package/src/util/__tests__/process-tree.test.ts +10 -2
- package/src/util/__tests__/text-spacing.test.ts +53 -0
- package/src/util/cgroup-memory.ts +142 -0
- package/src/util/image-conversion.ts +281 -0
- package/src/util/phone.ts +1 -8
- package/src/util/platform.ts +33 -0
- package/src/util/process-tree.ts +10 -2
- package/src/util/text-spacing.ts +53 -0
- package/src/util/worker-process.ts +271 -0
- package/src/workflows/journal-store.ts +16 -1
- package/src/workflows/library.test.ts +35 -20
- package/src/workflows/library.ts +105 -66
- package/src/workspace/git-service.ts +1 -0
- package/src/workspace/migrations/011-backfill-installation-id.ts +83 -31
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +41 -22
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +1 -1
- package/src/workspace/migrations/118-seed-now-md.ts +64 -0
- package/src/workspace/migrations/119-strip-persisted-memory-v3-tuning-defaults.ts +169 -0
- package/src/workspace/migrations/120-revise-onboarding-threads.ts +47 -0
- package/src/workspace/migrations/121-seed-default-user-guardrails.ts +82 -0
- package/src/workspace/migrations/122-relocate-default-user-boundary.ts +111 -0
- package/src/workspace/migrations/123-swap-quality-profile-to-fable.ts +85 -0
- package/src/workspace/migrations/__tests__/119-strip-persisted-memory-v3-tuning-defaults.test.ts +181 -0
- package/src/workspace/migrations/registry.ts +12 -0
- package/drizzle/0000_dizzy_maggott.sql +0 -301
- package/drizzle/meta/0000_snapshot.json +0 -1933
- package/drizzle/meta/_journal.json +0 -13
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +0 -887
- package/node_modules/@vellumai/skill-host-contracts/bun.lock +0 -24
- package/node_modules/@vellumai/skill-host-contracts/package.json +0 -18
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -97
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +0 -1349
- package/node_modules/@vellumai/skill-host-contracts/src/index.ts +0 -6
- package/node_modules/@vellumai/skill-host-contracts/src/runtime-mode.ts +0 -11
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +0 -32
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +0 -333
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.json +0 -20
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.test.json +0 -12
- package/src/__tests__/invite-redemption-service.test.ts +0 -1180
- package/src/__tests__/invite-service-ipc.test.ts +0 -350
- package/src/__tests__/job-handler-registry-guard.test.ts +0 -125
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +0 -203
- package/src/__tests__/relay-server.test.ts +0 -6153
- package/src/__tests__/telephony-stt-routing.test.ts +0 -329
- package/src/__tests__/voice-invite-redemption.test.ts +0 -702
- package/src/calls/relay-server.ts +0 -2463
- package/src/calls/telephony-stt-routing.ts +0 -145
- package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +0 -128
- package/src/daemon/__tests__/daemon-skill-host.test.ts +0 -273
- package/src/daemon/daemon-skill-host.ts +0 -262
- package/src/daemon/message-types/meet.ts +0 -143
- package/src/daemon/shutdown-registry.ts +0 -40
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -253
- package/src/ipc/__tests__/skill-server.test.ts +0 -182
- package/src/ipc/skill-ipc-types.ts +0 -54
- package/src/ipc/skill-routes/__tests__/config.test.ts +0 -146
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +0 -448
- package/src/ipc/skill-routes/__tests__/identity.test.ts +0 -62
- package/src/ipc/skill-routes/__tests__/log.test.ts +0 -133
- package/src/ipc/skill-routes/__tests__/memory.test.ts +0 -203
- package/src/ipc/skill-routes/__tests__/platform.test.ts +0 -111
- package/src/ipc/skill-routes/__tests__/providers.test.ts +0 -265
- package/src/ipc/skill-routes/__tests__/registries.test.ts +0 -400
- package/src/ipc/skill-routes/config.ts +0 -47
- package/src/ipc/skill-routes/events.ts +0 -147
- package/src/ipc/skill-routes/identity.ts +0 -21
- package/src/ipc/skill-routes/index.ts +0 -37
- package/src/ipc/skill-routes/log.ts +0 -40
- package/src/ipc/skill-routes/memory.ts +0 -92
- package/src/ipc/skill-routes/platform.ts +0 -39
- package/src/ipc/skill-routes/providers.ts +0 -162
- package/src/ipc/skill-routes/registries.ts +0 -338
- package/src/ipc/skill-server.ts +0 -831
- package/src/ipc/skill-socket-path.ts +0 -20
- package/src/jobs/register-job-handlers.ts +0 -74
- package/src/persistence/invite-store.ts +0 -481
- package/src/plugins/job-handler-registry.ts +0 -94
- package/src/providers/cache-control.ts +0 -26
- package/src/runtime/__tests__/runtime-mode.test.ts +0 -62
- package/src/runtime/invite-redemption-service.ts +0 -828
- package/src/runtime/invite-redemption-templates.ts +0 -46
- package/src/runtime/runtime-mode.ts +0 -40
- package/src/runtime/slack-dm-text-delivery.ts +0 -177
- package/src/util/voice-code.ts +0 -31
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import { join } from "node:path";
|
|
2
|
-
|
|
3
1
|
import { config as dotenvConfig } from "dotenv";
|
|
4
2
|
|
|
5
|
-
import { setPointerMessageProcessor } from "../calls/call-pointer-messages.js";
|
|
6
3
|
import { reconcileCallsOnStartup } from "../calls/call-recovery.js";
|
|
7
|
-
import {
|
|
8
|
-
import { TwilioConversationRelayProvider } from "../calls/twilio-provider.js";
|
|
9
|
-
import { setVoiceBridgeDeps } from "../calls/voice-session-bridge.js";
|
|
4
|
+
import { TwilioVoiceProvider } from "../calls/twilio-provider.js";
|
|
10
5
|
import { initFeatureFlagOverrides } from "../config/assistant-feature-flags.js";
|
|
11
6
|
import { setIngressPublicBaseUrl, validateEnv } from "../config/env.js";
|
|
12
7
|
import { loadConfig, mergeDefaultWorkspaceConfig } from "../config/loader.js";
|
|
@@ -20,42 +15,19 @@ import { backfillRelationshipStateIfMissing } from "../home/relationship-state-w
|
|
|
20
15
|
import { closeSentry, initSentry, setSentryDeviceId } from "../instrument.js";
|
|
21
16
|
import { startCliIpcServer } from "../ipc/assistant-server.js";
|
|
22
17
|
import { startGatewayFlagListener } from "../ipc/gateway-flag-listener.js";
|
|
23
|
-
import {
|
|
24
|
-
import { registerMemoryJobHandlers } from "../jobs/register-job-handlers.js";
|
|
18
|
+
import { startMonitoring } from "../monitoring/control.js";
|
|
25
19
|
import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
|
|
26
20
|
import { seedOAuthProviders } from "../oauth/seed-providers.js";
|
|
27
|
-
import {
|
|
28
|
-
getAttachmentsByIds,
|
|
29
|
-
getSourcePathsForAttachments,
|
|
30
|
-
} from "../persistence/attachments-store.js";
|
|
31
|
-
import {
|
|
32
|
-
clearStaleProcessingFlags,
|
|
33
|
-
deleteMessageById,
|
|
34
|
-
getMessages,
|
|
35
|
-
} from "../persistence/conversation-crud.js";
|
|
21
|
+
import { clearStaleProcessingFlags } from "../persistence/conversation-crud.js";
|
|
36
22
|
import { getDb } from "../persistence/db-connection.js";
|
|
37
23
|
import { initializeDb } from "../persistence/db-init.js";
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
|
|
41
|
-
resolveQdrantUrl,
|
|
42
|
-
} from "../persistence/embeddings/qdrant-client.js";
|
|
43
|
-
import { createQdrantManager } from "../persistence/embeddings/qdrant-manager.js";
|
|
44
|
-
import {
|
|
45
|
-
enqueueMemoryJob,
|
|
46
|
-
isMemoryEnabled,
|
|
47
|
-
} from "../persistence/jobs-store.js";
|
|
48
|
-
import { startMemoryJobsWorker } from "../persistence/jobs-worker.js";
|
|
49
|
-
import {
|
|
50
|
-
startConsentRefresh,
|
|
51
|
-
stopConsentRefresh,
|
|
52
|
-
} from "../platform/consent-cache.js";
|
|
24
|
+
import { startEmbeddingRuntimeManager } from "../persistence/embeddings/embedding-runtime-manager.js";
|
|
25
|
+
import { maybeEnqueueLexicalBackfillOnUpgrade } from "../persistence/job-handlers/message-lexical-backfill.js";
|
|
26
|
+
import { startConsentRefresh } from "../platform/consent-cache.js";
|
|
53
27
|
import { syncWorkspaceIdentityToPlatform } from "../platform/sync-identity.js";
|
|
54
|
-
import { sweepConceptPageFrontmatter } from "../plugins/defaults/memory/v2/frontmatter-sweep.js";
|
|
55
28
|
import { ensurePromptFiles } from "../prompts/system-prompt.js";
|
|
56
29
|
import { runProviderConnectionsBackfill } from "../providers/inference/backfill.js";
|
|
57
30
|
import { initializeProviders } from "../providers/registry.js";
|
|
58
|
-
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
59
31
|
import {
|
|
60
32
|
initAuthSigningKey,
|
|
61
33
|
resolveSigningKey,
|
|
@@ -66,7 +38,7 @@ import { recoverInterruptedImport } from "../runtime/migrations/vbundle-streamin
|
|
|
66
38
|
import { publishConfigChanged } from "../runtime/sync/resource-sync-events.js";
|
|
67
39
|
import { recoverStaleSchedules } from "../schedule/schedule-recovery.js";
|
|
68
40
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
69
|
-
import {
|
|
41
|
+
import { getSubagentManager } from "../subagent/index.js";
|
|
70
42
|
import { startUsageTelemetryReporter } from "../telemetry/usage-telemetry-reporter.js";
|
|
71
43
|
import { syncFlagGatedTools } from "../tools/registry.js";
|
|
72
44
|
import { registerBuiltinTtsProviders } from "../tts/providers/register-builtins.js";
|
|
@@ -90,7 +62,6 @@ import { runWorkspaceMigrations } from "../workspace/migrations/runner.js";
|
|
|
90
62
|
import { startAppSourceWatcher } from "./app-source-watcher.js";
|
|
91
63
|
import { startConfigWatcher } from "./config-watcher.js";
|
|
92
64
|
import { startConversationEvictor } from "./conversation-evictor.js";
|
|
93
|
-
import { getOrCreateConversation } from "./conversation-store.js";
|
|
94
65
|
import { writePid } from "./daemon-control.js";
|
|
95
66
|
import { setDbReady, setStartupComplete } from "./daemon-readiness.js";
|
|
96
67
|
import {
|
|
@@ -98,18 +69,11 @@ import {
|
|
|
98
69
|
startDiskPressureGuard,
|
|
99
70
|
stopDiskPressureGuard,
|
|
100
71
|
} from "./disk-pressure-guard.js";
|
|
101
|
-
import { reconcileEmbeddingIdentity } from "./embedding-reconcile.js";
|
|
102
72
|
import { startEventLoopWatchdog } from "./event-loop-watchdog.js";
|
|
103
73
|
import { initializePlugins } from "./external-plugins-bootstrap.js";
|
|
104
74
|
import { backfillSlackInjectionTemplates } from "./handlers/config-slack-channel.js";
|
|
105
75
|
import { installAssistantSymlink } from "./install-symlink.js";
|
|
106
|
-
import {
|
|
107
|
-
maybeRebuildMemoryV2Concepts,
|
|
108
|
-
rebuildBm25CorpusStatsAndReseedSkills,
|
|
109
|
-
} from "./memory-v2-startup.js";
|
|
110
76
|
import { startOrphanReaper } from "./orphan-reaper.js";
|
|
111
|
-
import { elevatePointerConversationToGuardian } from "./pointer-conversation-trust.js";
|
|
112
|
-
import { processMessage } from "./process-message.js";
|
|
113
77
|
import { runProfilerSweep } from "./profiler-run-store.js";
|
|
114
78
|
import {
|
|
115
79
|
initializeProvidersAndTools,
|
|
@@ -117,8 +81,6 @@ import {
|
|
|
117
81
|
registerWatcherProviders,
|
|
118
82
|
} from "./providers-setup.js";
|
|
119
83
|
import { installShutdownHandlers } from "./shutdown-handlers.js";
|
|
120
|
-
import { registerShutdownHook } from "./shutdown-registry.js";
|
|
121
|
-
import { refreshSkillCapabilityMemories } from "./skill-memory-refresh.js";
|
|
122
84
|
import { broadcastDaemonStatus } from "./status.js";
|
|
123
85
|
|
|
124
86
|
const log = getLogger("lifecycle");
|
|
@@ -149,7 +111,9 @@ function runDeferredDiskPressureStartupSample(): void {
|
|
|
149
111
|
export function startDiskPressureGuardForLifecycle(): void {
|
|
150
112
|
try {
|
|
151
113
|
const startedStatus = startDiskPressureGuard();
|
|
152
|
-
if (!startedStatus.enabled)
|
|
114
|
+
if (!startedStatus.enabled) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
153
117
|
if (!diskPressureStartupSampleTimer) {
|
|
154
118
|
diskPressureStartupSampleTimer = setTimeout(
|
|
155
119
|
runDeferredDiskPressureStartupSample,
|
|
@@ -189,6 +153,13 @@ export async function runDaemon(): Promise<void> {
|
|
|
189
153
|
// legacy local opt-out hard-disable via closeSentry().
|
|
190
154
|
initSentry();
|
|
191
155
|
|
|
156
|
+
// Signal handlers install before any blocking startup work — a boot that
|
|
157
|
+
// inherits a large WAL can spend minutes inside `initializeDb()`, and
|
|
158
|
+
// without handlers a SIGTERM in that window is the default hard kill.
|
|
159
|
+
// Handlers run a minimal exit path until `setStartupComplete()` below
|
|
160
|
+
// switches them to the full graceful shutdown.
|
|
161
|
+
installShutdownHandlers();
|
|
162
|
+
|
|
192
163
|
ensureDataDir();
|
|
193
164
|
|
|
194
165
|
// Recover from any streaming `.vbundle` import that was interrupted by a
|
|
@@ -451,7 +422,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
451
422
|
}
|
|
452
423
|
|
|
453
424
|
try {
|
|
454
|
-
const twilioProvider = new
|
|
425
|
+
const twilioProvider = new TwilioVoiceProvider();
|
|
455
426
|
await reconcileCallsOnStartup(twilioProvider, log);
|
|
456
427
|
} catch (err) {
|
|
457
428
|
log.warn({ err }, "Call recovery failed — continuing startup");
|
|
@@ -588,7 +559,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
588
559
|
// platform. Fire-and-forget: startConsentRefresh() runs an immediate
|
|
589
560
|
// non-blocking refresh, so the startup hot path is never blocked.
|
|
590
561
|
startConsentRefresh();
|
|
591
|
-
registerShutdownHook("consent-cache", () => stopConsentRefresh());
|
|
592
562
|
|
|
593
563
|
// Bring up the daemon's CES connection (process + handshake + reconnect
|
|
594
564
|
// wiring). Blocks up to a 20s timeout so credential reads route through CES
|
|
@@ -601,7 +571,9 @@ export async function runDaemon(): Promise<void> {
|
|
|
601
571
|
// first-party defaults, load user plugins, and run every plugin's
|
|
602
572
|
// `init()`. Ordering is load-bearing (defaults register ahead of user
|
|
603
573
|
// plugins so they compose innermost) and plugin failures are contained so
|
|
604
|
-
// they can't block daemon startup.
|
|
574
|
+
// they can't block daemon startup. The memory plugin's `init` hook registers
|
|
575
|
+
// the job handlers (its own plus the host's non-plugin domain handlers) and
|
|
576
|
+
// starts the jobs worker here.
|
|
605
577
|
await initializePlugins();
|
|
606
578
|
|
|
607
579
|
// Initialize providers before Qdrant so HTTP routes can begin accepting
|
|
@@ -628,11 +600,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
628
600
|
// against the shared database as an unmanageable duplicate.
|
|
629
601
|
await startCliIpcServer();
|
|
630
602
|
|
|
631
|
-
// Start the skill IPC server so first-party skill processes can connect for
|
|
632
|
-
// host capabilities. The meet-host supervisor reads the live server from the
|
|
633
|
-
// skill-server singleton at dispatch time.
|
|
634
|
-
await startSkillIpcServer();
|
|
635
|
-
|
|
636
603
|
// Warm the gateway guardian-delivery cache so the SSE eager-subscribe path
|
|
637
604
|
// (sync, IO-free) resolves the local actor principal on the FIRST client
|
|
638
605
|
// registration. Without this, a cold cache regresses host-proxy same-user
|
|
@@ -647,185 +614,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
647
614
|
startOrphanReaper();
|
|
648
615
|
startEventLoopWatchdog();
|
|
649
616
|
|
|
650
|
-
// Initialize Qdrant vector store and memory worker in the background so the
|
|
651
|
-
// RuntimeHttpServer can start accepting requests without waiting for Qdrant.
|
|
652
|
-
async function initializeQdrantAndMemory(): Promise<void> {
|
|
653
|
-
const qdrantUrl = resolveQdrantUrl(config);
|
|
654
|
-
log.info({ qdrantUrl }, "Daemon startup: initializing Qdrant");
|
|
655
|
-
const manager = createQdrantManager({ url: qdrantUrl });
|
|
656
|
-
const QDRANT_START_MAX_ATTEMPTS = 3;
|
|
657
|
-
let qdrantStarted = false;
|
|
658
|
-
for (let attempt = 1; attempt <= QDRANT_START_MAX_ATTEMPTS; attempt++) {
|
|
659
|
-
try {
|
|
660
|
-
await manager.start();
|
|
661
|
-
qdrantStarted = true;
|
|
662
|
-
break;
|
|
663
|
-
} catch (err) {
|
|
664
|
-
if (attempt < QDRANT_START_MAX_ATTEMPTS) {
|
|
665
|
-
const backoffMs = attempt * 5_000; // 5s, 10s
|
|
666
|
-
log.warn(
|
|
667
|
-
{
|
|
668
|
-
err,
|
|
669
|
-
attempt,
|
|
670
|
-
maxAttempts: QDRANT_START_MAX_ATTEMPTS,
|
|
671
|
-
backoffMs,
|
|
672
|
-
},
|
|
673
|
-
"Qdrant startup failed, retrying",
|
|
674
|
-
);
|
|
675
|
-
await Bun.sleep(backoffMs);
|
|
676
|
-
} else {
|
|
677
|
-
log.warn(
|
|
678
|
-
{ err },
|
|
679
|
-
"Qdrant failed to start after all attempts — memory features will be unavailable",
|
|
680
|
-
);
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
if (qdrantStarted) {
|
|
686
|
-
// Skip the v1 Qdrant collection lifecycle when memory v2 is active —
|
|
687
|
-
// the v1 collection has no writers (handleRemember returns early) or
|
|
688
|
-
// readers (graph search is bypassed) under v2, so ensuring/migrating
|
|
689
|
-
// it just maintains a dead-on-arrival collection. Existing on-disk
|
|
690
|
-
// collections are left intact so flipping v2 off restores v1 cleanly.
|
|
691
|
-
if (!config.memory.v2.enabled) {
|
|
692
|
-
try {
|
|
693
|
-
const embeddingSelection = await selectEmbeddingBackend(config);
|
|
694
|
-
// Sentinel only encodes the dense provider+model identity; sparse
|
|
695
|
-
// encoder changes never require collection recreation, so they
|
|
696
|
-
// intentionally do not contribute to the v1 collection identity.
|
|
697
|
-
const embeddingModel = embeddingSelection.backend
|
|
698
|
-
? `${embeddingSelection.backend.provider}:${embeddingSelection.backend.model}`
|
|
699
|
-
: undefined;
|
|
700
|
-
const qdrantClient = initQdrantClient({
|
|
701
|
-
url: qdrantUrl,
|
|
702
|
-
collection: config.memory.qdrant.collection,
|
|
703
|
-
vectorSize: config.memory.qdrant.vectorSize,
|
|
704
|
-
onDisk: config.memory.qdrant.onDisk,
|
|
705
|
-
quantization: config.memory.qdrant.quantization,
|
|
706
|
-
embeddingModel,
|
|
707
|
-
});
|
|
708
|
-
|
|
709
|
-
// Eagerly ensure the collection exists so we detect migrations
|
|
710
|
-
// (unnamed→named vectors, dimension/model changes) at startup.
|
|
711
|
-
// If a destructive migration occurred, enqueue a rebuild_index job
|
|
712
|
-
// to re-embed all memory items from the SQLite cache.
|
|
713
|
-
const { migrated } = await qdrantClient.ensureCollection();
|
|
714
|
-
if (migrated && isMemoryEnabled()) {
|
|
715
|
-
enqueueMemoryJob("rebuild_index", {});
|
|
716
|
-
log.info(
|
|
717
|
-
"Qdrant collection was migrated — enqueued rebuild_index job",
|
|
718
|
-
);
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
log.info("Qdrant vector store initialized");
|
|
722
|
-
} catch (err) {
|
|
723
|
-
log.warn(
|
|
724
|
-
{ err },
|
|
725
|
-
"Qdrant client initialization failed — memory features will be degraded",
|
|
726
|
-
);
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
// Reconcile the committed embedding-collection dimension against a live
|
|
731
|
-
// backend probe (confirm-before-destroy) before the v2 rebuild and the
|
|
732
|
-
// worker drain, so `memory.qdrant.vectorSize` is settled first. Its own
|
|
733
|
-
// try/catch keeps an unreachable backend or reconcile failure from
|
|
734
|
-
// blocking startup.
|
|
735
|
-
try {
|
|
736
|
-
await reconcileEmbeddingIdentity(config);
|
|
737
|
-
} catch (err) {
|
|
738
|
-
log.warn(
|
|
739
|
-
{ err },
|
|
740
|
-
"Embedding-identity reconcile threw — continuing startup",
|
|
741
|
-
);
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
// Detect schema drift on the v2 concept-page collection (e.g.
|
|
745
|
-
// pre-#29823 collections lacking summary_dense / summary_sparse) and
|
|
746
|
-
// recreate + enqueue a reembed when needed. Awaited inline so the
|
|
747
|
-
// reembed enqueue happens before the memory worker drains its first
|
|
748
|
-
// batch; the call's own try/catch keeps any v2-side failure from
|
|
749
|
-
// blocking the v1 PKB reconcile or BM25 build below.
|
|
750
|
-
try {
|
|
751
|
-
await maybeRebuildMemoryV2Concepts(config);
|
|
752
|
-
} catch (err) {
|
|
753
|
-
log.warn(
|
|
754
|
-
{ err },
|
|
755
|
-
"Memory v2 collection schema check threw — continuing startup",
|
|
756
|
-
);
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
// Reconcile the PKB Qdrant index against the on-disk tree. Gated on
|
|
760
|
-
// !v2 because PKB is the v1 storage layer; under v2 the v1 collection
|
|
761
|
-
// is not initialized, so calling `getQdrantClient()` here would throw.
|
|
762
|
-
// Fire-and-forget so enqueued re-index jobs drain in the background
|
|
763
|
-
// and first-turn latency stays unaffected.
|
|
764
|
-
if (!config.memory.v2.enabled) {
|
|
765
|
-
void (async () => {
|
|
766
|
-
try {
|
|
767
|
-
const { reconcilePkbIndex } =
|
|
768
|
-
await import("../plugins/defaults/memory/pkb/pkb-reconcile.js");
|
|
769
|
-
const { PKB_WORKSPACE_SCOPE } =
|
|
770
|
-
await import("../plugins/defaults/memory/pkb/types.js");
|
|
771
|
-
const pkbRoot = join(getWorkspaceDir(), "pkb");
|
|
772
|
-
await reconcilePkbIndex(pkbRoot, PKB_WORKSPACE_SCOPE);
|
|
773
|
-
} catch (err) {
|
|
774
|
-
log.warn(
|
|
775
|
-
{ err },
|
|
776
|
-
"PKB index reconciliation failed — continuing startup",
|
|
777
|
-
);
|
|
778
|
-
}
|
|
779
|
-
})();
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
void rebuildBm25CorpusStatsAndReseedSkills(config);
|
|
783
|
-
|
|
784
|
-
try {
|
|
785
|
-
await sweepConceptPageFrontmatter(config, getWorkspaceDir());
|
|
786
|
-
} catch (err) {
|
|
787
|
-
log.warn(
|
|
788
|
-
{ err },
|
|
789
|
-
"Concept page frontmatter sweep threw — continuing startup",
|
|
790
|
-
);
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
// `startMemoryJobsWorker` starts the in-process supervisor (which owns
|
|
795
|
-
// the synchronous runner and stands down when an out-of-process worker is
|
|
796
|
-
// live) and spawns the out-of-process worker at boot when
|
|
797
|
-
// `memory.worker.enabled` is set. Shutdown stops whichever worker is
|
|
798
|
-
// actually running — see shutdown-handlers.ts.
|
|
799
|
-
log.info("Daemon startup: starting memory worker");
|
|
800
|
-
registerMemoryJobHandlers();
|
|
801
|
-
startMemoryJobsWorker();
|
|
802
|
-
|
|
803
|
-
// Seed capability graph nodes (new memory graph system)
|
|
804
|
-
try {
|
|
805
|
-
const { seedCliGraphNodes } =
|
|
806
|
-
await import("../plugins/defaults/memory/graph/capability-seed.js");
|
|
807
|
-
refreshSkillCapabilityMemories(config);
|
|
808
|
-
await seedCliGraphNodes();
|
|
809
|
-
} catch (err) {
|
|
810
|
-
log.warn({ err }, "Graph capability seeding failed — continuing");
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
// Auto-bootstrap: if the graph has no non-procedural nodes but historical
|
|
814
|
-
// segments exist, enqueue a one-time graph_bootstrap job to populate the
|
|
815
|
-
// graph from conversation history and journal files.
|
|
816
|
-
try {
|
|
817
|
-
const { maybeEnqueueGraphBootstrap, cleanupStaleItemVectors } =
|
|
818
|
-
await import("../plugins/defaults/memory/graph/bootstrap.js");
|
|
819
|
-
maybeEnqueueGraphBootstrap();
|
|
820
|
-
// Fire-and-forget: clean up orphaned Qdrant vectors from dropped memory_items table
|
|
821
|
-
void cleanupStaleItemVectors().catch((err) =>
|
|
822
|
-
log.warn({ err }, "Stale item vector cleanup failed — continuing"),
|
|
823
|
-
);
|
|
824
|
-
} catch (err) {
|
|
825
|
-
log.warn({ err }, "Graph bootstrap check failed — continuing");
|
|
826
|
-
}
|
|
827
|
-
}
|
|
828
|
-
|
|
829
617
|
registerWatcherProviders();
|
|
830
618
|
registerMessagingProviders();
|
|
831
619
|
|
|
@@ -855,210 +643,41 @@ export async function runDaemon(): Promise<void> {
|
|
|
855
643
|
);
|
|
856
644
|
}
|
|
857
645
|
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
? {
|
|
864
|
-
...(options.trustClass
|
|
865
|
-
? {
|
|
866
|
-
trustContext: {
|
|
867
|
-
sourceChannel: "vellum",
|
|
868
|
-
trustClass: options.trustClass,
|
|
869
|
-
},
|
|
870
|
-
}
|
|
871
|
-
: {}),
|
|
872
|
-
...(options.taskRunId ? { taskRunId: options.taskRunId } : {}),
|
|
873
|
-
...(options.overrideProfile
|
|
874
|
-
? { overrideProfile: options.overrideProfile }
|
|
875
|
-
: {}),
|
|
876
|
-
...(options.cronRunId ? { cronRunId: options.cronRunId } : {}),
|
|
877
|
-
}
|
|
878
|
-
: undefined,
|
|
879
|
-
);
|
|
880
|
-
});
|
|
881
|
-
|
|
882
|
-
// Fire-and-forget: Qdrant init and memory worker startup run concurrently
|
|
883
|
-
// with the rest of daemon boot. Must run AFTER `startRuntimeHttpServer()`
|
|
884
|
-
// so the analyze-deps singleton (populated inside `buildRouteTable()`) is
|
|
885
|
-
// available before the memory worker can claim leftover
|
|
886
|
-
// `conversation_analyze` jobs from a prior run. See the daemon-startup
|
|
887
|
-
// ordering test in `assistant/src/daemon/__tests__/`.
|
|
888
|
-
void initializeQdrantAndMemory().catch((err) =>
|
|
889
|
-
log.warn({ err }, "Background Qdrant init failed"),
|
|
890
|
-
);
|
|
891
|
-
|
|
892
|
-
// Inject voice bridge deps so the relay pipeline can resolve attachments
|
|
893
|
-
// once a call lands. Module-level state, so available even when the HTTP
|
|
894
|
-
// server failed to bind.
|
|
895
|
-
setVoiceBridgeDeps({
|
|
896
|
-
resolveAttachments: (attachmentIds) => {
|
|
897
|
-
const resolved = getAttachmentsByIds(attachmentIds, {
|
|
898
|
-
hydrateFileData: true,
|
|
899
|
-
});
|
|
900
|
-
const sourcePaths = getSourcePathsForAttachments(attachmentIds);
|
|
901
|
-
return resolved.map((a) => ({
|
|
902
|
-
id: a.id,
|
|
903
|
-
filename: a.originalFilename,
|
|
904
|
-
mimeType: a.mimeType,
|
|
905
|
-
data: a.dataBase64,
|
|
906
|
-
...(sourcePaths.has(a.id) ? { filePath: sourcePaths.get(a.id) } : {}),
|
|
907
|
-
}));
|
|
908
|
-
},
|
|
909
|
-
});
|
|
646
|
+
// Rehydrate subagent records persisted by a prior run: load terminal
|
|
647
|
+
// subagents so `subagent_read`/`getState` keep working post-restart, and mark
|
|
648
|
+
// any that were still in flight when the process died as `interrupted` (we do
|
|
649
|
+
// not auto-resume). Mirrors the workflow-run reconciliation above; never
|
|
650
|
+
// blocks startup, and runs before the scheduler so no new spawn races it.
|
|
910
651
|
try {
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
// (evicted) load doesn't filter guardian history to empty and ship a
|
|
919
|
-
// cache-missing turn. `restoreTrustContext` undoes the elevation after
|
|
920
|
-
// the turn. See pointer-conversation-trust.ts for the full rationale.
|
|
921
|
-
const restoreTrustContext =
|
|
922
|
-
await elevatePointerConversationToGuardian(conversation);
|
|
923
|
-
|
|
924
|
-
// Constrain pointer generation to a tool-disabled path so call-
|
|
925
|
-
// status events cannot trigger unintended side-effect tools.
|
|
926
|
-
// Incrementing toolsDisabledDepth causes the resolveTools callback
|
|
927
|
-
// to return an empty tool list, preventing the LLM from seeing or
|
|
928
|
-
// invoking any tools during the pointer agent loop.
|
|
929
|
-
//
|
|
930
|
-
// A depth counter (rather than a boolean) ensures that overlapping
|
|
931
|
-
// pointer requests on the same conversation don't clear each other's
|
|
932
|
-
// constraint — each caller increments on entry and decrements in
|
|
933
|
-
// its own finally block.
|
|
934
|
-
conversation.toolsDisabledDepth++;
|
|
935
|
-
try {
|
|
936
|
-
const { id: messageId } = await conversation.persistUserMessage({
|
|
937
|
-
content: instruction,
|
|
938
|
-
metadata: { pointerInstruction: true },
|
|
939
|
-
displayContent: "[Call status event]",
|
|
940
|
-
});
|
|
941
|
-
|
|
942
|
-
// Helper: roll back persisted messages on failure, then reload
|
|
943
|
-
// in-memory history from the (now cleaned) DB. Reloading avoids
|
|
944
|
-
// stale-index issues when context compaction reassigns the
|
|
945
|
-
// messages array during runAgentLoop.
|
|
946
|
-
const rollback = async (extraMessageIds?: string[]) => {
|
|
947
|
-
try {
|
|
948
|
-
deleteMessageById(messageId);
|
|
949
|
-
} catch {
|
|
950
|
-
/* best effort */
|
|
951
|
-
}
|
|
952
|
-
for (const id of extraMessageIds ?? []) {
|
|
953
|
-
try {
|
|
954
|
-
deleteMessageById(id);
|
|
955
|
-
} catch {
|
|
956
|
-
/* best effort */
|
|
957
|
-
}
|
|
958
|
-
}
|
|
959
|
-
try {
|
|
960
|
-
await conversation.loadFromDb();
|
|
961
|
-
} catch {
|
|
962
|
-
/* best effort */
|
|
963
|
-
}
|
|
964
|
-
};
|
|
965
|
-
|
|
966
|
-
// Snapshot message IDs before the agent loop so we can diff
|
|
967
|
-
// afterwards to find exactly which messages this run created,
|
|
968
|
-
// avoiding positional heuristics that break under concurrency.
|
|
969
|
-
//
|
|
970
|
-
// Caveat: the diff captures *all* new messages in the
|
|
971
|
-
// conversation during the loop window, not just those from
|
|
972
|
-
// this specific agent loop. If a concurrent pointer event
|
|
973
|
-
// falls back to a deterministic addMessage() while our loop
|
|
974
|
-
// is in flight, that message lands in our diff. The race
|
|
975
|
-
// requires two pointer events for the same conversation
|
|
976
|
-
// within the agent loop window *and* this run must fail or
|
|
977
|
-
// fail fact-check — narrow enough to accept. A future
|
|
978
|
-
// improvement could tag messages with a per-run correlation
|
|
979
|
-
// ID so rollback only targets its own output.
|
|
980
|
-
const preRunMessageIds = new Set(
|
|
981
|
-
getMessages(conversationId).map((m) => m.id),
|
|
982
|
-
);
|
|
983
|
-
|
|
984
|
-
let agentLoopError: string | undefined;
|
|
985
|
-
let generatedText = "";
|
|
986
|
-
await conversation.runAgentLoop(instruction, messageId, {
|
|
987
|
-
onEvent: (msg) => {
|
|
988
|
-
if (
|
|
989
|
-
"type" in msg &&
|
|
990
|
-
msg.type === "assistant_text_delta" &&
|
|
991
|
-
"text" in msg
|
|
992
|
-
) {
|
|
993
|
-
generatedText += (msg as { text: string }).text;
|
|
994
|
-
}
|
|
995
|
-
if (
|
|
996
|
-
"type" in msg &&
|
|
997
|
-
(msg.type === "error" || msg.type === "conversation_error")
|
|
998
|
-
) {
|
|
999
|
-
agentLoopError =
|
|
1000
|
-
"message" in msg
|
|
1001
|
-
? (msg as { message: string }).message
|
|
1002
|
-
: "userMessage" in msg
|
|
1003
|
-
? (msg as { userMessage: string }).userMessage
|
|
1004
|
-
: "Agent loop failed";
|
|
1005
|
-
}
|
|
1006
|
-
},
|
|
1007
|
-
});
|
|
1008
|
-
|
|
1009
|
-
// Identify messages created during this run by diffing against
|
|
1010
|
-
// the pre-run snapshot. This captures all messages added to the
|
|
1011
|
-
// conversation during the loop window, which may include messages
|
|
1012
|
-
// from concurrent pointer events (see over-capture caveat above).
|
|
1013
|
-
const postRunMessages = getMessages(conversationId);
|
|
1014
|
-
const createdMessageIds = postRunMessages
|
|
1015
|
-
.filter((m) => !preRunMessageIds.has(m.id) && m.id !== messageId)
|
|
1016
|
-
.map((m) => m.id);
|
|
1017
|
-
|
|
1018
|
-
if (agentLoopError) {
|
|
1019
|
-
await rollback(createdMessageIds);
|
|
1020
|
-
throw new Error(agentLoopError);
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
// Post-generation fact check: verify the assistant's response
|
|
1024
|
-
// includes all required factual details (phone number, duration,
|
|
1025
|
-
// outcome keyword, etc.). If the model omitted or rewrote them,
|
|
1026
|
-
// remove both the instruction and generated messages and throw so
|
|
1027
|
-
// the deterministic fallback fires.
|
|
1028
|
-
//
|
|
1029
|
-
// Validation uses text accumulated from assistant_text_delta
|
|
1030
|
-
// events during the agent loop rather than a DB lookup, avoiding
|
|
1031
|
-
// any positional ambiguity when concurrent pointer events
|
|
1032
|
-
// interleave messages in the conversation.
|
|
1033
|
-
if (requiredFacts && requiredFacts.length > 0) {
|
|
1034
|
-
const missingFacts = requiredFacts.filter(
|
|
1035
|
-
(fact) => !generatedText.includes(fact),
|
|
1036
|
-
);
|
|
1037
|
-
if (missingFacts.length > 0) {
|
|
1038
|
-
log.warn(
|
|
1039
|
-
{ conversationId, missingFacts },
|
|
1040
|
-
"Generated pointer text failed fact validation — falling back to deterministic",
|
|
1041
|
-
);
|
|
1042
|
-
await rollback(createdMessageIds);
|
|
1043
|
-
throw new Error("Generated pointer text failed fact validation");
|
|
1044
|
-
}
|
|
1045
|
-
}
|
|
1046
|
-
} finally {
|
|
1047
|
-
// Restore tool availability so subsequent turns aren't affected.
|
|
1048
|
-
conversation.toolsDisabledDepth--;
|
|
1049
|
-
// Undo the temporary guardian elevation installed above.
|
|
1050
|
-
restoreTrustContext();
|
|
1051
|
-
}
|
|
1052
|
-
},
|
|
1053
|
-
);
|
|
1054
|
-
broadcastDaemonStatus();
|
|
652
|
+
const { rehydrated, interrupted } = getSubagentManager().rehydrateFromDb();
|
|
653
|
+
if (rehydrated > 0) {
|
|
654
|
+
log.info(
|
|
655
|
+
{ rehydrated, interrupted },
|
|
656
|
+
"Rehydrated subagent records from a prior run",
|
|
657
|
+
);
|
|
658
|
+
}
|
|
1055
659
|
} catch (err) {
|
|
1056
|
-
log.
|
|
1057
|
-
{ err },
|
|
1058
|
-
"Failed to wire runtime HTTP server deps, continuing without them",
|
|
1059
|
-
);
|
|
660
|
+
log.error({ err }, "Subagent rehydration failed — continuing startup");
|
|
1060
661
|
}
|
|
1061
662
|
|
|
663
|
+
startScheduler();
|
|
664
|
+
|
|
665
|
+
// One-time, self-healing backfill of existing messages into the Qdrant
|
|
666
|
+
// lexical index (`messages_lexical`) on upgrade, so message-content search
|
|
667
|
+
// never opens onto an empty index. Enqueue-only and checkpoint-guarded — the
|
|
668
|
+
// indexing runs off the event loop via the background job worker; see the
|
|
669
|
+
// function's docstring for the guards and the deliberate exception it makes
|
|
670
|
+
// to the "no work at daemon startup" rule.
|
|
671
|
+
maybeEnqueueLexicalBackfillOnUpgrade();
|
|
672
|
+
|
|
673
|
+
// Spawn the resource monitor as a child of the daemon when enabled, off the
|
|
674
|
+
// main event loop.
|
|
675
|
+
startMonitoring();
|
|
676
|
+
|
|
677
|
+
// The runtime HTTP server is up; broadcast the fresh daemon status so
|
|
678
|
+
// connected clients pick up the transition.
|
|
679
|
+
broadcastDaemonStatus();
|
|
680
|
+
|
|
1062
681
|
// Register built-in TTS providers so the provider abstraction can resolve
|
|
1063
682
|
// them by ID. Must happen before call controllers or routes are created.
|
|
1064
683
|
try {
|
|
@@ -1088,54 +707,22 @@ export async function runDaemon(): Promise<void> {
|
|
|
1088
707
|
writePid(process.pid);
|
|
1089
708
|
|
|
1090
709
|
// Install the `assistant` CLI symlink idempotently on every daemon start.
|
|
1091
|
-
//
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
} catch (err) {
|
|
1095
|
-
log.warn({ err }, "Assistant symlink installation failed — continuing");
|
|
1096
|
-
}
|
|
710
|
+
// Best-effort and self-contained: every step swallows its own errors, so a
|
|
711
|
+
// failure never affects startup.
|
|
712
|
+
installAssistantSymlink();
|
|
1097
713
|
|
|
1098
|
-
|
|
1099
|
-
// If download fails, local embeddings gracefully fall back to cloud backends.
|
|
1100
|
-
void (async () => {
|
|
1101
|
-
try {
|
|
1102
|
-
const { EmbeddingRuntimeManager } =
|
|
1103
|
-
await import("../persistence/embeddings/embedding-runtime-manager.js");
|
|
1104
|
-
const runtimeManager = new EmbeddingRuntimeManager();
|
|
1105
|
-
if (!runtimeManager.isReady()) {
|
|
1106
|
-
log.info("Downloading embedding runtime in background...");
|
|
1107
|
-
await runtimeManager.ensureInstalled();
|
|
1108
|
-
// Reset the sticky local-backend failure flag so auto mode retries
|
|
1109
|
-
// local embeddings without evicting a worker that may already be live.
|
|
1110
|
-
const { resetLocalEmbeddingFailureState } =
|
|
1111
|
-
await import("../persistence/embeddings/embedding-backend.js");
|
|
1112
|
-
resetLocalEmbeddingFailureState();
|
|
1113
|
-
log.info("Embedding runtime download complete");
|
|
1114
|
-
}
|
|
1115
|
-
} catch (err) {
|
|
1116
|
-
log.warn(
|
|
1117
|
-
{ err },
|
|
1118
|
-
"Embedding runtime download failed — local embeddings will use cloud fallback",
|
|
1119
|
-
);
|
|
1120
|
-
}
|
|
1121
|
-
})();
|
|
1122
|
-
|
|
1123
|
-
if (config.auditLog.retentionDays > 0) {
|
|
1124
|
-
void rotateToolInvocations(config.auditLog.retentionDays).catch((err) => {
|
|
1125
|
-
log.warn({ err }, "Audit log rotation failed");
|
|
1126
|
-
});
|
|
1127
|
-
}
|
|
714
|
+
startEmbeddingRuntimeManager();
|
|
1128
715
|
|
|
1129
716
|
startWorkspaceHeartbeatService();
|
|
1130
717
|
|
|
1131
718
|
startHeartbeatService();
|
|
1132
719
|
|
|
1133
|
-
installShutdownHandlers();
|
|
1134
|
-
|
|
1135
720
|
// The critical startup await-chain has completed and the daemon can serve
|
|
1136
721
|
// requests, so latch readiness before logging "Daemon started". Any fatal
|
|
1137
722
|
// failure earlier in startup propagates out of runDaemon before this line,
|
|
1138
|
-
// so the latch is never set on a failed start.
|
|
723
|
+
// so the latch is never set on a failed start. The latch also switches the
|
|
724
|
+
// signal handlers installed at the top of startup from their minimal
|
|
725
|
+
// early-exit mode to the full graceful shutdown.
|
|
1139
726
|
setStartupComplete();
|
|
1140
727
|
|
|
1141
728
|
log.info(
|