@vellumai/assistant 0.10.4-staging.1 → 0.10.4
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 +13 -13
- package/bun.lock +165 -0
- package/docs/architecture/memory.md +26 -0
- package/eslint-rules/cli-no-daemon-internals.js +9 -8
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +18 -0
- package/openapi.yaml +677 -15
- package/package.json +8 -1
- package/scripts/generate-openapi.ts +149 -62
- package/src/__tests__/acp-session.test.ts +2 -2
- package/src/__tests__/activation-early-marking.test.ts +4 -4
- package/src/__tests__/actor-token-service.test.ts +2 -3
- package/src/__tests__/agent-loop-compaction-events.test.ts +1 -0
- package/src/__tests__/agent-loop-compaction-strip.test.ts +2 -0
- package/src/__tests__/agent-loop-exit-reason.test.ts +4 -1
- package/src/__tests__/agent-loop-override-profile.test.ts +2 -2
- package/src/__tests__/agent-loop-regrowth-guard.test.ts +8 -0
- package/src/__tests__/agent-loop.test.ts +1 -0
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +3 -3
- package/src/__tests__/agent-wake-override-profile.test.ts +3 -3
- package/src/__tests__/annotate-activity-metadata.test.ts +4 -4
- package/src/__tests__/annotate-risk-options.test.ts +4 -4
- package/src/__tests__/anthropic-provider.test.ts +53 -2
- package/src/__tests__/app-builder-tool-scripts.test.ts +2 -2
- package/src/__tests__/app-bundler.test.ts +1 -1
- package/src/__tests__/app-conversation-ids-backfill.test.ts +4 -4
- package/src/__tests__/app-conversation-ids.test.ts +1 -1
- package/src/__tests__/app-dir-path-guard.test.ts +2 -2
- package/src/__tests__/app-executors.test.ts +1 -1
- package/src/__tests__/app-git-history.test.ts +2 -2
- package/src/__tests__/app-git-service.test.ts +2 -2
- package/src/__tests__/app-routes-csp.test.ts +2 -2
- package/src/__tests__/app-source-watcher.test.ts +1 -1
- package/src/__tests__/app-store-dir-names.test.ts +1 -1
- package/src/__tests__/approval-cascade.test.ts +7 -7
- package/src/__tests__/approval-interception-trust-gates.test.ts +1 -1
- package/src/__tests__/approval-primitive.test.ts +3 -3
- package/src/__tests__/approval-routes-http.test.ts +2 -2
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-hardening.test.ts +2 -2
- package/src/__tests__/assistant-events-sse-shed.test.ts +2 -2
- package/src/__tests__/attachment-upload-trusted-source.test.ts +4 -2
- package/src/__tests__/attachments-store.test.ts +9 -6
- package/src/__tests__/audit-log-rotation.test.ts +6 -4
- package/src/__tests__/auth-fallback-events-store.test.ts +4 -4
- package/src/__tests__/auto-analysis-end-to-end.test.ts +13 -9
- package/src/__tests__/background-workers-disk-pressure.test.ts +12 -7
- package/src/__tests__/btw-routes.test.ts +4 -5
- package/src/__tests__/build-persisted-content.test.ts +4 -4
- package/src/__tests__/call-controller.test.ts +6 -6
- package/src/__tests__/call-conversation-messages.test.ts +4 -4
- package/src/__tests__/call-domain.test.ts +5 -5
- package/src/__tests__/call-pointer-messages.test.ts +5 -5
- package/src/__tests__/call-recovery.test.ts +3 -3
- package/src/__tests__/call-routes-http.test.ts +3 -3
- package/src/__tests__/call-store.test.ts +3 -3
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +2 -2
- package/src/__tests__/canonical-guardian-store.test.ts +3 -3
- package/src/__tests__/channel-approval-routes.test.ts +9 -7
- package/src/__tests__/channel-delivery-store.test.ts +8 -8
- package/src/__tests__/channel-guardian.test.ts +24 -66
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +2 -2
- package/src/__tests__/channel-retry-sweep.test.ts +49 -4
- package/src/__tests__/clawhub.test.ts +4 -0
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/compaction-ledger-store.test.ts +4 -4
- package/src/__tests__/compaction-trail-store.test.ts +5 -5
- package/src/__tests__/compaction.benchmark.test.ts +5 -5
- package/src/__tests__/compactor-call-site-logging.test.ts +5 -5
- package/src/__tests__/compactor-image-manifest-trust.test.ts +7 -4
- package/src/__tests__/compactor-low-watermark-cut.test.ts +5 -5
- package/src/__tests__/compactor-preserved-tail-count.test.ts +4 -4
- package/src/__tests__/compactor-summary-call-truncation.test.ts +5 -5
- package/src/__tests__/compactor-web-search-strip.test.ts +4 -4
- package/src/__tests__/config-get-vision-flag.test.ts +1 -1
- package/src/__tests__/config-loader-backfill.test.ts +84 -104
- package/src/__tests__/config-set-route.test.ts +5 -2
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +3 -3
- package/src/__tests__/config-watcher-skill-reseed.test.ts +39 -112
- package/src/__tests__/config-watcher.test.ts +54 -31
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +4 -4
- package/src/__tests__/contact-store-interaction-info.test.ts +3 -3
- package/src/__tests__/contact-store-user-file.test.ts +91 -81
- package/src/__tests__/contacts-relay-reads.test.ts +21 -3
- package/src/__tests__/contacts-tools.test.ts +2 -2
- package/src/__tests__/contacts-write.test.ts +2 -2
- package/src/__tests__/context-search-agent-protocol.test.ts +2 -2
- package/src/__tests__/context-search-agent-runner.test.ts +2 -2
- package/src/__tests__/context-search-conversations-source.test.ts +5 -5
- package/src/__tests__/context-search-fanout.test.ts +3 -3
- package/src/__tests__/context-search-memory-source.test.ts +9 -8
- package/src/__tests__/context-search-memory-v2-source.test.ts +9 -8
- package/src/__tests__/context-search-types.test.ts +2 -2
- package/src/__tests__/context-search-workspace-source.test.ts +2 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +5 -5
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -3
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +39 -11
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +6 -6
- package/src/__tests__/conversation-agent-loop.test.ts +51 -13
- package/src/__tests__/conversation-analysis-routes.test.ts +4 -4
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -1
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +7 -7
- package/src/__tests__/conversation-attachments.test.ts +7 -4
- package/src/__tests__/conversation-attention-store.test.ts +4 -4
- package/src/__tests__/conversation-attention-telegram.test.ts +8 -5
- package/src/__tests__/conversation-clear-safety.test.ts +3 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +7 -7
- package/src/__tests__/conversation-crud-inference-profile.test.ts +3 -3
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +25 -25
- package/src/__tests__/conversation-directories-parse.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +5 -5
- package/src/__tests__/conversation-disk-view.test.ts +6 -6
- package/src/__tests__/conversation-evictor.test.ts +32 -7
- package/src/__tests__/conversation-fork-crud.test.ts +24 -21
- package/src/__tests__/conversation-fork-retrospective.test.ts +12 -10
- package/src/__tests__/conversation-fork-route.test.ts +6 -3
- package/src/__tests__/conversation-history-web-search.test.ts +8 -8
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -3
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -3
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +7 -4
- package/src/__tests__/conversation-lifecycle.test.ts +10 -13
- package/src/__tests__/conversation-list-source.test.ts +3 -3
- package/src/__tests__/conversation-load-history-repair.test.ts +4 -4
- package/src/__tests__/conversation-load-history-stripped.test.ts +4 -4
- package/src/__tests__/conversation-pairing.test.ts +4 -4
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +5 -5
- package/src/__tests__/conversation-process-callsite.test.ts +5 -5
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -5
- package/src/__tests__/conversation-queue.test.ts +55 -9
- package/src/__tests__/conversation-routes-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +6 -6
- package/src/__tests__/conversation-routes-slash-commands.test.ts +57 -10
- package/src/__tests__/conversation-runtime-assembly.test.ts +25 -19
- package/src/__tests__/conversation-runtime-workspace.test.ts +8 -1
- package/src/__tests__/conversation-skill-tools.test.ts +155 -2
- package/src/__tests__/conversation-slash-queue.test.ts +6 -6
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -6
- package/src/__tests__/conversation-speed-override.test.ts +7 -7
- package/src/__tests__/conversation-starter-routes.test.ts +2 -2
- package/src/__tests__/conversation-store.test.ts +6 -6
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +2 -2
- package/src/__tests__/conversation-sync-tags.test.ts +7 -4
- package/src/__tests__/conversation-title-service.test.ts +2 -3
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +6 -6
- package/src/__tests__/conversation-wipe.test.ts +6 -4
- package/src/__tests__/conversation-workspace-cache-state.test.ts +9 -9
- package/src/__tests__/conversation-workspace-injection.test.ts +9 -9
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +9 -9
- package/src/__tests__/conversations-import-system-filter.test.ts +5 -5
- package/src/__tests__/credential-security-invariants.test.ts +4 -4
- package/src/__tests__/db-acp-history.test.ts +4 -4
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +4 -4
- package/src/__tests__/db-activation-state.test.ts +3 -3
- package/src/__tests__/db-compaction-events-migration.test.ts +3 -3
- package/src/__tests__/db-connection-isolation.test.ts +1 -1
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +3 -3
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -6
- package/src/__tests__/db-drop-contact-acl-columns-migration.test.ts +159 -0
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +3 -3
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +3 -3
- package/src/__tests__/db-migration-rollback.test.ts +48 -43
- package/src/__tests__/db-proxy-transaction.test.ts +2 -2
- package/src/__tests__/db-rename-inference-profile-snake-case-migration.test.ts +3 -3
- package/src/__tests__/db-schedule-syntax-migration.test.ts +4 -4
- package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +3 -3
- package/src/__tests__/db-slack-external-content-normalization.test.ts +4 -4
- package/src/__tests__/db-test-helpers.ts +7 -0
- package/src/__tests__/delete-propagation.test.ts +4 -4
- package/src/__tests__/deterministic-verification-control-plane.test.ts +3 -3
- package/src/__tests__/device-id.test.ts +38 -1
- package/src/__tests__/dm-backfill.test.ts +3 -3
- package/src/__tests__/dm-persistence.test.ts +5 -5
- package/src/__tests__/document-conversations.test.ts +3 -3
- package/src/__tests__/document-create-dedupe.test.ts +1 -1
- package/src/__tests__/document-find-replace.test.ts +1 -1
- package/src/__tests__/document-tool-security.test.ts +1 -1
- package/src/__tests__/document-update-default-surface.test.ts +1 -1
- package/src/__tests__/drop-capability-card-state-migration.test.ts +3 -5
- package/src/__tests__/edit-propagation.test.ts +6 -6
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
- package/src/__tests__/empty-state-greeting-cache.test.ts +1 -1
- package/src/__tests__/events-client-registration.test.ts +1 -1
- package/src/__tests__/exploration-drift-hook.test.ts +7 -23
- package/src/__tests__/file-write-tool.test.ts +3 -3
- package/src/__tests__/filing-service.test.ts +6 -5
- package/src/__tests__/followup-tools.test.ts +2 -2
- package/src/__tests__/get-skill-detail-audit.test.ts +1 -1
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-action-sweep.test.ts +3 -3
- package/src/__tests__/guardian-binding-drift-heal.test.ts +6 -3
- package/src/__tests__/guardian-card-withdrawal.test.ts +3 -3
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +4 -4
- package/src/__tests__/guardian-dispatch.test.ts +14 -42
- package/src/__tests__/guardian-expiry-notifier.test.ts +4 -4
- package/src/__tests__/guardian-outbound-http.test.ts +3 -4
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +3 -3
- package/src/__tests__/guardian-routing-invariants.test.ts +3 -3
- package/src/__tests__/guardian-routing-state.test.ts +6 -4
- package/src/__tests__/guardian-verification-voice-binding.test.ts +4 -4
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +1 -1
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +3 -3
- package/src/__tests__/heartbeat-disk-pressure.test.ts +7 -13
- package/src/__tests__/heartbeat-service.test.ts +31 -19
- package/src/__tests__/helpers/channel-test-adapter.ts +22 -48
- package/src/__tests__/helpers/create-guardian-binding.ts +1 -1
- package/src/__tests__/helpers/derive-guardian-delivery.ts +66 -0
- package/src/__tests__/helpers/gateway-acl-store.ts +81 -0
- package/src/__tests__/helpers/seed-contact-channel.ts +50 -29
- package/src/__tests__/history-repair-hook.test.ts +1 -1
- package/src/__tests__/home-state-routes.test.ts +1 -1
- package/src/__tests__/http-conversation-lineage.test.ts +4 -4
- package/src/__tests__/http-user-message-parity.test.ts +8 -12
- package/src/__tests__/identity-routes.test.ts +113 -25
- package/src/__tests__/image-recovery-hook.test.ts +3 -3
- package/src/__tests__/inbound-invite-redemption.test.ts +36 -38
- package/src/__tests__/inbound-slack-persistence.test.ts +5 -5
- package/src/__tests__/inbound-trust-verdict.test.ts +5 -4
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +13 -6
- package/src/__tests__/inference-profile-reaper.test.ts +3 -3
- package/src/__tests__/inference-profile-session-handler.test.ts +3 -3
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -3
- package/src/__tests__/init-feature-flag-overrides.test.ts +1 -4
- package/src/__tests__/injection-block.test.ts +5 -2
- package/src/__tests__/injector-background-turn.test.ts +3 -5
- package/src/__tests__/injector-chain.test.ts +25 -16
- package/src/__tests__/injector-config-quarantine-notice.test.ts +3 -5
- package/src/__tests__/injector-disk-pressure.test.ts +10 -8
- package/src/__tests__/injector-document-comments.test.ts +5 -3
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +5 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +132 -0
- package/src/__tests__/injector-v3-suppression.test.ts +15 -9
- package/src/__tests__/install-meta.test.ts +104 -0
- package/src/__tests__/install-skill-routing.test.ts +1 -1
- package/src/__tests__/internal-telemetry-routes.test.ts +4 -4
- package/src/__tests__/invite-redemption-service.test.ts +42 -45
- package/src/__tests__/invite-routes-http.test.ts +3 -3
- package/src/__tests__/invite-service-ipc.test.ts +3 -3
- package/src/__tests__/job-handler-registry-guard.test.ts +125 -0
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +8 -8
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +7 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +7 -6
- package/src/__tests__/list-messages-attachments.test.ts +7 -4
- package/src/__tests__/list-messages-client-message-id.test.ts +6 -3
- package/src/__tests__/list-messages-hidden-metadata.test.ts +5 -5
- package/src/__tests__/list-messages-page-latest.test.ts +5 -5
- package/src/__tests__/list-messages-queued.test.ts +223 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +6 -3
- package/src/__tests__/llm-context-route-provider.test.ts +3 -3
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +4 -4
- package/src/__tests__/llm-request-log-call-site.test.ts +5 -5
- package/src/__tests__/llm-request-log-error-payload.test.ts +1 -1
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +2 -1
- package/src/__tests__/llm-request-log-source-factory.test.ts +3 -3
- package/src/__tests__/llm-request-log-turn-query.test.ts +9 -6
- package/src/__tests__/llm-usage-store.test.ts +137 -3
- package/src/__tests__/log-export-routes.test.ts +3 -3
- package/src/__tests__/log-export-workspace.test.ts +3 -3
- package/src/__tests__/managed-profile-guard.test.ts +1 -1
- package/src/__tests__/managed-skill-lifecycle.test.ts +3 -3
- package/src/__tests__/managed-store.test.ts +307 -0
- package/src/__tests__/mcp-config-secret-boundary.test.ts +2 -1
- package/src/__tests__/media-stream-server-integration.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +4 -4
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +11 -9
- package/src/__tests__/memory-recall-log-store.test.ts +4 -4
- package/src/__tests__/memory-retrieval-budget.test.ts +1 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +8 -8
- package/src/__tests__/memory-upsert-concurrency.test.ts +9 -5
- package/src/__tests__/memory-v2-static-injector.test.ts +3 -3
- package/src/__tests__/messages-after-tiebreaker.test.ts +4 -4
- package/src/__tests__/messaging-send-tool.test.ts +5 -5
- package/src/__tests__/mock-gateway-ipc.ts +1 -1
- package/src/__tests__/native-web-search.test.ts +11 -11
- package/src/__tests__/non-member-access-request.test.ts +9 -7
- package/src/__tests__/notification-candidate-guardian-context.test.ts +4 -4
- package/src/__tests__/notification-deep-link.test.ts +3 -3
- package/src/__tests__/notification-guardian-path.test.ts +3 -3
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +3 -3
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +2 -2
- package/src/__tests__/oauth-store.test.ts +6 -6
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +3 -3
- package/src/__tests__/persist-unsendable-image.test.ts +3 -3
- package/src/__tests__/persist-user-message-set-processing-failure.test.ts +70 -0
- package/src/__tests__/persistence-layering-guard.test.ts +207 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +6 -6
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +3 -3
- package/src/__tests__/playbook-execution.test.ts +4 -4
- package/src/__tests__/playbook-tools.test.ts +3 -3
- package/src/__tests__/plugin-bootstrap.test.ts +40 -3
- package/src/__tests__/plugin-config-data-migration.test.ts +263 -0
- package/src/__tests__/plugin-disabled-state.test.ts +137 -4
- package/src/__tests__/plugin-import-boundary-guard.test.ts +495 -0
- package/src/__tests__/plugin-injector-contribution.test.ts +149 -0
- package/src/__tests__/pointer-conversation-trust.test.ts +141 -0
- package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +8 -1
- package/src/__tests__/process-message-background-slack.test.ts +6 -6
- package/src/__tests__/process-message-display-content.test.ts +5 -5
- package/src/__tests__/processing-flag-persist-failure.test.ts +280 -0
- package/src/__tests__/provider-usage-tracking.test.ts +3 -3
- package/src/__tests__/prune-jobs-changes-parser.test.ts +1 -1
- package/src/__tests__/prune-old-conversations-job.test.ts +5 -5
- package/src/__tests__/published-app-updater.test.ts +3 -3
- package/src/__tests__/qdrant-collection-migration.test.ts +5 -2
- package/src/__tests__/qdrant-manager.test.ts +1 -1
- package/src/__tests__/reaction-intercept-cold-cache-warm.test.ts +18 -12
- package/src/__tests__/reaction-intercept-member-verdict-warm.test.ts +4 -4
- package/src/__tests__/reaction-persistence.test.ts +13 -10
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +5 -5
- package/src/__tests__/recording-handler.test.ts +2 -2
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +8 -8
- package/src/__tests__/relay-server.test.ts +140 -156
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/resolve-app-id.test.ts +3 -3
- package/src/__tests__/runtime-attachment-metadata.test.ts +7 -7
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +3 -3
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -3
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +3 -3
- package/src/__tests__/runtime-events-sse.test.ts +3 -3
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +489 -2
- package/src/__tests__/schedule-retry.test.ts +53 -53
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +47 -43
- package/src/__tests__/schedule-routes.test.ts +197 -187
- package/src/__tests__/schedule-store.test.ts +174 -172
- package/src/__tests__/schedule-tools.test.ts +2 -2
- package/src/__tests__/scheduler-disk-pressure.test.ts +3 -3
- package/src/__tests__/scheduler-recurrence.test.ts +15 -15
- package/src/__tests__/scheduler-reuse-conversation.test.ts +14 -14
- package/src/__tests__/scheduler-wake.test.ts +8 -8
- package/src/__tests__/scoped-approval-grants.test.ts +4 -4
- package/src/__tests__/scoped-grant-security-matrix.test.ts +4 -4
- package/src/__tests__/scrub-corrupted-image-attachments.test.ts +2 -2
- package/src/__tests__/search-skills-unified.test.ts +1 -1
- package/src/__tests__/secret-ingress-channel.test.ts +3 -3
- package/src/__tests__/secret-ingress-http.test.ts +6 -6
- package/src/__tests__/secret-routes-platform-proxy.test.ts +8 -7
- package/src/__tests__/send-endpoint-busy.test.ts +6 -6
- package/src/__tests__/sequence-store.test.ts +3 -3
- package/src/__tests__/server-history-render.test.ts +7 -4
- package/src/__tests__/settings-routes.test.ts +2 -2
- package/src/__tests__/skill-docs-sync-guard.test.ts +34 -0
- package/src/__tests__/skill-projection-feature-flag.test.ts +2 -1
- package/src/__tests__/skill-projection.benchmark.test.ts +2 -1
- package/src/__tests__/skill-version-hash.test.ts +32 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +1 -1
- package/src/__tests__/skills-files-catalog-fallback.test.ts +1 -1
- package/src/__tests__/slack-inbound-verification.test.ts +2 -2
- package/src/__tests__/slack-messaging-token-resolution.test.ts +2 -2
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +4 -4
- package/src/__tests__/slack-share-routes.test.ts +1 -1
- package/src/__tests__/slim-skill-category.test.ts +34 -2
- package/src/__tests__/starter-task-flow.test.ts +1 -1
- package/src/__tests__/strip-memory-injections.test.ts +2 -2
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-detail.test.ts +1 -1
- package/src/__tests__/subagent-fork-prompt-role.test.ts +1 -1
- package/src/__tests__/subagent-notify-parent.test.ts +3 -3
- package/src/__tests__/subagent-spawn-and-await.test.ts +1 -1
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +3 -3
- package/src/__tests__/subagent-tool-gate-mode.test.ts +1 -1
- package/src/__tests__/subagent-tools.test.ts +2 -5
- package/src/__tests__/suggestion-routes.test.ts +4 -4
- package/src/__tests__/task-compiler.test.ts +2 -2
- package/src/__tests__/task-management-tools.test.ts +2 -2
- package/src/__tests__/task-memory-cleanup.test.ts +9 -7
- package/src/__tests__/task-progress-nudge-hook.test.ts +37 -94
- package/src/__tests__/task-scheduler.test.ts +26 -26
- package/src/__tests__/test-support/tool-invocation-seed.ts +5 -2
- package/src/__tests__/thread-backfill.test.ts +4 -4
- package/src/__tests__/title-generate-hook.test.ts +6 -6
- package/src/__tests__/tool-approval-handler.test.ts +4 -4
- package/src/__tests__/tool-audit-listener.test.ts +1 -1
- package/src/__tests__/tool-error-hook.test.ts +2 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +5 -5
- package/src/__tests__/tool-executor-redaction.test.ts +11 -0
- package/src/__tests__/tool-executor.test.ts +24 -2
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -5
- package/src/__tests__/tool-preview-lifecycle.test.ts +77 -8
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +4 -4
- package/src/__tests__/tool-result-truncate-hook.test.ts +2 -0
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -1
- package/src/__tests__/tool-start-timestamp.test.ts +65 -2
- package/src/__tests__/tools-get-route.test.ts +44 -1
- package/src/__tests__/trace-emitter.test.ts +1 -1
- package/src/__tests__/trust-context-guards.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -5
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +11 -5
- package/src/__tests__/trusted-contact-multichannel.test.ts +9 -9
- package/src/__tests__/trusted-contact-verification.test.ts +8 -30
- package/src/__tests__/turn-boundary-resolution.test.ts +7 -4
- package/src/__tests__/turn-call-site.test.ts +29 -0
- package/src/__tests__/turn-events-store.test.ts +8 -5
- package/src/__tests__/twilio-routes.test.ts +3 -3
- package/src/__tests__/usage-cache-backfill-migration.test.ts +4 -8
- package/src/__tests__/usage-grouped-buckets.test.ts +1 -1
- package/src/__tests__/usage-routes.test.ts +61 -3
- package/src/__tests__/verification-control-plane-policy.test.ts +6 -6
- package/src/__tests__/voice-invite-redemption.test.ts +41 -45
- package/src/__tests__/voice-quality.test.ts +38 -12
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +22 -14
- package/src/__tests__/voice-session-bridge.test.ts +16 -10
- package/src/__tests__/web-search-backend-failure.test.ts +4 -4
- package/src/__tests__/workspace-lifecycle.test.ts +29 -18
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +4 -4
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +5 -5
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +3 -3
- package/src/__tests__/workspace-migration-113-swap-balanced-profile-to-glm-5p2.test.ts +241 -0
- package/src/__tests__/workspace-migration-114-swap-quality-profile-to-opus.test.ts +172 -0
- package/src/__tests__/workspace-migration-116-rename-memory-plugin-disabled-sentinel.test.ts +128 -0
- package/src/__tests__/workspace-migration-117-normalize-stale-lean-memory-v3-defaults.test.ts +221 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +84 -7
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +10 -6
- package/src/a2a/__tests__/task-store.test.ts +2 -2
- package/src/a2a/task-store.ts +4 -4
- package/src/acp/__tests__/client-handler.test.ts +680 -0
- package/src/acp/__tests__/helpers/acp-history-db.ts +32 -4
- package/src/acp/__tests__/session-manager-persistence.test.ts +215 -7
- package/src/acp/__tests__/session-manager-resume.test.ts +113 -2
- package/src/acp/__tests__/session-manager-startup.test.ts +3 -3
- package/src/acp/__tests__/session-manager-usage.test.ts +113 -0
- package/src/acp/client-handler.ts +140 -21
- package/src/acp/session-manager.ts +127 -4
- package/src/acp/types.ts +18 -0
- package/src/agent/loop.ts +200 -148
- package/src/api/events/acp-session-completed.ts +33 -0
- package/src/api/events/acp-session-error.ts +21 -0
- package/src/api/events/acp-session-spawned.ts +32 -0
- package/src/api/events/acp-session-update.test.ts +122 -0
- package/src/api/events/acp-session-update.ts +51 -0
- package/src/api/events/acp-session-usage.test.ts +49 -0
- package/src/api/events/acp-session-usage.ts +31 -0
- package/src/api/events/tool-use-preview-start.ts +11 -0
- package/src/api/events/tool-use-start.ts +14 -0
- package/src/api/index.ts +38 -0
- package/src/api/responses/conversation-message.ts +37 -1
- package/src/api/responses/llm-request-log-entry.ts +41 -0
- package/src/api/responses/memory-v3-selection-log.ts +5 -7
- package/src/approvals/approval-primitive.ts +1 -1
- package/src/approvals/guardian-card-withdrawal.ts +2 -2
- package/src/approvals/guardian-decision-primitive.ts +1 -1
- package/src/approvals/guardian-expiry-notifier.ts +1 -1
- package/src/approvals/guardian-request-resolvers.ts +4 -4
- package/src/approvals/scoped-approval-grants.ts +551 -0
- package/src/apps/app-store.ts +1058 -0
- package/src/apps/published-pages-store.ts +67 -0
- package/src/apps/shared-app-links-store.ts +130 -0
- package/src/background-wake/background-wake-routes.test.ts +53 -23
- package/src/background-wake/wake-intent-hooks.test.ts +18 -12
- package/src/backup/restore.ts +1 -1
- package/src/bundler/app-bundler.ts +1 -1
- package/src/calls/__tests__/relay-setup-router.test.ts +1 -1
- package/src/calls/call-controller.ts +5 -5
- package/src/calls/call-conversation-messages.ts +1 -1
- package/src/calls/call-domain.ts +5 -5
- package/src/calls/call-pointer-messages.ts +1 -1
- package/src/calls/call-store.ts +3 -3
- package/src/calls/guardian-action-sweep.ts +1 -1
- package/src/calls/guardian-dispatch.ts +5 -5
- package/src/calls/media-stream-server.ts +1 -1
- package/src/calls/relay-access-wait.ts +1 -1
- package/src/calls/relay-server.ts +3 -3
- package/src/calls/relay-setup-router.ts +1 -1
- package/src/calls/tts-call-strategy.ts +4 -3
- package/src/calls/voice-quality.ts +47 -59
- package/src/calls/voice-session-bridge.ts +2 -16
- package/src/channels/channel-verification-sessions.ts +557 -0
- package/src/cli/commands/__tests__/conversations-new.test.ts +186 -0
- package/src/cli/commands/__tests__/conversations-slack.test.ts +1 -1
- package/src/cli/commands/__tests__/conversations-wake.test.ts +147 -0
- package/src/cli/commands/__tests__/ps.test.ts +205 -0
- package/src/cli/commands/conversations.ts +90 -30
- package/src/cli/commands/db/__tests__/repair.test.ts +4 -3
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +2 -2
- package/src/cli/commands/memory/__tests__/memory-v2-compare-render.test.ts +1 -1
- package/src/cli/commands/memory/__tests__/worker.test.ts +106 -307
- package/src/cli/commands/memory/memory-retrospective.ts +32 -28
- package/src/cli/commands/memory/memory-v2-compare-render.ts +1 -1
- package/src/cli/commands/memory/memory-v2.ts +2 -2
- package/src/cli/commands/memory/memory-v3.ts +2 -2
- package/src/cli/commands/memory/worker.ts +83 -160
- package/src/cli/commands/plugins.ts +147 -11
- package/src/cli/commands/ps.ts +90 -0
- package/src/cli/commands/tools-run.ts +114 -0
- package/src/cli/commands/tools.ts +19 -5
- package/src/cli/lib/__tests__/cli-colors.test.ts +30 -1
- package/src/cli/lib/__tests__/install-from-github.test.ts +168 -8
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +9 -4
- package/src/cli/lib/__tests__/parse-github-plugin-spec.test.ts +121 -0
- package/src/cli/lib/__tests__/toggle-plugin.test.ts +10 -4
- package/src/cli/lib/cli-colors.ts +6 -0
- package/src/cli/lib/diff-plugin.ts +3 -7
- package/src/cli/lib/inspect-plugin.ts +2 -4
- package/src/cli/lib/install-from-github.ts +96 -24
- package/src/cli/lib/merge-plugin-tree.ts +5 -3
- package/src/cli/lib/parse-github-plugin-spec.ts +163 -0
- package/src/cli/lib/plugin-fingerprint.ts +22 -0
- package/src/cli/lib/upgrade-plugin.ts +6 -5
- package/src/cli/program.ts +4 -7
- package/src/cli.ts +6 -3
- package/src/config/__tests__/deployment-context-defaults.test.ts +228 -0
- package/src/config/__tests__/proc-to-skills.test.ts +21 -0
- package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
- package/src/config/bundled-skills/AGENTS.md +11 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -0
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +2 -2
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +2 -2
- package/src/config/bundled-skills/app-builder/tools/app-generate-icon.ts +2 -2
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +1 -1
- package/src/config/bundled-skills/app-builder/tools/app-refresh.ts +2 -2
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +2 -2
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +1 -1
- package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +1 -1
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +1 -1
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/media-status.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +5 -5
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +6 -6
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +8 -5
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +4 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -4
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +7 -7
- package/src/config/bundled-skills/skill-management/TOOLS.json +45 -0
- package/src/config/bundled-skills/skill-management/tools/find-similar.ts +12 -0
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/feature-flag-registry.json +8 -16
- package/src/config/llm-resolver.ts +17 -0
- package/src/config/loader.ts +38 -58
- package/src/config/memory-v3-gate.ts +16 -0
- package/src/config/schema.ts +2 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +16 -5
- package/src/config/schemas/conversations.ts +8 -0
- package/src/config/schemas/memory-lifecycle.ts +9 -0
- package/src/config/schemas/memory-v3.ts +56 -6
- package/src/config/schemas/migrations.ts +25 -0
- package/src/config/schemas/services.ts +0 -37
- package/src/config/seed-inference-profiles.ts +13 -50
- package/src/config/sync-gated-profiles.ts +6 -17
- package/src/contacts/__tests__/guardian-contact-reader.test.ts +89 -0
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +3 -14
- package/src/contacts/canonical-guardian-store.ts +891 -0
- package/src/contacts/contact-store.ts +11 -9
- package/src/contacts/guardian-contact-reader.ts +52 -0
- package/src/contacts/guardian-delivery-reader.ts +21 -23
- package/src/contacts/guardian-rate-limits.ts +191 -0
- package/src/contacts/notify-contacts-changed.ts +17 -0
- package/src/context/compactor.ts +3 -3
- package/src/context/strip-injections.ts +1 -1
- package/src/conversations/__tests__/message-consolidation.test.ts +10 -26
- package/src/conversations/job-handlers/summarization.ts +246 -0
- package/src/conversations/message-consolidation.ts +1 -1
- package/src/credential-execution/ces-runtime.ts +285 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +25 -22
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +5 -4
- package/src/daemon/__tests__/daemon-readiness.test.ts +51 -0
- package/src/daemon/__tests__/daemon-skill-host.test.ts +1 -1
- package/src/daemon/__tests__/embedding-reconcile.test.ts +456 -0
- package/src/daemon/__tests__/inference-profile-notification.test.ts +9 -6
- package/src/daemon/__tests__/lifecycle-embedding-reconcile.test.ts +119 -0
- package/src/daemon/__tests__/memory-v2-startup.test.ts +86 -0
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +2 -2
- package/src/daemon/__tests__/web-search-status-text.test.ts +3 -5
- package/src/daemon/app-source-watcher.ts +71 -10
- package/src/daemon/channel-ui-capability.ts +25 -0
- package/src/daemon/config-watcher.ts +71 -47
- package/src/daemon/conversation-agent-loop-handlers.ts +150 -23
- package/src/daemon/conversation-agent-loop.ts +84 -28
- package/src/daemon/conversation-attachments.ts +2 -2
- package/src/daemon/conversation-evictor.ts +42 -9
- package/src/daemon/conversation-history.ts +6 -6
- package/src/daemon/conversation-launch.ts +2 -2
- package/src/daemon/conversation-lifecycle.ts +7 -4
- package/src/daemon/conversation-messaging.ts +25 -11
- package/src/daemon/conversation-notifiers.ts +1 -1
- package/src/daemon/conversation-process.ts +17 -15
- package/src/daemon/conversation-queue-manager.ts +6 -0
- package/src/daemon/conversation-registry.ts +6 -5
- package/src/daemon/conversation-runtime-assembly.ts +37 -31
- package/src/daemon/conversation-skill-tools.ts +26 -2
- package/src/daemon/conversation-slash.ts +1 -1
- package/src/daemon/conversation-store.ts +44 -39
- package/src/daemon/conversation-surfaces.ts +4 -4
- package/src/daemon/conversation-tool-setup.ts +2 -1
- package/src/daemon/conversation-usage.ts +4 -2
- package/src/daemon/conversation-workspace.ts +2 -2
- package/src/daemon/conversation.ts +45 -17
- package/src/daemon/daemon-readiness.ts +33 -0
- package/src/daemon/daemon-skill-host.ts +1 -1
- package/src/daemon/embedding-reconcile.ts +340 -0
- package/src/daemon/event-loop-watchdog.ts +1 -1
- package/src/daemon/external-plugins-bootstrap.ts +80 -14
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +2 -2
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +3 -3
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +3 -3
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +7 -11
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +2 -2
- package/src/daemon/handlers/__tests__/config-channels.test.ts +17 -11
- package/src/daemon/handlers/config-a2a.ts +3 -3
- package/src/daemon/handlers/config-channels.ts +7 -4
- package/src/daemon/handlers/config-embeddings.ts +1 -1
- package/src/daemon/handlers/conversation-history.ts +2 -2
- package/src/daemon/handlers/conversations.ts +7 -4
- package/src/daemon/handlers/recording.ts +6 -3
- package/src/daemon/handlers/shared.ts +2 -0
- package/src/daemon/handlers/skills.ts +9 -1
- package/src/daemon/lifecycle.ts +890 -1208
- package/src/daemon/memory-v2-startup.test.ts +3 -3
- package/src/daemon/memory-v2-startup.ts +47 -12
- package/src/daemon/message-provenance.ts +1 -1
- package/src/daemon/message-types/acp.ts +27 -1
- package/src/daemon/message-types/bookmarks.ts +1 -1
- package/src/daemon/message-types/skills.ts +20 -2
- package/src/daemon/pointer-conversation-trust.ts +66 -0
- package/src/daemon/process-message.ts +24 -3
- package/src/daemon/providers-setup.ts +0 -14
- package/src/daemon/shutdown-handlers.ts +185 -165
- package/src/daemon/skill-memory-refresh.ts +1 -1
- package/src/daemon/status.ts +15 -0
- package/src/daemon/tool-setup-types.ts +17 -0
- package/src/daemon/tool-side-effects.ts +4 -4
- package/src/daemon/trace-emitter.ts +1 -1
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/turn-call-site.ts +25 -0
- package/src/daemon/turn-latency-tracker.test.ts +137 -0
- package/src/daemon/turn-latency-tracker.ts +134 -0
- package/src/daemon/wake-conversation-ops.ts +11 -4
- package/src/documents/document-comments-store.test.ts +2 -2
- package/src/documents/document-comments-store.ts +1 -1
- package/src/documents/document-store.ts +1 -1
- package/src/events/tool-audit-listener.ts +4 -4
- package/src/events/tool-permission-telemetry-listener.ts +1 -1
- package/src/export/__tests__/transcript-formatter.test.ts +1 -1
- package/src/export/transcript-formatter.ts +1 -1
- package/src/followups/followup-store.ts +2 -2
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +2 -2
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +45 -39
- package/src/heartbeat/heartbeat-run-store.ts +3 -3
- package/src/heartbeat/heartbeat-service.ts +29 -11
- package/src/home/__tests__/relationship-state-writer.test.ts +1 -1
- package/src/home/__tests__/suggested-prompts.test.ts +1 -1
- package/src/home/conversation-starter-checkpoints.ts +64 -0
- package/src/home/feed-source-enrichment.ts +3 -3
- package/src/home/home-greeting-cache.ts +1 -1
- package/src/home/job-handlers/conversation-starters.ts +484 -0
- package/src/home/relationship-state-writer.ts +1 -1
- package/src/home/suggested-prompts.ts +1 -1
- package/src/hooks/hook-loader.ts +141 -6
- package/src/hooks/registry.ts +129 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -1
- package/src/ipc/__tests__/inject-local-actor-header.test.ts +33 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +1 -1
- package/src/ipc/assistant-server.ts +79 -33
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +3 -3
- package/src/ipc/routes/db-proxy-transaction.ts +1 -1
- package/src/ipc/routes/db-proxy.ts +4 -2
- package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -1
- package/src/ipc/skill-routes/memory.ts +1 -1
- package/src/ipc/skill-routes/registries.ts +8 -10
- package/src/ipc/skill-server.ts +42 -6
- package/src/jobs/register-job-handlers.ts +74 -0
- package/src/jobs/worker.ts +91 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +5 -5
- package/src/live-voice/live-voice-archive.ts +2 -2
- package/src/mcp/manager.ts +11 -0
- package/src/media/app-icon-generator.ts +1 -1
- package/src/media/job-handlers/media-processing.ts +126 -0
- package/src/messaging/channel-binding-metadata.ts +1 -1
- package/src/messaging/content/parse.test.ts +34 -0
- package/src/messaging/content/parse.ts +23 -0
- package/src/messaging/providers/__tests__/transport-dispatch.test.ts +1 -0
- package/src/messaging/providers/slack/binding-metadata.ts +1 -1
- package/src/messaging/providers/slack/render.test.ts +309 -0
- package/src/messaging/providers/slack/render.ts +459 -0
- package/src/messaging/providers/slack/send.test.ts +39 -0
- package/src/messaging/providers/slack/send.ts +38 -18
- package/src/messaging/providers/telegram-bot/adapter.ts +2 -2
- package/src/messaging/providers/telegram-bot/api.ts +17 -3
- package/src/messaging/providers/telegram-bot/render.test.ts +146 -0
- package/src/messaging/providers/telegram-bot/render.ts +292 -0
- package/src/messaging/providers/telegram-bot/send.test.ts +197 -0
- package/src/messaging/providers/telegram-bot/send.ts +70 -2
- package/src/messaging/providers/telegram-bot/transport.ts +10 -1
- package/src/messaging/providers/whatsapp/adapter.ts +2 -2
- package/src/messaging/providers/whatsapp/send.ts +1 -1
- package/src/notifications/__tests__/deterministic-checks.test.ts +3 -3
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -1
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/canonical-delivery-recorder.ts +1 -1
- package/src/notifications/conversation-candidates.ts +3 -3
- package/src/notifications/conversation-pairing.ts +25 -16
- package/src/notifications/decisions-store.ts +2 -2
- package/src/notifications/deliveries-store.ts +3 -3
- package/src/notifications/deterministic-checks.ts +2 -2
- package/src/notifications/emit-signal.ts +1 -1
- package/src/notifications/events-store.ts +2 -2
- package/src/notifications/home-feed-side-effect.ts +2 -2
- package/src/notifications/preferences-store.ts +2 -2
- package/src/notifications/signal.ts +1 -1
- package/src/oauth/oauth-store.ts +3 -3
- package/src/onboarding/__tests__/onboarding-events-store.test.ts +80 -0
- package/src/onboarding/checkin-event.test.ts +5 -2
- package/src/onboarding/checkin-event.ts +7 -1
- package/src/onboarding/onboarding-events-store.ts +161 -0
- package/src/permissions/checker.test.ts +319 -1
- package/src/permissions/checker.ts +52 -0
- package/src/permissions/types.ts +21 -0
- package/src/persistence/__tests__/db-init-migrations-ok.test.ts +20 -0
- package/src/persistence/__tests__/worker-control.test.ts +260 -0
- package/src/persistence/attachments-store.ts +1136 -0
- package/src/persistence/checkpoints.ts +65 -0
- package/src/persistence/compaction-ledger-store.ts +107 -0
- package/src/persistence/conversation-attention-store.ts +689 -0
- package/src/persistence/conversation-bootstrap.ts +59 -0
- package/src/persistence/conversation-crud.ts +3437 -0
- package/src/persistence/conversation-group-migration.test.ts +99 -0
- package/src/persistence/conversation-key-store.ts +274 -0
- package/src/persistence/conversation-queries.ts +768 -0
- package/src/persistence/conversation-row-batch-delete.ts +205 -0
- package/src/persistence/db-async-query.ts +329 -0
- package/src/persistence/db-connection.ts +242 -0
- package/src/persistence/db-init.ts +282 -0
- package/src/persistence/db-maintenance.ts +158 -0
- package/src/persistence/embeddings/__tests__/embedding-identity.test.ts +156 -0
- package/src/persistence/embeddings/__tests__/reconcile-decision.test.ts +95 -0
- package/src/persistence/embeddings/embed.ts +87 -0
- package/src/persistence/embeddings/embedding-backend.test.ts +355 -0
- package/src/persistence/embeddings/embedding-backend.ts +968 -0
- package/src/persistence/embeddings/embedding-billing-breaker.ts +96 -0
- package/src/persistence/embeddings/embedding-cache.ts +139 -0
- package/src/persistence/embeddings/embedding-identity.ts +88 -0
- package/src/persistence/embeddings/embedding-local.ts +587 -0
- package/src/persistence/embeddings/embedding-ollama.ts +79 -0
- package/src/persistence/embeddings/embedding-runtime-manager.ts +573 -0
- package/src/persistence/embeddings/embedding-types.ts +97 -0
- package/src/persistence/embeddings/qdrant-circuit-breaker.ts +119 -0
- package/src/persistence/embeddings/qdrant-client.test.ts +60 -0
- package/src/persistence/embeddings/qdrant-client.ts +842 -0
- package/src/persistence/embeddings/qdrant-manager.ts +450 -0
- package/src/persistence/embeddings/reconcile-decision.ts +53 -0
- package/src/persistence/embeddings/sparse-tokenize.ts +51 -0
- package/src/persistence/external-conversation-store.ts +315 -0
- package/src/persistence/fork-message-copy.ts +225 -0
- package/src/persistence/job-handlers/cleanup.ts +239 -0
- package/src/persistence/job-utils.ts +286 -0
- package/src/persistence/jobs-store.ts +813 -0
- package/src/persistence/jobs-worker.ts +833 -0
- package/src/persistence/llm-request-log-source-clickhouse.ts +525 -0
- package/src/persistence/llm-request-log-store.ts +740 -0
- package/src/persistence/llm-usage-store.ts +961 -0
- package/src/persistence/memory-lifecycle-hooks.test.ts +81 -0
- package/src/persistence/memory-lifecycle-hooks.ts +120 -0
- package/src/persistence/message-content.test.ts +35 -0
- package/src/persistence/migrations/126-backfill-guardian-principal-id.ts +300 -0
- package/src/persistence/migrations/140-backfill-usage-cache-accounting.ts +364 -0
- package/src/persistence/migrations/142-rename-verification-session-id-column.ts +55 -0
- package/src/persistence/migrations/182-oauth-providers-display-metadata.ts +22 -0
- package/src/persistence/migrations/196-strip-integration-prefix-from-provider-keys.ts +175 -0
- package/src/persistence/migrations/199-guardian-request-enrichment-columns.ts +50 -0
- package/src/persistence/migrations/202-memory-graph-tables.ts +128 -0
- package/src/persistence/migrations/203-drop-memory-items-tables.ts +53 -0
- package/src/persistence/migrations/206-scrub-corrupted-image-attachments.ts +121 -0
- package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +196 -0
- package/src/persistence/migrations/211-memory-recall-logs-query-context.ts +14 -0
- package/src/persistence/migrations/220-normalize-user-file-by-principal.ts +171 -0
- package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +179 -0
- package/src/persistence/migrations/236-tool-invocations-matched-rule-id.ts +23 -0
- package/src/persistence/migrations/243-provider-connections.ts +80 -0
- package/src/persistence/migrations/244-provider-connection-status-label.ts +29 -0
- package/src/persistence/migrations/246-backfill-provider-connection-label.ts +83 -0
- package/src/persistence/migrations/255-channel-inbound-delivery-attempts.ts +17 -0
- package/src/persistence/migrations/301-create-watchdog-events.ts +42 -0
- package/src/persistence/migrations/304-add-llm-usage-cron-run-id.ts +31 -0
- package/src/persistence/migrations/305-drop-contact-acl-columns.ts +49 -0
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +110 -0
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.ts +65 -0
- package/src/persistence/migrations/307-acp-session-history-usage-columns.test.ts +124 -0
- package/src/persistence/migrations/307-acp-session-history-usage-columns.ts +36 -0
- package/src/persistence/migrations/308-acp-session-history-token-columns.test.ts +119 -0
- package/src/persistence/migrations/308-acp-session-history-token-columns.ts +32 -0
- package/src/persistence/migrations/309-drop-redundant-indexes.ts +60 -0
- package/src/persistence/migrations/310-llm-request-log-latency-breakdown.ts +37 -0
- package/src/persistence/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +328 -0
- package/src/persistence/migrations/__tests__/222-strip-placeholder-sentinels-from-messages.test.ts +273 -0
- package/src/persistence/migrations/__tests__/244-provider-connection-status-label.test.ts +90 -0
- package/src/persistence/migrations/__tests__/246-backfill-provider-connection-label.test.ts +250 -0
- package/src/persistence/migrations/__tests__/run-migrations.test.ts +380 -0
- package/src/persistence/migrations/helpers/relocation.ts +230 -0
- package/src/persistence/migrations/validate-migration-state.ts +279 -0
- package/src/persistence/schedule-attribution-sql.ts +106 -0
- package/src/persistence/schema/acp.ts +51 -0
- package/src/persistence/schema/contacts.ts +110 -0
- package/src/persistence/schema/conversations.ts +235 -0
- package/src/persistence/schema/infrastructure.ts +389 -0
- package/src/persistence/steps.ts +1310 -0
- package/src/persistence/worker-control.ts +277 -0
- package/src/platform/sync-identity.ts +24 -0
- package/src/playbooks/playbook-compiler.ts +2 -2
- package/src/plugin-api/index.ts +5 -0
- package/src/plugin-api/types.ts +40 -15
- package/src/plugins/defaults/channel/injectors.ts +101 -0
- package/src/plugins/defaults/channel/package.json +14 -0
- package/src/plugins/defaults/compaction/compact.ts +2 -1
- package/src/plugins/defaults/compaction/context-overflow-reducer.ts +2 -1
- package/src/plugins/defaults/compaction/window-manager.ts +8 -7
- package/src/plugins/defaults/documents/injectors.ts +125 -0
- package/src/plugins/defaults/documents/package.json +14 -0
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +6 -2
- package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +10 -11
- package/src/plugins/defaults/history-repair/terminal.ts +1 -1
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +23 -9
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +2 -3
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +7 -14
- package/src/plugins/defaults/image-fallback/src/vision-caption.ts +12 -4
- package/src/plugins/defaults/image-recovery/recover.ts +6 -3
- package/src/plugins/defaults/index.ts +235 -43
- package/src/plugins/defaults/injection-presence.ts +80 -0
- package/src/plugins/defaults/injector-order.ts +54 -0
- package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +5 -2
- package/src/plugins/defaults/memory/__tests__/301-create-watchdog-events.test.ts +110 -0
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +41 -0
- package/src/plugins/defaults/memory/__tests__/bookmark-crud.test.ts +264 -0
- package/src/plugins/defaults/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/plugins/defaults/memory/__tests__/clear-stale-processing-flags.test.ts +52 -0
- package/src/plugins/defaults/memory/__tests__/compaction-log-store-clickhouse.test.ts +432 -0
- package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +843 -0
- package/src/plugins/defaults/memory/__tests__/conversation-row-batch-delete.test.ts +199 -0
- package/src/plugins/defaults/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +172 -0
- package/src/plugins/defaults/memory/__tests__/db-busy-timeout.test.ts +26 -0
- package/src/plugins/defaults/memory/__tests__/db-logs-attach.test.ts +113 -0
- package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +238 -0
- package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +116 -0
- package/src/plugins/defaults/memory/__tests__/embedding-cache.test.ts +137 -0
- package/src/plugins/defaults/memory/__tests__/find-analysis-conversation.test.ts +197 -0
- package/src/plugins/defaults/memory/__tests__/find-most-recent-retrospective-for.test.ts +140 -0
- package/src/plugins/defaults/memory/__tests__/fork-message-copy.test.ts +232 -0
- package/src/plugins/defaults/memory/__tests__/jobs-store-enqueue-gate.test.ts +245 -0
- package/src/plugins/defaults/memory/__tests__/jobs-store-job-classes.test.ts +52 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +115 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +508 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +160 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +1565 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +549 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +195 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +221 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +275 -0
- package/src/plugins/defaults/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/plugins/defaults/memory/__tests__/prompt-override.test.ts +192 -0
- package/src/plugins/defaults/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +130 -0
- package/src/plugins/defaults/memory/activation-session-store.ts +43 -0
- package/src/plugins/defaults/memory/anisotropy.ts +443 -0
- package/src/plugins/defaults/memory/context-search/agent-protocol.ts +428 -0
- package/src/plugins/defaults/memory/context-search/agent-runner.ts +1311 -0
- package/src/plugins/defaults/memory/context-search/search.ts +297 -0
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +341 -0
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +600 -0
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +101 -0
- package/src/plugins/defaults/memory/context-search/types.ts +48 -0
- package/src/plugins/defaults/memory/filing-service.ts +430 -0
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +663 -0
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +321 -0
- package/src/plugins/defaults/memory/graph/bootstrap.test.ts +287 -0
- package/src/plugins/defaults/memory/graph/bootstrap.ts +544 -0
- package/src/plugins/defaults/memory/graph/capability-seed.ts +454 -0
- package/src/plugins/defaults/memory/graph/consolidation.ts +712 -0
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +1181 -0
- package/src/plugins/defaults/memory/graph/decay.ts +195 -0
- package/src/plugins/defaults/memory/graph/extraction-job.ts +77 -0
- package/src/plugins/defaults/memory/graph/extraction.ts +1462 -0
- package/src/plugins/defaults/memory/graph/graph-memory-state-store.ts +50 -0
- package/src/plugins/defaults/memory/graph/graph-search.test.ts +132 -0
- package/src/plugins/defaults/memory/graph/graph-search.ts +294 -0
- package/src/plugins/defaults/memory/graph/image-ref-utils.ts +29 -0
- package/src/plugins/defaults/memory/graph/injection.ts +469 -0
- package/src/plugins/defaults/memory/graph/narrative.ts +267 -0
- package/src/plugins/defaults/memory/graph/pattern-scan.ts +269 -0
- package/src/plugins/defaults/memory/graph/retriever.test.ts +624 -0
- package/src/plugins/defaults/memory/graph/retriever.ts +1357 -0
- package/src/plugins/defaults/memory/graph/store.test.ts +1093 -0
- package/src/plugins/defaults/memory/graph/store.ts +923 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +195 -0
- package/src/plugins/defaults/memory/graph/tools.ts +95 -0
- package/src/plugins/defaults/memory/hooks/init.ts +26 -0
- package/src/plugins/defaults/memory/hooks/post-compact.ts +115 -0
- package/src/plugins/defaults/memory/hooks/shutdown.ts +14 -0
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +371 -0
- package/src/plugins/defaults/memory/indexer.ts +409 -0
- package/src/plugins/defaults/memory/injectors.ts +388 -0
- package/src/plugins/defaults/memory/job-handlers/backfill.ts +107 -0
- package/src/plugins/defaults/memory/job-handlers/embedding.test.ts +236 -0
- package/src/plugins/defaults/memory/job-handlers/embedding.ts +133 -0
- package/src/plugins/defaults/memory/job-handlers/index-maintenance.ts +117 -0
- package/src/plugins/defaults/memory/job-handlers.ts +203 -0
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +565 -0
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +424 -0
- package/src/plugins/defaults/memory/jobs/embed-pkb-file.test.ts +169 -0
- package/src/plugins/defaults/memory/jobs/embed-pkb-file.ts +59 -0
- package/src/plugins/defaults/memory/memory-recall-log-store.ts +172 -0
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +60 -0
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +131 -0
- package/src/plugins/defaults/memory/memory-retrospective-fork-boundary.ts +94 -0
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +958 -0
- package/src/plugins/defaults/memory/memory-retrospective-startup-cleanup.ts +264 -0
- package/src/plugins/defaults/memory/memory-retrospective-state.ts +259 -0
- package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/plugins/defaults/memory/memory-v2-activation-log-store.ts +216 -0
- package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +173 -0
- package/src/plugins/defaults/memory/package.json +14 -0
- package/src/plugins/defaults/memory/persistence-hooks.ts +119 -0
- package/src/plugins/defaults/memory/pkb/autoinject.ts +61 -0
- package/src/plugins/defaults/memory/pkb/context.ts +50 -0
- package/src/plugins/defaults/memory/pkb/pkb-index.test.ts +371 -0
- package/src/plugins/defaults/memory/pkb/pkb-index.ts +256 -0
- package/src/plugins/defaults/memory/pkb/pkb-reconcile.test.ts +254 -0
- package/src/plugins/defaults/memory/pkb/pkb-reconcile.ts +144 -0
- package/src/plugins/defaults/memory/pkb/pkb-search.test.ts +589 -0
- package/src/plugins/defaults/memory/pkb/pkb-search.ts +178 -0
- package/src/plugins/defaults/memory/pkb/types.ts +67 -0
- package/src/plugins/defaults/memory/rerank-local.ts +374 -0
- package/src/plugins/defaults/memory/routes/__tests__/memory-v2-routes.test.ts +165 -0
- package/src/plugins/defaults/memory/routes/__tests__/memory-v2-simulate-route.test.ts +347 -0
- package/src/plugins/defaults/memory/routes/memory-eval-routes.ts +179 -0
- package/src/plugins/defaults/memory/routes/memory-item-routes.test.ts +922 -0
- package/src/plugins/defaults/memory/routes/memory-item-routes.ts +814 -0
- package/src/plugins/defaults/memory/routes/memory-v2-routes.ts +850 -0
- package/src/plugins/defaults/memory/routes/memory-v3-routes.ts +125 -0
- package/src/plugins/defaults/memory/search/semantic.ts +241 -0
- package/src/plugins/defaults/memory/segmenter.ts +76 -0
- package/src/plugins/defaults/memory/tail-reinjection-strip.ts +65 -0
- package/src/plugins/defaults/memory/task-memory-cleanup.ts +241 -0
- package/src/plugins/defaults/memory/tools.test.ts +382 -0
- package/src/plugins/defaults/memory/tools.ts +87 -0
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +207 -0
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +1273 -0
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +510 -0
- package/src/plugins/defaults/memory/v2/__tests__/cli-command-store.test.ts +432 -0
- package/src/plugins/defaults/memory/v2/__tests__/consolidation-job.test.ts +744 -0
- package/src/plugins/defaults/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +205 -0
- package/src/plugins/defaults/memory/v2/__tests__/frontmatter-sweep.test.ts +136 -0
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +230 -0
- package/src/plugins/defaults/memory/v2/__tests__/harness-runner.test.ts +135 -0
- package/src/plugins/defaults/memory/v2/__tests__/injection-events.test.ts +318 -0
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +2308 -0
- package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +940 -0
- package/src/plugins/defaults/memory/v2/__tests__/page-index.test.ts +760 -0
- package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +332 -0
- package/src/plugins/defaults/memory/v2/__tests__/qdrant.test.ts +974 -0
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +338 -0
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +1198 -0
- package/src/plugins/defaults/memory/v2/__tests__/sim.test.ts +704 -0
- package/src/plugins/defaults/memory/v2/__tests__/skill-content.test.ts +115 -0
- package/src/plugins/defaults/memory/v2/__tests__/skill-store.test.ts +986 -0
- package/src/plugins/defaults/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/plugins/defaults/memory/v2/__tests__/static-context.test.ts +223 -0
- package/src/plugins/defaults/memory/v2/__tests__/sweep-job.test.ts +530 -0
- package/src/plugins/defaults/memory/v2/activation-store.ts +185 -0
- package/src/plugins/defaults/memory/v2/activation.ts +560 -0
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +296 -0
- package/src/plugins/defaults/memory/v2/cli-command-store.ts +341 -0
- package/src/plugins/defaults/memory/v2/consolidation-job.ts +550 -0
- package/src/plugins/defaults/memory/v2/frontmatter-sweep.ts +98 -0
- package/src/plugins/defaults/memory/v2/harness/compare.ts +57 -0
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +148 -0
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +243 -0
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +74 -0
- package/src/plugins/defaults/memory/v2/harness/router-retriever.ts +43 -0
- package/src/plugins/defaults/memory/v2/injected-block-slugs.ts +79 -0
- package/src/plugins/defaults/memory/v2/injection-events.ts +101 -0
- package/src/plugins/defaults/memory/v2/injection.ts +932 -0
- package/src/plugins/defaults/memory/v2/migration.ts +774 -0
- package/src/plugins/defaults/memory/v2/page-index.ts +459 -0
- package/src/plugins/defaults/memory/v2/page-store.ts +443 -0
- package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +868 -0
- package/src/plugins/defaults/memory/v2/prompts/router.ts +148 -0
- package/src/plugins/defaults/memory/v2/qdrant.ts +939 -0
- package/src/plugins/defaults/memory/v2/reranker.ts +184 -0
- package/src/plugins/defaults/memory/v2/router.ts +602 -0
- package/src/plugins/defaults/memory/v2/sim.ts +310 -0
- package/src/plugins/defaults/memory/v2/skill-content.ts +61 -0
- package/src/plugins/defaults/memory/v2/skill-store.ts +431 -0
- package/src/plugins/defaults/memory/v2/sparse-bm25.ts +245 -0
- package/src/plugins/defaults/memory/v2/static-context.ts +100 -0
- package/src/plugins/defaults/memory/v2/sweep-job.ts +323 -0
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +316 -0
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +1163 -0
- package/src/plugins/defaults/memory/v3/__tests__/dense.test.ts +211 -0
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +247 -0
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +685 -0
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +365 -0
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +1012 -0
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +977 -0
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +599 -0
- package/src/plugins/defaults/memory/v3/__tests__/render-injection.test.ts +128 -0
- package/src/plugins/defaults/memory/v3/__tests__/section-dense-store.test.ts +756 -0
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +422 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +501 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +885 -0
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +96 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +197 -0
- package/src/plugins/defaults/memory/v3/capabilities.ts +88 -0
- package/src/plugins/defaults/memory/v3/card.ts +160 -0
- package/src/plugins/defaults/memory/v3/dense.ts +108 -0
- package/src/plugins/defaults/memory/v3/edge.ts +252 -0
- package/src/plugins/defaults/memory/v3/entity-lane.test.ts +124 -0
- package/src/plugins/defaults/memory/v3/entity-lane.ts +113 -0
- package/src/plugins/defaults/memory/v3/ever-injected-store.test.ts +307 -0
- package/src/plugins/defaults/memory/v3/ever-injected-store.ts +278 -0
- package/src/plugins/defaults/memory/v3/hot-set.test.ts +143 -0
- package/src/plugins/defaults/memory/v3/hot-set.ts +85 -0
- package/src/plugins/defaults/memory/v3/injector.ts +423 -0
- package/src/plugins/defaults/memory/v3/learned-edges.test.ts +169 -0
- package/src/plugins/defaults/memory/v3/learned-edges.ts +178 -0
- package/src/plugins/defaults/memory/v3/maintain-job.ts +988 -0
- package/src/plugins/defaults/memory/v3/orchestrate.ts +483 -0
- package/src/plugins/defaults/memory/v3/page-content.ts +102 -0
- package/src/plugins/defaults/memory/v3/pool-select.test.ts +147 -0
- package/src/plugins/defaults/memory/v3/pool-select.ts +586 -0
- package/src/plugins/defaults/memory/v3/prune.test.ts +760 -0
- package/src/plugins/defaults/memory/v3/prune.ts +469 -0
- package/src/plugins/defaults/memory/v3/render-injection.ts +92 -0
- package/src/plugins/defaults/memory/v3/section-dense-store.ts +471 -0
- package/src/plugins/defaults/memory/v3/section-needle.ts +215 -0
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +277 -0
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +656 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +91 -0
- package/src/plugins/defaults/memory/v3/types.ts +130 -0
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +731 -0
- package/src/plugins/defaults/session/injectors.ts +84 -0
- package/src/plugins/defaults/session/package.json +14 -0
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +6 -2
- package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +39 -45
- package/src/plugins/defaults/title-generate/hooks/stop.ts +4 -5
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +3 -3
- package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +5 -3
- package/src/plugins/defaults/turn-context/injectors.ts +52 -0
- package/src/plugins/defaults/turn-context/package.json +14 -0
- package/src/plugins/defaults/workspace/injectors.ts +295 -0
- package/src/plugins/defaults/workspace/package.json +14 -0
- package/src/plugins/injector-registry.ts +127 -0
- package/src/plugins/job-handler-registry.ts +94 -0
- package/src/plugins/mtime-cache.ts +1 -1
- package/src/plugins/pipeline.ts +1 -1
- package/src/plugins/registry.ts +37 -172
- package/src/plugins/types.ts +36 -1
- package/src/prompts/system-prompt.ts +1 -1
- package/src/providers/__tests__/connection-model-compat.test.ts +1 -1
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +1 -1
- package/src/providers/__tests__/inference.test.ts +6 -6
- package/src/providers/__tests__/placeholder-sentinels.test.ts +80 -0
- package/src/providers/__tests__/retry-callsite.test.ts +31 -3
- package/src/providers/__tests__/satellite-connection-routing.test.ts +1 -1
- package/src/providers/anthropic/client.ts +23 -24
- package/src/providers/call-site-routing.ts +1 -1
- package/src/providers/connection-resolution.ts +7 -3
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +7 -8
- package/src/providers/inference/__tests__/base-url-security.test.ts +8 -8
- package/src/providers/inference/__tests__/connections-label.test.ts +5 -5
- package/src/providers/inference/__tests__/connections-openai-compatible.test.ts +4 -4
- package/src/providers/inference/backfill.ts +9 -5
- package/src/providers/inference/connections.ts +2 -2
- package/src/providers/inference/resolve-auth.ts +3 -3
- package/src/providers/model-catalog.ts +38 -0
- package/src/providers/placeholder-sentinels.ts +50 -15
- package/src/providers/provider-send-message.ts +1 -1
- package/src/providers/registry.ts +2 -0
- package/src/providers/retry.ts +16 -0
- package/src/providers/stop-reasons.ts +32 -0
- package/src/providers/usage-tracking.ts +1 -1
- package/src/runtime/__tests__/agent-wake.test.ts +100 -29
- package/src/runtime/__tests__/background-job-runner.test.ts +19 -2
- package/src/runtime/__tests__/channel-verification-service.test.ts +9 -5
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +7 -5
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +3 -3
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +1 -1
- package/src/runtime/access-request-helper.ts +3 -3
- package/src/runtime/agent-wake.ts +56 -11
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/background-job-runner.ts +30 -10
- package/src/runtime/channel-reply-delivery.ts +3 -3
- package/src/runtime/channel-retry-sweep.ts +23 -3
- package/src/runtime/channel-verification-service.ts +9 -9
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/finalize-event-delivery.ts +2 -2
- package/src/runtime/guardian-action-service.ts +1 -2
- package/src/runtime/guardian-reply-router.ts +1 -1
- package/src/runtime/http-server.ts +45 -1
- package/src/runtime/invite-redemption-service.ts +11 -3
- package/src/runtime/invite-service.ts +6 -4
- package/src/runtime/migrations/vbundle-streaming-importer.ts +1 -1
- package/src/runtime/pre-first-message-gate.ts +1 -1
- package/src/runtime/routes/__tests__/acp-routes.test.ts +74 -8
- package/src/runtime/routes/__tests__/backup-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +17 -23
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +3 -3
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +5 -5
- package/src/runtime/routes/__tests__/contact-routes.test.ts +90 -9
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +5 -5
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +5 -5
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +12 -12
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +21 -7
- package/src/runtime/routes/__tests__/memory-worker-routes.test.ts +306 -0
- package/src/runtime/routes/__tests__/ps-routes.test.ts +114 -0
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +4 -4
- 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/__tests__/wake-conversation-routes.test.ts +125 -0
- package/src/runtime/routes/acp-routes-event-log.test.ts +283 -0
- package/src/runtime/routes/acp-routes-list.test.ts +24 -25
- package/src/runtime/routes/acp-routes.test.ts +4 -4
- package/src/runtime/routes/acp-routes.ts +31 -4
- package/src/runtime/routes/app-management-routes.ts +9 -9
- package/src/runtime/routes/app-routes.ts +3 -7
- package/src/runtime/routes/approval-routes.ts +2 -4
- package/src/runtime/routes/attachment-routes.ts +2 -2
- package/src/runtime/routes/audit-routes.ts +2 -3
- package/src/runtime/routes/background-wake-routes.ts +19 -5
- package/src/runtime/routes/backup-routes.ts +1 -1
- package/src/runtime/routes/bookmark-routes.ts +3 -3
- package/src/runtime/routes/brain-graph-routes.ts +2 -2
- package/src/runtime/routes/btw-routes.ts +1 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +1 -1
- package/src/runtime/routes/channel-delivery-routes.ts +1 -1
- package/src/runtime/routes/channel-readiness-routes.ts +7 -3
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +3 -8
- package/src/runtime/routes/consolidation-routes.ts +6 -6
- package/src/runtime/routes/contact-routes.ts +66 -15
- package/src/runtime/routes/conversation-attention-routes.ts +2 -2
- package/src/runtime/routes/conversation-cli-routes.ts +32 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +4 -4
- package/src/runtime/routes/conversation-list-routes.ts +9 -9
- package/src/runtime/routes/conversation-management-routes.ts +9 -9
- package/src/runtime/routes/conversation-query-routes.ts +34 -11
- package/src/runtime/routes/conversation-routes.ts +99 -16
- package/src/runtime/routes/conversation-starter-routes.ts +11 -5
- package/src/runtime/routes/conversations-import-routes.ts +10 -6
- package/src/runtime/routes/debug-routes.ts +3 -3
- package/src/runtime/routes/defer-routes.ts +4 -4
- package/src/runtime/routes/documents-routes.ts +1 -1
- package/src/runtime/routes/empty-state-greeting-cache.ts +1 -1
- package/src/runtime/routes/events-routes.ts +4 -4
- package/src/runtime/routes/filing-routes.ts +1 -1
- package/src/runtime/routes/global-search-routes.ts +4 -4
- package/src/runtime/routes/group-routes.ts +1 -1
- package/src/runtime/routes/guardian-action-routes.ts +1 -1
- package/src/runtime/routes/heartbeat-routes.ts +2 -2
- package/src/runtime/routes/home-feed-routes.ts +10 -5
- package/src/runtime/routes/identity-routes.ts +33 -14
- package/src/runtime/routes/inbound-conversation.ts +3 -3
- package/src/runtime/routes/inbound-message-handler.ts +25 -25
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +8 -4
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +13 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +5 -5
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +11 -11
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +12 -12
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +2 -2
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +1 -1
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +1 -1
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +8 -8
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +5 -2
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +1 -1
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +1 -1
- package/src/runtime/routes/index.ts +6 -4
- package/src/runtime/routes/inference-profile-session-handler.ts +2 -2
- package/src/runtime/routes/inference-profile-session-reaper.ts +1 -1
- package/src/runtime/routes/inference-provider-connection-routes.ts +5 -2
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +3 -4
- package/src/runtime/routes/integrations/slack/share.ts +1 -1
- package/src/runtime/routes/internal-telemetry-routes.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +2 -2
- package/src/runtime/routes/memory-worker-routes.ts +227 -0
- package/src/runtime/routes/migration-rollback-routes.ts +11 -12
- package/src/runtime/routes/migration-routes.ts +143 -5
- package/src/runtime/routes/notification-routes.ts +2 -2
- package/src/runtime/routes/platform-routes.ts +3 -0
- package/src/runtime/routes/playground/helpers.ts +3 -3
- package/src/runtime/routes/ps-routes.ts +37 -66
- package/src/runtime/routes/publish-routes.ts +3 -3
- package/src/runtime/routes/rename-conversation-routes.ts +1 -1
- package/src/runtime/routes/retrospective-routes.ts +5 -5
- package/src/runtime/routes/schedule-routes.ts +42 -40
- package/src/runtime/routes/secret-routes.ts +10 -9
- package/src/runtime/routes/sequence-routes.ts +1 -1
- package/src/runtime/routes/settings-routes.ts +18 -9
- package/src/runtime/routes/skills-routes.ts +11 -1
- package/src/runtime/routes/slack-channel-routes.ts +4 -4
- package/src/runtime/routes/subagents-routes.ts +2 -2
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -1
- package/src/runtime/routes/task-routes.ts +18 -29
- package/src/runtime/routes/telemetry-routes.ts +1 -1
- package/src/runtime/routes/trace-event-routes.ts +1 -1
- package/src/runtime/routes/types.ts +7 -0
- package/src/runtime/routes/usage-routes.ts +2 -2
- package/src/runtime/routes/wake-conversation-routes.ts +44 -8
- package/src/runtime/routes/wipe-conversation-routes.ts +3 -3
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +1 -1
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
- package/src/runtime/services/__tests__/auto-analysis-enqueue.test.ts +362 -0
- package/src/runtime/services/__tests__/auto-analysis-guard.test.ts +57 -0
- package/src/runtime/services/__tests__/conversation-analyze-job.test.ts +178 -0
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +1 -1
- package/src/runtime/services/analyze-conversation.ts +22 -13
- package/src/runtime/services/auto-analysis-enqueue.ts +130 -0
- package/src/runtime/services/auto-analysis-guard.ts +13 -0
- package/src/runtime/services/conversation-analyze-job.ts +53 -0
- package/src/runtime/services/conversation-serializer.ts +5 -5
- package/src/runtime/tool-grant-request-helper.ts +1 -1
- package/src/schedule/retry-policy.ts +8 -8
- package/src/schedule/run-script.ts +7 -2
- package/src/schedule/schedule-recovery.ts +8 -5
- package/src/schedule/schedule-store.ts +270 -162
- package/src/schedule/schedule-usage-store.ts +2 -2
- package/src/schedule/scheduler-types.ts +6 -0
- package/src/schedule/scheduler.ts +189 -59
- package/src/security/auth-fallback-events-store.ts +94 -0
- package/src/security/redaction.ts +18 -14
- package/src/sequence/engine.ts +1 -1
- package/src/sequence/store.ts +3 -3
- package/src/services/published-app-updater.ts +2 -2
- package/src/signals/cancel.ts +1 -1
- package/src/signals/user-message.ts +2 -2
- package/src/skills/catalog-install.ts +2 -1
- package/src/skills/clawhub.ts +1 -0
- package/src/skills/install-meta.ts +44 -0
- package/src/skills/managed-store.ts +101 -3
- package/src/skills/skillssh-registry.ts +1 -0
- package/src/skills/version-hash.ts +20 -0
- package/src/subagent/manager.ts +5 -4
- package/src/tasks/task-compiler.ts +2 -2
- package/src/tasks/task-runner.ts +3 -3
- package/src/tasks/task-store.ts +2 -2
- package/src/telemetry/__tests__/watchdog-events-store.test.ts +161 -0
- package/src/telemetry/skill-loaded-events-store.test.ts +152 -0
- package/src/telemetry/skill-loaded-events-store.ts +95 -0
- package/src/telemetry/tool-executed-events-store.test.ts +219 -0
- package/src/telemetry/tool-executed-events-store.ts +102 -0
- package/src/telemetry/tool-usage-store.ts +114 -0
- package/src/telemetry/trace-event-store.ts +133 -0
- package/src/telemetry/turn-events-store.ts +173 -0
- package/src/telemetry/turn-trace-store.test.ts +736 -0
- package/src/telemetry/turn-trace-store.ts +364 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +12 -12
- package/src/telemetry/usage-telemetry-reporter.ts +46 -17
- package/src/telemetry/watchdog-events-store.ts +87 -0
- package/src/tools/__tests__/run-standalone.test.ts +19 -0
- package/src/tools/acp/spawn.test.ts +18 -7
- package/src/tools/acp/spawn.ts +1 -0
- package/src/tools/apps/executors.ts +2 -2
- package/src/tools/apps/resolve-app-id.ts +1 -1
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +3 -3
- package/src/tools/document/document-comment-tool.test.ts +2 -2
- package/src/tools/filesystem/write.ts +5 -4
- package/src/tools/policy-context.ts +21 -0
- package/src/tools/registry.ts +31 -1
- package/src/tools/run-standalone.ts +101 -0
- package/src/tools/schedule/create.ts +2 -2
- package/src/tools/schedule/delete.ts +1 -1
- package/src/tools/schedule/update.ts +1 -1
- package/src/tools/skills/find-similar-skills.test.ts +277 -0
- package/src/tools/skills/find-similar-skills.ts +120 -0
- package/src/tools/skills/scaffold-managed.ts +123 -4
- package/src/tools/subagent/read.ts +1 -1
- package/src/tools/subagent/spawn.ts +1 -1
- package/src/tools/tool-approval-handler.ts +1 -1
- package/src/tools/tool-manifest.ts +1 -1
- package/src/tools/types.ts +11 -0
- package/src/usage/types.ts +7 -0
- package/src/util/__tests__/process-tree.test.ts +123 -0
- package/src/util/device-id.ts +52 -12
- package/src/util/platform.ts +0 -14
- package/src/util/process-tree.ts +203 -0
- package/src/util/sqlite-retry.ts +90 -0
- package/src/watcher/__tests__/telemetry.test.ts +2 -2
- package/src/watcher/telemetry.ts +2 -2
- package/src/watcher/watcher-store.ts +3 -3
- package/src/work-items/work-item-store.ts +2 -2
- package/src/workflows/engine-integration.test.ts +2 -2
- package/src/workflows/engine.test.ts +2 -2
- package/src/workflows/fanout-load.test.ts +2 -2
- package/src/workflows/journal-store.test.ts +3 -3
- package/src/workflows/journal-store.ts +1 -1
- package/src/workflows/leaf-runner.test.ts +9 -6
- package/src/workflows/leaf-runner.ts +1 -1
- package/src/workspace/heartbeat-service.ts +29 -0
- package/src/workspace/migrations/011-backfill-installation-id.ts +1 -1
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +5 -2
- package/src/workspace/migrations/031-drop-user-md.ts +26 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +1 -1
- package/src/workspace/migrations/113-swap-balanced-profile-to-glm-5p2.ts +101 -0
- package/src/workspace/migrations/114-swap-quality-profile-to-opus.ts +83 -0
- package/src/workspace/migrations/115-drop-frontier-profile.ts +129 -0
- package/src/workspace/migrations/116-rename-memory-plugin-disabled-sentinel.ts +53 -0
- package/src/workspace/migrations/117-normalize-stale-lean-memory-v3-defaults.ts +116 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +5 -2
- package/src/workspace/migrations/rebuild-conversation-disk-view.ts +4 -4
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +0 -277
- package/src/__tests__/slack-block-formatting.test.ts +0 -173
- package/src/background-wake/runtime-registry.ts +0 -24
- package/src/contacts/contact-events.ts +0 -21
- package/src/daemon/__tests__/meet-host-supervisor.test.ts +0 -587
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +0 -476
- package/src/daemon/meet-host-startup.ts +0 -51
- package/src/daemon/meet-host-supervisor.ts +0 -782
- package/src/daemon/meet-manifest-loader.ts +0 -396
- package/src/daemon/server.ts +0 -423
- package/src/filing/filing-service.ts +0 -429
- package/src/memory/__tests__/301-create-watchdog-events.test.ts +0 -110
- package/src/memory/__tests__/activation-session-store.test.ts +0 -41
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +0 -359
- package/src/memory/__tests__/auto-analysis-guard.test.ts +0 -57
- package/src/memory/__tests__/bookmark-crud.test.ts +0 -264
- package/src/memory/__tests__/bookmark-schema.test.ts +0 -181
- package/src/memory/__tests__/compaction-log-store-clickhouse.test.ts +0 -432
- package/src/memory/__tests__/conversation-analyze-job.test.ts +0 -178
- package/src/memory/__tests__/conversation-group-migration.test.ts +0 -99
- package/src/memory/__tests__/conversation-queries.test.ts +0 -843
- package/src/memory/__tests__/conversation-types.test.ts +0 -36
- package/src/memory/__tests__/db-async-query.test.ts +0 -165
- package/src/memory/__tests__/db-logs-attach.test.ts +0 -110
- package/src/memory/__tests__/db-maintenance.test.ts +0 -235
- package/src/memory/__tests__/db-memory-attach.test.ts +0 -113
- package/src/memory/__tests__/embedding-cache.test.ts +0 -136
- package/src/memory/__tests__/find-analysis-conversation.test.ts +0 -197
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +0 -140
- package/src/memory/__tests__/fork-message-copy.test.ts +0 -232
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +0 -241
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +0 -52
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +0 -113
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +0 -505
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +0 -160
- package/src/memory/__tests__/memory-retrospective-job.test.ts +0 -1443
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +0 -544
- package/src/memory/__tests__/memory-retrospective-state.test.ts +0 -195
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -221
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +0 -275
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +0 -103
- package/src/memory/__tests__/message-content.test.ts +0 -35
- package/src/memory/__tests__/onboarding-events-store.test.ts +0 -80
- package/src/memory/__tests__/prompt-override.test.ts +0 -192
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +0 -49
- package/src/memory/__tests__/table-relocation.test.ts +0 -129
- package/src/memory/__tests__/watchdog-events-store.test.ts +0 -161
- package/src/memory/activation-session-store.ts +0 -43
- package/src/memory/anisotropy.ts +0 -443
- package/src/memory/app-store.ts +0 -1058
- package/src/memory/attachments-store.ts +0 -1136
- package/src/memory/auth-fallback-events-store.ts +0 -94
- package/src/memory/auto-analysis-enqueue.ts +0 -127
- package/src/memory/auto-analysis-guard.ts +0 -17
- package/src/memory/canonical-guardian-store.ts +0 -891
- package/src/memory/channel-verification-sessions.ts +0 -557
- package/src/memory/checkpoints.ts +0 -65
- package/src/memory/compaction-ledger-store.ts +0 -107
- package/src/memory/context-search/agent-protocol.ts +0 -428
- package/src/memory/context-search/agent-runner.ts +0 -1310
- package/src/memory/context-search/search.ts +0 -297
- package/src/memory/context-search/sources/conversations.ts +0 -341
- package/src/memory/context-search/sources/memory-v2.ts +0 -600
- package/src/memory/context-search/sources/memory.ts +0 -101
- package/src/memory/context-search/types.ts +0 -48
- package/src/memory/conversation-analyze-job.ts +0 -53
- package/src/memory/conversation-attention-store.ts +0 -689
- package/src/memory/conversation-bootstrap.ts +0 -50
- package/src/memory/conversation-crud.ts +0 -3436
- package/src/memory/conversation-key-store.ts +0 -274
- package/src/memory/conversation-queries.ts +0 -768
- package/src/memory/conversation-starter-checkpoints.ts +0 -64
- package/src/memory/db-async-query.ts +0 -298
- package/src/memory/db-connection.ts +0 -228
- package/src/memory/db-init.ts +0 -265
- package/src/memory/db-maintenance.ts +0 -154
- package/src/memory/embed.ts +0 -73
- package/src/memory/embedding-backend.test.ts +0 -204
- package/src/memory/embedding-backend.ts +0 -862
- package/src/memory/embedding-billing-breaker.ts +0 -96
- package/src/memory/embedding-cache.ts +0 -139
- package/src/memory/embedding-local.ts +0 -587
- package/src/memory/embedding-ollama.ts +0 -79
- package/src/memory/embedding-runtime-manager.ts +0 -573
- package/src/memory/embedding-types.ts +0 -90
- package/src/memory/external-conversation-store.ts +0 -315
- package/src/memory/fork-message-copy.ts +0 -170
- package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +0 -119
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +0 -655
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +0 -321
- package/src/memory/graph/bootstrap.test.ts +0 -280
- package/src/memory/graph/bootstrap.ts +0 -532
- package/src/memory/graph/capability-seed.ts +0 -451
- package/src/memory/graph/consolidation.ts +0 -712
- package/src/memory/graph/conversation-graph-memory.ts +0 -1185
- package/src/memory/graph/decay.ts +0 -195
- package/src/memory/graph/extraction-job.ts +0 -74
- package/src/memory/graph/extraction.ts +0 -1462
- package/src/memory/graph/graph-memory-state-store.ts +0 -50
- package/src/memory/graph/graph-search.test.ts +0 -129
- package/src/memory/graph/graph-search.ts +0 -292
- package/src/memory/graph/image-ref-utils.ts +0 -29
- package/src/memory/graph/injection.ts +0 -469
- package/src/memory/graph/narrative.ts +0 -267
- package/src/memory/graph/pattern-scan.ts +0 -269
- package/src/memory/graph/retriever.test.ts +0 -624
- package/src/memory/graph/retriever.ts +0 -1356
- package/src/memory/graph/store.test.ts +0 -1093
- package/src/memory/graph/store.ts +0 -923
- package/src/memory/graph/tool-handlers.ts +0 -195
- package/src/memory/graph/tools.ts +0 -95
- package/src/memory/guardian-rate-limits.ts +0 -191
- package/src/memory/indexer.ts +0 -406
- package/src/memory/job-handlers/backfill.ts +0 -104
- package/src/memory/job-handlers/cleanup.ts +0 -237
- package/src/memory/job-handlers/conversation-starters.ts +0 -481
- package/src/memory/job-handlers/embedding.test.ts +0 -234
- package/src/memory/job-handlers/embedding.ts +0 -133
- package/src/memory/job-handlers/index-maintenance.ts +0 -111
- package/src/memory/job-handlers/media-processing.ts +0 -120
- package/src/memory/job-handlers/summarization.ts +0 -240
- package/src/memory/job-utils.ts +0 -286
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +0 -559
- package/src/memory/jobs/embed-concept-page.ts +0 -417
- package/src/memory/jobs/embed-pkb-file.test.ts +0 -169
- package/src/memory/jobs/embed-pkb-file.ts +0 -59
- package/src/memory/jobs-store.ts +0 -813
- package/src/memory/jobs-worker.ts +0 -1021
- package/src/memory/llm-request-log-source-clickhouse.ts +0 -521
- package/src/memory/llm-request-log-store.ts +0 -717
- package/src/memory/llm-usage-store.ts +0 -900
- package/src/memory/memory-recall-log-store.ts +0 -172
- package/src/memory/memory-retrospective-constants.ts +0 -50
- package/src/memory/memory-retrospective-enqueue.ts +0 -125
- package/src/memory/memory-retrospective-fork-boundary.ts +0 -94
- package/src/memory/memory-retrospective-job.ts +0 -884
- package/src/memory/memory-retrospective-startup-cleanup.ts +0 -261
- package/src/memory/memory-retrospective-state.ts +0 -245
- package/src/memory/memory-retrospective-trigger-check.ts +0 -91
- package/src/memory/memory-v2-activation-log-store.ts +0 -216
- package/src/memory/memory-v2-concept-frequency.ts +0 -173
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +0 -303
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +0 -365
- package/src/memory/migrations/142-rename-verification-session-id-column.ts +0 -55
- package/src/memory/migrations/182-oauth-providers-display-metadata.ts +0 -20
- package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +0 -179
- package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +0 -64
- package/src/memory/migrations/202-memory-graph-tables.ts +0 -130
- package/src/memory/migrations/203-drop-memory-items-tables.ts +0 -55
- package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +0 -124
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +0 -174
- package/src/memory/migrations/211-memory-recall-logs-query-context.ts +0 -16
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +0 -183
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +0 -76
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +0 -21
- package/src/memory/migrations/243-provider-connections.ts +0 -68
- package/src/memory/migrations/244-provider-connection-status-label.ts +0 -23
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +0 -81
- package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +0 -19
- package/src/memory/migrations/301-create-watchdog-events.ts +0 -45
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +0 -297
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +0 -84
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +0 -192
- package/src/memory/migrations/__tests__/run-migrations.test.ts +0 -378
- package/src/memory/migrations/helpers/relocation.ts +0 -227
- package/src/memory/migrations/validate-migration-state.ts +0 -277
- package/src/memory/onboarding-events-store.ts +0 -161
- package/src/memory/pkb/autoinject.ts +0 -61
- package/src/memory/pkb/context.ts +0 -50
- package/src/memory/pkb/pkb-index.test.ts +0 -368
- package/src/memory/pkb/pkb-index.ts +0 -255
- package/src/memory/pkb/pkb-reconcile.test.ts +0 -251
- package/src/memory/pkb/pkb-reconcile.ts +0 -148
- package/src/memory/pkb/pkb-search.test.ts +0 -586
- package/src/memory/pkb/pkb-search.ts +0 -178
- package/src/memory/pkb/types.ts +0 -67
- package/src/memory/published-pages-store.ts +0 -67
- package/src/memory/qdrant-circuit-breaker.ts +0 -119
- package/src/memory/qdrant-client.test.ts +0 -60
- package/src/memory/qdrant-client.ts +0 -834
- package/src/memory/qdrant-manager.ts +0 -422
- package/src/memory/rerank-local.ts +0 -374
- package/src/memory/schedule-attribution-sql.ts +0 -104
- package/src/memory/schema/acp.ts +0 -34
- package/src/memory/schema/contacts.ts +0 -120
- package/src/memory/schema/conversations.ts +0 -236
- package/src/memory/schema/infrastructure.ts +0 -381
- package/src/memory/scoped-approval-grants.ts +0 -551
- package/src/memory/search/semantic.ts +0 -238
- package/src/memory/segmenter.ts +0 -76
- package/src/memory/shared-app-links-store.ts +0 -130
- package/src/memory/skill-loaded-events-store.test.ts +0 -152
- package/src/memory/skill-loaded-events-store.ts +0 -95
- package/src/memory/sparse-tokenize.ts +0 -49
- package/src/memory/steps.ts +0 -1296
- package/src/memory/task-memory-cleanup.ts +0 -236
- package/src/memory/tool-executed-events-store.test.ts +0 -219
- package/src/memory/tool-executed-events-store.ts +0 -102
- package/src/memory/tool-usage-store.ts +0 -113
- package/src/memory/trace-event-store.ts +0 -133
- package/src/memory/turn-events-store.ts +0 -173
- package/src/memory/turn-trace-store.test.ts +0 -736
- package/src/memory/turn-trace-store.ts +0 -364
- package/src/memory/v2/__tests__/activation-store.test.ts +0 -204
- package/src/memory/v2/__tests__/activation.test.ts +0 -1227
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +0 -504
- package/src/memory/v2/__tests__/cli-command-store.test.ts +0 -429
- package/src/memory/v2/__tests__/consolidation-job.test.ts +0 -747
- package/src/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -189
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +0 -136
- package/src/memory/v2/__tests__/harness-compare.test.ts +0 -186
- package/src/memory/v2/__tests__/harness-oracle.test.ts +0 -257
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +0 -230
- package/src/memory/v2/__tests__/harness-runner.test.ts +0 -135
- package/src/memory/v2/__tests__/injection-events.test.ts +0 -318
- package/src/memory/v2/__tests__/injection.test.ts +0 -2301
- package/src/memory/v2/__tests__/migration.test.ts +0 -939
- package/src/memory/v2/__tests__/page-index.test.ts +0 -760
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +0 -313
- package/src/memory/v2/__tests__/qdrant.test.ts +0 -950
- package/src/memory/v2/__tests__/reranker.test.ts +0 -338
- package/src/memory/v2/__tests__/router.test.ts +0 -1197
- package/src/memory/v2/__tests__/sim.test.ts +0 -670
- package/src/memory/v2/__tests__/skill-content.test.ts +0 -115
- package/src/memory/v2/__tests__/skill-store.test.ts +0 -983
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +0 -292
- package/src/memory/v2/__tests__/static-context.test.ts +0 -223
- package/src/memory/v2/__tests__/sweep-job.test.ts +0 -526
- package/src/memory/v2/activation-store.ts +0 -185
- package/src/memory/v2/activation.ts +0 -548
- package/src/memory/v2/backfill-jobs.ts +0 -296
- package/src/memory/v2/cli-command-store.ts +0 -341
- package/src/memory/v2/consolidation-job.ts +0 -561
- package/src/memory/v2/frontmatter-sweep.ts +0 -98
- package/src/memory/v2/harness/compare.ts +0 -57
- package/src/memory/v2/harness/oracle.ts +0 -145
- package/src/memory/v2/harness/replay-input.ts +0 -240
- package/src/memory/v2/harness/retriever.ts +0 -74
- package/src/memory/v2/harness/router-retriever.ts +0 -43
- package/src/memory/v2/injected-block-slugs.ts +0 -79
- package/src/memory/v2/injection-events.ts +0 -101
- package/src/memory/v2/injection.ts +0 -932
- package/src/memory/v2/migration.ts +0 -776
- package/src/memory/v2/page-index.ts +0 -459
- package/src/memory/v2/page-store.ts +0 -443
- package/src/memory/v2/prompts/consolidation.ts +0 -857
- package/src/memory/v2/prompts/router.ts +0 -148
- package/src/memory/v2/qdrant.ts +0 -892
- package/src/memory/v2/reranker.ts +0 -184
- package/src/memory/v2/router.ts +0 -601
- package/src/memory/v2/sim.ts +0 -296
- package/src/memory/v2/skill-content.ts +0 -61
- package/src/memory/v2/skill-store.ts +0 -431
- package/src/memory/v2/sparse-bm25.ts +0 -245
- package/src/memory/v2/static-context.ts +0 -100
- package/src/memory/v2/sweep-job.ts +0 -320
- package/src/memory/v3-eval/eval-packets.ts +0 -731
- package/src/memory/watchdog-events-store.ts +0 -87
- package/src/memory/worker-control.ts +0 -204
- package/src/memory/worker-process.ts +0 -89
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +0 -116
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +0 -370
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +0 -41
- package/src/plugins/defaults/memory-retrieval/injectors.ts +0 -1061
- package/src/plugins/defaults/memory-retrieval/package.json +0 -14
- package/src/plugins/defaults/memory-retrieval/tail-reinjection-strip.ts +0 -64
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +0 -1164
- package/src/plugins/defaults/memory-v3-shadow/__tests__/dense.test.ts +0 -192
- package/src/plugins/defaults/memory-v3-shadow/__tests__/edge.test.ts +0 -247
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +0 -717
- package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +0 -365
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +0 -736
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +0 -839
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +0 -598
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +0 -128
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +0 -710
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +0 -425
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +0 -493
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +0 -856
- package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +0 -91
- package/src/plugins/defaults/memory-v3-shadow/card.ts +0 -160
- package/src/plugins/defaults/memory-v3-shadow/dense.ts +0 -97
- package/src/plugins/defaults/memory-v3-shadow/edge.ts +0 -252
- package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.test.ts +0 -305
- package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.ts +0 -278
- package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +0 -14
- package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +0 -19
- package/src/plugins/defaults/memory-v3-shadow/hot-set.test.ts +0 -138
- package/src/plugins/defaults/memory-v3-shadow/hot-set.ts +0 -85
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +0 -453
- package/src/plugins/defaults/memory-v3-shadow/learned-edges.test.ts +0 -169
- package/src/plugins/defaults/memory-v3-shadow/learned-edges.ts +0 -178
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +0 -794
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +0 -431
- package/src/plugins/defaults/memory-v3-shadow/package.json +0 -14
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +0 -102
- package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +0 -146
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +0 -578
- package/src/plugins/defaults/memory-v3-shadow/prune.test.ts +0 -758
- package/src/plugins/defaults/memory-v3-shadow/prune.ts +0 -471
- package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +0 -92
- package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +0 -422
- package/src/plugins/defaults/memory-v3-shadow/section-needle.ts +0 -200
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +0 -281
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +0 -642
- package/src/plugins/defaults/memory-v3-shadow/types.ts +0 -127
- package/src/plugins/feature-gate.ts +0 -22
- package/src/runtime/__tests__/slack-block-formatting.test.ts +0 -510
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +0 -165
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +0 -347
- package/src/runtime/routes/memory-eval-routes.ts +0 -179
- package/src/runtime/routes/memory-item-routes.test.ts +0 -912
- package/src/runtime/routes/memory-item-routes.ts +0 -815
- package/src/runtime/routes/memory-v2-routes.ts +0 -850
- package/src/runtime/routes/memory-v3-routes.ts +0 -122
- package/src/runtime/routes/secrets-deps.ts +0 -24
- package/src/runtime/slack-block-formatting.ts +0 -586
- package/src/tools/memory/register.test.ts +0 -382
- package/src/tools/memory/register.ts +0 -81
- /package/src/{memory → apps}/app-git-service.ts +0 -0
- /package/src/{memory → channels}/slack-thread-store.ts +0 -0
- /package/src/{memory → home}/conversation-starter-validation.ts +0 -0
- /package/src/{memory → persistence}/auto-analysis-constants.ts +0 -0
- /package/src/{memory → persistence}/bookmark-crud.ts +0 -0
- /package/src/{memory → persistence}/cleanup-schedule-state.ts +0 -0
- /package/src/{memory → persistence}/compaction-log-store-clickhouse.ts +0 -0
- /package/src/{memory → persistence}/conversation-directories.ts +0 -0
- /package/src/{memory → persistence}/conversation-disk-view.ts +0 -0
- /package/src/{memory → persistence}/conversation-display-order-migration.ts +0 -0
- /package/src/{memory → persistence}/conversation-group-migration.ts +0 -0
- /package/src/{memory → persistence}/conversation-title-service.ts +0 -0
- /package/src/{memory → persistence}/conversation-types.ts +0 -0
- /package/src/{memory → persistence}/db-singleton.ts +0 -0
- /package/src/{memory → persistence}/delivery-channels.ts +0 -0
- /package/src/{memory → persistence}/delivery-crud.ts +0 -0
- /package/src/{memory → persistence}/delivery-status.ts +0 -0
- /package/src/{memory → persistence/embeddings}/__tests__/sparse-tokenize.test.ts +0 -0
- /package/src/{memory → persistence/embeddings}/embedding-gemini.test.ts +0 -0
- /package/src/{memory → persistence/embeddings}/embedding-gemini.ts +0 -0
- /package/src/{memory → persistence/embeddings}/embedding-openai.ts +0 -0
- /package/src/{memory → persistence/embeddings}/embedding-types.test.ts +0 -0
- /package/src/{memory → persistence}/fingerprint.ts +0 -0
- /package/src/{memory → persistence}/group-crud.ts +0 -0
- /package/src/{memory → persistence}/invite-store.ts +0 -0
- /package/src/{memory → persistence}/lifecycle-events-store.ts +0 -0
- /package/src/{memory → persistence}/llm-request-log-source-local.ts +0 -0
- /package/src/{memory → persistence}/llm-request-log-source.ts +0 -0
- /package/src/{memory → persistence}/media-store.ts +0 -0
- /package/src/{memory → persistence}/message-content.ts +0 -0
- /package/src/{memory → persistence}/migrations/000-core-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/001-job-deferrals.ts +0 -0
- /package/src/{memory → persistence}/migrations/002-tool-invocations-fk.ts +0 -0
- /package/src/{memory → persistence}/migrations/003-memory-fts-backfill.ts +0 -0
- /package/src/{memory → persistence}/migrations/004-entity-relation-dedup.ts +0 -0
- /package/src/{memory → persistence}/migrations/005-fingerprint-scope-unique.ts +0 -0
- /package/src/{memory → persistence}/migrations/006-scope-salted-fingerprints.ts +0 -0
- /package/src/{memory → persistence}/migrations/007-assistant-id-to-self.ts +0 -0
- /package/src/{memory → persistence}/migrations/008-remove-assistant-id-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/009-llm-usage-events-drop-assistant-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/011-call-sessions-provider-sid-dedup.ts +0 -0
- /package/src/{memory → persistence}/migrations/012-call-sessions-add-initiated-from.ts +0 -0
- /package/src/{memory → persistence}/migrations/013-guardian-action-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/014-backfill-inbox-thread-state.ts +0 -0
- /package/src/{memory → persistence}/migrations/015-drop-active-search-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/016-memory-segments-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/017-memory-items-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/018-remaining-table-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/019-notification-tables-schema-migration.ts +0 -0
- /package/src/{memory → persistence}/migrations/020-rename-macos-ios-channel-to-vellum.ts +0 -0
- /package/src/{memory → persistence}/migrations/021-conversation-status-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/022-add-origin-interface.ts +0 -0
- /package/src/{memory → persistence}/migrations/023-memory-item-sources-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/024-embedding-vector-blob.ts +0 -0
- /package/src/{memory → persistence}/migrations/025-messages-fts-backfill.ts +0 -0
- /package/src/{memory → persistence}/migrations/026-guardian-verification-sessions.ts +0 -0
- /package/src/{memory → persistence}/migrations/026a-embeddings-nullable-vector-json.ts +0 -0
- /package/src/{memory → persistence}/migrations/027-notification-delivery-pairing-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/027a-guardian-bootstrap-token.ts +0 -0
- /package/src/{memory → persistence}/migrations/028-call-session-mode.ts +0 -0
- /package/src/{memory → persistence}/migrations/028-notification-delivery-client-ack.ts +0 -0
- /package/src/{memory → persistence}/migrations/029-channel-inbound-delivered-segments.ts +0 -0
- /package/src/{memory → persistence}/migrations/030-guardian-action-followup.ts +0 -0
- /package/src/{memory → persistence}/migrations/030-guardian-verification-purpose.ts +0 -0
- /package/src/{memory → persistence}/migrations/031-conversations-thread-type-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/032-guardian-delivery-conversation-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/032-notification-delivery-thread-decision.ts +0 -0
- /package/src/{memory → persistence}/migrations/033-scoped-approval-grants.ts +0 -0
- /package/src/{memory → persistence}/migrations/034-guardian-action-tool-metadata.ts +0 -0
- /package/src/{memory → persistence}/migrations/035-guardian-action-supersession.ts +0 -0
- /package/src/{memory → persistence}/migrations/036-normalize-phone-identities.ts +0 -0
- /package/src/{memory → persistence}/migrations/037-voice-invite-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/040-invite-code-hash-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/041-approval-prompt-ts-tracker.ts +0 -0
- /package/src/{memory → persistence}/migrations/101-watchers-and-logs.ts +0 -0
- /package/src/{memory → persistence}/migrations/102-alter-table-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/104-core-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/105-contacts-and-triage.ts +0 -0
- /package/src/{memory → persistence}/migrations/106-call-sessions.ts +0 -0
- /package/src/{memory → persistence}/migrations/107-followups.ts +0 -0
- /package/src/{memory → persistence}/migrations/108-tasks-and-work-items.ts +0 -0
- /package/src/{memory → persistence}/migrations/109-external-conversation-bindings.ts +0 -0
- /package/src/{memory → persistence}/migrations/110-channel-guardian.ts +0 -0
- /package/src/{memory → persistence}/migrations/111-media-assets.ts +0 -0
- /package/src/{memory → persistence}/migrations/112-assistant-inbox.ts +0 -0
- /package/src/{memory → persistence}/migrations/114-notifications.ts +0 -0
- /package/src/{memory → persistence}/migrations/115-sequences.ts +0 -0
- /package/src/{memory → persistence}/migrations/116-messages-fts.ts +0 -0
- /package/src/{memory → persistence}/migrations/117-conversation-attention.ts +0 -0
- /package/src/{memory → persistence}/migrations/118-reminder-routing-intent.ts +0 -0
- /package/src/{memory → persistence}/migrations/119-schema-indexes-and-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/120-fk-cascade-rebuilds.ts +0 -0
- /package/src/{memory → persistence}/migrations/121-canonical-guardian-requests.ts +0 -0
- /package/src/{memory → persistence}/migrations/122-canonical-guardian-requester-chat-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/123-canonical-guardian-deliveries-destination-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/124-voice-invite-display-metadata.ts +0 -0
- /package/src/{memory → persistence}/migrations/125-guardian-principal-id-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/127-guardian-principal-id-not-null.ts +0 -0
- /package/src/{memory → persistence}/migrations/128-contacts-role-principal.ts +0 -0
- /package/src/{memory → persistence}/migrations/129-contact-channels-access-fields.ts +0 -0
- /package/src/{memory → persistence}/migrations/130-contact-channels-type-ext-chat-id-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/131-drop-legacy-member-guardian-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/132-contacts-assistant-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/133-assistant-contact-metadata.ts +0 -0
- /package/src/{memory → persistence}/migrations/134-contacts-notes-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/135-backfill-contact-interaction-stats.ts +0 -0
- /package/src/{memory → persistence}/migrations/136-drop-assistant-id-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/137-usage-dashboard-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/139-drop-usage-composite-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/141-rename-verification-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/143-rename-guardian-verification-values.ts +0 -0
- /package/src/{memory → persistence}/migrations/144-rename-voice-to-phone.ts +0 -0
- /package/src/{memory → persistence}/migrations/145-drop-accounts-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/146-schedule-oneshot-routing.ts +0 -0
- /package/src/{memory → persistence}/migrations/147-migrate-reminders-to-schedules.ts +0 -0
- /package/src/{memory → persistence}/migrations/148-drop-reminders-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/149-oauth-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/150-oauth-apps-client-secret-path.ts +0 -0
- /package/src/{memory → persistence}/migrations/151-oauth-providers-ping-url.ts +0 -0
- /package/src/{memory → persistence}/migrations/152-memory-item-supersession.ts +0 -0
- /package/src/{memory → persistence}/migrations/153-drop-entity-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/154-drop-fts.ts +0 -0
- /package/src/{memory → persistence}/migrations/155-drop-conflicts.ts +0 -0
- /package/src/{memory → persistence}/migrations/156-call-session-invite-metadata.ts +0 -0
- /package/src/{memory → persistence}/migrations/157-invite-contact-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/158-channel-interaction-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/159-drop-contact-interaction-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/160-drop-loopback-port-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/161-drop-orphaned-media-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/162-guardian-timestamps-epoch-ms.ts +0 -0
- /package/src/{memory → persistence}/migrations/163-rename-notification-thread-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/164-rename-conversation-type-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/165-rename-inbox-thread-state-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/166-rename-followups-thread-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/167-rename-sequence-enrollments-thread-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/168-rename-sequence-steps-reply-key.ts +0 -0
- /package/src/{memory → persistence}/migrations/169-rename-gmail-provider-key-to-google.ts +0 -0
- /package/src/{memory → persistence}/migrations/170-thread-starters-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/171-capability-card-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/172-rename-created-by-session-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/173-rename-source-session-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/174-rename-thread-starters-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/175-create-lifecycle-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/176-drop-capability-card-state.ts +0 -0
- /package/src/{memory → persistence}/migrations/177-create-trace-events-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/178-oauth-providers-managed-service-config-key.ts +0 -0
- /package/src/{memory → persistence}/migrations/179-llm-request-log-message-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/180-backfill-inline-attachments-to-disk.ts +0 -0
- /package/src/{memory → persistence}/migrations/181-rename-thread-starters-checkpoints.ts +0 -0
- /package/src/{memory → persistence}/migrations/183-add-conversation-fork-lineage.ts +0 -0
- /package/src/{memory → persistence}/migrations/184-llm-request-log-provider.ts +0 -0
- /package/src/{memory → persistence}/migrations/188-schedule-quiet-flag.ts +0 -0
- /package/src/{memory → persistence}/migrations/189-drop-simplified-memory.ts +0 -0
- /package/src/{memory → persistence}/migrations/190-call-session-skip-disclosure.ts +0 -0
- /package/src/{memory → persistence}/migrations/191-backfill-audio-attachment-mime-types.ts +0 -0
- /package/src/{memory → persistence}/migrations/192-contacts-user-file-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/193-add-source-type-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/194-memory-recall-logs.ts +0 -0
- /package/src/{memory → persistence}/migrations/195-oauth-providers-ping-config.ts +0 -0
- /package/src/{memory → persistence}/migrations/196-messages-conversation-created-at-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/197-oauth-providers-behavior-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/198-drop-setup-skill-id-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/200-usage-llm-call-count.ts +0 -0
- /package/src/{memory → persistence}/migrations/201-oauth-providers-feature-flag.ts +0 -0
- /package/src/{memory → persistence}/migrations/202-drop-callback-transport-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/204-rename-memory-graph-type-values.ts +0 -0
- /package/src/{memory → persistence}/migrations/205-memory-graph-image-refs.ts +0 -0
- /package/src/{memory → persistence}/migrations/206-memory-graph-node-edits.ts +0 -0
- /package/src/{memory → persistence}/migrations/207-conversation-graph-memory-state.ts +0 -0
- /package/src/{memory → persistence}/migrations/208-conversations-last-message-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/210-schedule-reuse-conversation.ts +0 -0
- /package/src/{memory → persistence}/migrations/212-llm-request-logs-created-at-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/213-oauth-providers-scope-separator.ts +0 -0
- /package/src/{memory → persistence}/migrations/214-oauth-providers-refresh-url.ts +0 -0
- /package/src/{memory → persistence}/migrations/215-oauth-providers-revoke.ts +0 -0
- /package/src/{memory → persistence}/migrations/216-oauth-providers-token-auth-method.ts +0 -0
- /package/src/{memory → persistence}/migrations/217-conversation-host-access.ts +0 -0
- /package/src/{memory → persistence}/migrations/218-oauth-providers-logo-url.ts +0 -0
- /package/src/{memory → persistence}/migrations/219-oauth-providers-token-exchange-body-format.ts +0 -0
- /package/src/{memory → persistence}/migrations/221-conversations-archived-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/223-schedule-script-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/224-oauth-providers-managed-service-is-paid.ts +0 -0
- /package/src/{memory → persistence}/migrations/225-oauth-providers-available-scopes.ts +0 -0
- /package/src/{memory → persistence}/migrations/226-schedule-wake-conversation-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/227-add-conversation-inference-profile.ts +0 -0
- /package/src/{memory → persistence}/migrations/228-rename-inference-profile-snake-case.ts +0 -0
- /package/src/{memory → persistence}/migrations/229-delete-private-conversations.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/229-delete-private-conversations.ts +0 -0
- /package/src/{memory → persistence}/migrations/230-acp-session-history.ts +0 -0
- /package/src/{memory → persistence}/migrations/231-repair-memory-graph-event-dates.ts +0 -0
- /package/src/{memory → persistence}/migrations/232-activation-state.ts +0 -0
- /package/src/{memory → persistence}/migrations/233-document-conversations.ts +0 -0
- /package/src/{memory → persistence}/migrations/234-memory-v2-activation-logs.ts +0 -0
- /package/src/{memory → persistence}/migrations/235-llm-usage-attribution.ts +0 -0
- /package/src/{memory → persistence}/migrations/235-slack-compaction-watermark.ts +0 -0
- /package/src/{memory → persistence}/migrations/237-heartbeat-runs.ts +0 -0
- /package/src/{memory → persistence}/migrations/238-schedule-retry-policy.ts +0 -0
- /package/src/{memory → persistence}/migrations/239-trace-events-created-at-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/240-conversation-inference-profile-session.ts +0 -0
- /package/src/{memory → persistence}/migrations/241-activation-state-fk-cascade.ts +0 -0
- /package/src/{memory → persistence}/migrations/242-message-bookmarks.ts +0 -0
- /package/src/{memory → persistence}/migrations/245-memory-retrospective-state.ts +0 -0
- /package/src/{memory → persistence}/migrations/247-external-conversation-binding-thread-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/248-create-onboarding-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/249-normalize-slack-external-content.ts +0 -0
- /package/src/{memory → persistence}/migrations/250-provider-connection-base-url-and-models.ts +0 -0
- /package/src/{memory → persistence}/migrations/251-a2a-tasks.ts +0 -0
- /package/src/{memory → persistence}/migrations/252-llm-request-log-agent-loop-exit-reason.ts +0 -0
- /package/src/{memory → persistence}/migrations/253-conversation-last-notified-profile.ts +0 -0
- /package/src/{memory → persistence}/migrations/253-document-comments.ts +0 -0
- /package/src/{memory → persistence}/migrations/254-external-conversation-binding-chat-name.ts +0 -0
- /package/src/{memory → persistence}/migrations/256-memory-v2-injection-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/257-strip-base-url-non-openai-compatible.ts +0 -0
- /package/src/{memory → persistence}/migrations/258-onboarding-events-prior-assistants.ts +0 -0
- /package/src/{memory → persistence}/migrations/259-conversation-cleaned-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/260-rename-cleaned-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/261-llm-usage-add-raw-usage.ts +0 -0
- /package/src/{memory → persistence}/migrations/262-memory-v3-coactivation.ts +0 -0
- /package/src/{memory → persistence}/migrations/263-memory-v3-auto-edges.ts +0 -0
- /package/src/{memory → persistence}/migrations/264-llm-request-log-call-site.ts +0 -0
- /package/src/{memory → persistence}/migrations/265-drop-provider-connection-status.ts +0 -0
- /package/src/{memory → persistence}/migrations/266-messages-client-message-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/267-llm-usage-events-add-assistant-version.ts +0 -0
- /package/src/{memory → persistence}/migrations/268-add-memory-v3-selections.ts +0 -0
- /package/src/{memory → persistence}/migrations/269-schedule-script-timeout.ts +0 -0
- /package/src/{memory → persistence}/migrations/270-messages-role-created-at-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/270-schedule-description.ts +0 -0
- /package/src/{memory → persistence}/migrations/270-schedule-source-conversation.ts +0 -0
- /package/src/{memory → persistence}/migrations/271-create-auth-fallback-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/272-acp-session-history-cwd.ts +0 -0
- /package/src/{memory → persistence}/migrations/273-onboarding-events-funnel-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/274-create-activation-sessions.ts +0 -0
- /package/src/{memory → persistence}/migrations/275-tool-invocations-add-skill-id.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/275-tool-invocations-add-skill-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/276-tool-invocations-created-at-id-index.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/276-tool-invocations-created-at-id-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/277-add-memory-v3-ever-injected.ts +0 -0
- /package/src/{memory → persistence}/migrations/278-tool-invocations-telemetry-columns.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/278-tool-invocations-telemetry-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/279-create-skill-loaded-events.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/279-create-skill-loaded-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/280-conversations-surfaced-at.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/280-conversations-surfaced-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/281-memory-retrospective-remembered-log.ts +0 -0
- /package/src/{memory → persistence}/migrations/282-schedule-inference-profile.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/282-schedule-inference-profile.ts +0 -0
- /package/src/{memory → persistence}/migrations/283-memory-v3-selections-message-id-and-sections.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/283-memory-v3-selections-message-id-and-sections.ts +0 -0
- /package/src/{memory → persistence}/migrations/284-workflow-runs.ts +0 -0
- /package/src/{memory → persistence}/migrations/285-schedule-workflow-mode.ts +0 -0
- /package/src/{memory → persistence}/migrations/286-workflow-run-trust.ts +0 -0
- /package/src/{memory → persistence}/migrations/287-conversation-origin-channel-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/288-backfill-origin-channel-from-bindings.ts +0 -0
- /package/src/{memory → persistence}/migrations/289-contact-channels-unique-ext-user.ts +0 -0
- /package/src/{memory → persistence}/migrations/290-schedule-capabilities.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/290-schedule-capabilities.ts +0 -0
- /package/src/{memory → persistence}/migrations/291-contact-channels-renormalize-addresses.ts +0 -0
- /package/src/{memory → persistence}/migrations/292-schedule-default-no-reuse-conversation.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/292-schedule-default-no-reuse-conversation.ts +0 -0
- /package/src/{memory → persistence}/migrations/293-workflow-journal-leaf-tokens.ts +0 -0
- /package/src/{memory → persistence}/migrations/294-drop-external-user-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/295-drop-approval-prompt-ts-tracker.ts +0 -0
- /package/src/{memory → persistence}/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/296-rewrite-balanced-economy-profile-pins.ts +0 -0
- /package/src/{memory → persistence}/migrations/297-move-llm-request-logs-to-logs-db.ts +0 -0
- /package/src/{memory → persistence}/migrations/298-move-memory-jobs-to-memory-db.ts +0 -0
- /package/src/{memory → persistence}/migrations/299-canonical-guardian-deliveries-conversation-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/300-add-processing-started-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/302-create-compaction-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/303-add-conversation-creation-seq.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/014-backfill-inbox-thread-state.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/131-drop-legacy-member-guardian-tables.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/136-drop-assistant-id-columns.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/234-memory-v2-activation-logs.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/245-memory-retrospective-state.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/281-memory-retrospective-remembered-log.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/291-contact-channels-renormalize-addresses.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/297-move-llm-request-logs.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/run-migrations.ts +0 -0
- /package/src/{memory → persistence}/migrations/schema-introspection.ts +0 -0
- /package/src/{memory → persistence}/raw-query.ts +0 -0
- /package/src/{memory → persistence}/schema/a2a.ts +0 -0
- /package/src/{memory → persistence}/schema/bookmarks.ts +0 -0
- /package/src/{memory → persistence}/schema/calls.ts +0 -0
- /package/src/{memory → persistence}/schema/guardian.ts +0 -0
- /package/src/{memory → persistence}/schema/index.ts +0 -0
- /package/src/{memory → persistence}/schema/inference.ts +0 -0
- /package/src/{memory → persistence}/schema/memory-core.ts +0 -0
- /package/src/{memory → persistence}/schema/memory-graph.ts +0 -0
- /package/src/{memory → persistence}/schema/notifications.ts +0 -0
- /package/src/{memory → persistence}/schema/oauth.ts +0 -0
- /package/src/{memory → persistence}/schema/tasks.ts +0 -0
- /package/src/{memory → persistence}/schema.ts +0 -0
- /package/src/{memory → persistence}/usage-buckets.ts +0 -0
- /package/src/{memory → persistence}/usage-grouped-buckets.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/__tests__/fixtures/memory-v2-activation-fixtures.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/__tests__/memory-retrospective-trigger-check.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/anisotropy.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/context-search/__tests__/agent-runner-redaction.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/context-search/format.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/context-search/limits.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/context-search/sources/workspace.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/decay.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/extraction.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/injection.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/scoring.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/scoring.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/serendipity.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/triggers.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/triggers.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/types.ts +0 -0
- /package/src/plugins/defaults/{memory-retrieval → memory}/hooks/__tests__/user-prompt-submit.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/memory-marker.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/prompt-override.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/retrieval-budget.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/edge-index.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/harness-metrics.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/page-store.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/prompts-router.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/cli-command-content.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/constants.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/edge-index.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/harness/metrics.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/harness/runner.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/harness/trace.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/now-text.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/prompts/sweep.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/types.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/capabilities.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/card.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/fresh-set.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/section-needle.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/sections.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/types.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/card.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/core-set.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/core-set.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/README.md +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/assignments.json +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/core.json +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/leaves/domain-a/topic-x.md +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/leaves/domain-a/topic-y.md +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/leaves/domain-b/topic-z.md +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/fresh-set.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/llm-retry.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/sections.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v3-eval/__tests__/eval-packets.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v3-eval/__tests__/eval-tally.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v3-eval/eval-tally.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/validation.ts +0 -0
- /package/src/plugins/defaults/{memory-retrieval → turn-context}/unified-turn-context.ts +0 -0
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -2,97 +2,72 @@ import { join } from "node:path";
|
|
|
2
2
|
|
|
3
3
|
import { config as dotenvConfig } from "dotenv";
|
|
4
4
|
|
|
5
|
-
import { refreshBackgroundWakeIntent } from "../background-wake/publisher.js";
|
|
6
|
-
import { registerBackgroundWakeRuntime } from "../background-wake/runtime-registry.js";
|
|
7
5
|
import { setPointerMessageProcessor } from "../calls/call-pointer-messages.js";
|
|
8
6
|
import { reconcileCallsOnStartup } from "../calls/call-recovery.js";
|
|
9
7
|
import { setRelayBroadcast } from "../calls/relay-server.js";
|
|
10
8
|
import { TwilioConversationRelayProvider } from "../calls/twilio-provider.js";
|
|
11
9
|
import { setVoiceBridgeDeps } from "../calls/voice-session-bridge.js";
|
|
12
10
|
import { initFeatureFlagOverrides } from "../config/assistant-feature-flags.js";
|
|
13
|
-
import {
|
|
14
|
-
getPlatformAssistantId,
|
|
15
|
-
getRuntimeHttpHost,
|
|
16
|
-
getRuntimeHttpPort,
|
|
17
|
-
setIngressPublicBaseUrl,
|
|
18
|
-
validateEnv,
|
|
19
|
-
} from "../config/env.js";
|
|
11
|
+
import { setIngressPublicBaseUrl, validateEnv } from "../config/env.js";
|
|
20
12
|
import { loadConfig, mergeDefaultWorkspaceConfig } from "../config/loader.js";
|
|
21
|
-
import type { AssistantConfig } from "../config/schema.js";
|
|
22
13
|
import { seedInferenceProfiles } from "../config/seed-inference-profiles.js";
|
|
23
14
|
import { reconcileFlagGatedProfiles } from "../config/sync-gated-profiles.js";
|
|
24
|
-
import
|
|
25
|
-
import {
|
|
15
|
+
import { expireAllPendingCanonicalRequests } from "../contacts/canonical-guardian-store.js";
|
|
16
|
+
import { startCes } from "../credential-execution/ces-runtime.js";
|
|
26
17
|
import { refreshManagedConnectionCache } from "../credential-execution/managed-catalog.js";
|
|
27
|
-
import {
|
|
28
|
-
type CesProcessManager,
|
|
29
|
-
CesUnavailableError,
|
|
30
|
-
createCesProcessManager,
|
|
31
|
-
} from "../credential-execution/process-manager.js";
|
|
32
|
-
import {
|
|
33
|
-
awaitCesClientWithTimeout,
|
|
34
|
-
DEFAULT_CES_STARTUP_TIMEOUT_MS,
|
|
35
|
-
injectCesClientWhenReady,
|
|
36
|
-
} from "../credential-execution/startup-timeout.js";
|
|
37
|
-
import { FilingService } from "../filing/filing-service.js";
|
|
38
|
-
import { HeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
18
|
+
import { startHeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
39
19
|
import { backfillRelationshipStateIfMissing } from "../home/relationship-state-writer.js";
|
|
40
20
|
import { closeSentry, initSentry, setSentryDeviceId } from "../instrument.js";
|
|
41
|
-
import {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
} from "../
|
|
45
|
-
import {
|
|
21
|
+
import { startCliIpcServer } from "../ipc/assistant-server.js";
|
|
22
|
+
import { startGatewayFlagListener } from "../ipc/gateway-flag-listener.js";
|
|
23
|
+
import { startSkillIpcServer } from "../ipc/skill-server.js";
|
|
24
|
+
import { registerMemoryJobHandlers } from "../jobs/register-job-handlers.js";
|
|
25
|
+
import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
|
|
26
|
+
import { seedOAuthProviders } from "../oauth/seed-providers.js";
|
|
46
27
|
import {
|
|
47
28
|
getAttachmentsByIds,
|
|
48
29
|
getSourcePathsForAttachments,
|
|
49
|
-
} from "../
|
|
50
|
-
import {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
import {
|
|
56
|
-
import {
|
|
57
|
-
import {
|
|
58
|
-
import {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
import {
|
|
63
|
-
import {
|
|
30
|
+
} from "../persistence/attachments-store.js";
|
|
31
|
+
import {
|
|
32
|
+
clearStaleProcessingFlags,
|
|
33
|
+
deleteMessageById,
|
|
34
|
+
getMessages,
|
|
35
|
+
} from "../persistence/conversation-crud.js";
|
|
36
|
+
import { getDb } from "../persistence/db-connection.js";
|
|
37
|
+
import { initializeDb } from "../persistence/db-init.js";
|
|
38
|
+
import { selectEmbeddingBackend } from "../persistence/embeddings/embedding-backend.js";
|
|
39
|
+
import {
|
|
40
|
+
initQdrantClient,
|
|
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";
|
|
64
49
|
import {
|
|
65
50
|
startConsentRefresh,
|
|
66
51
|
stopConsentRefresh,
|
|
67
52
|
} from "../platform/consent-cache.js";
|
|
53
|
+
import { syncWorkspaceIdentityToPlatform } from "../platform/sync-identity.js";
|
|
54
|
+
import { sweepConceptPageFrontmatter } from "../plugins/defaults/memory/v2/frontmatter-sweep.js";
|
|
68
55
|
import { ensurePromptFiles } from "../prompts/system-prompt.js";
|
|
69
56
|
import { runProviderConnectionsBackfill } from "../providers/inference/backfill.js";
|
|
70
|
-
import {
|
|
57
|
+
import { initializeProviders } from "../providers/registry.js";
|
|
71
58
|
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
72
59
|
import {
|
|
73
60
|
initAuthSigningKey,
|
|
74
61
|
resolveSigningKey,
|
|
75
62
|
} from "../runtime/auth/token-service.js";
|
|
76
|
-
import {
|
|
63
|
+
import { startRuntimeHttpServer } from "../runtime/http-server.js";
|
|
77
64
|
import { warmLocalGuardianPrincipalCache } from "../runtime/local-actor-identity.js";
|
|
78
65
|
import { recoverInterruptedImport } from "../runtime/migrations/vbundle-streaming-importer.js";
|
|
79
|
-
import {
|
|
80
|
-
import {
|
|
81
|
-
publishConfigChanged,
|
|
82
|
-
publishConversationListChanged,
|
|
83
|
-
} from "../runtime/sync/resource-sync-events.js";
|
|
66
|
+
import { publishConfigChanged } from "../runtime/sync/resource-sync-events.js";
|
|
84
67
|
import { recoverStaleSchedules } from "../schedule/schedule-recovery.js";
|
|
85
68
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
86
|
-
import {
|
|
87
|
-
|
|
88
|
-
onCesClientChanged,
|
|
89
|
-
setCesClient,
|
|
90
|
-
setCesReconnect,
|
|
91
|
-
} from "../security/secure-keys.js";
|
|
92
|
-
import {
|
|
93
|
-
setUsageTelemetryReporter,
|
|
94
|
-
UsageTelemetryReporter,
|
|
95
|
-
} from "../telemetry/usage-telemetry-reporter.js";
|
|
69
|
+
import { rotateToolInvocations } from "../telemetry/tool-usage-store.js";
|
|
70
|
+
import { startUsageTelemetryReporter } from "../telemetry/usage-telemetry-reporter.js";
|
|
96
71
|
import { syncFlagGatedTools } from "../tools/registry.js";
|
|
97
72
|
import { registerBuiltinTtsProviders } from "../tts/providers/register-builtins.js";
|
|
98
73
|
import { getDeviceId } from "../util/device-id.js";
|
|
@@ -109,23 +84,22 @@ import {
|
|
|
109
84
|
} from "../work-items/work-item-store.js";
|
|
110
85
|
import { getWorkflowRunManager } from "../workflows/run-manager.js";
|
|
111
86
|
import { repairAdaptiveThinkingOnManagedProfiles } from "../workspace/adaptive-thinking-repair.js";
|
|
112
|
-
import {
|
|
87
|
+
import { startWorkspaceHeartbeatService } from "../workspace/heartbeat-service.js";
|
|
113
88
|
import { WORKSPACE_MIGRATIONS } from "../workspace/migrations/registry.js";
|
|
114
89
|
import { runWorkspaceMigrations } from "../workspace/migrations/runner.js";
|
|
115
|
-
import {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
} from "./daemon-control.js";
|
|
90
|
+
import { startAppSourceWatcher } from "./app-source-watcher.js";
|
|
91
|
+
import { startConfigWatcher } from "./config-watcher.js";
|
|
92
|
+
import { startConversationEvictor } from "./conversation-evictor.js";
|
|
93
|
+
import { getOrCreateConversation } from "./conversation-store.js";
|
|
94
|
+
import { writePid } from "./daemon-control.js";
|
|
95
|
+
import { setDbReady, setStartupComplete } from "./daemon-readiness.js";
|
|
120
96
|
import {
|
|
121
97
|
evaluateDiskPressureNow,
|
|
122
98
|
startDiskPressureGuard,
|
|
123
99
|
stopDiskPressureGuard,
|
|
124
100
|
} from "./disk-pressure-guard.js";
|
|
125
|
-
import {
|
|
126
|
-
|
|
127
|
-
stopEventLoopWatchdog,
|
|
128
|
-
} from "./event-loop-watchdog.js";
|
|
101
|
+
import { reconcileEmbeddingIdentity } from "./embedding-reconcile.js";
|
|
102
|
+
import { startEventLoopWatchdog } from "./event-loop-watchdog.js";
|
|
129
103
|
import { initializePlugins } from "./external-plugins-bootstrap.js";
|
|
130
104
|
import { backfillSlackInjectionTemplates } from "./handlers/config-slack-channel.js";
|
|
131
105
|
import { installAssistantSymlink } from "./install-symlink.js";
|
|
@@ -133,7 +107,8 @@ import {
|
|
|
133
107
|
maybeRebuildMemoryV2Concepts,
|
|
134
108
|
rebuildBm25CorpusStatsAndReseedSkills,
|
|
135
109
|
} from "./memory-v2-startup.js";
|
|
136
|
-
import { startOrphanReaper
|
|
110
|
+
import { startOrphanReaper } from "./orphan-reaper.js";
|
|
111
|
+
import { elevatePointerConversationToGuardian } from "./pointer-conversation-trust.js";
|
|
137
112
|
import { processMessage } from "./process-message.js";
|
|
138
113
|
import { runProfilerSweep } from "./profiler-run-store.js";
|
|
139
114
|
import {
|
|
@@ -141,10 +116,10 @@ import {
|
|
|
141
116
|
registerMessagingProviders,
|
|
142
117
|
registerWatcherProviders,
|
|
143
118
|
} from "./providers-setup.js";
|
|
144
|
-
import { DaemonServer } from "./server.js";
|
|
145
119
|
import { installShutdownHandlers } from "./shutdown-handlers.js";
|
|
146
120
|
import { registerShutdownHook } from "./shutdown-registry.js";
|
|
147
121
|
import { refreshSkillCapabilityMemories } from "./skill-memory-refresh.js";
|
|
122
|
+
import { broadcastDaemonStatus } from "./status.js";
|
|
148
123
|
|
|
149
124
|
const log = getLogger("lifecycle");
|
|
150
125
|
let diskPressureStartupSampleTimer: ReturnType<typeof setTimeout> | null = null;
|
|
@@ -198,95 +173,6 @@ export function stopDiskPressureGuardForLifecycle(): void {
|
|
|
198
173
|
stopDiskPressureGuard();
|
|
199
174
|
}
|
|
200
175
|
|
|
201
|
-
export interface CesStartupResult {
|
|
202
|
-
client: CesClient | undefined;
|
|
203
|
-
processManager: CesProcessManager | undefined;
|
|
204
|
-
clientPromise: Promise<CesClient | undefined> | undefined;
|
|
205
|
-
abortController: AbortController | undefined;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Start the CES (Credential Execution Service) process and perform the RPC
|
|
210
|
-
* handshake. Returns a promise that resolves with the CES client and process
|
|
211
|
-
* manager. Callers can fire-and-forget — the daemon does not need to await
|
|
212
|
-
* this for startup to continue.
|
|
213
|
-
*
|
|
214
|
-
* The managed sidecar accepts exactly one bootstrap connection, so this must
|
|
215
|
-
* be called at the process level (not per-conversation).
|
|
216
|
-
*/
|
|
217
|
-
async function startCesProcess(
|
|
218
|
-
config: AssistantConfig,
|
|
219
|
-
): Promise<CesStartupResult> {
|
|
220
|
-
const pm = createCesProcessManager({ assistantConfig: config });
|
|
221
|
-
const abortController = new AbortController();
|
|
222
|
-
let clientRef: CesClient | undefined;
|
|
223
|
-
|
|
224
|
-
const clientPromise = (async (): Promise<CesClient | undefined> => {
|
|
225
|
-
try {
|
|
226
|
-
const transport = await pm.start();
|
|
227
|
-
if (abortController.signal.aborted) {
|
|
228
|
-
throw new Error("CES initialization aborted during shutdown");
|
|
229
|
-
}
|
|
230
|
-
const client = createCesClient(transport);
|
|
231
|
-
clientRef = client;
|
|
232
|
-
// Resolve the assistant API key so CES can use it for platform
|
|
233
|
-
// credential materialisation. In managed mode the key is provisioned
|
|
234
|
-
// after hatch and stored in the credential store — CES can't read
|
|
235
|
-
// the env var, so we pass it via the handshake.
|
|
236
|
-
const proxyCtx = await resolveManagedProxyContext();
|
|
237
|
-
const assistantId = getPlatformAssistantId();
|
|
238
|
-
const { accepted, reason } = await client.handshake({
|
|
239
|
-
...(proxyCtx.assistantApiKey
|
|
240
|
-
? { assistantApiKey: proxyCtx.assistantApiKey }
|
|
241
|
-
: {}),
|
|
242
|
-
...(assistantId ? { assistantId } : {}),
|
|
243
|
-
});
|
|
244
|
-
if (abortController.signal.aborted) {
|
|
245
|
-
client.close();
|
|
246
|
-
throw new Error("CES initialization aborted during shutdown");
|
|
247
|
-
}
|
|
248
|
-
if (accepted) {
|
|
249
|
-
log.info(
|
|
250
|
-
"CES client initialized and handshake accepted (server-level)",
|
|
251
|
-
);
|
|
252
|
-
return client;
|
|
253
|
-
}
|
|
254
|
-
log.warn(
|
|
255
|
-
{ reason },
|
|
256
|
-
"CES handshake rejected — CES tools will be unavailable",
|
|
257
|
-
);
|
|
258
|
-
client.close();
|
|
259
|
-
clientRef = undefined;
|
|
260
|
-
await pm.stop();
|
|
261
|
-
return undefined;
|
|
262
|
-
} catch (err) {
|
|
263
|
-
if (err instanceof CesUnavailableError) {
|
|
264
|
-
log.info(
|
|
265
|
-
{ reason: err.message },
|
|
266
|
-
"CES is not available — CES tools will be unavailable",
|
|
267
|
-
);
|
|
268
|
-
} else {
|
|
269
|
-
log.warn(
|
|
270
|
-
{ error: err instanceof Error ? err.message : String(err) },
|
|
271
|
-
"Failed to initialize CES client — CES tools will be unavailable",
|
|
272
|
-
);
|
|
273
|
-
}
|
|
274
|
-
await pm.stop().catch(() => {});
|
|
275
|
-
clientRef = undefined;
|
|
276
|
-
return undefined;
|
|
277
|
-
}
|
|
278
|
-
})();
|
|
279
|
-
|
|
280
|
-
return {
|
|
281
|
-
get client() {
|
|
282
|
-
return clientRef;
|
|
283
|
-
},
|
|
284
|
-
processManager: pm,
|
|
285
|
-
clientPromise,
|
|
286
|
-
abortController,
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
|
|
290
176
|
// Entry point for the daemon process itself
|
|
291
177
|
export async function runDaemon(): Promise<void> {
|
|
292
178
|
const startupStartedAt = Date.now();
|
|
@@ -297,1170 +183,966 @@ export async function runDaemon(): Promise<void> {
|
|
|
297
183
|
validateEnv();
|
|
298
184
|
log.info({ version: APP_VERSION }, "Daemon starting");
|
|
299
185
|
|
|
186
|
+
// Initialize crash reporting eagerly so the Sentry client is ready before
|
|
187
|
+
// early startup failures occur. Events are dropped (beforeSend) until the
|
|
188
|
+
// consent gate below confirms share_diagnostics opt-in; dev mode and the
|
|
189
|
+
// legacy local opt-out hard-disable via closeSentry().
|
|
190
|
+
initSentry();
|
|
191
|
+
|
|
192
|
+
ensureDataDir();
|
|
193
|
+
|
|
194
|
+
// Recover from any streaming `.vbundle` import that was interrupted by a
|
|
195
|
+
// crash or SIGKILL. If the previous process died between
|
|
196
|
+
// `carryOverPreservedPaths` and the atomic workspace swap, the live
|
|
197
|
+
// workspace may be missing `data/db` / `data/qdrant` / etc. The marker
|
|
198
|
+
// at `<workspaceDir>.import-marker.json` (persisted before any rename
|
|
199
|
+
// runs) tells us where the orphaned preserved paths landed; the
|
|
200
|
+
// recovery helper moves them back into the live workspace and cleans
|
|
201
|
+
// up the temp tree. Running this BEFORE `initializeDb()` ensures the
|
|
202
|
+
// DB singleton opens against the fully-restored `assistant.db`.
|
|
300
203
|
try {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
// workspace may be missing `data/db` / `data/qdrant` / etc. The marker
|
|
313
|
-
// at `<workspaceDir>.import-marker.json` (persisted before any rename
|
|
314
|
-
// runs) tells us where the orphaned preserved paths landed; the
|
|
315
|
-
// recovery helper moves them back into the live workspace and cleans
|
|
316
|
-
// up the temp tree. Running this BEFORE `initializeDb()` ensures the
|
|
317
|
-
// DB singleton opens against the fully-restored `assistant.db`.
|
|
318
|
-
try {
|
|
319
|
-
const recoveryResult = await recoverInterruptedImport(getWorkspaceDir());
|
|
320
|
-
if (!recoveryResult.ok) {
|
|
321
|
-
// Rollback is intentionally unresolved — backup/temp/marker are
|
|
322
|
-
// preserved on disk so an operator (or a later retry) can finish
|
|
323
|
-
// the recovery. Log loudly so ops sees it, but don't block start-up:
|
|
324
|
-
// the daemon still needs to come up for diagnostics. The next
|
|
325
|
-
// `streamCommitImport` will refuse to start a new import until the
|
|
326
|
-
// marker is resolved.
|
|
327
|
-
log.error(
|
|
328
|
-
{ failedCount: recoveryResult.failedCount },
|
|
329
|
-
"Interrupted-import recovery is INCOMPLETE; leftover .pre-import-* / .import-* scratch dirs remain in the workspace. Manual intervention may be required before the next import can run.",
|
|
330
|
-
);
|
|
331
|
-
}
|
|
332
|
-
} catch (err) {
|
|
333
|
-
log.warn(
|
|
334
|
-
{ err },
|
|
335
|
-
"recoverInterruptedImport threw during daemon startup; continuing",
|
|
204
|
+
const recoveryResult = await recoverInterruptedImport(getWorkspaceDir());
|
|
205
|
+
if (!recoveryResult.ok) {
|
|
206
|
+
// Rollback is intentionally unresolved — backup/temp/marker are
|
|
207
|
+
// preserved on disk so an operator (or a later retry) can finish
|
|
208
|
+
// the recovery. Log loudly so ops sees it, but don't block start-up:
|
|
209
|
+
// the daemon still needs to come up for diagnostics. The next
|
|
210
|
+
// `streamCommitImport` will refuse to start a new import until the
|
|
211
|
+
// marker is resolved.
|
|
212
|
+
log.error(
|
|
213
|
+
{ failedCount: recoveryResult.failedCount },
|
|
214
|
+
"Interrupted-import recovery is INCOMPLETE; leftover .pre-import-* / .import-* scratch dirs remain in the workspace. Manual intervention may be required before the next import can run.",
|
|
336
215
|
);
|
|
337
216
|
}
|
|
217
|
+
} catch (err) {
|
|
218
|
+
log.warn(
|
|
219
|
+
{ err },
|
|
220
|
+
"recoverInterruptedImport threw during daemon startup; continuing",
|
|
221
|
+
);
|
|
222
|
+
}
|
|
338
223
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
224
|
+
// Load (or generate + persist) the auth signing key so tokens survive
|
|
225
|
+
// daemon restarts.
|
|
226
|
+
const signingKey = resolveSigningKey();
|
|
227
|
+
initAuthSigningKey(signingKey);
|
|
228
|
+
|
|
229
|
+
// Start the runtime HTTP server early so /healthz answers ASAP. A bind
|
|
230
|
+
// failure is non-fatal — the daemon falls back to IPC-only operation.
|
|
231
|
+
await startRuntimeHttpServer();
|
|
232
|
+
|
|
233
|
+
// Pre-populate feature flag overrides so subsequent sync
|
|
234
|
+
// isAssistantFeatureFlagEnabled() calls have data. Fired non-blocking
|
|
235
|
+
// so a slow or unreachable gateway doesn't delay daemon startup (the
|
|
236
|
+
// IPC call has a 3s connect + 5s call timeout that would otherwise
|
|
237
|
+
// stall the critical path).
|
|
238
|
+
// After the async fetch resolves, (re)register any flag-gated tools
|
|
239
|
+
// (`workflows`, `ces-tools`): `initializeTools()` runs during startup before
|
|
240
|
+
// this fetch completes, so without this follow-up sync a flag-enabled
|
|
241
|
+
// assistant would not expose the gated tools until a restart (which can lose
|
|
242
|
+
// the same race). Enable-direction only; chained so it sees the fresh cache.
|
|
243
|
+
// Then reconcile flag-gated managed profiles (OS Beta): `seedInferenceProfiles()`
|
|
244
|
+
// runs synchronously earlier in boot before flags are available, so this lands
|
|
245
|
+
// the profile on the same boot once the flag cache is populated. When this
|
|
246
|
+
// reconcile is the call that mutates config (it raced ahead of the gateway
|
|
247
|
+
// flag listener), publish the config invalidation so any client that already
|
|
248
|
+
// fetched `GET /v1/config` refreshes its profile picker.
|
|
249
|
+
// Profiles are reconciled only when flags actually loaded from the gateway:
|
|
250
|
+
// a failed fetch leaves the cache unset and resolves `os-beta` to its
|
|
251
|
+
// registry default `false`, which would remove the user's profile and reset
|
|
252
|
+
// their selection. Tool sync tolerates the default and stays unconditional.
|
|
253
|
+
void initFeatureFlagOverrides()
|
|
254
|
+
.then(async (loaded) => {
|
|
255
|
+
await syncFlagGatedTools();
|
|
256
|
+
if (loaded && reconcileFlagGatedProfiles()) {
|
|
257
|
+
publishConfigChanged();
|
|
258
|
+
}
|
|
259
|
+
})
|
|
260
|
+
.catch((err) => log.warn({ err }, "Background feature flag init failed"));
|
|
261
|
+
|
|
262
|
+
startGatewayFlagListener();
|
|
263
|
+
|
|
264
|
+
log.info("Daemon startup: initializing DB");
|
|
265
|
+
ensurePromptFiles();
|
|
266
|
+
|
|
267
|
+
// DB must be initialized before workspace migrations because some
|
|
268
|
+
// workspace migrations (e.g. 009-backfill-conversation-disk-view)
|
|
269
|
+
// depend on DB migrations having run (e.g. the inline-attachment-to-disk
|
|
270
|
+
// backfill that populates attachment filePaths).
|
|
271
|
+
//
|
|
272
|
+
// The daemon continues in a degraded state on either DB failure mode:
|
|
273
|
+
// (a) initializeDb() throws (e.g. the DB can't be opened), or (b) the DB
|
|
274
|
+
// opens but one or more migrations failed (initializeDb resolves with
|
|
275
|
+
// migrationsOk:false rather than throwing, per the daemon-never-blocks
|
|
276
|
+
// philosophy). In both cases DB-dependent features won't work, but the
|
|
277
|
+
// HTTP server and config-based subsystems still start so the process
|
|
278
|
+
// remains reachable for diagnostics. The trivial /healthz and detailed
|
|
279
|
+
// /v1/health(z) endpoints still answer 200, but setDbReady(true) runs only
|
|
280
|
+
// when migrations all applied, so the readiness latch stays unset and
|
|
281
|
+
// /readyz reports not-ready (503) for the rest of the process lifetime.
|
|
282
|
+
// That 503 is intentional: a DB-broken daemon should fail readiness so it
|
|
283
|
+
// is not routed user traffic.
|
|
284
|
+
//
|
|
285
|
+
// The local `dbReady` and the module-level readiness latch intentionally
|
|
286
|
+
// diverge on the migration-failure path: `dbReady` stays true to allow the
|
|
287
|
+
// downstream best-effort seeding / workspace migrations, while the latch
|
|
288
|
+
// stays unset to keep /readyz 503.
|
|
289
|
+
let dbReady = false;
|
|
290
|
+
try {
|
|
291
|
+
const { migrationsOk } = await initializeDb();
|
|
292
|
+
dbReady = true;
|
|
293
|
+
if (migrationsOk) {
|
|
294
|
+
setDbReady(true);
|
|
295
|
+
log.info("Daemon startup: DB initialized");
|
|
296
|
+
} else {
|
|
297
|
+
log.error(
|
|
298
|
+
"Daemon startup: DB opened but one or more migrations failed — /readyz will remain unready (degraded mode)",
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
} catch (err) {
|
|
302
|
+
log.error(
|
|
303
|
+
{ err },
|
|
304
|
+
"DB initialization failed — continuing startup in degraded mode",
|
|
305
|
+
);
|
|
306
|
+
}
|
|
354
307
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
308
|
+
// Seed well-known OAuth provider configurations (insert-if-not-exists).
|
|
309
|
+
// Runs in its own try/catch so a seeding error doesn't force degraded mode
|
|
310
|
+
// when the DB itself initialized successfully.
|
|
311
|
+
if (dbReady) {
|
|
359
312
|
try {
|
|
360
|
-
|
|
361
|
-
log.info(
|
|
362
|
-
{ port: httpPort, hostname: httpHostname },
|
|
363
|
-
"Daemon startup: runtime HTTP server listening",
|
|
364
|
-
);
|
|
313
|
+
seedOAuthProviders();
|
|
365
314
|
} catch (err) {
|
|
366
|
-
log.warn(
|
|
367
|
-
{ err, port: httpPort },
|
|
368
|
-
"Failed to start runtime HTTP server, continuing without it",
|
|
369
|
-
);
|
|
370
|
-
runtimeHttp = null;
|
|
315
|
+
log.warn({ err }, "OAuth provider seeding failed — continuing startup");
|
|
371
316
|
}
|
|
317
|
+
}
|
|
372
318
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
// (`workflows`, `ces-tools`): `initializeTools()` runs during startup before
|
|
380
|
-
// this fetch completes, so without this follow-up sync a flag-enabled
|
|
381
|
-
// assistant would not expose the gated tools until a restart (which can lose
|
|
382
|
-
// the same race). Enable-direction only; chained so it sees the fresh cache.
|
|
383
|
-
// Then reconcile flag-gated managed profiles (OS Beta): `seedInferenceProfiles()`
|
|
384
|
-
// runs synchronously earlier in boot before flags are available, so this lands
|
|
385
|
-
// the profile on the same boot once the flag cache is populated. When this
|
|
386
|
-
// reconcile is the call that mutates config (it raced ahead of the gateway
|
|
387
|
-
// flag listener), publish the config invalidation so any client that already
|
|
388
|
-
// fetched `GET /v1/config` refreshes its profile picker.
|
|
389
|
-
// Profiles are reconciled only when flags actually loaded from the gateway:
|
|
390
|
-
// a failed fetch leaves the cache unset and resolves `os-beta` to its
|
|
391
|
-
// registry default `false`, which would remove the user's profile and reset
|
|
392
|
-
// their selection. Tool sync tolerates the default and stays unconditional.
|
|
393
|
-
void initFeatureFlagOverrides()
|
|
394
|
-
.then(async (loaded) => {
|
|
395
|
-
await syncFlagGatedTools();
|
|
396
|
-
if (loaded && reconcileFlagGatedProfiles()) {
|
|
397
|
-
publishConfigChanged();
|
|
398
|
-
}
|
|
399
|
-
})
|
|
400
|
-
.catch((err) => log.warn({ err }, "Background feature flag init failed"));
|
|
401
|
-
|
|
402
|
-
startGatewayFlagListener();
|
|
403
|
-
|
|
404
|
-
log.info("Daemon startup: initializing DB");
|
|
405
|
-
ensurePromptFiles();
|
|
319
|
+
if (dbReady) {
|
|
320
|
+
const migrationSummary = await runWorkspaceMigrations(
|
|
321
|
+
getWorkspaceDir(),
|
|
322
|
+
WORKSPACE_MIGRATIONS,
|
|
323
|
+
);
|
|
324
|
+
log.info(migrationSummary, "Daemon startup: workspace migrations complete");
|
|
406
325
|
|
|
407
|
-
//
|
|
408
|
-
//
|
|
409
|
-
//
|
|
410
|
-
// backfill
|
|
411
|
-
//
|
|
412
|
-
// If DB initialization fails (e.g. a migration error), the daemon
|
|
413
|
-
// continues in a degraded state — DB-dependent features won't work but
|
|
414
|
-
// the HTTP server and config-based subsystems still start so the process
|
|
415
|
-
// remains reachable for health checks and diagnostics.
|
|
416
|
-
let dbReady = false;
|
|
326
|
+
// Seed canonical inference provider_connections and backfill any legacy
|
|
327
|
+
// profiles that pre-date the connection field. Runs after workspace
|
|
328
|
+
// migrations so migration 076 has already stripped services.inference.mode
|
|
329
|
+
// before backfill reads config. Idempotent — runs every boot so new
|
|
330
|
+
// canonicals propagate and manual config.json edits self-heal.
|
|
417
331
|
try {
|
|
418
|
-
|
|
419
|
-
dbReady = true;
|
|
420
|
-
log.info("Daemon startup: DB initialized");
|
|
332
|
+
runProviderConnectionsBackfill(getDb());
|
|
421
333
|
} catch (err) {
|
|
422
|
-
log.
|
|
334
|
+
log.warn(
|
|
423
335
|
{ err },
|
|
424
|
-
"
|
|
336
|
+
"provider_connections backfill failed — continuing startup",
|
|
425
337
|
);
|
|
426
338
|
}
|
|
427
339
|
|
|
428
|
-
//
|
|
429
|
-
//
|
|
430
|
-
//
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
340
|
+
// Profiler retention sweep — prune completed profiler runs to stay
|
|
341
|
+
// within configured byte-count, run-count, and free-space budgets.
|
|
342
|
+
// Runs on every startup and is safe to call from explicit cleanup routes.
|
|
343
|
+
try {
|
|
344
|
+
const sweepResult = runProfilerSweep();
|
|
345
|
+
if (sweepResult.prunedCount > 0 || sweepResult.activeRunOverBudget) {
|
|
346
|
+
log.info(
|
|
347
|
+
{
|
|
348
|
+
prunedCount: sweepResult.prunedCount,
|
|
349
|
+
freedBytes: sweepResult.freedBytes,
|
|
350
|
+
activeRunOverBudget: sweepResult.activeRunOverBudget,
|
|
351
|
+
remainingRuns: sweepResult.remainingRuns,
|
|
352
|
+
},
|
|
353
|
+
"Profiler retention sweep completed on startup",
|
|
354
|
+
);
|
|
436
355
|
}
|
|
356
|
+
} catch (err) {
|
|
357
|
+
log.warn({ err }, "Profiler retention sweep failed — continuing startup");
|
|
437
358
|
}
|
|
438
359
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
360
|
+
// Backfill oauth_connection rows for manual-token providers (Telegram,
|
|
361
|
+
// Slack channel) that already have stored credentials from before the
|
|
362
|
+
// oauth_connection migration. Safe to call on every startup.
|
|
363
|
+
//
|
|
364
|
+
// Must run AFTER workspace migrations.
|
|
365
|
+
// Otherwise syncManualTokenConnection sees no stored credentials and
|
|
366
|
+
// incorrectly removes existing connection rows.
|
|
367
|
+
try {
|
|
368
|
+
await backfillManualTokenConnections();
|
|
369
|
+
} catch (err) {
|
|
370
|
+
log.warn(
|
|
371
|
+
{ err },
|
|
372
|
+
"Manual-token connection backfill failed — continuing startup",
|
|
447
373
|
);
|
|
374
|
+
}
|
|
448
375
|
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
// Runs on every startup and is safe to call from explicit cleanup routes.
|
|
466
|
-
try {
|
|
467
|
-
const sweepResult = runProfilerSweep();
|
|
468
|
-
if (sweepResult.prunedCount > 0 || sweepResult.activeRunOverBudget) {
|
|
469
|
-
log.info(
|
|
470
|
-
{
|
|
471
|
-
prunedCount: sweepResult.prunedCount,
|
|
472
|
-
freedBytes: sweepResult.freedBytes,
|
|
473
|
-
activeRunOverBudget: sweepResult.activeRunOverBudget,
|
|
474
|
-
remainingRuns: sweepResult.remainingRuns,
|
|
475
|
-
},
|
|
476
|
-
"Profiler retention sweep completed on startup",
|
|
477
|
-
);
|
|
478
|
-
}
|
|
479
|
-
} catch (err) {
|
|
480
|
-
log.warn(
|
|
481
|
-
{ err },
|
|
482
|
-
"Profiler retention sweep failed — continuing startup",
|
|
483
|
-
);
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
// Backfill oauth_connection rows for manual-token providers (Telegram,
|
|
487
|
-
// Slack channel) that already have stored credentials from before the
|
|
488
|
-
// oauth_connection migration. Safe to call on every startup.
|
|
489
|
-
//
|
|
490
|
-
// Must run AFTER workspace migrations.
|
|
491
|
-
// Otherwise syncManualTokenConnection sees no stored credentials and
|
|
492
|
-
// incorrectly removes existing connection rows.
|
|
493
|
-
try {
|
|
494
|
-
await backfillManualTokenConnections();
|
|
495
|
-
} catch (err) {
|
|
376
|
+
// One-time backfill of `relationship-state.json` for existing or
|
|
377
|
+
// upgraded users so they don't land on an empty Home page after the
|
|
378
|
+
// Phase 3 ship. Runs after DB init + workspace migrations so the
|
|
379
|
+
// writer can actually resolve the guardian persona file and list
|
|
380
|
+
// connected OAuth providers — firing this from `ensurePromptFiles()`
|
|
381
|
+
// would be too early (DB isn't ready yet) and produce a degraded
|
|
382
|
+
// snapshot with zero facts and zero unlocked capabilities.
|
|
383
|
+
//
|
|
384
|
+
// Deferred via `setImmediate` so any sync filesystem/DB work the
|
|
385
|
+
// writer does (`readdirSync`, `readFileSync`, contact + provider
|
|
386
|
+
// lookups) happens on a later tick, off the startup critical path.
|
|
387
|
+
// Failures are logged — not silenced — to match the pattern used by
|
|
388
|
+
// other `void … .catch()` fire-and-forgets in this file and the
|
|
389
|
+
// assistant/CLAUDE.md rule that all errors must be observable.
|
|
390
|
+
setImmediate(() => {
|
|
391
|
+
void backfillRelationshipStateIfMissing().catch((err) =>
|
|
496
392
|
log.warn(
|
|
497
393
|
{ err },
|
|
498
|
-
"
|
|
499
|
-
)
|
|
500
|
-
|
|
394
|
+
"Relationship state backfill failed — continuing startup",
|
|
395
|
+
),
|
|
396
|
+
);
|
|
397
|
+
});
|
|
501
398
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
// lookups) happens on a later tick, off the startup critical path.
|
|
513
|
-
// Failures are logged — not silenced — to match the pattern used by
|
|
514
|
-
// other `void … .catch()` fire-and-forgets in this file and the
|
|
515
|
-
// assistant/CLAUDE.md rule that all errors must be observable.
|
|
516
|
-
setImmediate(() => {
|
|
517
|
-
void backfillRelationshipStateIfMissing().catch((err) =>
|
|
518
|
-
log.warn(
|
|
519
|
-
{ err },
|
|
520
|
-
"Relationship state backfill failed — continuing startup",
|
|
521
|
-
),
|
|
522
|
-
);
|
|
523
|
-
});
|
|
399
|
+
// Backfill injection templates on Slack bot token credentials so the
|
|
400
|
+
// credential proxy can inject Authorization headers. Safe on every startup.
|
|
401
|
+
try {
|
|
402
|
+
backfillSlackInjectionTemplates();
|
|
403
|
+
} catch (err) {
|
|
404
|
+
log.warn(
|
|
405
|
+
{ err },
|
|
406
|
+
"Slack injection template backfill failed — continuing startup",
|
|
407
|
+
);
|
|
408
|
+
}
|
|
524
409
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
} catch (err) {
|
|
530
|
-
log.warn(
|
|
531
|
-
{ err },
|
|
532
|
-
"Slack injection template backfill failed — continuing startup",
|
|
533
|
-
);
|
|
534
|
-
}
|
|
410
|
+
// Now that workspace migrations have run (including 003-seed-device-id
|
|
411
|
+
// which may copy the legacy installationId into device.json), it is safe
|
|
412
|
+
// to read the device ID and set the Sentry tag.
|
|
413
|
+
setSentryDeviceId(getDeviceId());
|
|
535
414
|
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
log.info(
|
|
554
|
-
{ event: "startup_expired_stale_requests", expiredCount },
|
|
555
|
-
`Expired ${expiredCount} stale canonical request(s) from previous process`,
|
|
556
|
-
);
|
|
557
|
-
}
|
|
415
|
+
// Expire stale pending canonical guardian requests left over from before
|
|
416
|
+
// this process started. Two categories are cleaned up:
|
|
417
|
+
//
|
|
418
|
+
// 1. Interaction-bound kinds (tool_approval, pending_question) — their
|
|
419
|
+
// in-memory pending-interaction session references are gone, so they
|
|
420
|
+
// can never be completed.
|
|
421
|
+
// 2. Any pending request whose expiresAt has already passed — persistent
|
|
422
|
+
// kinds (access_request, tool_grant_request) that expired while the
|
|
423
|
+
// daemon was stopped are transitioned so dedup logic doesn't return
|
|
424
|
+
// stale rows.
|
|
425
|
+
const expiredCount = expireAllPendingCanonicalRequests();
|
|
426
|
+
if (expiredCount > 0) {
|
|
427
|
+
log.info(
|
|
428
|
+
{ event: "startup_expired_stale_requests", expiredCount },
|
|
429
|
+
`Expired ${expiredCount} stale canonical request(s) from previous process`,
|
|
430
|
+
);
|
|
431
|
+
}
|
|
558
432
|
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
log.info(
|
|
569
|
-
{ workItemId: item.id, title: item.title },
|
|
570
|
-
"Recovered orphaned running work item → failed (interrupted)",
|
|
571
|
-
);
|
|
572
|
-
}
|
|
433
|
+
// Recover orphaned work items that were left in 'running' state when the
|
|
434
|
+
// daemon previously crashed or was killed mid-task.
|
|
435
|
+
const orphanedRunning = listWorkItems({ status: "running" });
|
|
436
|
+
if (orphanedRunning.length > 0) {
|
|
437
|
+
for (const item of orphanedRunning) {
|
|
438
|
+
updateWorkItem(item.id, {
|
|
439
|
+
status: "failed",
|
|
440
|
+
lastRunStatus: "interrupted",
|
|
441
|
+
});
|
|
573
442
|
log.info(
|
|
574
|
-
{
|
|
575
|
-
"Recovered orphaned running work
|
|
443
|
+
{ workItemId: item.id, title: item.title },
|
|
444
|
+
"Recovered orphaned running work item → failed (interrupted)",
|
|
576
445
|
);
|
|
577
446
|
}
|
|
447
|
+
log.info(
|
|
448
|
+
{ count: orphanedRunning.length },
|
|
449
|
+
"Recovered orphaned running work items",
|
|
450
|
+
);
|
|
451
|
+
}
|
|
578
452
|
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
453
|
+
try {
|
|
454
|
+
const twilioProvider = new TwilioConversationRelayProvider();
|
|
455
|
+
await reconcileCallsOnStartup(twilioProvider, log);
|
|
456
|
+
} catch (err) {
|
|
457
|
+
log.warn({ err }, "Call recovery failed — continuing startup");
|
|
458
|
+
}
|
|
459
|
+
} // end if (dbReady)
|
|
460
|
+
|
|
461
|
+
// Populate the managed-connection cache so the `14-connected-services`
|
|
462
|
+
// bundled section (rendered by `renderConnectedServices()` in
|
|
463
|
+
// system-sections.ts) can include platform-managed OAuth connections
|
|
464
|
+
// (e.g. Twitter) in the system prompt from the first turn. This is
|
|
465
|
+
// an HTTP-only call with no DB dependency, so it runs regardless of
|
|
466
|
+
// dbReady. A periodic refresh keeps the cache current when users
|
|
467
|
+
// connect/disconnect managed providers while the assistant is running.
|
|
468
|
+
void refreshManagedConnectionCache().catch((err) =>
|
|
469
|
+
log.warn(
|
|
470
|
+
{ err },
|
|
471
|
+
"Managed connection cache refresh failed — continuing startup",
|
|
472
|
+
),
|
|
473
|
+
);
|
|
474
|
+
const MANAGED_CONNECTION_REFRESH_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
|
|
475
|
+
setInterval(() => {
|
|
594
476
|
void refreshManagedConnectionCache().catch((err) =>
|
|
595
|
-
log.warn(
|
|
596
|
-
{ err },
|
|
597
|
-
"Managed connection cache refresh failed — continuing startup",
|
|
598
|
-
),
|
|
477
|
+
log.warn({ err }, "Periodic managed connection cache refresh failed"),
|
|
599
478
|
);
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
479
|
+
}, MANAGED_CONNECTION_REFRESH_INTERVAL_MS);
|
|
480
|
+
|
|
481
|
+
// Merge CLI-provided default config (from VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH)
|
|
482
|
+
// into the workspace config file before profile seeding and the first
|
|
483
|
+
// loadConfig() call so onboarding/platform preferences are visible to the
|
|
484
|
+
// seeder and persisted alongside schema defaults.
|
|
485
|
+
const defaultConfigMerge = mergeDefaultWorkspaceConfig();
|
|
486
|
+
|
|
487
|
+
// Seed inference profiles into the workspace config. Managed Anthropic
|
|
488
|
+
// profiles are overwritten on every boot so Vellum can push updates.
|
|
489
|
+
// Off-platform hatches additionally create user profiles + a personal
|
|
490
|
+
// provider connection for the hatch provider.
|
|
491
|
+
try {
|
|
492
|
+
seedInferenceProfiles({
|
|
493
|
+
preserveProfileNames: defaultConfigMerge.providedLlmProfileNames,
|
|
494
|
+
preserveActiveProfile: defaultConfigMerge.providedLlmActiveProfile,
|
|
495
|
+
isHatch: defaultConfigMerge.hadOverlay,
|
|
496
|
+
db: dbReady ? getDb() : undefined,
|
|
497
|
+
});
|
|
498
|
+
log.info("Inference profile seeding complete");
|
|
499
|
+
} catch (err) {
|
|
500
|
+
log.warn({ err }, "Inference profile seeding failed — continuing startup");
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// Re-run the adaptive thinking repair after overlay merge + profile seeding.
|
|
504
|
+
// Workspace migration 097 enables adaptive thinking on managed profiles, but
|
|
505
|
+
// it runs before mergeDefaultWorkspaceConfig() which can overwrite the fix
|
|
506
|
+
// with overlay profiles that have thinking disabled or absent. On-platform
|
|
507
|
+
// instances where the overlay supplies "balanced" / "quality-optimized"
|
|
508
|
+
// profiles without thinking enabled would be stuck permanently because the
|
|
509
|
+
// migration is already checkpointed as completed. This idempotent repair
|
|
510
|
+
// ensures thinking is enabled regardless of overlay ordering.
|
|
511
|
+
if (defaultConfigMerge.hadOverlay) {
|
|
617
512
|
try {
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
preserveActiveProfile: defaultConfigMerge.providedLlmActiveProfile,
|
|
621
|
-
isHatch: defaultConfigMerge.hadOverlay,
|
|
622
|
-
db: dbReady ? getDb() : undefined,
|
|
623
|
-
});
|
|
624
|
-
log.info("Inference profile seeding complete");
|
|
513
|
+
repairAdaptiveThinkingOnManagedProfiles(getWorkspaceDir());
|
|
514
|
+
log.info("Post-overlay adaptive thinking repair complete");
|
|
625
515
|
} catch (err) {
|
|
626
516
|
log.warn(
|
|
627
517
|
{ err },
|
|
628
|
-
"
|
|
518
|
+
"Post-overlay adaptive thinking repair failed — continuing startup",
|
|
629
519
|
);
|
|
630
520
|
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
log.info("Daemon startup: loading config");
|
|
524
|
+
const config = loadConfig();
|
|
631
525
|
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
if (defaultConfigMerge.hadOverlay) {
|
|
526
|
+
// Reconcile conversations left mid-turn by the previous shutdown. Their
|
|
527
|
+
// `processing_started_at` is still set even though the in-memory agent loop
|
|
528
|
+
// that owned the turn is gone.
|
|
529
|
+
if (dbReady) {
|
|
530
|
+
if (config.conversations.resumeProcessingOnStartup) {
|
|
531
|
+
// TODO: automatically resume the interrupted turn for each conversation
|
|
532
|
+
// whose processing flag is still set instead of clearing it.
|
|
533
|
+
} else {
|
|
641
534
|
try {
|
|
642
|
-
|
|
643
|
-
|
|
535
|
+
const cleared = clearStaleProcessingFlags();
|
|
536
|
+
if (cleared > 0) {
|
|
537
|
+
log.info(
|
|
538
|
+
{ count: cleared },
|
|
539
|
+
"Cleared stale conversation processing flags from previous process",
|
|
540
|
+
);
|
|
541
|
+
}
|
|
644
542
|
} catch (err) {
|
|
645
543
|
log.warn(
|
|
646
544
|
{ err },
|
|
647
|
-
"
|
|
545
|
+
"Failed to clear stale conversation processing flags — continuing startup",
|
|
648
546
|
);
|
|
649
547
|
}
|
|
650
548
|
}
|
|
549
|
+
}
|
|
651
550
|
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
"Daemon startup: seeded ingress URL from workspace config",
|
|
665
|
-
);
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
if (config.logFile.dir) {
|
|
669
|
-
initLogger({
|
|
670
|
-
dir: config.logFile.dir,
|
|
671
|
-
retentionDays: config.logFile.retentionDays,
|
|
672
|
-
});
|
|
673
|
-
}
|
|
551
|
+
// Seed module-level ingress state from the workspace config so that
|
|
552
|
+
// getIngressPublicBaseUrl() returns the correct value immediately after
|
|
553
|
+
// startup (before any handleIngressConfig("set") call). Without this,
|
|
554
|
+
// code paths that read the module-level state directly (e.g. session-slash
|
|
555
|
+
// pairing info) would see undefined until an explicit set.
|
|
556
|
+
if (config.ingress.enabled && config.ingress.publicBaseUrl) {
|
|
557
|
+
setIngressPublicBaseUrl(config.ingress.publicBaseUrl);
|
|
558
|
+
log.info(
|
|
559
|
+
{ url: config.ingress.publicBaseUrl },
|
|
560
|
+
"Daemon startup: seeded ingress URL from workspace config",
|
|
561
|
+
);
|
|
562
|
+
}
|
|
674
563
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
// startConsentRefresh() below, mirroring the share_analytics posture).
|
|
682
|
-
const isDevMode = process.env.VELLUM_DEV === "1";
|
|
683
|
-
if (isDevMode || config.legacyDiagnosticsOptOut === true) {
|
|
684
|
-
// Dev mode and a preserved legacy local opt-out both disable Sentry
|
|
685
|
-
// unconditionally, without waiting on platform consent.
|
|
686
|
-
await closeSentry();
|
|
687
|
-
}
|
|
564
|
+
if (config.logFile.dir) {
|
|
565
|
+
initLogger({
|
|
566
|
+
dir: config.logFile.dir,
|
|
567
|
+
retentionDays: config.logFile.retentionDays,
|
|
568
|
+
});
|
|
569
|
+
}
|
|
688
570
|
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
//
|
|
699
|
-
//
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
// covered. The reporter is degraded-mode safe — its constructor and
|
|
703
|
-
// flush() treat DB errors as non-fatal.
|
|
704
|
-
let telemetryReporter: UsageTelemetryReporter | null = null;
|
|
705
|
-
if (!isDevMode) {
|
|
706
|
-
telemetryReporter = new UsageTelemetryReporter();
|
|
707
|
-
setUsageTelemetryReporter(telemetryReporter);
|
|
708
|
-
telemetryReporter.start();
|
|
709
|
-
log.info("Usage telemetry reporter started");
|
|
710
|
-
}
|
|
571
|
+
// Privacy gating: Sentry crash/error reporting follows the platform owner's
|
|
572
|
+
// share_diagnostics consent; the usage telemetry reporter re-checks
|
|
573
|
+
// share_analytics on every flush. Both are disabled in dev mode. Sentry was
|
|
574
|
+
// initialized early, but beforeSend re-reads getCachedShareDiagnostics() on
|
|
575
|
+
// every event, so it drops events until consent confirms opt-in and honors a
|
|
576
|
+
// later revocation within one refresh cycle (the cache is refreshed by
|
|
577
|
+
// startConsentRefresh() below, mirroring the share_analytics posture).
|
|
578
|
+
const isDevMode = process.env.VELLUM_DEV === "1";
|
|
579
|
+
if (isDevMode || config.legacyDiagnosticsOptOut === true) {
|
|
580
|
+
// Dev mode and a preserved legacy local opt-out both disable Sentry
|
|
581
|
+
// unconditionally, without waiting on platform consent.
|
|
582
|
+
await closeSentry();
|
|
583
|
+
}
|
|
711
584
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
585
|
+
// Refresh the consent cache regardless of dev mode so record-time telemetry
|
|
586
|
+
// writes (gated on getCachedShareAnalytics()) work in dev too. The reporter
|
|
587
|
+
// flush stays dev-gated above, so dev still never sends telemetry to the
|
|
588
|
+
// platform. Fire-and-forget: startConsentRefresh() runs an immediate
|
|
589
|
+
// non-blocking refresh, so the startup hot path is never blocked.
|
|
590
|
+
startConsentRefresh();
|
|
591
|
+
registerShutdownHook("consent-cache", () => stopConsentRefresh());
|
|
592
|
+
|
|
593
|
+
// Bring up the daemon's CES connection (process + handshake + reconnect
|
|
594
|
+
// wiring). Blocks up to a 20s timeout so credential reads route through CES
|
|
595
|
+
// before provider init; non-fatal — falls back to the direct credential store
|
|
596
|
+
// on failure. The sidecar accepts exactly one bootstrap connection, so this
|
|
597
|
+
// happens at the process level.
|
|
598
|
+
await startCes(config);
|
|
599
|
+
|
|
600
|
+
// Bring up the plugin layer: install the runtime bridge, register the
|
|
601
|
+
// first-party defaults, load user plugins, and run every plugin's
|
|
602
|
+
// `init()`. Ordering is load-bearing (defaults register ahead of user
|
|
603
|
+
// plugins so they compose innermost) and plugin failures are contained so
|
|
604
|
+
// they can't block daemon startup.
|
|
605
|
+
await initializePlugins();
|
|
606
|
+
|
|
607
|
+
// Initialize providers before Qdrant so HTTP routes can begin accepting
|
|
608
|
+
// requests while Qdrant initializes, then best-effort sync the workspace
|
|
609
|
+
// identity name to the platform record.
|
|
610
|
+
await initializeProviders(config);
|
|
611
|
+
syncWorkspaceIdentityToPlatform();
|
|
612
|
+
|
|
613
|
+
// Start the idle/LRU/memory-pressure sweep over the in-memory conversation
|
|
614
|
+
// pool.
|
|
615
|
+
startConversationEvictor();
|
|
616
|
+
|
|
617
|
+
// Watch workspace files (config, prompts, skills, sounds, avatar) and react
|
|
618
|
+
// to changes: evict conversations so the next turn rebuilds against the new
|
|
619
|
+
// config, and broadcast the relevant resource-changed events to clients.
|
|
620
|
+
startConfigWatcher();
|
|
621
|
+
|
|
622
|
+
// Watch app source directories so edits recompile + refresh surfaces across
|
|
623
|
+
// all conversations.
|
|
624
|
+
startAppSourceWatcher();
|
|
625
|
+
|
|
626
|
+
// Start the CLI IPC server. Throws on EADDRINUSE to abort startup when another
|
|
627
|
+
// daemon already holds the socket, so this process never runs background jobs
|
|
628
|
+
// against the shared database as an unmanageable duplicate.
|
|
629
|
+
await startCliIpcServer();
|
|
630
|
+
|
|
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
|
+
// Warm the gateway guardian-delivery cache so the SSE eager-subscribe path
|
|
637
|
+
// (sync, IO-free) resolves the local actor principal on the FIRST client
|
|
638
|
+
// registration. Without this, a cold cache regresses host-proxy same-user
|
|
639
|
+
// targeting until a later reconnect. Non-blocking: failures aren't cached
|
|
640
|
+
// and the async hot paths re-warm on their next read.
|
|
641
|
+
void warmLocalGuardianPrincipalCache().catch((err) =>
|
|
642
|
+
log.warn({ err }, "Guardian principal cache warm failed — continuing"),
|
|
643
|
+
);
|
|
644
|
+
|
|
645
|
+
startUsageTelemetryReporter();
|
|
646
|
+
startDiskPressureGuardForLifecycle();
|
|
647
|
+
startOrphanReaper();
|
|
648
|
+
startEventLoopWatchdog();
|
|
649
|
+
|
|
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
|
|
736
666
|
log.warn(
|
|
737
|
-
|
|
667
|
+
{
|
|
668
|
+
err,
|
|
669
|
+
attempt,
|
|
670
|
+
maxAttempts: QDRANT_START_MAX_ATTEMPTS,
|
|
671
|
+
backoffMs,
|
|
672
|
+
},
|
|
673
|
+
"Qdrant startup failed, retrying",
|
|
738
674
|
);
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
// resolver once the handshake completes, so CES tools and the
|
|
747
|
-
// approval bridge route through CES rather than reporting it
|
|
748
|
-
// unavailable for the rest of the process.
|
|
749
|
-
injectCesClientWhenReady(cesResult.clientPromise, {
|
|
750
|
-
getCesClient,
|
|
751
|
-
setCesClient,
|
|
752
|
-
});
|
|
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
|
+
}
|
|
753
682
|
}
|
|
754
683
|
}
|
|
755
684
|
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
// so the reconnect closure below never calls back into
|
|
764
|
-
// `resolveManagedProxyContext()`. That function reads the assistant
|
|
765
|
-
// API key via `getSecureKeyAsync()`, which — once `setCesClient()`
|
|
766
|
-
// has resolved the backend to CES RPC — routes the read through CES
|
|
767
|
-
// itself. During a reconnect the old transport is dead and a new
|
|
768
|
-
// one is being set up by this very closure, so the nested credential
|
|
769
|
-
// read recursively awaits its own in-flight reconnection and
|
|
770
|
-
// deadlocks until `CREDENTIAL_OP_TIMEOUT_MS` (45s) fires. That
|
|
771
|
-
// 45-second stall delays every CES restart and causes dependent
|
|
772
|
-
// credential reads (e.g. Meet's STT provider resolution) to return
|
|
773
|
-
// `undefined` during the window. API key rotation uses the
|
|
774
|
-
// `updateAssistantApiKey` RPC on the live client, not a reconnect,
|
|
775
|
-
// so caching at startup is safe.
|
|
776
|
-
const startupProxyCtx = await resolveManagedProxyContext();
|
|
777
|
-
const startupAssistantId = getPlatformAssistantId();
|
|
778
|
-
|
|
779
|
-
setCesReconnect(async () => {
|
|
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) {
|
|
780
692
|
try {
|
|
781
|
-
await
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
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,
|
|
789
707
|
});
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
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
|
+
);
|
|
793
719
|
}
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
await pm.stop().catch(() => {});
|
|
797
|
-
return undefined;
|
|
720
|
+
|
|
721
|
+
log.info("Qdrant vector store initialized");
|
|
798
722
|
} catch (err) {
|
|
799
723
|
log.warn(
|
|
800
|
-
{
|
|
801
|
-
"
|
|
724
|
+
{ err },
|
|
725
|
+
"Qdrant client initialization failed — memory features will be degraded",
|
|
802
726
|
);
|
|
803
|
-
await pm.stop().catch(() => {});
|
|
804
|
-
return undefined;
|
|
805
727
|
}
|
|
806
|
-
}
|
|
807
|
-
}
|
|
728
|
+
}
|
|
808
729
|
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
// Keep the server's CES client ref in sync after reconnection so that
|
|
823
|
-
// secret routes and new conversations use the fresh client.
|
|
824
|
-
onCesClientChanged((client) => server.updateCesClient(client));
|
|
825
|
-
|
|
826
|
-
await server.start();
|
|
827
|
-
log.info("Daemon startup: DaemonServer started");
|
|
828
|
-
|
|
829
|
-
// Warm the gateway guardian-delivery cache so the SSE eager-subscribe path
|
|
830
|
-
// (sync, IO-free) resolves the local actor principal on the FIRST client
|
|
831
|
-
// registration. Without this, a cold cache regresses host-proxy same-user
|
|
832
|
-
// targeting until a later reconnect. Non-blocking: failures aren't cached
|
|
833
|
-
// and the async hot paths re-warm on their next read.
|
|
834
|
-
void warmLocalGuardianPrincipalCache().catch((err) =>
|
|
835
|
-
log.warn({ err }, "Guardian principal cache warm failed — continuing"),
|
|
836
|
-
);
|
|
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
|
+
}
|
|
837
743
|
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
async function initializeQdrantAndMemory(): Promise<void> {
|
|
852
|
-
const qdrantUrl = resolveQdrantUrl(config);
|
|
853
|
-
log.info({ qdrantUrl }, "Daemon startup: initializing Qdrant");
|
|
854
|
-
const manager = new QdrantManager({ url: qdrantUrl });
|
|
855
|
-
bgRefs.qdrantManager = manager;
|
|
856
|
-
const QDRANT_START_MAX_ATTEMPTS = 3;
|
|
857
|
-
let qdrantStarted = false;
|
|
858
|
-
for (let attempt = 1; attempt <= QDRANT_START_MAX_ATTEMPTS; attempt++) {
|
|
859
|
-
try {
|
|
860
|
-
await manager.start();
|
|
861
|
-
qdrantStarted = true;
|
|
862
|
-
break;
|
|
863
|
-
} catch (err) {
|
|
864
|
-
if (attempt < QDRANT_START_MAX_ATTEMPTS) {
|
|
865
|
-
const backoffMs = attempt * 5_000; // 5s, 10s
|
|
866
|
-
log.warn(
|
|
867
|
-
{
|
|
868
|
-
err,
|
|
869
|
-
attempt,
|
|
870
|
-
maxAttempts: QDRANT_START_MAX_ATTEMPTS,
|
|
871
|
-
backoffMs,
|
|
872
|
-
},
|
|
873
|
-
"Qdrant startup failed, retrying",
|
|
874
|
-
);
|
|
875
|
-
await Bun.sleep(backoffMs);
|
|
876
|
-
} else {
|
|
877
|
-
log.warn(
|
|
878
|
-
{ err },
|
|
879
|
-
"Qdrant failed to start after all attempts — memory features will be unavailable",
|
|
880
|
-
);
|
|
881
|
-
}
|
|
882
|
-
}
|
|
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
|
+
);
|
|
883
757
|
}
|
|
884
758
|
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
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 () => {
|
|
892
766
|
try {
|
|
893
|
-
const
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
const
|
|
898
|
-
|
|
899
|
-
: undefined;
|
|
900
|
-
const qdrantClient = initQdrantClient({
|
|
901
|
-
url: qdrantUrl,
|
|
902
|
-
collection: config.memory.qdrant.collection,
|
|
903
|
-
vectorSize: config.memory.qdrant.vectorSize,
|
|
904
|
-
onDisk: config.memory.qdrant.onDisk,
|
|
905
|
-
quantization: config.memory.qdrant.quantization,
|
|
906
|
-
embeddingModel,
|
|
907
|
-
});
|
|
908
|
-
|
|
909
|
-
// Eagerly ensure the collection exists so we detect migrations
|
|
910
|
-
// (unnamed→named vectors, dimension/model changes) at startup.
|
|
911
|
-
// If a destructive migration occurred, enqueue a rebuild_index job
|
|
912
|
-
// to re-embed all memory items from the SQLite cache.
|
|
913
|
-
const { migrated } = await qdrantClient.ensureCollection();
|
|
914
|
-
if (migrated && isMemoryEnabled()) {
|
|
915
|
-
enqueueMemoryJob("rebuild_index", {});
|
|
916
|
-
log.info(
|
|
917
|
-
"Qdrant collection was migrated — enqueued rebuild_index job",
|
|
918
|
-
);
|
|
919
|
-
}
|
|
920
|
-
|
|
921
|
-
log.info("Qdrant vector store initialized");
|
|
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);
|
|
922
773
|
} catch (err) {
|
|
923
774
|
log.warn(
|
|
924
775
|
{ err },
|
|
925
|
-
"
|
|
776
|
+
"PKB index reconciliation failed — continuing startup",
|
|
926
777
|
);
|
|
927
778
|
}
|
|
928
|
-
}
|
|
929
|
-
|
|
930
|
-
// Detect schema drift on the v2 concept-page collection (e.g.
|
|
931
|
-
// pre-#29823 collections lacking summary_dense / summary_sparse) and
|
|
932
|
-
// recreate + enqueue a reembed when needed. Awaited inline so the
|
|
933
|
-
// reembed enqueue happens before the memory worker drains its first
|
|
934
|
-
// batch; the call's own try/catch keeps any v2-side failure from
|
|
935
|
-
// blocking the v1 PKB reconcile or BM25 build below.
|
|
936
|
-
try {
|
|
937
|
-
await maybeRebuildMemoryV2Concepts(config);
|
|
938
|
-
} catch (err) {
|
|
939
|
-
log.warn(
|
|
940
|
-
{ err },
|
|
941
|
-
"Memory v2 collection schema check threw — continuing startup",
|
|
942
|
-
);
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
// Reconcile the PKB Qdrant index against the on-disk tree. Gated on
|
|
946
|
-
// !v2 because PKB is the v1 storage layer; under v2 the v1 collection
|
|
947
|
-
// is not initialized, so calling `getQdrantClient()` here would throw.
|
|
948
|
-
// Fire-and-forget so enqueued re-index jobs drain in the background
|
|
949
|
-
// and first-turn latency stays unaffected.
|
|
950
|
-
if (!config.memory.v2.enabled) {
|
|
951
|
-
void (async () => {
|
|
952
|
-
try {
|
|
953
|
-
const { reconcilePkbIndex } =
|
|
954
|
-
await import("../memory/pkb/pkb-reconcile.js");
|
|
955
|
-
const { PKB_WORKSPACE_SCOPE } =
|
|
956
|
-
await import("../memory/pkb/types.js");
|
|
957
|
-
const pkbRoot = join(getWorkspaceDir(), "pkb");
|
|
958
|
-
await reconcilePkbIndex(pkbRoot, PKB_WORKSPACE_SCOPE);
|
|
959
|
-
} catch (err) {
|
|
960
|
-
log.warn(
|
|
961
|
-
{ err },
|
|
962
|
-
"PKB index reconciliation failed — continuing startup",
|
|
963
|
-
);
|
|
964
|
-
}
|
|
965
|
-
})();
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
void rebuildBm25CorpusStatsAndReseedSkills(config);
|
|
969
|
-
|
|
970
|
-
try {
|
|
971
|
-
await sweepConceptPageFrontmatter(config, getWorkspaceDir());
|
|
972
|
-
} catch (err) {
|
|
973
|
-
log.warn(
|
|
974
|
-
{ err },
|
|
975
|
-
"Concept page frontmatter sweep threw — continuing startup",
|
|
976
|
-
);
|
|
977
|
-
}
|
|
779
|
+
})();
|
|
978
780
|
}
|
|
979
781
|
|
|
980
|
-
|
|
981
|
-
// the synchronous runner and stands down when an out-of-process worker is
|
|
982
|
-
// live) and spawns the out-of-process worker at boot when
|
|
983
|
-
// `memory.worker.enabled` is set. Shutdown stops whichever worker is
|
|
984
|
-
// actually running — see shutdown-handlers.ts.
|
|
985
|
-
log.info("Daemon startup: starting memory worker");
|
|
986
|
-
bgRefs.memoryWorker = startMemoryJobsWorker();
|
|
782
|
+
void rebuildBm25CorpusStatsAndReseedSkills(config);
|
|
987
783
|
|
|
988
|
-
// Seed capability graph nodes (new memory graph system)
|
|
989
784
|
try {
|
|
990
|
-
|
|
991
|
-
await import("../memory/graph/capability-seed.js");
|
|
992
|
-
refreshSkillCapabilityMemories(config);
|
|
993
|
-
await seedCliGraphNodes();
|
|
785
|
+
await sweepConceptPageFrontmatter(config, getWorkspaceDir());
|
|
994
786
|
} catch (err) {
|
|
995
|
-
log.warn(
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
// Auto-bootstrap: if the graph has no non-procedural nodes but historical
|
|
999
|
-
// segments exist, enqueue a one-time graph_bootstrap job to populate the
|
|
1000
|
-
// graph from conversation history and journal files.
|
|
1001
|
-
try {
|
|
1002
|
-
const { maybeEnqueueGraphBootstrap, cleanupStaleItemVectors } =
|
|
1003
|
-
await import("../memory/graph/bootstrap.js");
|
|
1004
|
-
maybeEnqueueGraphBootstrap();
|
|
1005
|
-
// Fire-and-forget: clean up orphaned Qdrant vectors from dropped memory_items table
|
|
1006
|
-
void cleanupStaleItemVectors().catch((err) =>
|
|
1007
|
-
log.warn({ err }, "Stale item vector cleanup failed — continuing"),
|
|
787
|
+
log.warn(
|
|
788
|
+
{ err },
|
|
789
|
+
"Concept page frontmatter sweep threw — continuing startup",
|
|
1008
790
|
);
|
|
1009
|
-
} catch (err) {
|
|
1010
|
-
log.warn({ err }, "Graph bootstrap check failed — continuing");
|
|
1011
791
|
}
|
|
1012
792
|
}
|
|
1013
793
|
|
|
1014
|
-
|
|
1015
|
-
|
|
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();
|
|
1016
802
|
|
|
803
|
+
// Seed capability graph nodes (new memory graph system)
|
|
1017
804
|
try {
|
|
1018
|
-
|
|
805
|
+
const { seedCliGraphNodes } =
|
|
806
|
+
await import("../plugins/defaults/memory/graph/capability-seed.js");
|
|
807
|
+
refreshSkillCapabilityMemories(config);
|
|
808
|
+
await seedCliGraphNodes();
|
|
1019
809
|
} catch (err) {
|
|
1020
|
-
log.
|
|
810
|
+
log.warn({ err }, "Graph capability seeding failed — continuing");
|
|
1021
811
|
}
|
|
1022
812
|
|
|
1023
|
-
//
|
|
1024
|
-
//
|
|
1025
|
-
//
|
|
1026
|
-
// resume. Status only — accounting counters are preserved. Never blocks
|
|
1027
|
-
// startup on failure.
|
|
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.
|
|
1028
816
|
try {
|
|
1029
|
-
const
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
)
|
|
1035
|
-
}
|
|
1036
|
-
} catch (err) {
|
|
1037
|
-
log.error(
|
|
1038
|
-
{ err },
|
|
1039
|
-
"Workflow run reconciliation failed — continuing startup",
|
|
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"),
|
|
1040
823
|
);
|
|
824
|
+
} catch (err) {
|
|
825
|
+
log.warn({ err }, "Graph bootstrap check failed — continuing");
|
|
1041
826
|
}
|
|
827
|
+
}
|
|
1042
828
|
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
await processMessage(
|
|
1046
|
-
conversationId,
|
|
1047
|
-
message,
|
|
1048
|
-
options
|
|
1049
|
-
? {
|
|
1050
|
-
...(options.trustClass
|
|
1051
|
-
? {
|
|
1052
|
-
trustContext: {
|
|
1053
|
-
sourceChannel: "vellum",
|
|
1054
|
-
trustClass: options.trustClass,
|
|
1055
|
-
},
|
|
1056
|
-
}
|
|
1057
|
-
: {}),
|
|
1058
|
-
...(options.taskRunId ? { taskRunId: options.taskRunId } : {}),
|
|
1059
|
-
...(options.overrideProfile
|
|
1060
|
-
? { overrideProfile: options.overrideProfile }
|
|
1061
|
-
: {}),
|
|
1062
|
-
}
|
|
1063
|
-
: undefined,
|
|
1064
|
-
);
|
|
1065
|
-
},
|
|
1066
|
-
async (schedule) => {
|
|
1067
|
-
await emitNotificationSignal({
|
|
1068
|
-
sourceEventName: "schedule.notify",
|
|
1069
|
-
sourceChannel: "scheduler",
|
|
1070
|
-
sourceContextId: schedule.id,
|
|
1071
|
-
attentionHints: {
|
|
1072
|
-
requiresAction: true,
|
|
1073
|
-
urgency: "high",
|
|
1074
|
-
isAsyncBackground: false,
|
|
1075
|
-
visibleInSourceNow: false,
|
|
1076
|
-
},
|
|
1077
|
-
contextPayload: {
|
|
1078
|
-
scheduleId: schedule.id,
|
|
1079
|
-
label: schedule.label,
|
|
1080
|
-
message: schedule.message,
|
|
1081
|
-
},
|
|
1082
|
-
routingIntent: schedule.routingIntent,
|
|
1083
|
-
routingHints: schedule.routingHints,
|
|
1084
|
-
conversationMetadata: {
|
|
1085
|
-
groupId: "system:scheduled",
|
|
1086
|
-
scheduleJobId: schedule.id,
|
|
1087
|
-
source: "schedule",
|
|
1088
|
-
},
|
|
1089
|
-
dedupeKey: `schedule:notify:${schedule.id}:${Date.now()}`,
|
|
1090
|
-
throwOnError: true,
|
|
1091
|
-
});
|
|
1092
|
-
},
|
|
1093
|
-
(notification) => {
|
|
1094
|
-
void emitNotificationSignal({
|
|
1095
|
-
sourceEventName: "watcher.notification",
|
|
1096
|
-
sourceChannel: "watcher",
|
|
1097
|
-
sourceContextId: `watcher-${Date.now()}`,
|
|
1098
|
-
attentionHints: {
|
|
1099
|
-
requiresAction: false,
|
|
1100
|
-
urgency: "low",
|
|
1101
|
-
isAsyncBackground: true,
|
|
1102
|
-
visibleInSourceNow: false,
|
|
1103
|
-
},
|
|
1104
|
-
contextPayload: {
|
|
1105
|
-
title: notification.title,
|
|
1106
|
-
body: notification.body,
|
|
1107
|
-
},
|
|
1108
|
-
dedupeKey: `watcher:notification:${crypto.randomUUID()}`,
|
|
1109
|
-
});
|
|
1110
|
-
},
|
|
1111
|
-
(info) => {
|
|
1112
|
-
broadcastMessage({
|
|
1113
|
-
type: "schedule_conversation_created",
|
|
1114
|
-
conversationId: info.conversationId,
|
|
1115
|
-
scheduleJobId: info.scheduleJobId,
|
|
1116
|
-
title: info.title,
|
|
1117
|
-
});
|
|
1118
|
-
publishConversationListChanged("created");
|
|
1119
|
-
},
|
|
1120
|
-
);
|
|
829
|
+
registerWatcherProviders();
|
|
830
|
+
registerMessagingProviders();
|
|
1121
831
|
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
// even when the HTTP server failed to bind (IPC clients still work).
|
|
1128
|
-
registerSecretsDeps({
|
|
1129
|
-
getCesClient: () => server.getCesClient(),
|
|
1130
|
-
onProviderCredentialsChanged: () =>
|
|
1131
|
-
server.refreshConversationsForProviderChange(),
|
|
1132
|
-
});
|
|
832
|
+
try {
|
|
833
|
+
await recoverStaleSchedules();
|
|
834
|
+
} catch (err) {
|
|
835
|
+
log.error({ err }, "Schedule recovery failed — continuing startup");
|
|
836
|
+
}
|
|
1133
837
|
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
838
|
+
// Reconcile workflow runs orphaned by a crash: any row still `running` was
|
|
839
|
+
// in flight when the process died (the engine always finishes its row on
|
|
840
|
+
// exit), so flip it to `interrupted` to make it eligible for an explicit
|
|
841
|
+
// resume. Status only — accounting counters are preserved. Never blocks
|
|
842
|
+
// startup on failure.
|
|
843
|
+
try {
|
|
844
|
+
const reconciled = getWorkflowRunManager().reconcileOrphanedRuns();
|
|
845
|
+
if (reconciled > 0) {
|
|
846
|
+
log.info(
|
|
847
|
+
{ reconciled },
|
|
848
|
+
"Reconciled orphaned workflow runs to interrupted",
|
|
849
|
+
);
|
|
850
|
+
}
|
|
851
|
+
} catch (err) {
|
|
852
|
+
log.error(
|
|
853
|
+
{ err },
|
|
854
|
+
"Workflow run reconciliation failed — continuing startup",
|
|
1142
855
|
);
|
|
856
|
+
}
|
|
1143
857
|
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
858
|
+
startScheduler(async (conversationId, message, options) => {
|
|
859
|
+
await processMessage(
|
|
860
|
+
conversationId,
|
|
861
|
+
message,
|
|
862
|
+
options
|
|
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
|
+
});
|
|
910
|
+
try {
|
|
911
|
+
setRelayBroadcast((msg) => broadcastMessage(msg));
|
|
912
|
+
setPointerMessageProcessor(
|
|
913
|
+
async (conversationId, instruction, requiredFacts) => {
|
|
914
|
+
const conversation = await getOrCreateConversation(conversationId);
|
|
915
|
+
|
|
916
|
+
// Pointer turns are guardian-gated owner self-maintenance: elevate to
|
|
917
|
+
// the internal guardian context and rehydrate history so a cold
|
|
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 ?? []) {
|
|
1194
953
|
try {
|
|
1195
|
-
deleteMessageById(
|
|
954
|
+
deleteMessageById(id);
|
|
1196
955
|
} catch {
|
|
1197
956
|
/* best effort */
|
|
1198
957
|
}
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
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;
|
|
1205
994
|
}
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
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";
|
|
1210
1005
|
}
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
// Snapshot message IDs before the agent loop so we can diff
|
|
1214
|
-
// afterwards to find exactly which messages this run created,
|
|
1215
|
-
// avoiding positional heuristics that break under concurrency.
|
|
1216
|
-
//
|
|
1217
|
-
// Caveat: the diff captures *all* new messages in the
|
|
1218
|
-
// conversation during the loop window, not just those from
|
|
1219
|
-
// this specific agent loop. If a concurrent pointer event
|
|
1220
|
-
// falls back to a deterministic addMessage() while our loop
|
|
1221
|
-
// is in flight, that message lands in our diff. The race
|
|
1222
|
-
// requires two pointer events for the same conversation
|
|
1223
|
-
// within the agent loop window *and* this run must fail or
|
|
1224
|
-
// fail fact-check — narrow enough to accept. A future
|
|
1225
|
-
// improvement could tag messages with a per-run correlation
|
|
1226
|
-
// ID so rollback only targets its own output.
|
|
1227
|
-
const preRunMessageIds = new Set(
|
|
1228
|
-
getMessages(conversationId).map((m) => m.id),
|
|
1229
|
-
);
|
|
1006
|
+
},
|
|
1007
|
+
});
|
|
1230
1008
|
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
(msg.type === "error" || msg.type === "conversation_error")
|
|
1245
|
-
) {
|
|
1246
|
-
agentLoopError =
|
|
1247
|
-
"message" in msg
|
|
1248
|
-
? (msg as { message: string }).message
|
|
1249
|
-
: "userMessage" in msg
|
|
1250
|
-
? (msg as { userMessage: string }).userMessage
|
|
1251
|
-
: "Agent loop failed";
|
|
1252
|
-
}
|
|
1253
|
-
},
|
|
1254
|
-
});
|
|
1255
|
-
|
|
1256
|
-
// Identify messages created during this run by diffing against
|
|
1257
|
-
// the pre-run snapshot. This captures all messages added to the
|
|
1258
|
-
// conversation during the loop window, which may include messages
|
|
1259
|
-
// from concurrent pointer events (see over-capture caveat above).
|
|
1260
|
-
const postRunMessages = getMessages(conversationId);
|
|
1261
|
-
const createdMessageIds = postRunMessages
|
|
1262
|
-
.filter((m) => !preRunMessageIds.has(m.id) && m.id !== messageId)
|
|
1263
|
-
.map((m) => m.id);
|
|
1264
|
-
|
|
1265
|
-
if (agentLoopError) {
|
|
1266
|
-
await rollback(createdMessageIds);
|
|
1267
|
-
throw new Error(agentLoopError);
|
|
1268
|
-
}
|
|
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
|
+
}
|
|
1269
1022
|
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
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",
|
|
1283
1041
|
);
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
{ conversationId, missingFacts },
|
|
1287
|
-
"Generated pointer text failed fact validation — falling back to deterministic",
|
|
1288
|
-
);
|
|
1289
|
-
await rollback(createdMessageIds);
|
|
1290
|
-
throw new Error(
|
|
1291
|
-
"Generated pointer text failed fact validation",
|
|
1292
|
-
);
|
|
1293
|
-
}
|
|
1042
|
+
await rollback(createdMessageIds);
|
|
1043
|
+
throw new Error("Generated pointer text failed fact validation");
|
|
1294
1044
|
}
|
|
1295
|
-
} finally {
|
|
1296
|
-
// Restore tool availability so subsequent turns aren't affected.
|
|
1297
|
-
conversation.toolsDisabledDepth--;
|
|
1298
1045
|
}
|
|
1299
|
-
}
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
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();
|
|
1055
|
+
} catch (err) {
|
|
1056
|
+
log.warn(
|
|
1057
|
+
{ err },
|
|
1058
|
+
"Failed to wire runtime HTTP server deps, continuing without them",
|
|
1059
|
+
);
|
|
1060
|
+
}
|
|
1309
1061
|
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1062
|
+
// Register built-in TTS providers so the provider abstraction can resolve
|
|
1063
|
+
// them by ID. Must happen before call controllers or routes are created.
|
|
1064
|
+
try {
|
|
1065
|
+
registerBuiltinTtsProviders();
|
|
1066
|
+
} catch (err) {
|
|
1067
|
+
log.warn(
|
|
1068
|
+
{ err },
|
|
1069
|
+
"TTS provider registration failed — continuing with degraded TTS",
|
|
1070
|
+
);
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
// Initialize providers and tools after the HTTP server is listening so
|
|
1074
|
+
// health-check and pairing requests can be served immediately. Wrapped in
|
|
1075
|
+
// its own try/catch so a failure here doesn't tear down the running HTTP
|
|
1076
|
+
// server (providers were already initialized earlier in startup and tools
|
|
1077
|
+
// are resolved lazily at conversation creation time).
|
|
1078
|
+
try {
|
|
1079
|
+
log.info("Daemon startup: initializing providers and tools");
|
|
1080
|
+
await initializeProvidersAndTools(config);
|
|
1081
|
+
} catch (err) {
|
|
1082
|
+
log.warn(
|
|
1083
|
+
{ err },
|
|
1084
|
+
"Provider/tool initialization failed — continuing with degraded functionality",
|
|
1085
|
+
);
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
writePid(process.pid);
|
|
1089
|
+
|
|
1090
|
+
// Install the `assistant` CLI symlink idempotently on every daemon start.
|
|
1091
|
+
// Non-blocking — failures are logged but don't affect startup.
|
|
1092
|
+
try {
|
|
1093
|
+
installAssistantSymlink();
|
|
1094
|
+
} catch (err) {
|
|
1095
|
+
log.warn({ err }, "Assistant symlink installation failed — continuing");
|
|
1096
|
+
}
|
|
1320
1097
|
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
// server (DaemonServer.start() already calls initializeProviders internally
|
|
1325
|
-
// and tools are resolved lazily at conversation creation time).
|
|
1098
|
+
// Download embedding runtime in background (non-blocking).
|
|
1099
|
+
// If download fails, local embeddings gracefully fall back to cloud backends.
|
|
1100
|
+
void (async () => {
|
|
1326
1101
|
try {
|
|
1327
|
-
|
|
1328
|
-
|
|
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
|
+
}
|
|
1329
1115
|
} catch (err) {
|
|
1330
1116
|
log.warn(
|
|
1331
1117
|
{ err },
|
|
1332
|
-
"
|
|
1118
|
+
"Embedding runtime download failed — local embeddings will use cloud fallback",
|
|
1333
1119
|
);
|
|
1334
1120
|
}
|
|
1121
|
+
})();
|
|
1335
1122
|
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
installAssistantSymlink();
|
|
1342
|
-
} catch (err) {
|
|
1343
|
-
log.warn({ err }, "Assistant symlink installation failed — continuing");
|
|
1344
|
-
}
|
|
1345
|
-
|
|
1346
|
-
// Download embedding runtime in background (non-blocking).
|
|
1347
|
-
// If download fails, local embeddings gracefully fall back to cloud backends.
|
|
1348
|
-
void (async () => {
|
|
1349
|
-
try {
|
|
1350
|
-
const { EmbeddingRuntimeManager } =
|
|
1351
|
-
await import("../memory/embedding-runtime-manager.js");
|
|
1352
|
-
const runtimeManager = new EmbeddingRuntimeManager();
|
|
1353
|
-
if (!runtimeManager.isReady()) {
|
|
1354
|
-
log.info("Downloading embedding runtime in background...");
|
|
1355
|
-
await runtimeManager.ensureInstalled();
|
|
1356
|
-
// Reset the sticky local-backend failure flag so auto mode retries
|
|
1357
|
-
// local embeddings without evicting a worker that may already be live.
|
|
1358
|
-
const { resetLocalEmbeddingFailureState } =
|
|
1359
|
-
await import("../memory/embedding-backend.js");
|
|
1360
|
-
resetLocalEmbeddingFailureState();
|
|
1361
|
-
log.info("Embedding runtime download complete");
|
|
1362
|
-
}
|
|
1363
|
-
} catch (err) {
|
|
1364
|
-
log.warn(
|
|
1365
|
-
{ err },
|
|
1366
|
-
"Embedding runtime download failed — local embeddings will use cloud fallback",
|
|
1367
|
-
);
|
|
1368
|
-
}
|
|
1369
|
-
})();
|
|
1123
|
+
if (config.auditLog.retentionDays > 0) {
|
|
1124
|
+
void rotateToolInvocations(config.auditLog.retentionDays).catch((err) => {
|
|
1125
|
+
log.warn({ err }, "Audit log rotation failed");
|
|
1126
|
+
});
|
|
1127
|
+
}
|
|
1370
1128
|
|
|
1371
|
-
|
|
1372
|
-
void rotateToolInvocations(config.auditLog.retentionDays).catch((err) => {
|
|
1373
|
-
log.warn({ err }, "Audit log rotation failed");
|
|
1374
|
-
});
|
|
1375
|
-
}
|
|
1129
|
+
startWorkspaceHeartbeatService();
|
|
1376
1130
|
|
|
1377
|
-
|
|
1378
|
-
workspaceHeartbeat.start();
|
|
1379
|
-
|
|
1380
|
-
const heartbeatConfig = config.heartbeat;
|
|
1381
|
-
const heartbeat = new HeartbeatService({
|
|
1382
|
-
alerter: (alert) => broadcastMessage(alert),
|
|
1383
|
-
onConversationCreated: (info) =>
|
|
1384
|
-
broadcastMessage({
|
|
1385
|
-
type: "heartbeat_conversation_created",
|
|
1386
|
-
conversationId: info.conversationId,
|
|
1387
|
-
title: info.title,
|
|
1388
|
-
}),
|
|
1389
|
-
});
|
|
1390
|
-
heartbeat.start();
|
|
1391
|
-
registerBackgroundWakeRuntime({ scheduler, heartbeat });
|
|
1392
|
-
refreshBackgroundWakeIntent("daemon-startup");
|
|
1393
|
-
log.info(
|
|
1394
|
-
{
|
|
1395
|
-
enabled: heartbeatConfig.enabled,
|
|
1396
|
-
intervalMs: heartbeatConfig.intervalMs,
|
|
1397
|
-
},
|
|
1398
|
-
"Heartbeat service configured",
|
|
1399
|
-
);
|
|
1131
|
+
startHeartbeatService();
|
|
1400
1132
|
|
|
1401
|
-
|
|
1402
|
-
// both serve the same role (periodic background memory processing) and
|
|
1403
|
-
// running both is redundant. The consolidation job runs through the
|
|
1404
|
-
// memory jobs worker (see `maybeEnqueueGraphMaintenanceJobs`).
|
|
1405
|
-
const memoryV2Enabled = config.memory.v2.enabled;
|
|
1406
|
-
let filing: FilingService | null = null;
|
|
1407
|
-
if (!memoryV2Enabled) {
|
|
1408
|
-
const filingConfig = config.filing;
|
|
1409
|
-
filing = new FilingService();
|
|
1410
|
-
filing.start();
|
|
1411
|
-
log.info(
|
|
1412
|
-
{
|
|
1413
|
-
enabled: filingConfig.enabled,
|
|
1414
|
-
intervalMs: filingConfig.intervalMs,
|
|
1415
|
-
},
|
|
1416
|
-
"Filing service configured",
|
|
1417
|
-
);
|
|
1418
|
-
} else {
|
|
1419
|
-
log.info(
|
|
1420
|
-
"Filing service skipped — memory v2 consolidation is the active background memory job",
|
|
1421
|
-
);
|
|
1422
|
-
}
|
|
1133
|
+
installShutdownHandlers();
|
|
1423
1134
|
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
: null;
|
|
1430
|
-
|
|
1431
|
-
installShutdownHandlers({
|
|
1432
|
-
server,
|
|
1433
|
-
workspaceHeartbeat,
|
|
1434
|
-
heartbeat,
|
|
1435
|
-
filing,
|
|
1436
|
-
runtimeHttp,
|
|
1437
|
-
scheduler,
|
|
1438
|
-
getMemoryWorker: () => bgRefs.memoryWorker,
|
|
1439
|
-
getQdrantManager: () => bgRefs.qdrantManager,
|
|
1440
|
-
mcpManager,
|
|
1441
|
-
telemetryReporter,
|
|
1442
|
-
cleanupPidFile: () => {
|
|
1443
|
-
stopGatewayFlagListener();
|
|
1444
|
-
stopDiskPressureGuardForLifecycle();
|
|
1445
|
-
stopOrphanReaper();
|
|
1446
|
-
stopEventLoopWatchdog();
|
|
1447
|
-
cleanupPidFile();
|
|
1448
|
-
},
|
|
1449
|
-
});
|
|
1135
|
+
// The critical startup await-chain has completed and the daemon can serve
|
|
1136
|
+
// requests, so latch readiness before logging "Daemon started". Any fatal
|
|
1137
|
+
// failure earlier in startup propagates out of runDaemon before this line,
|
|
1138
|
+
// so the latch is never set on a failed start.
|
|
1139
|
+
setStartupComplete();
|
|
1450
1140
|
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
} catch (err) {
|
|
1459
|
-
log.error({ err }, "Daemon startup failed — cleaning up");
|
|
1460
|
-
stopDiskPressureGuardForLifecycle();
|
|
1461
|
-
stopOrphanReaper();
|
|
1462
|
-
stopEventLoopWatchdog();
|
|
1463
|
-
cleanupPidFileIfOwner(process.pid);
|
|
1464
|
-
throw err;
|
|
1465
|
-
}
|
|
1141
|
+
log.info(
|
|
1142
|
+
{
|
|
1143
|
+
durationMs: Date.now() - startupStartedAt,
|
|
1144
|
+
pid: process.pid,
|
|
1145
|
+
},
|
|
1146
|
+
"Daemon started",
|
|
1147
|
+
);
|
|
1466
1148
|
}
|