@vellumai/assistant 0.10.4 → 0.10.5-dev.202607022329.d89bf2f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +94 -91
- package/Dockerfile +5 -16
- package/README.md +7 -10
- package/bun.lock +0 -4
- package/docs/architecture/security.md +20 -20
- package/docs/stt-provider-onboarding.md +4 -5
- package/docs/trusted-contact-access.md +7 -7
- package/eslint-rules/cli-no-daemon-internals.js +4 -0
- package/eslint.config.mjs +7 -1
- package/knip.json +0 -1
- package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +36 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/invite-contract.test.ts +233 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +40 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +20 -8
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +10 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +33 -0
- package/node_modules/@vellumai/gateway-client/src/invite-contract.ts +216 -0
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +91 -0
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +39 -3
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +0 -8
- package/node_modules/@vellumai/service-contracts/src/__tests__/package-boundary.test.ts +1 -5
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +3 -14
- package/openapi.yaml +1073 -225
- package/package.json +1 -4
- package/scripts/test.sh +35 -13
- package/src/__tests__/access-request-seed-content-blocks.test.ts +60 -4
- package/src/__tests__/acp-session.test.ts +4 -1
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +0 -6
- package/src/__tests__/add-message-preassigned-id.test.ts +56 -0
- package/src/__tests__/agent-loop-set-system-prompt.test.ts +139 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +3 -0
- package/src/__tests__/app-source-watcher.test.ts +11 -0
- package/src/__tests__/approval-interception-trust-gates.test.ts +148 -3
- package/src/__tests__/assistant-attachments.test.ts +62 -4
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -1
- package/src/__tests__/attachments-store-heic-normalize.test.ts +230 -0
- package/src/__tests__/attachments-store.test.ts +3 -0
- package/src/__tests__/background-shell-bash.test.ts +34 -0
- package/src/__tests__/background-shell-host-bash.test.ts +12 -0
- package/src/__tests__/background-tool-registry.test.ts +97 -0
- package/src/__tests__/background-tool-routes.test.ts +72 -1
- package/src/__tests__/background-workers-disk-pressure.test.ts +2 -1
- package/src/__tests__/btw-routes.test.ts +57 -3
- package/src/__tests__/call-controller.test.ts +474 -84
- package/src/__tests__/call-domain.test.ts +48 -1
- package/src/__tests__/call-pointer-messages.test.ts +57 -19
- package/src/__tests__/call-pointer-no-hardcoded-copy.guard.test.ts +2 -6
- package/src/__tests__/call-routes-http.test.ts +15 -14
- package/src/__tests__/call-setup-flow-invite.test.ts +568 -0
- package/src/__tests__/call-setup-flow-midcall-trust.test.ts +231 -0
- package/src/__tests__/call-setup-flow-name-capture.test.ts +754 -0
- package/src/__tests__/call-setup-flow-verification.test.ts +925 -0
- package/src/__tests__/call-setup-flow.test.ts +311 -0
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +0 -1
- package/src/__tests__/channel-guardian.test.ts +4 -7
- package/src/__tests__/channel-readiness-service.test.ts +0 -6
- package/src/__tests__/channel-readiness-slack-remote.test.ts +0 -4
- package/src/__tests__/channel-retry-sweep.test.ts +76 -64
- package/src/__tests__/channel-setup-panel-ack.test.ts +184 -0
- package/src/__tests__/clear-all-lexical.test.ts +90 -0
- package/src/__tests__/compactor-media-strip.test.ts +177 -0
- package/src/__tests__/config-loader-backfill.test.ts +5 -5
- package/src/__tests__/config-schema.test.ts +17 -0
- package/src/__tests__/contact-store-interaction-info.test.ts +27 -70
- package/src/__tests__/contacts-relay-reads.test.ts +188 -23
- package/src/__tests__/contacts-tools.test.ts +42 -1
- package/src/__tests__/contacts-write.test.ts +181 -0
- package/src/__tests__/context-search-conversations-source.test.ts +220 -81
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop.test.ts +39 -0
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -1
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -0
- package/src/__tests__/conversation-clear-safety.test.ts +0 -1
- package/src/__tests__/conversation-crud-enabled-plugins.test.ts +60 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -1
- package/src/__tests__/conversation-disk-view.test.ts +1 -0
- package/src/__tests__/conversation-enabledplugins-route.test.ts +184 -0
- package/src/__tests__/conversation-error.test.ts +0 -18
- package/src/__tests__/conversation-fork-crud.test.ts +67 -0
- package/src/__tests__/conversation-history-web-search.test.ts +7 -137
- package/src/__tests__/conversation-initial-prompt.test.ts +110 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +191 -0
- package/src/__tests__/conversation-process-callsite.test.ts +37 -0
- package/src/__tests__/conversation-queue.test.ts +149 -0
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +392 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +84 -0
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +407 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +36 -16
- package/src/__tests__/conversation-skill-tools.test.ts +73 -0
- package/src/__tests__/conversation-wipe.test.ts +20 -5
- package/src/__tests__/credential-prompt-route.test.ts +69 -0
- package/src/__tests__/credential-security-invariants.test.ts +1 -3
- package/src/__tests__/db-drop-messages-fts.test.ts +115 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +1 -62
- package/src/__tests__/edit-propagation.test.ts +56 -2
- package/src/__tests__/empty-state-greeting-cache.test.ts +9 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +15 -110
- package/src/__tests__/guardian-expiry-notifier.test.ts +1 -0
- package/src/__tests__/guardian-question-mode.test.ts +57 -0
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
- package/src/__tests__/guardian-wait-controller.test.ts +619 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +33 -2
- package/src/__tests__/heic-fixture.ts +55 -0
- package/src/__tests__/helpers/seed-contact-channel.ts +0 -2
- package/src/__tests__/http-conversation-lineage.test.ts +6 -1
- package/src/__tests__/image-conversion.test.ts +170 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +72 -341
- package/src/__tests__/introduction-card-resolver.test.ts +354 -0
- package/src/__tests__/invite-redeemed-ipc.test.ts +97 -0
- package/src/__tests__/invite-routes-http.test.ts +246 -420
- package/src/__tests__/job-handler-registration-guard.test.ts +104 -0
- package/src/__tests__/lexical-index-dual-write.test.ts +426 -0
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +2 -2
- package/src/__tests__/list-messages-attachments.test.ts +159 -0
- package/src/__tests__/list-messages-background-tool-completion.test.ts +141 -0
- package/src/__tests__/list-messages-queued.test.ts +25 -0
- package/src/__tests__/managed-store.test.ts +129 -1
- package/src/__tests__/media-stream-audio-transcode.test.ts +113 -0
- package/src/__tests__/media-stream-output.test.ts +350 -19
- package/src/__tests__/media-stream-server-integration.test.ts +943 -169
- package/src/__tests__/media-stream-stt-session.test.ts +498 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +2 -2
- package/src/__tests__/model-intents.test.ts +1 -1
- package/src/__tests__/mtime-cache.test.ts +19 -0
- package/src/__tests__/non-member-access-request.test.ts +349 -3
- package/src/__tests__/notification-decision-fallback.test.ts +104 -8
- package/src/__tests__/notification-decision-strategy.test.ts +57 -8
- package/src/__tests__/onboarding-template-contract.test.ts +27 -43
- package/src/__tests__/openai-provider.test.ts +33 -0
- package/src/__tests__/openai-responses-provider.test.ts +40 -0
- package/src/__tests__/persistence-layering-guard.test.ts +29 -20
- package/src/__tests__/persona-resolver.test.ts +56 -2
- package/src/__tests__/personal-memory-auth-bypass.test.ts +62 -0
- package/src/__tests__/phone.test.ts +1 -15
- package/src/__tests__/plugin-bootstrap.test.ts +25 -196
- package/src/__tests__/plugin-disabled-state.test.ts +33 -0
- package/src/__tests__/plugin-effective-enabled-set.test.ts +227 -0
- package/src/__tests__/plugin-event-hub-facade.test.ts +323 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +156 -42
- package/src/__tests__/plugin-injector-contribution.test.ts +4 -20
- package/src/__tests__/plugin-pipeline.test.ts +63 -1
- package/src/__tests__/plugin-route-contribution.test.ts +62 -115
- package/src/__tests__/plugin-tool-contribution.test.ts +0 -22
- package/src/__tests__/plugin-types.test.ts +0 -1
- package/src/__tests__/pointer-conversation-trust.test.ts +38 -6
- package/src/__tests__/pre-model-call-sanitize.test.ts +1 -1
- package/src/__tests__/prune-old-tool-invocations-job.test.ts +97 -0
- package/src/__tests__/public-ingress-urls.test.ts +0 -48
- package/src/__tests__/qdrant-collection-migration.test.ts +145 -2
- package/src/__tests__/reaction-intercept-member-verdict-warm.test.ts +0 -1
- package/src/__tests__/resolve-trust-class.test.ts +28 -10
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +137 -0
- package/src/__tests__/schedule-retry.test.ts +38 -14
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +3 -3
- package/src/__tests__/schedule-routes.test.ts +14 -6
- package/src/__tests__/schedule-store.test.ts +3 -1
- package/src/__tests__/scheduler-disk-pressure.test.ts +17 -6
- package/src/__tests__/scheduler-recurrence.test.ts +57 -107
- package/src/__tests__/scheduler-reuse-conversation.test.ts +51 -46
- package/src/__tests__/scheduler-wake.test.ts +13 -23
- package/src/__tests__/scheduler-worker-standdown.test.ts +220 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -1
- package/src/__tests__/shell-observability.test.ts +1 -0
- package/src/__tests__/skill-boundary-guard.test.ts +3 -4
- package/src/__tests__/skill-load-plugin-scope.test.ts +238 -0
- package/src/__tests__/skill-projection-feature-flag.test.ts +2 -0
- package/src/__tests__/skill-script-runner-host.test.ts +53 -0
- package/src/__tests__/skill-script-runner-sandbox.test.ts +5 -2
- package/src/__tests__/skill-tool-factory.test.ts +73 -1
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +37 -14
- package/src/__tests__/slack-inbound-verification.test.ts +36 -0
- package/src/__tests__/slack-notification-approval-card.test.ts +89 -2
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +51 -1
- package/src/__tests__/stt-hints.test.ts +2 -256
- package/src/__tests__/subagent-allowlist-validation.test.ts +47 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +72 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +14 -2
- package/src/__tests__/subagent-persistence.test.ts +122 -0
- package/src/__tests__/subagent-spawn-and-await.test.ts +1 -0
- package/src/__tests__/subagent-terminal-message.test.ts +99 -0
- package/src/__tests__/subagent-tool-gate-mode.test.ts +78 -1
- package/src/__tests__/system-prompt.test.ts +17 -118
- package/src/__tests__/task-scheduler.test.ts +68 -89
- package/src/__tests__/telephony-credential-preflight.test.ts +312 -0
- package/src/__tests__/telephony-tts-guard.test.ts +538 -0
- package/src/__tests__/title-generate-hook.test.ts +16 -0
- package/src/__tests__/tool-approval-handler.test.ts +87 -1
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +45 -20
- package/src/__tests__/tool-grant-request-escalation.test.ts +39 -0
- package/src/__tests__/trust-context-guards.test.ts +21 -10
- package/src/__tests__/trusted-contact-multichannel.test.ts +4 -0
- package/src/__tests__/twilio-provider.test.ts +17 -17
- package/src/__tests__/twilio-routes-twiml.test.ts +6 -543
- package/src/__tests__/twilio-routes.test.ts +257 -387
- package/src/__tests__/twilio-validation.test.ts +1 -1
- package/src/__tests__/unified-turn-context-client-os.test.ts +45 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +5 -0
- package/src/__tests__/voice-approval-resolver-relay.test.ts +150 -0
- package/src/__tests__/voice-ingress-preflight.test.ts +61 -0
- package/src/__tests__/voice-quality.test.ts +2 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -7
- package/src/__tests__/voice-session-bridge-processing-wait.test.ts +27 -0
- package/src/__tests__/voice-session-bridge.test.ts +1 -10
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -0
- package/src/__tests__/workspace-migration-118-seed-now-md.test.ts +120 -0
- package/src/__tests__/workspace-migration-120-revise-onboarding-threads.test.ts +175 -0
- package/src/__tests__/workspace-migration-121-seed-default-user-guardrails.test.ts +118 -0
- package/src/__tests__/workspace-migration-122-relocate-default-user-boundary.test.ts +119 -0
- package/src/__tests__/workspace-migration-123-swap-quality-profile-to-fable.test.ts +191 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +235 -241
- package/src/acp/__tests__/prepare-agent-env.test.ts +0 -97
- package/src/acp/__tests__/session-manager-persistence.test.ts +2 -0
- package/src/acp/__tests__/session-manager-resume.test.ts +8 -0
- package/src/acp/__tests__/session-manager-usage.test.ts +6 -0
- package/src/acp/__tests__/session-manager.test.ts +6 -0
- package/src/acp/agent-process.test.ts +116 -0
- package/src/acp/agent-process.ts +71 -0
- package/src/acp/auto-install.ts +12 -8
- package/src/acp/failure-error.test.ts +109 -0
- package/src/acp/failure-error.ts +111 -0
- package/src/acp/prepare-agent-env.ts +0 -12
- package/src/acp/resolve-agent.test.ts +6 -45
- package/src/acp/resolve-agent.ts +2 -4
- package/src/acp/session-manager.test.ts +312 -0
- package/src/acp/session-manager.ts +102 -46
- package/src/agent/ax-tree-compaction.test.ts +4 -1
- package/src/agent/image-optimize.ts +17 -127
- package/src/agent/loop.ts +45 -192
- package/src/api/events/background-tool-completed.test.ts +51 -0
- package/src/api/events/background-tool-completed.ts +29 -0
- package/src/api/events/background-tool-started.test.ts +36 -0
- package/src/api/events/background-tool-started.ts +28 -0
- package/src/api/events/conversation-error.ts +0 -1
- package/src/api/events/open-panel.ts +33 -0
- package/src/api/events/subagent-status-changed.ts +4 -1
- package/src/api/index.ts +19 -0
- package/src/api/responses/conversation-message.ts +34 -0
- package/src/approvals/guardian-decision-primitive.ts +74 -24
- package/src/approvals/guardian-request-resolvers.ts +450 -122
- package/src/apps/app-store.ts +1 -0
- package/src/apps/shared-app-links-store.ts +1 -0
- package/src/avatar/identity-avatar.ts +3 -7
- package/src/background-wake/wake-intent-hooks.test.ts +1 -1
- package/src/calls/__tests__/fish-audio-client.test.ts +73 -0
- package/src/calls/__tests__/gateway-invite-reader.test.ts +170 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +126 -102
- package/src/calls/call-controller.ts +134 -48
- package/src/calls/call-domain.ts +18 -42
- package/src/calls/call-pointer-messages.ts +51 -67
- package/src/calls/call-setup-flow-types.ts +76 -0
- package/src/calls/call-setup-flow.ts +1743 -0
- package/src/calls/call-speech-output.ts +87 -23
- package/src/calls/call-store.ts +4 -0
- package/src/calls/call-transport.ts +22 -36
- package/src/calls/fish-audio-client.ts +3 -0
- package/src/calls/gateway-invite-reader.ts +98 -0
- package/src/calls/guardian-wait-controller.ts +451 -0
- package/src/calls/media-stream-audio-transcode.ts +82 -2
- package/src/calls/media-stream-output.ts +142 -36
- package/src/calls/media-stream-server.ts +297 -178
- package/src/calls/media-stream-stt-session.ts +393 -50
- package/src/calls/media-turn-detector.ts +4 -6
- package/src/calls/relay-access-wait.ts +3 -4
- package/src/calls/relay-setup-router.ts +22 -43
- package/src/calls/relay-verification.ts +17 -24
- package/src/calls/resolve-call-tts-provider.ts +96 -29
- package/src/calls/stt-hints.ts +24 -87
- package/src/calls/telephony-credential-preflight.ts +159 -0
- package/src/calls/telephony-tts-capability.ts +183 -0
- package/src/calls/tts-call-strategy.ts +18 -20
- package/src/calls/twilio-provider.ts +3 -2
- package/src/calls/twilio-routes.ts +47 -351
- package/src/calls/types.ts +5 -3
- package/src/calls/voice-ingress-preflight.ts +9 -0
- package/src/calls/voice-quality.ts +13 -18
- package/src/calls/voice-session-bridge.ts +25 -35
- package/src/channels/__tests__/types.test.ts +28 -0
- package/src/channels/channel-verification-sessions.ts +7 -2
- package/src/channels/config.ts +0 -42
- package/src/channels/slack-thread-store.ts +12 -0
- package/src/channels/types.ts +23 -0
- package/src/cli/commands/__tests__/conversations-slack.test.ts +1 -1
- package/src/cli/commands/__tests__/schedules.test.ts +83 -34
- package/src/cli/commands/__tests__/status.test.ts +42 -2
- package/src/cli/commands/contacts.ts +2 -2
- package/src/cli/commands/credentials.ts +17 -0
- package/src/cli/commands/monitoring.ts +191 -0
- package/src/cli/commands/schedules-worker.ts +175 -0
- package/src/cli/commands/schedules.ts +169 -43
- package/src/cli/commands/status.ts +12 -1
- package/src/cli/commands/tools.ts +5 -1
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +1 -0
- package/src/cli/lib/__tests__/search-plugins.test.ts +29 -1
- package/src/cli/lib/__tests__/toggle-plugin.test.ts +7 -0
- package/src/cli/lib/search-plugins.ts +6 -0
- package/src/cli/lib/toggle-plugin.ts +21 -2
- package/src/cli/program.ts +3 -1
- package/src/config/__tests__/deployment-context-defaults.test.ts +23 -0
- package/src/config/acp-defaults.test.ts +0 -10
- package/src/config/acp-defaults.ts +0 -6
- package/src/config/bundled-skills/acp/SKILL.md +13 -45
- package/src/config/bundled-skills/acp/TOOLS.json +3 -3
- package/src/config/bundled-skills/app-builder/SKILL.md +3 -3
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +9 -9
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +1 -1
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +1 -1
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -9
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +10 -7
- package/src/config/bundled-skills/skill-management/TOOLS.json +10 -0
- package/src/config/call-site-defaults.ts +0 -2
- package/src/config/feature-flag-registry.json +16 -8
- package/src/config/loader.ts +11 -0
- package/src/config/schema.ts +9 -1
- package/src/config/schemas/__tests__/memory-v2.test.ts +2 -2
- package/src/config/schemas/__tests__/memory-v3.test.ts +64 -0
- package/src/config/schemas/call-site-catalog.ts +0 -12
- package/src/config/schemas/calls.ts +8 -0
- package/src/config/schemas/elevenlabs.ts +1 -1
- package/src/config/schemas/llm.ts +0 -2
- package/src/config/schemas/memory-v2.ts +1 -1
- package/src/config/schemas/memory-v3.ts +82 -0
- package/src/config/schemas/monitoring.ts +61 -0
- package/src/config/schemas/schedules.ts +35 -0
- package/src/config/seed-inference-profiles.ts +2 -2
- package/src/config/skills-plugin-filter.test.ts +96 -0
- package/src/config/skills.ts +26 -0
- package/src/contacts/__tests__/member-write-relay.test.ts +156 -4
- package/src/contacts/canonical-guardian-store.ts +5 -0
- package/src/contacts/contact-store.ts +81 -35
- package/src/contacts/contacts-write.ts +50 -25
- package/src/contacts/member-write-relay.ts +115 -31
- package/src/contacts/types.ts +0 -8
- package/src/context/compactor.ts +29 -15
- package/src/context/outbound-sanitize.ts +202 -0
- package/src/daemon/__tests__/abort-null-controller.test.ts +167 -0
- package/src/daemon/__tests__/conversation-tool-setup-plugin-scope.test.ts +122 -0
- package/src/daemon/__tests__/embedding-reconcile.test.ts +99 -16
- package/src/daemon/__tests__/wake-conversation-ops-completion.test.ts +107 -0
- package/src/daemon/abort-watchdog.ts +7 -0
- package/src/daemon/app-source-watcher.ts +9 -0
- package/src/daemon/assistant-attachments.ts +42 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +256 -147
- package/src/daemon/conversation-agent-loop.ts +61 -68
- package/src/daemon/conversation-error.ts +1 -15
- package/src/daemon/conversation-history.ts +32 -236
- package/src/daemon/conversation-initial-prompt.ts +77 -0
- package/src/daemon/conversation-lifecycle.ts +25 -1
- package/src/daemon/conversation-messaging.ts +2 -2
- package/src/daemon/conversation-plugin-scope.ts +38 -0
- package/src/daemon/conversation-process.ts +50 -14
- package/src/daemon/conversation-runtime-assembly.ts +36 -6
- package/src/daemon/conversation-skill-tools.ts +19 -3
- package/src/daemon/conversation-store.ts +3 -3
- package/src/daemon/conversation-surfaces.ts +171 -0
- package/src/daemon/conversation-tool-setup.test.ts +95 -0
- package/src/daemon/conversation-tool-setup.ts +116 -1
- package/src/daemon/conversation-turn-finalize.ts +211 -0
- package/src/daemon/conversation.ts +92 -1
- package/src/daemon/disk-pressure-policy.ts +2 -1
- package/src/daemon/event-loop-watchdog.ts +22 -6
- package/src/daemon/external-plugins-bootstrap.ts +47 -134
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +26 -14
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +27 -14
- package/src/daemon/handlers/__tests__/config-channels.test.ts +0 -5
- package/src/daemon/handlers/config-a2a.ts +7 -14
- package/src/daemon/handlers/config-channels.ts +2 -10
- package/src/daemon/handlers/conversation-history.ts +3 -1
- package/src/daemon/handlers/conversations.ts +0 -52
- package/src/daemon/handlers/shared.ts +4 -24
- package/src/daemon/handlers/skills.ts +4 -1
- package/src/daemon/host-cu-proxy.ts +1 -1
- package/src/daemon/lifecycle.ts +59 -472
- package/src/daemon/message-protocol.ts +3 -3
- package/src/daemon/message-provenance.ts +12 -14
- package/src/daemon/message-types/background-tools.ts +28 -0
- package/src/daemon/message-types/contacts.ts +2 -10
- package/src/daemon/message-types/conversations.ts +10 -0
- package/src/daemon/message-types/integrations.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +1 -0
- package/src/daemon/message-types/sync.ts +1 -0
- package/src/daemon/pointer-conversation-trust.ts +23 -9
- package/src/daemon/pointer-turn-runner.ts +174 -0
- package/src/daemon/providers-setup.ts +16 -0
- package/src/daemon/shutdown-handlers.ts +139 -47
- package/src/daemon/skill-memory-refresh.ts +2 -2
- package/src/daemon/sqlite-corruption-watchdog.test.ts +217 -0
- package/src/daemon/sqlite-corruption-watchdog.ts +155 -0
- package/src/daemon/tool-setup-types.ts +8 -0
- package/src/daemon/trust-context.ts +21 -6
- package/src/daemon/turn-latency-tracker.test.ts +93 -0
- package/src/daemon/turn-latency-tracker.ts +38 -0
- package/src/daemon/wake-conversation-ops.ts +10 -8
- package/src/documents/document-comments-store.test.ts +7 -1
- package/src/documents/document-comments-store.ts +8 -0
- package/src/documents/document-store.ts +15 -0
- package/src/export/__tests__/transcript-formatter.test.ts +11 -0
- package/src/export/transcript-formatter.ts +49 -67
- package/src/home/__tests__/feed-writer.test.ts +247 -1
- package/src/home/conversation-starter-checkpoints.ts +1 -0
- package/src/home/feed-writer.ts +61 -0
- package/src/home/job-handlers/conversation-starters.ts +1 -0
- package/src/hooks/hook-loader.ts +12 -0
- package/src/hooks/registry.ts +32 -4
- package/src/inbound/public-ingress-urls.ts +0 -17
- package/src/ipc/__tests__/contacts-info-ipc.test.ts +285 -0
- package/src/ipc/assistant-server.ts +28 -7
- package/src/ipc/routes/__tests__/contacts-mirror-apply-atomicity.test.ts +62 -0
- package/src/ipc/routes/__tests__/contacts-mirror-apply.test.ts +272 -0
- package/src/ipc/routes/__tests__/contacts-mirror-ipc-routes.test.ts +322 -0
- package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +60 -4
- package/src/ipc/routes/contacts-info-ipc-routes.ts +239 -0
- package/src/ipc/routes/contacts-mirror-ipc-routes.ts +202 -0
- package/src/ipc/routes/db-proxy.ts +5 -2
- package/src/ipc/routes/invite-ipc-routes.ts +53 -39
- package/src/jobs/worker.ts +9 -2
- package/src/live-voice/__tests__/live-voice-archive.test.ts +10 -1
- package/src/live-voice/live-voice-archive.ts +5 -0
- package/src/messaging/providers/__tests__/transport-dispatch.test.ts +22 -6
- package/src/messaging/providers/channel-transport.ts +6 -0
- package/src/messaging/providers/index.ts +3 -0
- package/src/messaging/providers/slack/api.test.ts +49 -1
- package/src/messaging/providers/slack/api.ts +110 -0
- package/src/messaging/providers/slack/send.test.ts +85 -0
- package/src/messaging/providers/slack/send.ts +100 -28
- package/src/messaging/providers/slack/transport.ts +7 -13
- package/src/messaging/providers/whatsapp/send.ts +29 -9
- package/src/monitoring/__tests__/control.test.ts +235 -0
- package/src/monitoring/__tests__/sample-ring-buffer.test.ts +96 -0
- package/src/monitoring/control.ts +105 -0
- package/src/monitoring/resource-sampler.ts +258 -0
- package/src/monitoring/sample-ring-buffer.ts +108 -0
- package/src/monitoring/worker.ts +94 -0
- package/src/notifications/README.md +1 -1
- package/src/notifications/access-request-copy.ts +94 -23
- package/src/notifications/adapters/slack.ts +89 -21
- package/src/notifications/approval-card-builder.ts +33 -18
- package/src/notifications/approval-card-data.ts +48 -15
- package/src/notifications/broadcaster.ts +25 -16
- package/src/notifications/decision-engine.ts +131 -32
- package/src/notifications/guardian-question-mode.ts +58 -10
- package/src/permissions/approval-policy.ts +8 -1
- package/src/permissions/checker.ts +2 -0
- package/src/permissions/gateway-threshold-reader.ts +7 -6
- package/src/permissions/ipc-risk-types.ts +1 -0
- package/src/permissions/secret-prompter.ts +11 -3
- package/src/permissions/types.ts +2 -2
- package/src/persistence/__tests__/conversation-queries-search.test.ts +397 -0
- package/src/persistence/__tests__/conversation-search-lexical.test.ts +103 -0
- package/src/persistence/__tests__/jobs-worker-memory-disabled.test.ts +95 -0
- package/src/persistence/__tests__/slow-query-log.test.ts +266 -0
- package/src/persistence/__tests__/slow-sync-log.test.ts +155 -0
- package/src/persistence/a2a-invite-store.ts +205 -0
- package/src/persistence/attachments-store.ts +94 -10
- package/src/persistence/checkpoints.ts +45 -0
- package/src/persistence/conversation-crud.ts +453 -260
- package/src/persistence/conversation-display-order-migration.ts +8 -2
- package/src/persistence/conversation-group-migration.test.ts +8 -0
- package/src/persistence/conversation-group-migration.ts +9 -0
- package/src/persistence/conversation-queries.ts +244 -125
- package/src/persistence/conversation-row-batch-delete.ts +9 -5
- package/src/persistence/conversation-search-lexical.ts +49 -0
- package/src/persistence/db-async-query.ts +42 -0
- package/src/persistence/db-connection.ts +13 -0
- package/src/persistence/delivery-channels.ts +0 -82
- package/src/persistence/delivery-crud.ts +27 -6
- package/src/persistence/embeddings/__tests__/embedding-identity.test.ts +18 -5
- package/src/persistence/embeddings/__tests__/messages-lexical-index.test.ts +334 -0
- package/src/persistence/embeddings/embedding-identity.ts +17 -5
- package/src/persistence/embeddings/embedding-runtime-manager.ts +31 -0
- package/src/persistence/embeddings/messages-lexical-index.ts +396 -0
- package/src/persistence/embeddings/qdrant-client.ts +81 -5
- package/src/persistence/group-crud.ts +13 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +506 -0
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +164 -0
- package/src/persistence/job-handlers/__tests__/message-lexical.test.ts +259 -0
- package/src/persistence/job-handlers/cleanup.ts +57 -9
- package/src/persistence/job-handlers/message-lexical-backfill.ts +187 -0
- package/src/persistence/job-handlers/message-lexical.ts +251 -0
- package/src/persistence/jobs-store.ts +102 -8
- package/src/persistence/jobs-worker.ts +68 -28
- package/src/persistence/llm-request-log-store.ts +35 -19
- package/src/persistence/llm-usage-store.ts +11 -0
- package/src/persistence/memory-lifecycle-hooks.test.ts +65 -0
- package/src/persistence/memory-lifecycle-hooks.ts +55 -1
- package/src/persistence/migrations/028-call-session-mode.ts +1 -1
- package/src/persistence/migrations/116-messages-fts.ts +8 -1
- package/src/persistence/migrations/311-create-subagents-table.ts +50 -0
- package/src/persistence/migrations/312-drop-inbox-conversation-state-table.ts +15 -0
- package/src/persistence/migrations/313-drop-messages-fts.ts +17 -0
- package/src/persistence/migrations/314-add-conversation-enabled-plugins.ts +25 -0
- package/src/persistence/migrations/315-create-a2a-invites.ts +58 -0
- package/src/persistence/migrations/316-drop-contact-channels-invite-id.ts +28 -0
- package/src/persistence/migrations/317-canonical-guardian-requester-signals.ts +24 -0
- package/src/persistence/migrations/318-drop-contact-channel-telemetry.ts +32 -0
- package/src/persistence/migrations/__tests__/315-create-a2a-invites.test.ts +161 -0
- package/src/persistence/migrations/__tests__/316-drop-contact-channels-invite-id.test.ts +156 -0
- package/src/persistence/migrations/__tests__/318-drop-contact-channel-telemetry.test.ts +134 -0
- package/src/persistence/migrations/__tests__/migration-prefix-guard.test.ts +99 -0
- package/src/persistence/raw-query.ts +50 -11
- package/src/persistence/schema/a2a.ts +14 -0
- package/src/persistence/schema/contacts.ts +0 -62
- package/src/persistence/schema/conversation-groups.ts +12 -0
- package/src/persistence/schema/conversations.ts +2 -0
- package/src/persistence/schema/documents.ts +65 -0
- package/src/persistence/schema/guardian.ts +4 -0
- package/src/persistence/schema/index.ts +4 -0
- package/src/persistence/schema/memory-injection.ts +62 -0
- package/src/persistence/schema/workflows.ts +55 -0
- package/src/persistence/slow-query-log.ts +437 -0
- package/src/persistence/slow-sync-log.ts +204 -0
- package/src/persistence/steps.ts +16 -0
- package/src/persistence/subagent-store.ts +125 -0
- package/src/persistence/worker-control.ts +45 -238
- package/src/plugin-api/event-hub-facade.ts +172 -0
- package/src/plugin-api/index.ts +9 -1
- package/src/plugin-api/types.ts +40 -9
- package/src/plugins/defaults/default-plugin-names.ts +60 -0
- package/src/plugins/defaults/index.ts +19 -29
- package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +46 -67
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/find-most-recent-retrospective-for.test.ts +2 -4
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +9 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +7 -4
- package/src/plugins/defaults/memory/config.ts +11 -0
- package/src/plugins/defaults/memory/context-search/agent-runner.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +124 -113
- package/src/plugins/defaults/memory/embeddings.ts +77 -0
- package/src/plugins/defaults/memory/find-most-recent-retrospective-for.ts +66 -0
- package/src/plugins/defaults/memory/frontmatter.ts +50 -0
- package/src/plugins/defaults/memory/graph/bootstrap.test.ts +36 -10
- package/src/plugins/defaults/memory/graph/bootstrap.ts +6 -5
- package/src/plugins/defaults/memory/graph/consolidation.ts +3 -5
- package/src/plugins/defaults/memory/graph/extraction.ts +3 -6
- package/src/plugins/defaults/memory/graph/graph-search.ts +12 -23
- package/src/plugins/defaults/memory/graph/narrative.ts +3 -5
- package/src/plugins/defaults/memory/graph/pattern-scan.ts +3 -5
- package/src/plugins/defaults/memory/graph/retriever.test.ts +1 -6
- package/src/plugins/defaults/memory/graph/retriever.ts +5 -10
- package/src/plugins/defaults/memory/graph/tools.ts +1 -1
- package/src/plugins/defaults/memory/hooks/init.ts +31 -5
- package/src/plugins/defaults/memory/indexer.ts +2 -3
- package/src/plugins/defaults/memory/injectors.ts +2 -2
- package/src/plugins/defaults/memory/job-handler-registration.ts +96 -0
- package/src/plugins/defaults/memory/job-handlers/backfill.ts +4 -26
- package/src/plugins/defaults/memory/job-handlers/embedding.test.ts +6 -19
- package/src/plugins/defaults/memory/job-handlers/embedding.ts +9 -22
- package/src/plugins/defaults/memory/job-handlers/index-maintenance.ts +2 -3
- package/src/plugins/defaults/memory/job-handlers.ts +13 -12
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +1 -1
- package/src/plugins/defaults/memory/llm-helpers.ts +76 -0
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +8 -5
- package/src/plugins/defaults/memory/memory-retrospective-startup-cleanup.ts +2 -2
- package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +2 -0
- package/src/plugins/defaults/memory/persistence-hooks.ts +46 -1
- package/src/plugins/defaults/memory/pkb/pkb-index.ts +1 -5
- package/src/plugins/defaults/memory/pkb/pkb-search.ts +2 -2
- package/src/plugins/defaults/memory/routes/__tests__/memory-v2-simulate-route.test.ts +4 -6
- package/src/plugins/defaults/memory/routes/memory-item-routes.ts +1 -1
- package/src/plugins/defaults/memory/search/semantic.ts +2 -2
- package/src/plugins/defaults/memory/startup.ts +244 -0
- package/src/plugins/defaults/memory/task-memory-cleanup.ts +8 -0
- package/src/{daemon → plugins/defaults/memory/v2}/__tests__/memory-v2-startup.test.ts +6 -6
- package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +2 -13
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +4 -5
- package/src/plugins/defaults/memory/v2/__tests__/sweep-job.test.ts +1 -8
- package/src/plugins/defaults/memory/v2/activation.ts +2 -4
- package/src/plugins/defaults/memory/v2/cli-command-store.ts +2 -4
- package/src/plugins/defaults/memory/v2/frontmatter-sweep.ts +1 -1
- package/src/{daemon → plugins/defaults/memory/v2}/memory-v2-startup.test.ts +8 -8
- package/src/{daemon → plugins/defaults/memory/v2}/memory-v2-startup.ts +20 -22
- package/src/plugins/defaults/memory/v2/migration.ts +2 -5
- package/src/plugins/defaults/memory/v2/page-store.ts +1 -1
- package/src/plugins/defaults/memory/v2/qdrant.ts +2 -3
- package/src/plugins/defaults/memory/v2/router.ts +5 -5
- package/src/plugins/defaults/memory/v2/sim.ts +2 -4
- package/src/plugins/defaults/memory/v2/skill-store.ts +2 -4
- package/src/plugins/defaults/memory/v2/sweep-job.ts +6 -6
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +11 -9
- package/src/plugins/defaults/memory/v3/__tests__/dense.test.ts +107 -2
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +69 -0
- package/src/plugins/defaults/memory/v3/__tests__/gate.test.ts +181 -0
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +7 -3
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +345 -8
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +1 -4
- package/src/plugins/defaults/memory/v3/__tests__/section-needle.test.ts +64 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +18 -13
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +62 -1
- package/src/plugins/defaults/memory/v3/card.ts +1 -4
- package/src/plugins/defaults/memory/v3/dense.ts +60 -25
- package/src/plugins/defaults/memory/v3/edge.ts +1 -1
- package/src/plugins/defaults/memory/v3/gate-flag.ts +20 -0
- package/src/plugins/defaults/memory/v3/gate.ts +158 -0
- package/src/plugins/defaults/memory/v3/maintain-job.ts +2 -4
- package/src/plugins/defaults/memory/v3/orchestrate.ts +186 -25
- package/src/plugins/defaults/memory/v3/pool-select.test.ts +7 -9
- package/src/plugins/defaults/memory/v3/pool-select.ts +6 -6
- package/src/plugins/defaults/memory/v3/prune.ts +2 -2
- package/src/plugins/defaults/memory/v3/section-dense-store.ts +8 -11
- package/src/plugins/defaults/memory/v3/section-needle.ts +27 -7
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +10 -0
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +1 -4
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +5 -0
- package/src/plugins/defaults/turn-context/injectors.ts +1 -0
- package/src/plugins/defaults/turn-context/unified-turn-context.ts +12 -0
- package/src/plugins/injector-registry.ts +13 -2
- package/src/plugins/mtime-cache.ts +36 -47
- package/src/plugins/pipeline.ts +15 -1
- package/src/plugins/types.ts +14 -23
- package/src/prompts/__tests__/system-prompt.test.ts +170 -32
- package/src/prompts/persona-resolver.ts +13 -9
- package/src/prompts/system-prompt.ts +30 -9
- package/src/prompts/templates/BOOTSTRAP.md +16 -119
- package/src/prompts/templates/SOUL.md +43 -13
- package/src/prompts/templates/system-sections.ts +32 -27
- package/src/prompts/templates/users/default.md +19 -0
- package/src/providers/__tests__/placeholder-sentinels.test.ts +56 -0
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +96 -1
- package/src/providers/model-intents.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +14 -1
- package/src/providers/openai/responses-provider.ts +18 -0
- package/src/providers/placeholder-sentinels.ts +18 -8
- package/src/providers/retry.ts +1 -0
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +0 -64
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +92 -79
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +98 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +62 -3
- package/src/providers/speech-to-text/provider-catalog.ts +0 -89
- package/src/providers/speech-to-text/resolve.ts +55 -0
- package/src/providers/tool-progress-events.test.ts +50 -0
- package/src/providers/tool-progress-events.ts +99 -0
- package/src/providers/types.ts +1 -1
- package/src/providers/vellum-model-routing.test.ts +51 -0
- package/src/providers/vellum-model-routing.ts +84 -0
- package/src/runtime/AGENTS.md +5 -4
- package/src/runtime/__tests__/agent-wake.test.ts +158 -1
- package/src/runtime/__tests__/channel-verification-service.test.ts +2 -2
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +37 -8
- package/src/runtime/access-request-helper.ts +154 -3
- package/src/runtime/actor-trust-resolver.ts +7 -21
- package/src/runtime/agent-wake.ts +41 -1
- package/src/runtime/assistant-event.ts +86 -12
- package/src/runtime/auth/__tests__/route-policy.test.ts +31 -0
- package/src/runtime/channel-approval-types.ts +52 -2
- package/src/runtime/channel-approvals.ts +23 -8
- package/src/runtime/channel-invite-transport.ts +2 -2
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-readiness-service.ts +3 -5
- package/src/runtime/channel-retry-sweep.ts +18 -24
- package/src/runtime/channel-verification-service.ts +9 -11
- package/src/runtime/finalize-event-delivery.ts +30 -16
- package/src/runtime/guardian-action-service.ts +10 -11
- package/src/runtime/guardian-reply-router.ts +122 -21
- package/src/runtime/http-server.ts +44 -101
- package/src/runtime/introduction-policy.test.ts +214 -0
- package/src/runtime/introduction-policy.ts +284 -0
- package/src/runtime/invite-service.ts +104 -361
- package/src/runtime/local-actor-identity.test.ts +38 -0
- package/src/runtime/local-actor-identity.ts +14 -0
- package/src/runtime/middleware/__tests__/rate-limiter.test.ts +22 -0
- package/src/runtime/middleware/rate-limiter.ts +30 -0
- package/src/runtime/middleware/twilio-validation.ts +5 -7
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +28 -0
- package/src/runtime/migrations/origin-mode.ts +6 -6
- package/src/runtime/pre-first-message-gate.ts +1 -0
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +6 -35
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +24 -3
- package/src/runtime/routes/__tests__/contact-routes.test.ts +80 -15
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +7 -1
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -3
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +142 -1
- package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +119 -30
- package/src/runtime/routes/__tests__/migration-import-allowed-hosts-env.test.ts +70 -0
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +194 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +755 -29
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +4 -0
- package/src/runtime/routes/__tests__/schedule-routes-create.test.ts +70 -0
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +161 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +1 -1
- package/src/runtime/routes/acp-routes.ts +15 -3
- package/src/runtime/routes/app-management-routes.ts +4 -7
- package/src/runtime/routes/approval-routes.ts +4 -0
- package/src/runtime/routes/attachment-routes.ts +54 -3
- package/src/runtime/routes/avatar-routes.ts +0 -4
- package/src/runtime/routes/background-tool-routes.ts +34 -5
- package/src/runtime/routes/btw-routes.ts +32 -4
- package/src/runtime/routes/channel-route-shared.ts +18 -14
- package/src/runtime/routes/channel-verification-routes.ts +0 -3
- package/src/runtime/routes/contact-routes.ts +298 -117
- package/src/runtime/routes/conversation-list-routes.ts +6 -0
- package/src/runtime/routes/conversation-management-routes.ts +74 -37
- package/src/runtime/routes/conversation-query-routes.ts +5 -2
- package/src/runtime/routes/conversation-routes.ts +222 -82
- package/src/runtime/routes/conversations-import-routes.ts +8 -1
- package/src/runtime/routes/credential-prompt-routes.ts +20 -5
- package/src/runtime/routes/debug-routes.ts +1 -0
- package/src/runtime/routes/documents-routes.ts +5 -2
- package/src/runtime/routes/empty-state-greeting-cache.ts +37 -10
- package/src/runtime/routes/global-search-routes.ts +2 -1
- package/src/runtime/routes/guardian-approval-interception.ts +51 -0
- package/src/runtime/routes/home-feed-routes.ts +60 -1
- package/src/runtime/routes/identity-routes.ts +4 -87
- package/src/runtime/routes/inbound-message-handler.ts +82 -41
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +430 -57
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +302 -572
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +76 -270
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +21 -116
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +9 -1
- package/src/runtime/routes/inbound-stages/escalation-intercept.test.ts +158 -0
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +22 -1
- package/src/runtime/routes/index.ts +6 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +22 -16
- package/src/runtime/routes/internal-twilio-routes.ts +0 -15
- package/src/runtime/routes/messages-lexical-routes.ts +75 -0
- package/src/runtime/routes/migration-routes.ts +69 -6
- package/src/runtime/routes/monitoring-routes.ts +237 -0
- package/src/runtime/routes/plugins-routes.ts +329 -8
- package/src/runtime/routes/schedule-routes.ts +49 -8
- package/src/runtime/routes/schedule-worker-routes.ts +210 -0
- package/src/runtime/routes/secret-routes.ts +1 -1
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +54 -9
- package/src/runtime/services/__tests__/auto-analysis-enqueue.test.ts +30 -6
- package/src/runtime/services/__tests__/conversation-analyze-job.test.ts +43 -8
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +20 -0
- package/src/runtime/services/analyze-conversation.ts +14 -4
- package/src/runtime/services/conversation-serializer.ts +5 -0
- package/src/runtime/slack-no-response.ts +47 -0
- package/src/runtime/slack-reply-session.test.ts +633 -0
- package/src/runtime/slack-reply-session.ts +382 -0
- package/src/runtime/slack-task-progress.ts +95 -0
- package/src/runtime/sync/resource-sync-events.ts +25 -0
- package/src/runtime/tool-grant-request-helper.ts +17 -1
- package/src/runtime/trust-class.test.ts +141 -0
- package/src/runtime/trust-class.ts +121 -0
- package/src/runtime/trust-verdict-consumer.ts +7 -6
- package/src/schedule/__tests__/run-script.test.ts +21 -0
- package/src/schedule/__tests__/worker-control.test.ts +241 -0
- package/src/schedule/run-script.ts +13 -6
- package/src/schedule/schedule-usage-store.ts +1 -0
- package/src/schedule/scheduler.ts +178 -127
- package/src/schedule/worker-control.ts +118 -0
- package/src/schedule/worker.ts +131 -0
- package/src/skills/__tests__/categories-cache.test.ts +38 -0
- package/src/skills/categories-cache.ts +40 -5
- package/src/skills/managed-store.ts +41 -6
- package/src/skills/validate-input.ts +47 -0
- package/src/stt/types.ts +5 -9
- package/src/subagent/manager.ts +267 -39
- package/src/subagent/types.ts +6 -2
- package/src/subagent/validate-allowlists.ts +65 -0
- package/src/telemetry/watchdog-direct-emit.test.ts +109 -0
- package/src/telemetry/watchdog-direct-emit.ts +89 -0
- package/src/tools/acp/list-agents.test.ts +0 -6
- package/src/tools/background-tool-registry.ts +61 -0
- package/src/tools/document/document-comment-tool.test.ts +4 -0
- package/src/tools/host-terminal/host-shell.test.ts +397 -0
- package/src/tools/host-terminal/host-shell.ts +203 -14
- package/src/tools/skills/find-similar-skills.test.ts +152 -1
- package/src/tools/skills/find-similar-skills.ts +30 -4
- package/src/tools/skills/load.ts +36 -0
- package/src/tools/skills/scaffold-managed.ts +66 -34
- package/src/tools/skills/skill-script-runner.ts +17 -0
- package/src/tools/skills/skill-tool-factory.ts +5 -1
- package/src/tools/terminal/safe-env.ts +3 -0
- package/src/tools/terminal/shell.test.ts +177 -0
- package/src/tools/terminal/shell.ts +98 -4
- package/src/tools/tool-approval-handler.ts +106 -29
- package/{node_modules/@vellumai/skill-host-contracts/src → src/tools}/tool-types.ts +16 -17
- package/src/tools/types.ts +29 -17
- package/src/tools/ui-surface/definitions.ts +3 -1
- package/src/tts/__tests__/provider-adapters.test.ts +37 -0
- package/src/tts/__tests__/provider-catalog.test.ts +21 -0
- package/src/tts/provider-catalog.ts +40 -9
- package/src/tts/providers/fish-audio-provider.ts +19 -10
- package/src/tts/types.ts +3 -4
- package/src/util/__tests__/process-tree.test.ts +10 -2
- package/src/util/__tests__/text-spacing.test.ts +53 -0
- package/src/util/cgroup-memory.ts +142 -0
- package/src/util/image-conversion.ts +281 -0
- package/src/util/phone.ts +1 -8
- package/src/util/platform.ts +33 -0
- package/src/util/process-tree.ts +10 -2
- package/src/util/text-spacing.ts +53 -0
- package/src/util/worker-process.ts +271 -0
- package/src/workflows/journal-store.ts +16 -1
- package/src/workflows/library.test.ts +35 -20
- package/src/workflows/library.ts +105 -66
- package/src/workspace/git-service.ts +1 -0
- package/src/workspace/migrations/011-backfill-installation-id.ts +83 -31
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +41 -22
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +1 -1
- package/src/workspace/migrations/118-seed-now-md.ts +64 -0
- package/src/workspace/migrations/119-strip-persisted-memory-v3-tuning-defaults.ts +169 -0
- package/src/workspace/migrations/120-revise-onboarding-threads.ts +47 -0
- package/src/workspace/migrations/121-seed-default-user-guardrails.ts +82 -0
- package/src/workspace/migrations/122-relocate-default-user-boundary.ts +111 -0
- package/src/workspace/migrations/123-swap-quality-profile-to-fable.ts +85 -0
- package/src/workspace/migrations/__tests__/119-strip-persisted-memory-v3-tuning-defaults.test.ts +181 -0
- package/src/workspace/migrations/registry.ts +12 -0
- package/drizzle/0000_dizzy_maggott.sql +0 -301
- package/drizzle/meta/0000_snapshot.json +0 -1933
- package/drizzle/meta/_journal.json +0 -13
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +0 -887
- package/node_modules/@vellumai/skill-host-contracts/bun.lock +0 -24
- package/node_modules/@vellumai/skill-host-contracts/package.json +0 -18
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -97
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +0 -1349
- package/node_modules/@vellumai/skill-host-contracts/src/index.ts +0 -6
- package/node_modules/@vellumai/skill-host-contracts/src/runtime-mode.ts +0 -11
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +0 -32
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +0 -333
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.json +0 -20
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.test.json +0 -12
- package/src/__tests__/invite-redemption-service.test.ts +0 -1180
- package/src/__tests__/invite-service-ipc.test.ts +0 -350
- package/src/__tests__/job-handler-registry-guard.test.ts +0 -125
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +0 -203
- package/src/__tests__/relay-server.test.ts +0 -6153
- package/src/__tests__/telephony-stt-routing.test.ts +0 -329
- package/src/__tests__/voice-invite-redemption.test.ts +0 -702
- package/src/calls/relay-server.ts +0 -2463
- package/src/calls/telephony-stt-routing.ts +0 -145
- package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +0 -128
- package/src/daemon/__tests__/daemon-skill-host.test.ts +0 -273
- package/src/daemon/daemon-skill-host.ts +0 -262
- package/src/daemon/message-types/meet.ts +0 -143
- package/src/daemon/shutdown-registry.ts +0 -40
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -253
- package/src/ipc/__tests__/skill-server.test.ts +0 -182
- package/src/ipc/skill-ipc-types.ts +0 -54
- package/src/ipc/skill-routes/__tests__/config.test.ts +0 -146
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +0 -448
- package/src/ipc/skill-routes/__tests__/identity.test.ts +0 -62
- package/src/ipc/skill-routes/__tests__/log.test.ts +0 -133
- package/src/ipc/skill-routes/__tests__/memory.test.ts +0 -203
- package/src/ipc/skill-routes/__tests__/platform.test.ts +0 -111
- package/src/ipc/skill-routes/__tests__/providers.test.ts +0 -265
- package/src/ipc/skill-routes/__tests__/registries.test.ts +0 -400
- package/src/ipc/skill-routes/config.ts +0 -47
- package/src/ipc/skill-routes/events.ts +0 -147
- package/src/ipc/skill-routes/identity.ts +0 -21
- package/src/ipc/skill-routes/index.ts +0 -37
- package/src/ipc/skill-routes/log.ts +0 -40
- package/src/ipc/skill-routes/memory.ts +0 -92
- package/src/ipc/skill-routes/platform.ts +0 -39
- package/src/ipc/skill-routes/providers.ts +0 -162
- package/src/ipc/skill-routes/registries.ts +0 -338
- package/src/ipc/skill-server.ts +0 -831
- package/src/ipc/skill-socket-path.ts +0 -20
- package/src/jobs/register-job-handlers.ts +0 -74
- package/src/persistence/invite-store.ts +0 -481
- package/src/plugins/job-handler-registry.ts +0 -94
- package/src/providers/cache-control.ts +0 -26
- package/src/runtime/__tests__/runtime-mode.test.ts +0 -62
- package/src/runtime/invite-redemption-service.ts +0 -828
- package/src/runtime/invite-redemption-templates.ts +0 -46
- package/src/runtime/runtime-mode.ts +0 -40
- package/src/runtime/slack-dm-text-delivery.ts +0 -177
- package/src/util/voice-code.ts +0 -31
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* End-of-turn finalize work that runs OFF the send-button critical path.
|
|
3
|
+
*
|
|
4
|
+
* The web/Capacitor/CLI clients re-enable the composer the moment they observe
|
|
5
|
+
* the terminal `message_complete` / `assistant_activity_state("idle")` SSE, so
|
|
6
|
+
* any awaited work between the last streamed token and that emission is what the
|
|
7
|
+
* user perceives as the "still spinning after the reply finished" gap.
|
|
8
|
+
*
|
|
9
|
+
* None of the work here gates delivery of the reply: memory/attention indexing
|
|
10
|
+
* only feeds the NEXT turn's retrieval and a sidebar indicator, tool-result
|
|
11
|
+
* truncation only reshapes the in-memory history the next turn is built from,
|
|
12
|
+
* and the disk-view mirror is a durability convenience. The agent loop persists
|
|
13
|
+
* the reply content synchronously and emits the terminal SSE first, then drains
|
|
14
|
+
* this module's work before the turn's `finally` starts the next turn — so the
|
|
15
|
+
* bookkeeping still completes within the turn, just after the composer is free.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type pino from "pino";
|
|
19
|
+
|
|
20
|
+
import { getConfig } from "../config/loader.js";
|
|
21
|
+
import {
|
|
22
|
+
derefToolResultReReads,
|
|
23
|
+
postTurnTruncateToolResults,
|
|
24
|
+
} from "../context/post-turn-tool-result-truncation.js";
|
|
25
|
+
import { projectAssistantMessage } from "../persistence/conversation-attention-store.js";
|
|
26
|
+
import {
|
|
27
|
+
getConversation,
|
|
28
|
+
getMessageById,
|
|
29
|
+
parseMessageMetadata,
|
|
30
|
+
} from "../persistence/conversation-crud.js";
|
|
31
|
+
import { getResolvedConversationDirPath } from "../persistence/conversation-directories.js";
|
|
32
|
+
import { syncMessageToDisk } from "../persistence/conversation-disk-view.js";
|
|
33
|
+
import { enqueueLexicalIndexForMessage } from "../persistence/job-handlers/message-lexical.js";
|
|
34
|
+
import { indexMessageNow } from "../plugins/defaults/memory/indexer.js";
|
|
35
|
+
import type { Message } from "../providers/types.js";
|
|
36
|
+
import { publishSyncInvalidation } from "../runtime/sync/sync-publisher.js";
|
|
37
|
+
import { conversationMetadataSyncTag } from "./message-types/sync.js";
|
|
38
|
+
|
|
39
|
+
/** Minimal live-conversation surface the deferred tail reads and rewrites. */
|
|
40
|
+
interface TurnTailContext {
|
|
41
|
+
readonly conversationId: string;
|
|
42
|
+
messages: Message[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Minimal per-run handler state the deferred tail consumes. */
|
|
46
|
+
interface TurnTailState {
|
|
47
|
+
readonly deferredFinalizeEffects: ReadonlyArray<() => Promise<void>>;
|
|
48
|
+
readonly lastAssistantMessageId: string | undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Build the deferred finalize side-effect for one finalized assistant row:
|
|
53
|
+
* memory segment indexing, lexical indexing, and attention projection.
|
|
54
|
+
*
|
|
55
|
+
* `reserveMessage` + `updateMessageContent` are CRUD-only — unlike `addMessage`,
|
|
56
|
+
* they don't run the memory indexer or the attention-cursor projector as insert
|
|
57
|
+
* side-effects — so the assistant row's external state (Qdrant segments,
|
|
58
|
+
* attention cursor) is brought into lockstep with the finalized content here.
|
|
59
|
+
* The returned closure captures the row id and its already-persisted content
|
|
60
|
+
* JSON, and is drained by {@link runDeferredTurnTail} after the terminal SSE.
|
|
61
|
+
* Each step is best-effort: a memory hiccup must not escalate a delivered reply
|
|
62
|
+
* into a turn-level throw.
|
|
63
|
+
*/
|
|
64
|
+
export function buildDeferredFinalizeEffect(params: {
|
|
65
|
+
conversationId: string;
|
|
66
|
+
assistantMessageId: string;
|
|
67
|
+
contentJson: string;
|
|
68
|
+
rlog: pino.Logger;
|
|
69
|
+
}): () => Promise<void> {
|
|
70
|
+
const { conversationId, assistantMessageId, contentJson, rlog } = params;
|
|
71
|
+
return async () => {
|
|
72
|
+
const finalizedRow = getMessageById(assistantMessageId, conversationId);
|
|
73
|
+
if (!finalizedRow) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Provenance/automation flags for the memory write-gate come off the
|
|
77
|
+
// persisted metadata via the shared `parseMessageMetadata` (the single
|
|
78
|
+
// source of truth for its shape) rather than a hand-copied union.
|
|
79
|
+
const metadata = parseMessageMetadata(finalizedRow.metadata);
|
|
80
|
+
try {
|
|
81
|
+
await indexMessageNow(
|
|
82
|
+
{
|
|
83
|
+
messageId: assistantMessageId,
|
|
84
|
+
conversationId,
|
|
85
|
+
role: "assistant",
|
|
86
|
+
content: contentJson,
|
|
87
|
+
createdAt: finalizedRow.createdAt,
|
|
88
|
+
scopeId: "default",
|
|
89
|
+
provenanceTrustClass: metadata?.provenanceTrustClass,
|
|
90
|
+
automated: metadata?.automated,
|
|
91
|
+
},
|
|
92
|
+
getConfig().memory,
|
|
93
|
+
);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
rlog.warn(
|
|
96
|
+
{ err, conversationId, messageId: assistantMessageId },
|
|
97
|
+
"Failed to index assistant message for memory (non-fatal)",
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
// Dual-write the finalized assistant content into the lexical index. The
|
|
101
|
+
// reserve+finalize path bypasses `onMessagePersisted`, so enqueue here to
|
|
102
|
+
// keep the lexical index in lockstep with the segment index.
|
|
103
|
+
enqueueLexicalIndexForMessage(assistantMessageId);
|
|
104
|
+
try {
|
|
105
|
+
const attentionStateChanged = projectAssistantMessage({
|
|
106
|
+
conversationId,
|
|
107
|
+
messageId: assistantMessageId,
|
|
108
|
+
messageAt: finalizedRow.createdAt,
|
|
109
|
+
});
|
|
110
|
+
if (attentionStateChanged) {
|
|
111
|
+
void publishSyncInvalidation([
|
|
112
|
+
conversationMetadataSyncTag(conversationId),
|
|
113
|
+
]);
|
|
114
|
+
}
|
|
115
|
+
} catch (err) {
|
|
116
|
+
rlog.warn(
|
|
117
|
+
{ err, conversationId, messageId: assistantMessageId },
|
|
118
|
+
"Failed to project assistant message for attention tracking (non-fatal)",
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Drain a turn's deferred bookkeeping after the terminal SSE has re-enabled the
|
|
126
|
+
* composer but before the agent loop's `finally` commits and drains the queue
|
|
127
|
+
* for the next turn. Ordering with the next turn is preserved (this completes
|
|
128
|
+
* before `drainQueue`), while the last-token→send-button latency no longer
|
|
129
|
+
* includes it. Every step is best-effort.
|
|
130
|
+
*
|
|
131
|
+
* `generationCompletedAt` is stamped when the agent loop returns; the emitted
|
|
132
|
+
* `criticalSectionMs` / `deferredTailMs` split makes the previously-uninstrumented
|
|
133
|
+
* end-of-turn window measurable.
|
|
134
|
+
*/
|
|
135
|
+
export async function runDeferredTurnTail(params: {
|
|
136
|
+
ctx: TurnTailContext;
|
|
137
|
+
state: TurnTailState;
|
|
138
|
+
rlog: pino.Logger;
|
|
139
|
+
generationCompletedAt: number;
|
|
140
|
+
}): Promise<void> {
|
|
141
|
+
const { ctx, state, rlog, generationCompletedAt } = params;
|
|
142
|
+
const tailStartedAt = Date.now();
|
|
143
|
+
|
|
144
|
+
// Per-message memory/attention finalize side-effects deferred from
|
|
145
|
+
// `handleMessageComplete` — one closure per assistant row produced this turn,
|
|
146
|
+
// in production order.
|
|
147
|
+
for (const effect of state.deferredFinalizeEffects) {
|
|
148
|
+
try {
|
|
149
|
+
await effect();
|
|
150
|
+
} catch (err) {
|
|
151
|
+
rlog.warn({ err }, "Deferred finalize side-effect failed (non-fatal)");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Post-turn tool-result truncation: spool oversized results to disk and
|
|
156
|
+
// replace their in-context content with a stub + pointer, shrinking the next
|
|
157
|
+
// turn's context. Rewrites only the in-memory history, so it has no bearing on
|
|
158
|
+
// the reply already delivered to the client.
|
|
159
|
+
try {
|
|
160
|
+
const conv = getConversation(ctx.conversationId);
|
|
161
|
+
if (conv) {
|
|
162
|
+
const convDir = getResolvedConversationDirPath(
|
|
163
|
+
ctx.conversationId,
|
|
164
|
+
conv.createdAt,
|
|
165
|
+
);
|
|
166
|
+
const { messages: derefMessages, dereferencedCount } =
|
|
167
|
+
derefToolResultReReads(ctx.messages);
|
|
168
|
+
const { messages: truncatedMessages, truncatedCount } =
|
|
169
|
+
postTurnTruncateToolResults(derefMessages, {
|
|
170
|
+
conversationDir: convDir,
|
|
171
|
+
});
|
|
172
|
+
if (truncatedCount > 0 || dereferencedCount > 0) {
|
|
173
|
+
rlog.info(
|
|
174
|
+
{ truncatedCount, dereferencedCount },
|
|
175
|
+
"Post-turn tool result truncation applied",
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
ctx.messages = truncatedMessages;
|
|
179
|
+
}
|
|
180
|
+
} catch (err) {
|
|
181
|
+
rlog.warn({ err }, "Post-turn tool result truncation failed (non-fatal)");
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Mirror the final assistant row into the JSONL disk view. Guarded like the
|
|
185
|
+
// steps above: this runs AFTER the terminal SSE, so a throw here (e.g. a
|
|
186
|
+
// SQLite read failure in `getConversation`) must not escape into the loop's
|
|
187
|
+
// outer catch and emit a second, contradictory terminal event for a turn the
|
|
188
|
+
// client already saw complete.
|
|
189
|
+
try {
|
|
190
|
+
if (state.lastAssistantMessageId) {
|
|
191
|
+
const convForDisk = getConversation(ctx.conversationId);
|
|
192
|
+
if (convForDisk) {
|
|
193
|
+
syncMessageToDisk(
|
|
194
|
+
ctx.conversationId,
|
|
195
|
+
state.lastAssistantMessageId,
|
|
196
|
+
convForDisk.createdAt,
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
} catch (err) {
|
|
201
|
+
rlog.warn({ err }, "Failed to sync assistant message to disk (non-fatal)");
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
rlog.info(
|
|
205
|
+
{
|
|
206
|
+
criticalSectionMs: tailStartedAt - generationCompletedAt,
|
|
207
|
+
deferredTailMs: Date.now() - tailStartedAt,
|
|
208
|
+
},
|
|
209
|
+
"End-of-turn work complete",
|
|
210
|
+
);
|
|
211
|
+
}
|
|
@@ -52,10 +52,12 @@ import {
|
|
|
52
52
|
getConversation,
|
|
53
53
|
getMessages,
|
|
54
54
|
resolveOverrideProfile,
|
|
55
|
+
setConversationEnabledPlugins,
|
|
55
56
|
setConversationHistoryStrippedAt,
|
|
56
57
|
setConversationProcessingStartedAt,
|
|
57
58
|
} from "../persistence/conversation-crud.js";
|
|
58
59
|
import { getResolvedConversationDirPath } from "../persistence/conversation-directories.js";
|
|
60
|
+
import { reportSlowSync } from "../persistence/slow-sync-log.js";
|
|
59
61
|
import { defaultCompact } from "../plugins/defaults/compaction/compact.js";
|
|
60
62
|
import {
|
|
61
63
|
createContextWindowManager,
|
|
@@ -329,6 +331,16 @@ export class Conversation {
|
|
|
329
331
|
inferenceProfile: string | null = null;
|
|
330
332
|
/** @internal */ inferenceProfileSessionId: string | null = null;
|
|
331
333
|
/** @internal */ inferenceProfileExpiresAt: number | null = null;
|
|
334
|
+
/**
|
|
335
|
+
* Per-conversation plugin scope mirrored from the DB row. `null` means no
|
|
336
|
+
* per-chat restriction (all globally-enabled plugins apply). Hydrated on load
|
|
337
|
+
* and kept in sync by {@link setEnabledPlugins}, which also persists the value
|
|
338
|
+
* back to the row, so the live instance is the source of truth; later
|
|
339
|
+
* tool/skill/hook filters intersect their candidate set against this via
|
|
340
|
+
* `getEffectiveEnabledPluginSet`.
|
|
341
|
+
* @internal
|
|
342
|
+
*/
|
|
343
|
+
enabledPlugins: string[] | null = null;
|
|
332
344
|
/** @internal */ currentRequestId?: string;
|
|
333
345
|
/**
|
|
334
346
|
* The {@link LLMCallSite} of the in-flight turn, set at turn start from
|
|
@@ -532,6 +544,25 @@ export class Conversation {
|
|
|
532
544
|
*/
|
|
533
545
|
hostUsername?: string;
|
|
534
546
|
/** @internal */ clientTimezone?: string;
|
|
547
|
+
/**
|
|
548
|
+
* @internal
|
|
549
|
+
* The client's OS surface ("web" | "ios" | "macos"), reported separately
|
|
550
|
+
* from the transport `interfaceId` so the assistant's per-turn context can
|
|
551
|
+
* show the real platform without affecting host-proxy/transport gating.
|
|
552
|
+
* This is the LIVE value (re-applied from transport on every inbound
|
|
553
|
+
* message); the assembly reads the frozen {@link currentTurnClientOs}.
|
|
554
|
+
*/
|
|
555
|
+
clientOs?: string;
|
|
556
|
+
/**
|
|
557
|
+
* Per-turn frozen copy of {@link clientOs}, captured by the agent loop at
|
|
558
|
+
* turn start (like {@link currentTurnTemporalSnapshot}). The assembly reads
|
|
559
|
+
* THIS rather than the live `clientOs` so a newer message from a different
|
|
560
|
+
* OS surface — which re-applies transport metadata via
|
|
561
|
+
* `getOrCreateConversation` before it is enqueued — cannot leak its
|
|
562
|
+
* `client_os` into the in-flight turn's prompt.
|
|
563
|
+
* @internal
|
|
564
|
+
*/
|
|
565
|
+
currentTurnClientOs?: string;
|
|
535
566
|
/**
|
|
536
567
|
* Per-turn temporal snapshot frozen by the agent loop and read by
|
|
537
568
|
* `applyRuntimeInjections` to build the `<turn_context>` timezone-mismatch
|
|
@@ -818,6 +849,32 @@ export class Conversation {
|
|
|
818
849
|
});
|
|
819
850
|
}
|
|
820
851
|
|
|
852
|
+
/**
|
|
853
|
+
* Re-resolve the system prompt for the current turn's persona context and
|
|
854
|
+
* push it into the agent loop when it changed. The loop snapshots its prompt
|
|
855
|
+
* at construction and reuses it every turn; flows that bind persona context
|
|
856
|
+
* after construction — a voice call resolves the caller's trust only after
|
|
857
|
+
* the conversation is created — would otherwise stay pinned to the
|
|
858
|
+
* construction-time persona (the guardian, or `users/default.md`) for the
|
|
859
|
+
* whole conversation.
|
|
860
|
+
*
|
|
861
|
+
* Pushing only when the rebuilt prompt actually differs keeps the provider's
|
|
862
|
+
* prefix cache intact for the common case (a stable-identity conversation
|
|
863
|
+
* rebuilds to the same bytes, so no update is sent). A system-prompt override
|
|
864
|
+
* resolves verbatim via {@link buildCurrentSystemPrompt}, so override
|
|
865
|
+
* conversations (subagent forks, stored overrides) are inherently a no-op.
|
|
866
|
+
*
|
|
867
|
+
* Called by the turn runner before `agentLoop.run()`, once the turn's
|
|
868
|
+
* persona snapshots ({@link currentTurnTrustContext},
|
|
869
|
+
* {@link currentTurnChannelCapabilities}) are set.
|
|
870
|
+
*/
|
|
871
|
+
syncLoopSystemPrompt(): void {
|
|
872
|
+
const next = this.buildCurrentSystemPrompt();
|
|
873
|
+
if (next === this.systemPrompt) return;
|
|
874
|
+
this.systemPrompt = next;
|
|
875
|
+
this.agentLoop.setSystemPrompt(next);
|
|
876
|
+
}
|
|
877
|
+
|
|
821
878
|
// ── Prompt Cache Warming ─────────────────────────────────────────
|
|
822
879
|
|
|
823
880
|
/**
|
|
@@ -868,6 +925,7 @@ export class Conversation {
|
|
|
868
925
|
// ── Lifecycle ────────────────────────────────────────────────────
|
|
869
926
|
|
|
870
927
|
async loadFromDb(): Promise<void> {
|
|
928
|
+
const loadStartedAt = performance.now();
|
|
871
929
|
const trustClass = this.trustContext?.trustClass;
|
|
872
930
|
const canAccessMemory = resolveCapabilities(trustClass).canAccessMemory;
|
|
873
931
|
const allDbMessages = getMessages(this.conversationId);
|
|
@@ -902,6 +960,7 @@ export class Conversation {
|
|
|
902
960
|
this.inferenceProfile = conv?.inferenceProfile ?? null;
|
|
903
961
|
this.inferenceProfileSessionId = conv?.inferenceProfileSessionId ?? null;
|
|
904
962
|
this.inferenceProfileExpiresAt = conv?.inferenceProfileExpiresAt ?? null;
|
|
963
|
+
this.enabledPlugins = conv?.enabledPlugins ?? null;
|
|
905
964
|
this.contextCompactedMessageCount = Math.max(
|
|
906
965
|
0,
|
|
907
966
|
conv?.contextCompactedMessageCount ?? 0,
|
|
@@ -1201,10 +1260,22 @@ export class Conversation {
|
|
|
1201
1260
|
this.loadedHistoryTrustClass = trustClass;
|
|
1202
1261
|
this.loadedHistoryPersonalMemoryAllowed = personalMemoryAllowed;
|
|
1203
1262
|
|
|
1263
|
+
const loadElapsedMs = performance.now() - loadStartedAt;
|
|
1204
1264
|
log.info(
|
|
1205
|
-
{
|
|
1265
|
+
{
|
|
1266
|
+
conversationId: this.conversationId,
|
|
1267
|
+
count: this.messages.length,
|
|
1268
|
+
elapsedMs: loadElapsedMs,
|
|
1269
|
+
},
|
|
1206
1270
|
"Loaded messages from DB",
|
|
1207
1271
|
);
|
|
1272
|
+
// Whole read+parse+repair section — attributes an event-loop freeze to
|
|
1273
|
+
// this conversation load (getMessages times the read alone; the delta is
|
|
1274
|
+
// parse/repair CPU). See slow-sync-log / event-loop-watchdog.
|
|
1275
|
+
reportSlowSync("conversation:load-from-db", loadElapsedMs, {
|
|
1276
|
+
conversationId: this.conversationId,
|
|
1277
|
+
messageCount: this.messages.length,
|
|
1278
|
+
});
|
|
1208
1279
|
|
|
1209
1280
|
this.restoreSurfaceStateFromHistory();
|
|
1210
1281
|
this.graphMemory.restoreState();
|
|
@@ -1305,6 +1376,20 @@ export class Conversation {
|
|
|
1305
1376
|
this.subagentAllowedTools = tools;
|
|
1306
1377
|
}
|
|
1307
1378
|
|
|
1379
|
+
/**
|
|
1380
|
+
* Set the conversation's per-chat plugin scope, updating both the persisted
|
|
1381
|
+
* `enabled_plugins` row and the live instance (source of truth for the
|
|
1382
|
+
* current turn). `null` clears the per-chat restriction. Callers do not
|
|
1383
|
+
* persist separately.
|
|
1384
|
+
*
|
|
1385
|
+
* Persist first, then mutate the live instance: if the write throws, the
|
|
1386
|
+
* live scope is left untouched rather than diverging from the row.
|
|
1387
|
+
*/
|
|
1388
|
+
setEnabledPlugins(plugins: string[] | null): void {
|
|
1389
|
+
setConversationEnabledPlugins(this.conversationId, plugins);
|
|
1390
|
+
this.enabledPlugins = plugins;
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1308
1393
|
setIsSubagent(value: boolean): void {
|
|
1309
1394
|
this.isSubagent = value;
|
|
1310
1395
|
}
|
|
@@ -1953,6 +2038,10 @@ export class Conversation {
|
|
|
1953
2038
|
canonicalizeTimeZone(transport.clientTimezone) ?? undefined;
|
|
1954
2039
|
}
|
|
1955
2040
|
|
|
2041
|
+
applyClientOsFromTransport(transport: ConversationTransportMetadata): void {
|
|
2042
|
+
this.clientOs = transport.clientOs ?? undefined;
|
|
2043
|
+
}
|
|
2044
|
+
|
|
1956
2045
|
setAssistantId(assistantId: string | null): void {
|
|
1957
2046
|
this.assistantId = assistantId ?? undefined;
|
|
1958
2047
|
}
|
|
@@ -2024,6 +2113,8 @@ export class Conversation {
|
|
|
2024
2113
|
isInteractive?: boolean;
|
|
2025
2114
|
isUserMessage?: boolean;
|
|
2026
2115
|
titleText?: string;
|
|
2116
|
+
/** See {@link runAgentLoopImpl} — hidden machine-signal turn marker. */
|
|
2117
|
+
isHiddenPrompt?: boolean;
|
|
2027
2118
|
callSite?: LLMCallSite;
|
|
2028
2119
|
/**
|
|
2029
2120
|
* Optional ad-hoc inference-profile override applied to every LLM call
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { InterfaceId } from "../channels/types.js";
|
|
2
2
|
import type { LLMCallSite } from "../config/schemas/llm.js";
|
|
3
3
|
import { resolveCapabilities } from "../runtime/capabilities.js";
|
|
4
|
+
import { isContactTrustClass } from "../runtime/trust-class.js";
|
|
4
5
|
import type { DiskPressureStatus } from "./disk-pressure-guard.js";
|
|
5
6
|
import type { ConversationType } from "./message-types/shared.js";
|
|
6
7
|
import type { TrustContext } from "./trust-context.js";
|
|
@@ -79,7 +80,7 @@ export function classifyDiskPressureTurnPolicy(
|
|
|
79
80
|
return { action: "allow-cleanup-mode", reason: "guardian" };
|
|
80
81
|
}
|
|
81
82
|
|
|
82
|
-
if (trustClass
|
|
83
|
+
if (isContactTrustClass(trustClass)) {
|
|
83
84
|
return { action: "block", reason: "trusted-contact" };
|
|
84
85
|
}
|
|
85
86
|
|
|
@@ -20,11 +20,12 @@
|
|
|
20
20
|
* What it does NOT do: capture the JS stack of the blocking operation. JS is
|
|
21
21
|
* single-threaded, so while the loop is blocked no callback — including this one
|
|
22
22
|
* — can run; by the time the tick fires, the offending synchronous call has
|
|
23
|
-
* returned and its stack is gone.
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
23
|
+
* returned and its stack is gone. Instead, each freeze report carries the
|
|
24
|
+
* section trail (`persistence/slow-sync-log.ts`): the recent instrumented
|
|
25
|
+
* sections with their start/end ages relative to the report. The newest entry
|
|
26
|
+
* older than `blockedMs` that hadn't ended when the block began names — or
|
|
27
|
+
* brackets — the code that froze. For sub-threshold contributors, time the
|
|
28
|
+
* subsystem's synchronous calls at their source with `timeSyncSection`.
|
|
28
29
|
*
|
|
29
30
|
* A cumulative event-loop-delay histogram is separately exposed pull-based over
|
|
30
31
|
* SSE diagnostics (`runtime/routes/events-routes.ts`); this watchdog is the
|
|
@@ -33,6 +34,10 @@
|
|
|
33
34
|
|
|
34
35
|
import * as Sentry from "@sentry/node";
|
|
35
36
|
|
|
37
|
+
import {
|
|
38
|
+
getSectionTrail,
|
|
39
|
+
type SectionTrailEntry,
|
|
40
|
+
} from "../persistence/slow-sync-log.js";
|
|
36
41
|
import { recordWatchdogEvent } from "../telemetry/watchdog-events-store.js";
|
|
37
42
|
import { getLogger } from "../util/logger.js";
|
|
38
43
|
|
|
@@ -84,8 +89,17 @@ export function evaluateTick(
|
|
|
84
89
|
export const EVENT_LOOP_BLOCKED_CHECK_NAME = "event_loop_blocked";
|
|
85
90
|
|
|
86
91
|
function reportBlock(blockedMs: number, thresholdMs: number): void {
|
|
92
|
+
// Attribution breadcrumbs: the block began ~`blockedMs` before this report,
|
|
93
|
+
// so the newest trail entry started at least that long ago — and not yet
|
|
94
|
+
// ended by then — is the section that was running when the loop froze.
|
|
95
|
+
let sectionTrail: SectionTrailEntry[] = [];
|
|
96
|
+
try {
|
|
97
|
+
sectionTrail = getSectionTrail();
|
|
98
|
+
} catch {
|
|
99
|
+
// Diagnostics-only — never let it escape the timer callback.
|
|
100
|
+
}
|
|
87
101
|
log.warn(
|
|
88
|
-
{ blockedMs, thresholdMs, tickIntervalMs: TICK_INTERVAL_MS },
|
|
102
|
+
{ blockedMs, thresholdMs, tickIntervalMs: TICK_INTERVAL_MS, sectionTrail },
|
|
89
103
|
"event loop blocked",
|
|
90
104
|
);
|
|
91
105
|
// Persist a `watchdog` telemetry event so the platform can surface
|
|
@@ -101,6 +115,7 @@ function reportBlock(blockedMs: number, thresholdMs: number): void {
|
|
|
101
115
|
detail: {
|
|
102
116
|
threshold_ms: thresholdMs,
|
|
103
117
|
tick_interval_ms: TICK_INTERVAL_MS,
|
|
118
|
+
section_trail: sectionTrail,
|
|
104
119
|
},
|
|
105
120
|
});
|
|
106
121
|
} catch {
|
|
@@ -114,6 +129,7 @@ function reportBlock(blockedMs: number, thresholdMs: number): void {
|
|
|
114
129
|
blocked_ms: blockedMs,
|
|
115
130
|
threshold_ms: thresholdMs,
|
|
116
131
|
tick_interval_ms: TICK_INTERVAL_MS,
|
|
132
|
+
section_trail: sectionTrail,
|
|
117
133
|
});
|
|
118
134
|
Sentry.captureMessage(EVENT_LOOP_BLOCKED_CHECK_NAME);
|
|
119
135
|
});
|