@vellumai/assistant 0.10.7 → 0.10.8-dev.202607102228.5945895
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/AGENTS.md +3 -1
- package/ARCHITECTURE.md +9 -9
- package/README.md +1 -1
- package/docs/architecture/memory.md +1 -3
- package/docs/credential-execution-service.md +9 -96
- package/docs/runbook-trusted-contacts.md +132 -93
- package/docs/trusted-contact-access.md +125 -115
- package/docs/workspace-tools.md +4 -2
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +62 -360
- package/eslint-rules/cli-no-daemon-internals.js +91 -269
- package/eslint.config.mjs +4 -4
- package/knip.json +2 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -2
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/attachment-naming.test.ts +104 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +0 -2
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/attachment-naming.ts +118 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +3 -5
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +2 -4
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/rpc.ts +4 -447
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/attachment-naming.test.ts +104 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +0 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/attachment-naming.ts +118 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +3 -5
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +2 -4
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/rpc.ts +4 -447
- package/node_modules/@vellumai/gateway-client/src/__tests__/invite-contract.test.ts +0 -18
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +40 -6
- package/node_modules/@vellumai/gateway-client/src/channel-permission-contract.ts +13 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +24 -2
- package/node_modules/@vellumai/gateway-client/src/invite-contract.ts +146 -16
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +22 -4
- package/node_modules/@vellumai/service-contracts/package.json +1 -2
- package/node_modules/@vellumai/service-contracts/src/__tests__/attachment-naming.test.ts +104 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +0 -2
- package/node_modules/@vellumai/service-contracts/src/attachment-naming.ts +118 -0
- package/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +3 -5
- package/node_modules/@vellumai/service-contracts/src/index.ts +2 -4
- package/node_modules/@vellumai/service-contracts/src/rpc.ts +4 -447
- package/openapi.yaml +1648 -676
- package/package.json +4 -5
- package/scripts/build-test-fixtures.ts +105 -0
- package/scripts/memory-inspect.ts +2 -8
- package/scripts/test.ts +597 -0
- package/src/__tests__/access-request-card-view.test.ts +38 -0
- package/src/__tests__/activation-early-marking.test.ts +1 -8
- package/src/__tests__/actor-token-service.test.ts +1 -22
- package/src/__tests__/add-message-preassigned-id.test.ts +1 -1
- package/src/__tests__/agent-image-optimize.test.ts +104 -1
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +0 -5
- package/src/__tests__/agent-loop-compaction-events.test.ts +1 -1
- package/src/__tests__/agent-loop-compaction-strip.test.ts +1 -1
- package/src/__tests__/agent-loop-exit-reason.test.ts +1 -1
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +0 -6
- package/src/__tests__/agent-loop-override-profile.test.ts +66 -5
- package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +1 -9
- package/src/__tests__/agent-loop-regrowth-guard.test.ts +1 -1
- package/src/__tests__/agent-loop-set-system-prompt.test.ts +1 -7
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +21 -1
- package/src/__tests__/annotate-activity-metadata.test.ts +4 -10
- package/src/__tests__/annotate-risk-options.test.ts +4 -10
- package/src/__tests__/anthropic-error-formatting.test.ts +193 -2
- package/src/__tests__/anthropic-gateway-shared.test.ts +140 -0
- package/src/__tests__/anthropic-provider.test.ts +58 -0
- package/src/__tests__/app-bundler.test.ts +0 -8
- package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -8
- package/src/__tests__/app-routes-csp.test.ts +0 -8
- package/src/__tests__/approval-cascade.test.ts +0 -21
- package/src/__tests__/approval-interception-trust-gates.test.ts +0 -7
- package/src/__tests__/approval-primitive.test.ts +1 -9
- package/src/__tests__/approval-routes-http.test.ts +1 -16
- package/src/__tests__/assistant-attachment-directive.test.ts +1 -0
- package/src/__tests__/assistant-attachments.test.ts +211 -0
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +0 -7
- package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -7
- package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
- package/src/__tests__/attachment-stored-path-annotation.test.ts +0 -7
- package/src/__tests__/attachment-upload-trusted-source.test.ts +0 -7
- package/src/__tests__/attachments-store-heic-normalize.test.ts +0 -7
- package/src/__tests__/attachments-store.test.ts +43 -8
- package/src/__tests__/attachments.test.ts +77 -0
- package/src/__tests__/audit-log-rotation.test.ts +1 -9
- package/src/__tests__/auth-fallback-events-store.test.ts +0 -7
- package/src/__tests__/available-skills.test.ts +266 -0
- package/src/__tests__/avatar-generator.test.ts +0 -9
- package/src/__tests__/background-shell-host-bash.test.ts +0 -7
- package/src/__tests__/background-workers-disk-pressure.test.ts +4 -3
- package/src/__tests__/browser-fill-credential.test.ts +0 -7
- package/src/__tests__/browser-manager.test.ts +1 -8
- package/src/__tests__/btw-routes.test.ts +0 -7
- package/src/__tests__/build-persisted-content.test.ts +0 -8
- package/src/__tests__/call-constants.test.ts +1 -1
- package/src/__tests__/call-controller.test.ts +783 -34
- package/src/__tests__/call-conversation-messages.test.ts +2 -9
- package/src/__tests__/call-domain.test.ts +7 -24
- package/src/__tests__/call-pointer-message-composer.test.ts +0 -8
- package/src/__tests__/call-pointer-messages.test.ts +1 -8
- package/src/__tests__/call-recovery.test.ts +1 -8
- package/src/__tests__/call-routes-http.test.ts +0 -7
- package/src/__tests__/call-setup-flow-invite.test.ts +1 -1
- package/src/__tests__/call-setup-flow-midcall-trust.test.ts +76 -97
- package/src/__tests__/call-setup-flow-name-capture.test.ts +1 -1
- package/src/__tests__/call-setup-flow-verification.test.ts +1 -1
- package/src/__tests__/call-setup-flow.test.ts +2 -2
- package/src/__tests__/call-site-routing-provider.test.ts +1 -5
- package/src/__tests__/call-state.test.ts +1 -8
- package/src/__tests__/call-store.test.ts +1 -8
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +0 -7
- package/src/__tests__/canonical-guardian-store.test.ts +1 -8
- package/src/__tests__/catalog-cache.test.ts +0 -8
- package/src/__tests__/catalog-files.test.ts +0 -8
- package/src/__tests__/catalog-install-normalize.test.ts +0 -7
- package/src/__tests__/ces-rpc-credential-backend.test.ts +0 -7
- package/src/__tests__/channel-approval-routes.test.ts +0 -7
- package/src/__tests__/channel-approvals.test.ts +0 -7
- package/src/__tests__/channel-delivery-store.test.ts +0 -7
- package/src/__tests__/channel-guardian.test.ts +29 -16
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +0 -7
- package/src/__tests__/channel-reply-delivery.test.ts +18 -5
- package/src/__tests__/channel-retry-sweep.test.ts +0 -7
- package/src/__tests__/clawhub-files.test.ts +0 -8
- package/src/__tests__/clawhub.test.ts +0 -7
- package/src/__tests__/clear-all-lexical.test.ts +0 -6
- package/src/__tests__/client-os-metadata-persistence.test.ts +0 -5
- package/src/__tests__/compaction-direct.test.ts +47 -0
- package/src/__tests__/compaction-events.test.ts +14 -29
- package/src/__tests__/compaction-ledger-store.test.ts +1 -7
- package/src/__tests__/compaction-summary-head-persisted-count.test.ts +417 -0
- package/src/__tests__/compaction-trail-store.test.ts +2 -8
- package/src/__tests__/compaction.benchmark.test.ts +0 -5
- package/src/__tests__/compactor-call-site-logging.test.ts +0 -21
- package/src/__tests__/compactor-fixed-boundary.test.ts +334 -0
- package/src/__tests__/compactor-low-watermark-cut.test.ts +8 -23
- package/src/__tests__/compactor-media-strip.test.ts +0 -21
- package/src/__tests__/compactor-preserved-tail-count.test.ts +0 -21
- package/src/__tests__/compactor-summary-call-truncation.test.ts +0 -21
- package/src/__tests__/compactor-web-search-strip.test.ts +21 -25
- package/src/__tests__/config-get-vision-flag.test.ts +0 -6
- package/src/__tests__/config-loader-backfill.test.ts +332 -316
- package/src/__tests__/config-loader-platform-defaults.test.ts +0 -21
- package/src/__tests__/config-loader-validation-reset-notice.test.ts +183 -0
- package/src/__tests__/config-schema.test.ts +85 -30
- package/src/__tests__/config-set-route.test.ts +0 -6
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +12 -24
- package/src/__tests__/config-watcher-skill-reseed.test.ts +1 -8
- package/src/__tests__/config-watcher.test.ts +22 -12
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -9
- package/src/__tests__/contact-store-interaction-info.test.ts +1 -8
- package/src/__tests__/contact-store-user-file.test.ts +1 -14
- package/src/__tests__/contacts-tools.test.ts +0 -7
- package/src/__tests__/contacts-write.test.ts +1 -8
- package/src/__tests__/context-search-memory-source.test.ts +0 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -6
- package/src/__tests__/context-window-manager-compact-retry.test.ts +118 -21
- package/src/__tests__/context-window-manager-overflow-rung.test.ts +0 -21
- package/src/__tests__/conversation-abort-tool-results.test.ts +0 -5
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +0 -12
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +5 -12
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +45 -21
- package/src/__tests__/conversation-agent-loop.test.ts +192 -70
- package/src/__tests__/conversation-app-control-instantiation.test.ts +20 -8
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +0 -9
- package/src/__tests__/conversation-attachments.test.ts +1 -7
- package/src/__tests__/conversation-attention-store.test.ts +1 -9
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -8
- package/src/__tests__/conversation-clear-safety.test.ts +0 -7
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -21
- package/src/__tests__/conversation-crud-enabled-plugins.test.ts +1 -7
- package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -7
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -7
- package/src/__tests__/conversation-disk-view-integration.test.ts +0 -7
- package/src/__tests__/conversation-disk-view.test.ts +0 -7
- package/src/__tests__/conversation-enabledplugins-route.test.ts +2 -8
- package/src/__tests__/conversation-error.test.ts +299 -3
- package/src/__tests__/conversation-fork-crud.test.ts +52 -37
- package/src/__tests__/conversation-fork-retrospective.test.ts +486 -7
- package/src/__tests__/conversation-fork-route.test.ts +0 -7
- package/src/__tests__/conversation-history-web-search.test.ts +39 -17
- package/src/__tests__/conversation-inference-profile-list.test.ts +0 -6
- package/src/__tests__/conversation-inference-profile-route.test.ts +0 -5
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -2
- package/src/__tests__/conversation-initial-prompt.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +0 -7
- package/src/__tests__/conversation-lifecycle.test.ts +108 -62
- package/src/__tests__/conversation-list-source.test.ts +0 -7
- package/src/__tests__/conversation-load-history-repair.test.ts +39 -53
- package/src/__tests__/conversation-load-history-stripped.test.ts +12 -19
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +10 -15
- package/src/__tests__/conversation-message-id-uuidv7.test.ts +73 -0
- package/src/__tests__/conversation-pairing.test.ts +0 -7
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +0 -5
- package/src/__tests__/conversation-process-callsite.test.ts +14 -7
- package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -5
- package/src/__tests__/conversation-queue.test.ts +91 -21
- package/src/__tests__/conversation-routes-disk-view.test.ts +0 -11
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +3 -11
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +3 -11
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +3 -11
- package/src/__tests__/conversation-routes-slash-commands.test.ts +24 -13
- package/src/__tests__/conversation-runtime-assembly.test.ts +37 -9
- package/src/__tests__/conversation-skill-tools.test.ts +31 -15
- package/src/__tests__/conversation-slash-commands.test.ts +5 -4
- package/src/__tests__/conversation-slash-queue.test.ts +0 -5
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -5
- package/src/__tests__/conversation-speed-override.test.ts +13 -23
- package/src/__tests__/conversation-starter-routes.test.ts +0 -7
- package/src/__tests__/conversation-store.test.ts +9 -22
- package/src/__tests__/conversation-summarize-route.test.ts +445 -0
- package/src/__tests__/conversation-summarize-up-to.test.ts +711 -0
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -8
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +4 -2
- package/src/__tests__/conversation-title-service.test.ts +0 -7
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +0 -19
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +4 -8
- package/src/__tests__/conversation-unread-route.test.ts +0 -7
- package/src/__tests__/conversation-usage.test.ts +10 -8
- package/src/__tests__/conversation-wait-for-idle.test.ts +391 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -5
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -5
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -5
- package/src/__tests__/conversations-import-system-filter.test.ts +0 -7
- package/src/__tests__/credential-broker-browser-fill.test.ts +0 -9
- package/src/__tests__/credential-broker-server-use.test.ts +0 -9
- package/src/__tests__/credential-execution-api-key-propagation.test.ts +0 -40
- package/src/__tests__/credential-execution-client.test.ts +3 -38
- package/src/__tests__/credential-execution-managed-contract.test.ts +10 -106
- package/src/__tests__/credential-health-service.test.ts +0 -9
- package/src/__tests__/credential-metadata-store.test.ts +0 -8
- package/src/__tests__/credential-prompt-route.test.ts +80 -9
- package/src/__tests__/credential-request-route.test.ts +76 -0
- package/src/__tests__/credential-resolve.test.ts +0 -8
- package/src/__tests__/credential-security-invariants.test.ts +3 -10
- package/src/__tests__/credential-token-resolver.test.ts +0 -9
- package/src/__tests__/custom-profile-ensure.test.ts +232 -0
- package/src/__tests__/daemon-assistant-events.test.ts +1 -9
- package/src/__tests__/daemon-credential-client.test.ts +0 -7
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +1 -8
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +1 -7
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +0 -8
- package/src/__tests__/db-processing-resume-attempts-migration.test.ts +116 -0
- package/src/__tests__/db-readiness-http-gate.test.ts +0 -7
- package/src/__tests__/db-rename-inference-profile-snake-case-migration.test.ts +1 -7
- package/src/__tests__/default-provider-ensure.test.ts +343 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +0 -7
- package/src/__tests__/delete-propagation.test.ts +0 -7
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -7
- package/src/__tests__/device-id.test.ts +1 -9
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-backfill.test.ts +0 -7
- package/src/__tests__/dm-persistence.test.ts +0 -5
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -8
- package/src/__tests__/drain-requeue-on-contention.test.ts +202 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +174 -0
- package/src/__tests__/edit-propagation.test.ts +1 -8
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +0 -8
- package/src/__tests__/emit-signal-routing-intent.test.ts +175 -7
- package/src/__tests__/encrypted-store.test.ts +0 -9
- package/src/__tests__/ensure-conversation-exists.test.ts +85 -0
- package/src/__tests__/events-client-registration.test.ts +0 -7
- package/src/__tests__/events-dev-bypass-actor.test.ts +2 -9
- package/src/__tests__/events-tail-route.test.ts +172 -0
- package/src/__tests__/file-write-tool.test.ts +9 -13
- package/src/__tests__/followup-tools.test.ts +0 -7
- package/src/__tests__/gateway-flag-listener.test.ts +2 -23
- package/src/__tests__/gemini-inline-media.test.ts +2 -2
- package/src/__tests__/gemini-provider.test.ts +140 -1
- package/src/__tests__/get-skill-detail-audit.test.ts +89 -1
- package/src/__tests__/graph-extraction-event-date.test.ts +0 -9
- package/src/__tests__/guardian-action-sweep.test.ts +0 -7
- package/src/__tests__/guardian-binding-drift-heal.test.ts +0 -7
- package/src/__tests__/guardian-card-withdrawal.test.ts +0 -8
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -9
- package/src/__tests__/guardian-dispatch.test.ts +0 -7
- package/src/__tests__/guardian-expiry-notifier.test.ts +1 -9
- package/src/__tests__/guardian-outbound-http.test.ts +0 -7
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -8
- package/src/__tests__/guardian-routing-invariants.test.ts +0 -8
- package/src/__tests__/guardian-routing-state.test.ts +1 -9
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -7
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +4 -5
- package/src/__tests__/headless-browser-interactions.test.ts +0 -7
- package/src/__tests__/headless-browser-mode.test.ts +0 -9
- package/src/__tests__/headless-browser-navigate.test.ts +91 -13
- package/src/__tests__/headless-browser-read-tools.test.ts +0 -7
- package/src/__tests__/headless-browser-snapshot.test.ts +0 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +0 -9
- package/src/__tests__/helpers/set-config.ts +40 -0
- package/src/__tests__/host-bash-proxy.test.ts +3 -3
- package/src/__tests__/host-browser-proxy.test.ts +15 -20
- package/src/__tests__/host-cu-routes-targeted.test.ts +0 -1
- package/src/__tests__/host-shell-tool.test.ts +5 -69
- package/src/__tests__/http-conversation-lineage.test.ts +0 -7
- package/src/__tests__/http-user-message-parity.test.ts +0 -7
- package/src/__tests__/identity-routes.test.ts +1 -9
- package/src/__tests__/image-recovery-hook.test.ts +36 -0
- package/src/__tests__/inbound-admitted-introduction-nudge.test.ts +296 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -7
- package/src/__tests__/inbound-slack-persistence.test.ts +0 -5
- package/src/__tests__/inbound-trust-verdict.test.ts +1 -8
- package/src/__tests__/inference-profile-reaper.test.ts +1 -7
- package/src/__tests__/inference-profile-session-handler.test.ts +0 -6
- package/src/__tests__/inference-profile-session-ipc.test.ts +0 -6
- package/src/__tests__/ingress-url-consistency.test.ts +1 -23
- package/src/__tests__/injection-block.test.ts +0 -1
- package/src/__tests__/injector-chain.test.ts +17 -0
- package/src/__tests__/injector-config-validation-reset-notice.test.ts +121 -0
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +8 -0
- package/src/__tests__/injector-registry-order-guard.test.ts +1 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -7
- package/src/__tests__/inline-skill-load-permissions.test.ts +29 -31
- package/src/__tests__/internal-telemetry-routes.test.ts +72 -7
- package/src/__tests__/interrupted-turn-reconciler.test.ts +126 -0
- package/src/__tests__/introduction-card-resolver.test.ts +0 -9
- package/src/__tests__/invite-redeemed-ipc.test.ts +0 -7
- package/src/__tests__/invite-routes-http.test.ts +46 -11
- package/src/__tests__/job-handler-registration-guard.test.ts +1 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +0 -7
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +0 -7
- package/src/__tests__/lexical-index-dual-write.test.ts +2 -8
- package/src/__tests__/list-messages-attachments.test.ts +0 -7
- package/src/__tests__/list-messages-background-tool-completion.test.ts +0 -7
- package/src/__tests__/list-messages-client-message-id.test.ts +0 -7
- package/src/__tests__/list-messages-hidden-metadata.test.ts +0 -7
- package/src/__tests__/list-messages-page-latest.test.ts +0 -7
- package/src/__tests__/list-messages-queued.test.ts +9 -10
- package/src/__tests__/list-messages-tool-merge.test.ts +0 -7
- package/src/__tests__/llm-catalog-parity.test.ts +20 -0
- package/src/__tests__/llm-context-resolution.test.ts +26 -1
- package/src/__tests__/llm-context-route-provider.test.ts +1 -8
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -16
- package/src/__tests__/llm-request-log-call-site.test.ts +5 -12
- package/src/__tests__/llm-request-log-clickhouse-routing.test.ts +117 -0
- package/src/__tests__/llm-request-log-clickhouse-writer-guards.test.ts +115 -0
- package/src/__tests__/llm-request-log-disabled-writes.test.ts +72 -0
- package/src/__tests__/llm-request-log-sink-clickhouse.test.ts +211 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +1 -22
- package/src/__tests__/llm-request-log-source-factory.test.ts +0 -21
- package/src/__tests__/llm-request-log-turn-query.test.ts +0 -7
- package/src/__tests__/llm-resolver-override-or-default.test.ts +563 -0
- package/src/__tests__/llm-resolver.test.ts +167 -6
- package/src/__tests__/llm-usage-store.test.ts +1 -7
- package/src/__tests__/log-export-routes.test.ts +0 -7
- package/src/__tests__/log-export-workspace.test.ts +0 -7
- package/src/__tests__/managed-profile-guard.test.ts +240 -6
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -7
- package/src/__tests__/managed-store.test.ts +1 -16
- package/src/__tests__/mcp-auth-routes.test.ts +1 -8
- package/src/__tests__/mcp-config-secret-boundary.test.ts +17 -5
- package/src/__tests__/media-generate-image.test.ts +20 -7
- package/src/__tests__/media-stream-output.test.ts +755 -71
- package/src/__tests__/media-stream-server-integration.test.ts +290 -60
- package/src/__tests__/media-stream-stt-session.test.ts +26 -13
- package/src/__tests__/memory-config-file-parity.test.ts +187 -0
- package/src/__tests__/memory-identity-context-parity.test.ts +103 -0
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +8 -7
- package/src/__tests__/memory-jobs-worker-cleanup-cadence.test.ts +296 -0
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +0 -7
- package/src/__tests__/memory-recall-log-store.test.ts +0 -7
- package/src/__tests__/memory-upsert-concurrency.test.ts +0 -7
- package/src/__tests__/message-queue.test.ts +40 -0
- package/src/__tests__/messages-after-tiebreaker.test.ts +1 -8
- package/src/__tests__/messaging-send-tool.test.ts +0 -7
- package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -7
- package/src/__tests__/migration-export-http.test.ts +10 -12
- package/src/__tests__/migration-export-streaming.test.ts +0 -7
- package/src/__tests__/migration-export-to-gcs.test.ts +60 -7
- package/src/__tests__/migration-import-commit-http.test.ts +11 -12
- package/src/__tests__/migration-import-from-gcs.test.ts +0 -7
- package/src/__tests__/migration-import-from-url.test.ts +0 -7
- package/src/__tests__/migration-import-preflight-http.test.ts +10 -11
- package/src/__tests__/migration-jobs-status.test.ts +8 -11
- package/src/__tests__/migration-validate-http.test.ts +2 -8
- package/src/__tests__/model-intents.test.ts +18 -0
- package/src/__tests__/mtime-cache.test.ts +102 -9
- package/src/__tests__/non-member-access-request.test.ts +145 -7
- package/src/__tests__/notification-broadcaster.test.ts +0 -7
- package/src/__tests__/notification-candidate-guardian-context.test.ts +1 -8
- package/src/__tests__/notification-decision-fallback.test.ts +0 -7
- package/src/__tests__/notification-decision-identity.test.ts +0 -7
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -7
- package/src/__tests__/notification-deep-link.test.ts +415 -11
- package/src/__tests__/notification-guardian-path.test.ts +0 -7
- package/src/__tests__/notification-platform-adapter.test.ts +0 -7
- package/src/__tests__/notification-routing-intent.test.ts +1 -9
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -9
- package/src/__tests__/notification-telegram-adapter.test.ts +0 -7
- package/src/__tests__/oauth-cli.test.ts +0 -1
- package/src/__tests__/oauth-connect-orchestrator.test.ts +0 -8
- package/src/__tests__/oauth-connect-routes.test.ts +19 -18
- package/src/__tests__/oauth-provider-profiles.test.ts +0 -7
- package/src/__tests__/oauth-provider-visibility.test.ts +0 -7
- package/src/__tests__/oauth-store.test.ts +0 -7
- package/src/__tests__/openai-provider.test.ts +11 -0
- package/src/__tests__/openrouter-provider-only.test.ts +16 -5
- package/src/__tests__/openrouter-token-estimation.test.ts +2 -2
- package/src/__tests__/outbound-slack-persistence.test.ts +9 -7
- package/src/__tests__/outlook-email-watcher.test.ts +0 -9
- package/src/__tests__/path-policy.test.ts +0 -7
- package/src/__tests__/pending-interactions-resolved-event.test.ts +26 -4
- package/src/__tests__/persist-media-references.test.ts +112 -0
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +9 -4
- package/src/__tests__/persist-unsendable-image.test.ts +39 -7
- package/src/__tests__/persist-user-message-set-processing-failure.test.ts +41 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +7 -7
- package/src/__tests__/persona-resolver.test.ts +1 -1
- package/src/__tests__/personal-memory-auth-bypass.test.ts +2 -4
- package/src/__tests__/platform-bash-auto-approve.test.ts +20 -10
- package/src/__tests__/platform-callback-registration.test.ts +10 -9
- package/src/__tests__/platform-proxy-context.test.ts +0 -8
- package/src/__tests__/playbook-execution.test.ts +2 -33
- package/src/__tests__/playbook-tools.test.ts +0 -7
- package/src/__tests__/plugin-api-model-profiles.test.ts +25 -4
- package/src/__tests__/plugin-effective-enabled-set.test.ts +29 -29
- package/src/__tests__/plugin-hook-pipeline-hardening.test.ts +249 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +13 -25
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +316 -0
- package/src/__tests__/plugin-types.test.ts +1 -1
- package/src/__tests__/pointer-conversation-trust.test.ts +2 -4
- package/src/__tests__/pricing.test.ts +85 -2
- package/src/__tests__/process-message-background-slack.test.ts +4 -5
- package/src/__tests__/process-message-display-content.test.ts +102 -10
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -5
- package/src/__tests__/provider-commit-message-generator.test.ts +15 -8
- package/src/__tests__/provider-error-scenarios.test.ts +68 -5
- package/src/__tests__/provider-platform-proxy-integration.test.ts +17 -2
- package/src/__tests__/provider-registry-ollama.test.ts +14 -1
- package/src/__tests__/provider-send-message-override-profile.test.ts +13 -5
- package/src/__tests__/provider-streaming.benchmark.test.ts +1 -6
- package/src/__tests__/provider-usage-tracking.test.ts +9 -6
- package/src/__tests__/proxy-approval-callback.test.ts +0 -6
- package/src/__tests__/prune-old-conversations-job.test.ts +1 -9
- package/src/__tests__/prune-old-tool-invocations-job.test.ts +1 -9
- package/src/__tests__/public-ingress-urls.test.ts +1 -24
- package/src/__tests__/qdrant-collection-migration.test.ts +0 -7
- package/src/__tests__/qdrant-manager.test.ts +0 -8
- package/src/__tests__/ratelimit.test.ts +1 -8
- package/src/__tests__/reaction-persistence.test.ts +0 -7
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +0 -11
- package/src/__tests__/registry.test.ts +39 -12
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +270 -0
- package/src/__tests__/require-fresh-approval.test.ts +47 -182
- package/src/__tests__/resolve-trust-class.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +9 -5
- package/src/__tests__/retry-thinking-adaptive-only.test.ts +19 -5
- package/src/__tests__/retry-thinking-tool-choice.test.ts +65 -5
- package/src/__tests__/retry-verbosity-normalization.test.ts +9 -5
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -7
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +0 -7
- package/src/__tests__/runtime-events-sse-parity.test.ts +0 -7
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +0 -7
- package/src/__tests__/runtime-events-sse.test.ts +0 -7
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +131 -9
- package/src/__tests__/schedule-retry.test.ts +0 -8
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +0 -7
- package/src/__tests__/schedule-routes.test.ts +0 -7
- package/src/__tests__/schedule-store.test.ts +0 -8
- package/src/__tests__/schedule-tools.test.ts +0 -7
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -10
- package/src/__tests__/scheduler-recurrence.test.ts +19 -96
- package/src/__tests__/scheduler-reuse-conversation.test.ts +75 -88
- package/src/__tests__/scheduler-wake.test.ts +12 -60
- package/src/__tests__/scheduler-worker-standdown.test.ts +0 -8
- package/src/__tests__/scoped-approval-grants.test.ts +1 -9
- package/src/__tests__/scoped-grant-security-matrix.test.ts +1 -9
- package/src/__tests__/secret-allowlist.test.ts +1 -8
- package/src/__tests__/secret-ingress-channel.test.ts +0 -7
- package/src/__tests__/secret-ingress-cli.test.ts +0 -7
- package/src/__tests__/secret-ingress-http.test.ts +3 -11
- package/src/__tests__/secret-patterns.test.ts +27 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +35 -9
- package/src/__tests__/secret-response-routing.test.ts +1 -1
- package/src/__tests__/secret-routes-platform-proxy.test.ts +0 -7
- package/src/__tests__/secure-keys-managed-failover.test.ts +0 -7
- package/src/__tests__/secure-keys.test.ts +142 -33
- package/src/__tests__/send-endpoint-busy.test.ts +0 -19
- package/src/__tests__/sequence-store.test.ts +0 -9
- package/src/__tests__/server-history-render.test.ts +61 -8
- package/src/__tests__/service-contracts-import-guard.test.ts +4 -9
- package/src/__tests__/set-permission-mode.test.ts +0 -7
- package/src/__tests__/settings-routes.test.ts +0 -7
- package/src/__tests__/shell-credential-ref.test.ts +0 -8
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -7
- package/src/__tests__/skill-projection-feature-flag.test.ts +35 -17
- package/src/__tests__/skill-projection.benchmark.test.ts +7 -7
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -7
- package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -7
- package/src/__tests__/slack-channels-routes.test.ts +34 -16
- package/src/__tests__/slack-inbound-verification.test.ts +0 -7
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +0 -8
- package/src/__tests__/slack-users-routes.test.ts +148 -0
- package/src/__tests__/slim-skill-category.test.ts +0 -7
- package/src/__tests__/stale-approval-dedup.test.ts +0 -7
- package/src/__tests__/subagent-call-site-routing.test.ts +45 -11
- package/src/__tests__/subagent-detail.test.ts +2 -1
- package/src/__tests__/subagent-fork-prompt-role.test.ts +0 -5
- package/src/__tests__/subagent-fork-spawn.test.ts +0 -37
- package/src/__tests__/subagent-spawn-and-await.test.ts +0 -5
- package/src/__tests__/subagent-tool-gate-mode.test.ts +1 -7
- package/src/__tests__/subagent-tools.test.ts +77 -36
- package/src/__tests__/suggestion-routes.test.ts +28 -42
- package/src/__tests__/summarize-boundary.test.ts +169 -0
- package/src/__tests__/task-compiler.test.ts +0 -7
- package/src/__tests__/task-management-tools.test.ts +0 -7
- package/src/__tests__/task-memory-cleanup.test.ts +0 -18
- package/src/__tests__/task-scheduler.test.ts +40 -9
- package/src/__tests__/telegram-bot-username-resolution.test.ts +0 -8
- package/src/__tests__/telephony-tts-guard.test.ts +118 -26
- package/src/__tests__/test-preload.ts +11 -1
- package/src/__tests__/thread-backfill.test.ts +2 -8
- package/src/__tests__/token-manager.test.ts +0 -9
- package/src/__tests__/tool-approval-handler.test.ts +57 -88
- package/src/__tests__/{tool-audit-listener.test.ts → tool-audit.test.ts} +230 -255
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +5 -33
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -8
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +308 -411
- package/src/__tests__/tool-executor.test.ts +37 -26
- package/src/__tests__/tool-grant-request-escalation.test.ts +17 -31
- package/src/__tests__/tool-preview-lifecycle.test.ts +2 -8
- package/src/__tests__/tool-profiler.test.ts +139 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +0 -8
- package/src/__tests__/tool-start-timestamp.test.ts +4 -10
- package/src/__tests__/tools-get-route.test.ts +75 -3
- package/src/__tests__/trust-context-guards.test.ts +1 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +9 -26
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -7
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -7
- package/src/__tests__/trusted-contact-verification.test.ts +6 -139
- package/src/__tests__/turn-boundary-resolution.test.ts +0 -7
- package/src/__tests__/turn-events-store.test.ts +51 -7
- package/src/__tests__/turn-outcome-read.test.ts +75 -0
- package/src/__tests__/twilio-config.test.ts +0 -7
- package/src/__tests__/twilio-provider.test.ts +0 -7
- package/src/__tests__/twilio-routes-twiml.test.ts +1 -8
- package/src/__tests__/twilio-routes.test.ts +12 -5
- package/src/__tests__/twilio-validation.test.ts +0 -7
- package/src/__tests__/usage-attribution.test.ts +91 -1
- package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -7
- package/src/__tests__/usage-routes.test.ts +1 -8
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +0 -7
- package/src/__tests__/vercel-ai-gateway-provider.test.ts +283 -0
- package/src/__tests__/vercel-config.test.ts +0 -7
- package/src/__tests__/verification-control-plane-policy.test.ts +60 -31
- package/src/__tests__/voice-approval-resolver-relay.test.ts +3 -9
- package/src/__tests__/voice-config-update.test.ts +1 -22
- package/src/__tests__/voice-guardian-cold-cache-warm.test.ts +8 -17
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -10
- package/src/__tests__/voice-session-bridge-processing-wait.test.ts +0 -7
- package/src/__tests__/voice-session-bridge.test.ts +116 -68
- package/src/__tests__/workspace-git-service.test.ts +207 -2
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +0 -8
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +0 -8
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +0 -8
- package/src/__tests__/workspace-migration-126-strip-managed-profile-bodies.test.ts +192 -0
- package/src/__tests__/workspace-migration-127-backfill-default-provider.test.ts +277 -0
- package/src/__tests__/workspace-migration-128-repair-stale-openrouter-grok-model-ids.test.ts +135 -0
- package/src/__tests__/workspace-migration-129-remove-analyze-conversation-config.test.ts +190 -0
- package/src/__tests__/workspace-tool-loader.test.ts +5 -1
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -10
- package/src/a2a/__tests__/task-store.test.ts +0 -9
- package/src/acp/__tests__/session-manager-persistence.test.ts +1 -8
- package/src/acp/__tests__/session-manager-resume.test.ts +0 -7
- package/src/acp/__tests__/session-manager-startup.test.ts +1 -8
- package/src/agent/attachments.ts +57 -0
- package/src/agent/image-optimize.ts +80 -0
- package/src/agent/loop-exclusive-tool.test.ts +28 -5
- package/src/agent/loop.ts +25 -63
- package/src/api/responses/conversation-message.ts +9 -15
- package/src/approvals/guardian-expiry-notifier.ts +6 -0
- package/src/approvals/guardian-request-resolvers.ts +42 -21
- package/src/background-wake/wake-intent-hooks.test.ts +2 -10
- package/src/browser/operation-meta.ts +493 -0
- package/src/browser/operations.ts +2 -477
- package/src/calls/__tests__/call-setup-router.test.ts +341 -321
- package/src/calls/__tests__/channel-admission-reader.test.ts +50 -24
- package/src/calls/__tests__/fish-audio-client.test.ts +35 -11
- package/src/calls/__tests__/inbound-trust-reader.test.ts +157 -34
- package/src/calls/__tests__/tts-text-sanitizer.test.ts +22 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +884 -0
- package/src/calls/access-request-wait.ts +3 -1
- package/src/calls/audio-store.ts +6 -6
- package/src/calls/call-constants.ts +1 -1
- package/src/calls/call-controller.ts +242 -64
- package/src/calls/call-setup-flow-types.ts +2 -2
- package/src/calls/call-setup-flow.ts +19 -57
- package/src/calls/call-setup-router.ts +63 -39
- package/src/calls/call-speech-output.ts +39 -39
- package/src/calls/call-transport.ts +17 -5
- package/src/calls/channel-admission-reader.ts +38 -28
- package/src/calls/fish-audio-client.ts +24 -52
- package/src/calls/gateway-invite-reader.ts +15 -19
- package/src/calls/inbound-trust-reader.ts +74 -25
- package/src/calls/media-stream-audio-transcode.ts +1 -1
- package/src/calls/media-stream-output.ts +482 -64
- package/src/calls/media-stream-server.ts +156 -83
- package/src/calls/media-stream-stt-session.ts +1 -0
- package/src/calls/resolve-call-tts-provider.ts +60 -17
- package/src/calls/telephony-tts-capability.ts +13 -13
- package/src/calls/tts-text-sanitizer.ts +5 -3
- package/src/calls/unresolved-caller-trust.ts +36 -0
- package/src/calls/voice-session-bridge.ts +397 -52
- package/src/channels/__tests__/gateway-invites.test.ts +257 -0
- package/src/channels/gateway-invites.ts +142 -0
- package/src/channels/gateway-verification-sessions.ts +4 -8
- package/src/cli/AGENTS.md +60 -51
- package/src/cli/commands/__tests__/inference-models.test.ts +86 -0
- package/src/cli/commands/__tests__/inference-profiles.test.ts +254 -0
- package/src/cli/commands/__tests__/inference-providers.test.ts +171 -0
- package/src/cli/commands/__tests__/schedules.test.ts +133 -1
- package/src/cli/commands/__tests__/usage.test.ts +131 -0
- package/src/cli/commands/attachment.help.ts +100 -0
- package/src/cli/commands/attachment.ts +92 -157
- package/src/cli/commands/audit.help.ts +40 -0
- package/src/cli/commands/audit.ts +66 -86
- package/src/cli/commands/auth.help.ts +46 -0
- package/src/cli/commands/auth.ts +10 -43
- package/src/cli/commands/avatar.help.ts +236 -0
- package/src/cli/commands/avatar.ts +66 -250
- package/src/cli/commands/backup.help.ts +190 -0
- package/src/cli/commands/backup.ts +109 -276
- package/src/cli/commands/bash.help.ts +45 -0
- package/src/cli/commands/bash.ts +55 -75
- package/src/cli/commands/browser.help.ts +196 -0
- package/src/cli/commands/browser.ts +241 -352
- package/src/cli/commands/config.ts +166 -164
- package/src/cli/commands/contacts.ts +13 -22
- package/src/cli/commands/credentials.ts +38 -28
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +19 -10
- package/src/cli/commands/db/repair.ts +20 -8
- package/src/cli/commands/default-action.ts +8 -3
- package/src/cli/commands/domain.ts +36 -22
- package/src/cli/commands/email.ts +77 -36
- package/src/cli/commands/inference-callsites.ts +158 -0
- package/src/cli/commands/inference-models.ts +84 -0
- package/src/cli/commands/inference-profiles.ts +371 -0
- package/src/cli/commands/inference-providers-default.ts +89 -0
- package/src/cli/commands/inference-providers.ts +117 -24
- package/src/cli/commands/inference.ts +6 -0
- package/src/cli/commands/keys.ts +27 -38
- package/src/cli/commands/memory/index.ts +8 -0
- package/src/cli/commands/memory/memory-retrospective.ts +7 -5
- package/src/cli/commands/memory/memory-v2-compare-render.ts +2 -2
- package/src/cli/commands/memory/nodes.ts +301 -0
- package/src/cli/commands/oauth/shared.ts +1 -1
- package/src/cli/commands/oauth/status.test.ts +6 -6
- package/src/cli/commands/oauth/status.ts +12 -6
- package/src/cli/commands/oauth/token.ts +1 -26
- package/src/cli/commands/plugins.ts +210 -116
- package/src/cli/commands/schedules.ts +17 -2
- package/src/cli/commands/tools-run.ts +4 -4
- package/src/cli/commands/tools.ts +23 -7
- package/src/cli/commands/ui.ts +2 -3
- package/src/cli/commands/usage.ts +59 -21
- package/src/cli/index.help.ts +31 -0
- package/src/cli/lib/__tests__/cli-output.test.ts +20 -0
- package/src/cli/lib/__tests__/diff-plugin.test.ts +2 -5
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +1 -1
- package/src/cli/lib/__tests__/install-from-github.test.ts +37 -5
- package/src/cli/lib/__tests__/install-from-platform.test.ts +497 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +36 -0
- package/src/cli/lib/__tests__/plugin-artifact.test.ts +54 -1
- package/src/cli/lib/__tests__/plugin-details.test.ts +137 -1
- package/src/cli/lib/__tests__/plugin-icon-file.test.ts +142 -0
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +1 -1
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +1 -1
- package/src/cli/lib/__tests__/search-plugins.test.ts +1 -1
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +82 -21
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +1 -1
- package/src/cli/lib/cli-command-help.ts +119 -0
- package/src/cli/lib/cli-output.ts +55 -0
- package/src/cli/lib/diff-plugin.ts +2 -2
- package/src/cli/lib/fetch-like.ts +11 -0
- package/src/cli/lib/inspect-plugin.ts +2 -2
- package/src/cli/lib/install-from-github.ts +61 -15
- package/src/cli/lib/install-from-platform.ts +618 -0
- package/src/cli/lib/list-installed-plugins.ts +39 -5
- package/src/cli/lib/plugin-artifact.ts +30 -0
- package/src/cli/lib/plugin-constants.ts +27 -0
- package/src/cli/lib/plugin-details.ts +51 -11
- package/src/cli/lib/plugin-icon-file.ts +101 -0
- package/src/cli/lib/plugin-marketplace.ts +1 -4
- package/src/cli/lib/plugin-pin-history.ts +27 -12
- package/src/cli/lib/publish-plugin.ts +3 -3
- package/src/cli/lib/search-plugins.ts +2 -6
- package/src/cli/lib/uninstall-plugin.ts +24 -2
- package/src/cli/lib/upgrade-plugin.ts +8 -22
- package/src/cli/program.ts +0 -2
- package/src/cli.ts +22 -13
- package/src/config/__tests__/default-profile-catalog.test.ts +384 -0
- package/src/config/__tests__/default-provider.test.ts +245 -0
- package/src/config/__tests__/deployment-context-defaults.test.ts +0 -21
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +0 -21
- package/src/config/__tests__/loader-last-known-good.test.ts +208 -0
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +145 -0
- package/src/config/__tests__/profile-materialization.test.ts +297 -0
- package/src/config/__tests__/seed-default-provider.test.ts +210 -0
- package/src/config/__tests__/sync-gated-profiles.test.ts +27 -34
- package/src/config/assistant-feature-flags.ts +1 -1
- package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +9 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +0 -6
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +0 -3
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +0 -3
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +1 -3
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +0 -4
- package/src/config/bundled-skills/schedule/SKILL.md +17 -0
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +0 -7
- package/src/config/call-site-defaults.ts +5 -2
- package/src/config/default-profile-catalog.ts +481 -0
- package/src/config/default-profile-names.ts +44 -0
- package/src/config/default-provider-resolution.ts +33 -0
- package/src/config/default-provider.ts +38 -0
- package/src/config/env-registry.ts +2 -0
- package/src/config/env.ts +0 -6
- package/src/config/feature-flag-registry.json +42 -50
- package/src/config/inference-profile-validation.ts +5 -4
- package/src/config/llm-resolver.ts +447 -24
- package/src/config/loader.ts +345 -10
- package/src/config/profile-materialization.ts +151 -0
- package/src/config/schema.ts +2 -52
- package/src/config/schemas/__tests__/live-voice.test.ts +108 -0
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +33 -5
- package/src/config/schemas/call-site-catalog.ts +0 -6
- package/src/config/schemas/calls.ts +9 -0
- package/src/config/schemas/conversations.ts +1 -1
- package/src/config/schemas/live-voice.ts +77 -0
- package/src/config/schemas/llm-request-logs.ts +78 -27
- package/src/config/schemas/llm.ts +53 -2
- package/src/config/schemas/memory-lifecycle.ts +0 -6
- package/src/config/schemas/memory.ts +57 -1
- package/src/config/seed-inference-profiles.ts +100 -289
- package/src/config/sync-gated-profiles.ts +17 -23
- package/src/contacts/canonical-guardian-store.ts +6 -0
- package/src/contacts/contact-store.ts +272 -51
- package/src/contacts/contacts-write.ts +0 -22
- package/src/contacts/guardian-contact-reader.ts +3 -2
- package/src/contacts/member-write-relay.ts +2 -19
- package/src/contacts/types.ts +2 -1
- package/src/context/compactor.ts +230 -38
- package/src/context/image-dimensions.ts +25 -3
- package/src/context/token-estimator.ts +11 -7
- package/src/conversations/__tests__/message-consolidation.test.ts +6 -5
- package/src/conversations/job-handlers/summarization.ts +0 -2
- package/src/conversations/message-consolidation.ts +34 -112
- package/src/credential-execution/executable-discovery.ts +16 -144
- package/src/credential-execution/process-manager.test.ts +1 -112
- package/src/credential-execution/process-manager.ts +13 -379
- package/src/credential-execution/prompted-credential.ts +1 -1
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
- package/src/daemon/__tests__/inference-profile-notification.test.ts +0 -8
- package/src/daemon/__tests__/inflight-message-content.test.ts +219 -0
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +0 -8
- package/src/daemon/__tests__/wake-conversation-ops-completion.test.ts +0 -6
- package/src/daemon/__tests__/web-search-status-text.test.ts +0 -8
- package/src/daemon/approval-generators.ts +17 -11
- package/src/daemon/assistant-attachments.ts +86 -87
- package/src/daemon/config-watcher.ts +67 -21
- package/src/daemon/conversation-agent-loop-handlers.ts +146 -50
- package/src/daemon/conversation-agent-loop.ts +136 -34
- package/src/daemon/conversation-error.ts +291 -109
- package/src/daemon/conversation-history.ts +6 -12
- package/src/daemon/conversation-initial-prompt.ts +1 -1
- package/src/daemon/conversation-launch.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +5 -22
- package/src/daemon/conversation-media-retry.ts +3 -2
- package/src/daemon/conversation-messaging.ts +296 -66
- package/src/daemon/conversation-notifiers.ts +1 -1
- package/src/daemon/conversation-process.ts +162 -12
- package/src/daemon/conversation-queue-manager.ts +12 -0
- package/src/daemon/conversation-runtime-assembly.ts +197 -53
- package/src/daemon/conversation-skill-tools.ts +27 -9
- package/src/daemon/conversation-slash.ts +2 -4
- package/src/daemon/conversation-store.ts +11 -13
- package/src/daemon/conversation-surfaces.ts +145 -176
- package/src/daemon/conversation-tool-setup.ts +18 -12
- package/src/daemon/conversation-turn-finalize.ts +18 -1
- package/src/daemon/conversation.ts +265 -85
- package/src/daemon/disk-pressure-policy.ts +1 -1
- package/src/daemon/event-loop-watchdog.test.ts +1 -6
- package/src/daemon/event-loop-watchdog.ts +2 -20
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +0 -7
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -8
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -8
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -8
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -8
- package/src/daemon/handlers/config-a2a.ts +0 -3
- package/src/daemon/handlers/conversation-history.ts +6 -4
- package/src/daemon/handlers/shared.ts +224 -79
- package/src/daemon/handlers/skills.ts +8 -0
- package/src/daemon/inflight-message-content.ts +228 -0
- package/src/daemon/interrupted-turn-reconciler.ts +134 -0
- package/src/daemon/lifecycle.ts +120 -64
- package/src/daemon/main.ts +1 -5
- package/src/daemon/message-types/conversations.ts +2 -0
- package/src/daemon/message-types/host-bash.ts +1 -1
- package/src/daemon/message-types/skills.ts +6 -0
- package/src/daemon/message-types/sync.ts +1 -0
- package/src/daemon/orphan-reaper.test.ts +1 -6
- package/src/daemon/persist-media-references.ts +151 -0
- package/src/daemon/pointer-conversation-trust.ts +2 -4
- package/src/daemon/process-message.ts +82 -8
- package/src/daemon/providers-setup.ts +1 -4
- package/src/daemon/shutdown-handlers.ts +0 -4
- package/src/daemon/sqlite-corruption-watchdog.test.ts +0 -13
- package/src/daemon/sqlite-corruption-watchdog.ts +2 -15
- package/src/daemon/summarize-boundary.ts +62 -0
- package/src/daemon/tool-setup-types.ts +1 -1
- package/src/daemon/trust-context-types.ts +61 -0
- package/src/daemon/trust-context.ts +5 -55
- package/src/daemon/wake-conversation-ops.ts +4 -1
- package/src/documents/document-comments-store.test.ts +1 -7
- package/src/export/__tests__/transcript-formatter.test.ts +13 -8
- package/src/export/formatter.ts +8 -17
- package/src/export/transcript-formatter.ts +13 -40
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +0 -9
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +0 -2
- package/src/home/__tests__/home-content-refresh.test.ts +0 -7
- package/src/home/__tests__/suggested-prompts.test.ts +4 -12
- package/src/home/conversation-starter-checkpoints.ts +9 -5
- package/src/home/job-handlers/conversation-starters.ts +24 -54
- package/src/home/suggested-prompts-cache.ts +91 -0
- package/src/home/suggested-prompts.ts +4 -77
- package/src/hooks/__tests__/hook-live-reload.test.ts +62 -48
- package/src/hooks/hook-loader.ts +215 -194
- package/src/hooks/types.ts +2 -2
- package/src/ipc/__tests__/contacts-info-ipc.test.ts +66 -11
- package/src/ipc/assistant-server.ts +14 -34
- package/src/ipc/gateway-flag-listener.ts +14 -25
- package/src/ipc/gateway-validated-call.ts +32 -0
- package/src/ipc/routes/__tests__/contacts-mirror-ipc-routes.test.ts +149 -17
- package/src/ipc/routes/__tests__/contacts-mirror-merge-contact.test.ts +197 -0
- package/src/ipc/routes/__tests__/contacts-mirror-upsert-full.test.ts +368 -0
- package/src/ipc/routes/__tests__/guardian-label-ipc-routes.test.ts +74 -0
- package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +0 -7
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +5 -7
- package/src/ipc/routes/contacts-info-ipc-routes.ts +5 -2
- package/src/ipc/routes/contacts-mirror-ipc-routes.ts +78 -1
- package/src/ipc/routes/db-proxy.ts +9 -15
- package/src/ipc/routes/guardian-label-ipc-routes.ts +42 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -8
- package/src/live-voice/__tests__/live-voice-credential-preflight.test.ts +275 -0
- package/src/live-voice/__tests__/live-voice-integration.test.ts +124 -0
- package/src/live-voice/__tests__/live-voice-metrics.test.ts +67 -0
- package/src/live-voice/__tests__/live-voice-session-preflight.test.ts +156 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +464 -19
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +350 -4
- package/src/live-voice/__tests__/live-voice-tts.test.ts +186 -10
- package/src/live-voice/__tests__/live-voice-vad.test.ts +372 -10
- package/src/live-voice/__tests__/protocol.test.ts +2 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +61 -9
- package/src/live-voice/live-voice-credential-preflight.ts +205 -0
- package/src/live-voice/live-voice-metrics.ts +44 -0
- package/src/live-voice/live-voice-session-manager.ts +19 -0
- package/src/live-voice/live-voice-session.ts +1015 -276
- package/src/live-voice/live-voice-tts.ts +50 -4
- package/src/live-voice/protocol.ts +8 -0
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +3 -7
- package/src/messaging/channel-binding-schema.ts +15 -7
- package/src/messaging/providers/a2a/__tests__/deliver.test.ts +0 -9
- package/src/messaging/providers/slack/__tests__/download.test.ts +1 -8
- package/src/messaging/providers/slack/binding-metadata.test.ts +63 -0
- package/src/messaging/providers/slack/binding-metadata.ts +6 -0
- package/src/messaging/providers/slack/conversation-utils.ts +7 -4
- package/src/messaging/providers/slack/send.test.ts +0 -7
- package/src/messaging/providers/slack/types.ts +2 -0
- package/src/messaging/providers/slack/withdraw.test.ts +0 -6
- package/src/messaging/providers/telegram-bot/send.test.ts +0 -7
- package/src/monitoring/__tests__/resource-sampler.test.ts +2 -4
- package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
- package/src/monitoring/process-memory.ts +6 -1
- package/src/monitoring/resource-sample-types.ts +71 -0
- package/src/monitoring/resource-sampler.ts +7 -69
- package/src/monitoring/stall-capture.ts +1 -1
- package/src/notifications/__tests__/broadcaster.test.ts +100 -9
- package/src/notifications/__tests__/connected-channels.test.ts +11 -8
- package/src/notifications/__tests__/decision-engine.test.ts +0 -7
- package/src/notifications/__tests__/destination-resolver.test.ts +18 -12
- package/src/notifications/__tests__/deterministic-checks.test.ts +1 -9
- package/src/notifications/access-request-copy.ts +33 -1
- package/src/notifications/adapters/slack.ts +7 -2
- package/src/notifications/approval-card-data.ts +4 -2
- package/src/notifications/broadcaster.ts +118 -67
- package/src/notifications/copy-composer.ts +6 -2
- package/src/notifications/emit-signal.ts +23 -1
- package/src/notifications/signal.ts +5 -4
- package/src/notifications/types.ts +1 -1
- package/src/notifications/urgency.ts +5 -0
- package/src/oauth/byo-connection.test.ts +1 -10
- package/src/oauth/connect-orchestrator.ts +1 -1
- package/src/oauth/connection-resolver.test.ts +140 -7
- package/src/oauth/connection-resolver.ts +48 -12
- package/src/oauth/oauth-store.ts +4 -11
- package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -8
- package/src/permissions/approval-policy.test.ts +0 -314
- package/src/permissions/approval-policy.ts +38 -90
- package/src/permissions/checker.test.ts +3 -14
- package/src/permissions/checker.ts +95 -19
- package/src/permissions/confirmation-canonical-request.ts +118 -0
- package/src/permissions/gateway-threshold-reader.test.ts +0 -8
- package/src/permissions/ipc-risk-types.ts +2 -0
- package/src/permissions/prompter.ts +16 -3
- package/src/permissions/secret-prompt-types.ts +34 -0
- package/src/permissions/secret-prompter.ts +21 -19
- package/src/permissions/types.ts +0 -14
- package/src/persistence/__tests__/bulk-write-gate.test.ts +159 -0
- package/src/persistence/__tests__/conversation-queries-search.test.ts +0 -7
- package/src/persistence/__tests__/immediate-transaction-guard.test.ts +70 -0
- package/src/persistence/__tests__/message-content-file.test.ts +259 -0
- package/src/persistence/__tests__/slow-query-log.test.ts +125 -0
- package/src/persistence/attachments-store.ts +90 -26
- package/src/persistence/auto-analysis-constants.ts +4 -13
- package/src/persistence/bulk-write-gate.ts +82 -0
- package/src/persistence/cleanup-schedule-state.ts +51 -21
- package/src/persistence/conversation-bootstrap.ts +3 -3
- package/src/persistence/conversation-crud.ts +382 -105
- package/src/persistence/conversation-disk-view.ts +32 -15
- package/src/persistence/conversation-group-migration.test.ts +1 -8
- package/src/persistence/conversation-key-store.ts +0 -2
- package/src/persistence/conversation-plugin-facade.ts +190 -0
- package/src/persistence/conversation-row-batch-delete.ts +16 -1
- package/src/persistence/conversation-title-service.ts +59 -22
- package/src/persistence/conversation-types.ts +19 -4
- package/src/persistence/db-async-query.ts +18 -9
- package/src/persistence/db-connection.ts +20 -4
- package/src/persistence/db-init.ts +16 -173
- package/src/persistence/db-maintenance.ts +78 -6
- package/src/persistence/embeddings/__tests__/messages-lexical-index.test.ts +0 -7
- package/src/persistence/embeddings/plugin-facade.ts +37 -0
- package/src/persistence/embeddings/qdrant-client.ts +2 -18
- package/src/persistence/fork-message-copy.ts +18 -4
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +0 -7
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +0 -6
- package/src/persistence/job-handlers/__tests__/message-lexical.test.ts +0 -7
- package/src/persistence/job-handlers/message-lexical-backfill.ts +8 -5
- package/src/persistence/job-handlers/message-lexical.ts +2 -2
- package/src/persistence/jobs-store.ts +48 -85
- package/src/persistence/llm-request-log-sink-clickhouse.ts +325 -0
- package/src/persistence/llm-request-log-store.ts +213 -100
- package/src/persistence/llm-request-log-writer-types.ts +80 -0
- package/src/persistence/message-content-file.ts +301 -0
- package/src/persistence/message-content.ts +33 -72
- package/src/persistence/migrations/321-canonical-guardian-request-trigger.ts +27 -0
- package/src/persistence/migrations/322-add-processing-resume-attempts.ts +31 -0
- package/src/persistence/migrations/323-delete-non-default-memory-scopes.test.ts +148 -0
- package/src/persistence/migrations/323-delete-non-default-memory-scopes.ts +35 -0
- package/src/persistence/migrations/324-message-finalized-column.ts +26 -0
- package/src/persistence/migrations/325-create-config-setting-events.ts +40 -0
- package/src/persistence/migrations/326-move-injection-events-to-memory-db.ts +104 -0
- package/src/persistence/migrations/327-create-flush-checkpoints.ts +86 -0
- package/src/persistence/migrations/__tests__/297-move-llm-request-logs.test.ts +2 -2
- package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +124 -0
- package/src/persistence/schema/conversations.ts +25 -1
- package/src/persistence/schema/guardian.ts +5 -0
- package/src/persistence/schema/infrastructure.ts +33 -0
- package/src/persistence/schema/memory-core.ts +17 -28
- package/src/persistence/schema/memory-graph.ts +0 -4
- package/src/persistence/schema/memory-injection.ts +3 -1
- package/src/persistence/schema/tasks.ts +0 -1
- package/src/persistence/slow-query-log.ts +58 -21
- package/src/persistence/steps.ts +14 -0
- package/src/platform/consent-cache.test.ts +0 -7
- package/src/platform/managed-speech.test.ts +218 -0
- package/src/platform/managed-speech.ts +195 -0
- package/src/playbooks/playbook-compiler.ts +2 -10
- package/src/plugin-api/index.ts +79 -0
- package/src/plugin-api/model-profiles.test.ts +31 -3
- package/src/plugin-api/model-profiles.ts +3 -1
- package/src/plugin-api/types.ts +12 -3
- package/src/plugin-api/vision-support.ts +4 -3
- package/src/plugins/AGENTS.md +19 -0
- package/src/plugins/__tests__/plugin-state-boundary-guard.test.ts +65 -0
- package/src/plugins/defaults/compaction/compact.ts +13 -0
- package/src/plugins/defaults/compaction/window-manager.ts +207 -43
- package/src/plugins/defaults/image-fallback/__tests__/caption-cache-persistence.test.ts +216 -0
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +281 -2
- package/src/plugins/defaults/image-fallback/__tests__/vision-recovery.test.ts +268 -0
- package/src/plugins/defaults/image-fallback/hooks/conversation-deleted.ts +27 -0
- package/src/plugins/defaults/image-fallback/hooks/init.ts +16 -0
- package/src/plugins/defaults/image-fallback/hooks/post-compact.ts +52 -0
- package/src/plugins/defaults/image-fallback/hooks/post-model-call.ts +80 -0
- package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +7 -4
- package/src/plugins/defaults/image-fallback/hooks/shutdown.ts +14 -0
- package/src/plugins/defaults/image-fallback/hooks/stop.ts +23 -0
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +12 -12
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +73 -15
- package/src/plugins/defaults/image-fallback/src/caption-cache.ts +206 -20
- package/src/plugins/defaults/image-fallback/src/recovery-state.ts +49 -0
- package/src/plugins/defaults/image-fallback/src/vision-caption.ts +11 -3
- package/src/plugins/defaults/image-fallback/src/vision-error.ts +19 -0
- package/src/plugins/defaults/image-recovery/detect.ts +32 -10
- package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +20 -18
- package/src/plugins/defaults/image-recovery/recover.ts +97 -61
- package/src/plugins/defaults/index.ts +29 -5
- package/src/plugins/defaults/injector-order.ts +1 -0
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +1 -8
- package/src/plugins/defaults/memory/__tests__/clear-stale-processing-flags.test.ts +1 -8
- package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +1 -8
- package/src/plugins/defaults/memory/__tests__/conversation-row-batch-delete.test.ts +0 -6
- package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +105 -11
- package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +22 -18
- package/src/plugins/defaults/memory/__tests__/embedding-cache.test.ts +0 -6
- package/src/plugins/defaults/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -8
- package/src/plugins/defaults/memory/__tests__/fork-message-copy.test.ts +0 -6
- package/src/plugins/defaults/memory/__tests__/jobs-store-enqueue-gate.test.ts +7 -70
- package/src/plugins/defaults/memory/__tests__/jobs-worker-memory-disabled.test.ts +0 -7
- package/src/plugins/defaults/memory/__tests__/jobs-worker-pkb-schedule.test.ts +7 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +0 -5
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +7 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +0 -7
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +186 -19
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +926 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +136 -82
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +0 -6
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +217 -2
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -7
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +0 -7
- package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +49 -0
- package/src/plugins/defaults/memory/activation-session-store.ts +1 -1
- package/src/plugins/defaults/memory/anisotropy.ts +1 -1
- package/src/plugins/defaults/memory/config.ts +155 -6
- package/src/plugins/defaults/memory/context-search/agent-protocol.ts +1 -1
- package/src/plugins/defaults/memory/context-search/search.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +26 -23
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +1 -1
- package/src/plugins/defaults/memory/embeddings.ts +8 -40
- package/src/plugins/defaults/memory/filing-jobs.ts +1 -1
- package/src/plugins/defaults/memory/fork-conversation-memory.ts +8 -4
- package/src/plugins/defaults/memory/frontmatter.ts +1 -1
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +4 -25
- package/src/plugins/defaults/memory/graph/bootstrap.ts +13 -19
- package/src/plugins/defaults/memory/graph/capability-seed.ts +62 -33
- package/src/plugins/defaults/memory/graph/consolidation.ts +8 -15
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +12 -4
- package/src/plugins/defaults/memory/graph/decay.ts +5 -10
- package/src/plugins/defaults/memory/graph/extraction-job.ts +2 -3
- package/src/plugins/defaults/memory/graph/extraction.test.ts +1 -9
- package/src/plugins/defaults/memory/graph/extraction.ts +149 -64
- package/src/plugins/defaults/memory/graph/graph-search.test.ts +0 -6
- package/src/plugins/defaults/memory/graph/graph-search.ts +33 -15
- package/src/plugins/defaults/memory/graph/image-ref-utils.ts +7 -3
- package/src/plugins/defaults/memory/graph/injection.test.ts +0 -1
- package/src/plugins/defaults/memory/graph/injection.ts +1 -1
- package/src/plugins/defaults/memory/graph/narrative.ts +2 -4
- package/src/plugins/defaults/memory/graph/pattern-scan.ts +2 -5
- package/src/plugins/defaults/memory/graph/retriever.test.ts +27 -28
- package/src/plugins/defaults/memory/graph/retriever.ts +89 -42
- package/src/plugins/defaults/memory/graph/scoring.test.ts +0 -1
- package/src/plugins/defaults/memory/graph/store.test.ts +6 -58
- package/src/plugins/defaults/memory/graph/store.ts +5 -43
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +318 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +244 -8
- package/src/plugins/defaults/memory/graph/tools.ts +1 -1
- package/src/plugins/defaults/memory/graph/types.ts +0 -3
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +130 -0
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +303 -0
- package/src/plugins/defaults/memory/graph-topology/flag.ts +14 -0
- package/src/plugins/defaults/memory/graph-topology/types.ts +84 -0
- package/src/plugins/defaults/memory/hooks/init.ts +1 -1
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +10 -10
- package/src/plugins/defaults/memory/host-utils.ts +80 -0
- package/src/plugins/defaults/memory/identity-context.ts +39 -0
- package/src/plugins/defaults/memory/indexer.ts +18 -54
- package/src/plugins/defaults/memory/injectors.ts +5 -8
- package/src/plugins/defaults/memory/job-handler-registration.ts +0 -4
- package/src/plugins/defaults/memory/job-handlers/backfill.ts +10 -8
- package/src/plugins/defaults/memory/job-handlers/embedding.test.ts +0 -8
- package/src/plugins/defaults/memory/job-handlers/embedding.ts +31 -17
- package/src/plugins/defaults/memory/job-handlers/index-maintenance.ts +13 -6
- package/src/plugins/defaults/memory/job-handlers.ts +10 -9
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +0 -7
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +3 -3
- package/src/plugins/defaults/memory/jobs/embed-pkb-file.test.ts +41 -28
- package/src/plugins/defaults/memory/jobs/embed-pkb-file.ts +10 -5
- package/src/plugins/defaults/memory/jobs-worker.ts +161 -50
- package/src/plugins/defaults/memory/logging.ts +17 -0
- package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +143 -0
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +19 -7
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +5 -6
- package/src/plugins/defaults/memory/memory-retrospective-fork-boundary.ts +57 -20
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +220 -79
- package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +448 -0
- package/src/plugins/defaults/memory/memory-retrospective-startup-cleanup.ts +52 -39
- package/src/plugins/defaults/memory/memory-retrospective-state.ts +14 -10
- package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +8 -3
- package/src/plugins/defaults/memory/message-media.ts +80 -0
- package/src/plugins/defaults/memory/paths.ts +48 -0
- package/src/plugins/defaults/memory/pkb/autoinject.ts +1 -1
- package/src/plugins/defaults/memory/pkb/context.ts +2 -2
- package/src/plugins/defaults/memory/pkb/pkb-index.test.ts +25 -44
- package/src/plugins/defaults/memory/pkb/pkb-index.ts +24 -25
- package/src/plugins/defaults/memory/pkb/pkb-reconcile.test.ts +46 -34
- package/src/plugins/defaults/memory/pkb/pkb-reconcile.ts +4 -9
- package/src/plugins/defaults/memory/pkb/pkb-search.test.ts +5 -17
- package/src/plugins/defaults/memory/pkb/pkb-search.ts +2 -9
- package/src/plugins/defaults/memory/pkb/types.ts +1 -12
- package/src/plugins/defaults/memory/pkb-schedule.ts +2 -2
- package/src/plugins/defaults/memory/rerank-local.ts +3 -4
- package/src/plugins/defaults/memory/routes/__tests__/memory-v2-simulate-route.test.ts +9 -17
- package/src/plugins/defaults/memory/routes/memory-eval-routes.ts +2 -2
- package/src/plugins/defaults/memory/routes/memory-graph-routes.ts +71 -0
- package/src/plugins/defaults/memory/routes/memory-item-routes.test.ts +149 -9
- package/src/plugins/defaults/memory/routes/memory-item-routes.ts +147 -12
- package/src/plugins/defaults/memory/routes/memory-v2-routes.ts +7 -11
- package/src/plugins/defaults/memory/routes/memory-v3-routes.ts +1 -1
- package/src/plugins/defaults/memory/startup.ts +3 -4
- package/src/plugins/defaults/memory/task-memory-cleanup.ts +1 -1
- package/src/plugins/defaults/memory/tools.test.ts +1 -9
- package/src/plugins/defaults/memory/tools.ts +0 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +0 -5
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +0 -6
- package/src/plugins/defaults/memory/v2/__tests__/cli-command-store.test.ts +6 -6
- package/src/plugins/defaults/memory/v2/__tests__/consolidation-job.test.ts +48 -6
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +0 -5
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +0 -5
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +0 -5
- package/src/plugins/defaults/memory/v2/__tests__/injection-events.test.ts +61 -69
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +0 -5
- package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +0 -6
- package/src/plugins/defaults/memory/v2/__tests__/page-index.test.ts +0 -5
- package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +28 -0
- package/src/plugins/defaults/memory/v2/__tests__/qdrant.test.ts +3 -6
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +3 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +16 -27
- package/src/plugins/defaults/memory/v2/__tests__/sim.test.ts +0 -5
- package/src/plugins/defaults/memory/v2/__tests__/skill-content.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/skill-store.test.ts +56 -22
- package/src/plugins/defaults/memory/v2/__tests__/static-context.test.ts +9 -6
- package/src/plugins/defaults/memory/v2/__tests__/sweep-job.test.ts +6 -6
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +31 -16
- package/src/plugins/defaults/memory/v2/cli-command-content.ts +78 -0
- package/src/plugins/defaults/memory/v2/cli-command-store.ts +32 -11
- package/src/plugins/defaults/memory/v2/consolidation-job.ts +45 -5
- package/src/plugins/defaults/memory/v2/frontmatter-sweep.ts +1 -1
- package/src/plugins/defaults/memory/v2/harness/harness-types.ts +12 -0
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -8
- package/src/plugins/defaults/memory/v2/harness/router-retriever.ts +1 -8
- package/src/plugins/defaults/memory/v2/harness/trace.ts +1 -1
- package/src/plugins/defaults/memory/v2/injection-events.ts +34 -15
- package/src/plugins/defaults/memory/v2/injection.ts +3 -4
- package/src/plugins/defaults/memory/v2/memory-v2-startup.test.ts +0 -5
- package/src/plugins/defaults/memory/v2/memory-v2-startup.ts +2 -2
- package/src/plugins/defaults/memory/v2/migration.ts +1 -1
- package/src/plugins/defaults/memory/v2/page-index.ts +1 -1
- package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +6 -2
- package/src/plugins/defaults/memory/v2/prompts/router.ts +1 -1
- package/src/plugins/defaults/memory/v2/qdrant.ts +2 -2
- package/src/plugins/defaults/memory/v2/reranker.ts +2 -2
- package/src/plugins/defaults/memory/v2/router.ts +10 -20
- package/src/plugins/defaults/memory/v2/skill-content.ts +23 -4
- package/src/plugins/defaults/memory/v2/skill-store.ts +44 -43
- package/src/plugins/defaults/memory/v2/static-context.ts +7 -12
- package/src/plugins/defaults/memory/v2/sweep-job.ts +24 -13
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +19 -0
- package/src/plugins/defaults/memory/v3/__tests__/dense.test.ts +0 -5
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +17 -0
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +14 -4
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +23 -17
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +20 -6
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +2 -0
- package/src/plugins/defaults/memory/v3/__tests__/section-dense-store.test.ts +0 -5
- package/src/plugins/defaults/memory/v3/candidate-match.ts +20 -11
- package/src/plugins/defaults/memory/v3/dense.ts +1 -1
- package/src/plugins/defaults/memory/v3/injector.ts +1 -1
- package/src/plugins/defaults/memory/v3/learned-edges.test.ts +14 -0
- package/src/plugins/defaults/memory/v3/learned-edges.ts +6 -1
- package/src/plugins/defaults/memory/v3/maintain-job.ts +39 -31
- package/src/plugins/defaults/memory/v3/orchestrate.ts +1 -1
- package/src/plugins/defaults/memory/v3/page-content.ts +1 -1
- package/src/plugins/defaults/memory/v3/pool-select.ts +2 -3
- package/src/plugins/defaults/memory/v3/prune.test.ts +10 -0
- package/src/plugins/defaults/memory/v3/prune.ts +1 -1
- package/src/plugins/defaults/memory/v3/section-dense-store.ts +1 -1
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +1 -1
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +47 -25
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +31 -11
- package/src/plugins/defaults/memory/worker.ts +2 -2
- package/src/plugins/defaults/workspace/injectors.ts +116 -5
- package/src/plugins/mtime-cache.ts +207 -105
- package/src/plugins/pipeline.ts +195 -5
- package/src/plugins/surface-import.ts +52 -14
- package/src/plugins/types.ts +10 -15
- package/src/prompts/persona-resolver.ts +1 -1
- package/src/prompts/system-prompt.ts +2 -4
- package/src/prompts/templates/system-sections.ts +12 -0
- package/src/providers/__tests__/connection-model-compat.test.ts +0 -5
- package/src/providers/__tests__/count-tokens-forwarding.test.ts +1 -21
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +12 -6
- package/src/providers/__tests__/preflight-resolved-config.test.ts +189 -0
- package/src/providers/__tests__/registry-native-web-search.test.ts +21 -3
- package/src/providers/__tests__/retry-callsite.test.ts +207 -8
- package/src/providers/__tests__/satellite-connection-routing.test.ts +12 -6
- package/src/providers/__tests__/vellum-mismatch-routing.test.ts +0 -5
- package/src/providers/anthropic/client.ts +109 -7
- package/src/providers/anthropic-gateway-shared.ts +63 -0
- package/src/providers/call-site-routing.ts +1 -0
- package/src/providers/connection-resolution.ts +192 -6
- package/src/providers/content-block-schema.ts +149 -0
- package/src/providers/gemini/client.ts +84 -22
- package/src/providers/gemini/inline-media.ts +2 -3
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +5 -0
- package/src/providers/inference/__tests__/codex-token-refresh.test.ts +1 -15
- package/src/providers/inference/adapter-factory.ts +13 -0
- package/src/providers/inference/connection-availability.ts +193 -0
- package/src/providers/inference/connections.ts +6 -10
- package/src/providers/media-resolve.ts +193 -0
- package/src/providers/model-catalog.ts +337 -17
- package/src/providers/model-intents.ts +6 -0
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +98 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -0
- package/src/providers/openai/api-error-normalization.ts +61 -0
- package/src/providers/openai/chat-completions-provider.ts +73 -10
- package/src/providers/openai/responses-provider.ts +10 -3
- package/src/providers/openrouter/client.ts +6 -39
- package/src/providers/platform-proxy/constants.ts +4 -0
- package/src/providers/provider-availability.ts +23 -1
- package/src/providers/provider-send-message.ts +19 -3
- package/src/providers/registry.ts +5 -1
- package/src/providers/retry.ts +91 -29
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +31 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +393 -1
- package/src/providers/speech-to-text/deepgram-realtime.ts +213 -13
- package/src/providers/speech-to-text/resolve.ts +33 -5
- package/src/providers/types.ts +69 -24
- package/src/providers/vellum-model-routing.ts +11 -0
- package/src/providers/vercel-ai-gateway/client.ts +142 -0
- package/src/runtime/__tests__/actor-trust-resolver.test.ts +132 -0
- package/src/runtime/__tests__/agent-wake.test.ts +232 -16
- package/src/runtime/__tests__/background-job-runner.test.ts +71 -2
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +5 -15
- package/src/runtime/__tests__/local-principal-trust.test.ts +0 -6
- package/src/runtime/__tests__/member-verdict-cache.test.ts +2 -15
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +91 -30
- package/src/runtime/access-request-helper.ts +75 -3
- package/src/runtime/actor-trust-resolver.ts +33 -108
- package/src/runtime/agent-wake.ts +45 -25
- package/src/runtime/assistant-event-hub.ts +0 -105
- package/src/runtime/auth/__tests__/middleware.test.ts +1 -10
- package/src/runtime/auth/__tests__/route-policy.test.ts +0 -7
- package/src/runtime/auth/__tests__/token-service.test.ts +1 -8
- package/src/runtime/background-job-runner.ts +57 -2
- package/src/runtime/capabilities.ts +3 -3
- package/src/runtime/channel-reply-delivery.ts +38 -19
- package/src/runtime/channel-retry-sweep.ts +1 -1
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -3
- package/src/runtime/effective-capabilities.test.ts +0 -36
- package/src/runtime/effective-capabilities.ts +8 -23
- package/src/runtime/guardian-vellum-migration.ts +12 -16
- package/src/runtime/http-router-types.ts +119 -0
- package/src/runtime/http-router.ts +2 -115
- package/src/runtime/http-server.ts +11 -2
- package/src/runtime/http-types.ts +1 -1
- package/src/runtime/introduction-policy.ts +89 -0
- package/src/runtime/local-actor-identity.ts +4 -50
- package/src/runtime/local-principal-trust.ts +1 -1
- package/src/runtime/member-verdict-cache.ts +0 -0
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +51 -1
- package/src/runtime/migrations/__tests__/origin-mode.test.ts +62 -0
- package/src/runtime/migrations/gcs-signed-url.ts +21 -7
- package/src/runtime/migrations/origin-mode.ts +16 -11
- package/src/runtime/pending-interactions.ts +8 -3
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/backup-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +0 -16
- package/src/runtime/routes/__tests__/client-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +4 -5
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +8 -8
- package/src/runtime/routes/__tests__/contact-routes.test.ts +2 -3
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +31 -9
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +0 -8
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +260 -11
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/default-provider-routes.test.ts +499 -0
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/inference-callsites-routes.test.ts +54 -0
- package/src/runtime/routes/__tests__/inference-models-routes.test.ts +54 -0
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +403 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +219 -6
- package/src/runtime/routes/__tests__/inference-routes-registration.test.ts +42 -0
- package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +70 -15
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +182 -38
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -8
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/stt-routes.test.ts +0 -9
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/task-routes.test.ts +2 -2
- package/src/runtime/routes/__tests__/theme-routes.test.ts +66 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -9
- package/src/runtime/routes/__tests__/wake-conversation-routes.test.ts +0 -7
- package/src/runtime/routes/acp-routes.ts +20 -14
- package/src/runtime/routes/approval-routes.ts +21 -2
- package/src/runtime/routes/canned-message-complete.ts +82 -0
- package/src/runtime/routes/channel-metadata.ts +49 -0
- package/src/runtime/routes/contact-routes.ts +75 -43
- package/src/runtime/routes/conversation-attention-routes.ts +1 -1
- package/src/runtime/routes/conversation-cli-routes.ts +2 -2
- package/src/runtime/routes/conversation-compaction-routes.ts +5 -0
- package/src/runtime/routes/conversation-management-routes.ts +147 -2
- package/src/runtime/routes/conversation-query-routes.ts +378 -43
- package/src/runtime/routes/conversation-routes.ts +89 -181
- package/src/runtime/routes/conversation-starter-routes.ts +12 -23
- package/src/runtime/routes/credential-prompt-routes.ts +48 -4
- package/src/runtime/routes/credential-request-routes.ts +85 -0
- package/src/runtime/routes/credential-routes.ts +40 -5
- package/src/runtime/routes/default-provider-routes.ts +132 -0
- package/src/runtime/routes/errors.ts +17 -0
- package/src/runtime/routes/events-routes.ts +158 -39
- package/src/runtime/routes/guardian-approval-interception.ts +1 -1
- package/src/runtime/routes/http-adapter.ts +1 -1
- package/src/runtime/routes/inbound-message-handler.ts +61 -6
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +58 -26
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +73 -87
- package/src/runtime/routes/inbound-stages/admission-policy.ts +2 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +1 -8
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -2
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.test.ts +0 -5
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -1
- package/src/runtime/routes/inbound-stages/escalation-intercept.test.ts +0 -5
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +0 -9
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +0 -9
- package/src/runtime/routes/inbound-stages/reaction-intercept.test.ts +302 -0
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +27 -37
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +1 -1
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -9
- package/src/runtime/routes/index.ts +16 -4
- package/src/runtime/routes/inference-callsites-routes.ts +211 -0
- package/src/runtime/routes/inference-models-routes.ts +104 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +2 -1
- package/src/runtime/routes/inference-profiles-routes.ts +717 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +38 -1
- package/src/runtime/routes/inference-send-routes.ts +2 -1
- package/src/runtime/routes/integrations/slack/channels.ts +26 -4
- package/src/runtime/routes/integrations/slack/users.ts +78 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +44 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +2 -1
- package/src/runtime/routes/llm-request-logs-access.ts +19 -0
- package/src/runtime/routes/migration-routes.ts +94 -47
- package/src/runtime/routes/monitoring-routes.ts +1 -1
- package/src/runtime/routes/notification-routes.ts +1 -1
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +0 -7
- package/src/runtime/routes/plugins-routes.ts +169 -16
- package/src/runtime/routes/schedule-routes.ts +38 -1
- package/src/runtime/routes/secret-routes.ts +0 -7
- package/src/runtime/routes/settings-routes.ts +160 -22
- package/src/runtime/routes/skills-routes.ts +6 -0
- package/src/runtime/routes/subagents-routes.ts +17 -18
- package/src/runtime/routes/surface-action-routes.ts +4 -2
- package/src/runtime/routes/theme-routes.ts +36 -0
- package/src/runtime/routes/types.ts +2 -1
- package/src/runtime/routes/workflow-routes.ts +1 -1
- package/src/runtime/services/__tests__/auto-analysis-guard.test.ts +2 -16
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -1
- package/src/runtime/services/auto-analysis-guard.ts +5 -5
- package/src/runtime/services/conversation-serializer.ts +2 -3
- package/src/runtime/sync/resource-sync-events.ts +4 -0
- package/src/runtime/trust-context-resolver.ts +9 -9
- package/src/runtime/trust-verdict-consumer.ts +46 -5
- package/src/schedule/scheduler.ts +61 -18
- package/src/security/__tests__/oauth2-device-code.test.ts +12 -60
- package/src/security/__tests__/provider-key-env-fallback.test.ts +0 -10
- package/src/security/__tests__/secret-normalize.test.ts +96 -0
- package/src/security/secret-normalize.ts +41 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/security/secure-keys.ts +222 -49
- package/src/sequence/engine.ts +15 -6
- package/src/signals/user-message.ts +3 -1
- package/src/skills/available-skills.ts +134 -0
- package/src/skills/install-meta.ts +8 -0
- package/src/skills/managed-store.ts +10 -0
- package/src/stt/types.ts +33 -2
- package/src/subagent/manager.ts +5 -6
- package/src/tasks/SPEC.md +10 -17
- package/src/tasks/tool-sanitizer.ts +3 -1
- package/src/telemetry/__tests__/config-setting-events-store.test.ts +126 -0
- package/src/telemetry/__tests__/flush-checkpoints.test.ts +56 -0
- package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -8
- package/src/telemetry/config-setting-events-store.ts +97 -0
- package/src/telemetry/flush-checkpoints.ts +70 -0
- package/src/telemetry/skill-loaded-events-store.test.ts +0 -8
- package/src/telemetry/telemetry-event-sources.ts +571 -0
- package/src/telemetry/tool-audit.ts +285 -0
- package/src/telemetry/tool-executed-events-store.test.ts +19 -27
- package/src/telemetry/tool-executed-events-store.ts +5 -5
- package/src/telemetry/turn-events-store.ts +36 -0
- package/src/telemetry/turn-outcome.ts +116 -0
- package/src/telemetry/turn-trace-store.test.ts +156 -8
- package/src/telemetry/turn-trace-store.ts +53 -4
- package/src/telemetry/types.ts +91 -2
- package/src/telemetry/usage-telemetry-reporter.test.ts +373 -119
- package/src/telemetry/usage-telemetry-reporter.ts +110 -675
- package/src/telemetry/watchdog-direct-emit.test.ts +0 -5
- package/src/theme/workspace-theme.test.ts +269 -0
- package/src/theme/workspace-theme.ts +304 -0
- package/src/tools/AGENTS.md +0 -26
- package/src/tools/acp/spawn.test.ts +0 -7
- package/src/tools/browser/browser-execution.ts +99 -75
- package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +1 -11
- package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +0 -10
- package/src/tools/browser/network-recorder.test.ts +0 -11
- package/src/tools/document/document-comment-tool.test.ts +1 -7
- package/src/tools/execution-target.test.ts +31 -0
- package/src/tools/execution-target.ts +1 -1
- package/src/tools/executor.ts +63 -275
- package/src/tools/filesystem/write.ts +0 -2
- package/src/tools/host-terminal/host-shell.test.ts +0 -7
- package/src/tools/host-terminal/host-shell.ts +6 -49
- package/src/tools/permission-checker.ts +33 -81
- package/src/tools/registry.ts +261 -166
- package/src/tools/run-standalone.ts +6 -13
- package/src/tools/side-effects.ts +0 -1
- package/src/tools/skills/find-similar-skills.test.ts +5 -9
- package/src/tools/skills/scaffold-managed.ts +31 -4
- package/src/tools/skills/skill-script-runner.ts +17 -31
- package/src/tools/skills/skill-tool-factory.ts +2 -6
- package/src/tools/subagent/read.ts +6 -4
- package/src/tools/subagent/spawn.ts +28 -29
- package/src/tools/terminal/safe-env.ts +8 -3
- package/src/tools/terminal/shell.test.ts +0 -6
- package/src/tools/terminal/shell.ts +1 -50
- package/src/tools/tool-approval-handler.ts +99 -166
- package/src/tools/tool-defaults.ts +2 -6
- package/src/tools/tool-manifest.ts +0 -49
- package/src/{events/tool-profiling-listener.ts → tools/tool-profiler.ts} +64 -32
- package/src/tools/tool-types.ts +4 -95
- package/src/tools/types.ts +27 -140
- package/src/tools/workflows/manage-workflows.ts +2 -1
- package/src/tools/workflows/run-workflow.test.ts +6 -1
- package/src/tools/workflows/run-workflow.ts +2 -4
- package/src/tools/workspace-tools/loader.ts +26 -14
- package/src/tts/__tests__/pcm-chunk-aligner.test.ts +48 -0
- package/src/tts/__tests__/pcm-sample-rates.test.ts +59 -0
- package/src/tts/__tests__/provider-adapters.test.ts +891 -22
- package/src/tts/__tests__/provider-catalog.test.ts +43 -10
- package/src/tts/__tests__/speakable-segments.test.ts +427 -0
- package/src/tts/__tests__/synthesis-stream.test.ts +5 -1
- package/src/tts/pcm-chunk-aligner.ts +29 -0
- package/src/tts/pcm-sample-rates.ts +47 -0
- package/src/tts/provider-definition.ts +6 -7
- package/src/tts/providers/__tests__/xai-tts-socket.test.ts +406 -0
- package/src/tts/providers/deepgram-provider.ts +160 -102
- package/src/tts/providers/elevenlabs-provider.ts +182 -105
- package/src/tts/providers/fish-audio-provider.ts +72 -105
- package/src/tts/providers/xai-provider.ts +131 -22
- package/src/tts/providers/xai-tts-socket.ts +311 -0
- package/src/tts/speakable-segments.ts +188 -0
- package/src/tts/stream-read.ts +136 -0
- package/src/tts/synthesis-stream.ts +9 -5
- package/src/tts/synthesize-text.ts +15 -5
- package/src/tts/types.ts +21 -0
- package/src/usage/attribution.ts +43 -9
- package/src/util/errors.ts +26 -0
- package/src/util/image-conversion.ts +23 -5
- package/src/util/logger.ts +67 -68
- package/src/util/platform.ts +19 -60
- package/src/util/pricing.ts +14 -11
- package/src/util/process-tree.ts +25 -13
- package/src/util/provider-error-patterns.ts +21 -0
- package/src/util/sqlite-query-label.ts +51 -0
- package/src/util/sqlite-retry.ts +14 -2
- package/src/util/unicode.ts +1 -1
- package/src/watcher/__tests__/engine-auth-notify.test.ts +316 -0
- package/src/watcher/engine.ts +87 -2
- package/src/workflows/capabilities.test.ts +2 -32
- package/src/workflows/capabilities.ts +18 -25
- package/src/workflows/engine-integration.test.ts +1 -7
- package/src/workflows/engine.test.ts +2 -10
- package/src/workflows/engine.ts +1 -1
- package/src/workflows/fanout-load.test.ts +1 -1
- package/src/workflows/journal-store.test.ts +1 -9
- package/src/workflows/leaf-runner.test.ts +0 -6
- package/src/workflows/leaf-runner.ts +4 -5
- package/src/workflows/library.test.ts +1 -9
- package/src/workflows/run-manager.test.ts +2 -10
- package/src/workflows/run-manager.ts +2 -4
- package/src/workspace/adaptive-thinking-repair.ts +1 -1
- package/src/workspace/custom-profile-ensure.ts +133 -0
- package/src/workspace/default-provider-ensure.ts +162 -0
- package/src/workspace/git-service.ts +160 -15
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +0 -1
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +1 -1
- package/src/workspace/migrations/126-strip-managed-profile-bodies.ts +92 -0
- package/src/workspace/migrations/127-backfill-default-provider.ts +176 -0
- package/src/workspace/migrations/128-repair-stale-openrouter-grok-model-ids.ts +112 -0
- package/src/workspace/migrations/129-remove-analyze-conversation-config.ts +59 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/grants.test.ts +0 -686
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/grants.ts +0 -184
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/rendering.ts +0 -135
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/grants.test.ts +0 -686
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/grants.ts +0 -184
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/rendering.ts +0 -135
- package/node_modules/@vellumai/service-contracts/src/__tests__/grants.test.ts +0 -686
- package/node_modules/@vellumai/service-contracts/src/grants.ts +0 -184
- package/node_modules/@vellumai/service-contracts/src/rendering.ts +0 -135
- package/scripts/generate-bundled-tool-registry.ts +0 -223
- package/scripts/test.sh +0 -494
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +0 -255
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +0 -137
- package/src/__tests__/auto-analysis-end-to-end.test.ts +0 -621
- package/src/__tests__/auto-analysis-prompt.test.ts +0 -50
- package/src/__tests__/config-analysis.test.ts +0 -83
- package/src/__tests__/conversation-analysis-routes.test.ts +0 -156
- package/src/__tests__/credential-execution-admin-cli.test.ts +0 -504
- package/src/__tests__/credential-execution-approval-bridge.test.ts +0 -297
- package/src/__tests__/credential-execution-feature-gates.test.ts +0 -185
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -120
- package/src/__tests__/credential-execution-tools.test.ts +0 -289
- package/src/__tests__/db-proxy-transaction.test.ts +0 -206
- package/src/__tests__/event-bus.test.ts +0 -222
- package/src/__tests__/reaction-intercept-cold-cache-warm.test.ts +0 -141
- package/src/__tests__/reaction-intercept-member-verdict-warm.test.ts +0 -157
- package/src/__tests__/skill-memory.test.ts +0 -85
- package/src/__tests__/skill-runtime-path.test.ts +0 -63
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -216
- package/src/__tests__/tool-metrics-listener.test.ts +0 -194
- package/src/__tests__/tool-profiling-listener.test.ts +0 -219
- package/src/cli/commands/credential-execution.ts +0 -362
- package/src/config/__tests__/bundled-tool-registry-guard.test.ts +0 -120
- package/src/config/bundled-tool-registry.ts +0 -281
- package/src/config/schemas/analysis.ts +0 -32
- package/src/credential-execution/approval-bridge.ts +0 -320
- package/src/credential-execution/feature-gates.ts +0 -61
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +0 -449
- package/src/events/bus.ts +0 -177
- package/src/events/domain-events.ts +0 -68
- package/src/events/tool-audit-listener.ts +0 -184
- package/src/events/tool-domain-event-publisher.ts +0 -90
- package/src/events/tool-metrics-listener.ts +0 -134
- package/src/events/tool-permission-telemetry-listener.ts +0 -44
- package/src/instrument.ts +0 -213
- package/src/ipc/routes/db-proxy-transaction.ts +0 -151
- package/src/plugins/defaults/memory/__tests__/find-analysis-conversation.test.ts +0 -197
- package/src/runtime/routes/conversation-analysis-routes.ts +0 -75
- package/src/runtime/routes/work-items-routes.test.ts +0 -74
- package/src/runtime/routes/work-items-routes.ts +0 -881
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +0 -477
- package/src/runtime/services/__tests__/auto-analysis-enqueue.test.ts +0 -386
- package/src/runtime/services/__tests__/auto-analysis-prompt.test.ts +0 -53
- package/src/runtime/services/__tests__/conversation-analyze-job.test.ts +0 -213
- package/src/runtime/services/__tests__/manual-analysis-prompt.test.ts +0 -41
- package/src/runtime/services/analyze-conversation.ts +0 -332
- package/src/runtime/services/auto-analysis-enqueue.ts +0 -130
- package/src/runtime/services/auto-analysis-prompt.ts +0 -55
- package/src/runtime/services/conversation-analyze-job.ts +0 -53
- package/src/skills/skill-memory.ts +0 -44
- package/src/tools/credential-execution/make-authenticated-request.ts +0 -198
- package/src/tools/credential-execution/manage-secure-command-tool.ts +0 -371
- package/src/tools/credential-execution/run-authenticated-command.ts +0 -261
- package/src/tools/flag-gated-tools.test.ts +0 -76
- package/src/util/sentry-log-stream.ts +0 -51
|
@@ -14,10 +14,11 @@ import {
|
|
|
14
14
|
like,
|
|
15
15
|
lt,
|
|
16
16
|
lte,
|
|
17
|
+
notInArray,
|
|
17
18
|
or,
|
|
18
19
|
sql,
|
|
19
20
|
} from "drizzle-orm";
|
|
20
|
-
import { v4 as uuid } from "uuid";
|
|
21
|
+
import { v4 as uuid, v7 as uuidv7 } from "uuid";
|
|
21
22
|
import { z } from "zod";
|
|
22
23
|
|
|
23
24
|
import type { ChannelId, InterfaceId } from "../channels/types.js";
|
|
@@ -27,13 +28,14 @@ import { getConfig } from "../config/loader.js";
|
|
|
27
28
|
import { findDisplayTurnEndIndex } from "../conversations/message-consolidation.js";
|
|
28
29
|
import { findConversation } from "../daemon/conversation-registry.js";
|
|
29
30
|
import { conversationMetadataSyncTag } from "../daemon/message-types/sync.js";
|
|
30
|
-
import type { TrustContext } from "../daemon/trust-context.js";
|
|
31
|
+
import type { TrustContext } from "../daemon/trust-context-types.js";
|
|
31
32
|
import { clearAllConversationIds } from "../home/feed-writer.js";
|
|
32
33
|
import type { ConversationDeletedInputContext } from "../hooks/types.js";
|
|
33
34
|
import { HOOKS } from "../plugin-api/constants.js";
|
|
34
35
|
import { forkConversationMemory } from "../plugins/defaults/memory/fork-conversation-memory.js";
|
|
35
36
|
import { indexMessageNow } from "../plugins/defaults/memory/indexer.js";
|
|
36
37
|
import { runHook } from "../plugins/pipeline.js";
|
|
38
|
+
import type { ContentBlock } from "../providers/types.js";
|
|
37
39
|
import { getCurrentSeq } from "../runtime/assistant-stream-state.js";
|
|
38
40
|
import { publishSyncInvalidation } from "../runtime/sync/sync-publisher.js";
|
|
39
41
|
import { trustClassSchema } from "../runtime/trust-class.js";
|
|
@@ -48,7 +50,6 @@ import {
|
|
|
48
50
|
deleteOrphanAttachments,
|
|
49
51
|
linkAttachmentToMessage,
|
|
50
52
|
} from "./attachments-store.js";
|
|
51
|
-
import { AUTO_ANALYSIS_SOURCE } from "./auto-analysis-constants.js";
|
|
52
53
|
import {
|
|
53
54
|
appendCompactionEvent,
|
|
54
55
|
forkCompactionLedger,
|
|
@@ -67,6 +68,10 @@ import {
|
|
|
67
68
|
import { ensureDisplayOrderMigration } from "./conversation-display-order-migration.js";
|
|
68
69
|
import { ensureGroupMigration } from "./conversation-group-migration.js";
|
|
69
70
|
import { deleteConversationRowsInBatches } from "./conversation-row-batch-delete.js";
|
|
71
|
+
import {
|
|
72
|
+
BACKGROUND_CONVERSATION_TYPES,
|
|
73
|
+
type ConversationCreateType,
|
|
74
|
+
} from "./conversation-types.js";
|
|
70
75
|
import { runAsyncSqlite } from "./db-async-query.js";
|
|
71
76
|
import {
|
|
72
77
|
type DrizzleDb,
|
|
@@ -84,7 +89,9 @@ import {
|
|
|
84
89
|
enqueueLexicalIndexForMessage,
|
|
85
90
|
enqueuePurgeConversationLexical,
|
|
86
91
|
} from "./job-handlers/message-lexical.js";
|
|
92
|
+
import { resolveMessageContentBlocks } from "./message-content-file.js";
|
|
87
93
|
import {
|
|
94
|
+
rawAll,
|
|
88
95
|
rawExec,
|
|
89
96
|
rawGet,
|
|
90
97
|
rawLogsRun,
|
|
@@ -187,6 +194,17 @@ export const messageMetadataSchema = z
|
|
|
187
194
|
* and read gate (conversation history loading) to enforce trust-aware access.
|
|
188
195
|
*/
|
|
189
196
|
provenanceTrustClass: trustClassSchema.optional(),
|
|
197
|
+
/**
|
|
198
|
+
* Model that actually served this assistant row, carried on the agent
|
|
199
|
+
* loop's `message_complete` event (the provider's `response.model`, the
|
|
200
|
+
* same value `llm_usage` records) and persisted with the finalized content.
|
|
201
|
+
* Reflects per-call reroutes by a `pre-model-call` hook. Present only on
|
|
202
|
+
* assistant rows produced by a real model call; absent on user rows,
|
|
203
|
+
* tool-result rows, and synthetic assistant rows (provider-error / yield
|
|
204
|
+
* notices). Turn-trace assembly surfaces it as the per-message
|
|
205
|
+
* `TurnTraceMessage.model`.
|
|
206
|
+
*/
|
|
207
|
+
model: z.string().optional(),
|
|
190
208
|
provenanceSourceChannel: channelIdSchema.optional(),
|
|
191
209
|
provenanceGuardianExternalUserId: z.string().optional(),
|
|
192
210
|
provenanceRequesterIdentifier: z.string().optional(),
|
|
@@ -377,7 +395,6 @@ export interface ConversationRow {
|
|
|
377
395
|
slackContextCompactionWatermarkAt: number | null;
|
|
378
396
|
conversationType: string;
|
|
379
397
|
source: string;
|
|
380
|
-
memoryScopeId: string;
|
|
381
398
|
originChannel: string | null;
|
|
382
399
|
originInterface: string | null;
|
|
383
400
|
forkParentConversationId: string | null;
|
|
@@ -415,7 +432,6 @@ export const parseConversation = createRowMapper<
|
|
|
415
432
|
slackContextCompactionWatermarkAt: "slackContextCompactionWatermarkAt",
|
|
416
433
|
conversationType: "conversationType",
|
|
417
434
|
source: "source",
|
|
418
|
-
memoryScopeId: "memoryScopeId",
|
|
419
435
|
originChannel: "originChannel",
|
|
420
436
|
originInterface: "originInterface",
|
|
421
437
|
forkParentConversationId: "forkParentConversationId",
|
|
@@ -443,24 +459,31 @@ export interface MessageRow {
|
|
|
443
459
|
id: string;
|
|
444
460
|
conversationId: string;
|
|
445
461
|
role: string;
|
|
446
|
-
|
|
462
|
+
/**
|
|
463
|
+
* Typed content blocks, resolved at the row-fetch chokepoint by
|
|
464
|
+
* `resolveMessageContentBlocks`: inline JSON parses, file-backed
|
|
465
|
+
* `{ ref }` rows fold their delta file, and legacy plain strings arrive
|
|
466
|
+
* wrapped in a single text block.
|
|
467
|
+
*/
|
|
468
|
+
content: ContentBlock[];
|
|
447
469
|
createdAt: number;
|
|
448
470
|
metadata: string | null;
|
|
449
471
|
clientMessageId: string | null;
|
|
472
|
+
/** 1 = content is complete; 0 = message is still streaming. */
|
|
473
|
+
finalized: number;
|
|
450
474
|
}
|
|
451
475
|
|
|
452
476
|
const parseMessage = createRowMapper<typeof messages.$inferSelect, MessageRow>({
|
|
453
477
|
id: "id",
|
|
454
478
|
conversationId: "conversationId",
|
|
455
479
|
role: "role",
|
|
456
|
-
content: "content",
|
|
480
|
+
content: { from: "content", transform: resolveMessageContentBlocks },
|
|
457
481
|
createdAt: "createdAt",
|
|
458
482
|
metadata: "metadata",
|
|
459
483
|
clientMessageId: "clientMessageId",
|
|
484
|
+
finalized: "finalized",
|
|
460
485
|
});
|
|
461
486
|
|
|
462
|
-
export type ConversationCreateType = "standard" | "background" | "scheduled";
|
|
463
|
-
|
|
464
487
|
/**
|
|
465
488
|
* Monotonic timestamp source for message ordering. Two messages saved within
|
|
466
489
|
* the same millisecond (e.g., tool_results user message + assistant message in
|
|
@@ -493,10 +516,12 @@ interface InsertMessageCoreParams {
|
|
|
493
516
|
conversationId: string;
|
|
494
517
|
role: MessageRole;
|
|
495
518
|
content: string;
|
|
519
|
+
/** 0 = row is born streaming (content is an in-flight `{ ref }`). Defaults to 1. */
|
|
520
|
+
finalized?: 0 | 1;
|
|
496
521
|
metadata?: Record<string, unknown>;
|
|
497
522
|
clientMessageId?: string;
|
|
498
|
-
/** Pre-assigned message ID. When omitted,
|
|
499
|
-
*
|
|
523
|
+
/** Pre-assigned message ID. When omitted, a time-ordered `uuidv7()` is
|
|
524
|
+
* generated. Callers that already have a correlation ID (e.g.
|
|
500
525
|
* `requestId` for user turns) can pass it here so the persisted
|
|
501
526
|
* row ID matches the runtime request ID. */
|
|
502
527
|
id?: string;
|
|
@@ -526,10 +551,19 @@ interface InsertMessageCoreParams {
|
|
|
526
551
|
async function insertMessageCore(
|
|
527
552
|
params: InsertMessageCoreParams,
|
|
528
553
|
): Promise<InsertedMessage> {
|
|
529
|
-
const {
|
|
530
|
-
|
|
554
|
+
const {
|
|
555
|
+
conversationId,
|
|
556
|
+
role,
|
|
557
|
+
content,
|
|
558
|
+
finalized,
|
|
559
|
+
metadata,
|
|
560
|
+
clientMessageId,
|
|
561
|
+
id,
|
|
562
|
+
} = params;
|
|
531
563
|
const db = getDb();
|
|
532
|
-
|
|
564
|
+
// Time-ordered UUIDv7 so server-generated message ids append to the tail of
|
|
565
|
+
// the WITHOUT ROWID `messages` primary key instead of scattering (v4).
|
|
566
|
+
const messageId = id ?? uuidv7();
|
|
533
567
|
|
|
534
568
|
if (metadata) {
|
|
535
569
|
const result = messageMetadataSchema.safeParse(metadata);
|
|
@@ -561,6 +595,7 @@ async function insertMessageCore(
|
|
|
561
595
|
role,
|
|
562
596
|
content,
|
|
563
597
|
createdAt: now,
|
|
598
|
+
...(finalized !== undefined ? { finalized } : {}),
|
|
564
599
|
...(metadataStr ? { metadata: metadataStr } : {}),
|
|
565
600
|
...(clientMessageId ? { clientMessageId } : {}),
|
|
566
601
|
};
|
|
@@ -669,6 +704,13 @@ export function createConversation(
|
|
|
669
704
|
titleOrOpts?:
|
|
670
705
|
| string
|
|
671
706
|
| {
|
|
707
|
+
/**
|
|
708
|
+
* Adopt an explicit conversation id instead of minting a new uuid.
|
|
709
|
+
* Callers that already hold a client-provided id and want the row to
|
|
710
|
+
* carry it verbatim (e.g. {@link ensureConversationExists}) pass it
|
|
711
|
+
* here; everyone else omits it and gets a fresh uuid.
|
|
712
|
+
*/
|
|
713
|
+
id?: string;
|
|
672
714
|
title?: string;
|
|
673
715
|
/**
|
|
674
716
|
* Override the `is_auto_title` column (schema default 1). Pass
|
|
@@ -696,8 +738,8 @@ export function createConversation(
|
|
|
696
738
|
requestedConversationType ?? "standard";
|
|
697
739
|
const source = opts.source ?? "user";
|
|
698
740
|
const groupId = opts.groupId;
|
|
699
|
-
|
|
700
|
-
const
|
|
741
|
+
// Time-ordered UUIDv7 for server-minted conversation ids (see message id).
|
|
742
|
+
const id = opts.id ?? uuidv7();
|
|
701
743
|
|
|
702
744
|
// Ensure group_id column exists for deterministic schema readiness,
|
|
703
745
|
// even when this conversation has no groupId (a subsequent query or
|
|
@@ -722,7 +764,6 @@ export function createConversation(
|
|
|
722
764
|
slackContextCompactionWatermarkAt: null as number | null,
|
|
723
765
|
conversationType,
|
|
724
766
|
source,
|
|
725
|
-
memoryScopeId,
|
|
726
767
|
scheduleJobId: opts.scheduleJobId ?? null,
|
|
727
768
|
forkParentConversationId: opts.forkParentConversationId ?? null,
|
|
728
769
|
// Snapshot↔stream alignment baseline, captured at the creation instant.
|
|
@@ -764,6 +805,58 @@ export function createConversation(
|
|
|
764
805
|
return conversation;
|
|
765
806
|
}
|
|
766
807
|
|
|
808
|
+
/**
|
|
809
|
+
* A conversation id adopted verbatim from an untrusted source must be safe to
|
|
810
|
+
* embed as a single path component of the on-disk conversation dir
|
|
811
|
+
* (`<timestamp>_<id>/meta.json`). This pattern admits server uuids and the
|
|
812
|
+
* web client's `crypto.randomUUID()` / `draft-<ts>-<hex>` drafts while
|
|
813
|
+
* rejecting anything with path separators, `..`, or other traversal vectors.
|
|
814
|
+
*/
|
|
815
|
+
const ADOPTABLE_CONVERSATION_ID_RE = /^[A-Za-z0-9_-]{1,128}$/;
|
|
816
|
+
|
|
817
|
+
/**
|
|
818
|
+
* Ensure a `conversations` row exists for `id`, creating one with default
|
|
819
|
+
* columns only when absent. Idempotent. Returns `true` iff this call inserted
|
|
820
|
+
* the row (so callers can emit a one-time creation side effect, e.g. a
|
|
821
|
+
* conversations-list invalidation).
|
|
822
|
+
*
|
|
823
|
+
* The normal text-send path persists the conversation row through the
|
|
824
|
+
* conversation-key store before the first message is written, so `messages`
|
|
825
|
+
* inserts always have their FK target. Entry points that adopt a
|
|
826
|
+
* client-provided conversation id directly — notably the live-voice session,
|
|
827
|
+
* which binds to the id from its start frame — have no such guarantee: on the
|
|
828
|
+
* first turn of a brand-new chat the row does not exist yet, and persisting
|
|
829
|
+
* the user message trips `FOREIGN KEY constraint failed`. Call this before the
|
|
830
|
+
* first persist to close that gap while keeping the adopted id verbatim.
|
|
831
|
+
*
|
|
832
|
+
* Because the id is adopted verbatim and reaches the filesystem via
|
|
833
|
+
* `createConversation` → `initConversationDir`, an id from an external client
|
|
834
|
+
* is validated first — a value like `../../tmp/x` would otherwise write
|
|
835
|
+
* `meta.json` outside the conversations directory.
|
|
836
|
+
*/
|
|
837
|
+
export function ensureConversationExists(id: string): boolean {
|
|
838
|
+
if (getConversation(id)) {
|
|
839
|
+
return false;
|
|
840
|
+
}
|
|
841
|
+
if (!ADOPTABLE_CONVERSATION_ID_RE.test(id)) {
|
|
842
|
+
throw new Error(
|
|
843
|
+
`Refusing to adopt unsafe conversation id: ${JSON.stringify(id)}`,
|
|
844
|
+
);
|
|
845
|
+
}
|
|
846
|
+
try {
|
|
847
|
+
createConversation({ id });
|
|
848
|
+
return true;
|
|
849
|
+
} catch (err) {
|
|
850
|
+
// A concurrent caller may have created the row between the check and the
|
|
851
|
+
// insert (UNIQUE(id) violation). That's the desired end state, so only
|
|
852
|
+
// rethrow if the row still isn't there.
|
|
853
|
+
if (!getConversation(id)) {
|
|
854
|
+
throw err;
|
|
855
|
+
}
|
|
856
|
+
return false;
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
|
|
767
860
|
export function getConversation(id: string): ConversationRow | null {
|
|
768
861
|
const db = getDb();
|
|
769
862
|
const row = db
|
|
@@ -791,41 +884,9 @@ export function countConversationsByScheduleJobId(
|
|
|
791
884
|
);
|
|
792
885
|
}
|
|
793
886
|
|
|
794
|
-
/**
|
|
795
|
-
* Find the rolling analysis conversation for a given source conversation,
|
|
796
|
-
* or null if none exists yet. Used by the auto-analyze loop to append
|
|
797
|
-
* to an existing analysis conversation rather than creating a new one
|
|
798
|
-
* each time the analyze job fires.
|
|
799
|
-
*
|
|
800
|
-
* Returns the most recently updated match if multiple exist (defensive —
|
|
801
|
-
* shouldn't happen in normal operation but the contract is well-defined).
|
|
802
|
-
*
|
|
803
|
-
* Hits `idx_conversations_fork_parent_conversation_id` for the
|
|
804
|
-
* `forkParentConversationId` lookup.
|
|
805
|
-
*/
|
|
806
|
-
export function findAnalysisConversationFor(
|
|
807
|
-
parentConversationId: string,
|
|
808
|
-
): { id: string } | null {
|
|
809
|
-
const db = getDb();
|
|
810
|
-
const row = db
|
|
811
|
-
.select({ id: conversations.id })
|
|
812
|
-
.from(conversations)
|
|
813
|
-
.where(
|
|
814
|
-
and(
|
|
815
|
-
eq(conversations.source, AUTO_ANALYSIS_SOURCE),
|
|
816
|
-
eq(conversations.forkParentConversationId, parentConversationId),
|
|
817
|
-
),
|
|
818
|
-
)
|
|
819
|
-
.orderBy(desc(conversations.updatedAt))
|
|
820
|
-
.limit(1)
|
|
821
|
-
.get();
|
|
822
|
-
return row ? { id: row.id } : null;
|
|
823
|
-
}
|
|
824
|
-
|
|
825
887
|
/**
|
|
826
888
|
* Returns the `source` column for the given conversation, or null if
|
|
827
|
-
* not found. Tiny convenience used by the
|
|
828
|
-
* auto-analyze loop.
|
|
889
|
+
* not found. Tiny convenience used by the auto-analysis legacy-row guard.
|
|
829
890
|
*/
|
|
830
891
|
export function getConversationSource(conversationId: string): string | null {
|
|
831
892
|
const db = getDb();
|
|
@@ -1024,7 +1085,7 @@ export function forkConversation(params: {
|
|
|
1024
1085
|
} | null = null;
|
|
1025
1086
|
|
|
1026
1087
|
const forkedMessageValues = messagesToCopy.map((message) => {
|
|
1027
|
-
const forkedMessageId =
|
|
1088
|
+
const forkedMessageId = uuidv7();
|
|
1028
1089
|
forkedMessageIds.set(message.id, forkedMessageId);
|
|
1029
1090
|
|
|
1030
1091
|
if (message.role === "assistant") {
|
|
@@ -1038,7 +1099,7 @@ export function forkConversation(params: {
|
|
|
1038
1099
|
id: forkedMessageId,
|
|
1039
1100
|
conversationId: fc.id,
|
|
1040
1101
|
role: message.role,
|
|
1041
|
-
content: message.content,
|
|
1102
|
+
content: JSON.stringify(message.content),
|
|
1042
1103
|
createdAt: message.createdAt,
|
|
1043
1104
|
metadata: cloneForkMessageMetadata(message.metadata, message.id),
|
|
1044
1105
|
};
|
|
@@ -1095,15 +1156,26 @@ interface PopulateForkContentsArgs {
|
|
|
1095
1156
|
/** Source→fork message-id map for every copied row. */
|
|
1096
1157
|
forkedMessageIds: Map<string, string>;
|
|
1097
1158
|
latestForkedAssistant: { messageId: string; messageAt: number } | null;
|
|
1098
|
-
/**
|
|
1159
|
+
/**
|
|
1160
|
+
* True when the fork branches from the source's tip, so its rendered window
|
|
1161
|
+
* equals the source's and the wholesale memory-state carry is valid.
|
|
1162
|
+
*/
|
|
1099
1163
|
isFullHistoryFork: boolean;
|
|
1100
1164
|
/**
|
|
1101
|
-
* Count of leading
|
|
1102
|
-
* (0 when the
|
|
1103
|
-
*
|
|
1104
|
-
*
|
|
1165
|
+
* Count of leading `messagesToCopy` entries behind the compaction event this
|
|
1166
|
+
* fork inherits (0 when the copied range already starts at the visible
|
|
1167
|
+
* window, or the fork branches from uncompacted history). Memory-slug
|
|
1168
|
+
* seeding skips this prefix, since rows behind the fork's summary are not
|
|
1169
|
+
* rendered and must stay re-injectable.
|
|
1105
1170
|
*/
|
|
1106
1171
|
inheritedCompactedMessageCount: number;
|
|
1172
|
+
/**
|
|
1173
|
+
* When true, the source's compaction-event ledger is not copied into the
|
|
1174
|
+
* fork. Set by the retrospective fork whenever it inherits a compaction —
|
|
1175
|
+
* it seeds its own count-adjusted event instead, since the source events'
|
|
1176
|
+
* `compactedMessageCount` values index source-space row positions.
|
|
1177
|
+
*/
|
|
1178
|
+
skipCompactionLedgerCopy?: boolean;
|
|
1107
1179
|
/**
|
|
1108
1180
|
* When provided, a disk-sync entry is appended per copied message for the
|
|
1109
1181
|
* caller to flush after commit. Omitted by the retrospective fork, whose
|
|
@@ -1136,6 +1208,7 @@ function populateForkContentsInProcess(args: PopulateForkContentsArgs): void {
|
|
|
1136
1208
|
latestForkedAssistant,
|
|
1137
1209
|
isFullHistoryFork,
|
|
1138
1210
|
inheritedCompactedMessageCount,
|
|
1211
|
+
skipCompactionLedgerCopy,
|
|
1139
1212
|
diskSyncQueue,
|
|
1140
1213
|
} = args;
|
|
1141
1214
|
const db = getDb();
|
|
@@ -1159,7 +1232,8 @@ function populateForkContentsInProcess(args: PopulateForkContentsArgs): void {
|
|
|
1159
1232
|
const uncachedAttachmentLinks = attachmentLinks.filter(
|
|
1160
1233
|
(link) => !attachmentIdMap.has(link.attachmentId),
|
|
1161
1234
|
);
|
|
1162
|
-
const stagingMessageId =
|
|
1235
|
+
const stagingMessageId =
|
|
1236
|
+
uncachedAttachmentLinks.length > 0 ? uuidv7() : null;
|
|
1163
1237
|
|
|
1164
1238
|
if (stagingMessageId) {
|
|
1165
1239
|
db.insert(messages)
|
|
@@ -1239,13 +1313,17 @@ function populateForkContentsInProcess(args: PopulateForkContentsArgs): void {
|
|
|
1239
1313
|
});
|
|
1240
1314
|
|
|
1241
1315
|
// Carry the source's compaction events that predate the fork boundary so the
|
|
1242
|
-
// fork owns a correct ledger for its own future forks/compactions.
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1316
|
+
// fork owns a correct ledger for its own future forks/compactions. The
|
|
1317
|
+
// tail-only retrospective fork opts out and seeds a single count-adjusted
|
|
1318
|
+
// event of its own instead.
|
|
1319
|
+
if (!skipCompactionLedgerCopy) {
|
|
1320
|
+
forkCompactionLedger(
|
|
1321
|
+
db,
|
|
1322
|
+
sourceConversationId,
|
|
1323
|
+
fork.id,
|
|
1324
|
+
messagesToCopy.at(-1)?.createdAt ?? null,
|
|
1325
|
+
);
|
|
1326
|
+
}
|
|
1249
1327
|
}
|
|
1250
1328
|
|
|
1251
1329
|
/**
|
|
@@ -1272,17 +1350,28 @@ function latestForkedAssistantFrom(
|
|
|
1272
1350
|
|
|
1273
1351
|
/**
|
|
1274
1352
|
* Async variant of {@link forkConversation} for the memory-retrospective job,
|
|
1275
|
-
* which forks the
|
|
1276
|
-
* conversation on a hot path that must not stall the daemon.
|
|
1353
|
+
* which forks the source conversation's visible window into a throwaway
|
|
1354
|
+
* background conversation on a hot path that must not stall the daemon.
|
|
1355
|
+
*
|
|
1356
|
+
* Only rows at-or-after the inherited compaction boundary are copied. The
|
|
1357
|
+
* retrospective wake always runs under guardian trust, whose history render
|
|
1358
|
+
* slices `contextCompactedMessageCount` rows off the front and prepends the
|
|
1359
|
+
* summary on `contextSummary` presence alone — so the fork carries the
|
|
1360
|
+
* inherited summary with a compacted count of 0 and renders identically to
|
|
1361
|
+
* the source (summary + tail) without materializing rows the agent cannot
|
|
1362
|
+
* see. The user-facing {@link forkConversation} keeps the full physical
|
|
1363
|
+
* history: user forks are long-lived and browsable, and untrusted-actor
|
|
1364
|
+
* views render the persisted history unsliced.
|
|
1277
1365
|
*
|
|
1278
|
-
* The dominant cost — copying
|
|
1279
|
-
* loop in a `sqlite3` subprocess (see
|
|
1280
|
-
* so `/healthz` and gateway IPC stay
|
|
1281
|
-
* tail (conversation row, attachment
|
|
1282
|
-
* in-process and reuses
|
|
1283
|
-
*
|
|
1284
|
-
*
|
|
1285
|
-
* pinned by a parity
|
|
1366
|
+
* The dominant cost — copying the visible tail's message rows — runs OFF the
|
|
1367
|
+
* event loop in a `sqlite3` subprocess (see
|
|
1368
|
+
* {@link copyForkMessagesViaSubprocess}), so `/healthz` and gateway IPC stay
|
|
1369
|
+
* responsive during the copy. The cheap tail (conversation row, attachment
|
|
1370
|
+
* relink, memory-state seeding) runs in-process and reuses
|
|
1371
|
+
* {@link populateForkContentsInProcess}, the same helper the synchronous fork
|
|
1372
|
+
* uses, so the two paths cannot drift on that logic. The cutoff/boundary
|
|
1373
|
+
* computation mirrors {@link forkConversation} and is pinned by a parity
|
|
1374
|
+
* test.
|
|
1286
1375
|
*
|
|
1287
1376
|
* The disk-view projection (`syncMessageToDisk`) is intentionally skipped: the
|
|
1288
1377
|
* fork is GC'd after the retrospective pass and never browsed, and the agent
|
|
@@ -1310,6 +1399,12 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1310
1399
|
}
|
|
1311
1400
|
|
|
1312
1401
|
const sourceMessages = getMessages(conversationId);
|
|
1402
|
+
// The render path hides the first `contextCompactedMessageCount` rows in
|
|
1403
|
+
// THIS load order (`getMessages`, `createdAt` only) — capture it before the
|
|
1404
|
+
// cutoff re-sort below so the tail-only drop-set matches what the source
|
|
1405
|
+
// actually renders even when `createdAt` ties straddle the compaction
|
|
1406
|
+
// boundary.
|
|
1407
|
+
const loadOrderIds = sourceMessages.map((message) => message.id);
|
|
1313
1408
|
if (throughMessageId != null) {
|
|
1314
1409
|
// Re-sort on `(createdAt, id)` so the cutoff slice agrees with the cursor
|
|
1315
1410
|
// the caller chose it from — see the matching note in `forkConversation`.
|
|
@@ -1359,6 +1454,21 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1359
1454
|
const inheritsLatestCompaction =
|
|
1360
1455
|
inheritedCompaction != null &&
|
|
1361
1456
|
inheritedCompaction.compactedAt === sourceConversation.contextCompactedAt;
|
|
1457
|
+
// Copy only the visible tail: rows behind the inherited summary are never
|
|
1458
|
+
// rendered on this fork (the retrospective wake runs under guardian trust,
|
|
1459
|
+
// which slices `contextCompactedMessageCount` rows off the front), so
|
|
1460
|
+
// copying them would hold the write lock for rows the agent cannot see.
|
|
1461
|
+
// The drop-set is the first `compactedMessageCount` rows in LOAD order —
|
|
1462
|
+
// the exact rows the source's render hides — rather than a positional
|
|
1463
|
+
// slice of the re-sorted array, whose tie order can differ at the
|
|
1464
|
+
// boundary. `slice` self-clamps when the ledger count exceeds the row
|
|
1465
|
+
// count, mirroring the render path's clamp.
|
|
1466
|
+
const hiddenRowIds = new Set(
|
|
1467
|
+
loadOrderIds.slice(0, inheritedCompaction?.compactedMessageCount ?? 0),
|
|
1468
|
+
);
|
|
1469
|
+
const rowsToCopy = messagesToCopy.filter(
|
|
1470
|
+
(message) => !hiddenRowIds.has(message.id),
|
|
1471
|
+
);
|
|
1362
1472
|
const forkParentMessageId = messagesToCopy.at(-1)?.id ?? null;
|
|
1363
1473
|
const forkTitle =
|
|
1364
1474
|
params.title ?? `${sourceConversation.title ?? "Untitled"} (Fork)`;
|
|
@@ -1366,9 +1476,9 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1366
1476
|
|
|
1367
1477
|
// Pre-generate the id map in JS so the same map drives the off-loop copy and
|
|
1368
1478
|
// the in-process attachment relink that follows.
|
|
1369
|
-
const idPairs: ForkIdPair[] =
|
|
1479
|
+
const idPairs: ForkIdPair[] = rowsToCopy.map((message) => ({
|
|
1370
1480
|
oldId: message.id,
|
|
1371
|
-
newId:
|
|
1481
|
+
newId: uuidv7(),
|
|
1372
1482
|
}));
|
|
1373
1483
|
const forkedMessageIds = new Map<string, string>(
|
|
1374
1484
|
idPairs.map((pair) => [pair.oldId, pair.newId]),
|
|
@@ -1391,9 +1501,19 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1391
1501
|
.set({
|
|
1392
1502
|
forkParentConversationId: sourceConversation.id,
|
|
1393
1503
|
forkParentMessageId,
|
|
1504
|
+
// Stamped at creation so the startup orphan sweep (which only
|
|
1505
|
+
// considers rows with a non-null `lastMessageAt`) can age this
|
|
1506
|
+
// fork even if the daemon crashes before the copy or the
|
|
1507
|
+
// retrospective instruction lands — including the empty-tail
|
|
1508
|
+
// fork, which copies no rows at all. Phase 3 re-derives the same
|
|
1509
|
+
// value from the copied rows when the tail is non-empty.
|
|
1510
|
+
lastMessageAt: boundaryMessageCreatedAt,
|
|
1394
1511
|
contextSummary: inheritedCompaction?.summary ?? null,
|
|
1395
|
-
|
|
1396
|
-
|
|
1512
|
+
// Zero of the fork's own rows sit behind the boundary (the
|
|
1513
|
+
// compacted prefix is not copied). The summary still renders:
|
|
1514
|
+
// the history render keys on `contextSummary` presence, not on
|
|
1515
|
+
// this count.
|
|
1516
|
+
contextCompactedMessageCount: 0,
|
|
1397
1517
|
contextCompactedAt: inheritedCompaction?.compactedAt ?? null,
|
|
1398
1518
|
slackContextCompactionWatermarkTs: inheritsLatestCompaction
|
|
1399
1519
|
? sourceConversation.slackContextCompactionWatermarkTs
|
|
@@ -1431,22 +1551,59 @@ export async function forkConversationForRetrospective(params: {
|
|
|
1431
1551
|
|
|
1432
1552
|
// Phase 3 (in-process): attachments + memory-state seeding, reusing the
|
|
1433
1553
|
// same helper as the synchronous fork. Disk-view projection is skipped.
|
|
1554
|
+
//
|
|
1555
|
+
// The populate transaction reads (attachment links) before its first
|
|
1556
|
+
// write, so a deferred BEGIN would take its snapshot as a reader and any
|
|
1557
|
+
// concurrent writer committing before the first write fails the
|
|
1558
|
+
// read→write upgrade with SQLITE_BUSY_SNAPSHOT — a hard error
|
|
1559
|
+
// `busy_timeout` cannot wait out, which would discard the entire batch
|
|
1560
|
+
// copy from phase 2. `behavior: "immediate"` acquires the write lock at
|
|
1561
|
+
// BEGIN so the snapshot postdates it, and the retry absorbs residual
|
|
1562
|
+
// contention: the transaction rolls back atomically, so re-running it is
|
|
1563
|
+
// safe.
|
|
1434
1564
|
const latestForkedAssistant = latestForkedAssistantFrom(
|
|
1435
|
-
|
|
1565
|
+
rowsToCopy,
|
|
1436
1566
|
forkedMessageIds,
|
|
1437
1567
|
);
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1568
|
+
await withSqliteRetry(
|
|
1569
|
+
() =>
|
|
1570
|
+
db.transaction(
|
|
1571
|
+
() => {
|
|
1572
|
+
populateForkContentsInProcess({
|
|
1573
|
+
fork,
|
|
1574
|
+
sourceConversationId: sourceConversation.id,
|
|
1575
|
+
messagesToCopy: rowsToCopy,
|
|
1576
|
+
forkedMessageIds,
|
|
1577
|
+
latestForkedAssistant,
|
|
1578
|
+
isFullHistoryFork:
|
|
1579
|
+
copyBoundaryIndex === sourceMessages.length - 1,
|
|
1580
|
+
// The copied range already starts at the visible window.
|
|
1581
|
+
inheritedCompactedMessageCount: 0,
|
|
1582
|
+
skipCompactionLedgerCopy: inheritedCompaction != null,
|
|
1583
|
+
});
|
|
1584
|
+
// The fork owns none of the source's ledger events — their
|
|
1585
|
+
// counts index source-space row positions, and this fork row
|
|
1586
|
+
// stores a count of 0. Seed a single event mirroring the fork
|
|
1587
|
+
// row's compaction fields whenever a compaction is inherited
|
|
1588
|
+
// (even when the hidden prefix fell outside the cutoff and
|
|
1589
|
+
// nothing was dropped), so the ledger and the row cache agree
|
|
1590
|
+
// and a fork of this fork inherits the summary with the
|
|
1591
|
+
// fork-local count. With no inherited compaction the default
|
|
1592
|
+
// ledger copy is a natural no-op (no source event is
|
|
1593
|
+
// at-or-before the boundary). Rolls back with the transaction,
|
|
1594
|
+
// so the retry unit stays atomic.
|
|
1595
|
+
if (inheritedCompaction) {
|
|
1596
|
+
appendCompactionEvent(fork.id, {
|
|
1597
|
+
compactedAt: inheritedCompaction.compactedAt,
|
|
1598
|
+
summary: inheritedCompaction.summary,
|
|
1599
|
+
compactedMessageCount: 0,
|
|
1600
|
+
});
|
|
1601
|
+
}
|
|
1602
|
+
},
|
|
1603
|
+
{ behavior: "immediate" },
|
|
1604
|
+
),
|
|
1605
|
+
{ op: "forkConversationForRetrospective.populate" },
|
|
1606
|
+
);
|
|
1450
1607
|
|
|
1451
1608
|
const persistedFork = getConversation(fork.id);
|
|
1452
1609
|
if (!persistedFork) {
|
|
@@ -1753,7 +1910,6 @@ export async function addMessage(
|
|
|
1753
1910
|
role: message.role,
|
|
1754
1911
|
content: message.content,
|
|
1755
1912
|
createdAt: message.createdAt,
|
|
1756
|
-
scopeId: "default",
|
|
1757
1913
|
provenanceTrustClass,
|
|
1758
1914
|
automated,
|
|
1759
1915
|
},
|
|
@@ -2158,12 +2314,29 @@ export function getLastUserTimestampBefore(
|
|
|
2158
2314
|
* newest `role = "user"` row rather than a scan of the whole (potentially
|
|
2159
2315
|
* multi-GB) table.
|
|
2160
2316
|
*/
|
|
2161
|
-
|
|
2317
|
+
/**
|
|
2318
|
+
* Timestamp of the newest user-role message in an interactive
|
|
2319
|
+
* (non-background) conversation, or 0 when none exists. Background machinery
|
|
2320
|
+
* writes user-role rows of its own — the memory-retrospective instruction
|
|
2321
|
+
* message, scheduled/heartbeat wake hints — inside background/scheduled
|
|
2322
|
+
* conversations, so an unfiltered max would keep an always-on install
|
|
2323
|
+
* permanently "active" for consumers gating on human quiet (the
|
|
2324
|
+
* db-maintenance quiet period).
|
|
2325
|
+
*/
|
|
2326
|
+
export function getLastInteractiveUserMessageTimestamp(): number {
|
|
2162
2327
|
const db = getDb();
|
|
2163
2328
|
const row = db
|
|
2164
2329
|
.select({ createdAt: messages.createdAt })
|
|
2165
2330
|
.from(messages)
|
|
2166
|
-
.
|
|
2331
|
+
.innerJoin(conversations, eq(messages.conversationId, conversations.id))
|
|
2332
|
+
.where(
|
|
2333
|
+
and(
|
|
2334
|
+
eq(messages.role, "user"),
|
|
2335
|
+
notInArray(conversations.conversationType, [
|
|
2336
|
+
...BACKGROUND_CONVERSATION_TYPES,
|
|
2337
|
+
]),
|
|
2338
|
+
),
|
|
2339
|
+
)
|
|
2167
2340
|
.orderBy(desc(messages.createdAt))
|
|
2168
2341
|
.limit(1)
|
|
2169
2342
|
.get();
|
|
@@ -2319,12 +2492,21 @@ export function unarchiveConversation(id: string): boolean {
|
|
|
2319
2492
|
* Persist the processing-start timestamp for a conversation. Called by
|
|
2320
2493
|
* `Conversation.setProcessing(true)` so out-of-process callers can detect
|
|
2321
2494
|
* mid-turn state by reading the `conversations` row directly. Pass `null`
|
|
2322
|
-
* to clear (turn ended)
|
|
2495
|
+
* to clear (turn ended); a clean turn end also closes any interruption
|
|
2496
|
+
* streak, so the startup auto-resume budget refills.
|
|
2323
2497
|
*/
|
|
2324
2498
|
export function setConversationProcessingStartedAt(
|
|
2325
2499
|
id: string,
|
|
2326
2500
|
startedAt: number | null,
|
|
2327
2501
|
): void {
|
|
2502
|
+
if (startedAt == null) {
|
|
2503
|
+
rawRun(
|
|
2504
|
+
"conversation:setProcessingStartedAt",
|
|
2505
|
+
"UPDATE conversations SET processing_started_at = NULL, processing_resume_attempts = 0 WHERE id = ?",
|
|
2506
|
+
id,
|
|
2507
|
+
);
|
|
2508
|
+
return;
|
|
2509
|
+
}
|
|
2328
2510
|
rawRun(
|
|
2329
2511
|
"conversation:setProcessingStartedAt",
|
|
2330
2512
|
"UPDATE conversations SET processing_started_at = ? WHERE id = ?",
|
|
@@ -2347,6 +2529,43 @@ export function clearStaleProcessingFlags(): number {
|
|
|
2347
2529
|
);
|
|
2348
2530
|
}
|
|
2349
2531
|
|
|
2532
|
+
export interface InterruptedConversationRow {
|
|
2533
|
+
id: string;
|
|
2534
|
+
/** Consecutive startup auto-resume attempts since the last clean turn end. */
|
|
2535
|
+
resumeAttempts: number;
|
|
2536
|
+
}
|
|
2537
|
+
|
|
2538
|
+
/**
|
|
2539
|
+
* Conversations whose persisted processing flag is still set. Read at daemon
|
|
2540
|
+
* startup before {@link clearStaleProcessingFlags} so the interrupted-turn
|
|
2541
|
+
* reconciler knows which conversations were mid-turn when the previous
|
|
2542
|
+
* process exited.
|
|
2543
|
+
*/
|
|
2544
|
+
export function listInterruptedConversations(): InterruptedConversationRow[] {
|
|
2545
|
+
return rawAll<{ id: string; processing_resume_attempts: number }>(
|
|
2546
|
+
"conversation:listInterrupted",
|
|
2547
|
+
"SELECT id, processing_resume_attempts FROM conversations WHERE processing_started_at IS NOT NULL",
|
|
2548
|
+
).map((row) => ({
|
|
2549
|
+
id: row.id,
|
|
2550
|
+
resumeAttempts: row.processing_resume_attempts,
|
|
2551
|
+
}));
|
|
2552
|
+
}
|
|
2553
|
+
|
|
2554
|
+
/**
|
|
2555
|
+
* Bump the persisted auto-resume counter for a conversation the startup
|
|
2556
|
+
* reconciler is about to resume. Intentionally left set by
|
|
2557
|
+
* {@link clearStaleProcessingFlags} — the counter must survive the flag clear
|
|
2558
|
+
* so the resume cap holds across boots. Reset to 0 by the clean turn-end
|
|
2559
|
+
* write in {@link setConversationProcessingStartedAt}.
|
|
2560
|
+
*/
|
|
2561
|
+
export function incrementProcessingResumeAttempts(id: string): void {
|
|
2562
|
+
rawRun(
|
|
2563
|
+
"conversation:incrementResumeAttempts",
|
|
2564
|
+
"UPDATE conversations SET processing_resume_attempts = processing_resume_attempts + 1 WHERE id = ?",
|
|
2565
|
+
id,
|
|
2566
|
+
);
|
|
2567
|
+
}
|
|
2568
|
+
|
|
2350
2569
|
/**
|
|
2351
2570
|
* Read whether a conversation is currently processing. Checks the in-memory
|
|
2352
2571
|
* `Conversation._processing` flag first (hot path for resident conversations),
|
|
@@ -2904,30 +3123,49 @@ export async function reserveMessage(
|
|
|
2904
3123
|
conversationId: string,
|
|
2905
3124
|
role: MessageRole,
|
|
2906
3125
|
metadata?: Record<string, unknown>,
|
|
3126
|
+
/**
|
|
3127
|
+
* Workspace-relative in-flight delta-file path. When provided, the row is
|
|
3128
|
+
* created already streaming — `content` holds the `{ ref }` pointer and
|
|
3129
|
+
* `finalized = 0` — so no later row write is needed to enter the
|
|
3130
|
+
* streaming state. The finalize seam folds the row inline.
|
|
3131
|
+
*/
|
|
3132
|
+
inflightRef?: string,
|
|
2907
3133
|
) {
|
|
2908
3134
|
return insertMessageCore({
|
|
2909
3135
|
conversationId,
|
|
2910
3136
|
role,
|
|
2911
|
-
content: "[]",
|
|
3137
|
+
content: inflightRef ? JSON.stringify({ ref: inflightRef }) : "[]",
|
|
3138
|
+
...(inflightRef ? { finalized: 0 as const } : {}),
|
|
2912
3139
|
metadata,
|
|
2913
3140
|
});
|
|
2914
3141
|
}
|
|
2915
3142
|
|
|
2916
3143
|
/**
|
|
2917
|
-
* Update the content of an existing message. Used
|
|
2918
|
-
*
|
|
3144
|
+
* Update the content of an existing message in place. Used for edits to
|
|
3145
|
+
* already-finalized rows: consolidation, channel edit propagation, and the
|
|
3146
|
+
* post-finalize tool-timing stamps (`_startedAt`/`_previewStartedAt`).
|
|
3147
|
+
* Streaming writes do NOT come through here — the agent loop's partial
|
|
3148
|
+
* flushes append to the in-flight delta file (`inflight-message-content.ts`)
|
|
3149
|
+
* and land on the row once, at the finalize seam.
|
|
2919
3150
|
*
|
|
2920
|
-
* This is a pure CRUD primitive: it does NOT enqueue a lexical reindex
|
|
2921
|
-
*
|
|
2922
|
-
*
|
|
2923
|
-
*
|
|
2924
|
-
*
|
|
2925
|
-
* themselves via `enqueueLexicalIndexForMessage`.
|
|
3151
|
+
* This is a pure CRUD primitive: it does NOT enqueue a lexical reindex
|
|
3152
|
+
* (the timing stamps don't change searchable text and would spam reindex
|
|
3153
|
+
* jobs). Callers on genuine content-change seams (channel edits,
|
|
3154
|
+
* consolidation) enqueue the reindex themselves via
|
|
3155
|
+
* `enqueueLexicalIndexForMessage`.
|
|
2926
3156
|
*/
|
|
2927
3157
|
export function updateMessageContent(
|
|
2928
3158
|
messageId: string,
|
|
2929
3159
|
newContent: string,
|
|
3160
|
+
metadataUpdates?: Record<string, unknown>,
|
|
2930
3161
|
): void {
|
|
3162
|
+
// When metadata updates ride along (e.g. the served model stamped at
|
|
3163
|
+
// assistant-row finalize), delegate to the transactional content+metadata
|
|
3164
|
+
// writer so both land atomically.
|
|
3165
|
+
if (metadataUpdates) {
|
|
3166
|
+
updateMessageContentAndMetadata(messageId, newContent, metadataUpdates);
|
|
3167
|
+
return;
|
|
3168
|
+
}
|
|
2931
3169
|
const db = getDb();
|
|
2932
3170
|
db.update(messages)
|
|
2933
3171
|
.set({ content: newContent })
|
|
@@ -2935,6 +3173,45 @@ export function updateMessageContent(
|
|
|
2935
3173
|
.run();
|
|
2936
3174
|
}
|
|
2937
3175
|
|
|
3176
|
+
/**
|
|
3177
|
+
* Terminal content write for a message: store the folded inline content and
|
|
3178
|
+
* set `finalized = 1` in the same statement (with optional metadata riding
|
|
3179
|
+
* the same transaction). After this, the row is immutable streaming-wise and
|
|
3180
|
+
* eligible for batch readers (search, memory indexing).
|
|
3181
|
+
*/
|
|
3182
|
+
export function finalizeMessageContent(
|
|
3183
|
+
messageId: string,
|
|
3184
|
+
contentJson: string,
|
|
3185
|
+
metadataUpdates?: Record<string, unknown>,
|
|
3186
|
+
): void {
|
|
3187
|
+
const db = getDb();
|
|
3188
|
+
if (!metadataUpdates) {
|
|
3189
|
+
db.update(messages)
|
|
3190
|
+
.set({ content: contentJson, finalized: 1 })
|
|
3191
|
+
.where(eq(messages.id, messageId))
|
|
3192
|
+
.run();
|
|
3193
|
+
return;
|
|
3194
|
+
}
|
|
3195
|
+
db.transaction((tx) => {
|
|
3196
|
+
const row = tx
|
|
3197
|
+
.select({ metadata: messages.metadata })
|
|
3198
|
+
.from(messages)
|
|
3199
|
+
.where(eq(messages.id, messageId))
|
|
3200
|
+
.get();
|
|
3201
|
+
const existing = row?.metadata
|
|
3202
|
+
? (JSON.parse(row.metadata) as Record<string, unknown>)
|
|
3203
|
+
: {};
|
|
3204
|
+
tx.update(messages)
|
|
3205
|
+
.set({
|
|
3206
|
+
content: contentJson,
|
|
3207
|
+
finalized: 1,
|
|
3208
|
+
metadata: JSON.stringify({ ...existing, ...metadataUpdates }),
|
|
3209
|
+
})
|
|
3210
|
+
.where(eq(messages.id, messageId))
|
|
3211
|
+
.run();
|
|
3212
|
+
});
|
|
3213
|
+
}
|
|
3214
|
+
|
|
2938
3215
|
/**
|
|
2939
3216
|
* Merge `updates` into the metadata JSON of an existing message.
|
|
2940
3217
|
* Reads the current metadata, shallow-merges the new fields, and writes back.
|