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