@vellumai/assistant 0.10.12 → 0.11.0-staging.1
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 +1 -1
- package/ARCHITECTURE.md +4 -5
- package/README.md +1 -1
- package/docs/architecture/memory.md +60 -23
- package/docs/error-handling.md +3 -3
- package/docs/guardian-request-flow.md +112 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/openapi.yaml +246 -10
- package/package.json +2 -2
- package/src/__tests__/acp-session.test.ts +3 -3
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
- package/src/__tests__/anthropic-provider.test.ts +40 -0
- package/src/__tests__/approval-cascade.test.ts +5 -5
- package/src/__tests__/approval-routes-http.test.ts +3 -3
- package/src/__tests__/ask-question-resolver.test.ts +207 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
- package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
- package/src/__tests__/assistant-event-hub.test.ts +13 -11
- package/src/__tests__/assistant-event.test.ts +12 -9
- 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__/assistant-id-boundary-guard.test.ts +0 -58
- package/src/__tests__/assistant-stream-state.test.ts +17 -7
- package/src/__tests__/avatar-identity-sync.test.ts +3 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +134 -18
- package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
- package/src/__tests__/channel-approvals.test.ts +0 -27
- package/src/__tests__/channel-guardian.test.ts +85 -512
- package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
- package/src/__tests__/channel-retry-sweep.test.ts +88 -1
- package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
- package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
- package/src/__tests__/config-model-image-provider.test.ts +20 -0
- package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
- package/src/__tests__/config-schema.test.ts +14 -2
- package/src/__tests__/config-set-platform-guard.test.ts +11 -12
- package/src/__tests__/config-sounds-sync.test.ts +4 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
- package/src/__tests__/context-search-memory-source.test.ts +1 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
- package/src/__tests__/context-token-estimator.test.ts +54 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
- package/src/__tests__/conversation-agent-loop.test.ts +39 -30
- package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
- package/src/__tests__/conversation-evictor.test.ts +49 -0
- package/src/__tests__/conversation-fork-crud.test.ts +1 -1
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
- package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
- package/src/__tests__/conversation-queue.test.ts +81 -81
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
- package/src/__tests__/conversation-slash-queue.test.ts +11 -11
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +2 -2
- package/src/__tests__/conversation-summarize-route.test.ts +9 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
- package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
- package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
- package/src/__tests__/conversation-sync-tags.test.ts +5 -5
- package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
- package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/daemon-assistant-events.test.ts +14 -15
- package/src/__tests__/db-test-helpers.ts +13 -27
- package/src/__tests__/disk-pressure-routes.test.ts +12 -3
- package/src/__tests__/document-tool-security.test.ts +95 -0
- package/src/__tests__/drain-kick-guard.test.ts +232 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
- package/src/__tests__/emit-event-signal.test.ts +5 -6
- package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
- package/src/__tests__/events-tail-route.test.ts +6 -4
- package/src/__tests__/feature-flag-test-helpers.ts +10 -20
- package/src/__tests__/file-edit-tool.test.ts +24 -4
- package/src/__tests__/file-list-tool.test.ts +2 -1
- package/src/__tests__/file-read-tool.test.ts +62 -10
- package/src/__tests__/file-write-tool.test.ts +24 -5
- package/src/__tests__/followup-tools.test.ts +58 -0
- package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-question-mode.test.ts +42 -3
- package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
- package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
- package/src/__tests__/host-browser-proxy.test.ts +1 -1
- package/src/__tests__/host-file-edit-tool.test.ts +3 -3
- package/src/__tests__/host-file-read-tool.test.ts +2 -2
- package/src/__tests__/host-file-write-tool.test.ts +7 -3
- package/src/__tests__/host-shell-tool.test.ts +17 -5
- package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +65 -8
- package/src/__tests__/injection-block.test.ts +4 -4
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
- package/src/__tests__/injector-v3-suppression.test.ts +6 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
- package/src/__tests__/list-messages-page-latest.test.ts +2 -2
- package/src/__tests__/llm-usage-store.test.ts +67 -4
- package/src/__tests__/log-redact.test.ts +18 -0
- package/src/__tests__/managed-profile-guard.test.ts +27 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +62 -11
- package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
- package/src/__tests__/notification-decision-strategy.test.ts +115 -11
- package/src/__tests__/notification-deep-link.test.ts +12 -12
- package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +315 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
- package/src/__tests__/persistence-layering-guard.test.ts +2 -2
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
- package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
- package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
- package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
- package/src/__tests__/require-fresh-approval.test.ts +38 -38
- package/src/__tests__/run-due-schedules.test.ts +72 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +44 -5
- package/src/__tests__/schedule-store.test.ts +3 -3
- package/src/__tests__/schedule-tools.test.ts +176 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
- package/src/__tests__/secret-response-routing.test.ts +3 -3
- package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
- package/src/__tests__/secret-scanner.test.ts +36 -0
- package/src/__tests__/send-endpoint-busy.test.ts +7 -7
- package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
- package/src/__tests__/starter-task-flow.test.ts +6 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-disposal.test.ts +40 -11
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
- package/src/__tests__/subagent-manager-notify.test.ts +73 -14
- package/src/__tests__/subagent-notify-parent.test.ts +48 -4
- package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
- package/src/__tests__/subagent-tools.test.ts +64 -0
- package/src/__tests__/sync-message-contract.test.ts +3 -3
- package/src/__tests__/terminal-tools.test.ts +12 -3
- package/src/__tests__/test-preload.ts +9 -0
- package/src/__tests__/tool-approval-handler.test.ts +583 -43
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
- package/src/__tests__/tool-executor.test.ts +116 -0
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
- package/src/__tests__/tool-start-timestamp.test.ts +4 -4
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
- package/src/__tests__/ui-work-result-surface.test.ts +3 -3
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
- package/src/__tests__/voice-session-bridge.test.ts +44 -44
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
- package/src/__tests__/workspace-policy.test.ts +399 -0
- package/src/acp/__tests__/client-handler.test.ts +3 -3
- package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
- package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
- package/src/acp/client-handler.ts +3 -3
- package/src/acp/session-manager.ts +8 -8
- package/src/api/events/subagent-event.ts +2 -2
- package/src/api/responses/memory-v2-activation-log.ts +2 -2
- package/src/approvals/AGENTS.md +2 -0
- package/src/approvals/guardian-request-resolvers.ts +118 -24
- package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +158 -4
- package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
- package/src/calls/call-controller.ts +27 -27
- package/src/calls/call-conversation-messages.ts +58 -18
- package/src/calls/voice-control-protocol.ts +56 -0
- package/src/calls/voice-session-bridge.ts +156 -58
- package/src/calls/voice-triage-escalate.ts +2 -3
- package/src/channels/config.ts +8 -0
- package/src/channels/types.ts +1 -0
- package/src/cli/commands/config.ts +49 -13
- package/src/cli/commands/memory/index.help.ts +4 -2
- package/src/cli/commands/memory/memory-retrospective.ts +5 -0
- package/src/cli/lib/bundled-marketplace.json +12 -0
- package/src/cli.ts +2 -109
- package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
- package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
- package/src/config/assistant-feature-flags.ts +1 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
- package/src/config/feature-flag-cache.ts +6 -16
- package/src/config/feature-flag-registry.json +14 -30
- package/src/config/loader.ts +7 -1
- package/src/config/memory-tier.ts +15 -10
- package/src/config/memory-v3-gate.test.ts +278 -1
- package/src/config/memory-v3-gate.ts +88 -26
- package/src/config/raw-config-utils.ts +1 -1
- package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/live-voice.ts +33 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrospective.ts +13 -0
- package/src/config/schemas/memory-substrate.ts +183 -0
- package/src/config/schemas/memory-v2.ts +3 -2
- package/src/config/schemas/memory-v3.ts +11 -4
- package/src/config/schemas/memory.ts +35 -1
- package/src/config/schemas/services.ts +10 -2
- package/src/config/substrate-twin-shadowing.ts +195 -0
- package/src/config/webhook-routing.ts +67 -0
- package/src/context/compactor.ts +10 -3
- package/src/context/token-estimator.ts +21 -0
- package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
- package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
- package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
- package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
- package/src/daemon/channel-ui-capability.ts +70 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
- package/src/daemon/conversation-agent-loop.ts +12 -5
- package/src/daemon/conversation-evictor.ts +26 -4
- package/src/daemon/conversation-launch.ts +11 -14
- package/src/daemon/conversation-messaging.ts +14 -14
- package/src/daemon/conversation-notifiers.ts +2 -2
- package/src/daemon/conversation-process.ts +133 -21
- package/src/daemon/conversation-queue-manager.ts +7 -7
- package/src/daemon/conversation-runtime-assembly.ts +16 -0
- package/src/daemon/conversation-store.ts +11 -3
- package/src/daemon/conversation-surfaces.ts +4 -4
- package/src/daemon/conversation-tool-setup.ts +13 -7
- package/src/daemon/conversation-usage.ts +12 -11
- package/src/daemon/conversation.ts +38 -15
- package/src/daemon/disk-pressure-guard.ts +5 -12
- package/src/daemon/embedding-reconcile.ts +14 -9
- package/src/daemon/handlers/config-channels.ts +40 -134
- package/src/daemon/handlers/config-model.ts +15 -7
- package/src/daemon/handlers/conversations.ts +4 -2
- package/src/daemon/handlers/shared.ts +29 -0
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/lifecycle.ts +13 -0
- package/src/daemon/message-protocol.ts +8 -144
- package/src/daemon/message-types/computer-use.ts +0 -12
- package/src/daemon/message-types/conversations.ts +9 -345
- package/src/daemon/message-types/host-app-control.ts +0 -9
- package/src/daemon/message-types/host-browser.ts +0 -7
- package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
- package/src/daemon/message-types/messages.ts +0 -48
- package/src/daemon/message-types/notifications.ts +0 -7
- package/src/daemon/message-types/skills.ts +0 -5
- package/src/daemon/message-types/surfaces.ts +0 -9
- package/src/daemon/message-types/sync.ts +0 -2
- package/src/daemon/process-message.ts +5 -5
- package/src/daemon/skill-memory-refresh.ts +5 -5
- package/src/daemon/tool-side-effects.ts +13 -13
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +4 -4
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
- package/src/heartbeat/heartbeat-run-store.ts +81 -4
- package/src/heartbeat/heartbeat-service.ts +32 -1
- package/src/home/__tests__/feed-writer.test.ts +7 -7
- package/src/home/__tests__/home-content-refresh.test.ts +3 -0
- package/src/home/__tests__/suggested-prompts.test.ts +1 -0
- package/src/home/feed-writer.ts +6 -13
- package/src/home/home-content-refresh.ts +6 -9
- package/src/home/relationship-state-writer.ts +5 -12
- package/src/home/suggested-prompts-cache.ts +6 -19
- package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
- package/src/ipc/events-publish-client.ts +44 -0
- package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
- package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
- package/src/ipc/routes/events-ipc-routes.ts +11 -31
- package/src/live-voice/__tests__/front-decision.test.ts +4 -176
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
- package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
- package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
- package/src/live-voice/__tests__/live-voice-vad.test.ts +218 -422
- package/src/live-voice/front-decision.ts +5 -155
- package/src/live-voice/live-voice-metrics.ts +4 -1
- package/src/live-voice/live-voice-session.ts +650 -333
- package/src/live-voice/progress-phrases.ts +17 -0
- package/src/live-voice/protocol.ts +15 -0
- package/src/media/app-icon-generator.ts +15 -8
- package/src/media/avatar-router.ts +9 -5
- package/src/media/image-credentials.ts +42 -10
- package/src/media/image-service.ts +1 -13
- package/src/media/types.ts +26 -3
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/__tests__/broadcaster.test.ts +95 -0
- package/src/notifications/adapters/macos.ts +3 -3
- package/src/notifications/broadcaster.ts +57 -0
- package/src/notifications/copy-composer.ts +0 -15
- package/src/notifications/decision-engine.ts +21 -22
- package/src/notifications/guardian-question-mode.ts +57 -2
- package/src/notifications/home-feed-side-effect.ts +4 -0
- package/src/notifications/signal.ts +6 -4
- package/src/notifications/trusted-contact-payloads.ts +3 -4
- package/src/notifications/vellum-card-affinity.ts +39 -0
- package/src/oauth/AGENTS.md +1 -1
- package/src/permissions/channel-permission-query.test.ts +69 -0
- package/src/permissions/channel-permission-query.ts +73 -1
- package/src/permissions/checker.test.ts +85 -9
- package/src/permissions/checker.ts +17 -22
- package/src/permissions/confirmation-guardian-request.test.ts +2 -2
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/gateway-threshold-reader.test.ts +224 -17
- package/src/permissions/gateway-threshold-reader.ts +82 -10
- package/src/permissions/ipc-risk-types.ts +8 -0
- package/src/permissions/prompter.ts +5 -5
- package/src/permissions/question-guardian-request.test.ts +222 -0
- package/src/permissions/question-guardian-request.ts +179 -0
- package/src/permissions/question-prompter.test.ts +8 -8
- package/src/permissions/question-prompter.ts +18 -0
- package/src/permissions/secret-prompter.ts +2 -4
- package/src/permissions/workspace-policy.ts +236 -34
- package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
- package/src/persistence/__tests__/message-content-file.test.ts +58 -3
- package/src/persistence/conversation-crud.ts +93 -0
- package/src/persistence/conversation-key-store.ts +63 -0
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-singleton.ts +14 -27
- package/src/persistence/delivery-crud.ts +45 -0
- package/src/persistence/embeddings/embedding-backend.ts +2 -1
- package/src/persistence/embeddings/embedding-identity.ts +7 -3
- package/src/persistence/job-utils.ts +32 -27
- package/src/persistence/jobs-store.ts +92 -3
- package/src/persistence/lifecycle-quiesce.ts +80 -0
- package/src/persistence/llm-usage-store.ts +45 -8
- package/src/persistence/message-content-file.ts +4 -4
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
- package/src/persistence/schema/infrastructure.ts +11 -0
- package/src/persistence/steps.ts +7 -1
- package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
- package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
- package/src/plugin-api/conversation-turn.ts +4 -4
- package/src/plugin-api/event-hub-facade.ts +15 -6
- package/src/plugin-api/index.ts +10 -4
- package/src/plugin-api/publish-event.ts +36 -0
- package/src/plugins/AGENTS.md +2 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/index.ts +9 -13
- package/src/plugins/defaults/memory/AGENTS.md +775 -0
- package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
- package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
- package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
- package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
- package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
- package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
- package/src/plugins/defaults/memory/graph/store.ts +1 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
- package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
- package/src/plugins/defaults/memory/indexer.ts +146 -89
- package/src/plugins/defaults/memory/injectors.ts +86 -41
- package/src/plugins/defaults/memory/job-handlers.ts +130 -39
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
- package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
- package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
- package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
- package/src/plugins/defaults/memory/startup.ts +58 -21
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
- package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
- package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
- package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
- package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
- package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
- package/src/plugins/defaults/memory/tools.test.ts +1 -1
- package/src/plugins/defaults/memory/tools.ts +1 -1
- package/src/plugins/defaults/memory/v1/README.md +5 -0
- package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
- package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
- package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
- package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
- package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
- package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
- package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
- package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
- package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
- package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
- package/src/plugins/defaults/memory/v2/activation.ts +30 -163
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
- package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/injection.ts +36 -26
- package/src/plugins/defaults/memory/v2/migration.ts +2 -2
- package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
- package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
- package/src/plugins/defaults/memory/v2/router.ts +38 -15
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
- package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
- package/src/plugins/defaults/memory/v3/card.ts +25 -9
- package/src/plugins/defaults/memory/v3/edge.ts +52 -18
- package/src/plugins/defaults/memory/v3/gate.ts +4 -4
- package/src/plugins/defaults/memory/v3/injector.ts +10 -3
- package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
- package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
- package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
- package/src/plugins/defaults/memory/v3/prune.ts +40 -16
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
- package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
- package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
- package/src/plugins/defaults/memory/v3/types.ts +4 -1
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
- package/src/plugins/defaults/memory/validation.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -1
- package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
- package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
- package/src/plugins/types.ts +2 -2
- package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
- package/src/providers/anthropic/client.ts +15 -6
- package/src/providers/content-block-schema.ts +26 -0
- package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +30 -14
- package/src/providers/model-catalog.ts +77 -0
- package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
- package/src/providers/openai/chat-completions-provider.ts +65 -17
- package/src/providers/openai/input-audio.ts +76 -0
- package/src/providers/openrouter/client.ts +0 -2
- package/src/providers/platform-proxy/constants.ts +4 -0
- package/src/providers/poolside/client.ts +42 -0
- package/src/providers/registry.ts +40 -8
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +39 -1
- package/src/providers/vercel-ai-gateway/client.ts +0 -2
- package/src/runtime/AGENTS.md +7 -5
- package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
- package/src/runtime/__tests__/question-resolution.test.ts +111 -0
- package/src/runtime/access-request-helper.ts +7 -15
- package/src/runtime/assistant-event-hub.ts +43 -31
- package/src/runtime/assistant-event-publish-options.ts +31 -0
- package/src/runtime/assistant-event.ts +19 -30
- package/src/runtime/assistant-stream-state.ts +4 -4
- package/src/runtime/channel-approvals.ts +0 -25
- package/src/runtime/channel-readiness-service.ts +99 -40
- package/src/runtime/channel-retry-sweep.ts +38 -15
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
- package/src/runtime/guardian-reply-router.ts +108 -0
- package/src/runtime/http-server.ts +8 -0
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/process-role.ts +42 -0
- package/src/runtime/question-request-guardian-bridge.ts +184 -0
- package/src/runtime/question-resolution.ts +153 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
- package/src/runtime/routes/acp-routes.ts +2 -2
- package/src/runtime/routes/bookmark-routes.ts +3 -15
- package/src/runtime/routes/canned-message-complete.ts +2 -2
- package/src/runtime/routes/consolidation-routes.ts +8 -2
- package/src/runtime/routes/conversation-list-routes.ts +3 -19
- package/src/runtime/routes/conversation-management-routes.ts +1 -5
- package/src/runtime/routes/conversation-query-routes.ts +52 -8
- package/src/runtime/routes/conversation-routes.ts +36 -22
- package/src/runtime/routes/credential-request-routes.ts +0 -1
- package/src/runtime/routes/filing-routes.ts +7 -7
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
- package/src/runtime/routes/image-generation-routes.ts +12 -9
- package/src/runtime/routes/inbound-message-handler.ts +17 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
- package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
- package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/lifecycle-routes.ts +199 -0
- package/src/runtime/routes/platform-routes.ts +3 -8
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
- package/src/runtime/routes/question-routes.ts +34 -87
- package/src/runtime/routes/secret-routes.ts +11 -1
- package/src/runtime/routes/settings-routes.ts +8 -18
- package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
- package/src/runtime/routes/workspace-routes.test.ts +7 -4
- package/src/runtime/slack-reply-session.test.ts +12 -12
- package/src/runtime/slack-reply-session.ts +17 -17
- package/src/runtime/sync/sync-publisher.test.ts +7 -5
- package/src/runtime/tool-grant-request-helper.ts +4 -0
- package/src/schedule/schedule-store.ts +70 -0
- package/src/schedule/scheduler.ts +27 -0
- package/src/security/AGENTS.md +1 -1
- package/src/security/credential-key.ts +17 -0
- package/src/security/secret-ingress.ts +14 -105
- package/src/security/secret-patterns.ts +8 -139
- package/src/security/secret-scanner.ts +8 -3
- package/src/security/store-path-override.ts +6 -16
- package/src/sequence/store.ts +8 -0
- package/src/signals/emit-event.ts +5 -10
- package/src/signals/event-stream.ts +20 -10
- package/src/subagent/manager.ts +76 -25
- package/src/subagent/notify.ts +8 -0
- package/src/subagent/types.ts +13 -3
- package/src/telegram/__tests__/webhook-health.test.ts +442 -0
- package/src/telegram/webhook-health.ts +478 -0
- package/src/telemetry/AGENTS.md +6 -0
- package/src/telemetry/memory-corpus-size.test.ts +129 -0
- package/src/telemetry/memory-corpus-size.ts +184 -0
- package/src/telemetry/memory-tier-reporter.test.ts +67 -2
- package/src/telemetry/memory-tier-reporter.ts +30 -3
- package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
- package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
- package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
- package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
- package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
- package/src/tools/acp/abort.ts +21 -1
- package/src/tools/acp/context.ts +5 -5
- package/src/tools/acp/spawn.test.ts +15 -5
- package/src/tools/acp/spawn.ts +26 -3
- package/src/tools/acp/status.ts +20 -1
- package/src/tools/acp/steer.test.ts +20 -0
- package/src/tools/acp/steer.ts +23 -2
- package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
- package/src/tools/ask-question/ask-question-tool.ts +68 -92
- package/src/tools/browser/browser-screencast.ts +6 -6
- package/src/tools/calls/call-end.ts +24 -3
- package/src/tools/calls/call-start.ts +35 -11
- package/src/tools/calls/call-status.ts +20 -1
- package/src/tools/document/document-comment-tool.test.ts +49 -0
- package/src/tools/document/document-comment-tool.ts +45 -6
- package/src/tools/document/document-tool.ts +142 -24
- package/src/tools/executor.ts +27 -13
- package/src/tools/filesystem/edit.ts +62 -60
- package/src/tools/filesystem/list.ts +36 -29
- package/src/tools/filesystem/read.ts +56 -39
- package/src/tools/filesystem/write.ts +44 -38
- package/src/tools/followups/followup_create.ts +41 -12
- package/src/tools/followups/followup_list.ts +34 -6
- package/src/tools/followups/followup_resolve.ts +26 -4
- package/src/tools/host-filesystem/edit.ts +50 -60
- package/src/tools/host-filesystem/read.ts +45 -39
- package/src/tools/host-filesystem/write.ts +31 -36
- package/src/tools/host-terminal/host-shell.ts +76 -62
- package/src/tools/policy-context.ts +27 -10
- package/src/tools/schedule/create.ts +76 -33
- package/src/tools/schedule/delete.ts +21 -2
- package/src/tools/schedule/list.ts +25 -3
- package/src/tools/schedule/update.ts +105 -48
- package/src/tools/shared/filesystem/path-policy.ts +246 -40
- package/src/tools/shared/zod-tool-schema.ts +117 -0
- package/src/tools/subagent/abort.ts +12 -4
- package/src/tools/subagent/consult-deadline.ts +9 -3
- package/src/tools/subagent/message.ts +21 -5
- package/src/tools/subagent/notify-parent.ts +44 -23
- package/src/tools/subagent/read.ts +15 -4
- package/src/tools/subagent/resolve.ts +26 -4
- package/src/tools/subagent/spawn.ts +37 -13
- package/src/tools/subagent/status.ts +12 -4
- package/src/tools/system/request-permission.ts +35 -26
- package/src/tools/terminal/shell.ts +68 -55
- package/src/tools/tool-approval-handler.ts +327 -53
- package/src/tools/tool-input-schemas.ts +85 -0
- package/src/tools/tool-types.ts +7 -0
- package/src/tools/types.ts +8 -0
- package/src/tools/workflows/manage-workflows.ts +30 -2
- package/src/tools/workflows/run-workflow.test.ts +54 -2
- package/src/tools/workflows/run-workflow.ts +32 -4
- package/src/util/fs-symlinks.ts +30 -0
- package/src/util/log-redact.ts +7 -3
- package/src/vellum-assistant-namespace.d.ts +80 -0
- package/src/watcher/watcher-store.ts +8 -0
- package/src/workflows/leaf-runner.test.ts +104 -2
- package/src/workflows/leaf-runner.ts +31 -6
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
- package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
- package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/secret-patterns.test.ts +0 -27
- package/src/config/__tests__/proc-to-skills.test.ts +0 -21
- package/src/config/memory-tier.test.ts +0 -44
- package/src/daemon/message-types/acp.ts +0 -20
- package/src/daemon/message-types/apps.ts +0 -11
- package/src/daemon/message-types/background-tools.ts +0 -14
- package/src/daemon/message-types/bookmarks.ts +0 -13
- package/src/daemon/message-types/contacts.ts +0 -13
- package/src/daemon/message-types/document-comments.ts +0 -14
- package/src/daemon/message-types/documents.ts +0 -13
- package/src/daemon/message-types/home.ts +0 -15
- package/src/daemon/message-types/host-bash.ts +0 -12
- package/src/daemon/message-types/host-cu.ts +0 -10
- package/src/daemon/message-types/host-file.ts +0 -12
- package/src/daemon/message-types/host-transfer.ts +0 -12
- package/src/daemon/message-types/integrations.ts +0 -90
- package/src/daemon/message-types/memory.ts +0 -10
- package/src/daemon/message-types/schedules.ts +0 -14
- package/src/daemon/message-types/settings.ts +0 -17
- package/src/daemon/message-types/subagents.ts +0 -63
- package/src/daemon/message-types/upgrades.ts +0 -14
- package/src/daemon/message-types/workflows.ts +0 -25
- package/src/daemon/message-types/workspace.ts +0 -137
- package/src/live-voice/ack-phrases.ts +0 -58
- package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
- package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
- package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
- package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
|
@@ -19,6 +19,7 @@ import type { AgentLoopConfig } from "../agent/loop.js";
|
|
|
19
19
|
import { AgentLoop } from "../agent/loop.js";
|
|
20
20
|
import type { AssistantActivityStateEvent } from "../api/events/assistant-activity-state.js";
|
|
21
21
|
import type { ConfirmationStateChangedEvent } from "../api/events/confirmation-state-changed.js";
|
|
22
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
22
23
|
import { decideGuardianRequest } from "../channels/gateway-guardian-requests.js";
|
|
23
24
|
import type {
|
|
24
25
|
ChannelId,
|
|
@@ -125,6 +126,7 @@ import { registerConversationNotifiers } from "./conversation-notifiers.js";
|
|
|
125
126
|
import type { ProcessMessageOptions } from "./conversation-process.js";
|
|
126
127
|
import {
|
|
127
128
|
drainQueue as drainQueueImpl,
|
|
129
|
+
kickQueueDrain as kickQueueDrainImpl,
|
|
128
130
|
processMessage as processMessageImpl,
|
|
129
131
|
} from "./conversation-process.js";
|
|
130
132
|
import type {
|
|
@@ -163,11 +165,7 @@ import { canonicalizeTimeZone } from "./date-context.js";
|
|
|
163
165
|
import { HostAppControlProxy } from "./host-app-control-proxy.js";
|
|
164
166
|
import { HostCuProxy } from "./host-cu-proxy.js";
|
|
165
167
|
import { shouldAttachHostProxyForCapability } from "./host-proxy-preactivation.js";
|
|
166
|
-
import type {
|
|
167
|
-
ServerMessage,
|
|
168
|
-
SurfaceType,
|
|
169
|
-
UsageStats,
|
|
170
|
-
} from "./message-protocol.js";
|
|
168
|
+
import type { SurfaceType, UsageStats } from "./message-protocol.js";
|
|
171
169
|
import { filterMessagesForUntrustedActor } from "./message-provenance.js";
|
|
172
170
|
import type { ConversationTransportMetadata } from "./message-types/conversations.js";
|
|
173
171
|
import { isHostProxyTransport } from "./message-types/conversations.js";
|
|
@@ -320,7 +318,7 @@ export class Conversation {
|
|
|
320
318
|
/** @internal */ prompter: PermissionPrompter;
|
|
321
319
|
/** @internal */ secretPrompter: SecretPrompter;
|
|
322
320
|
private executor: ToolExecutor;
|
|
323
|
-
/** @internal */ sendToClient: (msg:
|
|
321
|
+
/** @internal */ sendToClient: (msg: AssistantEvent) => void;
|
|
324
322
|
/** @internal */ workingDir: string;
|
|
325
323
|
/** @internal */ allowedToolNames?: Set<string>;
|
|
326
324
|
/**
|
|
@@ -345,6 +343,15 @@ export class Conversation {
|
|
|
345
343
|
* @internal
|
|
346
344
|
*/
|
|
347
345
|
subagentDenySideEffects?: boolean;
|
|
346
|
+
/**
|
|
347
|
+
* When true, mid-run subagent → parent notifications (`notify_parent`) are
|
|
348
|
+
* suppressed for this child. Set on synchronous (spawnAndAwait) subagents:
|
|
349
|
+
* the awaiting caller is their only parent channel, so injecting a
|
|
350
|
+
* user-role turn into the live parent mid-await would start an unsolicited
|
|
351
|
+
* parent run. Checked in `notifyParentFromChild`.
|
|
352
|
+
* @internal
|
|
353
|
+
*/
|
|
354
|
+
subagentSuppressParentNotifications?: boolean;
|
|
348
355
|
/**
|
|
349
356
|
* Tool names a subagent attempted but that its role allowlist
|
|
350
357
|
* ({@link subagentAllowedTools}) denied. Recorded by the tool executor;
|
|
@@ -672,7 +679,7 @@ export class Conversation {
|
|
|
672
679
|
originChannel: ChannelId | undefined = undefined;
|
|
673
680
|
/** @internal */ activityVersion = 0;
|
|
674
681
|
/** Last emitted activity state message, retained for replay on SSE reconnection. */
|
|
675
|
-
/** @internal */ lastActivityStateMsg:
|
|
682
|
+
/** @internal */ lastActivityStateMsg: AssistantEvent | null = null;
|
|
676
683
|
/** Set by the agent loop to track confirmation outcomes for persistence. */
|
|
677
684
|
onConfirmationOutcome?: (
|
|
678
685
|
requestId: string,
|
|
@@ -685,7 +692,7 @@ export class Conversation {
|
|
|
685
692
|
conversationId: string,
|
|
686
693
|
provider: Provider,
|
|
687
694
|
systemPrompt: string,
|
|
688
|
-
sendToClient: (msg:
|
|
695
|
+
sendToClient: (msg: AssistantEvent) => void,
|
|
689
696
|
workingDir: string,
|
|
690
697
|
options?: ConversationConstructorOptions,
|
|
691
698
|
) {
|
|
@@ -1431,7 +1438,7 @@ export class Conversation {
|
|
|
1431
1438
|
}
|
|
1432
1439
|
|
|
1433
1440
|
updateClient(
|
|
1434
|
-
sendToClient: (msg:
|
|
1441
|
+
sendToClient: (msg: AssistantEvent) => void,
|
|
1435
1442
|
hasNoClient = false,
|
|
1436
1443
|
): void {
|
|
1437
1444
|
this.sendToClient = sendToClient;
|
|
@@ -1453,7 +1460,7 @@ export class Conversation {
|
|
|
1453
1460
|
}
|
|
1454
1461
|
|
|
1455
1462
|
/** Returns the current sendToClient reference for identity comparison. */
|
|
1456
|
-
getCurrentSender(): (msg:
|
|
1463
|
+
getCurrentSender(): (msg: AssistantEvent) => void {
|
|
1457
1464
|
return this.sendToClient;
|
|
1458
1465
|
}
|
|
1459
1466
|
|
|
@@ -1465,6 +1472,10 @@ export class Conversation {
|
|
|
1465
1472
|
this.subagentDenySideEffects = deny;
|
|
1466
1473
|
}
|
|
1467
1474
|
|
|
1475
|
+
setSubagentSuppressParentNotifications(suppress: boolean): void {
|
|
1476
|
+
this.subagentSuppressParentNotifications = suppress;
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1468
1479
|
/**
|
|
1469
1480
|
* Set the conversation's per-chat plugin scope, updating both the persisted
|
|
1470
1481
|
* `enabled_plugins` row and the live instance (source of truth for the
|
|
@@ -1866,10 +1877,10 @@ export class Conversation {
|
|
|
1866
1877
|
emitConfirmationStateChanged(
|
|
1867
1878
|
params: Omit<ConfirmationStateChangedEvent, "type">,
|
|
1868
1879
|
): void {
|
|
1869
|
-
const msg:
|
|
1880
|
+
const msg: AssistantEvent = {
|
|
1870
1881
|
type: "confirmation_state_changed",
|
|
1871
1882
|
...params,
|
|
1872
|
-
} as
|
|
1883
|
+
} as AssistantEvent;
|
|
1873
1884
|
try {
|
|
1874
1885
|
this.sendToClient(msg);
|
|
1875
1886
|
} catch (err) {
|
|
@@ -1891,7 +1902,7 @@ export class Conversation {
|
|
|
1891
1902
|
): void {
|
|
1892
1903
|
const { anchor = "assistant_turn", requestId, statusText } = options ?? {};
|
|
1893
1904
|
this.activityVersion++;
|
|
1894
|
-
const msg:
|
|
1905
|
+
const msg: AssistantEvent = {
|
|
1895
1906
|
type: "assistant_activity_state",
|
|
1896
1907
|
conversationId: this.conversationId,
|
|
1897
1908
|
activityVersion: this.activityVersion,
|
|
@@ -1900,7 +1911,7 @@ export class Conversation {
|
|
|
1900
1911
|
requestId,
|
|
1901
1912
|
reason,
|
|
1902
1913
|
...(statusText ? { statusText } : {}),
|
|
1903
|
-
} as
|
|
1914
|
+
} as AssistantEvent;
|
|
1904
1915
|
this.lastActivityStateMsg = msg;
|
|
1905
1916
|
try {
|
|
1906
1917
|
this.sendToClient(msg);
|
|
@@ -2454,7 +2465,7 @@ export class Conversation {
|
|
|
2454
2465
|
content: string,
|
|
2455
2466
|
userMessageId: string,
|
|
2456
2467
|
options?: {
|
|
2457
|
-
onEvent?: (msg:
|
|
2468
|
+
onEvent?: (msg: AssistantEvent) => void;
|
|
2458
2469
|
isInteractive?: boolean;
|
|
2459
2470
|
isUserMessage?: boolean;
|
|
2460
2471
|
titleText?: string;
|
|
@@ -2493,6 +2504,18 @@ export class Conversation {
|
|
|
2493
2504
|
return drainQueueImpl(this, reason);
|
|
2494
2505
|
}
|
|
2495
2506
|
|
|
2507
|
+
/**
|
|
2508
|
+
* Never-rejecting drain trigger for fire-and-forget call sites. See
|
|
2509
|
+
* `kickQueueDrain` in conversation-process.ts for the retry/notify
|
|
2510
|
+
* semantics.
|
|
2511
|
+
*/
|
|
2512
|
+
kickDrainQueue(
|
|
2513
|
+
reason: QueueDrainReason = "loop_complete",
|
|
2514
|
+
origin?: string,
|
|
2515
|
+
): Promise<void> {
|
|
2516
|
+
return kickQueueDrainImpl(this, reason, origin);
|
|
2517
|
+
}
|
|
2518
|
+
|
|
2496
2519
|
async processMessage(options: ProcessMessageOptions): Promise<string> {
|
|
2497
2520
|
this.cacheWarmAbort?.abort();
|
|
2498
2521
|
this.cacheWarmAbort = undefined;
|
|
@@ -3,8 +3,7 @@ import {
|
|
|
3
3
|
type DiskPressureState,
|
|
4
4
|
type DiskPressureStatus,
|
|
5
5
|
} from "../api/events/disk-pressure-status-changed.js";
|
|
6
|
-
import {
|
|
7
|
-
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
6
|
+
import { broadcastMessage } from "../runtime/assistant-event-hub.js";
|
|
8
7
|
import { cancelBackgroundTools } from "../tools/background-tool-registry.js";
|
|
9
8
|
import { getDiskUsageInfo } from "../util/disk-usage.js";
|
|
10
9
|
import { getLogger } from "../util/logger.js";
|
|
@@ -107,16 +106,10 @@ function statusFingerprint(status: DiskPressureStatus): string {
|
|
|
107
106
|
function publishStatusChangedIfNeeded(previous: DiskPressureStatus): void {
|
|
108
107
|
if (statusFingerprint(previous) === statusFingerprint(state.status)) return;
|
|
109
108
|
const status = cloneStatus(state.status);
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
status,
|
|
115
|
-
}),
|
|
116
|
-
)
|
|
117
|
-
.catch((err) => {
|
|
118
|
-
log.warn({ err }, "Failed to publish disk pressure status change");
|
|
119
|
-
});
|
|
109
|
+
broadcastMessage({
|
|
110
|
+
type: "disk_pressure_status_changed",
|
|
111
|
+
status,
|
|
112
|
+
});
|
|
120
113
|
}
|
|
121
114
|
|
|
122
115
|
function replaceStatus(next: DiskPressureStatus): DiskPressureStatus {
|
|
@@ -19,7 +19,11 @@ import {
|
|
|
19
19
|
saveRawConfig,
|
|
20
20
|
setNestedValue,
|
|
21
21
|
} from "../config/loader.js";
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
isMemoryEnabled,
|
|
24
|
+
isMemoryV2ExplicitlyDisabled,
|
|
25
|
+
isMemoryV3Live,
|
|
26
|
+
} from "../config/memory-v3-gate.js";
|
|
23
27
|
import type { AssistantConfig } from "../config/types.js";
|
|
24
28
|
import {
|
|
25
29
|
probeBackendDimension,
|
|
@@ -30,14 +34,14 @@ import {
|
|
|
30
34
|
enqueueMemoryJob,
|
|
31
35
|
hasActiveJobOfType,
|
|
32
36
|
} from "../persistence/jobs-store.js";
|
|
37
|
+
import {
|
|
38
|
+
ensureConceptPageCollection,
|
|
39
|
+
recreateConceptPageCollection,
|
|
40
|
+
} from "../plugins/defaults/memory/substrate/qdrant.js";
|
|
33
41
|
import {
|
|
34
42
|
ensureSectionCollection,
|
|
35
43
|
recreateSectionCollection,
|
|
36
44
|
} from "../plugins/defaults/memory/v3/section-dense-store.js";
|
|
37
|
-
import {
|
|
38
|
-
ensureConceptPageCollection,
|
|
39
|
-
recreateConceptPageCollection,
|
|
40
|
-
} from "../plugins/defaults/memory/v3/substrate/qdrant.js";
|
|
41
45
|
import { getLogger } from "../util/logger.js";
|
|
42
46
|
|
|
43
47
|
const log = getLogger("embedding-reconcile");
|
|
@@ -157,7 +161,7 @@ async function defaultRecreateCollectionsAtDim(
|
|
|
157
161
|
* the same type. `memory_v2_reembed` can be enqueued from two startup sites that
|
|
158
162
|
* both guard on this in-flight check: the credential-arrival reconcile retry
|
|
159
163
|
* (reconcile-vs-reconcile), and the lifecycle reconcile-then-rebuild interleaving
|
|
160
|
-
* where `
|
|
164
|
+
* where `maybeRebuildConceptCollection` also enqueues a reembed when it finds the
|
|
161
165
|
* just-(re)created collection empty. The guard keeps the corpus re-embed to a
|
|
162
166
|
* single round-trip across either path.
|
|
163
167
|
*/
|
|
@@ -226,7 +230,7 @@ export async function reconcileEmbeddingIdentity(
|
|
|
226
230
|
// persist/recreate/enqueue. `memory.enabled` defaults to true; gate strictly
|
|
227
231
|
// on the explicit `false`. This gate covers both the lifecycle startup call
|
|
228
232
|
// and the credential-arrival retry call.
|
|
229
|
-
if (config
|
|
233
|
+
if (!isMemoryEnabled(config)) {
|
|
230
234
|
log.info("Memory disabled — skipping embedding-identity reconcile");
|
|
231
235
|
return { action: "noop", dim: null };
|
|
232
236
|
}
|
|
@@ -239,8 +243,9 @@ export async function reconcileEmbeddingIdentity(
|
|
|
239
243
|
// dimension recreate). Running here would enqueue `memory_v2_reembed` against
|
|
240
244
|
// the disabled v2 index and persist a `vectorSize` after the v1 client was
|
|
241
245
|
// already initialized at the old dimension. Defaults to true; gate strictly
|
|
242
|
-
// on the explicit `false` (and tolerate a missing `v2` node in test
|
|
243
|
-
|
|
246
|
+
// on the explicit `false` (and tolerate a missing `v2` node in test
|
|
247
|
+
// configs) — the semantics `isMemoryV2ExplicitlyDisabled` names.
|
|
248
|
+
if (isMemoryV2ExplicitlyDisabled(config)) {
|
|
244
249
|
log.info(
|
|
245
250
|
"Memory v2 disabled — skipping embedding-identity reconcile; v1 path owns its collection dimension",
|
|
246
251
|
);
|
|
@@ -30,7 +30,6 @@ import type { ContactChannel } from "../../contacts/types.js";
|
|
|
30
30
|
import { ipcCallPersistent } from "../../ipc/gateway-client.js";
|
|
31
31
|
import { getBindingByChannelChat } from "../../persistence/external-conversation-store.js";
|
|
32
32
|
import { resolveGuardianName } from "../../prompts/user-reference.js";
|
|
33
|
-
import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
|
|
34
33
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../../runtime/assistant-scope.js";
|
|
35
34
|
import {
|
|
36
35
|
type ChannelReadinessService,
|
|
@@ -42,14 +41,11 @@ import {
|
|
|
42
41
|
} from "../../runtime/channel-verification-service.js";
|
|
43
42
|
import {
|
|
44
43
|
cancelOutbound,
|
|
45
|
-
deliverVerificationEmail,
|
|
46
44
|
deliverVerificationSlack,
|
|
47
45
|
deliverVerificationTelegram,
|
|
48
46
|
DESTINATION_RATE_WINDOW_MS,
|
|
49
47
|
MAX_SENDS_PER_DESTINATION_WINDOW,
|
|
50
48
|
normalizeTelegramDestination,
|
|
51
|
-
resendOutbound,
|
|
52
|
-
startOutbound,
|
|
53
49
|
} from "../../runtime/verification-outbound-actions.js";
|
|
54
50
|
import {
|
|
55
51
|
composeVerificationSlack,
|
|
@@ -58,18 +54,48 @@ import {
|
|
|
58
54
|
} from "../../runtime/verification-templates.js";
|
|
59
55
|
import { getTelegramBotUsername } from "../../telegram/bot-username.js";
|
|
60
56
|
import { normalizePhoneNumber } from "../../util/phone.js";
|
|
61
|
-
import type {
|
|
62
|
-
ChannelVerificationSessionRequest,
|
|
63
|
-
ChannelVerificationSessionResponse,
|
|
64
|
-
} from "../message-protocol.js";
|
|
65
57
|
import { log } from "./shared.js";
|
|
66
58
|
|
|
67
|
-
// --
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
59
|
+
// -- Channel verification result --
|
|
60
|
+
//
|
|
61
|
+
// The shape returned by the verification service functions and served by the
|
|
62
|
+
// HTTP channel-verification routes.
|
|
63
|
+
|
|
64
|
+
export interface ChannelVerificationSessionResult {
|
|
65
|
+
success: boolean;
|
|
66
|
+
secret?: string;
|
|
67
|
+
instruction?: string;
|
|
68
|
+
/** Present when action is 'status'. */
|
|
69
|
+
bound?: boolean;
|
|
70
|
+
guardianExternalUserId?: string;
|
|
71
|
+
/** The channel this status pertains to (e.g. "telegram", "phone"). Present when action is 'status'. */
|
|
72
|
+
channel?: ChannelId;
|
|
73
|
+
/** The assistant ID scoped to this status. Present when action is 'status'. */
|
|
74
|
+
assistantId?: string;
|
|
75
|
+
/** The delivery chat ID for the guardian (e.g. Telegram chat ID). Present when action is 'status' and bound is true. */
|
|
76
|
+
guardianDeliveryChatId?: string;
|
|
77
|
+
/** Optional channel username/handle for the bound guardian (for UI display). */
|
|
78
|
+
guardianUsername?: string;
|
|
79
|
+
/** Optional display name for the bound guardian (for UI display). */
|
|
80
|
+
guardianDisplayName?: string;
|
|
81
|
+
/** Whether a pending verification challenge exists for this (assistantId, channel). Used by relay setup to detect active voice verification sessions. */
|
|
82
|
+
hasPendingChallenge?: boolean;
|
|
83
|
+
error?: string;
|
|
84
|
+
/** Human-readable error detail (e.g. for already_bound failures). */
|
|
85
|
+
message?: string;
|
|
86
|
+
/** Conversation ID for outbound verification flows. */
|
|
87
|
+
verificationSessionId?: string;
|
|
88
|
+
/** Epoch ms when the verification session expires. */
|
|
89
|
+
expiresAt?: number;
|
|
90
|
+
/** Epoch ms after which a resend is allowed. */
|
|
91
|
+
nextResendAt?: number;
|
|
92
|
+
/** Number of sends for this session. */
|
|
93
|
+
sendCount?: number;
|
|
94
|
+
/** Telegram deep-link URL for bootstrap (M3 placeholder). */
|
|
95
|
+
telegramBootstrapUrl?: string;
|
|
96
|
+
/** True when the outbound session is still in pending_bootstrap state (Telegram handle flow). Prevents the client from clearing the bootstrap URL during status polling. */
|
|
97
|
+
pendingBootstrap?: boolean;
|
|
98
|
+
}
|
|
73
99
|
|
|
74
100
|
// ---------------------------------------------------------------------------
|
|
75
101
|
// Readiness service singleton
|
|
@@ -570,123 +596,3 @@ export async function verifyTrustedContact(
|
|
|
570
596
|
error: `Verification is not supported for channel type "${channel.type}"`,
|
|
571
597
|
};
|
|
572
598
|
}
|
|
573
|
-
|
|
574
|
-
// ---------------------------------------------------------------------------
|
|
575
|
-
// Channel verification session handler
|
|
576
|
-
// ---------------------------------------------------------------------------
|
|
577
|
-
|
|
578
|
-
export async function handleChannelVerificationSession(
|
|
579
|
-
msg: ChannelVerificationSessionRequest,
|
|
580
|
-
): Promise<void> {
|
|
581
|
-
const channel = msg.channel ?? "telegram";
|
|
582
|
-
|
|
583
|
-
try {
|
|
584
|
-
if (msg.action === "create_session") {
|
|
585
|
-
if (msg.purpose === "trusted_contact" && !msg.contactChannelId) {
|
|
586
|
-
broadcastMessage({
|
|
587
|
-
type: "channel_verification_session_response",
|
|
588
|
-
success: false,
|
|
589
|
-
error: "contactChannelId is required for trusted_contact purpose",
|
|
590
|
-
channel,
|
|
591
|
-
});
|
|
592
|
-
} else if (msg.purpose === "trusted_contact") {
|
|
593
|
-
const result = await verifyTrustedContact(
|
|
594
|
-
msg.contactChannelId!,
|
|
595
|
-
DAEMON_INTERNAL_ASSISTANT_ID,
|
|
596
|
-
);
|
|
597
|
-
broadcastMessage({
|
|
598
|
-
type: "channel_verification_session_response",
|
|
599
|
-
...result,
|
|
600
|
-
});
|
|
601
|
-
} else if (msg.destination) {
|
|
602
|
-
const result = await startOutbound({
|
|
603
|
-
channel,
|
|
604
|
-
destination: msg.destination,
|
|
605
|
-
rebind: msg.rebind,
|
|
606
|
-
originConversationId: msg.originConversationId,
|
|
607
|
-
});
|
|
608
|
-
if (result._pendingSlackDm) {
|
|
609
|
-
const { userId, text, assistantId: aid } = result._pendingSlackDm;
|
|
610
|
-
deliverVerificationSlack(userId, text, aid);
|
|
611
|
-
}
|
|
612
|
-
if (result._pendingEmail) {
|
|
613
|
-
const { to, text, subject, assistantId: aid } = result._pendingEmail;
|
|
614
|
-
deliverVerificationEmail(to, text, subject, aid);
|
|
615
|
-
}
|
|
616
|
-
const {
|
|
617
|
-
_pendingSlackDm: _,
|
|
618
|
-
_pendingEmail: __,
|
|
619
|
-
...publicResult
|
|
620
|
-
} = result;
|
|
621
|
-
broadcastMessage({
|
|
622
|
-
type: "channel_verification_session_response",
|
|
623
|
-
...publicResult,
|
|
624
|
-
});
|
|
625
|
-
} else {
|
|
626
|
-
const result = await createInboundChallenge(
|
|
627
|
-
channel,
|
|
628
|
-
msg.rebind,
|
|
629
|
-
msg.conversationId,
|
|
630
|
-
);
|
|
631
|
-
broadcastMessage({
|
|
632
|
-
type: "channel_verification_session_response",
|
|
633
|
-
...result,
|
|
634
|
-
});
|
|
635
|
-
}
|
|
636
|
-
} else if (msg.action === "status") {
|
|
637
|
-
const result = await getVerificationStatus(channel);
|
|
638
|
-
broadcastMessage({
|
|
639
|
-
type: "channel_verification_session_response",
|
|
640
|
-
...result,
|
|
641
|
-
});
|
|
642
|
-
} else if (msg.action === "cancel_session") {
|
|
643
|
-
await cancelOutbound({ channel });
|
|
644
|
-
await revokePendingSessions(channel);
|
|
645
|
-
broadcastMessage({
|
|
646
|
-
type: "channel_verification_session_response",
|
|
647
|
-
success: true,
|
|
648
|
-
channel,
|
|
649
|
-
});
|
|
650
|
-
} else if (msg.action === "revoke") {
|
|
651
|
-
const result = await revokeVerificationForChannel(channel);
|
|
652
|
-
broadcastMessage({
|
|
653
|
-
type: "channel_verification_session_response",
|
|
654
|
-
...result,
|
|
655
|
-
});
|
|
656
|
-
} else if (msg.action === "resend_session") {
|
|
657
|
-
const result = await resendOutbound({
|
|
658
|
-
channel,
|
|
659
|
-
originConversationId: msg.originConversationId,
|
|
660
|
-
});
|
|
661
|
-
if (result._pendingSlackDm) {
|
|
662
|
-
const { userId, text, assistantId: aid } = result._pendingSlackDm;
|
|
663
|
-
deliverVerificationSlack(userId, text, aid);
|
|
664
|
-
}
|
|
665
|
-
if (result._pendingEmail) {
|
|
666
|
-
const { to, text, subject, assistantId: aid } = result._pendingEmail;
|
|
667
|
-
deliverVerificationEmail(to, text, subject, aid);
|
|
668
|
-
}
|
|
669
|
-
const { _pendingSlackDm: _, _pendingEmail: __, ...publicResult } = result;
|
|
670
|
-
broadcastMessage({
|
|
671
|
-
type: "channel_verification_session_response",
|
|
672
|
-
...publicResult,
|
|
673
|
-
});
|
|
674
|
-
} else {
|
|
675
|
-
broadcastMessage({
|
|
676
|
-
type: "channel_verification_session_response",
|
|
677
|
-
success: false,
|
|
678
|
-
error: `Unknown action: ${String(msg.action)}`,
|
|
679
|
-
channel,
|
|
680
|
-
});
|
|
681
|
-
}
|
|
682
|
-
} catch (err) {
|
|
683
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
684
|
-
log.error({ err }, "Failed to handle channel verification session");
|
|
685
|
-
broadcastMessage({
|
|
686
|
-
type: "channel_verification_session_response",
|
|
687
|
-
success: false,
|
|
688
|
-
error: message,
|
|
689
|
-
channel,
|
|
690
|
-
});
|
|
691
|
-
}
|
|
692
|
-
}
|
|
@@ -98,13 +98,21 @@ export function setImageGenModel(modelId: string, ctx: ModelSetContext): void {
|
|
|
98
98
|
// Keep the derived provider in sync with the selected model so downstream
|
|
99
99
|
// routing never sends a Gemini request to an OpenAI model (or vice versa).
|
|
100
100
|
// The prefix logic is shared with workspace migration 006-services-config
|
|
101
|
-
// via providerForImageModelPrefix().
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
101
|
+
// via providerForImageModelPrefix(). Provider "vellum" is exempt: it is
|
|
102
|
+
// managed for every model (the backend derives from the model at request
|
|
103
|
+
// time), and rewriting it here would silently move a managed user onto a
|
|
104
|
+
// BYOK provider they may hold no key for.
|
|
105
|
+
const services = raw.services as
|
|
106
|
+
| Record<string, { provider?: string }>
|
|
107
|
+
| undefined;
|
|
108
|
+
if (services?.["image-generation"]?.provider !== "vellum") {
|
|
109
|
+
setServiceField(
|
|
110
|
+
raw,
|
|
111
|
+
"image-generation",
|
|
112
|
+
"provider",
|
|
113
|
+
providerForImageModelPrefix(modelId),
|
|
114
|
+
);
|
|
115
|
+
}
|
|
108
116
|
|
|
109
117
|
const wasSuppressed = ctx.suppressConfigReload;
|
|
110
118
|
ctx.setSuppressConfigReload(true);
|
|
@@ -103,10 +103,12 @@ export function cancelGeneration(conversationId: string): boolean {
|
|
|
103
103
|
conversation.abort(
|
|
104
104
|
createAbortReason("user_cancel", "cancelGeneration", conversationId),
|
|
105
105
|
);
|
|
106
|
-
// Also abort any child subagents spawned by this conversation.
|
|
106
|
+
// Also abort any in-flight child subagents spawned by this conversation.
|
|
107
107
|
// Omit sendToClient to suppress parent notifications — the parent is
|
|
108
108
|
// being cancelled, so enqueuing synthetic messages would trigger
|
|
109
|
-
// unwanted model activity after the user pressed stop.
|
|
109
|
+
// unwanted model activity after the user pressed stop. Terminal children
|
|
110
|
+
// stay readable: the conversation survives the stop, and its next turn may
|
|
111
|
+
// still `subagent_read` a completed child's result.
|
|
110
112
|
getSubagentManager().abortAllForParent(conversationId);
|
|
111
113
|
// Cancel any in-flight ACP agent sessions this conversation spawned, for the
|
|
112
114
|
// same reason: a backgrounded ACP prompt would otherwise keep running (and
|
|
@@ -98,6 +98,26 @@ export interface RenderedHistoryContent {
|
|
|
98
98
|
contentBlocks: ConversationContentBlock[];
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
+
/**
|
|
102
|
+
* One entry from Slack's `app_context` — an object the sender had open in
|
|
103
|
+
* Slack when they sent the message. `value` is an id string for the channel /
|
|
104
|
+
* canvas / list entity types and an object for `slack#/types/message_context`,
|
|
105
|
+
* which points at a specific message. Mirrors `sourceMetadata.appContext` on
|
|
106
|
+
* the gateway inbound contract; the values arrive unvalidated, so every
|
|
107
|
+
* consumer shape-checks before use.
|
|
108
|
+
*/
|
|
109
|
+
export interface SlackAppContextEntity {
|
|
110
|
+
type: string;
|
|
111
|
+
value: string | { messageTs?: string; channelId?: string };
|
|
112
|
+
teamId?: string;
|
|
113
|
+
enterpriseId?: string;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** The sender's active Slack context for a single inbound message. */
|
|
117
|
+
export interface SlackAppContext {
|
|
118
|
+
entities: SlackAppContextEntity[];
|
|
119
|
+
}
|
|
120
|
+
|
|
101
121
|
/**
|
|
102
122
|
* Slack-specific metadata extracted at the inbound HTTP boundary and threaded
|
|
103
123
|
* through to user-message persistence so the row can be tagged with a
|
|
@@ -130,6 +150,15 @@ export interface SlackInboundMessageMetadata {
|
|
|
130
150
|
timestampTimezoneLabel?: string;
|
|
131
151
|
/** Compact timezone label appended to the rendered speaker name. */
|
|
132
152
|
speakerTimezoneLabel?: string;
|
|
153
|
+
/**
|
|
154
|
+
* What the sender had open in Slack when they sent this message. Carried
|
|
155
|
+
* here so it lands on the stored ingress payload alongside the rest of
|
|
156
|
+
* `slackInbound`, letting the retry sweep render a replayed turn with the
|
|
157
|
+
* same context the live turn saw. Not projected into `slackMeta`: the
|
|
158
|
+
* context is baked into the message content at ingress, so the transcript
|
|
159
|
+
* renderer already has it.
|
|
160
|
+
*/
|
|
161
|
+
appContext?: SlackAppContext;
|
|
133
162
|
}
|
|
134
163
|
|
|
135
164
|
/**
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { v4 as uuid } from "uuid";
|
|
17
17
|
|
|
18
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
18
19
|
import type { HostProxyCapability } from "../channels/types.js";
|
|
19
20
|
import {
|
|
20
21
|
assistantEventHub,
|
|
@@ -24,23 +25,22 @@ import type { PendingInteraction } from "../runtime/pending-interactions.js";
|
|
|
24
25
|
import * as pendingInteractions from "../runtime/pending-interactions.js";
|
|
25
26
|
import { AssistantError, ErrorCode } from "../util/errors.js";
|
|
26
27
|
import { getLogger } from "../util/logger.js";
|
|
27
|
-
import type { ServerMessage } from "./message-protocol.js";
|
|
28
28
|
|
|
29
29
|
const log = getLogger("host-proxy-base");
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* `broadcastMessage` is statically typed against the discriminated
|
|
33
|
-
* `
|
|
33
|
+
* `AssistantEvent` union. The base class assembles envelopes from
|
|
34
34
|
* constructor-supplied event names and untyped extra fields, so static
|
|
35
35
|
* narrowing is impossible — subclasses are responsible for passing event
|
|
36
|
-
* names that match a real `
|
|
36
|
+
* names that match a real `AssistantEvent` variant.
|
|
37
37
|
*/
|
|
38
38
|
function broadcastDynamic(
|
|
39
39
|
envelope: Record<string, unknown>,
|
|
40
40
|
targetClientId?: string,
|
|
41
41
|
): void {
|
|
42
42
|
broadcastMessage(
|
|
43
|
-
envelope as unknown as
|
|
43
|
+
envelope as unknown as AssistantEvent,
|
|
44
44
|
undefined,
|
|
45
45
|
targetClientId ? { targetClientId } : undefined,
|
|
46
46
|
);
|
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -27,6 +27,7 @@ import { getDb } from "../persistence/db-connection.js";
|
|
|
27
27
|
import { initializeDb } from "../persistence/db-init.js";
|
|
28
28
|
import { startEmbeddingRuntimeManager } from "../persistence/embeddings/embedding-backend.js";
|
|
29
29
|
import { maybeEnqueueLexicalBackfillOnUpgrade } from "../persistence/job-handlers/message-lexical-backfill.js";
|
|
30
|
+
import { clearLifecycleQuiesce } from "../persistence/lifecycle-quiesce.js";
|
|
30
31
|
import { startConsentRefresh } from "../platform/consent-cache.js";
|
|
31
32
|
import { syncWorkspaceIdentityToPlatform } from "../platform/sync-identity.js";
|
|
32
33
|
import { ensurePromptFiles } from "../prompts/system-prompt.js";
|
|
@@ -45,6 +46,7 @@ import {
|
|
|
45
46
|
} from "../runtime/http-server.js";
|
|
46
47
|
import { warmLocalGuardianPrincipalCache } from "../runtime/local-actor-identity.js";
|
|
47
48
|
import { recoverInterruptedImport } from "../runtime/migrations/vbundle-streaming-importer.js";
|
|
49
|
+
import { markCurrentProcessAsMainDaemon } from "../runtime/process-role.js";
|
|
48
50
|
import { publishConfigChanged } from "../runtime/sync/resource-sync-events.js";
|
|
49
51
|
import { recoverStaleSchedules } from "../schedule/schedule-recovery.js";
|
|
50
52
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
@@ -103,6 +105,11 @@ function loadDotEnv(): void {
|
|
|
103
105
|
|
|
104
106
|
// Entry point for the daemon process itself
|
|
105
107
|
export async function runDaemon(): Promise<void> {
|
|
108
|
+
// Identify this process as the daemon before anything can publish: it owns
|
|
109
|
+
// the event hub real clients subscribe to, so plugin-facing publishes made
|
|
110
|
+
// here fan out locally rather than routing to a daemon over IPC.
|
|
111
|
+
markCurrentProcessAsMainDaemon();
|
|
112
|
+
|
|
106
113
|
const startupStartedAt = Date.now();
|
|
107
114
|
// dotenv loads before the first log call so the lazy root logger
|
|
108
115
|
// initializes against the final VELLUM_WORKSPACE_DIR / log path, not
|
|
@@ -242,6 +249,12 @@ export async function runDaemon(): Promise<void> {
|
|
|
242
249
|
try {
|
|
243
250
|
const { migrationsOk } = await initializeDb();
|
|
244
251
|
dbReady = true;
|
|
252
|
+
// A quiesce lease can survive a stop that happened mid-drain; clear it so
|
|
253
|
+
// a fresh boot never starts with background work paused. Placed
|
|
254
|
+
// synchronously after DB init — before any await yields to the
|
|
255
|
+
// already-listening HTTP server — so it cannot delete a lease a client
|
|
256
|
+
// arms against THIS boot.
|
|
257
|
+
clearLifecycleQuiesce();
|
|
245
258
|
// Floor the stream seq counter above every persisted conversation
|
|
246
259
|
// anchor before turns can stamp events. Anchors are getCurrentSeq()
|
|
247
260
|
// snapshots already served to clients, and a crashed process can have
|