@vellumai/assistant 0.6.6 → 0.7.0
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 +20 -0
- package/ARCHITECTURE.md +45 -36
- package/Dockerfile +26 -6
- package/README.md +8 -10
- package/__tests__/permissions/gateway-threshold-reader.test.ts +14 -20
- package/bun.lock +306 -119
- package/docs/architecture/memory.md +1 -90
- package/docs/architecture/security.md +15 -30
- package/docs/credential-execution-service.md +7 -5
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +17 -45
- package/examples/plugins/echo/bun.lock +25 -0
- package/knip.json +8 -22
- package/node_modules/@vellumai/ces-client/bun.lock +33 -0
- package/node_modules/@vellumai/ces-client/package.json +25 -0
- package/node_modules/@vellumai/ces-client/src/__tests__/ces-client.test.ts +631 -0
- package/node_modules/@vellumai/ces-client/src/__tests__/package-boundary.test.ts +138 -0
- package/node_modules/@vellumai/ces-client/src/credential-rpc.ts +13 -0
- package/node_modules/@vellumai/ces-client/src/http-credentials.ts +296 -0
- package/node_modules/@vellumai/ces-client/src/http-log-export.ts +111 -0
- package/node_modules/@vellumai/ces-client/src/index.ts +43 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +445 -0
- package/node_modules/@vellumai/credential-storage/src/__tests__/package-boundary.test.ts +32 -6
- package/node_modules/@vellumai/egress-proxy/src/__tests__/package-boundary.test.ts +32 -1
- package/node_modules/@vellumai/gateway-client/bun.lock +39 -0
- package/node_modules/@vellumai/gateway-client/package.json +23 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/gateway-client.test.ts +343 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/package-boundary.test.ts +140 -0
- package/node_modules/@vellumai/gateway-client/src/http-delivery.ts +422 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +35 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +331 -0
- package/node_modules/@vellumai/gateway-client/src/types.ts +131 -0
- package/node_modules/@vellumai/gateway-client/tsconfig.json +20 -0
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/bun.lock +1 -1
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/package.json +4 -2
- package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/__tests__/contracts.test.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/package-boundary.test.ts +155 -0
- package/node_modules/@vellumai/service-contracts/src/credential-rpc.ts +23 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +25 -0
- package/node_modules/@vellumai/{ces-contracts/src/index.ts → service-contracts/src/transport.ts} +6 -28
- package/node_modules/@vellumai/service-contracts/src/trust-rules.ts +116 -0
- package/node_modules/@vellumai/service-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +891 -0
- package/node_modules/@vellumai/skill-host-contracts/bun.lock +24 -0
- package/node_modules/@vellumai/skill-host-contracts/package.json +18 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +91 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +1348 -0
- package/node_modules/@vellumai/skill-host-contracts/src/index.ts +6 -0
- package/node_modules/@vellumai/skill-host-contracts/src/runtime-mode.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +32 -0
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +333 -0
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +444 -0
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/tsconfig.test.json +12 -0
- package/openapi.yaml +2855 -556
- package/package.json +13 -7
- package/scripts/check-circular-deps.ts +80 -0
- package/scripts/generate-openapi.ts +24 -7
- package/{src/memory/graph/inspect.ts → scripts/memory-inspect.ts} +27 -27
- package/src/__tests__/access-request-decision.test.ts +2 -11
- package/src/__tests__/acp-session.test.ts +4 -150
- package/src/__tests__/actor-token-service.test.ts +17 -678
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +2 -6
- package/src/__tests__/agent-loop-override-profile.test.ts +404 -0
- package/src/__tests__/agent-loop-thinking.test.ts +4 -4
- package/src/__tests__/agent-wake-override-profile.test.ts +261 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -1
- package/src/__tests__/anthropic-provider.test.ts +127 -15
- package/src/__tests__/app-routes-csp.test.ts +106 -55
- package/src/__tests__/approval-cascade.test.ts +3 -355
- package/src/__tests__/approval-conversation-turn.test.ts +3 -8
- package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
- package/src/__tests__/approval-primitive.test.ts +2 -1
- package/src/__tests__/approval-routes-http.test.ts +34 -451
- package/src/__tests__/assistant-events-sse-hardening.test.ts +73 -80
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -3
- package/src/__tests__/attachment-upload-trusted-source.test.ts +139 -0
- package/src/__tests__/attachments-store.test.ts +46 -1
- package/src/__tests__/audit-log-rotation.test.ts +2 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +8 -20
- package/src/__tests__/background-shell-bash.test.ts +227 -0
- package/src/__tests__/background-shell-host-bash.test.ts +474 -0
- package/src/__tests__/background-tool-registry.test.ts +145 -0
- package/src/__tests__/background-tool-routes.test.ts +175 -0
- package/src/__tests__/btw-routes.test.ts +147 -183
- package/src/__tests__/call-controller.test.ts +15 -2
- package/src/__tests__/call-conversation-messages.test.ts +2 -1
- package/src/__tests__/call-domain.test.ts +2 -2
- package/src/__tests__/call-pointer-messages.test.ts +11 -13
- package/src/__tests__/call-recovery.test.ts +2 -1
- package/src/__tests__/call-routes-http.test.ts +3 -14
- package/src/__tests__/call-store.test.ts +2 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +31 -62
- package/src/__tests__/canonical-guardian-store.test.ts +2 -2
- package/src/__tests__/catalog-files.test.ts +0 -26
- package/src/__tests__/ces-rpc-credential-backend.test.ts +1 -1
- package/src/__tests__/channel-approval-routes.test.ts +79 -49
- package/src/__tests__/channel-approval.test.ts +9 -7
- package/src/__tests__/channel-approvals.test.ts +9 -180
- package/src/__tests__/channel-delivery-store.test.ts +11 -10
- package/src/__tests__/channel-guardian.test.ts +14 -25
- package/src/__tests__/channel-readiness-service.test.ts +8 -6
- package/src/__tests__/channel-reply-delivery.test.ts +3 -19
- package/src/__tests__/channel-retry-sweep.test.ts +2 -5
- package/src/__tests__/checker.test.ts +274 -3921
- package/src/__tests__/circuit-breaker-pipeline.test.ts +1 -1
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +208 -0
- package/src/__tests__/cli.test.ts +1 -38
- package/src/__tests__/compaction-events.test.ts +0 -1
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +2 -2
- package/src/__tests__/compaction-timeout-recovery.test.ts +1 -1
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -7
- package/src/__tests__/config-model-image-provider.test.ts +0 -1
- package/src/__tests__/config-schema-cmd.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +30 -221
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +4 -25
- package/src/__tests__/contact-store-user-file.test.ts +2 -1
- package/src/__tests__/contacts-tools.test.ts +56 -29
- package/src/__tests__/contacts-write.test.ts +6 -61
- package/src/__tests__/context-search-agent-protocol.test.ts +230 -0
- package/src/__tests__/context-search-agent-runner.test.ts +998 -0
- package/src/__tests__/context-search-conversations-source.test.ts +320 -0
- package/src/__tests__/context-search-fanout.test.ts +380 -0
- package/src/__tests__/context-search-memory-source.test.ts +311 -0
- package/src/__tests__/context-search-pkb-source.test.ts +444 -0
- package/src/__tests__/context-search-types.test.ts +95 -0
- package/src/__tests__/context-search-workspace-source.test.ts +545 -0
- package/src/__tests__/context-window-manager.test.ts +25 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +631 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +15 -2
- package/src/__tests__/conversation-agent-loop.test.ts +24 -2
- package/src/__tests__/conversation-analysis-routes.test.ts +60 -82
- package/src/__tests__/conversation-attachments.test.ts +9 -20
- package/src/__tests__/conversation-attention-store.test.ts +2 -1
- package/src/__tests__/conversation-attention-telegram.test.ts +4 -2
- package/src/__tests__/conversation-clear-safety.test.ts +53 -95
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -39
- package/src/__tests__/conversation-crud-inference-profile.test.ts +54 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +63 -157
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +5 -4
- package/src/__tests__/conversation-fork-crud.test.ts +26 -55
- package/src/__tests__/conversation-fork-route.test.ts +5 -74
- package/src/__tests__/conversation-inference-profile-list.test.ts +128 -0
- package/src/__tests__/conversation-inference-profile-route.test.ts +216 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +4 -81
- package/src/__tests__/conversation-key-store-disk-view.test.ts +2 -1
- package/src/__tests__/conversation-lifecycle.test.ts +0 -1
- package/src/__tests__/conversation-list-source.test.ts +2 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +0 -1
- package/src/__tests__/conversation-pairing.test.ts +0 -1
- package/src/__tests__/conversation-pre-run-repair.test.ts +137 -297
- package/src/__tests__/conversation-process-callsite.test.ts +0 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -1
- package/src/__tests__/conversation-queue.test.ts +1 -33
- package/src/__tests__/conversation-routes-disk-view.test.ts +124 -97
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +80 -55
- package/src/__tests__/conversation-routes-slash-commands.test.ts +83 -12
- package/src/__tests__/conversation-runtime-assembly.test.ts +41 -84
- package/src/__tests__/conversation-slash-commands.test.ts +6 -43
- package/src/__tests__/conversation-slash-queue.test.ts +0 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -1
- package/src/__tests__/conversation-speed-override.test.ts +0 -1
- package/src/__tests__/conversation-starter-routes.test.ts +177 -55
- package/src/__tests__/conversation-starters-cadence.test.ts +2 -2
- package/src/__tests__/conversation-store.test.ts +2 -375
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +6 -6
- package/src/__tests__/conversation-unread-route.test.ts +1 -1
- package/src/__tests__/conversation-usage.test.ts +2 -1
- package/src/__tests__/conversation-wipe.test.ts +2 -103
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -1
- package/src/__tests__/conversations-defer-cli.test.ts +150 -0
- package/src/__tests__/credential-execution-admin-cli.test.ts +1 -1
- package/src/__tests__/credential-execution-api-key-propagation.test.ts +2 -2
- package/src/__tests__/credential-execution-approval-bridge.test.ts +22 -289
- package/src/__tests__/credential-execution-client.test.ts +1 -1
- package/src/__tests__/credential-execution-managed-contract.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +14 -0
- package/src/__tests__/credentials-cli.test.ts +45 -21
- package/src/__tests__/daemon-credential-client.test.ts +23 -108
- package/src/__tests__/db-acp-history.test.ts +284 -0
- package/src/__tests__/db-activation-state.test.ts +240 -0
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +2 -1
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +248 -0
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +2 -1
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +116 -0
- package/src/__tests__/db-rename-inference-profile-snake-case-migration.test.ts +132 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +1 -0
- package/src/__tests__/delete-propagation.test.ts +3 -2
- package/src/__tests__/deterministic-verification-control-plane.test.ts +39 -32
- package/src/__tests__/dm-backfill.test.ts +3 -2
- package/src/__tests__/edit-propagation.test.ts +5 -7
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +1 -1
- package/src/__tests__/empty-response-pipeline.test.ts +1 -1
- package/src/__tests__/events-client-registration.test.ts +297 -0
- package/src/__tests__/file-write-tool.test.ts +2 -4
- package/src/__tests__/filing-service.test.ts +144 -17
- package/src/__tests__/followup-tools.test.ts +2 -1
- package/src/__tests__/gateway-client-managed-outbound.test.ts +8 -12
- package/src/__tests__/gateway-only-enforcement.test.ts +2 -6
- package/src/__tests__/gateway-only-guard.test.ts +4 -3
- package/src/__tests__/gemini-provider.test.ts +276 -10
- package/src/__tests__/graph-extraction-event-date.test.ts +30 -0
- package/src/__tests__/guardian-action-conversation-turn.test.ts +2 -1
- package/src/__tests__/guardian-action-followup-executor.test.ts +2 -2
- package/src/__tests__/guardian-action-followup-store.test.ts +2 -1
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +9 -9
- package/src/__tests__/guardian-action-late-reply.test.ts +2 -1
- package/src/__tests__/guardian-action-store.test.ts +2 -1
- package/src/__tests__/guardian-action-sweep.test.ts +9 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +2 -1
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +21 -118
- package/src/__tests__/guardian-dispatch.test.ts +14 -11
- package/src/__tests__/guardian-grant-minting.test.ts +9 -15
- package/src/__tests__/guardian-outbound-http.test.ts +71 -106
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +2 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +34 -90
- package/src/__tests__/guardian-routing-state.test.ts +14 -22
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +253 -0
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +8 -4
- package/src/__tests__/heartbeat-service.test.ts +39 -21
- package/src/__tests__/helpers/call-route-handler.ts +72 -0
- package/src/__tests__/helpers/channel-test-adapter.ts +161 -0
- package/src/__tests__/helpers/gateway-classify-mock.ts +67 -0
- package/src/__tests__/helpers/mock-logger.ts +36 -0
- package/src/__tests__/history-repair-pipeline.test.ts +1 -1
- package/src/__tests__/home-state-routes.test.ts +10 -31
- package/src/__tests__/host-browser-e2e-cloud.test.ts +2 -1
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +12 -2
- package/src/__tests__/host-browser-routes.test.ts +36 -91
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +10 -2
- package/src/__tests__/host-proxy-interface.test.ts +3 -3
- package/src/__tests__/host-shell-tool.test.ts +2 -4
- package/src/__tests__/host-transfer-pending-interactions.test.ts +160 -0
- package/src/__tests__/host-transfer-proxy.test.ts +733 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +20 -11
- package/src/__tests__/inbound-invite-redemption.test.ts +3 -2
- package/src/__tests__/injector-chain.test.ts +16 -17
- package/src/__tests__/inline-skill-load-permissions.test.ts +41 -206
- package/src/__tests__/install-skill-routing.test.ts +1 -1
- package/src/__tests__/invite-redemption-service.test.ts +2 -1
- package/src/__tests__/invite-routes-http.test.ts +80 -12
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +2 -1
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +2 -1
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +157 -0
- package/src/__tests__/list-messages-attachments.test.ts +52 -55
- package/src/__tests__/list-messages-page-latest.test.ts +283 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +16 -17
- package/src/__tests__/llm-call-pipeline.test.ts +7 -8
- package/src/__tests__/llm-context-normalization.test.ts +69 -4
- package/src/__tests__/llm-context-route-provider.test.ts +39 -113
- package/src/__tests__/llm-request-log-turn-query.test.ts +2 -1
- package/src/__tests__/llm-resolver.test.ts +211 -0
- package/src/__tests__/llm-schema.test.ts +57 -1
- package/src/__tests__/llm-usage-store.test.ts +2 -1
- package/src/__tests__/log-export-workspace.test.ts +28 -17
- package/src/__tests__/mcp-abort-signal.test.ts +2 -3
- package/src/__tests__/mcp-client-auth.test.ts +2 -3
- package/src/__tests__/memory-admin-recall.test.ts +221 -0
- package/src/__tests__/memory-recall-log-store.test.ts +2 -1
- package/src/__tests__/memory-retrieval-pipeline.test.ts +6 -8
- package/src/__tests__/memory-upsert-concurrency.test.ts +2 -1
- package/src/__tests__/migration-cross-version-compatibility.test.ts +14 -13
- package/src/__tests__/migration-export-http.test.ts +17 -17
- package/src/__tests__/migration-export-to-gcs.test.ts +491 -0
- package/src/__tests__/migration-import-commit-http.test.ts +16 -16
- package/src/__tests__/migration-import-from-gcs.test.ts +533 -0
- package/src/__tests__/migration-import-from-url.test.ts +16 -23
- package/src/__tests__/migration-import-preflight-http.test.ts +13 -13
- package/src/__tests__/migration-jobs-status.test.ts +164 -0
- package/src/__tests__/migration-validate-http.test.ts +48 -83
- package/src/__tests__/mock-gateway-ipc.ts +32 -62
- package/src/__tests__/model-intents.test.ts +15 -2
- package/src/__tests__/nl-approval-parser.test.ts +13 -17
- package/src/__tests__/non-member-access-request.test.ts +13 -5
- package/src/__tests__/notification-guardian-path.test.ts +15 -8
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +2 -1
- package/src/__tests__/notification-telegram-adapter.test.ts +57 -55
- package/src/__tests__/oauth-apps-routes.test.ts +76 -122
- package/src/__tests__/oauth-cli.test.ts +14 -1
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +3 -1
- package/src/__tests__/oauth-providers-routes.test.ts +78 -101
- package/src/__tests__/oauth-store.test.ts +3 -1
- package/src/__tests__/oauth2-gateway-transport.test.ts +6 -3
- package/src/__tests__/openai-provider.test.ts +105 -6
- package/src/__tests__/openai-responses-provider.test.ts +146 -4
- package/src/__tests__/openrouter-provider-only.test.ts +22 -4
- package/src/__tests__/overflow-reduce-pipeline.test.ts +4 -9
- package/src/__tests__/permission-types.test.ts +3 -18
- package/src/__tests__/persistence-pipeline.test.ts +3 -2
- package/src/__tests__/pipeline-runner.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +27 -20
- package/src/__tests__/platform.test.ts +11 -63
- package/src/__tests__/playbook-execution.test.ts +2 -1
- package/src/__tests__/playbook-tools.test.ts +2 -1
- package/src/__tests__/plugin-bootstrap.test.ts +51 -5
- package/src/__tests__/plugin-registry.test.ts +30 -0
- package/src/__tests__/plugin-route-contribution.test.ts +17 -11
- package/src/__tests__/plugin-skill-contribution.test.ts +3 -3
- package/src/__tests__/plugin-tool-contribution.test.ts +10 -4
- package/src/__tests__/plugin-types.test.ts +1 -1
- package/src/__tests__/pricing.test.ts +151 -2
- package/src/__tests__/profiler-routes.test.ts +112 -177
- package/src/__tests__/provider-send-message-override-profile.test.ts +223 -0
- package/src/__tests__/proxy-approval-callback.test.ts +6 -554
- package/src/__tests__/qdrant-collection-migration.test.ts +7 -7
- package/src/__tests__/reaction-persistence.test.ts +3 -2
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/recording-handler.test.ts +0 -2
- package/src/__tests__/registry.test.ts +1 -0
- package/src/__tests__/relay-server.test.ts +19 -4
- package/src/__tests__/require-fresh-approval.test.ts +19 -168
- package/src/__tests__/resolve-trust-class.test.ts +2 -1
- package/src/__tests__/retry-thinking-tool-choice.test.ts +19 -7
- package/src/__tests__/retry-verbosity-normalization.test.ts +139 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +26 -6
- package/src/__tests__/runtime-events-sse-parity.test.ts +12 -13
- package/src/__tests__/runtime-events-sse.test.ts +13 -21
- package/src/__tests__/schedule-routes.test.ts +226 -129
- package/src/__tests__/schedule-store.test.ts +119 -1
- package/src/__tests__/schedule-tools.test.ts +2 -1
- package/src/__tests__/scheduler-recurrence.test.ts +2 -1
- package/src/__tests__/scheduler-reuse-conversation.test.ts +2 -1
- package/src/__tests__/scheduler-wake.test.ts +356 -0
- package/src/__tests__/scoped-approval-grants.test.ts +2 -1
- package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -1
- package/src/__tests__/secret-detection-handler.test.ts +2 -9
- package/src/__tests__/secret-ingress-http.test.ts +38 -21
- package/src/__tests__/secret-routes-managed-proxy.test.ts +46 -102
- package/src/__tests__/secret-scanner-executor.test.ts +1 -2
- package/src/__tests__/send-endpoint-busy.test.ts +38 -25
- package/src/__tests__/sequence-store.test.ts +2 -1
- package/src/__tests__/server-history-render.test.ts +2 -2
- package/src/__tests__/service-contracts-import-guard.test.ts +185 -0
- package/src/__tests__/set-permission-mode.test.ts +0 -10
- package/src/__tests__/settings-routes.test.ts +35 -68
- package/src/__tests__/skill-boundary-guard.test.ts +105 -0
- package/src/__tests__/skill-load-inline-command.test.ts +2 -2
- package/src/__tests__/skill-load-inline-includes.test.ts +2 -2
- package/src/__tests__/skill-runtime-path.test.ts +64 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +0 -2
- package/src/__tests__/slack-inbound-verification.test.ts +11 -2
- package/src/__tests__/slack-messaging-token-resolution.test.ts +1 -3
- package/src/__tests__/slack-reaction-approvals.test.ts +4 -4
- package/src/__tests__/slack-share-routes.test.ts +37 -72
- package/src/__tests__/subagent-call-site-routing.test.ts +79 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +20 -28
- package/src/__tests__/subagent-notify-parent.test.ts +6 -29
- package/src/__tests__/subagent-role-registry.test.ts +3 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +52 -104
- package/src/__tests__/subagent-tools.test.ts +0 -1
- package/src/__tests__/suggestion-routes.test.ts +55 -62
- package/src/__tests__/task-compiler.test.ts +2 -1
- package/src/__tests__/task-management-tools.test.ts +2 -1
- package/src/__tests__/task-memory-cleanup.test.ts +2 -1
- package/src/__tests__/task-scheduler.test.ts +2 -1
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +5 -314
- package/src/__tests__/test-preload.ts +0 -11
- package/src/__tests__/thread-backfill.test.ts +3 -2
- package/src/__tests__/token-estimate-pipeline.test.ts +68 -15
- package/src/__tests__/tool-approval-handler.test.ts +21 -63
- package/src/__tests__/tool-audit-listener.test.ts +3 -3
- package/src/__tests__/tool-domain-event-publisher.test.ts +3 -3
- package/src/__tests__/tool-error-pipeline.test.ts +6 -6
- package/src/__tests__/tool-execute-pipeline.test.ts +6 -8
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +64 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +28 -56
- package/src/__tests__/tool-executor.test.ts +322 -1633
- package/src/__tests__/tool-grant-request-escalation.test.ts +90 -311
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +1 -1
- package/src/__tests__/trust-context-guards.test.ts +1 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +7 -15
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +178 -354
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +3 -2
- package/src/__tests__/trusted-contact-multichannel.test.ts +3 -2
- package/src/__tests__/trusted-contact-verification.test.ts +2 -1
- package/src/__tests__/turn-boundary-resolution.test.ts +2 -1
- package/src/__tests__/twilio-routes.test.ts +25 -66
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -7
- package/src/__tests__/usage-routes.test.ts +73 -90
- package/src/__tests__/user-plugin-loader.test.ts +54 -12
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +2 -2
- package/src/__tests__/verification-control-plane-policy.test.ts +95 -14
- package/src/__tests__/voice-ingress-preflight.test.ts +5 -5
- package/src/__tests__/voice-invite-redemption.test.ts +2 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +3 -3
- package/src/__tests__/voice-session-bridge.test.ts +285 -106
- package/src/__tests__/volume-security-guard.test.ts +0 -2
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +2 -1
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +3 -1
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +2 -1
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +1 -1
- package/src/__tests__/workspace-migration-052-seed-default-inference-profiles.test.ts +260 -0
- package/src/__tests__/workspace-migration-053-release-notes-acp-codex.test.ts +225 -0
- package/src/__tests__/workspace-migration-054-seed-recall-callsite.test.ts +235 -0
- package/src/__tests__/workspace-migration-055-release-notes-agentic-recall.test.ts +128 -0
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +232 -0
- package/src/__tests__/workspace-migration-acp-sessions-ui.test.ts +144 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +1 -1
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +274 -0
- package/src/acp/__tests__/client-handler.test.ts +64 -0
- package/src/acp/__tests__/helpers/acp-config-stub.ts +62 -0
- package/src/acp/__tests__/helpers/which-stub.ts +45 -0
- package/src/acp/__tests__/session-manager-persistence.test.ts +366 -0
- package/src/acp/__tests__/session-manager-startup.test.ts +159 -0
- package/src/acp/__tests__/session-manager.test.ts +83 -0
- package/src/acp/client-handler.ts +23 -139
- package/src/acp/resolve-agent.test.ts +291 -0
- package/src/acp/resolve-agent.ts +176 -0
- package/src/acp/session-manager.ts +166 -7
- package/src/acp/types.ts +2 -50
- package/src/agent/loop.ts +37 -14
- package/src/agent/message-types.ts +0 -2
- package/src/approvals/AGENTS.md +1 -1
- package/src/approvals/__tests__/guardian-feed-event.test.ts +1 -9
- package/src/approvals/approval-primitive.ts +3 -20
- package/src/approvals/guardian-decision-primitive.ts +37 -68
- package/src/approvals/guardian-request-resolvers.ts +29 -103
- package/src/avatar/character-components.ts +6 -6
- package/src/{config/bundled-skills/settings/tools → avatar}/identity-avatar.ts +1 -1
- package/src/backup/__tests__/backup-worker.test.ts +0 -2
- package/src/backup/__tests__/paths.test.ts +3 -2
- package/src/backup/backup-worker.ts +1 -10
- package/src/backup/paths.ts +2 -18
- package/src/backup/restore.ts +7 -11
- package/src/browser/__tests__/operations.test.ts +0 -35
- package/src/browser/operations.ts +1 -47
- package/src/bundler/package-resolver.ts +2 -6
- package/src/calls/active-call-lease.ts +1 -1
- package/src/calls/call-constants.ts +1 -1
- package/src/calls/call-controller.ts +1 -5
- package/src/calls/call-domain.ts +14 -14
- package/src/calls/call-pointer-messages.ts +4 -9
- package/src/calls/call-store.ts +2 -1
- package/src/calls/guardian-action-sweep.ts +9 -25
- package/src/calls/guardian-dispatch.ts +1 -20
- package/src/calls/media-stream-audio-transcode.ts +2 -41
- package/src/calls/media-stream-server.ts +2 -3
- package/src/calls/media-stream-stt-session.ts +1 -3
- package/src/calls/relay-access-wait.ts +5 -8
- package/src/calls/relay-server.ts +15 -18
- package/src/calls/relay-setup-router.ts +2 -2
- package/src/calls/relay-verification.ts +4 -4
- package/src/calls/twilio-rest.ts +1 -1
- package/src/calls/twilio-routes.ts +160 -78
- package/src/calls/voice-control-protocol.ts +10 -10
- package/src/calls/voice-ingress-preflight.ts +2 -2
- package/src/calls/voice-session-bridge.ts +137 -42
- package/src/channels/__tests__/types.test.ts +25 -3
- package/src/channels/permission-profiles.ts +2 -72
- package/src/channels/types.ts +42 -26
- package/src/cli/AGENTS.md +1 -0
- package/src/cli/__tests__/notifications.test.ts +12 -10
- package/src/cli/commands/__tests__/attachment.test.ts +14 -8
- package/src/cli/commands/__tests__/backup.test.ts +3 -14
- package/src/cli/commands/__tests__/browser.test.ts +36 -31
- package/src/cli/commands/__tests__/cache.test.ts +23 -18
- package/src/cli/commands/__tests__/memory-v2.test.ts +396 -0
- package/src/cli/commands/__tests__/task.test.ts +36 -35
- package/src/cli/commands/__tests__/trust.test.ts +602 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +14 -14
- package/src/cli/commands/__tests__/ui.test.ts +17 -17
- package/src/cli/commands/__tests__/watchers.test.ts +29 -29
- package/src/cli/commands/__tests__/webhooks.test.ts +544 -0
- package/src/cli/commands/attachment.ts +12 -8
- package/src/cli/commands/auth.ts +1 -1
- package/src/cli/commands/avatar.ts +192 -9
- package/src/cli/commands/backup.ts +14 -44
- package/src/cli/commands/browser.ts +52 -4
- package/src/cli/commands/cache.ts +7 -5
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/clients.ts +11 -12
- package/src/cli/commands/completions.ts +1 -1
- package/src/cli/commands/contacts.ts +10 -10
- package/src/cli/commands/conversations-defer.ts +364 -0
- package/src/cli/commands/conversations-import.ts +2 -3
- package/src/cli/commands/conversations.ts +63 -53
- package/src/cli/commands/credential-execution.ts +1 -1
- package/src/cli/commands/credentials.ts +139 -5
- package/src/cli/commands/default-action.ts +1 -1
- package/src/cli/commands/domain.ts +2 -2
- package/src/cli/commands/email.ts +7 -7
- package/src/cli/commands/image-generation.ts +1 -1
- package/src/cli/commands/keys.ts +2 -2
- package/src/cli/commands/mcp.ts +1 -1
- package/src/cli/commands/memory-v2.ts +343 -0
- package/src/cli/commands/memory.ts +8 -8
- package/src/cli/commands/notifications.ts +21 -20
- package/src/cli/commands/oauth/__tests__/connect.test.ts +23 -5
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/mode.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/status.test.ts +1 -1
- package/src/cli/commands/oauth/__tests__/token.test.ts +1 -1
- package/src/cli/commands/oauth/connect.ts +2 -2
- package/src/cli/commands/oauth/shared.ts +29 -2
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -6
- package/src/cli/commands/platform/__tests__/connect.test.ts +23 -11
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +22 -10
- package/src/cli/commands/platform/__tests__/status.test.ts +22 -10
- package/src/cli/commands/platform/connect.ts +3 -3
- package/src/cli/commands/platform/disconnect.ts +4 -6
- package/src/cli/commands/platform/index.ts +12 -10
- package/src/cli/commands/routes.ts +7 -1
- package/src/cli/commands/sequence.ts +7 -7
- package/src/cli/commands/skills.ts +188 -82
- package/src/cli/commands/task.ts +12 -10
- package/src/cli/commands/trust.ts +460 -162
- package/src/cli/commands/ui.ts +3 -3
- package/src/cli/commands/usage.ts +10 -5
- package/src/cli/commands/watchers.ts +8 -8
- package/src/cli/commands/webhooks.ts +270 -0
- package/src/cli/lib/daemon-avatar-client.ts +37 -0
- package/src/cli/lib/daemon-credential-client.ts +27 -189
- package/src/cli/lib/ipc-params.ts +22 -0
- package/src/cli/program.ts +4 -0
- package/src/cli.ts +1 -61
- package/src/config/acp-defaults.test.ts +57 -0
- package/src/config/acp-defaults.ts +40 -0
- package/src/config/acp-schema.ts +1 -1
- package/src/config/assistant-feature-flags.ts +18 -142
- package/src/config/bundled-skills/acp/SKILL.md +44 -16
- package/src/config/bundled-skills/acp/TOOLS.json +45 -1
- package/src/config/bundled-skills/acp/tools/acp-list-agents.ts +12 -0
- package/src/config/bundled-skills/acp/tools/acp-steer.ts +12 -0
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +14 -14
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +1 -4
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +11 -6
- package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +6 -6
- package/src/config/bundled-skills/media-processing/services/reduce.ts +0 -13
- package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +1 -1
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +1 -1
- package/src/config/bundled-skills/settings/SKILL.md +2 -17
- package/src/config/bundled-skills/settings/TOOLS.json +0 -56
- package/src/config/bundled-skills/subagent/SKILL.md +2 -0
- package/src/config/bundled-tool-registry.ts +4 -6
- package/src/config/env.ts +7 -8
- package/src/config/feature-flag-registry.json +16 -24
- package/src/config/llm-resolver.ts +51 -33
- package/src/config/loader.ts +12 -15
- package/src/config/schema.ts +5 -72
- package/src/config/schemas/__tests__/filing.test.ts +58 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +186 -0
- package/src/config/schemas/filing.ts +12 -0
- package/src/config/schemas/host-browser.ts +2 -2
- package/src/config/schemas/inference.ts +0 -2
- package/src/config/schemas/ingress.ts +1 -1
- package/src/config/schemas/llm.ts +51 -9
- package/src/config/schemas/memory-storage.ts +1 -1
- package/src/config/schemas/memory-v2.ts +176 -0
- package/src/config/schemas/memory.ts +2 -0
- package/src/config/schemas/security.ts +0 -60
- package/src/config/schemas/services.ts +46 -7
- package/src/config/skills.ts +1 -1
- package/src/config/types.ts +0 -41
- package/src/contacts/contact-store.ts +2 -2
- package/src/contacts/contacts-write.ts +0 -38
- package/src/contacts/types.ts +8 -10
- package/src/context/token-estimator.ts +1 -1
- package/src/context/tool-result-truncation.ts +1 -1
- package/src/context/window-manager.ts +1 -1
- package/src/credential-execution/approval-bridge.ts +7 -69
- package/src/credential-execution/client.ts +17 -422
- package/src/credential-execution/feature-gates.ts +1 -2
- package/src/credential-execution/managed-catalog.ts +1 -1
- package/src/credential-health/credential-health-service.ts +1 -1
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -13
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
- package/src/daemon/__tests__/daemon-skill-host.test.ts +272 -0
- package/src/daemon/__tests__/meet-host-supervisor.test.ts +587 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +463 -0
- package/src/daemon/approval-generators.ts +2 -14
- package/src/daemon/classifier.ts +0 -106
- package/src/daemon/config-watcher.ts +14 -54
- package/src/daemon/connection-policy.ts +0 -14
- package/src/daemon/conversation-agent-loop-handlers.ts +37 -6
- package/src/daemon/conversation-agent-loop.ts +164 -53
- package/src/daemon/conversation-attachments.ts +5 -81
- package/src/daemon/conversation-error.ts +9 -5
- package/src/daemon/conversation-history.ts +1 -1
- package/src/daemon/conversation-launch.ts +1 -1
- package/src/daemon/conversation-messaging.ts +1 -1
- package/src/daemon/conversation-notifiers.ts +1 -1
- package/src/daemon/conversation-process.ts +9 -13
- package/src/daemon/conversation-runtime-assembly.ts +26 -88
- package/src/daemon/conversation-slash.ts +4 -160
- package/src/daemon/conversation-store.ts +368 -0
- package/src/daemon/conversation-surfaces.ts +5 -4
- package/src/daemon/conversation-tool-setup.ts +23 -172
- package/src/daemon/conversation.ts +46 -182
- package/src/daemon/daemon-control.ts +3 -3
- package/src/daemon/daemon-skill-host.ts +262 -0
- package/src/daemon/external-plugins-bootstrap.ts +67 -13
- package/src/daemon/handlers/config-channels.ts +2 -2
- package/src/daemon/handlers/config-embeddings.ts +1 -1
- package/src/daemon/handlers/config-ingress.ts +24 -2
- package/src/daemon/handlers/config-model.test.ts +17 -0
- package/src/daemon/handlers/config-model.ts +7 -52
- package/src/daemon/handlers/config-telegram.ts +6 -53
- package/src/daemon/handlers/config-voice.ts +1 -1
- package/src/daemon/handlers/conversations.ts +22 -156
- package/src/daemon/handlers/recording.ts +1 -1
- package/src/daemon/handlers/shared.ts +34 -35
- package/src/daemon/handlers/skills.ts +15 -23
- package/src/daemon/host-transfer-proxy.ts +500 -0
- package/src/daemon/lifecycle.ts +23 -258
- package/src/daemon/meet-host-startup.ts +51 -0
- package/src/daemon/meet-host-supervisor.ts +781 -0
- package/src/daemon/meet-manifest-loader.ts +410 -0
- package/src/daemon/memory-v2-startup.ts +35 -0
- package/src/daemon/message-protocol.ts +4 -7
- package/src/daemon/message-types/acp.ts +1 -0
- package/src/daemon/message-types/conversations.ts +16 -2
- package/src/daemon/message-types/host-transfer.ts +41 -0
- package/src/daemon/message-types/integrations.ts +6 -0
- package/src/daemon/message-types/messages.ts +14 -14
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/settings.ts +0 -6
- package/src/daemon/message-types/shared.ts +5 -2
- package/src/daemon/message-types/subagents.ts +2 -1
- package/src/daemon/message-types/workspace.ts +0 -2
- package/src/daemon/pkb-reminder-builder.test.ts +13 -12
- package/src/daemon/pkb-reminder-builder.ts +8 -16
- package/src/daemon/process-message.ts +616 -0
- package/src/daemon/providers-setup.ts +14 -6
- package/src/daemon/server.ts +79 -1274
- package/src/daemon/shutdown-handlers.ts +1 -1
- package/src/daemon/startup-error.ts +1 -1
- package/src/daemon/trust-context.ts +32 -0
- package/src/daemon/wake-target-adapter.ts +223 -0
- package/src/email/feature-gate.ts +1 -1
- package/src/events/domain-events.ts +1 -8
- package/src/events/tool-audit-listener.ts +2 -8
- package/src/events/tool-metrics-listener.ts +1 -4
- package/src/filing/filing-service.ts +194 -54
- package/src/followups/followup-store.ts +3 -71
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +89 -21
- package/src/heartbeat/heartbeat-service.ts +32 -11
- package/src/home/__tests__/phase5-exit-criteria.test.ts +18 -1
- package/src/home/__tests__/rollup-producer.test.ts +67 -2
- package/src/home/assistant-feed-authoring.ts +8 -1
- package/src/home/feed-types.ts +1 -1
- package/src/home/relationship-state-writer.ts +1 -1
- package/src/home/rewrite-feed-title.ts +58 -0
- package/src/home/rollup-producer.ts +16 -3
- package/src/inbound/platform-callback-registration.ts +1 -17
- package/src/ipc/__tests__/attachment-ipc.test.ts +128 -66
- package/src/ipc/__tests__/browser-ipc.test.ts +75 -51
- package/src/ipc/__tests__/cache-ipc.test.ts +52 -107
- package/src/ipc/__tests__/cli-ipc.test.ts +9 -6
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +254 -0
- package/src/ipc/__tests__/skill-server.test.ts +182 -0
- package/src/ipc/__tests__/socket-path.test.ts +69 -23
- package/src/ipc/__tests__/ui-request-route.test.ts +241 -216
- package/src/ipc/__tests__/watcher-ipc.test.ts +33 -33
- package/src/ipc/assistant-server.ts +450 -0
- package/src/ipc/cli-client.ts +3 -3
- package/src/ipc/gateway-client.test.ts +131 -0
- package/src/ipc/gateway-client.ts +98 -123
- package/src/ipc/ipc-framing.ts +281 -0
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +152 -0
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +219 -0
- package/src/ipc/routes/db-proxy.ts +73 -0
- package/src/ipc/routes/route-adapter.ts +32 -0
- package/src/ipc/routes/trust-rules.test.ts +218 -0
- package/src/ipc/skill-ipc-types.ts +13 -0
- package/src/ipc/skill-routes/__tests__/config.test.ts +146 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +402 -0
- package/src/ipc/skill-routes/__tests__/identity.test.ts +81 -0
- package/src/ipc/skill-routes/__tests__/log.test.ts +133 -0
- package/src/ipc/skill-routes/__tests__/memory.test.ts +178 -0
- package/src/ipc/skill-routes/__tests__/platform.test.ts +111 -0
- package/src/ipc/skill-routes/__tests__/providers.test.ts +265 -0
- package/src/ipc/skill-routes/__tests__/registries.test.ts +361 -0
- package/src/ipc/skill-routes/config.ts +47 -0
- package/src/ipc/skill-routes/events.ts +131 -0
- package/src/ipc/skill-routes/identity.ts +34 -0
- package/src/ipc/skill-routes/index.ts +37 -0
- package/src/ipc/skill-routes/log.ts +40 -0
- package/src/ipc/skill-routes/memory.ts +76 -0
- package/src/ipc/skill-routes/platform.ts +39 -0
- package/src/ipc/skill-routes/providers.ts +163 -0
- package/src/ipc/skill-routes/registries.ts +393 -0
- package/src/ipc/skill-server.ts +771 -0
- package/src/ipc/skill-socket-path.ts +20 -0
- package/src/ipc/socket-cleanup.ts +92 -0
- package/src/ipc/socket-path.ts +63 -32
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +374 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +525 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +473 -0
- package/src/live-voice/__tests__/live-voice-integration.test.ts +359 -0
- package/src/live-voice/__tests__/live-voice-metrics.test.ts +179 -0
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +349 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +244 -0
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +337 -0
- package/src/live-voice/__tests__/live-voice-tts.test.ts +337 -0
- package/src/live-voice/__tests__/protocol.test.ts +295 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +421 -0
- package/src/live-voice/live-voice-archive.ts +758 -0
- package/src/live-voice/live-voice-metrics.ts +472 -0
- package/src/live-voice/live-voice-session-manager.ts +222 -0
- package/src/live-voice/live-voice-session.ts +1144 -0
- package/src/live-voice/live-voice-tts.ts +260 -0
- package/src/live-voice/protocol.ts +524 -0
- package/src/mcp/client.ts +2 -2
- package/src/media/types.ts +4 -4
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +4 -28
- package/src/memory/__tests__/auto-analysis-guard.test.ts +2 -2
- package/src/memory/__tests__/conversation-analyze-job.test.ts +7 -62
- package/src/memory/__tests__/conversation-group-migration.test.ts +2 -2
- package/src/memory/__tests__/find-analysis-conversation.test.ts +2 -1
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +235 -0
- package/src/memory/admin.ts +65 -7
- package/src/memory/app-git-service.ts +0 -14
- package/src/memory/attachments-store.ts +14 -16
- package/src/memory/auto-analysis-enqueue.ts +2 -17
- package/src/memory/canonical-guardian-store.ts +2 -1
- package/src/memory/channel-verification-sessions.ts +1 -1
- package/src/memory/checkpoints.ts +1 -1
- package/src/memory/context-search/agent-protocol.ts +424 -0
- package/src/memory/context-search/agent-runner.ts +1295 -0
- package/src/memory/context-search/format.ts +160 -0
- package/src/memory/context-search/limits.ts +106 -0
- package/src/memory/context-search/search.ts +387 -0
- package/src/memory/context-search/sources/conversations.ts +278 -0
- package/src/memory/context-search/sources/memory.ts +90 -0
- package/src/memory/context-search/sources/pkb.ts +468 -0
- package/src/memory/context-search/sources/workspace.ts +1255 -0
- package/src/memory/context-search/types.ts +49 -0
- package/src/memory/conversation-analyze-job.ts +3 -24
- package/src/memory/conversation-attention-store.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +1 -1
- package/src/memory/conversation-crud.ts +69 -127
- package/src/memory/conversation-directories.ts +1 -11
- package/src/memory/conversation-display-order-migration.ts +11 -2
- package/src/memory/conversation-group-migration.ts +20 -4
- package/src/memory/conversation-key-store.ts +3 -4
- package/src/memory/conversation-queries.ts +13 -26
- package/src/memory/conversation-starter-validation.ts +88 -0
- package/src/memory/conversation-starters-cadence.ts +1 -1
- package/src/memory/conversation-title-service.ts +2 -1
- package/src/memory/db-init.ts +14 -4
- package/src/memory/db-maintenance.ts +1 -1
- package/src/memory/delivery-channels.ts +1 -14
- package/src/memory/delivery-crud.ts +2 -32
- package/src/memory/delivery-status.ts +1 -1
- package/src/memory/embedding-gemini.test.ts +4 -4
- package/src/memory/external-conversation-store.ts +1 -1
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +412 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +225 -0
- package/src/memory/graph/bootstrap.test.ts +2 -7
- package/src/memory/graph/bootstrap.ts +2 -1
- package/src/memory/graph/capability-seed.ts +3 -3
- package/src/memory/graph/compaction.ts +1 -1
- package/src/memory/graph/consolidation.ts +13 -10
- package/src/memory/graph/conversation-graph-memory.ts +151 -1
- package/src/memory/graph/decay.ts +1 -1
- package/src/memory/graph/extraction.ts +53 -21
- package/src/memory/graph/graph-memory-state-store.ts +1 -1
- package/src/memory/graph/graph-search.test.ts +94 -2
- package/src/memory/graph/graph-search.ts +22 -7
- package/src/memory/graph/image-ref-utils.ts +1 -1
- package/src/memory/graph/retriever.test.ts +158 -4
- package/src/memory/graph/retriever.ts +17 -5
- package/src/memory/graph/store.test.ts +2 -1
- package/src/memory/graph/store.ts +1 -1
- package/src/memory/graph/tool-handlers.ts +73 -247
- package/src/memory/graph/tools.ts +35 -53
- package/src/memory/group-crud.ts +1 -2
- package/src/memory/guardian-action-store.ts +2 -1
- package/src/memory/guardian-approvals.ts +1 -1
- package/src/memory/guardian-rate-limits.ts +1 -1
- package/src/memory/indexer.ts +43 -17
- package/src/memory/invite-store.ts +1 -1
- package/src/memory/job-handlers/backfill.ts +1 -1
- package/src/memory/job-handlers/cleanup.ts +2 -1
- package/src/memory/job-handlers/conversation-starters.ts +18 -10
- package/src/memory/job-handlers/embedding.test.ts +2 -1
- package/src/memory/job-handlers/embedding.ts +1 -1
- package/src/memory/job-handlers/index-maintenance.ts +1 -1
- package/src/memory/job-handlers/summarization.ts +3 -3
- package/src/memory/job-utils.ts +3 -3
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +362 -0
- package/src/memory/jobs/embed-concept-page.ts +210 -0
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -1
- package/src/memory/jobs-store.ts +10 -2
- package/src/memory/jobs-worker.ts +58 -5
- package/src/memory/lifecycle-events-store.ts +1 -1
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/llm-usage-store.ts +1 -1
- package/src/memory/media-store.ts +1 -1
- package/src/memory/memory-recall-log-store.ts +1 -1
- package/src/memory/migrations/038-actor-token-records.ts +3 -0
- package/src/memory/migrations/039-actor-refresh-token-records.ts +3 -0
- package/src/memory/migrations/226-schedule-wake-conversation-id.ts +11 -0
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +18 -0
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +27 -0
- package/src/memory/migrations/229-delete-private-conversations.test.ts +1087 -0
- package/src/memory/migrations/229-delete-private-conversations.ts +210 -0
- package/src/memory/migrations/230-acp-session-history.ts +41 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +128 -0
- package/src/memory/migrations/232-activation-state.ts +38 -0
- package/src/memory/migrations/index.ts +10 -0
- package/src/memory/migrations/registry.ts +7 -0
- package/src/memory/pkb/pkb-index.test.ts +4 -5
- package/src/memory/pkb/pkb-reconcile.test.ts +4 -5
- package/src/memory/pkb/pkb-search.test.ts +83 -3
- package/src/memory/pkb/pkb-search.ts +27 -14
- package/src/memory/published-pages-store.ts +1 -1
- package/src/memory/schema/acp.ts +30 -0
- package/src/memory/schema/conversations.ts +1 -1
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/infrastructure.ts +1 -32
- package/src/memory/schema/memory-graph.ts +36 -14
- package/src/memory/scoped-approval-grants.ts +2 -1
- package/src/memory/search/semantic.ts +2 -2
- package/src/memory/shared-app-links-store.ts +2 -1
- package/src/memory/tool-usage-store.ts +1 -1
- package/src/memory/trace-event-store.ts +2 -1
- package/src/memory/turn-events-store.ts +1 -1
- package/src/memory/v2/__tests__/activation-store.test.ts +202 -0
- package/src/memory/v2/__tests__/activation.test.ts +956 -0
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +610 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +395 -0
- package/src/memory/v2/__tests__/edges.test.ts +435 -0
- package/src/memory/v2/__tests__/injection.test.ts +792 -0
- package/src/memory/v2/__tests__/migration.test.ts +812 -0
- package/src/memory/v2/__tests__/page-store.test.ts +334 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +438 -0
- package/src/memory/v2/__tests__/sim.test.ts +549 -0
- package/src/memory/v2/__tests__/skill-content.test.ts +85 -0
- package/src/memory/v2/__tests__/skill-qdrant.test.ts +657 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +351 -0
- package/src/memory/v2/__tests__/sweep-job.test.ts +441 -0
- package/src/memory/v2/activation-store.ts +109 -0
- package/src/memory/v2/activation.ts +490 -0
- package/src/memory/v2/backfill-jobs.ts +442 -0
- package/src/memory/v2/consolidation-job.ts +304 -0
- package/src/memory/v2/edges.ts +217 -0
- package/src/memory/v2/injection.ts +307 -0
- package/src/memory/v2/migration.ts +654 -0
- package/src/memory/v2/now-text.ts +38 -0
- package/src/memory/v2/page-store.ts +245 -0
- package/src/memory/v2/prompts/consolidation.ts +185 -0
- package/src/memory/v2/prompts/sweep.ts +56 -0
- package/src/memory/v2/qdrant.ts +342 -0
- package/src/memory/v2/sim.ts +206 -0
- package/src/memory/v2/skill-content.ts +42 -0
- package/src/memory/v2/skill-qdrant.ts +395 -0
- package/src/memory/v2/skill-store.ts +128 -0
- package/src/memory/v2/sweep-job.ts +298 -0
- package/src/memory/v2/types.ts +116 -0
- package/src/memory/validation.ts +1 -1
- package/src/messaging/providers/index.ts +262 -0
- package/src/messaging/providers/slack/api.ts +242 -0
- package/src/messaging/providers/slack/message-metadata.ts +1 -1
- package/src/messaging/providers/slack/send.ts +383 -0
- package/src/messaging/providers/telegram-bot/adapter.ts +4 -42
- package/src/messaging/providers/telegram-bot/api.ts +253 -0
- package/src/messaging/providers/telegram-bot/client.ts +17 -58
- package/src/messaging/providers/telegram-bot/send.ts +232 -0
- package/src/messaging/providers/whatsapp/adapter.ts +4 -36
- package/src/messaging/providers/whatsapp/api.ts +319 -0
- package/src/messaging/providers/whatsapp/client.ts +4 -48
- package/src/messaging/providers/whatsapp/send.ts +209 -0
- package/src/notifications/adapters/slack.ts +5 -23
- package/src/notifications/adapters/telegram.ts +8 -29
- package/src/notifications/conversation-candidates.ts +1 -1
- package/src/notifications/conversation-seed-composer.ts +12 -6
- package/src/notifications/copy-composer.ts +1 -1
- package/src/notifications/decision-engine.ts +1 -1
- package/src/notifications/decisions-store.ts +1 -1
- package/src/notifications/deliveries-store.ts +2 -1
- package/src/notifications/deterministic-checks.ts +1 -1
- package/src/notifications/events-store.ts +1 -13
- package/src/notifications/preferences-store.ts +1 -1
- package/src/notifications/signal.ts +0 -9
- package/src/oauth/connection-resolver.ts +11 -2
- package/src/oauth/oauth-store.ts +2 -1
- package/src/outbound-proxy/index.ts +0 -1
- package/src/permissions/approval-policy.test.ts +149 -132
- package/src/permissions/approval-policy.ts +65 -91
- package/src/permissions/checker.test.ts +632 -0
- package/src/permissions/checker.ts +266 -459
- package/src/permissions/gateway-threshold-reader.ts +28 -47
- package/src/permissions/ipc-risk-types.ts +95 -0
- package/src/permissions/prompter.ts +4 -9
- package/src/permissions/risk-types.ts +24 -210
- package/src/permissions/types.ts +17 -47
- package/src/permissions/workspace-policy.ts +2 -4
- package/src/playbooks/playbook-compiler.ts +1 -1
- package/src/plugins/defaults/index.ts +1 -1
- package/src/plugins/defaults/injectors.ts +18 -21
- package/src/plugins/defaults/llm-call.ts +6 -9
- package/src/plugins/defaults/memory-retrieval.ts +1 -6
- package/src/plugins/defaults/overflow-reduce.ts +9 -5
- package/src/plugins/defaults/token-estimate.ts +2 -3
- package/src/plugins/registry.ts +61 -1
- package/src/plugins/types.ts +6 -7
- package/src/plugins/user-loader.ts +36 -10
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +197 -0
- package/src/prompts/persona-resolver.ts +2 -4
- package/src/prompts/system-prompt.ts +39 -0
- package/src/prompts/templates/SOUL.md +3 -1
- package/src/providers/__tests__/provider-env-vars.test.ts +0 -21
- package/src/providers/__tests__/retry-callsite.test.ts +3 -6
- package/src/providers/anthropic/client.ts +71 -19
- package/src/providers/call-site-routing.ts +7 -3
- package/src/providers/fireworks/client.ts +3 -0
- package/src/providers/gemini/client.ts +96 -22
- package/src/providers/managed-proxy/context.ts +0 -12
- package/src/providers/model-catalog.ts +83 -8
- package/src/providers/model-intents.ts +7 -8
- package/src/providers/openai/chat-completions-provider.ts +37 -7
- package/src/providers/openai/responses-provider.ts +39 -4
- package/src/providers/openrouter/client.ts +4 -5
- package/src/providers/provider-env-vars.ts +4 -12
- package/src/providers/provider-send-message.ts +16 -11
- package/src/providers/registry.ts +1 -1
- package/src/providers/retry.ts +52 -23
- package/src/providers/speech-to-text/openai-whisper-stream.ts +1 -1
- package/src/providers/speech-to-text/openai-whisper.ts +3 -6
- package/src/providers/speech-to-text/provider-catalog.ts +75 -0
- package/src/providers/speech-to-text/xai.ts +5 -5
- package/src/providers/thinking-config.ts +34 -0
- package/src/providers/types.ts +22 -10
- package/src/runtime/AGENTS.md +10 -9
- package/src/runtime/__tests__/agent-wake.test.ts +33 -9
- package/src/runtime/__tests__/client-registry.test.ts +5 -27
- package/src/runtime/__tests__/interactive-ui.test.ts +157 -246
- package/src/runtime/access-request-helper.ts +9 -20
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/agent-wake.ts +174 -68
- package/src/runtime/approval-conversation-turn.ts +2 -15
- package/src/runtime/approval-message-composer.ts +11 -60
- package/src/runtime/assistant-event.ts +18 -66
- package/src/runtime/auth/__tests__/guard-tests.test.ts +6 -30
- package/src/runtime/auth/__tests__/middleware.test.ts +10 -10
- package/src/runtime/auth/__tests__/route-policy.test.ts +0 -8
- package/src/runtime/auth/context.ts +9 -0
- package/src/runtime/auth/middleware.ts +4 -4
- package/src/runtime/auth/route-policy.ts +195 -4
- package/src/runtime/auth/token-service.ts +1 -100
- package/src/runtime/capability-tokens.ts +89 -313
- package/src/runtime/channel-approval-types.ts +1 -6
- package/src/runtime/channel-approvals.ts +7 -79
- package/src/runtime/channel-readiness-service.ts +2 -2
- package/src/runtime/channel-reply-delivery.ts +2 -8
- package/src/runtime/channel-retry-sweep.ts +20 -17
- package/src/runtime/client-registry.ts +21 -28
- package/src/runtime/confirmation-request-guardian-bridge.ts +2 -7
- package/src/runtime/gateway-client.ts +37 -378
- package/src/runtime/guardian-action-grant-minter.ts +2 -3
- package/src/runtime/guardian-action-message-composer.ts +11 -52
- package/src/runtime/guardian-action-service.ts +19 -7
- package/src/runtime/guardian-decision-types.ts +4 -65
- package/src/runtime/guardian-reply-router.ts +10 -19
- package/src/runtime/guardian-vellum-migration.ts +5 -64
- package/src/runtime/http-errors.ts +3 -0
- package/src/runtime/http-router.ts +50 -7
- package/src/runtime/http-server.ts +345 -1110
- package/src/runtime/http-types.ts +15 -98
- package/src/runtime/interactive-ui-types.ts +145 -0
- package/src/runtime/interactive-ui.ts +38 -196
- package/src/runtime/invite-redemption-service.ts +1 -1
- package/src/runtime/invite-redemption-templates.ts +1 -1
- package/src/runtime/local-actor-identity.ts +13 -43
- package/src/runtime/message-composer-types.ts +134 -0
- package/src/runtime/middleware/rate-limiter.ts +1 -1
- package/src/runtime/middleware/request-logger.ts +5 -2
- package/src/runtime/migrations/__tests__/job-registry.test.ts +346 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +16 -0
- package/src/runtime/migrations/job-registry.ts +281 -0
- package/src/runtime/migrations/vbundle-builder.ts +3 -4
- package/src/runtime/migrations/vbundle-importer.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +0 -13
- package/src/runtime/migrations/vbundle-tar-stream.ts +11 -3
- package/src/runtime/nl-approval-parser.ts +16 -21
- package/src/runtime/pending-interactions.ts +29 -12
- package/src/runtime/routes/__tests__/acp-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +204 -320
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +72 -4
- package/src/runtime/routes/__tests__/stt-routes.test.ts +182 -223
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +230 -0
- package/src/{ipc/__tests__/task-ipc.test.ts → runtime/routes/__tests__/task-routes.test.ts} +116 -96
- package/src/runtime/routes/__tests__/tts-routes.test.ts +185 -289
- package/src/runtime/routes/access-request-decision.ts +25 -50
- package/src/runtime/routes/acp-routes.test.ts +371 -0
- package/src/runtime/routes/acp-routes.ts +392 -166
- package/src/runtime/routes/app-management-routes.ts +464 -660
- package/src/runtime/routes/app-routes.ts +192 -177
- package/src/runtime/routes/approval-routes.ts +116 -434
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +24 -84
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +3 -10
- package/src/runtime/routes/attachment-routes.ts +409 -253
- package/src/runtime/routes/audio-routes.ts +51 -18
- package/src/runtime/routes/avatar-routes.ts +82 -75
- package/src/runtime/routes/background-tool-routes.ts +94 -0
- package/src/runtime/routes/backup-routes.ts +154 -336
- package/src/runtime/routes/brain-graph-routes.ts +83 -110
- package/src/runtime/routes/browser-routes.ts +141 -0
- package/src/runtime/routes/btw-routes.ts +62 -106
- package/src/runtime/routes/cache-routes.ts +96 -0
- package/src/runtime/routes/call-routes.ts +208 -247
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +1 -1
- package/src/runtime/routes/channel-delivery-routes.ts +25 -27
- package/src/runtime/routes/channel-readiness-routes.ts +83 -120
- package/src/runtime/routes/channel-route-definitions.ts +62 -0
- package/src/runtime/routes/channel-route-shared.ts +14 -18
- package/src/runtime/routes/channel-verification-routes.ts +207 -187
- package/src/runtime/routes/client-routes.ts +48 -0
- package/src/runtime/routes/contact-routes.ts +533 -407
- package/src/runtime/routes/conversation-analysis-routes.ts +48 -49
- package/src/runtime/routes/conversation-attention-routes.ts +55 -67
- package/src/runtime/routes/conversation-list-routes.ts +265 -0
- package/src/runtime/routes/conversation-management-routes.ts +626 -715
- package/src/runtime/routes/conversation-query-routes.ts +510 -460
- package/src/runtime/routes/conversation-routes.ts +456 -368
- package/src/runtime/routes/conversation-starter-routes.ts +121 -71
- package/src/runtime/routes/credential-prompt-routes.ts +124 -0
- package/src/runtime/routes/debug-routes.ts +34 -39
- package/src/runtime/routes/defer-routes.ts +230 -0
- package/src/runtime/routes/diagnostics-routes.ts +79 -70
- package/src/runtime/routes/documents-routes.ts +117 -106
- package/src/runtime/routes/errors.ts +132 -0
- package/src/runtime/routes/events-routes.ts +97 -58
- package/src/runtime/routes/filing-routes.ts +65 -78
- package/src/runtime/routes/global-search-routes.ts +51 -57
- package/src/runtime/routes/group-routes.ts +199 -181
- package/src/runtime/routes/guardian-action-routes.ts +103 -169
- package/src/runtime/routes/guardian-approval-interception.ts +27 -58
- package/src/runtime/routes/guardian-approval-prompt.ts +10 -21
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +2 -6
- package/src/runtime/routes/guardian-expiry-sweep.ts +19 -36
- package/src/runtime/routes/heartbeat-routes.ts +194 -209
- package/src/runtime/routes/home-feed-routes.ts +85 -187
- package/src/runtime/routes/home-state-routes.ts +27 -24
- package/src/runtime/routes/host-bash-routes.ts +42 -52
- package/src/runtime/routes/host-browser-routes.ts +38 -69
- package/src/runtime/routes/host-cu-routes.ts +74 -70
- package/src/runtime/routes/host-file-routes.ts +50 -60
- package/src/runtime/routes/host-transfer-routes.ts +220 -0
- package/src/runtime/routes/http-adapter.ts +172 -0
- package/src/runtime/routes/identity-routes.ts +83 -79
- package/src/runtime/routes/inbound-conversation.ts +11 -18
- package/src/runtime/routes/inbound-message-handler.ts +74 -110
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +79 -138
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +2 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +54 -90
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +25 -50
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +7 -7
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +5 -5
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +5 -6
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -24
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -10
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +3 -3
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +19 -26
- package/src/runtime/routes/index.ts +197 -0
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +25 -32
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +22 -31
- package/src/runtime/routes/integrations/slack/channel.ts +69 -66
- package/src/runtime/routes/integrations/slack/share.ts +49 -58
- package/src/runtime/routes/integrations/telegram.ts +91 -74
- package/src/runtime/routes/integrations/twilio.ts +163 -240
- package/src/runtime/routes/integrations/vercel.ts +57 -54
- package/src/runtime/routes/interface-routes.ts +43 -0
- package/src/runtime/routes/internal-oauth-routes.ts +56 -0
- package/src/runtime/routes/internal-twilio-routes.ts +46 -0
- package/src/runtime/routes/llm-context-normalization.ts +4 -2
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +90 -100
- package/src/runtime/routes/memory-item-routes.test.ts +152 -175
- package/src/runtime/routes/memory-item-routes.ts +243 -323
- package/src/runtime/routes/memory-v2-routes.ts +193 -0
- package/src/runtime/routes/migration-rollback-routes.ts +167 -212
- package/src/runtime/routes/migration-routes.ts +877 -374
- package/src/runtime/routes/notification-routes.ts +199 -70
- package/src/runtime/routes/oauth-apps.ts +254 -251
- package/src/runtime/routes/oauth-providers.ts +66 -57
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +60 -120
- package/src/runtime/routes/playground/__tests__/guard.test.ts +34 -54
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +107 -151
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +41 -117
- package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +95 -138
- package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +115 -217
- package/src/runtime/routes/playground/__tests__/state.test.ts +41 -90
- package/src/runtime/routes/playground/conversation-not-found.ts +9 -11
- package/src/runtime/routes/playground/force-compact.ts +41 -54
- package/src/runtime/routes/playground/guard.ts +18 -19
- package/src/runtime/routes/playground/helpers.ts +103 -0
- package/src/runtime/routes/playground/index.ts +15 -25
- package/src/runtime/routes/playground/inject-failures.ts +48 -64
- package/src/runtime/routes/playground/reset-circuit.ts +31 -57
- package/src/runtime/routes/playground/seed-conversation.ts +66 -92
- package/src/runtime/routes/playground/seeded-conversations.ts +60 -64
- package/src/runtime/routes/playground/state.ts +23 -24
- package/src/runtime/routes/profiler-routes.ts +132 -167
- package/src/runtime/routes/ps-routes.ts +120 -0
- package/src/runtime/routes/recording-routes.ts +197 -258
- package/src/runtime/routes/rename-conversation-routes.ts +89 -0
- package/src/runtime/routes/schedule-routes.ts +238 -242
- package/src/runtime/routes/secret-routes.ts +219 -265
- package/src/runtime/routes/secrets-deps.ts +24 -0
- package/src/runtime/routes/settings-routes.ts +361 -441
- package/src/runtime/routes/skills-routes.ts +434 -469
- package/src/runtime/routes/stt-routes.ts +196 -206
- package/src/runtime/routes/subagents-routes.ts +125 -141
- package/src/runtime/routes/suggest-trust-rule-routes.ts +244 -0
- package/src/runtime/routes/surface-action-routes.ts +135 -190
- package/src/runtime/routes/surface-content-routes.ts +84 -118
- package/src/runtime/routes/task-routes.ts +354 -0
- package/src/runtime/routes/telemetry-routes.ts +33 -49
- package/src/runtime/routes/trace-event-routes.ts +55 -74
- package/src/runtime/routes/trust-rules-routes.ts +147 -239
- package/src/runtime/routes/tts-routes.ts +187 -169
- package/src/runtime/routes/types.ts +139 -0
- package/src/{ipc/routes/ui-request.ts → runtime/routes/ui-request-routes.ts} +23 -17
- package/src/runtime/routes/upgrade-broadcast-routes.ts +156 -197
- package/src/runtime/routes/usage-routes.ts +143 -169
- package/src/runtime/routes/user-routes.ts +102 -18
- package/src/runtime/routes/wake-conversation-routes.ts +49 -0
- package/src/{ipc/routes/watcher.ts → runtime/routes/watcher-routes.ts} +84 -39
- package/src/runtime/routes/wipe-conversation-routes.ts +89 -0
- package/src/runtime/routes/work-items-routes.test.ts +10 -20
- package/src/runtime/routes/work-items-routes.ts +418 -433
- package/src/runtime/routes/workspace-commit-routes.ts +30 -61
- package/src/runtime/routes/workspace-routes.test.ts +254 -381
- package/src/runtime/routes/workspace-routes.ts +238 -246
- package/src/runtime/runtime-mode.ts +8 -1
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +80 -118
- package/src/runtime/services/analyze-conversation.ts +14 -41
- package/src/runtime/services/conversation-serializer.ts +181 -0
- package/src/runtime/trust-context-resolver.ts +3 -2
- package/src/runtime/verification-outbound-actions.ts +13 -49
- package/src/schedule/schedule-store.ts +64 -2
- package/src/schedule/scheduler.ts +101 -0
- package/src/security/ces-credential-client.ts +32 -169
- package/src/security/ces-rpc-credential-backend.ts +1 -1
- package/src/security/credential-backend.ts +6 -6
- package/src/security/oauth-completion-page.ts +1 -1
- package/src/security/oauth2.ts +3 -6
- package/src/sequence/analytics.ts +1 -1
- package/src/sequence/guardrails.ts +3 -3
- package/src/sequence/store.ts +2 -1
- package/src/signals/bash.ts +1 -1
- package/src/signals/event-stream.ts +1 -1
- package/src/skills/catalog-cache.ts +7 -0
- package/src/skills/catalog-files.ts +0 -5
- package/src/skills/catalog-install.ts +28 -18
- package/src/skills/category-inference.ts +0 -11
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/managed-store.ts +2 -2
- package/src/skills/remote-skill-policy.ts +6 -7
- package/src/subagent/index.ts +2 -6
- package/src/subagent/manager.ts +27 -23
- package/src/subagent/types.ts +9 -0
- package/src/tasks/SPEC.md +2 -2
- package/src/tasks/task-compiler.ts +1 -1
- package/src/tasks/task-runner.ts +2 -22
- package/src/tasks/task-store.ts +1 -1
- package/src/tools/acp/list-agents.test.ts +115 -0
- package/src/tools/acp/list-agents.ts +31 -0
- package/src/tools/acp/spawn.test.ts +379 -0
- package/src/tools/acp/spawn.ts +142 -62
- package/src/tools/acp/steer.test.ts +101 -0
- package/src/tools/acp/steer.ts +38 -0
- package/src/tools/background-tool-registry.ts +98 -0
- package/src/tools/browser/browser-execution.ts +34 -7
- package/src/tools/browser/browser-manager.ts +1 -8
- package/src/tools/browser/cdp-client/accessibility-snapshot.ts +1 -1
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +3 -1
- package/src/tools/browser/cdp-client/types.ts +4 -1
- package/src/tools/computer-use/definitions.ts +1 -1
- package/src/tools/credential-execution/make-authenticated-request.ts +2 -2
- package/src/tools/credential-execution/manage-secure-command-tool.ts +1 -1
- package/src/tools/credential-execution/run-authenticated-command.ts +2 -2
- package/src/tools/credentials/broker-types.ts +2 -1
- package/src/tools/document/editor-template.ts +1 -1
- package/src/tools/execution-timeout.ts +1 -1
- package/src/tools/executor.ts +10 -15
- package/src/tools/host-filesystem/transfer.test.ts +268 -0
- package/src/tools/host-filesystem/transfer.ts +234 -0
- package/src/tools/host-terminal/host-shell.ts +189 -11
- package/src/tools/mcp/mcp-tool-factory.ts +1 -1
- package/src/tools/memory/register.test.ts +161 -1
- package/src/tools/memory/register.ts +19 -34
- package/src/tools/permission-checker.ts +18 -219
- package/src/tools/policy-context.ts +1 -8
- package/src/tools/registry.ts +16 -1
- package/src/tools/secret-detection-handler.ts +13 -103
- package/src/tools/shared/shell-output.ts +4 -1
- package/src/tools/side-effects.ts +2 -2
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/subagent/spawn.ts +35 -11
- package/src/tools/terminal/safe-env.ts +9 -1
- package/src/tools/terminal/shell.ts +161 -31
- package/src/tools/tool-approval-handler.ts +4 -70
- package/src/tools/tool-input-summary.ts +10 -0
- package/src/tools/types.ts +143 -163
- package/src/tools/ui-surface/definitions.ts +2 -2
- package/src/util/debounce.ts +0 -21
- package/src/util/errors.ts +0 -8
- package/src/util/log-redact.ts +0 -1
- package/src/util/platform.ts +85 -124
- package/src/util/pricing.ts +109 -6
- package/src/watcher/engine.ts +42 -20
- package/src/watcher/watcher-store.ts +2 -1
- package/src/work-items/work-item-store.ts +1 -1
- package/src/workspace/git-service.ts +1 -6
- package/src/workspace/migrations/006-services-config.ts +10 -1
- package/src/workspace/migrations/017-seed-persona-dirs.ts +1 -1
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +1 -1
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +1 -1
- package/src/workspace/migrations/031-drop-user-md.ts +1 -1
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +3 -4
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +150 -0
- package/src/workspace/migrations/053-release-notes-acp-codex.ts +107 -0
- package/src/workspace/migrations/054-seed-recall-callsite.ts +102 -0
- package/src/workspace/migrations/055-release-notes-agentic-recall.ts +63 -0
- package/src/workspace/migrations/056-release-notes-inference-profile-reordering.ts +65 -0
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +98 -0
- package/src/workspace/migrations/058-release-notes-acp-sessions-ui.ts +71 -0
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +53 -0
- package/src/workspace/migrations/060-memory-v2-init.ts +53 -0
- package/src/workspace/migrations/rebuild-conversation-disk-view.ts +1 -1
- package/src/workspace/migrations/registry.ts +18 -0
- package/src/workspace/migrations/runner.ts +2 -2
- package/src/workspace/provider-commit-message-generator.ts +1 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +0 -471
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +0 -436
- package/src/__tests__/cli-command-risk-guard.test.ts +0 -368
- package/src/__tests__/config-watcher-feature-flags.test.ts +0 -211
- package/src/__tests__/conversation-approval-overrides.test.ts +0 -207
- package/src/__tests__/conversation-host-access-routes.test.ts +0 -229
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +0 -226
- package/src/__tests__/conversation-tool-setup-side-effect-flag.test.ts +0 -167
- package/src/__tests__/ephemeral-permissions.test.ts +0 -474
- package/src/__tests__/extension-id-sync-guard.test.ts +0 -241
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +0 -374
- package/src/__tests__/native-host-marker-sync-guard.test.ts +0 -157
- package/src/__tests__/pairing-concurrent.test.ts +0 -84
- package/src/__tests__/pairing-routes.test.ts +0 -181
- package/src/__tests__/parser.test.ts +0 -595
- package/src/__tests__/permission-checker-host-gate.test.ts +0 -488
- package/src/__tests__/permission-controls-v2-flag.test.ts +0 -55
- package/src/__tests__/permission-mode.test.ts +0 -89
- package/src/__tests__/provider-env-vars-scope.test.ts +0 -52
- package/src/__tests__/risk-classifier-parity.test.ts +0 -230
- package/src/__tests__/shell-identity.test.ts +0 -236
- package/src/__tests__/shell-parser-fuzz.test.ts +0 -629
- package/src/__tests__/shell-parser-property.test.ts +0 -936
- package/src/__tests__/starter-bundle.test.ts +0 -173
- package/src/__tests__/stt-catalog-parity.test.ts +0 -282
- package/src/__tests__/task-runner.test.ts +0 -224
- package/src/__tests__/tool-executor-shell-integration.test.ts +0 -354
- package/src/__tests__/trust-store-pattern-matches.test.ts +0 -29
- package/src/__tests__/trust-store.test.ts +0 -2013
- package/src/__tests__/v2-consent-policy.test.ts +0 -103
- package/src/browser/identifiers.ts +0 -51
- package/src/cli/db.ts +0 -1
- package/src/config/bundled-skills/settings/tools/avatar-get.ts +0 -40
- package/src/config/bundled-skills/settings/tools/avatar-remove.ts +0 -64
- package/src/config/bundled-skills/settings/tools/avatar-update.ts +0 -88
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +0 -127
- package/src/daemon/approved-devices-store.ts +0 -110
- package/src/daemon/external-skills-bootstrap.ts +0 -41
- package/src/daemon/message-types/trust.ts +0 -71
- package/src/daemon/pairing-store.ts +0 -229
- package/src/ipc/cli-server.ts +0 -252
- package/src/ipc/routes/attachment.ts +0 -114
- package/src/ipc/routes/browser-context.ts +0 -63
- package/src/ipc/routes/browser.ts +0 -97
- package/src/ipc/routes/cache.ts +0 -96
- package/src/ipc/routes/get-contact.ts +0 -16
- package/src/ipc/routes/index.ts +0 -35
- package/src/ipc/routes/list-clients.ts +0 -31
- package/src/ipc/routes/merge-contacts.ts +0 -17
- package/src/ipc/routes/notification.ts +0 -133
- package/src/ipc/routes/rename-conversation.ts +0 -59
- package/src/ipc/routes/search-contacts.ts +0 -19
- package/src/ipc/routes/task-queue.ts +0 -226
- package/src/ipc/routes/task.ts +0 -173
- package/src/ipc/routes/upsert-contact.ts +0 -25
- package/src/ipc/routes/wake-conversation.ts +0 -19
- package/src/memory/db.ts +0 -23
- package/src/permissions/arg-parser.test.ts +0 -161
- package/src/permissions/arg-parser.ts +0 -141
- package/src/permissions/bash-risk-classifier.test.ts +0 -1620
- package/src/permissions/bash-risk-classifier.ts +0 -950
- package/src/permissions/command-registry.test.ts +0 -774
- package/src/permissions/command-registry.ts +0 -1005
- package/src/permissions/defaults.ts +0 -314
- package/src/permissions/file-risk-classifier.test.ts +0 -535
- package/src/permissions/file-risk-classifier.ts +0 -274
- package/src/permissions/permission-mode.ts +0 -24
- package/src/permissions/schedule-risk-classifier.test.ts +0 -129
- package/src/permissions/schedule-risk-classifier.ts +0 -85
- package/src/permissions/shell-identity.ts +0 -297
- package/src/permissions/skill-risk-classifier.test.ts +0 -311
- package/src/permissions/skill-risk-classifier.ts +0 -214
- package/src/permissions/trust-client.ts +0 -359
- package/src/permissions/trust-store-interface.ts +0 -100
- package/src/permissions/trust-store.ts +0 -1330
- package/src/permissions/v2-consent-policy.ts +0 -87
- package/src/permissions/web-risk-classifier.test.ts +0 -170
- package/src/permissions/web-risk-classifier.ts +0 -89
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +0 -715
- package/src/runtime/__tests__/capability-tokens.test.ts +0 -258
- package/src/runtime/actor-refresh-token-store.ts +0 -156
- package/src/runtime/actor-token-store.ts +0 -207
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -264
- package/src/runtime/auth/credential-service.ts +0 -352
- package/src/runtime/conversation-approval-overrides.ts +0 -86
- package/src/runtime/routes/browser-extension-pair-routes.ts +0 -575
- package/src/runtime/routes/channel-routes.ts +0 -112
- package/src/runtime/routes/contact-routes.test.ts +0 -298
- package/src/runtime/routes/guardian-bootstrap-routes.ts +0 -175
- package/src/runtime/routes/guardian-refresh-routes.ts +0 -79
- package/src/runtime/routes/invite-routes.ts +0 -280
- package/src/runtime/routes/pairing-routes.ts +0 -431
- package/src/runtime/routes/playground/deps.ts +0 -56
- package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +0 -67
- package/src/runtime/services/analyze-deps-singleton.ts +0 -32
- package/src/tasks/ephemeral-permissions.ts +0 -55
- package/src/tools/terminal/parser.ts +0 -623
- package/src/types/qrcode.d.ts +0 -13
- package/src/util/network-info.ts +0 -55
- /package/node_modules/@vellumai/{ces-contracts → ces-client}/tsconfig.json +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/__tests__/grants.test.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/error.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/grants.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/handles.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/rendering.ts +0 -0
- /package/node_modules/@vellumai/{ces-contracts → service-contracts}/src/rpc.ts +0 -0
|
@@ -52,7 +52,7 @@ import { defaultToolResultTruncatePlugin } from "./tool-result-truncate.js";
|
|
|
52
52
|
* contents are read at call time, after every imported plugin identifier is
|
|
53
53
|
* guaranteed initialized.
|
|
54
54
|
*/
|
|
55
|
-
|
|
55
|
+
function getAllDefaultPlugins(): readonly Plugin[] {
|
|
56
56
|
return [
|
|
57
57
|
defaultLlmCallPlugin,
|
|
58
58
|
defaultToolExecutePlugin,
|
|
@@ -71,7 +71,7 @@ const PKB_HINT_THRESHOLD = 0.5;
|
|
|
71
71
|
const PKB_HINT_ARCHIVE_THRESHOLD = 0.7;
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
|
-
* Fixed order values for the
|
|
74
|
+
* Fixed order values for the eight default injectors. Exported so tests —
|
|
75
75
|
* and any future integration code — can assert ordering without re-deriving
|
|
76
76
|
* the constants.
|
|
77
77
|
*
|
|
@@ -105,7 +105,7 @@ function readInjectionInputs(ctx: TurnContext): TurnInjectionInputs {
|
|
|
105
105
|
* - `mode === "full"` (skipped in minimal mode).
|
|
106
106
|
* - `workspaceTopLevelContext` is a non-null, non-empty string.
|
|
107
107
|
*/
|
|
108
|
-
|
|
108
|
+
const workspaceContextInjector: Injector = {
|
|
109
109
|
name: "workspace-context",
|
|
110
110
|
order: DEFAULT_INJECTOR_ORDER.workspaceContext,
|
|
111
111
|
async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
|
|
@@ -133,7 +133,7 @@ export const workspaceContextInjector: Injector = {
|
|
|
133
133
|
* Active in both `full` and `minimal` mode — unified turn context is
|
|
134
134
|
* safety-critical grounding that must survive injection downgrade.
|
|
135
135
|
*/
|
|
136
|
-
|
|
136
|
+
const unifiedTurnContextInjector: Injector = {
|
|
137
137
|
name: "unified-turn-context",
|
|
138
138
|
order: DEFAULT_INJECTOR_ORDER.unifiedTurnContext,
|
|
139
139
|
async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
|
|
@@ -157,16 +157,16 @@ export const unifiedTurnContextInjector: Injector = {
|
|
|
157
157
|
* yielding `[...memory, <system_reminder>, <knowledge_base>, ...user text]`.
|
|
158
158
|
*
|
|
159
159
|
* Emitting context and reminder as two separate blocks (rather than a single
|
|
160
|
-
* concatenated text)
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
160
|
+
* concatenated text) produces the two-ContentBlock shape that the rehydration
|
|
161
|
+
* path in `conversation-lifecycle.ts` recreates — keeping fresh-injection and
|
|
162
|
+
* rehydrated-history structurally identical so Anthropic's prefix cache
|
|
163
|
+
* matches across reloads.
|
|
164
164
|
*
|
|
165
165
|
* Gating:
|
|
166
166
|
* - `mode === "full"`.
|
|
167
167
|
* - Non-null, non-empty `pkbContext`.
|
|
168
168
|
*/
|
|
169
|
-
|
|
169
|
+
const pkbContextInjector: Injector = {
|
|
170
170
|
name: "pkb-context",
|
|
171
171
|
order: DEFAULT_INJECTOR_ORDER.pkbContext,
|
|
172
172
|
async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
|
|
@@ -189,13 +189,13 @@ export const pkbContextInjector: Injector = {
|
|
|
189
189
|
* hints) as its own after-memory-prefix splice. Higher `order` than
|
|
190
190
|
* `pkb-context` so the reminder splices second and ends up immediately
|
|
191
191
|
* after the memory prefix, pushing `<knowledge_base>` one slot further
|
|
192
|
-
* down —
|
|
192
|
+
* down — producing a [reminder, context] ordering.
|
|
193
193
|
*
|
|
194
194
|
* Gating:
|
|
195
195
|
* - `mode === "full"`.
|
|
196
196
|
* - `pkbActive === true`.
|
|
197
197
|
*/
|
|
198
|
-
|
|
198
|
+
const pkbReminderInjector: Injector = {
|
|
199
199
|
name: "pkb-reminder",
|
|
200
200
|
order: DEFAULT_INJECTOR_ORDER.pkbReminder,
|
|
201
201
|
async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
|
|
@@ -215,9 +215,7 @@ export const pkbReminderInjector: Injector = {
|
|
|
215
215
|
/**
|
|
216
216
|
* Render the PKB context block — wraps the raw content in
|
|
217
217
|
* `<knowledge_base>...</knowledge_base>` while escaping any closing tags
|
|
218
|
-
* inside the content that would break out of the XML wrapper.
|
|
219
|
-
* body of the pre-migration `injectPkbContext` helper exactly so the emitted
|
|
220
|
-
* bytes match.
|
|
218
|
+
* inside the content that would break out of the XML wrapper.
|
|
221
219
|
*/
|
|
222
220
|
function buildPkbContextBlock(content: string): string {
|
|
223
221
|
const escaped = content.replace(
|
|
@@ -309,7 +307,7 @@ async function buildPkbReminderWithHints(
|
|
|
309
307
|
* - `mode === "full"` (skipped in minimal mode).
|
|
310
308
|
* - `nowScratchpad` is a non-null, non-empty string.
|
|
311
309
|
*/
|
|
312
|
-
|
|
310
|
+
const nowMdInjector: Injector = {
|
|
313
311
|
name: "now-md",
|
|
314
312
|
order: DEFAULT_INJECTOR_ORDER.nowMd,
|
|
315
313
|
async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
|
|
@@ -341,7 +339,7 @@ export const nowMdInjector: Injector = {
|
|
|
341
339
|
* - `mode === "full"`.
|
|
342
340
|
* - `subagentStatusBlock` is a non-null, non-empty string.
|
|
343
341
|
*/
|
|
344
|
-
|
|
342
|
+
const subagentStatusInjector: Injector = {
|
|
345
343
|
name: "subagent-status",
|
|
346
344
|
order: DEFAULT_INJECTOR_ORDER.subagentStatus,
|
|
347
345
|
async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
|
|
@@ -367,10 +365,9 @@ export const subagentStatusInjector: Injector = {
|
|
|
367
365
|
* orchestrator builds the transcript via `loadSlackChronologicalMessages`
|
|
368
366
|
* before the chain runs.
|
|
369
367
|
*
|
|
370
|
-
*
|
|
371
|
-
*
|
|
372
|
-
*
|
|
373
|
-
* replacement fires.
|
|
368
|
+
* Memory-block prepending is preserved across the replacement:
|
|
369
|
+
* `extractMemoryPrefixBlocks` is re-applied to the Slack transcript's tail
|
|
370
|
+
* user message inside `applyRuntimeInjections` when the replacement fires.
|
|
374
371
|
*
|
|
375
372
|
* Active in both `full` and `minimal` mode — Slack transcript replacement
|
|
376
373
|
* is not a high-token optional block, it's the canonical view of Slack
|
|
@@ -380,7 +377,7 @@ export const subagentStatusInjector: Injector = {
|
|
|
380
377
|
* - `channelCapabilities.channel === "slack"`.
|
|
381
378
|
* - `slackChronologicalMessages` has at least one entry.
|
|
382
379
|
*/
|
|
383
|
-
|
|
380
|
+
const slackMessagesInjector: Injector = {
|
|
384
381
|
name: "slack-messages",
|
|
385
382
|
order: DEFAULT_INJECTOR_ORDER.slackMessages,
|
|
386
383
|
async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
|
|
@@ -419,7 +416,7 @@ export const slackMessagesInjector: Injector = {
|
|
|
419
416
|
* (non-DM Slack conversation).
|
|
420
417
|
* - `slackActiveThreadFocusBlock` is a non-empty string.
|
|
421
418
|
*/
|
|
422
|
-
|
|
419
|
+
const threadFocusInjector: Injector = {
|
|
423
420
|
name: "thread-focus",
|
|
424
421
|
order: DEFAULT_INJECTOR_ORDER.threadFocus,
|
|
425
422
|
async produce(ctx: TurnContext): Promise<InjectionBlock | null> {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Default `llmCall` plugin — a
|
|
3
|
-
* surface and
|
|
2
|
+
* Default `llmCall` plugin — a passthrough that declares the pipeline
|
|
3
|
+
* surface and yields to downstream middleware.
|
|
4
4
|
*
|
|
5
5
|
* The plugin system wraps every LLM request in the `llmCall` pipeline. The
|
|
6
6
|
* actual call to {@link Provider.sendMessage} lives in the `runPipeline`
|
|
@@ -8,13 +8,10 @@
|
|
|
8
8
|
* contribute the manifest (`provides.llmCall: "v1"`) so other plugins can
|
|
9
9
|
* negotiate against the pipeline surface.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* `composeMiddleware`'s onion ordering.
|
|
14
|
-
*
|
|
15
|
-
* short-circuit the chain and silently disable every user-registered
|
|
16
|
-
* `llmCall` middleware in production. The middleware therefore just forwards
|
|
17
|
-
* to `next(args)`.
|
|
11
|
+
* This plugin registers at module load — before user plugins are loaded by
|
|
12
|
+
* `bootstrapPlugins()` — so it sits at the outermost layer in
|
|
13
|
+
* `composeMiddleware`'s onion ordering. To keep user-registered middleware
|
|
14
|
+
* reachable, the middleware forwards unconditionally via `next(args)`.
|
|
18
15
|
*
|
|
19
16
|
* Registered from `daemon/external-plugins-bootstrap.ts` via a side-effect
|
|
20
17
|
* import so the plugin is present in the registry before
|
|
@@ -121,15 +121,10 @@ export async function runDefaultMemoryRetrieval(
|
|
|
121
121
|
};
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
// `prepareMemory` requires a non-optional signal. In production the agent
|
|
125
|
-
// loop always threads one via `args.signal`; the fallback `AbortController`
|
|
126
|
-
// keeps direct callers (e.g. tests that skip the pipeline) working without
|
|
127
|
-
// forcing every call site to synthesize a dummy signal.
|
|
128
|
-
const abortSignal = args.signal ?? new AbortController().signal;
|
|
129
124
|
const graphResult = await deps.graphMemory.prepareMemory(
|
|
130
125
|
deps.messages,
|
|
131
126
|
deps.config,
|
|
132
|
-
|
|
127
|
+
args.signal,
|
|
133
128
|
deps.onEvent,
|
|
134
129
|
);
|
|
135
130
|
|
|
@@ -12,11 +12,15 @@
|
|
|
12
12
|
* callbacks carried on {@link OverflowReduceArgs}; the plugin itself has no
|
|
13
13
|
* access to the agent-loop context object.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
15
|
+
* The forced-compaction tier runs through the orchestrator-supplied
|
|
16
|
+
* `compactFn`, which routes into the `compaction` plugin pipeline so
|
|
17
|
+
* registered compaction middleware observes reducer-initiated invocations
|
|
18
|
+
* alongside the orchestrator-owned call sites. Non-compaction tiers
|
|
19
|
+
* (tool-result truncation, media stubbing, injection downgrade) remain
|
|
20
|
+
* in-process: they mutate message arrays directly without crossing a
|
|
21
|
+
* pipeline boundary. The reducer itself runs under the `overflowReduce`
|
|
22
|
+
* pipeline, so the full layering is `overflowReduce` → reducer tier loop
|
|
23
|
+
* → (for the forced-compaction tier only) nested `compaction` pipeline.
|
|
20
24
|
*/
|
|
21
25
|
|
|
22
26
|
import type { ContextWindowCompactOptions } from "../../context/window-manager.js";
|
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
* {@link import("../../context/token-estimator.js").estimatePromptTokens estimatePromptTokens},
|
|
18
18
|
* which applies the EWMA calibration correction recorded from past provider
|
|
19
19
|
* responses. Preflight + mid-loop checks must use the calibrated estimate —
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* consistent with the convergence path in the reducer. The pre-send
|
|
20
|
+
* the calibrated value keeps the overflow gate consistent with the
|
|
21
|
+
* convergence path in the reducer. The pre-send
|
|
23
22
|
* calibration capture in `agent/loop.ts` still uses `estimatePromptTokensRaw`
|
|
24
23
|
* on purpose — the calibrator must learn against the raw estimate so the EWMA
|
|
25
24
|
* converges against provider ground truth rather than chasing its own
|
package/src/plugins/registry.ts
CHANGED
|
@@ -78,6 +78,19 @@ export const ASSISTANT_API_VERSIONS: Record<string, string[]> = {
|
|
|
78
78
|
*/
|
|
79
79
|
const registeredPlugins = new Map<string, Plugin>();
|
|
80
80
|
|
|
81
|
+
/**
|
|
82
|
+
* Latch that closes the per-boot registration window. Flipped to `true` by
|
|
83
|
+
* {@link closeRegistration} once `loadUserPlugins()` has returned. After that,
|
|
84
|
+
* any attempt to register a *new* plugin throws — this is the safety net
|
|
85
|
+
* against a user plugin whose dynamic `import()` was timed out but whose
|
|
86
|
+
* top-level `await` later resolves and still tries to call
|
|
87
|
+
* {@link registerPlugin}. Without the latch such a late arrival would land in
|
|
88
|
+
* the registry after `bootstrapPlugins()` has already walked it, leaving the
|
|
89
|
+
* plugin visible to `getMiddlewaresFor()` / `getInjectors()` with its
|
|
90
|
+
* `init()` hook never invoked.
|
|
91
|
+
*/
|
|
92
|
+
let registrationClosed = false;
|
|
93
|
+
|
|
81
94
|
// ─── Registration ────────────────────────────────────────────────────────────
|
|
82
95
|
|
|
83
96
|
/**
|
|
@@ -139,7 +152,10 @@ export function registerPlugin(plugin: Plugin): void {
|
|
|
139
152
|
}
|
|
140
153
|
|
|
141
154
|
// Duplicate-name check — plugins must be uniquely addressable in logs,
|
|
142
|
-
// storage paths, and error messages.
|
|
155
|
+
// storage paths, and error messages. Runs BEFORE the closed-registration
|
|
156
|
+
// check so `registerDefaultPlugins()` (which replays every default even
|
|
157
|
+
// after the registration window closes) keeps seeing the familiar
|
|
158
|
+
// "already registered" error it catches and swallows.
|
|
143
159
|
if (registeredPlugins.has(name)) {
|
|
144
160
|
throw new PluginExecutionError(
|
|
145
161
|
`plugin ${name} is already registered`,
|
|
@@ -147,6 +163,17 @@ export function registerPlugin(plugin: Plugin): void {
|
|
|
147
163
|
);
|
|
148
164
|
}
|
|
149
165
|
|
|
166
|
+
// Closed-registration check — rejects a genuinely new plugin that arrives
|
|
167
|
+
// after {@link closeRegistration}. The canonical offender is a user plugin
|
|
168
|
+
// whose dynamic `import()` was timed out in `loadUserPlugins()` but whose
|
|
169
|
+
// module evaluation eventually completes and still calls this function.
|
|
170
|
+
if (registrationClosed) {
|
|
171
|
+
throw new PluginExecutionError(
|
|
172
|
+
`plugin ${name} cannot register: plugin registration is closed (late arrival after loadUserPlugins() returned)`,
|
|
173
|
+
name,
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
150
177
|
// Capability negotiation. Every plugin must negotiate against
|
|
151
178
|
// `pluginRuntime`; we enforce that by requiring an entry to exist rather
|
|
152
179
|
// than special-casing it here, so the per-entry mismatch error is uniform.
|
|
@@ -219,6 +246,35 @@ export function getInjectors(): Injector[] {
|
|
|
219
246
|
return out;
|
|
220
247
|
}
|
|
221
248
|
|
|
249
|
+
/**
|
|
250
|
+
* Close the per-boot registration window. After this call, any attempt to
|
|
251
|
+
* register a genuinely new plugin throws a {@link PluginExecutionError}.
|
|
252
|
+
* Re-registering an already-registered plugin still hits the duplicate-name
|
|
253
|
+
* check first (so idempotent callers like `registerDefaultPlugins()` keep
|
|
254
|
+
* working unchanged).
|
|
255
|
+
*
|
|
256
|
+
* Called by `loadUserPlugins()` immediately before it returns so the
|
|
257
|
+
* `bootstrapPlugins()` invariant ("registry has been fully populated for this
|
|
258
|
+
* boot cycle") cannot be violated by a user plugin whose dynamic `import()`
|
|
259
|
+
* timed out mid-load but whose top-level `await` resolves later and still
|
|
260
|
+
* reaches `registerPlugin()`. Idempotent.
|
|
261
|
+
*/
|
|
262
|
+
export function closeRegistration(): void {
|
|
263
|
+
registrationClosed = true;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Remove a plugin from the registry. Invoked from the bootstrap's failure path
|
|
268
|
+
* after {@link Plugin.onShutdown} and contribution teardown have run, so
|
|
269
|
+
* {@link getMiddlewaresFor} and {@link getInjectors} no longer expose a
|
|
270
|
+
* plugin whose `init()` aborted mid-bootstrap. Without this, every subsequent
|
|
271
|
+
* pipeline invocation would re-enter the uninitialized plugin's middleware.
|
|
272
|
+
* Safe to call on an already-absent name (no-op).
|
|
273
|
+
*/
|
|
274
|
+
export function unregisterPlugin(name: string): void {
|
|
275
|
+
registeredPlugins.delete(name);
|
|
276
|
+
}
|
|
277
|
+
|
|
222
278
|
// ─── Test hooks ──────────────────────────────────────────────────────────────
|
|
223
279
|
|
|
224
280
|
/**
|
|
@@ -238,4 +294,8 @@ export function resetPluginRegistryForTests(): void {
|
|
|
238
294
|
);
|
|
239
295
|
}
|
|
240
296
|
registeredPlugins.clear();
|
|
297
|
+
// Re-open the registration window so subsequent tests can register plugins
|
|
298
|
+
// again. Without this, the latch set by a prior `closeRegistration()` call
|
|
299
|
+
// would leak across test cases and reject legitimate registrations.
|
|
300
|
+
registrationClosed = false;
|
|
241
301
|
}
|
package/src/plugins/types.ts
CHANGED
|
@@ -27,11 +27,11 @@ import type {
|
|
|
27
27
|
ChannelCapabilities,
|
|
28
28
|
ChannelCommandContext,
|
|
29
29
|
InjectionMode,
|
|
30
|
-
TrustContext,
|
|
31
30
|
} from "../daemon/conversation-runtime-assembly.js";
|
|
32
31
|
import type { RepairResult } from "../daemon/history-repair.js";
|
|
33
32
|
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
34
33
|
import type { PkbContextConversation } from "../daemon/pkb-context-tracker.js";
|
|
34
|
+
import type { TrustContext } from "../daemon/trust-context.js";
|
|
35
35
|
import type { QdrantSparseVector } from "../memory/qdrant-client.js";
|
|
36
36
|
import type {
|
|
37
37
|
ContentBlock,
|
|
@@ -110,7 +110,7 @@ export interface PluginInitContext {
|
|
|
110
110
|
* to avoid pulling pino into the types module.
|
|
111
111
|
*/
|
|
112
112
|
logger: unknown;
|
|
113
|
-
/** Absolute path to
|
|
113
|
+
/** Absolute path to `<workspaceDir>/plugins-data/<plugin>/` (created by bootstrap). */
|
|
114
114
|
pluginStorageDir: string;
|
|
115
115
|
/** Assistant semver for compatibility checks inside the plugin. */
|
|
116
116
|
assistantVersion: string;
|
|
@@ -236,7 +236,7 @@ export interface MemoryArgs {
|
|
|
236
236
|
readonly conversationId: string;
|
|
237
237
|
readonly trustContext: TrustContext | undefined;
|
|
238
238
|
readonly turnIndex: number;
|
|
239
|
-
readonly signal
|
|
239
|
+
readonly signal: AbortSignal;
|
|
240
240
|
}
|
|
241
241
|
|
|
242
242
|
/**
|
|
@@ -411,7 +411,7 @@ export interface OverflowReduceArgs {
|
|
|
411
411
|
* mutable shared state. Returns the new `runMessages`.
|
|
412
412
|
*
|
|
413
413
|
* Two distinct "did compact" signals are passed so the orchestrator can
|
|
414
|
-
*
|
|
414
|
+
* apply the correct per-iteration vs sticky gating:
|
|
415
415
|
* - `stepCompacted` — whether THIS iteration's reducer step produced a
|
|
416
416
|
* fresh compaction. Gates PKB / NOW re-injection: compaction strips the
|
|
417
417
|
* existing blocks, so only iterations that just compacted need the
|
|
@@ -921,9 +921,8 @@ export interface TurnContext {
|
|
|
921
921
|
* user's typed text (e.g. subagent status, slack active-thread focus).
|
|
922
922
|
* - `"after-memory-prefix"` — insert the block immediately after any leading
|
|
923
923
|
* memory-prefix blocks (`<memory_context>`, `<memory __injected>`) on the
|
|
924
|
-
* tail user message.
|
|
925
|
-
*
|
|
926
|
-
* pre-migration output byte-for-byte.
|
|
924
|
+
* tail user message. Keeps memory/PKB/NOW in their canonical relative
|
|
925
|
+
* order regardless of how many after-memory-prefix blocks are spliced.
|
|
927
926
|
* - `"replace-run-messages"` — replace the full `runMessages` array with the
|
|
928
927
|
* block's `messagesOverride`. Used by the Slack chronological-transcript
|
|
929
928
|
* injector (the transcript is a whole new message list rendered from the
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* User plugin loader — discovers plugins under
|
|
2
|
+
* User plugin loader — discovers plugins under `<workspaceDir>/plugins/*` and
|
|
3
3
|
* invokes each plugin's registration side effect via a dynamic import.
|
|
4
4
|
*
|
|
5
|
-
* A user plugin is a directory under `
|
|
5
|
+
* A user plugin is a directory under `getWorkspaceDir()/plugins/` that contains a
|
|
6
6
|
* `register.ts` (or `register.js` after compilation). The file is expected to
|
|
7
7
|
* call {@link registerPlugin} at import time so the plugin ends up in the
|
|
8
8
|
* registry before {@link bootstrapPlugins} runs during daemon startup.
|
|
9
9
|
*
|
|
10
10
|
* The loader deliberately:
|
|
11
11
|
*
|
|
12
|
-
* - Uses
|
|
13
|
-
*
|
|
14
|
-
* loads its own plugin set from its own `.vellum` directory.
|
|
12
|
+
* - Uses `getWorkspaceDir()` so each instance loads its own plugin set
|
|
13
|
+
* when `VELLUM_WORKSPACE_DIR` is set.
|
|
15
14
|
* - Prefers `register.js` over `register.ts` when both exist (compiled plugins
|
|
16
15
|
* always win; this matches how `bun`/Node consumers resolve modules at
|
|
17
16
|
* runtime in the compiled binary).
|
|
@@ -39,7 +38,8 @@ import { join } from "node:path";
|
|
|
39
38
|
import { pathToFileURL } from "node:url";
|
|
40
39
|
|
|
41
40
|
import { getLogger } from "../util/logger.js";
|
|
42
|
-
import {
|
|
41
|
+
import { getWorkspaceDir } from "../util/platform.js";
|
|
42
|
+
import { closeRegistration } from "./registry.js";
|
|
43
43
|
|
|
44
44
|
const log = getLogger("user-plugin-loader");
|
|
45
45
|
|
|
@@ -55,13 +55,13 @@ const log = getLogger("user-plugin-loader");
|
|
|
55
55
|
const USER_PLUGIN_IMPORT_TIMEOUT_MS = 10_000;
|
|
56
56
|
|
|
57
57
|
/**
|
|
58
|
-
* Scan `
|
|
58
|
+
* Scan `getWorkspaceDir()/plugins/` for subdirectories containing a
|
|
59
59
|
* `register.{ts,js}` file, and dynamic-import each one so the module's
|
|
60
60
|
* side-effecting {@link registerPlugin} calls populate the registry.
|
|
61
61
|
*
|
|
62
62
|
* Invariants:
|
|
63
63
|
*
|
|
64
|
-
* - No-ops when `
|
|
64
|
+
* - No-ops when `getWorkspaceDir()/plugins/` does not exist — a clean install with
|
|
65
65
|
* zero user plugins must not generate errors.
|
|
66
66
|
* - Per-plugin isolation: a failing import is logged and skipped. The
|
|
67
67
|
* function resolves normally even when every plugin fails to load.
|
|
@@ -77,12 +77,16 @@ export async function loadUserPlugins(
|
|
|
77
77
|
): Promise<void> {
|
|
78
78
|
const importTimeoutMs =
|
|
79
79
|
options.importTimeoutMs ?? USER_PLUGIN_IMPORT_TIMEOUT_MS;
|
|
80
|
-
const pluginsDir = join(
|
|
80
|
+
const pluginsDir = join(getWorkspaceDir(), "plugins");
|
|
81
81
|
if (!existsSync(pluginsDir)) {
|
|
82
82
|
log.debug(
|
|
83
83
|
{ pluginsDir },
|
|
84
84
|
"loadUserPlugins: no plugins directory — skipping",
|
|
85
85
|
);
|
|
86
|
+
// Close the registration window even on the fast path so a late arrival
|
|
87
|
+
// from an unrelated source (e.g. a mis-ordered static import) still can't
|
|
88
|
+
// slip in after bootstrap walks the registry.
|
|
89
|
+
closeRegistration();
|
|
86
90
|
return;
|
|
87
91
|
}
|
|
88
92
|
|
|
@@ -97,6 +101,7 @@ export async function loadUserPlugins(
|
|
|
97
101
|
{ err, pluginsDir },
|
|
98
102
|
"loadUserPlugins: failed to read plugins directory",
|
|
99
103
|
);
|
|
104
|
+
closeRegistration();
|
|
100
105
|
return;
|
|
101
106
|
}
|
|
102
107
|
|
|
@@ -149,8 +154,21 @@ export async function loadUserPlugins(
|
|
|
149
154
|
importTimeoutMs,
|
|
150
155
|
);
|
|
151
156
|
});
|
|
152
|
-
|
|
157
|
+
// Retain the import promise so we can attach a terminal `.catch` on the
|
|
158
|
+
// timeout branch. `Promise.race` does not cancel the losing promise —
|
|
159
|
+
// the module evaluation keeps running in the background even after we
|
|
160
|
+
// stop awaiting it, and if it eventually throws (either from the
|
|
161
|
+
// module body or from the late `registerPlugin()` hitting a closed
|
|
162
|
+
// registry) an unhandled rejection would crash the daemon.
|
|
163
|
+
const importPromise = import(moduleUrl);
|
|
164
|
+
const result = await Promise.race([importPromise, timeoutPromise]);
|
|
153
165
|
if (result === timeoutSentinel) {
|
|
166
|
+
importPromise.catch(() => {
|
|
167
|
+
// Abandoned import completed (or threw) after the timeout. The
|
|
168
|
+
// closed-registration latch in registry.ts guarantees any late
|
|
169
|
+
// `registerPlugin()` call is rejected, so swallowing the outcome
|
|
170
|
+
// here is the safe default.
|
|
171
|
+
});
|
|
154
172
|
log.warn(
|
|
155
173
|
{ pluginDir, registerPath, timeoutMs: importTimeoutMs },
|
|
156
174
|
`Timed out loading user plugin ${pluginDir} after ${importTimeoutMs}ms — skipping`,
|
|
@@ -174,4 +192,12 @@ export async function loadUserPlugins(
|
|
|
174
192
|
if (timeoutHandle !== undefined) clearTimeout(timeoutHandle);
|
|
175
193
|
}
|
|
176
194
|
}
|
|
195
|
+
|
|
196
|
+
// Close the registration window once every candidate plugin has been
|
|
197
|
+
// awaited (or timed out). The per-plugin try/catch guarantees no throw
|
|
198
|
+
// escapes the loop, so this line always runs. Any abandoned import that
|
|
199
|
+
// later resolves and reaches `registerPlugin()` is rejected by the latch,
|
|
200
|
+
// preserving the `bootstrapPlugins()` invariant that the registry is
|
|
201
|
+
// fully populated before it is walked.
|
|
202
|
+
closeRegistration();
|
|
177
203
|
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the memory-v2 autoload block in buildSystemPrompt.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that when the `memory-v2-enabled` feature flag is on, the four
|
|
5
|
+
* top-level memory files (essentials/threads/recent/buffer) are appended to
|
|
6
|
+
* the dynamic suffix in order, each wrapped in a Markdown header. With the
|
|
7
|
+
* flag off, none of these files leak into the prompt — even if present.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
13
|
+
|
|
14
|
+
const TEST_DIR = process.env.VELLUM_WORKSPACE_DIR!;
|
|
15
|
+
|
|
16
|
+
const noopLogger: Record<string, unknown> = new Proxy(
|
|
17
|
+
{} as Record<string, unknown>,
|
|
18
|
+
{
|
|
19
|
+
get: (_target, prop) => (prop === "child" ? () => noopLogger : () => {}),
|
|
20
|
+
},
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
24
|
+
const realLogger = require("../../util/logger.js");
|
|
25
|
+
mock.module("../../util/logger.js", () => ({
|
|
26
|
+
...realLogger,
|
|
27
|
+
getLogger: () => noopLogger,
|
|
28
|
+
getCliLogger: () => noopLogger,
|
|
29
|
+
truncateForLog: (v: string) => v,
|
|
30
|
+
initLogger: () => {},
|
|
31
|
+
pruneOldLogFiles: () => 0,
|
|
32
|
+
}));
|
|
33
|
+
|
|
34
|
+
const mockLoadedConfig: Record<string, unknown> = {};
|
|
35
|
+
|
|
36
|
+
mock.module("../../config/loader.js", () => ({
|
|
37
|
+
getConfig: () => ({
|
|
38
|
+
ui: {},
|
|
39
|
+
services: {
|
|
40
|
+
inference: {
|
|
41
|
+
mode: "your-own",
|
|
42
|
+
provider: "anthropic",
|
|
43
|
+
model: "claude-opus-4-6",
|
|
44
|
+
},
|
|
45
|
+
"image-generation": {
|
|
46
|
+
mode: "your-own",
|
|
47
|
+
provider: "gemini",
|
|
48
|
+
model: "gemini-3.1-flash-image-preview",
|
|
49
|
+
},
|
|
50
|
+
"web-search": { mode: "your-own", provider: "inference-provider-native" },
|
|
51
|
+
},
|
|
52
|
+
}),
|
|
53
|
+
loadConfig: () => mockLoadedConfig,
|
|
54
|
+
loadRawConfig: () => ({}),
|
|
55
|
+
saveConfig: () => {},
|
|
56
|
+
saveRawConfig: () => {},
|
|
57
|
+
invalidateConfigCache: () => {},
|
|
58
|
+
getNestedValue: () => undefined,
|
|
59
|
+
setNestedValue: () => {},
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
const { _setOverridesForTesting } =
|
|
63
|
+
await import("../../config/assistant-feature-flags.js");
|
|
64
|
+
const { buildSystemPrompt, SYSTEM_PROMPT_CACHE_BOUNDARY } =
|
|
65
|
+
await import("../system-prompt.js");
|
|
66
|
+
|
|
67
|
+
const MEMORY_FILES = [
|
|
68
|
+
"essentials.md",
|
|
69
|
+
"threads.md",
|
|
70
|
+
"recent.md",
|
|
71
|
+
"buffer.md",
|
|
72
|
+
] as const;
|
|
73
|
+
|
|
74
|
+
const ALL_HEADINGS = ["## Essentials", "## Threads", "## Recent", "## Buffer"];
|
|
75
|
+
|
|
76
|
+
function writeMemoryFile(name: string, body: string): void {
|
|
77
|
+
const memoryDir = join(TEST_DIR, "memory");
|
|
78
|
+
mkdirSync(memoryDir, { recursive: true });
|
|
79
|
+
writeFileSync(join(memoryDir, name), body);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function cleanupMemoryDir(): void {
|
|
83
|
+
const memoryDir = join(TEST_DIR, "memory");
|
|
84
|
+
if (existsSync(memoryDir))
|
|
85
|
+
rmSync(memoryDir, { recursive: true, force: true });
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function expectNoHeadings(result: string): void {
|
|
89
|
+
for (const heading of ALL_HEADINGS) {
|
|
90
|
+
expect(result).not.toContain(heading);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
describe("buildSystemPrompt — memory v2 autoload", () => {
|
|
95
|
+
beforeEach(() => {
|
|
96
|
+
mkdirSync(TEST_DIR, { recursive: true });
|
|
97
|
+
_setOverridesForTesting({});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
afterEach(() => {
|
|
101
|
+
cleanupMemoryDir();
|
|
102
|
+
_setOverridesForTesting({});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("flag off: no memory headings appear even when files are populated", () => {
|
|
106
|
+
_setOverridesForTesting({ "memory-v2-enabled": false });
|
|
107
|
+
for (const file of MEMORY_FILES) {
|
|
108
|
+
writeMemoryFile(file, `Content for ${file}`);
|
|
109
|
+
}
|
|
110
|
+
const result = buildSystemPrompt();
|
|
111
|
+
expectNoHeadings(result);
|
|
112
|
+
for (const file of MEMORY_FILES) {
|
|
113
|
+
expect(result).not.toContain(`Content for ${file}`);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("flag on, all files populated: all four blocks appear in canonical order", () => {
|
|
118
|
+
_setOverridesForTesting({ "memory-v2-enabled": true });
|
|
119
|
+
writeMemoryFile("essentials.md", "Alice prefers dark mode.");
|
|
120
|
+
writeMemoryFile("threads.md", "Open thread: ship PR-123 review.");
|
|
121
|
+
writeMemoryFile(
|
|
122
|
+
"recent.md",
|
|
123
|
+
"Yesterday Alice asked about Postgres tuning.",
|
|
124
|
+
);
|
|
125
|
+
writeMemoryFile(
|
|
126
|
+
"buffer.md",
|
|
127
|
+
"Bob mentioned a pager rotation conflict on Friday.",
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
const result = buildSystemPrompt();
|
|
131
|
+
|
|
132
|
+
expect(result).toContain("## Essentials");
|
|
133
|
+
expect(result).toContain("## Threads");
|
|
134
|
+
expect(result).toContain("## Recent");
|
|
135
|
+
expect(result).toContain("## Buffer");
|
|
136
|
+
|
|
137
|
+
expect(result).toContain("Alice prefers dark mode.");
|
|
138
|
+
expect(result).toContain("Open thread: ship PR-123 review.");
|
|
139
|
+
expect(result).toContain("Yesterday Alice asked about Postgres tuning.");
|
|
140
|
+
expect(result).toContain(
|
|
141
|
+
"Bob mentioned a pager rotation conflict on Friday.",
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
const essentialsIdx = result.indexOf("## Essentials");
|
|
145
|
+
const threadsIdx = result.indexOf("## Threads");
|
|
146
|
+
const recentIdx = result.indexOf("## Recent");
|
|
147
|
+
const bufferIdx = result.indexOf("## Buffer");
|
|
148
|
+
expect(essentialsIdx).toBeLessThan(threadsIdx);
|
|
149
|
+
expect(threadsIdx).toBeLessThan(recentIdx);
|
|
150
|
+
expect(recentIdx).toBeLessThan(bufferIdx);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test("flag on, files empty: blocks are omitted", () => {
|
|
154
|
+
_setOverridesForTesting({ "memory-v2-enabled": true });
|
|
155
|
+
for (const file of MEMORY_FILES) {
|
|
156
|
+
writeMemoryFile(file, "");
|
|
157
|
+
}
|
|
158
|
+
expectNoHeadings(buildSystemPrompt());
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test("flag on, only some files have content: only populated blocks appear", () => {
|
|
162
|
+
_setOverridesForTesting({ "memory-v2-enabled": true });
|
|
163
|
+
writeMemoryFile("essentials.md", "Alice prefers VS Code.");
|
|
164
|
+
writeMemoryFile("threads.md", "");
|
|
165
|
+
writeMemoryFile("recent.md", "Recent topic: GraphQL pagination.");
|
|
166
|
+
writeMemoryFile("buffer.md", "");
|
|
167
|
+
|
|
168
|
+
const result = buildSystemPrompt();
|
|
169
|
+
expect(result).toContain("## Essentials");
|
|
170
|
+
expect(result).toContain("Alice prefers VS Code.");
|
|
171
|
+
expect(result).toContain("## Recent");
|
|
172
|
+
expect(result).toContain("Recent topic: GraphQL pagination.");
|
|
173
|
+
expect(result).not.toContain("## Threads");
|
|
174
|
+
expect(result).not.toContain("## Buffer");
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test("flag on, files missing entirely: section is silently skipped", () => {
|
|
178
|
+
_setOverridesForTesting({ "memory-v2-enabled": true });
|
|
179
|
+
cleanupMemoryDir();
|
|
180
|
+
expectNoHeadings(buildSystemPrompt());
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("memory blocks live in the dynamic-suffix cache region", () => {
|
|
184
|
+
_setOverridesForTesting({ "memory-v2-enabled": true });
|
|
185
|
+
writeMemoryFile("essentials.md", "Alice prefers dark mode.");
|
|
186
|
+
const result = buildSystemPrompt();
|
|
187
|
+
const boundaryIdx = result.indexOf(SYSTEM_PROMPT_CACHE_BOUNDARY);
|
|
188
|
+
expect(boundaryIdx).toBeGreaterThan(-1);
|
|
189
|
+
const staticBlock = result.slice(0, boundaryIdx);
|
|
190
|
+
const dynamicBlock = result.slice(
|
|
191
|
+
boundaryIdx + SYSTEM_PROMPT_CACHE_BOUNDARY.length,
|
|
192
|
+
);
|
|
193
|
+
expect(staticBlock).not.toContain("## Essentials");
|
|
194
|
+
expect(dynamicBlock).toContain("## Essentials");
|
|
195
|
+
expect(dynamicBlock).toContain("Alice prefers dark mode.");
|
|
196
|
+
});
|
|
197
|
+
});
|