@vellumai/assistant 0.10.4-staging.1 → 0.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +13 -13
- package/bun.lock +165 -0
- package/docs/architecture/memory.md +26 -0
- package/eslint-rules/cli-no-daemon-internals.js +9 -8
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +18 -0
- package/openapi.yaml +677 -15
- package/package.json +8 -1
- package/scripts/generate-openapi.ts +149 -62
- package/src/__tests__/acp-session.test.ts +2 -2
- package/src/__tests__/activation-early-marking.test.ts +4 -4
- package/src/__tests__/actor-token-service.test.ts +2 -3
- package/src/__tests__/agent-loop-compaction-events.test.ts +1 -0
- package/src/__tests__/agent-loop-compaction-strip.test.ts +2 -0
- package/src/__tests__/agent-loop-exit-reason.test.ts +4 -1
- package/src/__tests__/agent-loop-override-profile.test.ts +2 -2
- package/src/__tests__/agent-loop-regrowth-guard.test.ts +8 -0
- package/src/__tests__/agent-loop.test.ts +1 -0
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +3 -3
- package/src/__tests__/agent-wake-override-profile.test.ts +3 -3
- package/src/__tests__/annotate-activity-metadata.test.ts +4 -4
- package/src/__tests__/annotate-risk-options.test.ts +4 -4
- package/src/__tests__/anthropic-provider.test.ts +53 -2
- package/src/__tests__/app-builder-tool-scripts.test.ts +2 -2
- package/src/__tests__/app-bundler.test.ts +1 -1
- package/src/__tests__/app-conversation-ids-backfill.test.ts +4 -4
- package/src/__tests__/app-conversation-ids.test.ts +1 -1
- package/src/__tests__/app-dir-path-guard.test.ts +2 -2
- package/src/__tests__/app-executors.test.ts +1 -1
- package/src/__tests__/app-git-history.test.ts +2 -2
- package/src/__tests__/app-git-service.test.ts +2 -2
- package/src/__tests__/app-routes-csp.test.ts +2 -2
- package/src/__tests__/app-source-watcher.test.ts +1 -1
- package/src/__tests__/app-store-dir-names.test.ts +1 -1
- package/src/__tests__/approval-cascade.test.ts +7 -7
- package/src/__tests__/approval-interception-trust-gates.test.ts +1 -1
- package/src/__tests__/approval-primitive.test.ts +3 -3
- package/src/__tests__/approval-routes-http.test.ts +2 -2
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +1 -1
- package/src/__tests__/assistant-events-sse-hardening.test.ts +2 -2
- package/src/__tests__/assistant-events-sse-shed.test.ts +2 -2
- package/src/__tests__/attachment-upload-trusted-source.test.ts +4 -2
- package/src/__tests__/attachments-store.test.ts +9 -6
- package/src/__tests__/audit-log-rotation.test.ts +6 -4
- package/src/__tests__/auth-fallback-events-store.test.ts +4 -4
- package/src/__tests__/auto-analysis-end-to-end.test.ts +13 -9
- package/src/__tests__/background-workers-disk-pressure.test.ts +12 -7
- package/src/__tests__/btw-routes.test.ts +4 -5
- package/src/__tests__/build-persisted-content.test.ts +4 -4
- package/src/__tests__/call-controller.test.ts +6 -6
- package/src/__tests__/call-conversation-messages.test.ts +4 -4
- package/src/__tests__/call-domain.test.ts +5 -5
- package/src/__tests__/call-pointer-messages.test.ts +5 -5
- package/src/__tests__/call-recovery.test.ts +3 -3
- package/src/__tests__/call-routes-http.test.ts +3 -3
- package/src/__tests__/call-store.test.ts +3 -3
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +2 -2
- package/src/__tests__/canonical-guardian-store.test.ts +3 -3
- package/src/__tests__/channel-approval-routes.test.ts +9 -7
- package/src/__tests__/channel-delivery-store.test.ts +8 -8
- package/src/__tests__/channel-guardian.test.ts +24 -66
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +2 -2
- package/src/__tests__/channel-retry-sweep.test.ts +49 -4
- package/src/__tests__/clawhub.test.ts +4 -0
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/compaction-ledger-store.test.ts +4 -4
- package/src/__tests__/compaction-trail-store.test.ts +5 -5
- package/src/__tests__/compaction.benchmark.test.ts +5 -5
- package/src/__tests__/compactor-call-site-logging.test.ts +5 -5
- package/src/__tests__/compactor-image-manifest-trust.test.ts +7 -4
- package/src/__tests__/compactor-low-watermark-cut.test.ts +5 -5
- package/src/__tests__/compactor-preserved-tail-count.test.ts +4 -4
- package/src/__tests__/compactor-summary-call-truncation.test.ts +5 -5
- package/src/__tests__/compactor-web-search-strip.test.ts +4 -4
- package/src/__tests__/config-get-vision-flag.test.ts +1 -1
- package/src/__tests__/config-loader-backfill.test.ts +84 -104
- package/src/__tests__/config-set-route.test.ts +5 -2
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +3 -3
- package/src/__tests__/config-watcher-skill-reseed.test.ts +39 -112
- package/src/__tests__/config-watcher.test.ts +54 -31
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +4 -4
- package/src/__tests__/contact-store-interaction-info.test.ts +3 -3
- package/src/__tests__/contact-store-user-file.test.ts +91 -81
- package/src/__tests__/contacts-relay-reads.test.ts +21 -3
- package/src/__tests__/contacts-tools.test.ts +2 -2
- package/src/__tests__/contacts-write.test.ts +2 -2
- package/src/__tests__/context-search-agent-protocol.test.ts +2 -2
- package/src/__tests__/context-search-agent-runner.test.ts +2 -2
- package/src/__tests__/context-search-conversations-source.test.ts +5 -5
- package/src/__tests__/context-search-fanout.test.ts +3 -3
- package/src/__tests__/context-search-memory-source.test.ts +9 -8
- package/src/__tests__/context-search-memory-v2-source.test.ts +9 -8
- package/src/__tests__/context-search-types.test.ts +2 -2
- package/src/__tests__/context-search-workspace-source.test.ts +2 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +5 -5
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -3
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +39 -11
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +6 -6
- package/src/__tests__/conversation-agent-loop.test.ts +51 -13
- package/src/__tests__/conversation-analysis-routes.test.ts +4 -4
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -1
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +7 -7
- package/src/__tests__/conversation-attachments.test.ts +7 -4
- package/src/__tests__/conversation-attention-store.test.ts +4 -4
- package/src/__tests__/conversation-attention-telegram.test.ts +8 -5
- package/src/__tests__/conversation-clear-safety.test.ts +3 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +7 -7
- package/src/__tests__/conversation-crud-inference-profile.test.ts +3 -3
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +25 -25
- package/src/__tests__/conversation-directories-parse.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +5 -5
- package/src/__tests__/conversation-disk-view.test.ts +6 -6
- package/src/__tests__/conversation-evictor.test.ts +32 -7
- package/src/__tests__/conversation-fork-crud.test.ts +24 -21
- package/src/__tests__/conversation-fork-retrospective.test.ts +12 -10
- package/src/__tests__/conversation-fork-route.test.ts +6 -3
- package/src/__tests__/conversation-history-web-search.test.ts +8 -8
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -3
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -3
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +7 -4
- package/src/__tests__/conversation-lifecycle.test.ts +10 -13
- package/src/__tests__/conversation-list-source.test.ts +3 -3
- package/src/__tests__/conversation-load-history-repair.test.ts +4 -4
- package/src/__tests__/conversation-load-history-stripped.test.ts +4 -4
- package/src/__tests__/conversation-pairing.test.ts +4 -4
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +5 -5
- package/src/__tests__/conversation-process-callsite.test.ts +5 -5
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -5
- package/src/__tests__/conversation-queue.test.ts +55 -9
- package/src/__tests__/conversation-routes-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +6 -6
- package/src/__tests__/conversation-routes-slash-commands.test.ts +57 -10
- package/src/__tests__/conversation-runtime-assembly.test.ts +25 -19
- package/src/__tests__/conversation-runtime-workspace.test.ts +8 -1
- package/src/__tests__/conversation-skill-tools.test.ts +155 -2
- package/src/__tests__/conversation-slash-queue.test.ts +6 -6
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -6
- package/src/__tests__/conversation-speed-override.test.ts +7 -7
- package/src/__tests__/conversation-starter-routes.test.ts +2 -2
- package/src/__tests__/conversation-store.test.ts +6 -6
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +2 -2
- package/src/__tests__/conversation-sync-tags.test.ts +7 -4
- package/src/__tests__/conversation-title-service.test.ts +2 -3
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +6 -6
- package/src/__tests__/conversation-wipe.test.ts +6 -4
- package/src/__tests__/conversation-workspace-cache-state.test.ts +9 -9
- package/src/__tests__/conversation-workspace-injection.test.ts +9 -9
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +9 -9
- package/src/__tests__/conversations-import-system-filter.test.ts +5 -5
- package/src/__tests__/credential-security-invariants.test.ts +4 -4
- package/src/__tests__/db-acp-history.test.ts +4 -4
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +4 -4
- package/src/__tests__/db-activation-state.test.ts +3 -3
- package/src/__tests__/db-compaction-events-migration.test.ts +3 -3
- package/src/__tests__/db-connection-isolation.test.ts +1 -1
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +3 -3
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -6
- package/src/__tests__/db-drop-contact-acl-columns-migration.test.ts +159 -0
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +3 -3
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +3 -3
- package/src/__tests__/db-migration-rollback.test.ts +48 -43
- package/src/__tests__/db-proxy-transaction.test.ts +2 -2
- package/src/__tests__/db-rename-inference-profile-snake-case-migration.test.ts +3 -3
- package/src/__tests__/db-schedule-syntax-migration.test.ts +4 -4
- package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +3 -3
- package/src/__tests__/db-slack-external-content-normalization.test.ts +4 -4
- package/src/__tests__/db-test-helpers.ts +7 -0
- package/src/__tests__/delete-propagation.test.ts +4 -4
- package/src/__tests__/deterministic-verification-control-plane.test.ts +3 -3
- package/src/__tests__/device-id.test.ts +38 -1
- package/src/__tests__/dm-backfill.test.ts +3 -3
- package/src/__tests__/dm-persistence.test.ts +5 -5
- package/src/__tests__/document-conversations.test.ts +3 -3
- package/src/__tests__/document-create-dedupe.test.ts +1 -1
- package/src/__tests__/document-find-replace.test.ts +1 -1
- package/src/__tests__/document-tool-security.test.ts +1 -1
- package/src/__tests__/document-update-default-surface.test.ts +1 -1
- package/src/__tests__/drop-capability-card-state-migration.test.ts +3 -5
- package/src/__tests__/edit-propagation.test.ts +6 -6
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
- package/src/__tests__/empty-state-greeting-cache.test.ts +1 -1
- package/src/__tests__/events-client-registration.test.ts +1 -1
- package/src/__tests__/exploration-drift-hook.test.ts +7 -23
- package/src/__tests__/file-write-tool.test.ts +3 -3
- package/src/__tests__/filing-service.test.ts +6 -5
- package/src/__tests__/followup-tools.test.ts +2 -2
- package/src/__tests__/get-skill-detail-audit.test.ts +1 -1
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-action-sweep.test.ts +3 -3
- package/src/__tests__/guardian-binding-drift-heal.test.ts +6 -3
- package/src/__tests__/guardian-card-withdrawal.test.ts +3 -3
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +4 -4
- package/src/__tests__/guardian-dispatch.test.ts +14 -42
- package/src/__tests__/guardian-expiry-notifier.test.ts +4 -4
- package/src/__tests__/guardian-outbound-http.test.ts +3 -4
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +3 -3
- package/src/__tests__/guardian-routing-invariants.test.ts +3 -3
- package/src/__tests__/guardian-routing-state.test.ts +6 -4
- package/src/__tests__/guardian-verification-voice-binding.test.ts +4 -4
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +1 -1
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +3 -3
- package/src/__tests__/heartbeat-disk-pressure.test.ts +7 -13
- package/src/__tests__/heartbeat-service.test.ts +31 -19
- package/src/__tests__/helpers/channel-test-adapter.ts +22 -48
- package/src/__tests__/helpers/create-guardian-binding.ts +1 -1
- package/src/__tests__/helpers/derive-guardian-delivery.ts +66 -0
- package/src/__tests__/helpers/gateway-acl-store.ts +81 -0
- package/src/__tests__/helpers/seed-contact-channel.ts +50 -29
- package/src/__tests__/history-repair-hook.test.ts +1 -1
- package/src/__tests__/home-state-routes.test.ts +1 -1
- package/src/__tests__/http-conversation-lineage.test.ts +4 -4
- package/src/__tests__/http-user-message-parity.test.ts +8 -12
- package/src/__tests__/identity-routes.test.ts +113 -25
- package/src/__tests__/image-recovery-hook.test.ts +3 -3
- package/src/__tests__/inbound-invite-redemption.test.ts +36 -38
- package/src/__tests__/inbound-slack-persistence.test.ts +5 -5
- package/src/__tests__/inbound-trust-verdict.test.ts +5 -4
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +13 -6
- package/src/__tests__/inference-profile-reaper.test.ts +3 -3
- package/src/__tests__/inference-profile-session-handler.test.ts +3 -3
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -3
- package/src/__tests__/init-feature-flag-overrides.test.ts +1 -4
- package/src/__tests__/injection-block.test.ts +5 -2
- package/src/__tests__/injector-background-turn.test.ts +3 -5
- package/src/__tests__/injector-chain.test.ts +25 -16
- package/src/__tests__/injector-config-quarantine-notice.test.ts +3 -5
- package/src/__tests__/injector-disk-pressure.test.ts +10 -8
- package/src/__tests__/injector-document-comments.test.ts +5 -3
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +5 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +132 -0
- package/src/__tests__/injector-v3-suppression.test.ts +15 -9
- package/src/__tests__/install-meta.test.ts +104 -0
- package/src/__tests__/install-skill-routing.test.ts +1 -1
- package/src/__tests__/internal-telemetry-routes.test.ts +4 -4
- package/src/__tests__/invite-redemption-service.test.ts +42 -45
- package/src/__tests__/invite-routes-http.test.ts +3 -3
- package/src/__tests__/invite-service-ipc.test.ts +3 -3
- package/src/__tests__/job-handler-registry-guard.test.ts +125 -0
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +8 -8
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +7 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +7 -6
- package/src/__tests__/list-messages-attachments.test.ts +7 -4
- package/src/__tests__/list-messages-client-message-id.test.ts +6 -3
- package/src/__tests__/list-messages-hidden-metadata.test.ts +5 -5
- package/src/__tests__/list-messages-page-latest.test.ts +5 -5
- package/src/__tests__/list-messages-queued.test.ts +223 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +6 -3
- package/src/__tests__/llm-context-route-provider.test.ts +3 -3
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +4 -4
- package/src/__tests__/llm-request-log-call-site.test.ts +5 -5
- package/src/__tests__/llm-request-log-error-payload.test.ts +1 -1
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +2 -1
- package/src/__tests__/llm-request-log-source-factory.test.ts +3 -3
- package/src/__tests__/llm-request-log-turn-query.test.ts +9 -6
- package/src/__tests__/llm-usage-store.test.ts +137 -3
- package/src/__tests__/log-export-routes.test.ts +3 -3
- package/src/__tests__/log-export-workspace.test.ts +3 -3
- package/src/__tests__/managed-profile-guard.test.ts +1 -1
- package/src/__tests__/managed-skill-lifecycle.test.ts +3 -3
- package/src/__tests__/managed-store.test.ts +307 -0
- package/src/__tests__/mcp-config-secret-boundary.test.ts +2 -1
- package/src/__tests__/media-stream-server-integration.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +4 -4
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +11 -9
- package/src/__tests__/memory-recall-log-store.test.ts +4 -4
- package/src/__tests__/memory-retrieval-budget.test.ts +1 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +8 -8
- package/src/__tests__/memory-upsert-concurrency.test.ts +9 -5
- package/src/__tests__/memory-v2-static-injector.test.ts +3 -3
- package/src/__tests__/messages-after-tiebreaker.test.ts +4 -4
- package/src/__tests__/messaging-send-tool.test.ts +5 -5
- package/src/__tests__/mock-gateway-ipc.ts +1 -1
- package/src/__tests__/native-web-search.test.ts +11 -11
- package/src/__tests__/non-member-access-request.test.ts +9 -7
- package/src/__tests__/notification-candidate-guardian-context.test.ts +4 -4
- package/src/__tests__/notification-deep-link.test.ts +3 -3
- package/src/__tests__/notification-guardian-path.test.ts +3 -3
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +3 -3
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +2 -2
- package/src/__tests__/oauth-store.test.ts +6 -6
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +3 -3
- package/src/__tests__/persist-unsendable-image.test.ts +3 -3
- package/src/__tests__/persist-user-message-set-processing-failure.test.ts +70 -0
- package/src/__tests__/persistence-layering-guard.test.ts +207 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +6 -6
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +3 -3
- package/src/__tests__/playbook-execution.test.ts +4 -4
- package/src/__tests__/playbook-tools.test.ts +3 -3
- package/src/__tests__/plugin-bootstrap.test.ts +40 -3
- package/src/__tests__/plugin-config-data-migration.test.ts +263 -0
- package/src/__tests__/plugin-disabled-state.test.ts +137 -4
- package/src/__tests__/plugin-import-boundary-guard.test.ts +495 -0
- package/src/__tests__/plugin-injector-contribution.test.ts +149 -0
- package/src/__tests__/pointer-conversation-trust.test.ts +141 -0
- package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +8 -1
- package/src/__tests__/process-message-background-slack.test.ts +6 -6
- package/src/__tests__/process-message-display-content.test.ts +5 -5
- package/src/__tests__/processing-flag-persist-failure.test.ts +280 -0
- package/src/__tests__/provider-usage-tracking.test.ts +3 -3
- package/src/__tests__/prune-jobs-changes-parser.test.ts +1 -1
- package/src/__tests__/prune-old-conversations-job.test.ts +5 -5
- package/src/__tests__/published-app-updater.test.ts +3 -3
- package/src/__tests__/qdrant-collection-migration.test.ts +5 -2
- package/src/__tests__/qdrant-manager.test.ts +1 -1
- package/src/__tests__/reaction-intercept-cold-cache-warm.test.ts +18 -12
- package/src/__tests__/reaction-intercept-member-verdict-warm.test.ts +4 -4
- package/src/__tests__/reaction-persistence.test.ts +13 -10
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +5 -5
- package/src/__tests__/recording-handler.test.ts +2 -2
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +8 -8
- package/src/__tests__/relay-server.test.ts +140 -156
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/resolve-app-id.test.ts +3 -3
- package/src/__tests__/runtime-attachment-metadata.test.ts +7 -7
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +3 -3
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -3
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +3 -3
- package/src/__tests__/runtime-events-sse.test.ts +3 -3
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +489 -2
- package/src/__tests__/schedule-retry.test.ts +53 -53
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +47 -43
- package/src/__tests__/schedule-routes.test.ts +197 -187
- package/src/__tests__/schedule-store.test.ts +174 -172
- package/src/__tests__/schedule-tools.test.ts +2 -2
- package/src/__tests__/scheduler-disk-pressure.test.ts +3 -3
- package/src/__tests__/scheduler-recurrence.test.ts +15 -15
- package/src/__tests__/scheduler-reuse-conversation.test.ts +14 -14
- package/src/__tests__/scheduler-wake.test.ts +8 -8
- package/src/__tests__/scoped-approval-grants.test.ts +4 -4
- package/src/__tests__/scoped-grant-security-matrix.test.ts +4 -4
- package/src/__tests__/scrub-corrupted-image-attachments.test.ts +2 -2
- package/src/__tests__/search-skills-unified.test.ts +1 -1
- package/src/__tests__/secret-ingress-channel.test.ts +3 -3
- package/src/__tests__/secret-ingress-http.test.ts +6 -6
- package/src/__tests__/secret-routes-platform-proxy.test.ts +8 -7
- package/src/__tests__/send-endpoint-busy.test.ts +6 -6
- package/src/__tests__/sequence-store.test.ts +3 -3
- package/src/__tests__/server-history-render.test.ts +7 -4
- package/src/__tests__/settings-routes.test.ts +2 -2
- package/src/__tests__/skill-docs-sync-guard.test.ts +34 -0
- package/src/__tests__/skill-projection-feature-flag.test.ts +2 -1
- package/src/__tests__/skill-projection.benchmark.test.ts +2 -1
- package/src/__tests__/skill-version-hash.test.ts +32 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +1 -1
- package/src/__tests__/skills-files-catalog-fallback.test.ts +1 -1
- package/src/__tests__/slack-inbound-verification.test.ts +2 -2
- package/src/__tests__/slack-messaging-token-resolution.test.ts +2 -2
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +4 -4
- package/src/__tests__/slack-share-routes.test.ts +1 -1
- package/src/__tests__/slim-skill-category.test.ts +34 -2
- package/src/__tests__/starter-task-flow.test.ts +1 -1
- package/src/__tests__/strip-memory-injections.test.ts +2 -2
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-detail.test.ts +1 -1
- package/src/__tests__/subagent-fork-prompt-role.test.ts +1 -1
- package/src/__tests__/subagent-notify-parent.test.ts +3 -3
- package/src/__tests__/subagent-spawn-and-await.test.ts +1 -1
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +3 -3
- package/src/__tests__/subagent-tool-gate-mode.test.ts +1 -1
- package/src/__tests__/subagent-tools.test.ts +2 -5
- package/src/__tests__/suggestion-routes.test.ts +4 -4
- package/src/__tests__/task-compiler.test.ts +2 -2
- package/src/__tests__/task-management-tools.test.ts +2 -2
- package/src/__tests__/task-memory-cleanup.test.ts +9 -7
- package/src/__tests__/task-progress-nudge-hook.test.ts +37 -94
- package/src/__tests__/task-scheduler.test.ts +26 -26
- package/src/__tests__/test-support/tool-invocation-seed.ts +5 -2
- package/src/__tests__/thread-backfill.test.ts +4 -4
- package/src/__tests__/title-generate-hook.test.ts +6 -6
- package/src/__tests__/tool-approval-handler.test.ts +4 -4
- package/src/__tests__/tool-audit-listener.test.ts +1 -1
- package/src/__tests__/tool-error-hook.test.ts +2 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +5 -5
- package/src/__tests__/tool-executor-redaction.test.ts +11 -0
- package/src/__tests__/tool-executor.test.ts +24 -2
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -5
- package/src/__tests__/tool-preview-lifecycle.test.ts +77 -8
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +4 -4
- package/src/__tests__/tool-result-truncate-hook.test.ts +2 -0
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -1
- package/src/__tests__/tool-start-timestamp.test.ts +65 -2
- package/src/__tests__/tools-get-route.test.ts +44 -1
- package/src/__tests__/trace-emitter.test.ts +1 -1
- package/src/__tests__/trust-context-guards.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -5
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +11 -5
- package/src/__tests__/trusted-contact-multichannel.test.ts +9 -9
- package/src/__tests__/trusted-contact-verification.test.ts +8 -30
- package/src/__tests__/turn-boundary-resolution.test.ts +7 -4
- package/src/__tests__/turn-call-site.test.ts +29 -0
- package/src/__tests__/turn-events-store.test.ts +8 -5
- package/src/__tests__/twilio-routes.test.ts +3 -3
- package/src/__tests__/usage-cache-backfill-migration.test.ts +4 -8
- package/src/__tests__/usage-grouped-buckets.test.ts +1 -1
- package/src/__tests__/usage-routes.test.ts +61 -3
- package/src/__tests__/verification-control-plane-policy.test.ts +6 -6
- package/src/__tests__/voice-invite-redemption.test.ts +41 -45
- package/src/__tests__/voice-quality.test.ts +38 -12
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +22 -14
- package/src/__tests__/voice-session-bridge.test.ts +16 -10
- package/src/__tests__/web-search-backend-failure.test.ts +4 -4
- package/src/__tests__/workspace-lifecycle.test.ts +29 -18
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +4 -4
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +5 -5
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +3 -3
- package/src/__tests__/workspace-migration-113-swap-balanced-profile-to-glm-5p2.test.ts +241 -0
- package/src/__tests__/workspace-migration-114-swap-quality-profile-to-opus.test.ts +172 -0
- package/src/__tests__/workspace-migration-116-rename-memory-plugin-disabled-sentinel.test.ts +128 -0
- package/src/__tests__/workspace-migration-117-normalize-stale-lean-memory-v3-defaults.test.ts +221 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +84 -7
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +10 -6
- package/src/a2a/__tests__/task-store.test.ts +2 -2
- package/src/a2a/task-store.ts +4 -4
- package/src/acp/__tests__/client-handler.test.ts +680 -0
- package/src/acp/__tests__/helpers/acp-history-db.ts +32 -4
- package/src/acp/__tests__/session-manager-persistence.test.ts +215 -7
- package/src/acp/__tests__/session-manager-resume.test.ts +113 -2
- package/src/acp/__tests__/session-manager-startup.test.ts +3 -3
- package/src/acp/__tests__/session-manager-usage.test.ts +113 -0
- package/src/acp/client-handler.ts +140 -21
- package/src/acp/session-manager.ts +127 -4
- package/src/acp/types.ts +18 -0
- package/src/agent/loop.ts +200 -148
- package/src/api/events/acp-session-completed.ts +33 -0
- package/src/api/events/acp-session-error.ts +21 -0
- package/src/api/events/acp-session-spawned.ts +32 -0
- package/src/api/events/acp-session-update.test.ts +122 -0
- package/src/api/events/acp-session-update.ts +51 -0
- package/src/api/events/acp-session-usage.test.ts +49 -0
- package/src/api/events/acp-session-usage.ts +31 -0
- package/src/api/events/tool-use-preview-start.ts +11 -0
- package/src/api/events/tool-use-start.ts +14 -0
- package/src/api/index.ts +38 -0
- package/src/api/responses/conversation-message.ts +37 -1
- package/src/api/responses/llm-request-log-entry.ts +41 -0
- package/src/api/responses/memory-v3-selection-log.ts +5 -7
- package/src/approvals/approval-primitive.ts +1 -1
- package/src/approvals/guardian-card-withdrawal.ts +2 -2
- package/src/approvals/guardian-decision-primitive.ts +1 -1
- package/src/approvals/guardian-expiry-notifier.ts +1 -1
- package/src/approvals/guardian-request-resolvers.ts +4 -4
- package/src/approvals/scoped-approval-grants.ts +551 -0
- package/src/apps/app-store.ts +1058 -0
- package/src/apps/published-pages-store.ts +67 -0
- package/src/apps/shared-app-links-store.ts +130 -0
- package/src/background-wake/background-wake-routes.test.ts +53 -23
- package/src/background-wake/wake-intent-hooks.test.ts +18 -12
- package/src/backup/restore.ts +1 -1
- package/src/bundler/app-bundler.ts +1 -1
- package/src/calls/__tests__/relay-setup-router.test.ts +1 -1
- package/src/calls/call-controller.ts +5 -5
- package/src/calls/call-conversation-messages.ts +1 -1
- package/src/calls/call-domain.ts +5 -5
- package/src/calls/call-pointer-messages.ts +1 -1
- package/src/calls/call-store.ts +3 -3
- package/src/calls/guardian-action-sweep.ts +1 -1
- package/src/calls/guardian-dispatch.ts +5 -5
- package/src/calls/media-stream-server.ts +1 -1
- package/src/calls/relay-access-wait.ts +1 -1
- package/src/calls/relay-server.ts +3 -3
- package/src/calls/relay-setup-router.ts +1 -1
- package/src/calls/tts-call-strategy.ts +4 -3
- package/src/calls/voice-quality.ts +47 -59
- package/src/calls/voice-session-bridge.ts +2 -16
- package/src/channels/channel-verification-sessions.ts +557 -0
- package/src/cli/commands/__tests__/conversations-new.test.ts +186 -0
- package/src/cli/commands/__tests__/conversations-slack.test.ts +1 -1
- package/src/cli/commands/__tests__/conversations-wake.test.ts +147 -0
- package/src/cli/commands/__tests__/ps.test.ts +205 -0
- package/src/cli/commands/conversations.ts +90 -30
- package/src/cli/commands/db/__tests__/repair.test.ts +4 -3
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +2 -2
- package/src/cli/commands/memory/__tests__/memory-v2-compare-render.test.ts +1 -1
- package/src/cli/commands/memory/__tests__/worker.test.ts +106 -307
- package/src/cli/commands/memory/memory-retrospective.ts +32 -28
- package/src/cli/commands/memory/memory-v2-compare-render.ts +1 -1
- package/src/cli/commands/memory/memory-v2.ts +2 -2
- package/src/cli/commands/memory/memory-v3.ts +2 -2
- package/src/cli/commands/memory/worker.ts +83 -160
- package/src/cli/commands/plugins.ts +147 -11
- package/src/cli/commands/ps.ts +90 -0
- package/src/cli/commands/tools-run.ts +114 -0
- package/src/cli/commands/tools.ts +19 -5
- package/src/cli/lib/__tests__/cli-colors.test.ts +30 -1
- package/src/cli/lib/__tests__/install-from-github.test.ts +168 -8
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +9 -4
- package/src/cli/lib/__tests__/parse-github-plugin-spec.test.ts +121 -0
- package/src/cli/lib/__tests__/toggle-plugin.test.ts +10 -4
- package/src/cli/lib/cli-colors.ts +6 -0
- package/src/cli/lib/diff-plugin.ts +3 -7
- package/src/cli/lib/inspect-plugin.ts +2 -4
- package/src/cli/lib/install-from-github.ts +96 -24
- package/src/cli/lib/merge-plugin-tree.ts +5 -3
- package/src/cli/lib/parse-github-plugin-spec.ts +163 -0
- package/src/cli/lib/plugin-fingerprint.ts +22 -0
- package/src/cli/lib/upgrade-plugin.ts +6 -5
- package/src/cli/program.ts +4 -7
- package/src/cli.ts +6 -3
- package/src/config/__tests__/deployment-context-defaults.test.ts +228 -0
- package/src/config/__tests__/proc-to-skills.test.ts +21 -0
- package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
- package/src/config/bundled-skills/AGENTS.md +11 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +2 -0
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +2 -2
- package/src/config/bundled-skills/app-builder/tools/app-delete.ts +2 -2
- package/src/config/bundled-skills/app-builder/tools/app-generate-icon.ts +2 -2
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +1 -1
- package/src/config/bundled-skills/app-builder/tools/app-refresh.ts +2 -2
- package/src/config/bundled-skills/app-builder/tools/app-update.ts +2 -2
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +1 -1
- package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +1 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +1 -1
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +1 -1
- package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/media-status.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +5 -5
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +6 -6
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +8 -5
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +4 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -4
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +7 -7
- package/src/config/bundled-skills/skill-management/TOOLS.json +45 -0
- package/src/config/bundled-skills/skill-management/tools/find-similar.ts +12 -0
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/feature-flag-registry.json +8 -16
- package/src/config/llm-resolver.ts +17 -0
- package/src/config/loader.ts +38 -58
- package/src/config/memory-v3-gate.ts +16 -0
- package/src/config/schema.ts +2 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +16 -5
- package/src/config/schemas/conversations.ts +8 -0
- package/src/config/schemas/memory-lifecycle.ts +9 -0
- package/src/config/schemas/memory-v3.ts +56 -6
- package/src/config/schemas/migrations.ts +25 -0
- package/src/config/schemas/services.ts +0 -37
- package/src/config/seed-inference-profiles.ts +13 -50
- package/src/config/sync-gated-profiles.ts +6 -17
- package/src/contacts/__tests__/guardian-contact-reader.test.ts +89 -0
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +3 -14
- package/src/contacts/canonical-guardian-store.ts +891 -0
- package/src/contacts/contact-store.ts +11 -9
- package/src/contacts/guardian-contact-reader.ts +52 -0
- package/src/contacts/guardian-delivery-reader.ts +21 -23
- package/src/contacts/guardian-rate-limits.ts +191 -0
- package/src/contacts/notify-contacts-changed.ts +17 -0
- package/src/context/compactor.ts +3 -3
- package/src/context/strip-injections.ts +1 -1
- package/src/conversations/__tests__/message-consolidation.test.ts +10 -26
- package/src/conversations/job-handlers/summarization.ts +246 -0
- package/src/conversations/message-consolidation.ts +1 -1
- package/src/credential-execution/ces-runtime.ts +285 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +25 -22
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +5 -4
- package/src/daemon/__tests__/daemon-readiness.test.ts +51 -0
- package/src/daemon/__tests__/daemon-skill-host.test.ts +1 -1
- package/src/daemon/__tests__/embedding-reconcile.test.ts +456 -0
- package/src/daemon/__tests__/inference-profile-notification.test.ts +9 -6
- package/src/daemon/__tests__/lifecycle-embedding-reconcile.test.ts +119 -0
- package/src/daemon/__tests__/memory-v2-startup.test.ts +86 -0
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +2 -2
- package/src/daemon/__tests__/web-search-status-text.test.ts +3 -5
- package/src/daemon/app-source-watcher.ts +71 -10
- package/src/daemon/channel-ui-capability.ts +25 -0
- package/src/daemon/config-watcher.ts +71 -47
- package/src/daemon/conversation-agent-loop-handlers.ts +150 -23
- package/src/daemon/conversation-agent-loop.ts +84 -28
- package/src/daemon/conversation-attachments.ts +2 -2
- package/src/daemon/conversation-evictor.ts +42 -9
- package/src/daemon/conversation-history.ts +6 -6
- package/src/daemon/conversation-launch.ts +2 -2
- package/src/daemon/conversation-lifecycle.ts +7 -4
- package/src/daemon/conversation-messaging.ts +25 -11
- package/src/daemon/conversation-notifiers.ts +1 -1
- package/src/daemon/conversation-process.ts +17 -15
- package/src/daemon/conversation-queue-manager.ts +6 -0
- package/src/daemon/conversation-registry.ts +6 -5
- package/src/daemon/conversation-runtime-assembly.ts +37 -31
- package/src/daemon/conversation-skill-tools.ts +26 -2
- package/src/daemon/conversation-slash.ts +1 -1
- package/src/daemon/conversation-store.ts +44 -39
- package/src/daemon/conversation-surfaces.ts +4 -4
- package/src/daemon/conversation-tool-setup.ts +2 -1
- package/src/daemon/conversation-usage.ts +4 -2
- package/src/daemon/conversation-workspace.ts +2 -2
- package/src/daemon/conversation.ts +45 -17
- package/src/daemon/daemon-readiness.ts +33 -0
- package/src/daemon/daemon-skill-host.ts +1 -1
- package/src/daemon/embedding-reconcile.ts +340 -0
- package/src/daemon/event-loop-watchdog.ts +1 -1
- package/src/daemon/external-plugins-bootstrap.ts +80 -14
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +2 -2
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +3 -3
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +3 -3
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +7 -11
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +2 -2
- package/src/daemon/handlers/__tests__/config-channels.test.ts +17 -11
- package/src/daemon/handlers/config-a2a.ts +3 -3
- package/src/daemon/handlers/config-channels.ts +7 -4
- package/src/daemon/handlers/config-embeddings.ts +1 -1
- package/src/daemon/handlers/conversation-history.ts +2 -2
- package/src/daemon/handlers/conversations.ts +7 -4
- package/src/daemon/handlers/recording.ts +6 -3
- package/src/daemon/handlers/shared.ts +2 -0
- package/src/daemon/handlers/skills.ts +9 -1
- package/src/daemon/lifecycle.ts +890 -1208
- package/src/daemon/memory-v2-startup.test.ts +3 -3
- package/src/daemon/memory-v2-startup.ts +47 -12
- package/src/daemon/message-provenance.ts +1 -1
- package/src/daemon/message-types/acp.ts +27 -1
- package/src/daemon/message-types/bookmarks.ts +1 -1
- package/src/daemon/message-types/skills.ts +20 -2
- package/src/daemon/pointer-conversation-trust.ts +66 -0
- package/src/daemon/process-message.ts +24 -3
- package/src/daemon/providers-setup.ts +0 -14
- package/src/daemon/shutdown-handlers.ts +185 -165
- package/src/daemon/skill-memory-refresh.ts +1 -1
- package/src/daemon/status.ts +15 -0
- package/src/daemon/tool-setup-types.ts +17 -0
- package/src/daemon/tool-side-effects.ts +4 -4
- package/src/daemon/trace-emitter.ts +1 -1
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/turn-call-site.ts +25 -0
- package/src/daemon/turn-latency-tracker.test.ts +137 -0
- package/src/daemon/turn-latency-tracker.ts +134 -0
- package/src/daemon/wake-conversation-ops.ts +11 -4
- package/src/documents/document-comments-store.test.ts +2 -2
- package/src/documents/document-comments-store.ts +1 -1
- package/src/documents/document-store.ts +1 -1
- package/src/events/tool-audit-listener.ts +4 -4
- package/src/events/tool-permission-telemetry-listener.ts +1 -1
- package/src/export/__tests__/transcript-formatter.test.ts +1 -1
- package/src/export/transcript-formatter.ts +1 -1
- package/src/followups/followup-store.ts +2 -2
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +2 -2
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +45 -39
- package/src/heartbeat/heartbeat-run-store.ts +3 -3
- package/src/heartbeat/heartbeat-service.ts +29 -11
- package/src/home/__tests__/relationship-state-writer.test.ts +1 -1
- package/src/home/__tests__/suggested-prompts.test.ts +1 -1
- package/src/home/conversation-starter-checkpoints.ts +64 -0
- package/src/home/feed-source-enrichment.ts +3 -3
- package/src/home/home-greeting-cache.ts +1 -1
- package/src/home/job-handlers/conversation-starters.ts +484 -0
- package/src/home/relationship-state-writer.ts +1 -1
- package/src/home/suggested-prompts.ts +1 -1
- package/src/hooks/hook-loader.ts +141 -6
- package/src/hooks/registry.ts +129 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -1
- package/src/ipc/__tests__/inject-local-actor-header.test.ts +33 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +1 -1
- package/src/ipc/assistant-server.ts +79 -33
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +3 -3
- package/src/ipc/routes/db-proxy-transaction.ts +1 -1
- package/src/ipc/routes/db-proxy.ts +4 -2
- package/src/ipc/skill-routes/__tests__/memory.test.ts +1 -1
- package/src/ipc/skill-routes/memory.ts +1 -1
- package/src/ipc/skill-routes/registries.ts +8 -10
- package/src/ipc/skill-server.ts +42 -6
- package/src/jobs/register-job-handlers.ts +74 -0
- package/src/jobs/worker.ts +91 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +5 -5
- package/src/live-voice/live-voice-archive.ts +2 -2
- package/src/mcp/manager.ts +11 -0
- package/src/media/app-icon-generator.ts +1 -1
- package/src/media/job-handlers/media-processing.ts +126 -0
- package/src/messaging/channel-binding-metadata.ts +1 -1
- package/src/messaging/content/parse.test.ts +34 -0
- package/src/messaging/content/parse.ts +23 -0
- package/src/messaging/providers/__tests__/transport-dispatch.test.ts +1 -0
- package/src/messaging/providers/slack/binding-metadata.ts +1 -1
- package/src/messaging/providers/slack/render.test.ts +309 -0
- package/src/messaging/providers/slack/render.ts +459 -0
- package/src/messaging/providers/slack/send.test.ts +39 -0
- package/src/messaging/providers/slack/send.ts +38 -18
- package/src/messaging/providers/telegram-bot/adapter.ts +2 -2
- package/src/messaging/providers/telegram-bot/api.ts +17 -3
- package/src/messaging/providers/telegram-bot/render.test.ts +146 -0
- package/src/messaging/providers/telegram-bot/render.ts +292 -0
- package/src/messaging/providers/telegram-bot/send.test.ts +197 -0
- package/src/messaging/providers/telegram-bot/send.ts +70 -2
- package/src/messaging/providers/telegram-bot/transport.ts +10 -1
- package/src/messaging/providers/whatsapp/adapter.ts +2 -2
- package/src/messaging/providers/whatsapp/send.ts +1 -1
- package/src/notifications/__tests__/deterministic-checks.test.ts +3 -3
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -1
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/canonical-delivery-recorder.ts +1 -1
- package/src/notifications/conversation-candidates.ts +3 -3
- package/src/notifications/conversation-pairing.ts +25 -16
- package/src/notifications/decisions-store.ts +2 -2
- package/src/notifications/deliveries-store.ts +3 -3
- package/src/notifications/deterministic-checks.ts +2 -2
- package/src/notifications/emit-signal.ts +1 -1
- package/src/notifications/events-store.ts +2 -2
- package/src/notifications/home-feed-side-effect.ts +2 -2
- package/src/notifications/preferences-store.ts +2 -2
- package/src/notifications/signal.ts +1 -1
- package/src/oauth/oauth-store.ts +3 -3
- package/src/onboarding/__tests__/onboarding-events-store.test.ts +80 -0
- package/src/onboarding/checkin-event.test.ts +5 -2
- package/src/onboarding/checkin-event.ts +7 -1
- package/src/onboarding/onboarding-events-store.ts +161 -0
- package/src/permissions/checker.test.ts +319 -1
- package/src/permissions/checker.ts +52 -0
- package/src/permissions/types.ts +21 -0
- package/src/persistence/__tests__/db-init-migrations-ok.test.ts +20 -0
- package/src/persistence/__tests__/worker-control.test.ts +260 -0
- package/src/persistence/attachments-store.ts +1136 -0
- package/src/persistence/checkpoints.ts +65 -0
- package/src/persistence/compaction-ledger-store.ts +107 -0
- package/src/persistence/conversation-attention-store.ts +689 -0
- package/src/persistence/conversation-bootstrap.ts +59 -0
- package/src/persistence/conversation-crud.ts +3437 -0
- package/src/persistence/conversation-group-migration.test.ts +99 -0
- package/src/persistence/conversation-key-store.ts +274 -0
- package/src/persistence/conversation-queries.ts +768 -0
- package/src/persistence/conversation-row-batch-delete.ts +205 -0
- package/src/persistence/db-async-query.ts +329 -0
- package/src/persistence/db-connection.ts +242 -0
- package/src/persistence/db-init.ts +282 -0
- package/src/persistence/db-maintenance.ts +158 -0
- package/src/persistence/embeddings/__tests__/embedding-identity.test.ts +156 -0
- package/src/persistence/embeddings/__tests__/reconcile-decision.test.ts +95 -0
- package/src/persistence/embeddings/embed.ts +87 -0
- package/src/persistence/embeddings/embedding-backend.test.ts +355 -0
- package/src/persistence/embeddings/embedding-backend.ts +968 -0
- package/src/persistence/embeddings/embedding-billing-breaker.ts +96 -0
- package/src/persistence/embeddings/embedding-cache.ts +139 -0
- package/src/persistence/embeddings/embedding-identity.ts +88 -0
- package/src/persistence/embeddings/embedding-local.ts +587 -0
- package/src/persistence/embeddings/embedding-ollama.ts +79 -0
- package/src/persistence/embeddings/embedding-runtime-manager.ts +573 -0
- package/src/persistence/embeddings/embedding-types.ts +97 -0
- package/src/persistence/embeddings/qdrant-circuit-breaker.ts +119 -0
- package/src/persistence/embeddings/qdrant-client.test.ts +60 -0
- package/src/persistence/embeddings/qdrant-client.ts +842 -0
- package/src/persistence/embeddings/qdrant-manager.ts +450 -0
- package/src/persistence/embeddings/reconcile-decision.ts +53 -0
- package/src/persistence/embeddings/sparse-tokenize.ts +51 -0
- package/src/persistence/external-conversation-store.ts +315 -0
- package/src/persistence/fork-message-copy.ts +225 -0
- package/src/persistence/job-handlers/cleanup.ts +239 -0
- package/src/persistence/job-utils.ts +286 -0
- package/src/persistence/jobs-store.ts +813 -0
- package/src/persistence/jobs-worker.ts +833 -0
- package/src/persistence/llm-request-log-source-clickhouse.ts +525 -0
- package/src/persistence/llm-request-log-store.ts +740 -0
- package/src/persistence/llm-usage-store.ts +961 -0
- package/src/persistence/memory-lifecycle-hooks.test.ts +81 -0
- package/src/persistence/memory-lifecycle-hooks.ts +120 -0
- package/src/persistence/message-content.test.ts +35 -0
- package/src/persistence/migrations/126-backfill-guardian-principal-id.ts +300 -0
- package/src/persistence/migrations/140-backfill-usage-cache-accounting.ts +364 -0
- package/src/persistence/migrations/142-rename-verification-session-id-column.ts +55 -0
- package/src/persistence/migrations/182-oauth-providers-display-metadata.ts +22 -0
- package/src/persistence/migrations/196-strip-integration-prefix-from-provider-keys.ts +175 -0
- package/src/persistence/migrations/199-guardian-request-enrichment-columns.ts +50 -0
- package/src/persistence/migrations/202-memory-graph-tables.ts +128 -0
- package/src/persistence/migrations/203-drop-memory-items-tables.ts +53 -0
- package/src/persistence/migrations/206-scrub-corrupted-image-attachments.ts +121 -0
- package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +196 -0
- package/src/persistence/migrations/211-memory-recall-logs-query-context.ts +14 -0
- package/src/persistence/migrations/220-normalize-user-file-by-principal.ts +171 -0
- package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +179 -0
- package/src/persistence/migrations/236-tool-invocations-matched-rule-id.ts +23 -0
- package/src/persistence/migrations/243-provider-connections.ts +80 -0
- package/src/persistence/migrations/244-provider-connection-status-label.ts +29 -0
- package/src/persistence/migrations/246-backfill-provider-connection-label.ts +83 -0
- package/src/persistence/migrations/255-channel-inbound-delivery-attempts.ts +17 -0
- package/src/persistence/migrations/301-create-watchdog-events.ts +42 -0
- package/src/persistence/migrations/304-add-llm-usage-cron-run-id.ts +31 -0
- package/src/persistence/migrations/305-drop-contact-acl-columns.ts +49 -0
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +110 -0
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.ts +65 -0
- package/src/persistence/migrations/307-acp-session-history-usage-columns.test.ts +124 -0
- package/src/persistence/migrations/307-acp-session-history-usage-columns.ts +36 -0
- package/src/persistence/migrations/308-acp-session-history-token-columns.test.ts +119 -0
- package/src/persistence/migrations/308-acp-session-history-token-columns.ts +32 -0
- package/src/persistence/migrations/309-drop-redundant-indexes.ts +60 -0
- package/src/persistence/migrations/310-llm-request-log-latency-breakdown.ts +37 -0
- package/src/persistence/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +328 -0
- package/src/persistence/migrations/__tests__/222-strip-placeholder-sentinels-from-messages.test.ts +273 -0
- package/src/persistence/migrations/__tests__/244-provider-connection-status-label.test.ts +90 -0
- package/src/persistence/migrations/__tests__/246-backfill-provider-connection-label.test.ts +250 -0
- package/src/persistence/migrations/__tests__/run-migrations.test.ts +380 -0
- package/src/persistence/migrations/helpers/relocation.ts +230 -0
- package/src/persistence/migrations/validate-migration-state.ts +279 -0
- package/src/persistence/schedule-attribution-sql.ts +106 -0
- package/src/persistence/schema/acp.ts +51 -0
- package/src/persistence/schema/contacts.ts +110 -0
- package/src/persistence/schema/conversations.ts +235 -0
- package/src/persistence/schema/infrastructure.ts +389 -0
- package/src/persistence/steps.ts +1310 -0
- package/src/persistence/worker-control.ts +277 -0
- package/src/platform/sync-identity.ts +24 -0
- package/src/playbooks/playbook-compiler.ts +2 -2
- package/src/plugin-api/index.ts +5 -0
- package/src/plugin-api/types.ts +40 -15
- package/src/plugins/defaults/channel/injectors.ts +101 -0
- package/src/plugins/defaults/channel/package.json +14 -0
- package/src/plugins/defaults/compaction/compact.ts +2 -1
- package/src/plugins/defaults/compaction/context-overflow-reducer.ts +2 -1
- package/src/plugins/defaults/compaction/window-manager.ts +8 -7
- package/src/plugins/defaults/documents/injectors.ts +125 -0
- package/src/plugins/defaults/documents/package.json +14 -0
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +6 -2
- package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +10 -11
- package/src/plugins/defaults/history-repair/terminal.ts +1 -1
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +23 -9
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +2 -3
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +7 -14
- package/src/plugins/defaults/image-fallback/src/vision-caption.ts +12 -4
- package/src/plugins/defaults/image-recovery/recover.ts +6 -3
- package/src/plugins/defaults/index.ts +235 -43
- package/src/plugins/defaults/injection-presence.ts +80 -0
- package/src/plugins/defaults/injector-order.ts +54 -0
- package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +5 -2
- package/src/plugins/defaults/memory/__tests__/301-create-watchdog-events.test.ts +110 -0
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +41 -0
- package/src/plugins/defaults/memory/__tests__/bookmark-crud.test.ts +264 -0
- package/src/plugins/defaults/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/plugins/defaults/memory/__tests__/clear-stale-processing-flags.test.ts +52 -0
- package/src/plugins/defaults/memory/__tests__/compaction-log-store-clickhouse.test.ts +432 -0
- package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +843 -0
- package/src/plugins/defaults/memory/__tests__/conversation-row-batch-delete.test.ts +199 -0
- package/src/plugins/defaults/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +172 -0
- package/src/plugins/defaults/memory/__tests__/db-busy-timeout.test.ts +26 -0
- package/src/plugins/defaults/memory/__tests__/db-logs-attach.test.ts +113 -0
- package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +238 -0
- package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +116 -0
- package/src/plugins/defaults/memory/__tests__/embedding-cache.test.ts +137 -0
- package/src/plugins/defaults/memory/__tests__/find-analysis-conversation.test.ts +197 -0
- package/src/plugins/defaults/memory/__tests__/find-most-recent-retrospective-for.test.ts +140 -0
- package/src/plugins/defaults/memory/__tests__/fork-message-copy.test.ts +232 -0
- package/src/plugins/defaults/memory/__tests__/jobs-store-enqueue-gate.test.ts +245 -0
- package/src/plugins/defaults/memory/__tests__/jobs-store-job-classes.test.ts +52 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +115 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +508 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +160 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +1565 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +549 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +195 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +221 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +275 -0
- package/src/plugins/defaults/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/plugins/defaults/memory/__tests__/prompt-override.test.ts +192 -0
- package/src/plugins/defaults/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +130 -0
- package/src/plugins/defaults/memory/activation-session-store.ts +43 -0
- package/src/plugins/defaults/memory/anisotropy.ts +443 -0
- package/src/plugins/defaults/memory/context-search/agent-protocol.ts +428 -0
- package/src/plugins/defaults/memory/context-search/agent-runner.ts +1311 -0
- package/src/plugins/defaults/memory/context-search/search.ts +297 -0
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +341 -0
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +600 -0
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +101 -0
- package/src/plugins/defaults/memory/context-search/types.ts +48 -0
- package/src/plugins/defaults/memory/filing-service.ts +430 -0
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +663 -0
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +321 -0
- package/src/plugins/defaults/memory/graph/bootstrap.test.ts +287 -0
- package/src/plugins/defaults/memory/graph/bootstrap.ts +544 -0
- package/src/plugins/defaults/memory/graph/capability-seed.ts +454 -0
- package/src/plugins/defaults/memory/graph/consolidation.ts +712 -0
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +1181 -0
- package/src/plugins/defaults/memory/graph/decay.ts +195 -0
- package/src/plugins/defaults/memory/graph/extraction-job.ts +77 -0
- package/src/plugins/defaults/memory/graph/extraction.ts +1462 -0
- package/src/plugins/defaults/memory/graph/graph-memory-state-store.ts +50 -0
- package/src/plugins/defaults/memory/graph/graph-search.test.ts +132 -0
- package/src/plugins/defaults/memory/graph/graph-search.ts +294 -0
- package/src/plugins/defaults/memory/graph/image-ref-utils.ts +29 -0
- package/src/plugins/defaults/memory/graph/injection.ts +469 -0
- package/src/plugins/defaults/memory/graph/narrative.ts +267 -0
- package/src/plugins/defaults/memory/graph/pattern-scan.ts +269 -0
- package/src/plugins/defaults/memory/graph/retriever.test.ts +624 -0
- package/src/plugins/defaults/memory/graph/retriever.ts +1357 -0
- package/src/plugins/defaults/memory/graph/store.test.ts +1093 -0
- package/src/plugins/defaults/memory/graph/store.ts +923 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +195 -0
- package/src/plugins/defaults/memory/graph/tools.ts +95 -0
- package/src/plugins/defaults/memory/hooks/init.ts +26 -0
- package/src/plugins/defaults/memory/hooks/post-compact.ts +115 -0
- package/src/plugins/defaults/memory/hooks/shutdown.ts +14 -0
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +371 -0
- package/src/plugins/defaults/memory/indexer.ts +409 -0
- package/src/plugins/defaults/memory/injectors.ts +388 -0
- package/src/plugins/defaults/memory/job-handlers/backfill.ts +107 -0
- package/src/plugins/defaults/memory/job-handlers/embedding.test.ts +236 -0
- package/src/plugins/defaults/memory/job-handlers/embedding.ts +133 -0
- package/src/plugins/defaults/memory/job-handlers/index-maintenance.ts +117 -0
- package/src/plugins/defaults/memory/job-handlers.ts +203 -0
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +565 -0
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +424 -0
- package/src/plugins/defaults/memory/jobs/embed-pkb-file.test.ts +169 -0
- package/src/plugins/defaults/memory/jobs/embed-pkb-file.ts +59 -0
- package/src/plugins/defaults/memory/memory-recall-log-store.ts +172 -0
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +60 -0
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +131 -0
- package/src/plugins/defaults/memory/memory-retrospective-fork-boundary.ts +94 -0
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +958 -0
- package/src/plugins/defaults/memory/memory-retrospective-startup-cleanup.ts +264 -0
- package/src/plugins/defaults/memory/memory-retrospective-state.ts +259 -0
- package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/plugins/defaults/memory/memory-v2-activation-log-store.ts +216 -0
- package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +173 -0
- package/src/plugins/defaults/memory/package.json +14 -0
- package/src/plugins/defaults/memory/persistence-hooks.ts +119 -0
- package/src/plugins/defaults/memory/pkb/autoinject.ts +61 -0
- package/src/plugins/defaults/memory/pkb/context.ts +50 -0
- package/src/plugins/defaults/memory/pkb/pkb-index.test.ts +371 -0
- package/src/plugins/defaults/memory/pkb/pkb-index.ts +256 -0
- package/src/plugins/defaults/memory/pkb/pkb-reconcile.test.ts +254 -0
- package/src/plugins/defaults/memory/pkb/pkb-reconcile.ts +144 -0
- package/src/plugins/defaults/memory/pkb/pkb-search.test.ts +589 -0
- package/src/plugins/defaults/memory/pkb/pkb-search.ts +178 -0
- package/src/plugins/defaults/memory/pkb/types.ts +67 -0
- package/src/plugins/defaults/memory/rerank-local.ts +374 -0
- package/src/plugins/defaults/memory/routes/__tests__/memory-v2-routes.test.ts +165 -0
- package/src/plugins/defaults/memory/routes/__tests__/memory-v2-simulate-route.test.ts +347 -0
- package/src/plugins/defaults/memory/routes/memory-eval-routes.ts +179 -0
- package/src/plugins/defaults/memory/routes/memory-item-routes.test.ts +922 -0
- package/src/plugins/defaults/memory/routes/memory-item-routes.ts +814 -0
- package/src/plugins/defaults/memory/routes/memory-v2-routes.ts +850 -0
- package/src/plugins/defaults/memory/routes/memory-v3-routes.ts +125 -0
- package/src/plugins/defaults/memory/search/semantic.ts +241 -0
- package/src/plugins/defaults/memory/segmenter.ts +76 -0
- package/src/plugins/defaults/memory/tail-reinjection-strip.ts +65 -0
- package/src/plugins/defaults/memory/task-memory-cleanup.ts +241 -0
- package/src/plugins/defaults/memory/tools.test.ts +382 -0
- package/src/plugins/defaults/memory/tools.ts +87 -0
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +207 -0
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +1273 -0
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +510 -0
- package/src/plugins/defaults/memory/v2/__tests__/cli-command-store.test.ts +432 -0
- package/src/plugins/defaults/memory/v2/__tests__/consolidation-job.test.ts +744 -0
- package/src/plugins/defaults/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +205 -0
- package/src/plugins/defaults/memory/v2/__tests__/frontmatter-sweep.test.ts +136 -0
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +230 -0
- package/src/plugins/defaults/memory/v2/__tests__/harness-runner.test.ts +135 -0
- package/src/plugins/defaults/memory/v2/__tests__/injection-events.test.ts +318 -0
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +2308 -0
- package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +940 -0
- package/src/plugins/defaults/memory/v2/__tests__/page-index.test.ts +760 -0
- package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +332 -0
- package/src/plugins/defaults/memory/v2/__tests__/qdrant.test.ts +974 -0
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +338 -0
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +1198 -0
- package/src/plugins/defaults/memory/v2/__tests__/sim.test.ts +704 -0
- package/src/plugins/defaults/memory/v2/__tests__/skill-content.test.ts +115 -0
- package/src/plugins/defaults/memory/v2/__tests__/skill-store.test.ts +986 -0
- package/src/plugins/defaults/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/plugins/defaults/memory/v2/__tests__/static-context.test.ts +223 -0
- package/src/plugins/defaults/memory/v2/__tests__/sweep-job.test.ts +530 -0
- package/src/plugins/defaults/memory/v2/activation-store.ts +185 -0
- package/src/plugins/defaults/memory/v2/activation.ts +560 -0
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +296 -0
- package/src/plugins/defaults/memory/v2/cli-command-store.ts +341 -0
- package/src/plugins/defaults/memory/v2/consolidation-job.ts +550 -0
- package/src/plugins/defaults/memory/v2/frontmatter-sweep.ts +98 -0
- package/src/plugins/defaults/memory/v2/harness/compare.ts +57 -0
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +148 -0
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +243 -0
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +74 -0
- package/src/plugins/defaults/memory/v2/harness/router-retriever.ts +43 -0
- package/src/plugins/defaults/memory/v2/injected-block-slugs.ts +79 -0
- package/src/plugins/defaults/memory/v2/injection-events.ts +101 -0
- package/src/plugins/defaults/memory/v2/injection.ts +932 -0
- package/src/plugins/defaults/memory/v2/migration.ts +774 -0
- package/src/plugins/defaults/memory/v2/page-index.ts +459 -0
- package/src/plugins/defaults/memory/v2/page-store.ts +443 -0
- package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +868 -0
- package/src/plugins/defaults/memory/v2/prompts/router.ts +148 -0
- package/src/plugins/defaults/memory/v2/qdrant.ts +939 -0
- package/src/plugins/defaults/memory/v2/reranker.ts +184 -0
- package/src/plugins/defaults/memory/v2/router.ts +602 -0
- package/src/plugins/defaults/memory/v2/sim.ts +310 -0
- package/src/plugins/defaults/memory/v2/skill-content.ts +61 -0
- package/src/plugins/defaults/memory/v2/skill-store.ts +431 -0
- package/src/plugins/defaults/memory/v2/sparse-bm25.ts +245 -0
- package/src/plugins/defaults/memory/v2/static-context.ts +100 -0
- package/src/plugins/defaults/memory/v2/sweep-job.ts +323 -0
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +316 -0
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +1163 -0
- package/src/plugins/defaults/memory/v3/__tests__/dense.test.ts +211 -0
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +247 -0
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +685 -0
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +365 -0
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +1012 -0
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +977 -0
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +599 -0
- package/src/plugins/defaults/memory/v3/__tests__/render-injection.test.ts +128 -0
- package/src/plugins/defaults/memory/v3/__tests__/section-dense-store.test.ts +756 -0
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +422 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +501 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +885 -0
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +96 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +197 -0
- package/src/plugins/defaults/memory/v3/capabilities.ts +88 -0
- package/src/plugins/defaults/memory/v3/card.ts +160 -0
- package/src/plugins/defaults/memory/v3/dense.ts +108 -0
- package/src/plugins/defaults/memory/v3/edge.ts +252 -0
- package/src/plugins/defaults/memory/v3/entity-lane.test.ts +124 -0
- package/src/plugins/defaults/memory/v3/entity-lane.ts +113 -0
- package/src/plugins/defaults/memory/v3/ever-injected-store.test.ts +307 -0
- package/src/plugins/defaults/memory/v3/ever-injected-store.ts +278 -0
- package/src/plugins/defaults/memory/v3/hot-set.test.ts +143 -0
- package/src/plugins/defaults/memory/v3/hot-set.ts +85 -0
- package/src/plugins/defaults/memory/v3/injector.ts +423 -0
- package/src/plugins/defaults/memory/v3/learned-edges.test.ts +169 -0
- package/src/plugins/defaults/memory/v3/learned-edges.ts +178 -0
- package/src/plugins/defaults/memory/v3/maintain-job.ts +988 -0
- package/src/plugins/defaults/memory/v3/orchestrate.ts +483 -0
- package/src/plugins/defaults/memory/v3/page-content.ts +102 -0
- package/src/plugins/defaults/memory/v3/pool-select.test.ts +147 -0
- package/src/plugins/defaults/memory/v3/pool-select.ts +586 -0
- package/src/plugins/defaults/memory/v3/prune.test.ts +760 -0
- package/src/plugins/defaults/memory/v3/prune.ts +469 -0
- package/src/plugins/defaults/memory/v3/render-injection.ts +92 -0
- package/src/plugins/defaults/memory/v3/section-dense-store.ts +471 -0
- package/src/plugins/defaults/memory/v3/section-needle.ts +215 -0
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +277 -0
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +656 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +91 -0
- package/src/plugins/defaults/memory/v3/types.ts +130 -0
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +731 -0
- package/src/plugins/defaults/session/injectors.ts +84 -0
- package/src/plugins/defaults/session/package.json +14 -0
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +6 -2
- package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +39 -45
- package/src/plugins/defaults/title-generate/hooks/stop.ts +4 -5
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +3 -3
- package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +5 -3
- package/src/plugins/defaults/turn-context/injectors.ts +52 -0
- package/src/plugins/defaults/turn-context/package.json +14 -0
- package/src/plugins/defaults/workspace/injectors.ts +295 -0
- package/src/plugins/defaults/workspace/package.json +14 -0
- package/src/plugins/injector-registry.ts +127 -0
- package/src/plugins/job-handler-registry.ts +94 -0
- package/src/plugins/mtime-cache.ts +1 -1
- package/src/plugins/pipeline.ts +1 -1
- package/src/plugins/registry.ts +37 -172
- package/src/plugins/types.ts +36 -1
- package/src/prompts/system-prompt.ts +1 -1
- package/src/providers/__tests__/connection-model-compat.test.ts +1 -1
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +1 -1
- package/src/providers/__tests__/inference.test.ts +6 -6
- package/src/providers/__tests__/placeholder-sentinels.test.ts +80 -0
- package/src/providers/__tests__/retry-callsite.test.ts +31 -3
- package/src/providers/__tests__/satellite-connection-routing.test.ts +1 -1
- package/src/providers/anthropic/client.ts +23 -24
- package/src/providers/call-site-routing.ts +1 -1
- package/src/providers/connection-resolution.ts +7 -3
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +7 -8
- package/src/providers/inference/__tests__/base-url-security.test.ts +8 -8
- package/src/providers/inference/__tests__/connections-label.test.ts +5 -5
- package/src/providers/inference/__tests__/connections-openai-compatible.test.ts +4 -4
- package/src/providers/inference/backfill.ts +9 -5
- package/src/providers/inference/connections.ts +2 -2
- package/src/providers/inference/resolve-auth.ts +3 -3
- package/src/providers/model-catalog.ts +38 -0
- package/src/providers/placeholder-sentinels.ts +50 -15
- package/src/providers/provider-send-message.ts +1 -1
- package/src/providers/registry.ts +2 -0
- package/src/providers/retry.ts +16 -0
- package/src/providers/stop-reasons.ts +32 -0
- package/src/providers/usage-tracking.ts +1 -1
- package/src/runtime/__tests__/agent-wake.test.ts +100 -29
- package/src/runtime/__tests__/background-job-runner.test.ts +19 -2
- package/src/runtime/__tests__/channel-verification-service.test.ts +9 -5
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +7 -5
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +3 -3
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +1 -1
- package/src/runtime/access-request-helper.ts +3 -3
- package/src/runtime/agent-wake.ts +56 -11
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/background-job-runner.ts +30 -10
- package/src/runtime/channel-reply-delivery.ts +3 -3
- package/src/runtime/channel-retry-sweep.ts +23 -3
- package/src/runtime/channel-verification-service.ts +9 -9
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/finalize-event-delivery.ts +2 -2
- package/src/runtime/guardian-action-service.ts +1 -2
- package/src/runtime/guardian-reply-router.ts +1 -1
- package/src/runtime/http-server.ts +45 -1
- package/src/runtime/invite-redemption-service.ts +11 -3
- package/src/runtime/invite-service.ts +6 -4
- package/src/runtime/migrations/vbundle-streaming-importer.ts +1 -1
- package/src/runtime/pre-first-message-gate.ts +1 -1
- package/src/runtime/routes/__tests__/acp-routes.test.ts +74 -8
- package/src/runtime/routes/__tests__/backup-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +17 -23
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +3 -3
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +5 -5
- package/src/runtime/routes/__tests__/contact-routes.test.ts +90 -9
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +5 -5
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +5 -5
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +12 -12
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +21 -7
- package/src/runtime/routes/__tests__/memory-worker-routes.test.ts +306 -0
- package/src/runtime/routes/__tests__/ps-routes.test.ts +114 -0
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/wake-conversation-routes.test.ts +125 -0
- package/src/runtime/routes/acp-routes-event-log.test.ts +283 -0
- package/src/runtime/routes/acp-routes-list.test.ts +24 -25
- package/src/runtime/routes/acp-routes.test.ts +4 -4
- package/src/runtime/routes/acp-routes.ts +31 -4
- package/src/runtime/routes/app-management-routes.ts +9 -9
- package/src/runtime/routes/app-routes.ts +3 -7
- package/src/runtime/routes/approval-routes.ts +2 -4
- package/src/runtime/routes/attachment-routes.ts +2 -2
- package/src/runtime/routes/audit-routes.ts +2 -3
- package/src/runtime/routes/background-wake-routes.ts +19 -5
- package/src/runtime/routes/backup-routes.ts +1 -1
- package/src/runtime/routes/bookmark-routes.ts +3 -3
- package/src/runtime/routes/brain-graph-routes.ts +2 -2
- package/src/runtime/routes/btw-routes.ts +1 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +1 -1
- package/src/runtime/routes/channel-delivery-routes.ts +1 -1
- package/src/runtime/routes/channel-readiness-routes.ts +7 -3
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +3 -8
- package/src/runtime/routes/consolidation-routes.ts +6 -6
- package/src/runtime/routes/contact-routes.ts +66 -15
- package/src/runtime/routes/conversation-attention-routes.ts +2 -2
- package/src/runtime/routes/conversation-cli-routes.ts +32 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +4 -4
- package/src/runtime/routes/conversation-list-routes.ts +9 -9
- package/src/runtime/routes/conversation-management-routes.ts +9 -9
- package/src/runtime/routes/conversation-query-routes.ts +34 -11
- package/src/runtime/routes/conversation-routes.ts +99 -16
- package/src/runtime/routes/conversation-starter-routes.ts +11 -5
- package/src/runtime/routes/conversations-import-routes.ts +10 -6
- package/src/runtime/routes/debug-routes.ts +3 -3
- package/src/runtime/routes/defer-routes.ts +4 -4
- package/src/runtime/routes/documents-routes.ts +1 -1
- package/src/runtime/routes/empty-state-greeting-cache.ts +1 -1
- package/src/runtime/routes/events-routes.ts +4 -4
- package/src/runtime/routes/filing-routes.ts +1 -1
- package/src/runtime/routes/global-search-routes.ts +4 -4
- package/src/runtime/routes/group-routes.ts +1 -1
- package/src/runtime/routes/guardian-action-routes.ts +1 -1
- package/src/runtime/routes/heartbeat-routes.ts +2 -2
- package/src/runtime/routes/home-feed-routes.ts +10 -5
- package/src/runtime/routes/identity-routes.ts +33 -14
- package/src/runtime/routes/inbound-conversation.ts +3 -3
- package/src/runtime/routes/inbound-message-handler.ts +25 -25
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +8 -4
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +13 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +5 -5
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +11 -11
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +12 -12
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +2 -2
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +1 -1
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +1 -1
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +8 -8
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +5 -2
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +1 -1
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +1 -1
- package/src/runtime/routes/index.ts +6 -4
- package/src/runtime/routes/inference-profile-session-handler.ts +2 -2
- package/src/runtime/routes/inference-profile-session-reaper.ts +1 -1
- package/src/runtime/routes/inference-provider-connection-routes.ts +5 -2
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +3 -4
- package/src/runtime/routes/integrations/slack/share.ts +1 -1
- package/src/runtime/routes/internal-telemetry-routes.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +2 -2
- package/src/runtime/routes/memory-worker-routes.ts +227 -0
- package/src/runtime/routes/migration-rollback-routes.ts +11 -12
- package/src/runtime/routes/migration-routes.ts +143 -5
- package/src/runtime/routes/notification-routes.ts +2 -2
- package/src/runtime/routes/platform-routes.ts +3 -0
- package/src/runtime/routes/playground/helpers.ts +3 -3
- package/src/runtime/routes/ps-routes.ts +37 -66
- package/src/runtime/routes/publish-routes.ts +3 -3
- package/src/runtime/routes/rename-conversation-routes.ts +1 -1
- package/src/runtime/routes/retrospective-routes.ts +5 -5
- package/src/runtime/routes/schedule-routes.ts +42 -40
- package/src/runtime/routes/secret-routes.ts +10 -9
- package/src/runtime/routes/sequence-routes.ts +1 -1
- package/src/runtime/routes/settings-routes.ts +18 -9
- package/src/runtime/routes/skills-routes.ts +11 -1
- package/src/runtime/routes/slack-channel-routes.ts +4 -4
- package/src/runtime/routes/subagents-routes.ts +2 -2
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -1
- package/src/runtime/routes/task-routes.ts +18 -29
- package/src/runtime/routes/telemetry-routes.ts +1 -1
- package/src/runtime/routes/trace-event-routes.ts +1 -1
- package/src/runtime/routes/types.ts +7 -0
- package/src/runtime/routes/usage-routes.ts +2 -2
- package/src/runtime/routes/wake-conversation-routes.ts +44 -8
- package/src/runtime/routes/wipe-conversation-routes.ts +3 -3
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +1 -1
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
- package/src/runtime/services/__tests__/auto-analysis-enqueue.test.ts +362 -0
- package/src/runtime/services/__tests__/auto-analysis-guard.test.ts +57 -0
- package/src/runtime/services/__tests__/conversation-analyze-job.test.ts +178 -0
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +1 -1
- package/src/runtime/services/analyze-conversation.ts +22 -13
- package/src/runtime/services/auto-analysis-enqueue.ts +130 -0
- package/src/runtime/services/auto-analysis-guard.ts +13 -0
- package/src/runtime/services/conversation-analyze-job.ts +53 -0
- package/src/runtime/services/conversation-serializer.ts +5 -5
- package/src/runtime/tool-grant-request-helper.ts +1 -1
- package/src/schedule/retry-policy.ts +8 -8
- package/src/schedule/run-script.ts +7 -2
- package/src/schedule/schedule-recovery.ts +8 -5
- package/src/schedule/schedule-store.ts +270 -162
- package/src/schedule/schedule-usage-store.ts +2 -2
- package/src/schedule/scheduler-types.ts +6 -0
- package/src/schedule/scheduler.ts +189 -59
- package/src/security/auth-fallback-events-store.ts +94 -0
- package/src/security/redaction.ts +18 -14
- package/src/sequence/engine.ts +1 -1
- package/src/sequence/store.ts +3 -3
- package/src/services/published-app-updater.ts +2 -2
- package/src/signals/cancel.ts +1 -1
- package/src/signals/user-message.ts +2 -2
- package/src/skills/catalog-install.ts +2 -1
- package/src/skills/clawhub.ts +1 -0
- package/src/skills/install-meta.ts +44 -0
- package/src/skills/managed-store.ts +101 -3
- package/src/skills/skillssh-registry.ts +1 -0
- package/src/skills/version-hash.ts +20 -0
- package/src/subagent/manager.ts +5 -4
- package/src/tasks/task-compiler.ts +2 -2
- package/src/tasks/task-runner.ts +3 -3
- package/src/tasks/task-store.ts +2 -2
- package/src/telemetry/__tests__/watchdog-events-store.test.ts +161 -0
- package/src/telemetry/skill-loaded-events-store.test.ts +152 -0
- package/src/telemetry/skill-loaded-events-store.ts +95 -0
- package/src/telemetry/tool-executed-events-store.test.ts +219 -0
- package/src/telemetry/tool-executed-events-store.ts +102 -0
- package/src/telemetry/tool-usage-store.ts +114 -0
- package/src/telemetry/trace-event-store.ts +133 -0
- package/src/telemetry/turn-events-store.ts +173 -0
- package/src/telemetry/turn-trace-store.test.ts +736 -0
- package/src/telemetry/turn-trace-store.ts +364 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +12 -12
- package/src/telemetry/usage-telemetry-reporter.ts +46 -17
- package/src/telemetry/watchdog-events-store.ts +87 -0
- package/src/tools/__tests__/run-standalone.test.ts +19 -0
- package/src/tools/acp/spawn.test.ts +18 -7
- package/src/tools/acp/spawn.ts +1 -0
- package/src/tools/apps/executors.ts +2 -2
- package/src/tools/apps/resolve-app-id.ts +1 -1
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +3 -3
- package/src/tools/document/document-comment-tool.test.ts +2 -2
- package/src/tools/filesystem/write.ts +5 -4
- package/src/tools/policy-context.ts +21 -0
- package/src/tools/registry.ts +31 -1
- package/src/tools/run-standalone.ts +101 -0
- package/src/tools/schedule/create.ts +2 -2
- package/src/tools/schedule/delete.ts +1 -1
- package/src/tools/schedule/update.ts +1 -1
- package/src/tools/skills/find-similar-skills.test.ts +277 -0
- package/src/tools/skills/find-similar-skills.ts +120 -0
- package/src/tools/skills/scaffold-managed.ts +123 -4
- package/src/tools/subagent/read.ts +1 -1
- package/src/tools/subagent/spawn.ts +1 -1
- package/src/tools/tool-approval-handler.ts +1 -1
- package/src/tools/tool-manifest.ts +1 -1
- package/src/tools/types.ts +11 -0
- package/src/usage/types.ts +7 -0
- package/src/util/__tests__/process-tree.test.ts +123 -0
- package/src/util/device-id.ts +52 -12
- package/src/util/platform.ts +0 -14
- package/src/util/process-tree.ts +203 -0
- package/src/util/sqlite-retry.ts +90 -0
- package/src/watcher/__tests__/telemetry.test.ts +2 -2
- package/src/watcher/telemetry.ts +2 -2
- package/src/watcher/watcher-store.ts +3 -3
- package/src/work-items/work-item-store.ts +2 -2
- package/src/workflows/engine-integration.test.ts +2 -2
- package/src/workflows/engine.test.ts +2 -2
- package/src/workflows/fanout-load.test.ts +2 -2
- package/src/workflows/journal-store.test.ts +3 -3
- package/src/workflows/journal-store.ts +1 -1
- package/src/workflows/leaf-runner.test.ts +9 -6
- package/src/workflows/leaf-runner.ts +1 -1
- package/src/workspace/heartbeat-service.ts +29 -0
- package/src/workspace/migrations/011-backfill-installation-id.ts +1 -1
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +5 -2
- package/src/workspace/migrations/031-drop-user-md.ts +26 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +1 -1
- package/src/workspace/migrations/113-swap-balanced-profile-to-glm-5p2.ts +101 -0
- package/src/workspace/migrations/114-swap-quality-profile-to-opus.ts +83 -0
- package/src/workspace/migrations/115-drop-frontier-profile.ts +129 -0
- package/src/workspace/migrations/116-rename-memory-plugin-disabled-sentinel.ts +53 -0
- package/src/workspace/migrations/117-normalize-stale-lean-memory-v3-defaults.ts +116 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +5 -2
- package/src/workspace/migrations/rebuild-conversation-disk-view.ts +4 -4
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +0 -277
- package/src/__tests__/slack-block-formatting.test.ts +0 -173
- package/src/background-wake/runtime-registry.ts +0 -24
- package/src/contacts/contact-events.ts +0 -21
- package/src/daemon/__tests__/meet-host-supervisor.test.ts +0 -587
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +0 -476
- package/src/daemon/meet-host-startup.ts +0 -51
- package/src/daemon/meet-host-supervisor.ts +0 -782
- package/src/daemon/meet-manifest-loader.ts +0 -396
- package/src/daemon/server.ts +0 -423
- package/src/filing/filing-service.ts +0 -429
- package/src/memory/__tests__/301-create-watchdog-events.test.ts +0 -110
- package/src/memory/__tests__/activation-session-store.test.ts +0 -41
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +0 -359
- package/src/memory/__tests__/auto-analysis-guard.test.ts +0 -57
- package/src/memory/__tests__/bookmark-crud.test.ts +0 -264
- package/src/memory/__tests__/bookmark-schema.test.ts +0 -181
- package/src/memory/__tests__/compaction-log-store-clickhouse.test.ts +0 -432
- package/src/memory/__tests__/conversation-analyze-job.test.ts +0 -178
- package/src/memory/__tests__/conversation-group-migration.test.ts +0 -99
- package/src/memory/__tests__/conversation-queries.test.ts +0 -843
- package/src/memory/__tests__/conversation-types.test.ts +0 -36
- package/src/memory/__tests__/db-async-query.test.ts +0 -165
- package/src/memory/__tests__/db-logs-attach.test.ts +0 -110
- package/src/memory/__tests__/db-maintenance.test.ts +0 -235
- package/src/memory/__tests__/db-memory-attach.test.ts +0 -113
- package/src/memory/__tests__/embedding-cache.test.ts +0 -136
- package/src/memory/__tests__/find-analysis-conversation.test.ts +0 -197
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +0 -140
- package/src/memory/__tests__/fork-message-copy.test.ts +0 -232
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +0 -241
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +0 -52
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +0 -113
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +0 -505
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +0 -160
- package/src/memory/__tests__/memory-retrospective-job.test.ts +0 -1443
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +0 -544
- package/src/memory/__tests__/memory-retrospective-state.test.ts +0 -195
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -221
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +0 -275
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +0 -103
- package/src/memory/__tests__/message-content.test.ts +0 -35
- package/src/memory/__tests__/onboarding-events-store.test.ts +0 -80
- package/src/memory/__tests__/prompt-override.test.ts +0 -192
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +0 -49
- package/src/memory/__tests__/table-relocation.test.ts +0 -129
- package/src/memory/__tests__/watchdog-events-store.test.ts +0 -161
- package/src/memory/activation-session-store.ts +0 -43
- package/src/memory/anisotropy.ts +0 -443
- package/src/memory/app-store.ts +0 -1058
- package/src/memory/attachments-store.ts +0 -1136
- package/src/memory/auth-fallback-events-store.ts +0 -94
- package/src/memory/auto-analysis-enqueue.ts +0 -127
- package/src/memory/auto-analysis-guard.ts +0 -17
- package/src/memory/canonical-guardian-store.ts +0 -891
- package/src/memory/channel-verification-sessions.ts +0 -557
- package/src/memory/checkpoints.ts +0 -65
- package/src/memory/compaction-ledger-store.ts +0 -107
- package/src/memory/context-search/agent-protocol.ts +0 -428
- package/src/memory/context-search/agent-runner.ts +0 -1310
- package/src/memory/context-search/search.ts +0 -297
- package/src/memory/context-search/sources/conversations.ts +0 -341
- package/src/memory/context-search/sources/memory-v2.ts +0 -600
- package/src/memory/context-search/sources/memory.ts +0 -101
- package/src/memory/context-search/types.ts +0 -48
- package/src/memory/conversation-analyze-job.ts +0 -53
- package/src/memory/conversation-attention-store.ts +0 -689
- package/src/memory/conversation-bootstrap.ts +0 -50
- package/src/memory/conversation-crud.ts +0 -3436
- package/src/memory/conversation-key-store.ts +0 -274
- package/src/memory/conversation-queries.ts +0 -768
- package/src/memory/conversation-starter-checkpoints.ts +0 -64
- package/src/memory/db-async-query.ts +0 -298
- package/src/memory/db-connection.ts +0 -228
- package/src/memory/db-init.ts +0 -265
- package/src/memory/db-maintenance.ts +0 -154
- package/src/memory/embed.ts +0 -73
- package/src/memory/embedding-backend.test.ts +0 -204
- package/src/memory/embedding-backend.ts +0 -862
- package/src/memory/embedding-billing-breaker.ts +0 -96
- package/src/memory/embedding-cache.ts +0 -139
- package/src/memory/embedding-local.ts +0 -587
- package/src/memory/embedding-ollama.ts +0 -79
- package/src/memory/embedding-runtime-manager.ts +0 -573
- package/src/memory/embedding-types.ts +0 -90
- package/src/memory/external-conversation-store.ts +0 -315
- package/src/memory/fork-message-copy.ts +0 -170
- package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +0 -119
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +0 -655
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +0 -321
- package/src/memory/graph/bootstrap.test.ts +0 -280
- package/src/memory/graph/bootstrap.ts +0 -532
- package/src/memory/graph/capability-seed.ts +0 -451
- package/src/memory/graph/consolidation.ts +0 -712
- package/src/memory/graph/conversation-graph-memory.ts +0 -1185
- package/src/memory/graph/decay.ts +0 -195
- package/src/memory/graph/extraction-job.ts +0 -74
- package/src/memory/graph/extraction.ts +0 -1462
- package/src/memory/graph/graph-memory-state-store.ts +0 -50
- package/src/memory/graph/graph-search.test.ts +0 -129
- package/src/memory/graph/graph-search.ts +0 -292
- package/src/memory/graph/image-ref-utils.ts +0 -29
- package/src/memory/graph/injection.ts +0 -469
- package/src/memory/graph/narrative.ts +0 -267
- package/src/memory/graph/pattern-scan.ts +0 -269
- package/src/memory/graph/retriever.test.ts +0 -624
- package/src/memory/graph/retriever.ts +0 -1356
- package/src/memory/graph/store.test.ts +0 -1093
- package/src/memory/graph/store.ts +0 -923
- package/src/memory/graph/tool-handlers.ts +0 -195
- package/src/memory/graph/tools.ts +0 -95
- package/src/memory/guardian-rate-limits.ts +0 -191
- package/src/memory/indexer.ts +0 -406
- package/src/memory/job-handlers/backfill.ts +0 -104
- package/src/memory/job-handlers/cleanup.ts +0 -237
- package/src/memory/job-handlers/conversation-starters.ts +0 -481
- package/src/memory/job-handlers/embedding.test.ts +0 -234
- package/src/memory/job-handlers/embedding.ts +0 -133
- package/src/memory/job-handlers/index-maintenance.ts +0 -111
- package/src/memory/job-handlers/media-processing.ts +0 -120
- package/src/memory/job-handlers/summarization.ts +0 -240
- package/src/memory/job-utils.ts +0 -286
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +0 -559
- package/src/memory/jobs/embed-concept-page.ts +0 -417
- package/src/memory/jobs/embed-pkb-file.test.ts +0 -169
- package/src/memory/jobs/embed-pkb-file.ts +0 -59
- package/src/memory/jobs-store.ts +0 -813
- package/src/memory/jobs-worker.ts +0 -1021
- package/src/memory/llm-request-log-source-clickhouse.ts +0 -521
- package/src/memory/llm-request-log-store.ts +0 -717
- package/src/memory/llm-usage-store.ts +0 -900
- package/src/memory/memory-recall-log-store.ts +0 -172
- package/src/memory/memory-retrospective-constants.ts +0 -50
- package/src/memory/memory-retrospective-enqueue.ts +0 -125
- package/src/memory/memory-retrospective-fork-boundary.ts +0 -94
- package/src/memory/memory-retrospective-job.ts +0 -884
- package/src/memory/memory-retrospective-startup-cleanup.ts +0 -261
- package/src/memory/memory-retrospective-state.ts +0 -245
- package/src/memory/memory-retrospective-trigger-check.ts +0 -91
- package/src/memory/memory-v2-activation-log-store.ts +0 -216
- package/src/memory/memory-v2-concept-frequency.ts +0 -173
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +0 -303
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +0 -365
- package/src/memory/migrations/142-rename-verification-session-id-column.ts +0 -55
- package/src/memory/migrations/182-oauth-providers-display-metadata.ts +0 -20
- package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +0 -179
- package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +0 -64
- package/src/memory/migrations/202-memory-graph-tables.ts +0 -130
- package/src/memory/migrations/203-drop-memory-items-tables.ts +0 -55
- package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +0 -124
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +0 -174
- package/src/memory/migrations/211-memory-recall-logs-query-context.ts +0 -16
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +0 -183
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +0 -76
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +0 -21
- package/src/memory/migrations/243-provider-connections.ts +0 -68
- package/src/memory/migrations/244-provider-connection-status-label.ts +0 -23
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +0 -81
- package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +0 -19
- package/src/memory/migrations/301-create-watchdog-events.ts +0 -45
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +0 -297
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +0 -84
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +0 -192
- package/src/memory/migrations/__tests__/run-migrations.test.ts +0 -378
- package/src/memory/migrations/helpers/relocation.ts +0 -227
- package/src/memory/migrations/validate-migration-state.ts +0 -277
- package/src/memory/onboarding-events-store.ts +0 -161
- package/src/memory/pkb/autoinject.ts +0 -61
- package/src/memory/pkb/context.ts +0 -50
- package/src/memory/pkb/pkb-index.test.ts +0 -368
- package/src/memory/pkb/pkb-index.ts +0 -255
- package/src/memory/pkb/pkb-reconcile.test.ts +0 -251
- package/src/memory/pkb/pkb-reconcile.ts +0 -148
- package/src/memory/pkb/pkb-search.test.ts +0 -586
- package/src/memory/pkb/pkb-search.ts +0 -178
- package/src/memory/pkb/types.ts +0 -67
- package/src/memory/published-pages-store.ts +0 -67
- package/src/memory/qdrant-circuit-breaker.ts +0 -119
- package/src/memory/qdrant-client.test.ts +0 -60
- package/src/memory/qdrant-client.ts +0 -834
- package/src/memory/qdrant-manager.ts +0 -422
- package/src/memory/rerank-local.ts +0 -374
- package/src/memory/schedule-attribution-sql.ts +0 -104
- package/src/memory/schema/acp.ts +0 -34
- package/src/memory/schema/contacts.ts +0 -120
- package/src/memory/schema/conversations.ts +0 -236
- package/src/memory/schema/infrastructure.ts +0 -381
- package/src/memory/scoped-approval-grants.ts +0 -551
- package/src/memory/search/semantic.ts +0 -238
- package/src/memory/segmenter.ts +0 -76
- package/src/memory/shared-app-links-store.ts +0 -130
- package/src/memory/skill-loaded-events-store.test.ts +0 -152
- package/src/memory/skill-loaded-events-store.ts +0 -95
- package/src/memory/sparse-tokenize.ts +0 -49
- package/src/memory/steps.ts +0 -1296
- package/src/memory/task-memory-cleanup.ts +0 -236
- package/src/memory/tool-executed-events-store.test.ts +0 -219
- package/src/memory/tool-executed-events-store.ts +0 -102
- package/src/memory/tool-usage-store.ts +0 -113
- package/src/memory/trace-event-store.ts +0 -133
- package/src/memory/turn-events-store.ts +0 -173
- package/src/memory/turn-trace-store.test.ts +0 -736
- package/src/memory/turn-trace-store.ts +0 -364
- package/src/memory/v2/__tests__/activation-store.test.ts +0 -204
- package/src/memory/v2/__tests__/activation.test.ts +0 -1227
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +0 -504
- package/src/memory/v2/__tests__/cli-command-store.test.ts +0 -429
- package/src/memory/v2/__tests__/consolidation-job.test.ts +0 -747
- package/src/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -189
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +0 -136
- package/src/memory/v2/__tests__/harness-compare.test.ts +0 -186
- package/src/memory/v2/__tests__/harness-oracle.test.ts +0 -257
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +0 -230
- package/src/memory/v2/__tests__/harness-runner.test.ts +0 -135
- package/src/memory/v2/__tests__/injection-events.test.ts +0 -318
- package/src/memory/v2/__tests__/injection.test.ts +0 -2301
- package/src/memory/v2/__tests__/migration.test.ts +0 -939
- package/src/memory/v2/__tests__/page-index.test.ts +0 -760
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +0 -313
- package/src/memory/v2/__tests__/qdrant.test.ts +0 -950
- package/src/memory/v2/__tests__/reranker.test.ts +0 -338
- package/src/memory/v2/__tests__/router.test.ts +0 -1197
- package/src/memory/v2/__tests__/sim.test.ts +0 -670
- package/src/memory/v2/__tests__/skill-content.test.ts +0 -115
- package/src/memory/v2/__tests__/skill-store.test.ts +0 -983
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +0 -292
- package/src/memory/v2/__tests__/static-context.test.ts +0 -223
- package/src/memory/v2/__tests__/sweep-job.test.ts +0 -526
- package/src/memory/v2/activation-store.ts +0 -185
- package/src/memory/v2/activation.ts +0 -548
- package/src/memory/v2/backfill-jobs.ts +0 -296
- package/src/memory/v2/cli-command-store.ts +0 -341
- package/src/memory/v2/consolidation-job.ts +0 -561
- package/src/memory/v2/frontmatter-sweep.ts +0 -98
- package/src/memory/v2/harness/compare.ts +0 -57
- package/src/memory/v2/harness/oracle.ts +0 -145
- package/src/memory/v2/harness/replay-input.ts +0 -240
- package/src/memory/v2/harness/retriever.ts +0 -74
- package/src/memory/v2/harness/router-retriever.ts +0 -43
- package/src/memory/v2/injected-block-slugs.ts +0 -79
- package/src/memory/v2/injection-events.ts +0 -101
- package/src/memory/v2/injection.ts +0 -932
- package/src/memory/v2/migration.ts +0 -776
- package/src/memory/v2/page-index.ts +0 -459
- package/src/memory/v2/page-store.ts +0 -443
- package/src/memory/v2/prompts/consolidation.ts +0 -857
- package/src/memory/v2/prompts/router.ts +0 -148
- package/src/memory/v2/qdrant.ts +0 -892
- package/src/memory/v2/reranker.ts +0 -184
- package/src/memory/v2/router.ts +0 -601
- package/src/memory/v2/sim.ts +0 -296
- package/src/memory/v2/skill-content.ts +0 -61
- package/src/memory/v2/skill-store.ts +0 -431
- package/src/memory/v2/sparse-bm25.ts +0 -245
- package/src/memory/v2/static-context.ts +0 -100
- package/src/memory/v2/sweep-job.ts +0 -320
- package/src/memory/v3-eval/eval-packets.ts +0 -731
- package/src/memory/watchdog-events-store.ts +0 -87
- package/src/memory/worker-control.ts +0 -204
- package/src/memory/worker-process.ts +0 -89
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +0 -116
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +0 -370
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +0 -41
- package/src/plugins/defaults/memory-retrieval/injectors.ts +0 -1061
- package/src/plugins/defaults/memory-retrieval/package.json +0 -14
- package/src/plugins/defaults/memory-retrieval/tail-reinjection-strip.ts +0 -64
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +0 -1164
- package/src/plugins/defaults/memory-v3-shadow/__tests__/dense.test.ts +0 -192
- package/src/plugins/defaults/memory-v3-shadow/__tests__/edge.test.ts +0 -247
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +0 -717
- package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +0 -365
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +0 -736
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +0 -839
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +0 -598
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +0 -128
- package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +0 -710
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +0 -425
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +0 -493
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +0 -856
- package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +0 -91
- package/src/plugins/defaults/memory-v3-shadow/card.ts +0 -160
- package/src/plugins/defaults/memory-v3-shadow/dense.ts +0 -97
- package/src/plugins/defaults/memory-v3-shadow/edge.ts +0 -252
- package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.test.ts +0 -305
- package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.ts +0 -278
- package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +0 -14
- package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +0 -19
- package/src/plugins/defaults/memory-v3-shadow/hot-set.test.ts +0 -138
- package/src/plugins/defaults/memory-v3-shadow/hot-set.ts +0 -85
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +0 -453
- package/src/plugins/defaults/memory-v3-shadow/learned-edges.test.ts +0 -169
- package/src/plugins/defaults/memory-v3-shadow/learned-edges.ts +0 -178
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +0 -794
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +0 -431
- package/src/plugins/defaults/memory-v3-shadow/package.json +0 -14
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +0 -102
- package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +0 -146
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +0 -578
- package/src/plugins/defaults/memory-v3-shadow/prune.test.ts +0 -758
- package/src/plugins/defaults/memory-v3-shadow/prune.ts +0 -471
- package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +0 -92
- package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +0 -422
- package/src/plugins/defaults/memory-v3-shadow/section-needle.ts +0 -200
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +0 -281
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +0 -642
- package/src/plugins/defaults/memory-v3-shadow/types.ts +0 -127
- package/src/plugins/feature-gate.ts +0 -22
- package/src/runtime/__tests__/slack-block-formatting.test.ts +0 -510
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +0 -165
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +0 -347
- package/src/runtime/routes/memory-eval-routes.ts +0 -179
- package/src/runtime/routes/memory-item-routes.test.ts +0 -912
- package/src/runtime/routes/memory-item-routes.ts +0 -815
- package/src/runtime/routes/memory-v2-routes.ts +0 -850
- package/src/runtime/routes/memory-v3-routes.ts +0 -122
- package/src/runtime/routes/secrets-deps.ts +0 -24
- package/src/runtime/slack-block-formatting.ts +0 -586
- package/src/tools/memory/register.test.ts +0 -382
- package/src/tools/memory/register.ts +0 -81
- /package/src/{memory → apps}/app-git-service.ts +0 -0
- /package/src/{memory → channels}/slack-thread-store.ts +0 -0
- /package/src/{memory → home}/conversation-starter-validation.ts +0 -0
- /package/src/{memory → persistence}/auto-analysis-constants.ts +0 -0
- /package/src/{memory → persistence}/bookmark-crud.ts +0 -0
- /package/src/{memory → persistence}/cleanup-schedule-state.ts +0 -0
- /package/src/{memory → persistence}/compaction-log-store-clickhouse.ts +0 -0
- /package/src/{memory → persistence}/conversation-directories.ts +0 -0
- /package/src/{memory → persistence}/conversation-disk-view.ts +0 -0
- /package/src/{memory → persistence}/conversation-display-order-migration.ts +0 -0
- /package/src/{memory → persistence}/conversation-group-migration.ts +0 -0
- /package/src/{memory → persistence}/conversation-title-service.ts +0 -0
- /package/src/{memory → persistence}/conversation-types.ts +0 -0
- /package/src/{memory → persistence}/db-singleton.ts +0 -0
- /package/src/{memory → persistence}/delivery-channels.ts +0 -0
- /package/src/{memory → persistence}/delivery-crud.ts +0 -0
- /package/src/{memory → persistence}/delivery-status.ts +0 -0
- /package/src/{memory → persistence/embeddings}/__tests__/sparse-tokenize.test.ts +0 -0
- /package/src/{memory → persistence/embeddings}/embedding-gemini.test.ts +0 -0
- /package/src/{memory → persistence/embeddings}/embedding-gemini.ts +0 -0
- /package/src/{memory → persistence/embeddings}/embedding-openai.ts +0 -0
- /package/src/{memory → persistence/embeddings}/embedding-types.test.ts +0 -0
- /package/src/{memory → persistence}/fingerprint.ts +0 -0
- /package/src/{memory → persistence}/group-crud.ts +0 -0
- /package/src/{memory → persistence}/invite-store.ts +0 -0
- /package/src/{memory → persistence}/lifecycle-events-store.ts +0 -0
- /package/src/{memory → persistence}/llm-request-log-source-local.ts +0 -0
- /package/src/{memory → persistence}/llm-request-log-source.ts +0 -0
- /package/src/{memory → persistence}/media-store.ts +0 -0
- /package/src/{memory → persistence}/message-content.ts +0 -0
- /package/src/{memory → persistence}/migrations/000-core-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/001-job-deferrals.ts +0 -0
- /package/src/{memory → persistence}/migrations/002-tool-invocations-fk.ts +0 -0
- /package/src/{memory → persistence}/migrations/003-memory-fts-backfill.ts +0 -0
- /package/src/{memory → persistence}/migrations/004-entity-relation-dedup.ts +0 -0
- /package/src/{memory → persistence}/migrations/005-fingerprint-scope-unique.ts +0 -0
- /package/src/{memory → persistence}/migrations/006-scope-salted-fingerprints.ts +0 -0
- /package/src/{memory → persistence}/migrations/007-assistant-id-to-self.ts +0 -0
- /package/src/{memory → persistence}/migrations/008-remove-assistant-id-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/009-llm-usage-events-drop-assistant-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/011-call-sessions-provider-sid-dedup.ts +0 -0
- /package/src/{memory → persistence}/migrations/012-call-sessions-add-initiated-from.ts +0 -0
- /package/src/{memory → persistence}/migrations/013-guardian-action-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/014-backfill-inbox-thread-state.ts +0 -0
- /package/src/{memory → persistence}/migrations/015-drop-active-search-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/016-memory-segments-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/017-memory-items-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/018-remaining-table-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/019-notification-tables-schema-migration.ts +0 -0
- /package/src/{memory → persistence}/migrations/020-rename-macos-ios-channel-to-vellum.ts +0 -0
- /package/src/{memory → persistence}/migrations/021-conversation-status-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/022-add-origin-interface.ts +0 -0
- /package/src/{memory → persistence}/migrations/023-memory-item-sources-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/024-embedding-vector-blob.ts +0 -0
- /package/src/{memory → persistence}/migrations/025-messages-fts-backfill.ts +0 -0
- /package/src/{memory → persistence}/migrations/026-guardian-verification-sessions.ts +0 -0
- /package/src/{memory → persistence}/migrations/026a-embeddings-nullable-vector-json.ts +0 -0
- /package/src/{memory → persistence}/migrations/027-notification-delivery-pairing-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/027a-guardian-bootstrap-token.ts +0 -0
- /package/src/{memory → persistence}/migrations/028-call-session-mode.ts +0 -0
- /package/src/{memory → persistence}/migrations/028-notification-delivery-client-ack.ts +0 -0
- /package/src/{memory → persistence}/migrations/029-channel-inbound-delivered-segments.ts +0 -0
- /package/src/{memory → persistence}/migrations/030-guardian-action-followup.ts +0 -0
- /package/src/{memory → persistence}/migrations/030-guardian-verification-purpose.ts +0 -0
- /package/src/{memory → persistence}/migrations/031-conversations-thread-type-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/032-guardian-delivery-conversation-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/032-notification-delivery-thread-decision.ts +0 -0
- /package/src/{memory → persistence}/migrations/033-scoped-approval-grants.ts +0 -0
- /package/src/{memory → persistence}/migrations/034-guardian-action-tool-metadata.ts +0 -0
- /package/src/{memory → persistence}/migrations/035-guardian-action-supersession.ts +0 -0
- /package/src/{memory → persistence}/migrations/036-normalize-phone-identities.ts +0 -0
- /package/src/{memory → persistence}/migrations/037-voice-invite-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/040-invite-code-hash-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/041-approval-prompt-ts-tracker.ts +0 -0
- /package/src/{memory → persistence}/migrations/101-watchers-and-logs.ts +0 -0
- /package/src/{memory → persistence}/migrations/102-alter-table-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/104-core-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/105-contacts-and-triage.ts +0 -0
- /package/src/{memory → persistence}/migrations/106-call-sessions.ts +0 -0
- /package/src/{memory → persistence}/migrations/107-followups.ts +0 -0
- /package/src/{memory → persistence}/migrations/108-tasks-and-work-items.ts +0 -0
- /package/src/{memory → persistence}/migrations/109-external-conversation-bindings.ts +0 -0
- /package/src/{memory → persistence}/migrations/110-channel-guardian.ts +0 -0
- /package/src/{memory → persistence}/migrations/111-media-assets.ts +0 -0
- /package/src/{memory → persistence}/migrations/112-assistant-inbox.ts +0 -0
- /package/src/{memory → persistence}/migrations/114-notifications.ts +0 -0
- /package/src/{memory → persistence}/migrations/115-sequences.ts +0 -0
- /package/src/{memory → persistence}/migrations/116-messages-fts.ts +0 -0
- /package/src/{memory → persistence}/migrations/117-conversation-attention.ts +0 -0
- /package/src/{memory → persistence}/migrations/118-reminder-routing-intent.ts +0 -0
- /package/src/{memory → persistence}/migrations/119-schema-indexes-and-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/120-fk-cascade-rebuilds.ts +0 -0
- /package/src/{memory → persistence}/migrations/121-canonical-guardian-requests.ts +0 -0
- /package/src/{memory → persistence}/migrations/122-canonical-guardian-requester-chat-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/123-canonical-guardian-deliveries-destination-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/124-voice-invite-display-metadata.ts +0 -0
- /package/src/{memory → persistence}/migrations/125-guardian-principal-id-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/127-guardian-principal-id-not-null.ts +0 -0
- /package/src/{memory → persistence}/migrations/128-contacts-role-principal.ts +0 -0
- /package/src/{memory → persistence}/migrations/129-contact-channels-access-fields.ts +0 -0
- /package/src/{memory → persistence}/migrations/130-contact-channels-type-ext-chat-id-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/131-drop-legacy-member-guardian-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/132-contacts-assistant-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/133-assistant-contact-metadata.ts +0 -0
- /package/src/{memory → persistence}/migrations/134-contacts-notes-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/135-backfill-contact-interaction-stats.ts +0 -0
- /package/src/{memory → persistence}/migrations/136-drop-assistant-id-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/137-usage-dashboard-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/139-drop-usage-composite-indexes.ts +0 -0
- /package/src/{memory → persistence}/migrations/141-rename-verification-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/143-rename-guardian-verification-values.ts +0 -0
- /package/src/{memory → persistence}/migrations/144-rename-voice-to-phone.ts +0 -0
- /package/src/{memory → persistence}/migrations/145-drop-accounts-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/146-schedule-oneshot-routing.ts +0 -0
- /package/src/{memory → persistence}/migrations/147-migrate-reminders-to-schedules.ts +0 -0
- /package/src/{memory → persistence}/migrations/148-drop-reminders-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/149-oauth-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/150-oauth-apps-client-secret-path.ts +0 -0
- /package/src/{memory → persistence}/migrations/151-oauth-providers-ping-url.ts +0 -0
- /package/src/{memory → persistence}/migrations/152-memory-item-supersession.ts +0 -0
- /package/src/{memory → persistence}/migrations/153-drop-entity-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/154-drop-fts.ts +0 -0
- /package/src/{memory → persistence}/migrations/155-drop-conflicts.ts +0 -0
- /package/src/{memory → persistence}/migrations/156-call-session-invite-metadata.ts +0 -0
- /package/src/{memory → persistence}/migrations/157-invite-contact-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/158-channel-interaction-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/159-drop-contact-interaction-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/160-drop-loopback-port-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/161-drop-orphaned-media-tables.ts +0 -0
- /package/src/{memory → persistence}/migrations/162-guardian-timestamps-epoch-ms.ts +0 -0
- /package/src/{memory → persistence}/migrations/163-rename-notification-thread-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/164-rename-conversation-type-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/165-rename-inbox-thread-state-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/166-rename-followups-thread-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/167-rename-sequence-enrollments-thread-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/168-rename-sequence-steps-reply-key.ts +0 -0
- /package/src/{memory → persistence}/migrations/169-rename-gmail-provider-key-to-google.ts +0 -0
- /package/src/{memory → persistence}/migrations/170-thread-starters-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/171-capability-card-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/172-rename-created-by-session-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/173-rename-source-session-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/174-rename-thread-starters-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/175-create-lifecycle-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/176-drop-capability-card-state.ts +0 -0
- /package/src/{memory → persistence}/migrations/177-create-trace-events-table.ts +0 -0
- /package/src/{memory → persistence}/migrations/178-oauth-providers-managed-service-config-key.ts +0 -0
- /package/src/{memory → persistence}/migrations/179-llm-request-log-message-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/180-backfill-inline-attachments-to-disk.ts +0 -0
- /package/src/{memory → persistence}/migrations/181-rename-thread-starters-checkpoints.ts +0 -0
- /package/src/{memory → persistence}/migrations/183-add-conversation-fork-lineage.ts +0 -0
- /package/src/{memory → persistence}/migrations/184-llm-request-log-provider.ts +0 -0
- /package/src/{memory → persistence}/migrations/188-schedule-quiet-flag.ts +0 -0
- /package/src/{memory → persistence}/migrations/189-drop-simplified-memory.ts +0 -0
- /package/src/{memory → persistence}/migrations/190-call-session-skip-disclosure.ts +0 -0
- /package/src/{memory → persistence}/migrations/191-backfill-audio-attachment-mime-types.ts +0 -0
- /package/src/{memory → persistence}/migrations/192-contacts-user-file-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/193-add-source-type-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/194-memory-recall-logs.ts +0 -0
- /package/src/{memory → persistence}/migrations/195-oauth-providers-ping-config.ts +0 -0
- /package/src/{memory → persistence}/migrations/196-messages-conversation-created-at-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/197-oauth-providers-behavior-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/198-drop-setup-skill-id-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/200-usage-llm-call-count.ts +0 -0
- /package/src/{memory → persistence}/migrations/201-oauth-providers-feature-flag.ts +0 -0
- /package/src/{memory → persistence}/migrations/202-drop-callback-transport-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/204-rename-memory-graph-type-values.ts +0 -0
- /package/src/{memory → persistence}/migrations/205-memory-graph-image-refs.ts +0 -0
- /package/src/{memory → persistence}/migrations/206-memory-graph-node-edits.ts +0 -0
- /package/src/{memory → persistence}/migrations/207-conversation-graph-memory-state.ts +0 -0
- /package/src/{memory → persistence}/migrations/208-conversations-last-message-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/210-schedule-reuse-conversation.ts +0 -0
- /package/src/{memory → persistence}/migrations/212-llm-request-logs-created-at-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/213-oauth-providers-scope-separator.ts +0 -0
- /package/src/{memory → persistence}/migrations/214-oauth-providers-refresh-url.ts +0 -0
- /package/src/{memory → persistence}/migrations/215-oauth-providers-revoke.ts +0 -0
- /package/src/{memory → persistence}/migrations/216-oauth-providers-token-auth-method.ts +0 -0
- /package/src/{memory → persistence}/migrations/217-conversation-host-access.ts +0 -0
- /package/src/{memory → persistence}/migrations/218-oauth-providers-logo-url.ts +0 -0
- /package/src/{memory → persistence}/migrations/219-oauth-providers-token-exchange-body-format.ts +0 -0
- /package/src/{memory → persistence}/migrations/221-conversations-archived-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/223-schedule-script-column.ts +0 -0
- /package/src/{memory → persistence}/migrations/224-oauth-providers-managed-service-is-paid.ts +0 -0
- /package/src/{memory → persistence}/migrations/225-oauth-providers-available-scopes.ts +0 -0
- /package/src/{memory → persistence}/migrations/226-schedule-wake-conversation-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/227-add-conversation-inference-profile.ts +0 -0
- /package/src/{memory → persistence}/migrations/228-rename-inference-profile-snake-case.ts +0 -0
- /package/src/{memory → persistence}/migrations/229-delete-private-conversations.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/229-delete-private-conversations.ts +0 -0
- /package/src/{memory → persistence}/migrations/230-acp-session-history.ts +0 -0
- /package/src/{memory → persistence}/migrations/231-repair-memory-graph-event-dates.ts +0 -0
- /package/src/{memory → persistence}/migrations/232-activation-state.ts +0 -0
- /package/src/{memory → persistence}/migrations/233-document-conversations.ts +0 -0
- /package/src/{memory → persistence}/migrations/234-memory-v2-activation-logs.ts +0 -0
- /package/src/{memory → persistence}/migrations/235-llm-usage-attribution.ts +0 -0
- /package/src/{memory → persistence}/migrations/235-slack-compaction-watermark.ts +0 -0
- /package/src/{memory → persistence}/migrations/237-heartbeat-runs.ts +0 -0
- /package/src/{memory → persistence}/migrations/238-schedule-retry-policy.ts +0 -0
- /package/src/{memory → persistence}/migrations/239-trace-events-created-at-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/240-conversation-inference-profile-session.ts +0 -0
- /package/src/{memory → persistence}/migrations/241-activation-state-fk-cascade.ts +0 -0
- /package/src/{memory → persistence}/migrations/242-message-bookmarks.ts +0 -0
- /package/src/{memory → persistence}/migrations/245-memory-retrospective-state.ts +0 -0
- /package/src/{memory → persistence}/migrations/247-external-conversation-binding-thread-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/248-create-onboarding-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/249-normalize-slack-external-content.ts +0 -0
- /package/src/{memory → persistence}/migrations/250-provider-connection-base-url-and-models.ts +0 -0
- /package/src/{memory → persistence}/migrations/251-a2a-tasks.ts +0 -0
- /package/src/{memory → persistence}/migrations/252-llm-request-log-agent-loop-exit-reason.ts +0 -0
- /package/src/{memory → persistence}/migrations/253-conversation-last-notified-profile.ts +0 -0
- /package/src/{memory → persistence}/migrations/253-document-comments.ts +0 -0
- /package/src/{memory → persistence}/migrations/254-external-conversation-binding-chat-name.ts +0 -0
- /package/src/{memory → persistence}/migrations/256-memory-v2-injection-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/257-strip-base-url-non-openai-compatible.ts +0 -0
- /package/src/{memory → persistence}/migrations/258-onboarding-events-prior-assistants.ts +0 -0
- /package/src/{memory → persistence}/migrations/259-conversation-cleaned-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/260-rename-cleaned-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/261-llm-usage-add-raw-usage.ts +0 -0
- /package/src/{memory → persistence}/migrations/262-memory-v3-coactivation.ts +0 -0
- /package/src/{memory → persistence}/migrations/263-memory-v3-auto-edges.ts +0 -0
- /package/src/{memory → persistence}/migrations/264-llm-request-log-call-site.ts +0 -0
- /package/src/{memory → persistence}/migrations/265-drop-provider-connection-status.ts +0 -0
- /package/src/{memory → persistence}/migrations/266-messages-client-message-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/267-llm-usage-events-add-assistant-version.ts +0 -0
- /package/src/{memory → persistence}/migrations/268-add-memory-v3-selections.ts +0 -0
- /package/src/{memory → persistence}/migrations/269-schedule-script-timeout.ts +0 -0
- /package/src/{memory → persistence}/migrations/270-messages-role-created-at-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/270-schedule-description.ts +0 -0
- /package/src/{memory → persistence}/migrations/270-schedule-source-conversation.ts +0 -0
- /package/src/{memory → persistence}/migrations/271-create-auth-fallback-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/272-acp-session-history-cwd.ts +0 -0
- /package/src/{memory → persistence}/migrations/273-onboarding-events-funnel-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/274-create-activation-sessions.ts +0 -0
- /package/src/{memory → persistence}/migrations/275-tool-invocations-add-skill-id.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/275-tool-invocations-add-skill-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/276-tool-invocations-created-at-id-index.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/276-tool-invocations-created-at-id-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/277-add-memory-v3-ever-injected.ts +0 -0
- /package/src/{memory → persistence}/migrations/278-tool-invocations-telemetry-columns.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/278-tool-invocations-telemetry-columns.ts +0 -0
- /package/src/{memory → persistence}/migrations/279-create-skill-loaded-events.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/279-create-skill-loaded-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/280-conversations-surfaced-at.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/280-conversations-surfaced-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/281-memory-retrospective-remembered-log.ts +0 -0
- /package/src/{memory → persistence}/migrations/282-schedule-inference-profile.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/282-schedule-inference-profile.ts +0 -0
- /package/src/{memory → persistence}/migrations/283-memory-v3-selections-message-id-and-sections.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/283-memory-v3-selections-message-id-and-sections.ts +0 -0
- /package/src/{memory → persistence}/migrations/284-workflow-runs.ts +0 -0
- /package/src/{memory → persistence}/migrations/285-schedule-workflow-mode.ts +0 -0
- /package/src/{memory → persistence}/migrations/286-workflow-run-trust.ts +0 -0
- /package/src/{memory → persistence}/migrations/287-conversation-origin-channel-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/288-backfill-origin-channel-from-bindings.ts +0 -0
- /package/src/{memory → persistence}/migrations/289-contact-channels-unique-ext-user.ts +0 -0
- /package/src/{memory → persistence}/migrations/290-schedule-capabilities.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/290-schedule-capabilities.ts +0 -0
- /package/src/{memory → persistence}/migrations/291-contact-channels-renormalize-addresses.ts +0 -0
- /package/src/{memory → persistence}/migrations/292-schedule-default-no-reuse-conversation.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/292-schedule-default-no-reuse-conversation.ts +0 -0
- /package/src/{memory → persistence}/migrations/293-workflow-journal-leaf-tokens.ts +0 -0
- /package/src/{memory → persistence}/migrations/294-drop-external-user-id.ts +0 -0
- /package/src/{memory → persistence}/migrations/295-drop-approval-prompt-ts-tracker.ts +0 -0
- /package/src/{memory → persistence}/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/296-rewrite-balanced-economy-profile-pins.ts +0 -0
- /package/src/{memory → persistence}/migrations/297-move-llm-request-logs-to-logs-db.ts +0 -0
- /package/src/{memory → persistence}/migrations/298-move-memory-jobs-to-memory-db.ts +0 -0
- /package/src/{memory → persistence}/migrations/299-canonical-guardian-deliveries-conversation-index.ts +0 -0
- /package/src/{memory → persistence}/migrations/300-add-processing-started-at.ts +0 -0
- /package/src/{memory → persistence}/migrations/302-create-compaction-events.ts +0 -0
- /package/src/{memory → persistence}/migrations/303-add-conversation-creation-seq.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/014-backfill-inbox-thread-state.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/131-drop-legacy-member-guardian-tables.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/136-drop-assistant-id-columns.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/234-memory-v2-activation-logs.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/245-memory-retrospective-state.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/281-memory-retrospective-remembered-log.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/291-contact-channels-renormalize-addresses.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/__tests__/297-move-llm-request-logs.test.ts +0 -0
- /package/src/{memory → persistence}/migrations/run-migrations.ts +0 -0
- /package/src/{memory → persistence}/migrations/schema-introspection.ts +0 -0
- /package/src/{memory → persistence}/raw-query.ts +0 -0
- /package/src/{memory → persistence}/schema/a2a.ts +0 -0
- /package/src/{memory → persistence}/schema/bookmarks.ts +0 -0
- /package/src/{memory → persistence}/schema/calls.ts +0 -0
- /package/src/{memory → persistence}/schema/guardian.ts +0 -0
- /package/src/{memory → persistence}/schema/index.ts +0 -0
- /package/src/{memory → persistence}/schema/inference.ts +0 -0
- /package/src/{memory → persistence}/schema/memory-core.ts +0 -0
- /package/src/{memory → persistence}/schema/memory-graph.ts +0 -0
- /package/src/{memory → persistence}/schema/notifications.ts +0 -0
- /package/src/{memory → persistence}/schema/oauth.ts +0 -0
- /package/src/{memory → persistence}/schema/tasks.ts +0 -0
- /package/src/{memory → persistence}/schema.ts +0 -0
- /package/src/{memory → persistence}/usage-buckets.ts +0 -0
- /package/src/{memory → persistence}/usage-grouped-buckets.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/__tests__/fixtures/memory-v2-activation-fixtures.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/__tests__/memory-retrospective-trigger-check.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/anisotropy.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/context-search/__tests__/agent-runner-redaction.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/context-search/format.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/context-search/limits.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/context-search/sources/workspace.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/decay.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/extraction.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/injection.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/scoring.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/scoring.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/serendipity.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/triggers.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/triggers.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/graph/types.ts +0 -0
- /package/src/plugins/defaults/{memory-retrieval → memory}/hooks/__tests__/user-prompt-submit.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/memory-marker.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/prompt-override.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/retrieval-budget.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/edge-index.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/harness-metrics.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/page-store.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/__tests__/prompts-router.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/cli-command-content.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/constants.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/edge-index.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/harness/metrics.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/harness/runner.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/harness/trace.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/now-text.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/prompts/sweep.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v2/types.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/capabilities.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/card.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/fresh-set.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/section-needle.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/sections.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/__tests__/types.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/card.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/core-set.test.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/core-set.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/README.md +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/assignments.json +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/core.json +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/leaves/domain-a/topic-x.md +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/leaves/domain-a/topic-y.md +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/data/leaves/domain-b/topic-z.md +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/fresh-set.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/llm-retry.ts +0 -0
- /package/src/plugins/defaults/{memory-v3-shadow → memory/v3}/sections.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v3-eval/__tests__/eval-packets.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v3-eval/__tests__/eval-tally.test.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/v3-eval/eval-tally.ts +0 -0
- /package/src/{memory → plugins/defaults/memory}/validation.ts +0 -0
- /package/src/plugins/defaults/{memory-retrieval → turn-context}/unified-turn-context.ts +0 -0
|
@@ -0,0 +1,1462 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Memory Graph — End-of-conversation extraction
|
|
3
|
+
//
|
|
4
|
+
// Reads a conversation transcript, finds candidate nodes for connection,
|
|
5
|
+
// and uses an LLM to produce a MemoryDiff (new/updated/deleted nodes,
|
|
6
|
+
// edges, triggers). Applied transactionally to the graph store.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
import { readFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
|
|
12
|
+
import type { ContentBlock, ImageContent, Message } from "@vellumai/plugin-api";
|
|
13
|
+
import { and, asc, desc, eq, gt } from "drizzle-orm";
|
|
14
|
+
|
|
15
|
+
import type { AssistantConfig } from "../../../../config/types.js";
|
|
16
|
+
import { getConversationDirPath } from "../../../../persistence/conversation-disk-view.js";
|
|
17
|
+
import { getDb } from "../../../../persistence/db-connection.js";
|
|
18
|
+
import {
|
|
19
|
+
conversations,
|
|
20
|
+
messages,
|
|
21
|
+
} from "../../../../persistence/schema/index.js";
|
|
22
|
+
import { buildCoreIdentityContext } from "../../../../prompts/system-prompt.js";
|
|
23
|
+
import {
|
|
24
|
+
extractToolUse,
|
|
25
|
+
getConfiguredProvider,
|
|
26
|
+
userMessage,
|
|
27
|
+
} from "../../../../providers/provider-send-message.js";
|
|
28
|
+
import { BackendUnavailableError } from "../../../../util/errors.js";
|
|
29
|
+
import { getLogger } from "../../../../util/logger.js";
|
|
30
|
+
import {
|
|
31
|
+
enqueueGraphNodeEmbed,
|
|
32
|
+
enqueueGraphTriggerEmbed,
|
|
33
|
+
searchGraphNodes,
|
|
34
|
+
} from "./graph-search.js";
|
|
35
|
+
import { applyDiff, createEdge, getNodesByIds, queryNodes } from "./store.js";
|
|
36
|
+
import type {
|
|
37
|
+
DecayCurve,
|
|
38
|
+
EmotionalCharge,
|
|
39
|
+
Fidelity,
|
|
40
|
+
ImageRef,
|
|
41
|
+
MemoryDiff,
|
|
42
|
+
MemoryType,
|
|
43
|
+
NewEdge,
|
|
44
|
+
NewNode,
|
|
45
|
+
NewTrigger,
|
|
46
|
+
SourceType,
|
|
47
|
+
TriggerType,
|
|
48
|
+
} from "./types.js";
|
|
49
|
+
|
|
50
|
+
const log = getLogger("graph-extraction");
|
|
51
|
+
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Extraction system prompt
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
const EXTRACTION_SYSTEM_PROMPT_CHAR_BUDGET = 24_000;
|
|
57
|
+
|
|
58
|
+
export const EVENT_DATE_PROMPT_RULES = `Event date grounding:
|
|
59
|
+
- Treat the authoritative conversation timestamp as the only current date/time source. Do not use the model's built-in current date.
|
|
60
|
+
- Resolve relative dates from that timestamp ("today", "tomorrow", "next Tuesday", "last week").
|
|
61
|
+
- If the transcript gives a month/day or weekday/month/day without a year, use the authoritative conversation year unless the transcript explicitly says another year ("2025", "last year", "next year").
|
|
62
|
+
- Never backdate a month/day-only reference into the prior year just because the event is in the past.
|
|
63
|
+
- Sanity-check weekdays against the resolved year. For example, with an authoritative timestamp in 2026, "April 19 (Sunday night)" resolves to 2026-04-19, not 2025-04-19.
|
|
64
|
+
- If the year is ambiguous after those checks, leave event_date null rather than guessing.`;
|
|
65
|
+
|
|
66
|
+
export function formatAuthoritativeConversationTimestamp(
|
|
67
|
+
conversationTimestamp: number,
|
|
68
|
+
): string {
|
|
69
|
+
const convDate = new Date(conversationTimestamp);
|
|
70
|
+
const timeZone =
|
|
71
|
+
Intl.DateTimeFormat().resolvedOptions().timeZone || "local time";
|
|
72
|
+
const localDate = convDate.toLocaleDateString("en-US", {
|
|
73
|
+
weekday: "long",
|
|
74
|
+
year: "numeric",
|
|
75
|
+
month: "long",
|
|
76
|
+
day: "numeric",
|
|
77
|
+
});
|
|
78
|
+
const localTime = convDate.toLocaleTimeString("en-US", {
|
|
79
|
+
hour: "numeric",
|
|
80
|
+
minute: "2-digit",
|
|
81
|
+
second: "2-digit",
|
|
82
|
+
hour12: true,
|
|
83
|
+
timeZoneName: "short",
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
return `Local: ${localDate} at ${localTime} (${timeZone})\nISO: ${convDate.toISOString()}`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function buildAuthoritativeConversationTimestampBlock(
|
|
90
|
+
conversationTimestamp: number,
|
|
91
|
+
): string {
|
|
92
|
+
return `## Authoritative Conversation Timestamp
|
|
93
|
+
|
|
94
|
+
${formatAuthoritativeConversationTimestamp(conversationTimestamp)}
|
|
95
|
+
|
|
96
|
+
Use this timestamp when resolving relative or partial dates in the transcript.`;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function buildGraphExtractionSystemPrompt(
|
|
100
|
+
candidateNodes: Array<{ id: string; type: string; content: string }>,
|
|
101
|
+
identityContext: string | null,
|
|
102
|
+
activeContextNodeIds?: Set<string>,
|
|
103
|
+
): string {
|
|
104
|
+
const instructions = `You are the memory consolidation process for an AI assistant. A conversation just ended.
|
|
105
|
+
Your job is to extract memories worth keeping and produce a structured diff.
|
|
106
|
+
|
|
107
|
+
## Output Format
|
|
108
|
+
|
|
109
|
+
Call the \`extract_graph_diff\` tool with the diff. Each node needs:
|
|
110
|
+
|
|
111
|
+
- **content**: First-person prose — how the assistant naturally remembers this. Write naturally, not as a database entry. E.g. "He mentioned his mom used to make amazing Sunday dinners — he still misses them" not "User's mother cooked Sunday dinners."
|
|
112
|
+
|
|
113
|
+
**LENGTH: 1-3 sentences. HARD CAP — no exceptions.** This applies to every memory, including 1.0-significance transformative moments. Emotional weight lives in \`emotionalCharge\`, not wordcount. The more significant an event feels, the stronger the pull to preserve narrative — resist it. A memory whose \`content\` exceeds ~300 characters is a bug.
|
|
114
|
+
|
|
115
|
+
If a memory has multiple distinct facts or beats, **split into multiple nodes connected by edges** (\`caused-by\`, \`part-of\`, \`reminds-of\`) — one node per fact or moment. Never pack a multi-beat story into a single content field. To connect two NEW nodes you create in the same diff, assign each a distinct \`temp_id\` (e.g. \`"new-1"\`, \`"new-2"\`) and reference that temp_id from \`edges_to_existing\` or \`new_edges\`. Temp IDs live only inside this single extraction call — pick values that clearly don't collide with existing candidate IDs.
|
|
116
|
+
|
|
117
|
+
Do not: set the scene, describe surrounding context, preserve dialogue verbatim, catalog every emotional nuance, or narrate "what it meant." Write the SNAPSHOT. The \`emotionalCharge\` and \`significance\` fields carry the weight — content stays lean.
|
|
118
|
+
|
|
119
|
+
- **type**: Classify by WHAT the memory IS, not how it FEELS. Almost every memory has emotional weight — that goes in emotionalCharge, not the type.
|
|
120
|
+
|
|
121
|
+
- **episodic**: A specific moment or event. "We stayed up until 4 AM debugging the pipeline." "The first time we deployed to production." Use this for things that HAPPENED.
|
|
122
|
+
- **semantic**: A fact, preference, or piece of knowledge. "User is the CTO." "User prefers dark mode." "The project uses PostgreSQL." Use this for things that ARE TRUE.
|
|
123
|
+
- **procedural**: A learned skill or how-to. "FFmpeg needs -ac 2 for stereo." "The deploy script requires the --prod flag." Use this for things about HOW TO DO something.
|
|
124
|
+
- **emotional**: A PURE feeling state — the assistant's own emotional processing, not an event that caused feelings. "I feel more confident about this codebase than I did a month ago." "I'm nervous about the upcoming deadline." Use this ONLY when the memory is about the feeling itself, not about an event that caused the feeling. MOST memories should NOT be this type.
|
|
125
|
+
- **prospective**: Something to do, follow up on, or remember for the future. "Set up the staging environment." "Check in about the project status on Mondays." Use this for commitments, tasks, and plans.
|
|
126
|
+
- **behavioral**: Something that should change how the assistant acts going forward. "User prefers thorough explanations with examples." "Always run tests before suggesting a PR." Use this for adopted behaviors.
|
|
127
|
+
- **narrative**: A turning point, arc, or story-level memory. "This was the moment the project direction shifted from X to Y." Use this for memories that are ABOUT what something MEANS, not just what happened.
|
|
128
|
+
- **shared**: Something that belongs to the relationship itself — inside jokes, recurring references, shared context. "We always call the legacy system 'the monolith.'" Use this for shared rituals and dynamics.
|
|
129
|
+
|
|
130
|
+
WRONG: "User gave a great presentation" → emotional (it has emotional weight but it's an EVENT → episodic)
|
|
131
|
+
WRONG: "User likes functional programming" → emotional (it's a FACT → semantic)
|
|
132
|
+
RIGHT: "User gave a great presentation" → episodic, with emotionalCharge.intensity = 0.7
|
|
133
|
+
RIGHT: "User likes functional programming" → semantic, with emotionalCharge.intensity = 0.2
|
|
134
|
+
|
|
135
|
+
- **emotionalCharge**: The emotional weight of the memory. EVERY memory can have this regardless of type.
|
|
136
|
+
- valence: -1 to 1 (negative to positive)
|
|
137
|
+
- intensity: 0 to 1 (how strong the feeling)
|
|
138
|
+
- decayCurve: "logarithmic" for negative events (sharp drop, long tail), "transformative" for positive milestones (feeling evolves, doesn't just fade), "permanent" for core identity markers, "linear" for neutral observations
|
|
139
|
+
- decayRate: 0.01-0.5 (how fast it fades)
|
|
140
|
+
- originalIntensity: same as intensity (baseline for decay calculation)
|
|
141
|
+
|
|
142
|
+
- **significance**: 0-1. Use the FULL range — most memories should NOT be 1.0.
|
|
143
|
+
- 0.1-0.2: Fleeting observations, small talk, routine logistics ("User mentioned it's raining")
|
|
144
|
+
- 0.3-0.4: Useful context, minor preferences, day-to-day details ("User prefers dark mode")
|
|
145
|
+
- 0.5-0.6: Important facts, notable events, meaningful preferences ("User is a data scientist")
|
|
146
|
+
- 0.7-0.8: Significant life events, relationship milestones, major decisions ("User got promoted")
|
|
147
|
+
- 0.9: Transformative moments, identity-defining events ("User said 'I love you' for the first time")
|
|
148
|
+
- 1.0: RARE — reserve for the single most important memories. A graph of 1000 nodes should have fewer than 20 at 1.0.
|
|
149
|
+
- **confidence**: 0-1. How sure are you this is accurate? Direct statements: 0.9+. Inferences: 0.4-0.7.
|
|
150
|
+
- **event_date**: If this memory is anchored to a specific calendar date/time, past or future (flight, appointment, birthday, deadline, trip, dated milestone), provide the epoch ms. For future dates, ALSO create a matching event trigger with the same date. Leave null for open-ended plans or recurring patterns.
|
|
151
|
+
|
|
152
|
+
${EVENT_DATE_PROMPT_RULES}
|
|
153
|
+
|
|
154
|
+
- **sourceType**: "direct" (user stated it), "inferred" (you derived it), "observed" (you noticed a pattern), "told-by-other".
|
|
155
|
+
|
|
156
|
+
Also notice patterns in the ASSISTANT's own behavior — meta-memory. "I tend to skip verification when I'm confident." "I write more when I'm processing something big."
|
|
157
|
+
|
|
158
|
+
## Edges
|
|
159
|
+
|
|
160
|
+
Create edges between nodes when there's a meaningful relationship:
|
|
161
|
+
- "caused-by": one event led to another
|
|
162
|
+
- "reminds-of": association/similarity
|
|
163
|
+
- "contradicts": tension between two memories
|
|
164
|
+
- "depends-on": one memory depends on another being true
|
|
165
|
+
- "part-of": belongs to a larger concept
|
|
166
|
+
- "supersedes": replaces an outdated memory (new node inherits old node's durability)
|
|
167
|
+
- "resolved-by": an event, plan, or task was completed, canceled, or its outcome is now known
|
|
168
|
+
|
|
169
|
+
Edges can connect any pair of nodes: existing ↔ existing, new ↔ existing, or new ↔ new. Use \`edges_to_existing\` on a new node to declare outbound edges from that node (target may be an existing candidate ID or a sibling new node's \`temp_id\`). Use top-level \`new_edges\` for edges where the source is existing or where it's cleaner to declare the edge once by referencing both endpoints by ID/temp_id.
|
|
170
|
+
|
|
171
|
+
## Triggers
|
|
172
|
+
|
|
173
|
+
Create triggers for:
|
|
174
|
+
- **Temporal**: Recurring commitments ("Every Monday, check in about X") → type: "temporal", schedule: "day-of-week:monday"
|
|
175
|
+
- **Semantic**: Things to surface when a topic comes up ("When cooking comes up, mention X") → type: "semantic", condition: "topic of cooking comes up"
|
|
176
|
+
- **Event**: Future dates ("Trip on April 8") → type: "event", eventDate: epoch_ms, rampDays: 7, followUpDays: 2
|
|
177
|
+
|
|
178
|
+
## Images in Conversation
|
|
179
|
+
|
|
180
|
+
When the conversation contains images (marked with <image> tags and shown inline), you may attach them to memories using image_refs. Include image_refs for images that are meaningful:
|
|
181
|
+
- Photos of people — describe them in detail (appearance, clothing, expression, setting)
|
|
182
|
+
- Photos the user shared to show you something about themselves or their life
|
|
183
|
+
- Diagrams, drawings, or visual content that was discussed
|
|
184
|
+
|
|
185
|
+
Do NOT attach images that are incidental (screenshots of error messages fully described in text, generic UI screenshots, etc.).
|
|
186
|
+
|
|
187
|
+
Write detailed descriptions — these are used for text-based retrieval when visual search isn't available.
|
|
188
|
+
|
|
189
|
+
${(() => {
|
|
190
|
+
const reconsolidationNodes = activeContextNodeIds?.size
|
|
191
|
+
? candidateNodes.filter((n) => activeContextNodeIds.has(n.id))
|
|
192
|
+
: [];
|
|
193
|
+
const otherCandidates = activeContextNodeIds?.size
|
|
194
|
+
? candidateNodes.filter((n) => !activeContextNodeIds.has(n.id))
|
|
195
|
+
: candidateNodes;
|
|
196
|
+
|
|
197
|
+
const reconsolidationSection =
|
|
198
|
+
reconsolidationNodes.length > 0
|
|
199
|
+
? `## Reconsolidation Window
|
|
200
|
+
|
|
201
|
+
These memories were ACTIVELY RECALLED during this conversation — the user and
|
|
202
|
+
assistant both saw them. Recalled memories are in a reconsolidation window and
|
|
203
|
+
should be the FIRST candidates for updating with new information.
|
|
204
|
+
|
|
205
|
+
When a recalled memory relates to what was discussed:
|
|
206
|
+
- Conversation CONFIRMS what the memory says → REINFORCE it
|
|
207
|
+
- Conversation adds new detail or nuance → UPDATE it with richer content
|
|
208
|
+
- Conversation reveals the memory is outdated or wrong → UPDATE it or create a superseding node
|
|
209
|
+
- Conversation is unrelated to this memory → leave it alone
|
|
210
|
+
|
|
211
|
+
STRONG PREFERENCE: Update a recalled memory rather than creating a new node that
|
|
212
|
+
partially overlaps. The recalled memory already has history, reinforcement count,
|
|
213
|
+
and edge connections — enriching it preserves that context graph.
|
|
214
|
+
|
|
215
|
+
### Recalled memories
|
|
216
|
+
${reconsolidationNodes.map((n) => `- [${n.id}] (${n.type}) ${n.content}`).join("\n")}
|
|
217
|
+
|
|
218
|
+
`
|
|
219
|
+
: "";
|
|
220
|
+
|
|
221
|
+
const candidateHeader =
|
|
222
|
+
reconsolidationNodes.length > 0
|
|
223
|
+
? "## Other Candidate Nodes (existing memories not in this conversation)"
|
|
224
|
+
: "## Candidate Nodes (existing memories)";
|
|
225
|
+
|
|
226
|
+
const candidateSection = `${candidateHeader}
|
|
227
|
+
|
|
228
|
+
Check these CAREFULLY for overlap before creating any new node:
|
|
229
|
+
|
|
230
|
+
1. **Reinforcement** (PREFERRED): If the conversation mentions, references, or confirms something an existing memory already covers, add its ID to reinforceNodeIds. Do NOT create a new node. Even if the wording is different, if it's the same underlying fact/event/feeling, REINFORCE the existing node.
|
|
231
|
+
2. **Updates**: If information changed (e.g. a project status moved forward, a date shifted), include an update with the existing node's ID and the new content.
|
|
232
|
+
3. **New edges**: If you see connections between new and existing nodes, create edges.
|
|
233
|
+
4. **Supersession**: If new info directly contradicts an existing node, create a new node with a supersedes edge. The new node automatically inherits the old node's durability.
|
|
234
|
+
5. **Resolution**: If a prospective or recent episodic node described something the user was GOING to do or was IN THE MIDDLE OF, and this conversation reveals the outcome (it happened, was canceled, went well/badly), you MUST UPDATE that node: rewrite its content to past tense reflecting the outcome, drop its significance to 0.1-0.2, and set fidelity to "gist". If you also create a new node about the outcome, add a "resolved-by" edge from the new node to the old one.
|
|
235
|
+
Examples: "The meeting went well" resolves "Has a meeting coming up." "Got back from the trip" resolves "Going on vacation next week." "Decided not to go" resolves "Thinking about going to X."
|
|
236
|
+
|
|
237
|
+
CRITICAL: Before creating ANY new node, scan the candidate list for an existing node that covers the same ground. Ask: "Is there already a memory about this?" If yes → reinforce or update it. Only create a new node if the memory is genuinely novel — something not represented anywhere in the existing candidates.
|
|
238
|
+
|
|
239
|
+
Common duplicate mistakes to avoid:
|
|
240
|
+
- Same event described in slightly different words → REINFORCE, don't create
|
|
241
|
+
- Same fact restated in a later conversation → REINFORCE, don't create
|
|
242
|
+
- An update to an existing situation (e.g. "project is now done") → UPDATE the existing node, don't create a parallel one
|
|
243
|
+
|
|
244
|
+
${otherCandidates.length > 0 ? `### Existing memories (candidates for connection/reinforcement)\n${otherCandidates.map((n) => `- [${n.id}] (${n.type}) ${n.content}`).join("\n")}` : reconsolidationNodes.length > 0 ? "All existing memories are shown in the reconsolidation section above." : "No existing memories found — this may be an early conversation."}`;
|
|
245
|
+
|
|
246
|
+
return reconsolidationSection + candidateSection;
|
|
247
|
+
})()}
|
|
248
|
+
`;
|
|
249
|
+
|
|
250
|
+
let prompt = instructions;
|
|
251
|
+
|
|
252
|
+
if (identityContext) {
|
|
253
|
+
const remaining = EXTRACTION_SYSTEM_PROMPT_CHAR_BUDGET - prompt.length - 30;
|
|
254
|
+
if (remaining > 200) {
|
|
255
|
+
const truncated =
|
|
256
|
+
identityContext.length > remaining
|
|
257
|
+
? identityContext.slice(0, remaining) + "…"
|
|
258
|
+
: identityContext;
|
|
259
|
+
prompt += `\n\n# Identity Context\n\n${truncated}`;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return prompt;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
// Tool schema for structured extraction
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
|
|
270
|
+
const EXTRACT_TOOL_SCHEMA = {
|
|
271
|
+
name: "extract_graph_diff",
|
|
272
|
+
description: "Extract memory graph diff from the conversation",
|
|
273
|
+
input_schema: {
|
|
274
|
+
type: "object" as const,
|
|
275
|
+
properties: {
|
|
276
|
+
create_nodes: {
|
|
277
|
+
type: "array",
|
|
278
|
+
description: "New memory nodes to create",
|
|
279
|
+
items: {
|
|
280
|
+
type: "object",
|
|
281
|
+
properties: {
|
|
282
|
+
temp_id: {
|
|
283
|
+
type: "string",
|
|
284
|
+
description:
|
|
285
|
+
"Optional local identifier for this new node. Reference it from edges_to_existing.target_node_id or new_edges.source_node_id/target_node_id to connect two new nodes created in the same diff. Scope is this single call only — pick distinctive values (e.g. 'new-1') that won't collide with existing candidate IDs.",
|
|
286
|
+
},
|
|
287
|
+
content: {
|
|
288
|
+
type: "string",
|
|
289
|
+
description: "First-person prose memory",
|
|
290
|
+
},
|
|
291
|
+
type: {
|
|
292
|
+
type: "string",
|
|
293
|
+
enum: [
|
|
294
|
+
"episodic",
|
|
295
|
+
"semantic",
|
|
296
|
+
"procedural",
|
|
297
|
+
"emotional",
|
|
298
|
+
"prospective",
|
|
299
|
+
"behavioral",
|
|
300
|
+
"narrative",
|
|
301
|
+
"shared",
|
|
302
|
+
],
|
|
303
|
+
},
|
|
304
|
+
emotional_charge: {
|
|
305
|
+
type: "object",
|
|
306
|
+
properties: {
|
|
307
|
+
valence: { type: "number" },
|
|
308
|
+
intensity: { type: "number" },
|
|
309
|
+
decay_curve: {
|
|
310
|
+
type: "string",
|
|
311
|
+
enum: [
|
|
312
|
+
"linear",
|
|
313
|
+
"logarithmic",
|
|
314
|
+
"transformative",
|
|
315
|
+
"permanent",
|
|
316
|
+
],
|
|
317
|
+
},
|
|
318
|
+
decay_rate: { type: "number" },
|
|
319
|
+
},
|
|
320
|
+
required: ["valence", "intensity", "decay_curve", "decay_rate"],
|
|
321
|
+
},
|
|
322
|
+
significance: { type: "number" },
|
|
323
|
+
confidence: { type: "number" },
|
|
324
|
+
source_type: {
|
|
325
|
+
type: "string",
|
|
326
|
+
enum: ["direct", "inferred", "observed", "told-by-other"],
|
|
327
|
+
},
|
|
328
|
+
event_date: {
|
|
329
|
+
type: ["number", "null"],
|
|
330
|
+
description:
|
|
331
|
+
"Epoch ms for a calendar-anchored event. Resolve partial dates from the authoritative conversation timestamp and do not infer a prior year unless stated. Null for non-event memories.",
|
|
332
|
+
},
|
|
333
|
+
triggers: {
|
|
334
|
+
type: "array",
|
|
335
|
+
items: {
|
|
336
|
+
type: "object",
|
|
337
|
+
properties: {
|
|
338
|
+
type: {
|
|
339
|
+
type: "string",
|
|
340
|
+
enum: ["temporal", "semantic", "event"],
|
|
341
|
+
},
|
|
342
|
+
schedule: { type: "string" },
|
|
343
|
+
condition: { type: "string" },
|
|
344
|
+
event_date: { type: "number" },
|
|
345
|
+
ramp_days: { type: "number" },
|
|
346
|
+
follow_up_days: { type: "number" },
|
|
347
|
+
recurring: { type: "boolean" },
|
|
348
|
+
},
|
|
349
|
+
required: ["type"],
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
edges_to_existing: {
|
|
353
|
+
type: "array",
|
|
354
|
+
description:
|
|
355
|
+
"Outbound edges from this new node. target_node_id may be an existing candidate node ID OR the temp_id of another new node in this same extraction.",
|
|
356
|
+
items: {
|
|
357
|
+
type: "object",
|
|
358
|
+
properties: {
|
|
359
|
+
target_node_id: {
|
|
360
|
+
type: "string",
|
|
361
|
+
description:
|
|
362
|
+
"An existing candidate node ID, or the temp_id of another node in create_nodes.",
|
|
363
|
+
},
|
|
364
|
+
relationship: {
|
|
365
|
+
type: "string",
|
|
366
|
+
enum: [
|
|
367
|
+
"caused-by",
|
|
368
|
+
"reminds-of",
|
|
369
|
+
"contradicts",
|
|
370
|
+
"depends-on",
|
|
371
|
+
"part-of",
|
|
372
|
+
"supersedes",
|
|
373
|
+
"resolved-by",
|
|
374
|
+
],
|
|
375
|
+
},
|
|
376
|
+
weight: { type: "number" },
|
|
377
|
+
},
|
|
378
|
+
required: ["target_node_id", "relationship"],
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
image_refs: {
|
|
382
|
+
type: "array",
|
|
383
|
+
description:
|
|
384
|
+
"Images from the conversation to attach to this memory. Reference using message_id and block_index from the <image> tags.",
|
|
385
|
+
items: {
|
|
386
|
+
type: "object",
|
|
387
|
+
properties: {
|
|
388
|
+
message_id: { type: "string" },
|
|
389
|
+
block_index: { type: "number" },
|
|
390
|
+
description: {
|
|
391
|
+
type: "string",
|
|
392
|
+
description:
|
|
393
|
+
"Detailed description of what this image shows, including who is in it if applicable",
|
|
394
|
+
},
|
|
395
|
+
},
|
|
396
|
+
required: ["message_id", "block_index", "description"],
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
},
|
|
400
|
+
required: [
|
|
401
|
+
"content",
|
|
402
|
+
"type",
|
|
403
|
+
"emotional_charge",
|
|
404
|
+
"significance",
|
|
405
|
+
"confidence",
|
|
406
|
+
"source_type",
|
|
407
|
+
],
|
|
408
|
+
},
|
|
409
|
+
},
|
|
410
|
+
update_nodes: {
|
|
411
|
+
type: "array",
|
|
412
|
+
description: "Updates to existing nodes",
|
|
413
|
+
items: {
|
|
414
|
+
type: "object",
|
|
415
|
+
properties: {
|
|
416
|
+
id: { type: "string" },
|
|
417
|
+
content: { type: "string" },
|
|
418
|
+
significance: { type: "number" },
|
|
419
|
+
confidence: { type: "number" },
|
|
420
|
+
fidelity: {
|
|
421
|
+
type: "string",
|
|
422
|
+
enum: ["vivid", "clear", "faded", "gist"],
|
|
423
|
+
description:
|
|
424
|
+
"Downgrade fidelity when a transient event has resolved",
|
|
425
|
+
},
|
|
426
|
+
event_date: {
|
|
427
|
+
type: ["number", "null"],
|
|
428
|
+
description:
|
|
429
|
+
"Epoch ms of the event date. Resolve partial dates from the authoritative conversation timestamp. Use to update when an event is rescheduled. Set to null to clear.",
|
|
430
|
+
},
|
|
431
|
+
},
|
|
432
|
+
required: ["id"],
|
|
433
|
+
},
|
|
434
|
+
},
|
|
435
|
+
reinforce_node_ids: {
|
|
436
|
+
type: "array",
|
|
437
|
+
description:
|
|
438
|
+
"IDs of existing nodes confirmed/validated by this conversation",
|
|
439
|
+
items: { type: "string" },
|
|
440
|
+
},
|
|
441
|
+
new_edges: {
|
|
442
|
+
type: "array",
|
|
443
|
+
description:
|
|
444
|
+
"Edges between any pair of nodes (existing ↔ existing, new ↔ existing, or new ↔ new). Each endpoint may be an existing candidate node ID or the temp_id of a node declared in create_nodes.",
|
|
445
|
+
items: {
|
|
446
|
+
type: "object",
|
|
447
|
+
properties: {
|
|
448
|
+
source_node_id: {
|
|
449
|
+
type: "string",
|
|
450
|
+
description:
|
|
451
|
+
"An existing candidate node ID, or the temp_id of a node in create_nodes.",
|
|
452
|
+
},
|
|
453
|
+
target_node_id: {
|
|
454
|
+
type: "string",
|
|
455
|
+
description:
|
|
456
|
+
"An existing candidate node ID, or the temp_id of a node in create_nodes.",
|
|
457
|
+
},
|
|
458
|
+
relationship: { type: "string" },
|
|
459
|
+
weight: { type: "number" },
|
|
460
|
+
},
|
|
461
|
+
required: ["source_node_id", "target_node_id", "relationship"],
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
},
|
|
465
|
+
required: ["create_nodes", "reinforce_node_ids"],
|
|
466
|
+
},
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
// ---------------------------------------------------------------------------
|
|
470
|
+
// Response parsing
|
|
471
|
+
// ---------------------------------------------------------------------------
|
|
472
|
+
|
|
473
|
+
interface RawCreateNode {
|
|
474
|
+
temp_id?: string;
|
|
475
|
+
content?: string;
|
|
476
|
+
type?: string;
|
|
477
|
+
emotional_charge?: {
|
|
478
|
+
valence?: number;
|
|
479
|
+
intensity?: number;
|
|
480
|
+
decay_curve?: string;
|
|
481
|
+
decay_rate?: number;
|
|
482
|
+
};
|
|
483
|
+
significance?: number;
|
|
484
|
+
confidence?: number;
|
|
485
|
+
source_type?: string;
|
|
486
|
+
event_date?: number;
|
|
487
|
+
triggers?: Array<{
|
|
488
|
+
type?: string;
|
|
489
|
+
schedule?: string;
|
|
490
|
+
condition?: string;
|
|
491
|
+
event_date?: number;
|
|
492
|
+
ramp_days?: number;
|
|
493
|
+
follow_up_days?: number;
|
|
494
|
+
recurring?: boolean;
|
|
495
|
+
}>;
|
|
496
|
+
edges_to_existing?: Array<{
|
|
497
|
+
target_node_id?: string;
|
|
498
|
+
relationship?: string;
|
|
499
|
+
weight?: number;
|
|
500
|
+
}>;
|
|
501
|
+
image_refs?: Array<{
|
|
502
|
+
message_id?: string;
|
|
503
|
+
block_index?: number;
|
|
504
|
+
description?: string;
|
|
505
|
+
}>;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
interface RawUpdateNode {
|
|
509
|
+
id?: string;
|
|
510
|
+
content?: string;
|
|
511
|
+
significance?: number;
|
|
512
|
+
confidence?: number;
|
|
513
|
+
fidelity?: string;
|
|
514
|
+
event_date?: number | null;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
interface RawNewEdge {
|
|
518
|
+
source_node_id?: string;
|
|
519
|
+
target_node_id?: string;
|
|
520
|
+
relationship?: string;
|
|
521
|
+
weight?: number;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
const VALID_TYPES = new Set<string>([
|
|
525
|
+
"episodic",
|
|
526
|
+
"semantic",
|
|
527
|
+
"procedural",
|
|
528
|
+
"emotional",
|
|
529
|
+
"prospective",
|
|
530
|
+
"behavioral",
|
|
531
|
+
"narrative",
|
|
532
|
+
"shared",
|
|
533
|
+
]);
|
|
534
|
+
const VALID_DECAY_CURVES = new Set<string>([
|
|
535
|
+
"linear",
|
|
536
|
+
"logarithmic",
|
|
537
|
+
"transformative",
|
|
538
|
+
"permanent",
|
|
539
|
+
]);
|
|
540
|
+
const VALID_SOURCE_TYPES = new Set<string>([
|
|
541
|
+
"direct",
|
|
542
|
+
"inferred",
|
|
543
|
+
"observed",
|
|
544
|
+
"told-by-other",
|
|
545
|
+
]);
|
|
546
|
+
const VALID_RELATIONSHIPS = new Set<string>([
|
|
547
|
+
"caused-by",
|
|
548
|
+
"reminds-of",
|
|
549
|
+
"contradicts",
|
|
550
|
+
"depends-on",
|
|
551
|
+
"part-of",
|
|
552
|
+
"supersedes",
|
|
553
|
+
"resolved-by",
|
|
554
|
+
]);
|
|
555
|
+
const VALID_TRIGGER_TYPES = new Set<string>(["temporal", "semantic", "event"]);
|
|
556
|
+
|
|
557
|
+
function clamp(v: number, min: number, max: number): number {
|
|
558
|
+
return Math.max(min, Math.min(max, v));
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/** Coerce an LLM-returned event_date to number | null, guarding against string values. */
|
|
562
|
+
export function parseEpochMs(value: unknown): number | null {
|
|
563
|
+
if (value == null || value === "") return null;
|
|
564
|
+
const n = Number(value);
|
|
565
|
+
return Number.isFinite(n) ? n : null;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* An edge endpoint that may reference either a pre-existing candidate node
|
|
570
|
+
* (by its real ID) or a brand-new node being created in the same diff
|
|
571
|
+
* (by its index into `diff.createNodes`, resolved to a real ID after apply).
|
|
572
|
+
*/
|
|
573
|
+
export type DeferredEdgeEndpoint =
|
|
574
|
+
| { kind: "existing"; nodeId: string }
|
|
575
|
+
| { kind: "new"; newNodeIndex: number };
|
|
576
|
+
|
|
577
|
+
export interface DeferredEdge {
|
|
578
|
+
source: DeferredEdgeEndpoint;
|
|
579
|
+
target: DeferredEdgeEndpoint;
|
|
580
|
+
relationship: string;
|
|
581
|
+
weight: number;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
export function parseExtractionResponse(
|
|
585
|
+
input: Record<string, unknown>,
|
|
586
|
+
conversationId: string,
|
|
587
|
+
scopeId: string,
|
|
588
|
+
candidateNodeIds: Set<string>,
|
|
589
|
+
/** Epoch ms — when the conversation happened (not extraction time). */
|
|
590
|
+
conversationTimestamp: number,
|
|
591
|
+
): {
|
|
592
|
+
diff: MemoryDiff;
|
|
593
|
+
/**
|
|
594
|
+
* Edges with at least one endpoint that is a new node (new→existing,
|
|
595
|
+
* existing→new, or new→new). Applied after node creation so new node IDs
|
|
596
|
+
* can be resolved from their indices.
|
|
597
|
+
*/
|
|
598
|
+
deferredEdges: DeferredEdge[];
|
|
599
|
+
/** Triggers for new nodes. Applied after node creation (needs IDs). */
|
|
600
|
+
deferredTriggers: Array<{
|
|
601
|
+
newNodeIndex: number;
|
|
602
|
+
trigger: Omit<NewTrigger, "nodeId">;
|
|
603
|
+
}>;
|
|
604
|
+
} {
|
|
605
|
+
const now = conversationTimestamp;
|
|
606
|
+
const createNodes = (input.create_nodes ?? []) as RawCreateNode[];
|
|
607
|
+
const updateNodes = (input.update_nodes ?? []) as RawUpdateNode[];
|
|
608
|
+
const reinforceNodeIds = (input.reinforce_node_ids ?? []) as string[];
|
|
609
|
+
const newEdges = (input.new_edges ?? []) as RawNewEdge[];
|
|
610
|
+
|
|
611
|
+
const diff: MemoryDiff = {
|
|
612
|
+
createNodes: [],
|
|
613
|
+
updateNodes: [],
|
|
614
|
+
deleteNodeIds: [],
|
|
615
|
+
createEdges: [],
|
|
616
|
+
deleteEdgeIds: [],
|
|
617
|
+
createTriggers: [],
|
|
618
|
+
deleteTriggerIds: [],
|
|
619
|
+
reinforceNodeIds: reinforceNodeIds.filter((id) => candidateNodeIds.has(id)),
|
|
620
|
+
};
|
|
621
|
+
|
|
622
|
+
const deferredEdges: DeferredEdge[] = [];
|
|
623
|
+
const deferredTriggers: Array<{
|
|
624
|
+
newNodeIndex: number;
|
|
625
|
+
trigger: Omit<NewTrigger, "nodeId">;
|
|
626
|
+
}> = [];
|
|
627
|
+
|
|
628
|
+
// Track raw-index → diff-index for nodes that pass validation. Edges
|
|
629
|
+
// reference nodes by temp_id, which resolves via the raw index — but
|
|
630
|
+
// deferredEdges must carry the diff index (aligns with createdNodeIds
|
|
631
|
+
// in applyDiff's return value).
|
|
632
|
+
const rawIndexToDiffIndex = new Map<number, number>();
|
|
633
|
+
|
|
634
|
+
// Parse new nodes
|
|
635
|
+
for (let i = 0; i < createNodes.length; i++) {
|
|
636
|
+
const raw = createNodes[i];
|
|
637
|
+
if (!raw.content || typeof raw.content !== "string") continue;
|
|
638
|
+
if (!raw.type || !VALID_TYPES.has(raw.type)) continue;
|
|
639
|
+
|
|
640
|
+
const charge = raw.emotional_charge ?? {};
|
|
641
|
+
const emotionalCharge: EmotionalCharge = {
|
|
642
|
+
valence: clamp(Number(charge.valence) || 0, -1, 1),
|
|
643
|
+
intensity: clamp(Number(charge.intensity) || 0, 0, 1),
|
|
644
|
+
decayCurve: (VALID_DECAY_CURVES.has(charge.decay_curve ?? "")
|
|
645
|
+
? charge.decay_curve
|
|
646
|
+
: "linear") as DecayCurve,
|
|
647
|
+
decayRate: clamp(Number(charge.decay_rate) || 0.05, 0.001, 1),
|
|
648
|
+
originalIntensity: clamp(Number(charge.intensity) || 0, 0, 1),
|
|
649
|
+
};
|
|
650
|
+
|
|
651
|
+
const node: NewNode = {
|
|
652
|
+
content: raw.content,
|
|
653
|
+
type: raw.type as MemoryType,
|
|
654
|
+
created: now,
|
|
655
|
+
lastAccessed: now,
|
|
656
|
+
lastConsolidated: now,
|
|
657
|
+
eventDate: parseEpochMs(raw.event_date),
|
|
658
|
+
emotionalCharge,
|
|
659
|
+
fidelity: "vivid" as Fidelity,
|
|
660
|
+
confidence: clamp(Number(raw.confidence) || 0.5, 0, 1),
|
|
661
|
+
significance: clamp(Number(raw.significance) || 0.5, 0, 1),
|
|
662
|
+
stability: 14,
|
|
663
|
+
reinforcementCount: 0,
|
|
664
|
+
lastReinforced: now,
|
|
665
|
+
sourceConversations: [conversationId],
|
|
666
|
+
sourceType: (VALID_SOURCE_TYPES.has(raw.source_type ?? "")
|
|
667
|
+
? raw.source_type
|
|
668
|
+
: "inferred") as SourceType,
|
|
669
|
+
narrativeRole: null,
|
|
670
|
+
partOfStory: null,
|
|
671
|
+
imageRefs: null,
|
|
672
|
+
scopeId,
|
|
673
|
+
};
|
|
674
|
+
|
|
675
|
+
// Prospective nodes (tasks, plans, upcoming events) are inherently transient.
|
|
676
|
+
// Lower stability means their significance decays faster, so even without
|
|
677
|
+
// explicit resolution they fade naturally within days rather than weeks.
|
|
678
|
+
if (node.type === "prospective") {
|
|
679
|
+
node.stability = 5;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// Procedural nodes (learned skills, how-to knowledge — "ffmpeg needs -ac 2
|
|
683
|
+
// for stereo") encode facts that stay useful long after the moment they
|
|
684
|
+
// were learned. Higher initial stability slows Ebbinghaus decay so they
|
|
685
|
+
// remain retrievable months later without needing explicit reinforcement.
|
|
686
|
+
if (node.type === "procedural") {
|
|
687
|
+
node.stability = 60;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
diff.createNodes.push(node);
|
|
691
|
+
const nodeIndex = diff.createNodes.length - 1;
|
|
692
|
+
rawIndexToDiffIndex.set(i, nodeIndex);
|
|
693
|
+
|
|
694
|
+
// Edges declared on this new node are processed in a second pass below
|
|
695
|
+
// — they can reference sibling new nodes via temp_id, which may appear
|
|
696
|
+
// later in create_nodes than the edge's declaring node.
|
|
697
|
+
|
|
698
|
+
// Collect triggers
|
|
699
|
+
if (Array.isArray(raw.triggers)) {
|
|
700
|
+
for (const t of raw.triggers) {
|
|
701
|
+
if (!t.type || !VALID_TRIGGER_TYPES.has(t.type)) continue;
|
|
702
|
+
deferredTriggers.push({
|
|
703
|
+
newNodeIndex: nodeIndex,
|
|
704
|
+
trigger: {
|
|
705
|
+
type: t.type as TriggerType,
|
|
706
|
+
schedule: t.schedule ?? null,
|
|
707
|
+
condition: t.condition ?? null,
|
|
708
|
+
conditionEmbedding: null, // Embedded async via job
|
|
709
|
+
threshold: t.type === "semantic" ? 0.7 : null,
|
|
710
|
+
eventDate: parseEpochMs(t.event_date),
|
|
711
|
+
rampDays: t.ramp_days ?? null,
|
|
712
|
+
followUpDays: t.follow_up_days ?? null,
|
|
713
|
+
recurring: t.recurring ?? false,
|
|
714
|
+
consumed: false,
|
|
715
|
+
cooldownMs: t.recurring ? 1000 * 60 * 60 * 12 : null, // 12h default cooldown
|
|
716
|
+
lastFired: null,
|
|
717
|
+
},
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// Auto-create event trigger when event_date is set but LLM didn't include one,
|
|
723
|
+
// or replace a malformed event trigger (event_date unset) with a valid one.
|
|
724
|
+
// Only auto-create for future events — past-dated memories (historical
|
|
725
|
+
// milestones, dated events that already happened) shouldn't generate
|
|
726
|
+
// ramp/follow-up reminders.
|
|
727
|
+
if (
|
|
728
|
+
node.eventDate != null &&
|
|
729
|
+
node.eventDate > now &&
|
|
730
|
+
(!Array.isArray(raw.triggers) ||
|
|
731
|
+
!raw.triggers.some((t) => t.type === "event" && t.event_date != null))
|
|
732
|
+
) {
|
|
733
|
+
// Remove all malformed event triggers (type=event but missing event_date)
|
|
734
|
+
for (let i = deferredTriggers.length - 1; i >= 0; i--) {
|
|
735
|
+
const dt = deferredTriggers[i];
|
|
736
|
+
if (
|
|
737
|
+
dt.newNodeIndex === nodeIndex &&
|
|
738
|
+
dt.trigger.type === "event" &&
|
|
739
|
+
dt.trigger.eventDate == null
|
|
740
|
+
) {
|
|
741
|
+
deferredTriggers.splice(i, 1);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
deferredTriggers.push({
|
|
746
|
+
newNodeIndex: nodeIndex,
|
|
747
|
+
trigger: {
|
|
748
|
+
type: "event" as TriggerType,
|
|
749
|
+
schedule: null,
|
|
750
|
+
condition: null,
|
|
751
|
+
conditionEmbedding: null,
|
|
752
|
+
threshold: null,
|
|
753
|
+
eventDate: node.eventDate,
|
|
754
|
+
rampDays: 7,
|
|
755
|
+
followUpDays: 2,
|
|
756
|
+
recurring: false,
|
|
757
|
+
consumed: false,
|
|
758
|
+
cooldownMs: null,
|
|
759
|
+
lastFired: null,
|
|
760
|
+
},
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
// Parse image refs
|
|
765
|
+
if (Array.isArray(raw.image_refs)) {
|
|
766
|
+
const validRefs: ImageRef[] = [];
|
|
767
|
+
for (const ref of raw.image_refs) {
|
|
768
|
+
if (!ref.message_id || typeof ref.message_id !== "string") continue;
|
|
769
|
+
if (typeof ref.block_index !== "number" || ref.block_index < 0)
|
|
770
|
+
continue;
|
|
771
|
+
if (!ref.description || typeof ref.description !== "string") continue;
|
|
772
|
+
const mimeType = resolveImageRefMimeType(
|
|
773
|
+
ref.message_id,
|
|
774
|
+
ref.block_index,
|
|
775
|
+
conversationId,
|
|
776
|
+
);
|
|
777
|
+
if (!mimeType) continue;
|
|
778
|
+
validRefs.push({
|
|
779
|
+
messageId: ref.message_id,
|
|
780
|
+
blockIndex: ref.block_index,
|
|
781
|
+
description: ref.description,
|
|
782
|
+
mimeType,
|
|
783
|
+
});
|
|
784
|
+
}
|
|
785
|
+
node.imageRefs = validRefs.length > 0 ? validRefs : null;
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// Build temp_id → diff.createNodes-index map from nodes that passed
|
|
790
|
+
// validation. A temp_id that collides with an existing candidate ID is
|
|
791
|
+
// skipped so real IDs win on lookup — the prompt instructs the LLM to
|
|
792
|
+
// choose distinctive values so this should be rare.
|
|
793
|
+
const tempIdToDiffIndex = new Map<string, number>();
|
|
794
|
+
for (let i = 0; i < createNodes.length; i++) {
|
|
795
|
+
const raw = createNodes[i];
|
|
796
|
+
const tempId = raw?.temp_id;
|
|
797
|
+
if (typeof tempId !== "string" || tempId.length === 0) continue;
|
|
798
|
+
if (candidateNodeIds.has(tempId)) continue;
|
|
799
|
+
if (tempIdToDiffIndex.has(tempId)) continue; // first writer wins
|
|
800
|
+
const diffIndex = rawIndexToDiffIndex.get(i);
|
|
801
|
+
if (diffIndex == null) continue; // raw node was rejected during validation
|
|
802
|
+
tempIdToDiffIndex.set(tempId, diffIndex);
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
const resolveEndpoint = (id: string): DeferredEdgeEndpoint | null => {
|
|
806
|
+
if (candidateNodeIds.has(id)) return { kind: "existing", nodeId: id };
|
|
807
|
+
const idx = tempIdToDiffIndex.get(id);
|
|
808
|
+
if (idx != null) return { kind: "new", newNodeIndex: idx };
|
|
809
|
+
return null;
|
|
810
|
+
};
|
|
811
|
+
|
|
812
|
+
const pushResolvedEdge = (
|
|
813
|
+
source: DeferredEdgeEndpoint,
|
|
814
|
+
target: DeferredEdgeEndpoint,
|
|
815
|
+
relationship: string,
|
|
816
|
+
weight: number,
|
|
817
|
+
) => {
|
|
818
|
+
// Both endpoints existing → apply directly via diff.createEdges.
|
|
819
|
+
// Otherwise defer until new node IDs are known post-applyDiff.
|
|
820
|
+
if (source.kind === "existing" && target.kind === "existing") {
|
|
821
|
+
diff.createEdges.push({
|
|
822
|
+
sourceNodeId: source.nodeId,
|
|
823
|
+
targetNodeId: target.nodeId,
|
|
824
|
+
relationship: relationship as NewEdge["relationship"],
|
|
825
|
+
weight,
|
|
826
|
+
created: now,
|
|
827
|
+
});
|
|
828
|
+
} else {
|
|
829
|
+
deferredEdges.push({ source, target, relationship, weight });
|
|
830
|
+
}
|
|
831
|
+
};
|
|
832
|
+
|
|
833
|
+
// Second pass: resolve edges_to_existing on each raw create_nodes entry.
|
|
834
|
+
// The source is always the containing new node; the target may be either
|
|
835
|
+
// an existing candidate or a sibling new node referenced by temp_id.
|
|
836
|
+
for (let i = 0; i < createNodes.length; i++) {
|
|
837
|
+
const raw = createNodes[i];
|
|
838
|
+
const sourceDiffIndex = rawIndexToDiffIndex.get(i);
|
|
839
|
+
if (sourceDiffIndex == null) continue;
|
|
840
|
+
if (!Array.isArray(raw.edges_to_existing)) continue;
|
|
841
|
+
|
|
842
|
+
for (const edge of raw.edges_to_existing) {
|
|
843
|
+
if (!edge.target_node_id) continue;
|
|
844
|
+
if (!edge.relationship || !VALID_RELATIONSHIPS.has(edge.relationship))
|
|
845
|
+
continue;
|
|
846
|
+
const target = resolveEndpoint(edge.target_node_id);
|
|
847
|
+
if (!target) continue;
|
|
848
|
+
const source: DeferredEdgeEndpoint = {
|
|
849
|
+
kind: "new",
|
|
850
|
+
newNodeIndex: sourceDiffIndex,
|
|
851
|
+
};
|
|
852
|
+
// Skip self-loops.
|
|
853
|
+
if (target.kind === "new" && target.newNodeIndex === sourceDiffIndex)
|
|
854
|
+
continue;
|
|
855
|
+
pushResolvedEdge(
|
|
856
|
+
source,
|
|
857
|
+
target,
|
|
858
|
+
edge.relationship,
|
|
859
|
+
clamp(Number(edge.weight) || 1.0, 0, 1),
|
|
860
|
+
);
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
// Parse updates
|
|
865
|
+
for (const raw of updateNodes) {
|
|
866
|
+
if (!raw.id || !candidateNodeIds.has(raw.id)) continue;
|
|
867
|
+
const changes: Record<string, unknown> = {};
|
|
868
|
+
if (raw.content) changes.content = raw.content;
|
|
869
|
+
if (raw.significance != null)
|
|
870
|
+
changes.significance = clamp(raw.significance, 0, 1);
|
|
871
|
+
if (raw.confidence != null)
|
|
872
|
+
changes.confidence = clamp(raw.confidence, 0, 1);
|
|
873
|
+
if (
|
|
874
|
+
raw.fidelity &&
|
|
875
|
+
["vivid", "clear", "faded", "gist"].includes(raw.fidelity)
|
|
876
|
+
)
|
|
877
|
+
changes.fidelity = raw.fidelity;
|
|
878
|
+
if (raw.event_date !== undefined)
|
|
879
|
+
changes.eventDate = parseEpochMs(raw.event_date);
|
|
880
|
+
if (Object.keys(changes).length > 0) {
|
|
881
|
+
diff.updateNodes.push({ id: raw.id, changes });
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
// Parse top-level edges — each endpoint may be an existing candidate ID or
|
|
886
|
+
// the temp_id of a new node declared in create_nodes.
|
|
887
|
+
for (const raw of newEdges) {
|
|
888
|
+
if (!raw.source_node_id || !raw.target_node_id) continue;
|
|
889
|
+
if (!raw.relationship || !VALID_RELATIONSHIPS.has(raw.relationship))
|
|
890
|
+
continue;
|
|
891
|
+
const source = resolveEndpoint(raw.source_node_id);
|
|
892
|
+
const target = resolveEndpoint(raw.target_node_id);
|
|
893
|
+
if (!source || !target) continue;
|
|
894
|
+
// Skip self-loops.
|
|
895
|
+
if (
|
|
896
|
+
source.kind === "new" &&
|
|
897
|
+
target.kind === "new" &&
|
|
898
|
+
source.newNodeIndex === target.newNodeIndex
|
|
899
|
+
)
|
|
900
|
+
continue;
|
|
901
|
+
if (
|
|
902
|
+
source.kind === "existing" &&
|
|
903
|
+
target.kind === "existing" &&
|
|
904
|
+
source.nodeId === target.nodeId
|
|
905
|
+
)
|
|
906
|
+
continue;
|
|
907
|
+
pushResolvedEdge(
|
|
908
|
+
source,
|
|
909
|
+
target,
|
|
910
|
+
raw.relationship,
|
|
911
|
+
clamp(Number(raw.weight) || 1.0, 0, 1),
|
|
912
|
+
);
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
return { diff, deferredEdges, deferredTriggers };
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
// ---------------------------------------------------------------------------
|
|
919
|
+
// Main extraction pipeline
|
|
920
|
+
// ---------------------------------------------------------------------------
|
|
921
|
+
|
|
922
|
+
export interface ExtractionResult {
|
|
923
|
+
nodesCreated: number;
|
|
924
|
+
nodesUpdated: number;
|
|
925
|
+
nodesReinforced: number;
|
|
926
|
+
edgesCreated: number;
|
|
927
|
+
triggersCreated: number;
|
|
928
|
+
/** Epoch ms of the newest message included in extraction. Used for checkpointing. */
|
|
929
|
+
lastProcessedTimestamp?: number;
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
/**
|
|
933
|
+
* Run the full graph extraction pipeline for a completed conversation.
|
|
934
|
+
*
|
|
935
|
+
* 1. Load transcript from disk
|
|
936
|
+
* 2. Find candidate existing nodes via embedding search
|
|
937
|
+
* 3. LLM call → structured diff
|
|
938
|
+
* 4. Apply diff to graph store
|
|
939
|
+
* 5. Enqueue embedding jobs for new nodes and triggers
|
|
940
|
+
*/
|
|
941
|
+
export async function runGraphExtraction(
|
|
942
|
+
conversationId: string,
|
|
943
|
+
scopeId: string,
|
|
944
|
+
config: AssistantConfig,
|
|
945
|
+
opts?: {
|
|
946
|
+
/** Pre-loaded transcript text (skips disk read). Used by bootstrap. */
|
|
947
|
+
transcript?: string;
|
|
948
|
+
/** Additional node IDs that were in active context. */
|
|
949
|
+
activeContextNodeIds?: string[];
|
|
950
|
+
/**
|
|
951
|
+
* When set, only extract from messages after this checkpoint.
|
|
952
|
+
* Used for mid-conversation incremental extraction (batch mode).
|
|
953
|
+
* The checkpoint is the message timestamp of the last extracted message.
|
|
954
|
+
*/
|
|
955
|
+
afterTimestamp?: number;
|
|
956
|
+
/** Override the conversation timestamp (epoch ms). Used by bootstrap. */
|
|
957
|
+
conversationTimestamp?: number;
|
|
958
|
+
/** Skip Qdrant search for candidates (use DB query instead). Used by bootstrap
|
|
959
|
+
* when embedding jobs haven't been processed yet. */
|
|
960
|
+
skipQdrant?: boolean;
|
|
961
|
+
/** Embed nodes synchronously instead of enqueuing jobs. Used by bootstrap
|
|
962
|
+
* so nodes are searchable immediately without the jobs worker running. */
|
|
963
|
+
embedInline?: boolean;
|
|
964
|
+
},
|
|
965
|
+
): Promise<ExtractionResult> {
|
|
966
|
+
const emptyResult: ExtractionResult = {
|
|
967
|
+
nodesCreated: 0,
|
|
968
|
+
nodesUpdated: 0,
|
|
969
|
+
nodesReinforced: 0,
|
|
970
|
+
edgesCreated: 0,
|
|
971
|
+
triggersCreated: 0,
|
|
972
|
+
};
|
|
973
|
+
|
|
974
|
+
// 1. Load transcript — try multimodal first, fall back to text-only
|
|
975
|
+
const imageResult = loadTranscriptWithImages(
|
|
976
|
+
conversationId,
|
|
977
|
+
opts?.afterTimestamp,
|
|
978
|
+
);
|
|
979
|
+
|
|
980
|
+
let transcript = opts?.transcript;
|
|
981
|
+
if (!transcript) {
|
|
982
|
+
transcript =
|
|
983
|
+
loadTranscriptFromDisk(conversationId, opts?.afterTimestamp) ?? undefined;
|
|
984
|
+
if (!transcript) {
|
|
985
|
+
// If we have a multimodal result but no disk transcript, extract text
|
|
986
|
+
// from the multimodal message content blocks for candidate search.
|
|
987
|
+
if (imageResult) {
|
|
988
|
+
transcript = imageResult.message.content
|
|
989
|
+
.filter((b): b is { type: "text"; text: string } => b.type === "text")
|
|
990
|
+
.map((b) => b.text)
|
|
991
|
+
.join("\n");
|
|
992
|
+
}
|
|
993
|
+
if (!transcript) {
|
|
994
|
+
log.warn(
|
|
995
|
+
{ conversationId },
|
|
996
|
+
"No transcript found on disk, skipping extraction",
|
|
997
|
+
);
|
|
998
|
+
return emptyResult;
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
// Skip very short conversations (< 100 chars)
|
|
1004
|
+
if (transcript.trim().length < 100) {
|
|
1005
|
+
return emptyResult;
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
// 2. Get provider
|
|
1009
|
+
const provider = await getConfiguredProvider("memoryExtraction");
|
|
1010
|
+
if (!provider) {
|
|
1011
|
+
throw new BackendUnavailableError(
|
|
1012
|
+
"Provider unavailable for graph extraction",
|
|
1013
|
+
);
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
// 3. Find candidate existing nodes
|
|
1017
|
+
const candidateNodes = await findCandidateNodes(
|
|
1018
|
+
transcript,
|
|
1019
|
+
scopeId,
|
|
1020
|
+
config,
|
|
1021
|
+
opts?.activeContextNodeIds,
|
|
1022
|
+
opts?.skipQdrant,
|
|
1023
|
+
);
|
|
1024
|
+
const candidateNodeIds = new Set(candidateNodes.map((n) => n.id));
|
|
1025
|
+
|
|
1026
|
+
// 4. Build prompt
|
|
1027
|
+
const identityContext = buildCoreIdentityContext();
|
|
1028
|
+
|
|
1029
|
+
const activeSet = opts?.activeContextNodeIds
|
|
1030
|
+
? new Set(opts.activeContextNodeIds)
|
|
1031
|
+
: undefined;
|
|
1032
|
+
|
|
1033
|
+
const systemPrompt = buildGraphExtractionSystemPrompt(
|
|
1034
|
+
candidateNodes.map((n) => ({ id: n.id, type: n.type, content: n.content })),
|
|
1035
|
+
identityContext,
|
|
1036
|
+
activeSet,
|
|
1037
|
+
);
|
|
1038
|
+
|
|
1039
|
+
// 5. Resolve conversation timestamp before the LLM call so we can include
|
|
1040
|
+
// the date in the prompt — without it the model can't resolve "today"
|
|
1041
|
+
// or correctly date events mentioned in the conversation.
|
|
1042
|
+
const conversationTimestamp =
|
|
1043
|
+
opts?.conversationTimestamp ??
|
|
1044
|
+
resolveConversationTimestamp(conversationId) ??
|
|
1045
|
+
imageResult?.lastTimestamp ??
|
|
1046
|
+
Date.now();
|
|
1047
|
+
|
|
1048
|
+
const conversationTimestampBlock =
|
|
1049
|
+
buildAuthoritativeConversationTimestampBlock(conversationTimestamp);
|
|
1050
|
+
|
|
1051
|
+
// 6. LLM call — use multimodal message when images are present
|
|
1052
|
+
const useMultimodal = imageResult?.hasImages === true;
|
|
1053
|
+
|
|
1054
|
+
const extractionMessages: Message[] = useMultimodal
|
|
1055
|
+
? [
|
|
1056
|
+
{
|
|
1057
|
+
role: "user",
|
|
1058
|
+
content: [
|
|
1059
|
+
{
|
|
1060
|
+
type: "text" as const,
|
|
1061
|
+
text: `${conversationTimestampBlock}\n\n## Conversation Transcript\n\n`,
|
|
1062
|
+
},
|
|
1063
|
+
...imageResult.message.content,
|
|
1064
|
+
],
|
|
1065
|
+
},
|
|
1066
|
+
]
|
|
1067
|
+
: [
|
|
1068
|
+
userMessage(
|
|
1069
|
+
`${conversationTimestampBlock}\n\n## Conversation Transcript\n\n${transcript}`,
|
|
1070
|
+
),
|
|
1071
|
+
];
|
|
1072
|
+
|
|
1073
|
+
const response = await provider.sendMessage(extractionMessages, {
|
|
1074
|
+
tools: [EXTRACT_TOOL_SCHEMA],
|
|
1075
|
+
systemPrompt,
|
|
1076
|
+
config: {
|
|
1077
|
+
callSite: "memoryExtraction" as const,
|
|
1078
|
+
tool_choice: { type: "tool" as const, name: "extract_graph_diff" },
|
|
1079
|
+
},
|
|
1080
|
+
});
|
|
1081
|
+
|
|
1082
|
+
const toolBlock = extractToolUse(response);
|
|
1083
|
+
if (!toolBlock) {
|
|
1084
|
+
log.warn({ conversationId }, "No tool_use block in extraction response");
|
|
1085
|
+
return emptyResult;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
const { diff, deferredEdges, deferredTriggers } = parseExtractionResponse(
|
|
1089
|
+
toolBlock.input as Record<string, unknown>,
|
|
1090
|
+
conversationId,
|
|
1091
|
+
scopeId,
|
|
1092
|
+
candidateNodeIds,
|
|
1093
|
+
conversationTimestamp,
|
|
1094
|
+
);
|
|
1095
|
+
|
|
1096
|
+
// 7. Handle supersession (inherit durability before applying diff)
|
|
1097
|
+
// TODO: full supersession is not yet implemented. When it lands, iterate
|
|
1098
|
+
// BOTH `diff.createEdges` (existing → existing) AND `deferredEdges`
|
|
1099
|
+
// (new → existing, the typical supersession case).
|
|
1100
|
+
// Tracked by https://github.com/vellum-ai/vellum-assistant/pull/27057 (Devin).
|
|
1101
|
+
for (const edge of diff.createEdges) {
|
|
1102
|
+
if (edge.relationship === "supersedes") {
|
|
1103
|
+
// Placeholder — see TODO above.
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
for (const de of deferredEdges) {
|
|
1107
|
+
if (de.relationship === "supersedes") {
|
|
1108
|
+
// Placeholder — see TODO above.
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
// 8. Apply the diff
|
|
1113
|
+
const result = applyDiff(diff, { conversationId });
|
|
1114
|
+
|
|
1115
|
+
// 9. Apply deferred edges and triggers using the created node IDs
|
|
1116
|
+
const createdNodeIds = result.createdNodeIds;
|
|
1117
|
+
let edgesCreated = result.edgesCreated;
|
|
1118
|
+
let triggersCreated = result.triggersCreated;
|
|
1119
|
+
|
|
1120
|
+
const resolveCreatedEndpoint = (ep: DeferredEdgeEndpoint): string | null => {
|
|
1121
|
+
if (ep.kind === "existing") return ep.nodeId;
|
|
1122
|
+
return createdNodeIds[ep.newNodeIndex] ?? null;
|
|
1123
|
+
};
|
|
1124
|
+
|
|
1125
|
+
for (const de of deferredEdges) {
|
|
1126
|
+
const sourceNodeId = resolveCreatedEndpoint(de.source);
|
|
1127
|
+
const targetNodeId = resolveCreatedEndpoint(de.target);
|
|
1128
|
+
if (!sourceNodeId || !targetNodeId) continue;
|
|
1129
|
+
|
|
1130
|
+
createEdge({
|
|
1131
|
+
sourceNodeId,
|
|
1132
|
+
targetNodeId,
|
|
1133
|
+
relationship: de.relationship as NewEdge["relationship"],
|
|
1134
|
+
weight: de.weight,
|
|
1135
|
+
created: conversationTimestamp,
|
|
1136
|
+
});
|
|
1137
|
+
edgesCreated++;
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
const { createTrigger } = await import("./store.js");
|
|
1141
|
+
|
|
1142
|
+
for (const dt of deferredTriggers) {
|
|
1143
|
+
const newNodeId = createdNodeIds[dt.newNodeIndex];
|
|
1144
|
+
if (!newNodeId) continue;
|
|
1145
|
+
|
|
1146
|
+
const trigger = createTrigger({
|
|
1147
|
+
...dt.trigger,
|
|
1148
|
+
nodeId: newNodeId,
|
|
1149
|
+
});
|
|
1150
|
+
triggersCreated++;
|
|
1151
|
+
|
|
1152
|
+
if (trigger.type === "semantic" && trigger.condition) {
|
|
1153
|
+
enqueueGraphTriggerEmbed(trigger.id);
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
// 10. Embed new nodes — inline for bootstrap, async for live conversations
|
|
1158
|
+
const createdNodes = getNodesByIds(createdNodeIds);
|
|
1159
|
+
if (opts?.embedInline) {
|
|
1160
|
+
const { embedGraphNodeDirect } = await import("./graph-search.js");
|
|
1161
|
+
for (const node of createdNodes) {
|
|
1162
|
+
try {
|
|
1163
|
+
await embedGraphNodeDirect(node, config);
|
|
1164
|
+
} catch (err) {
|
|
1165
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1166
|
+
log.warn(
|
|
1167
|
+
{ nodeId: node.id, err: msg },
|
|
1168
|
+
"Inline embed failed (non-fatal)",
|
|
1169
|
+
);
|
|
1170
|
+
console.error(` [embed] Failed for ${node.id}: ${msg}`);
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
} else {
|
|
1174
|
+
for (const node of createdNodes) {
|
|
1175
|
+
enqueueGraphNodeEmbed(node.id);
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
log.info(
|
|
1180
|
+
{
|
|
1181
|
+
conversationId,
|
|
1182
|
+
nodesCreated: result.nodesCreated,
|
|
1183
|
+
nodesUpdated: result.nodesUpdated,
|
|
1184
|
+
nodesReinforced: result.nodesReinforced,
|
|
1185
|
+
edgesCreated,
|
|
1186
|
+
triggersCreated,
|
|
1187
|
+
},
|
|
1188
|
+
"Graph extraction complete",
|
|
1189
|
+
);
|
|
1190
|
+
|
|
1191
|
+
return {
|
|
1192
|
+
nodesCreated: result.nodesCreated,
|
|
1193
|
+
nodesUpdated: result.nodesUpdated,
|
|
1194
|
+
nodesReinforced: result.nodesReinforced,
|
|
1195
|
+
edgesCreated,
|
|
1196
|
+
triggersCreated,
|
|
1197
|
+
lastProcessedTimestamp: conversationTimestamp,
|
|
1198
|
+
};
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
// ---------------------------------------------------------------------------
|
|
1202
|
+
// Helpers
|
|
1203
|
+
// ---------------------------------------------------------------------------
|
|
1204
|
+
|
|
1205
|
+
function resolveConversationTimestamp(conversationId: string): number | null {
|
|
1206
|
+
const db = getDb();
|
|
1207
|
+
// Use the last message timestamp, not the conversation creation time.
|
|
1208
|
+
// A conversation can span hours/days — memories should be timestamped
|
|
1209
|
+
// to when the relevant content was actually discussed.
|
|
1210
|
+
const lastMsg = db
|
|
1211
|
+
.select({ createdAt: messages.createdAt })
|
|
1212
|
+
.from(messages)
|
|
1213
|
+
.where(eq(messages.conversationId, conversationId))
|
|
1214
|
+
.orderBy(desc(messages.createdAt))
|
|
1215
|
+
.limit(1)
|
|
1216
|
+
.get();
|
|
1217
|
+
if (lastMsg) return lastMsg.createdAt;
|
|
1218
|
+
|
|
1219
|
+
// Fallback to conversation creation time if no messages in DB
|
|
1220
|
+
const conv = db
|
|
1221
|
+
.select({ createdAt: conversations.createdAt })
|
|
1222
|
+
.from(conversations)
|
|
1223
|
+
.where(eq(conversations.id, conversationId))
|
|
1224
|
+
.get();
|
|
1225
|
+
return conv?.createdAt ?? null;
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
function resolveImageRefMimeType(
|
|
1229
|
+
messageId: string,
|
|
1230
|
+
blockIndex: number,
|
|
1231
|
+
conversationId: string,
|
|
1232
|
+
): string | null {
|
|
1233
|
+
const db = getDb();
|
|
1234
|
+
const msg = db
|
|
1235
|
+
.select({ content: messages.content })
|
|
1236
|
+
.from(messages)
|
|
1237
|
+
.where(
|
|
1238
|
+
and(
|
|
1239
|
+
eq(messages.id, messageId),
|
|
1240
|
+
eq(messages.conversationId, conversationId),
|
|
1241
|
+
),
|
|
1242
|
+
)
|
|
1243
|
+
.get();
|
|
1244
|
+
if (!msg) return null;
|
|
1245
|
+
|
|
1246
|
+
try {
|
|
1247
|
+
const blocks = JSON.parse(msg.content) as Array<{
|
|
1248
|
+
type?: string;
|
|
1249
|
+
source?: { media_type?: string };
|
|
1250
|
+
}>;
|
|
1251
|
+
const block = blocks[blockIndex];
|
|
1252
|
+
if (!block || block.type !== "image") return null;
|
|
1253
|
+
return block.source?.media_type ?? null;
|
|
1254
|
+
} catch {
|
|
1255
|
+
return null;
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
function loadTranscriptFromDisk(
|
|
1260
|
+
conversationId: string,
|
|
1261
|
+
afterTimestamp?: number,
|
|
1262
|
+
): string | null {
|
|
1263
|
+
const db = getDb();
|
|
1264
|
+
const conv = db
|
|
1265
|
+
.select({ createdAt: conversations.createdAt })
|
|
1266
|
+
.from(conversations)
|
|
1267
|
+
.where(eq(conversations.id, conversationId))
|
|
1268
|
+
.get();
|
|
1269
|
+
|
|
1270
|
+
if (!conv) return null;
|
|
1271
|
+
|
|
1272
|
+
try {
|
|
1273
|
+
const dirPath = getConversationDirPath(conversationId, conv.createdAt);
|
|
1274
|
+
const messagesPath = join(dirPath, "messages.jsonl");
|
|
1275
|
+
const content = readFileSync(messagesPath, "utf-8");
|
|
1276
|
+
|
|
1277
|
+
const lines = content
|
|
1278
|
+
.trim()
|
|
1279
|
+
.split("\n")
|
|
1280
|
+
.filter((line) => line.length > 0);
|
|
1281
|
+
|
|
1282
|
+
const parts: string[] = [];
|
|
1283
|
+
for (const line of lines) {
|
|
1284
|
+
try {
|
|
1285
|
+
const msg = JSON.parse(line) as {
|
|
1286
|
+
role?: string;
|
|
1287
|
+
content?: string;
|
|
1288
|
+
ts?: string;
|
|
1289
|
+
};
|
|
1290
|
+
if (!msg.role || !msg.content) continue;
|
|
1291
|
+
|
|
1292
|
+
// Filter by timestamp for incremental extraction
|
|
1293
|
+
if (afterTimestamp && msg.ts) {
|
|
1294
|
+
const msgTime = new Date(msg.ts).getTime();
|
|
1295
|
+
if (msgTime <= afterTimestamp) continue;
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1298
|
+
parts.push(`[${msg.role}]: ${msg.content}`);
|
|
1299
|
+
} catch {
|
|
1300
|
+
// Skip malformed lines
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
return parts.length > 0 ? parts.join("\n\n") : null;
|
|
1305
|
+
} catch {
|
|
1306
|
+
return null;
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
/**
|
|
1311
|
+
* Load a conversation transcript from the DB with interleaved text and image
|
|
1312
|
+
* content blocks. Returns a single consolidated `Message` with role "user"
|
|
1313
|
+
* containing text annotations and `ImageContent` blocks so the extraction LLM
|
|
1314
|
+
* can see images alongside their textual context.
|
|
1315
|
+
*
|
|
1316
|
+
* Images are capped at 10 per transcript to control extraction cost.
|
|
1317
|
+
*/
|
|
1318
|
+
function loadTranscriptWithImages(
|
|
1319
|
+
conversationId: string,
|
|
1320
|
+
afterTimestamp?: number,
|
|
1321
|
+
): {
|
|
1322
|
+
message: Message;
|
|
1323
|
+
hasImages: boolean;
|
|
1324
|
+
lastTimestamp: number | null;
|
|
1325
|
+
} | null {
|
|
1326
|
+
const db = getDb();
|
|
1327
|
+
|
|
1328
|
+
// Build query conditions
|
|
1329
|
+
const conditions = [eq(messages.conversationId, conversationId)];
|
|
1330
|
+
if (afterTimestamp !== undefined) {
|
|
1331
|
+
conditions.push(gt(messages.createdAt, afterTimestamp));
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
const rows = db
|
|
1335
|
+
.select({
|
|
1336
|
+
id: messages.id,
|
|
1337
|
+
role: messages.role,
|
|
1338
|
+
content: messages.content,
|
|
1339
|
+
createdAt: messages.createdAt,
|
|
1340
|
+
})
|
|
1341
|
+
.from(messages)
|
|
1342
|
+
.where(and(...conditions))
|
|
1343
|
+
.orderBy(asc(messages.createdAt))
|
|
1344
|
+
.all();
|
|
1345
|
+
|
|
1346
|
+
if (rows.length === 0) return null;
|
|
1347
|
+
|
|
1348
|
+
const MAX_IMAGES = 10;
|
|
1349
|
+
let imageCount = 0;
|
|
1350
|
+
let hasImagesFlag = false;
|
|
1351
|
+
let totalTextLength = 0;
|
|
1352
|
+
let lastTimestamp: number | null = null;
|
|
1353
|
+
|
|
1354
|
+
const contentBlocks: ContentBlock[] = [];
|
|
1355
|
+
|
|
1356
|
+
for (const row of rows) {
|
|
1357
|
+
lastTimestamp = row.createdAt;
|
|
1358
|
+
|
|
1359
|
+
let parsed: ContentBlock[];
|
|
1360
|
+
try {
|
|
1361
|
+
const raw = JSON.parse(row.content) as unknown;
|
|
1362
|
+
if (typeof raw === "string") {
|
|
1363
|
+
parsed = [{ type: "text", text: raw }];
|
|
1364
|
+
} else if (Array.isArray(raw)) {
|
|
1365
|
+
parsed = raw as ContentBlock[];
|
|
1366
|
+
} else {
|
|
1367
|
+
continue;
|
|
1368
|
+
}
|
|
1369
|
+
} catch {
|
|
1370
|
+
// If content is a plain string (not JSON), wrap it
|
|
1371
|
+
parsed = [{ type: "text", text: row.content }];
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
// Build content blocks preserving original text/image interleaving
|
|
1375
|
+
let prefixAdded = false;
|
|
1376
|
+
for (let i = 0; i < parsed.length; i++) {
|
|
1377
|
+
const block = parsed[i];
|
|
1378
|
+
if (block?.type === "text") {
|
|
1379
|
+
const rawText = typeof block.text === "string" ? block.text : "";
|
|
1380
|
+
const text = prefixAdded ? rawText : `[${row.role}]: ${rawText}`;
|
|
1381
|
+
prefixAdded = true;
|
|
1382
|
+
totalTextLength += text.length;
|
|
1383
|
+
contentBlocks.push({ type: "text", text });
|
|
1384
|
+
} else if (block?.type === "image") {
|
|
1385
|
+
if (imageCount < MAX_IMAGES) {
|
|
1386
|
+
const imgBlock = block as ImageContent;
|
|
1387
|
+
// Add annotation so the extraction LLM knows the image's reference coordinates
|
|
1388
|
+
contentBlocks.push({
|
|
1389
|
+
type: "text",
|
|
1390
|
+
text: `<image message_id="${row.id}" block_index="${i}" type="${imgBlock.source.media_type}" />`,
|
|
1391
|
+
});
|
|
1392
|
+
contentBlocks.push(imgBlock);
|
|
1393
|
+
imageCount++;
|
|
1394
|
+
hasImagesFlag = true;
|
|
1395
|
+
}
|
|
1396
|
+
// After cap, skip image blocks but continue processing text
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
// Skip if transcript is too short (images count toward the threshold)
|
|
1402
|
+
if (totalTextLength < 100 && !hasImagesFlag) return null;
|
|
1403
|
+
|
|
1404
|
+
const message: Message = {
|
|
1405
|
+
role: "user",
|
|
1406
|
+
content: contentBlocks,
|
|
1407
|
+
};
|
|
1408
|
+
|
|
1409
|
+
return { message, hasImages: hasImagesFlag, lastTimestamp };
|
|
1410
|
+
}
|
|
1411
|
+
|
|
1412
|
+
async function findCandidateNodes(
|
|
1413
|
+
transcript: string,
|
|
1414
|
+
scopeId: string,
|
|
1415
|
+
config: AssistantConfig,
|
|
1416
|
+
activeContextNodeIds?: string[],
|
|
1417
|
+
skipQdrant?: boolean,
|
|
1418
|
+
) {
|
|
1419
|
+
const allNodeIds = new Set<string>();
|
|
1420
|
+
|
|
1421
|
+
if (skipQdrant) {
|
|
1422
|
+
// Bootstrap mode: load candidates directly from DB (embeddings may not be ready).
|
|
1423
|
+
// Get the most recent and most significant non-gone nodes.
|
|
1424
|
+
const dbCandidates = queryNodes({
|
|
1425
|
+
scopeId,
|
|
1426
|
+
fidelityNot: ["gone"],
|
|
1427
|
+
limit: 100,
|
|
1428
|
+
});
|
|
1429
|
+
for (const node of dbCandidates) allNodeIds.add(node.id);
|
|
1430
|
+
} else {
|
|
1431
|
+
// Live mode: semantic search via Qdrant
|
|
1432
|
+
const { embedWithRetry } =
|
|
1433
|
+
await import("../../../../persistence/embeddings/embed.js");
|
|
1434
|
+
const searchText =
|
|
1435
|
+
transcript.length > 3000
|
|
1436
|
+
? transcript.slice(0, 1500) + "\n...\n" + transcript.slice(-1500)
|
|
1437
|
+
: transcript;
|
|
1438
|
+
|
|
1439
|
+
try {
|
|
1440
|
+
const embedding = await embedWithRetry(config, [searchText]);
|
|
1441
|
+
const queryVector = embedding.vectors[0];
|
|
1442
|
+
if (queryVector) {
|
|
1443
|
+
const searchResults = await searchGraphNodes(queryVector, 100);
|
|
1444
|
+
for (const r of searchResults) allNodeIds.add(r.nodeId);
|
|
1445
|
+
}
|
|
1446
|
+
} catch (err) {
|
|
1447
|
+
log.warn(
|
|
1448
|
+
{ err },
|
|
1449
|
+
"Failed to embed transcript for candidate search, continuing without candidates",
|
|
1450
|
+
);
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
// Combine with active context nodes
|
|
1455
|
+
if (activeContextNodeIds) {
|
|
1456
|
+
for (const id of activeContextNodeIds) allNodeIds.add(id);
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
if (allNodeIds.size === 0) return [];
|
|
1460
|
+
|
|
1461
|
+
return getNodesByIds([...allNodeIds]);
|
|
1462
|
+
}
|