@vellumai/assistant 0.7.1 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +48 -50
- package/Dockerfile +1 -0
- package/README.md +1 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
- package/bun.lock +26 -26
- package/docs/architecture/memory.md +5 -2
- package/docs/architecture/security.md +20 -0
- package/docs/plugins.md +7 -9
- package/knip.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +52 -5
- package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
- package/node_modules/@vellumai/service-contracts/package.json +2 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
- package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
- package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
- package/node_modules/@vellumai/twilio-client/package.json +18 -0
- package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
- package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
- package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
- package/openapi.yaml +1020 -40
- package/package.json +6 -3
- package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
- package/src/__tests__/app-bundler.test.ts +170 -1
- package/src/__tests__/app-control-flow.test.ts +384 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
- package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
- package/src/__tests__/app-executors.test.ts +30 -43
- package/src/__tests__/approval-routes-http.test.ts +23 -6
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
- package/src/__tests__/assistant-event-hub.test.ts +157 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
- package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
- package/src/__tests__/background-shell-host-bash.test.ts +14 -15
- package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
- package/src/__tests__/btw-routes.test.ts +13 -4
- package/src/__tests__/call-controller.test.ts +49 -1
- package/src/__tests__/call-conversation-messages.test.ts +8 -2
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
- package/src/__tests__/channel-readiness-service.test.ts +62 -2
- package/src/__tests__/checker.test.ts +3 -4
- package/src/__tests__/config-loader-backfill.test.ts +461 -147
- package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +1 -0
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
- package/src/__tests__/config-watcher.test.ts +142 -71
- package/src/__tests__/context-search-agent-runner.test.ts +61 -3
- package/src/__tests__/context-search-conversations-source.test.ts +0 -24
- package/src/__tests__/context-search-fanout.test.ts +0 -1
- package/src/__tests__/context-search-memory-source.test.ts +3 -7
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -1
- package/src/__tests__/context-search-workspace-source.test.ts +0 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
- package/src/__tests__/conversation-agent-loop.test.ts +454 -5
- package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
- package/src/__tests__/conversation-error.test.ts +150 -3
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-lifecycle.test.ts +36 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
- package/src/__tests__/conversation-process-callsite.test.ts +43 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +65 -0
- package/src/__tests__/conversation-slash-commands.test.ts +0 -4
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-store.test.ts +0 -18
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
- package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
- package/src/__tests__/credentials-cli.test.ts +12 -12
- package/src/__tests__/cu-unified-flow.test.ts +351 -23
- package/src/__tests__/daemon-credential-client.test.ts +101 -19
- package/src/__tests__/date-context.test.ts +164 -2
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/disk-pressure-guard.test.ts +262 -0
- package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
- package/src/__tests__/disk-pressure-policy.test.ts +241 -0
- package/src/__tests__/disk-pressure-routes.test.ts +379 -0
- package/src/__tests__/disk-pressure-tools.test.ts +277 -0
- package/src/__tests__/disk-usage.test.ts +150 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/events-client-registration.test.ts +52 -0
- package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
- package/src/__tests__/file-write-tool.test.ts +4 -10
- package/src/__tests__/filing-service.test.ts +3 -4
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
- package/src/__tests__/heartbeat-service.test.ts +968 -2
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/host-app-control-proxy.test.ts +772 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +439 -47
- package/src/__tests__/host-bash-routes.test.ts +459 -0
- package/src/__tests__/host-browser-proxy.test.ts +24 -22
- package/src/__tests__/host-browser-routes.test.ts +39 -13
- package/src/__tests__/host-cu-proxy.test.ts +248 -52
- package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
- package/src/__tests__/host-file-proxy.test.ts +301 -45
- package/src/__tests__/host-file-read-tool.test.ts +17 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +420 -0
- package/src/__tests__/host-file-write-tool.test.ts +42 -1
- package/src/__tests__/host-proxy-base.test.ts +312 -0
- package/src/__tests__/host-shell-tool.test.ts +22 -4
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +932 -0
- package/src/__tests__/host-transfer-proxy.test.ts +121 -22
- package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
- package/src/__tests__/http-user-message-parity.test.ts +108 -1
- package/src/__tests__/identity-intro-cache.test.ts +29 -0
- package/src/__tests__/identity-routes.test.ts +103 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
- package/src/__tests__/injector-chain.test.ts +18 -6
- package/src/__tests__/injector-disk-pressure.test.ts +224 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -1
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
- package/src/__tests__/integration-status.test.ts +85 -5
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
- package/src/__tests__/managed-profile-guard.test.ts +18 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
- package/src/__tests__/mcp-abort-signal.test.ts +130 -0
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-admin-recall.test.ts +3 -11
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
- package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
- package/src/__tests__/migration-import-commit-http.test.ts +108 -2
- package/src/__tests__/mock-gateway-ipc.ts +1 -0
- package/src/__tests__/normalize-onboarding.test.ts +180 -0
- package/src/__tests__/oauth-cli.test.ts +0 -2
- package/src/__tests__/oauth-connect-routes.test.ts +316 -0
- package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/onboarding-persona-write.test.ts +308 -0
- package/src/__tests__/openai-provider.test.ts +45 -8
- package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
- package/src/__tests__/platform-callback-registration.test.ts +21 -4
- package/src/__tests__/platform.test.ts +2 -1
- package/src/__tests__/playbook-execution.test.ts +0 -43
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
- package/src/__tests__/process-message-background-slack.test.ts +2 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
- package/src/__tests__/provider-tool-name.test.ts +23 -0
- package/src/__tests__/public-ingress-urls.test.ts +97 -0
- package/src/__tests__/relay-server.test.ts +15 -4
- package/src/__tests__/require-fresh-approval.test.ts +0 -1
- package/src/__tests__/retry-backoff.test.ts +87 -0
- package/src/__tests__/runtime-events-sse.test.ts +2 -2
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- package/src/__tests__/secret-ingress-http.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +3 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
- package/src/__tests__/skill-feature-flags.test.ts +43 -41
- package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
- package/src/__tests__/skill-load-inline-command.test.ts +0 -51
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
- package/src/__tests__/slack-channel-config.test.ts +9 -14
- package/src/__tests__/suggestion-routes.test.ts +46 -0
- package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/test-preload.ts +8 -0
- package/src/__tests__/tool-approval-handler.test.ts +3 -4
- package/src/__tests__/tool-audit-listener.test.ts +48 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +0 -1
- package/src/__tests__/twilio-config.test.ts +3 -16
- package/src/__tests__/twilio-routes.test.ts +3 -5
- package/src/__tests__/twilio-validation.test.ts +93 -0
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
- package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
- package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
- package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
- package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
- package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
- package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
- package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +90 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- package/src/approvals/guardian-decision-primitive.ts +13 -0
- package/src/approvals/guardian-request-resolvers.ts +16 -17
- package/src/backup/__tests__/paths.test.ts +0 -22
- package/src/backup/__tests__/restore.test.ts +51 -151
- package/src/backup/paths.ts +2 -18
- package/src/backup/restore.ts +107 -231
- package/src/backup/snapshot-lock.ts +2 -27
- package/src/bundler/app-bundler.ts +51 -3
- package/src/bundler/compiler-tools.ts +3 -2
- package/src/calls/call-conversation-messages.ts +46 -10
- package/src/calls/relay-server.ts +4 -44
- package/src/calls/twilio-config.ts +2 -17
- package/src/calls/twilio-rest.ts +33 -105
- package/src/calls/twilio-routes.ts +11 -12
- package/src/channels/types.ts +8 -7
- package/src/cli/commands/__tests__/backup.test.ts +6 -277
- package/src/cli/commands/__tests__/gateway.test.ts +288 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -5
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/bash.ts +35 -108
- package/src/cli/commands/clients.ts +36 -37
- package/src/cli/commands/contacts.ts +137 -25
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +71 -7
- package/src/cli/commands/domain.ts +66 -15
- package/src/cli/commands/gateway.ts +183 -0
- package/src/cli/commands/keys.ts +9 -6
- package/src/cli/commands/mcp.ts +116 -156
- package/src/cli/commands/memory-v2.ts +303 -7
- package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
- package/src/cli/commands/oauth/connect.ts +127 -1
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
- package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +16 -25
- package/src/cli/commands/status.ts +57 -0
- package/src/cli/lib/daemon-credential-client.ts +110 -28
- package/src/cli/program.ts +6 -2
- package/src/config/assistant-feature-flags.ts +79 -12
- package/src/config/bundled-skills/acp/SKILL.md +6 -0
- package/src/config/bundled-skills/acp/TOOLS.json +1 -22
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
- package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
- package/src/config/bundled-skills/app-control/SKILL.md +75 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
- package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
- package/src/config/bundled-skills/document/TOOLS.json +0 -8
- package/src/config/bundled-skills/followups/TOOLS.json +0 -12
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
- package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
- package/src/config/bundled-skills/settings/SKILL.md +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +0 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
- package/src/config/bundled-skills/subagent/SKILL.md +6 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
- package/src/config/bundled-tool-registry.ts +21 -0
- package/src/config/env-registry.ts +0 -2
- package/src/config/env.ts +19 -20
- package/src/config/feature-flag-registry.json +47 -135
- package/src/config/loader.ts +197 -104
- package/src/config/sanitize-for-transfer.ts +2 -0
- package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +17 -9
- package/src/config/schemas/call-site-catalog.ts +14 -0
- package/src/config/schemas/calls.ts +0 -9
- package/src/config/schemas/channels.ts +0 -5
- package/src/config/schemas/heartbeat.ts +64 -1
- package/src/config/schemas/ingress.ts +10 -6
- package/src/config/schemas/llm.ts +7 -10
- package/src/config/schemas/memory-lifecycle.ts +90 -24
- package/src/config/schemas/memory-v2.ts +121 -13
- package/src/config/schemas/platform.ts +49 -3
- package/src/config/schemas/services.ts +29 -15
- package/src/config/schemas/skills.ts +0 -6
- package/src/config/seed-inference-profiles.ts +230 -33
- package/src/contacts/contact-store.ts +0 -55
- package/src/contacts/contacts-write.ts +0 -27
- package/src/context/window-manager.ts +1 -2
- package/src/credential-execution/feature-gates.ts +10 -10
- package/src/credential-execution/process-manager.ts +12 -41
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +187 -5
- package/src/daemon/assistant-attachments.ts +4 -4
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +89 -60
- package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
- package/src/daemon/conversation-agent-loop.ts +202 -61
- package/src/daemon/conversation-error.ts +87 -15
- package/src/daemon/conversation-lifecycle.ts +9 -4
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-runtime-assembly.ts +28 -2
- package/src/daemon/conversation-store.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +305 -4
- package/src/daemon/conversation-tool-setup.ts +66 -62
- package/src/daemon/conversation.ts +38 -24
- package/src/daemon/date-context.ts +71 -22
- package/src/daemon/disk-pressure-background-gate.ts +73 -0
- package/src/daemon/disk-pressure-guard.ts +343 -0
- package/src/daemon/disk-pressure-policy.ts +163 -0
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/handlers/shared.ts +4 -2
- package/src/daemon/handlers/skills.ts +3 -4
- package/src/daemon/host-app-control-proxy.ts +389 -0
- package/src/daemon/host-bash-proxy.ts +117 -82
- package/src/daemon/host-browser-proxy.ts +67 -82
- package/src/daemon/host-cu-proxy.ts +127 -86
- package/src/daemon/host-file-proxy.ts +129 -69
- package/src/daemon/host-proxy-base.ts +294 -0
- package/src/daemon/host-proxy-preactivation.ts +82 -0
- package/src/daemon/host-transfer-proxy.ts +338 -129
- package/src/daemon/lifecycle.ts +194 -145
- package/src/daemon/meet-host-supervisor.ts +4 -4
- package/src/daemon/meet-manifest-loader.ts +0 -1
- package/src/daemon/memory-v2-startup.ts +14 -4
- package/src/daemon/message-protocol.ts +6 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +15 -8
- package/src/daemon/message-types/disk-pressure.ts +9 -0
- package/src/daemon/message-types/host-app-control.ts +150 -0
- package/src/daemon/message-types/host-bash.ts +4 -0
- package/src/daemon/message-types/host-cu.ts +2 -0
- package/src/daemon/message-types/host-file.ts +4 -0
- package/src/daemon/message-types/host-transfer.ts +3 -0
- package/src/daemon/message-types/messages.ts +3 -0
- package/src/daemon/message-types/schedules.ts +8 -3
- package/src/daemon/message-types/skills.ts +2 -2
- package/src/daemon/process-message.ts +18 -1
- package/src/daemon/profiler-run-store.ts +5 -5
- package/src/daemon/shutdown-handlers.ts +0 -3
- package/src/daemon/tool-setup-types.ts +51 -0
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/documents/document-store.ts +85 -0
- package/src/events/tool-audit-listener.ts +2 -1
- package/src/filing/filing-service.ts +30 -5
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
- package/src/heartbeat/heartbeat-run-store.ts +249 -0
- package/src/heartbeat/heartbeat-service.ts +459 -54
- package/src/home/__tests__/post-connect-feed.test.ts +99 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
- package/src/home/__tests__/suggested-prompts.test.ts +89 -0
- package/src/home/feed-scheduler.ts +18 -0
- package/src/home/post-connect-feed.ts +68 -0
- package/src/home/relationship-state-writer.ts +17 -92
- package/src/home/suggested-prompts.ts +46 -10
- package/src/inbound/platform-callback-registration.ts +8 -15
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/assistant-server.ts +70 -3
- package/src/ipc/cli-client.ts +32 -1
- package/src/ipc/gateway-client.ts +37 -3
- package/src/live-voice/live-voice-archive.ts +4 -4
- package/src/live-voice/live-voice-metrics.ts +10 -10
- package/src/live-voice/protocol.ts +5 -7
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
- package/src/mcp/mcp-auth-orchestrator.ts +213 -0
- package/src/mcp/mcp-auth-state.ts +133 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -0
- package/src/media/image-service.ts +1 -7
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
- package/src/memory/admin.ts +5 -9
- package/src/memory/anisotropy.test.ts +247 -0
- package/src/memory/anisotropy.ts +443 -0
- package/src/memory/auto-analysis-constants.ts +17 -0
- package/src/memory/auto-analysis-guard.ts +5 -15
- package/src/memory/canonical-guardian-store.ts +7 -7
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
- package/src/memory/context-search/agent-protocol.ts +6 -6
- package/src/memory/context-search/agent-runner.ts +51 -9
- package/src/memory/context-search/sources/conversations.ts +2 -11
- package/src/memory/context-search/sources/memory-v2.ts +22 -9
- package/src/memory/context-search/sources/memory.ts +0 -1
- package/src/memory/context-search/types.ts +0 -1
- package/src/memory/conversation-crud.ts +5 -13
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/db-init.ts +6 -0
- package/src/memory/embedding-backend.ts +9 -21
- package/src/memory/embedding-runtime-manager.ts +119 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
- package/src/memory/graph/conversation-graph-memory.ts +43 -78
- package/src/memory/graph/extraction.ts +1 -3
- package/src/memory/graph/graph-search.test.ts +10 -67
- package/src/memory/graph/graph-search.ts +9 -20
- package/src/memory/graph/retriever.test.ts +6 -0
- package/src/memory/graph/retriever.ts +34 -10
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/indexer.ts +54 -45
- package/src/memory/job-handlers/backfill.ts +2 -11
- package/src/memory/job-handlers/cleanup.ts +43 -0
- package/src/memory/job-handlers/embedding.ts +6 -8
- package/src/memory/job-handlers/summarization.ts +2 -7
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
- package/src/memory/jobs/embed-concept-page.ts +28 -2
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
- package/src/memory/jobs-store.ts +114 -22
- package/src/memory/jobs-worker.ts +193 -106
- package/src/memory/memory-v2-activation-log-store.ts +33 -15
- package/src/memory/memory-v2-concept-frequency.ts +169 -0
- package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
- package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
- package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/pkb/pkb-search.test.ts +6 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +49 -32
- package/src/memory/rerank-local.ts +374 -0
- package/src/memory/schema/infrastructure.ts +15 -0
- package/src/memory/search/semantic.ts +13 -67
- package/src/memory/sparse-tokenize.ts +49 -0
- package/src/memory/trace-event-store.ts +1 -17
- package/src/memory/v2/__tests__/activation.test.ts +387 -344
- package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
- package/src/memory/v2/__tests__/injection.test.ts +181 -169
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
- package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
- package/src/memory/v2/__tests__/reranker.test.ts +338 -0
- package/src/memory/v2/__tests__/sim.test.ts +154 -188
- package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +76 -2
- package/src/memory/v2/activation.ts +213 -239
- package/src/memory/v2/consolidation-job.ts +65 -17
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/injection.ts +123 -103
- package/src/memory/v2/prompts/consolidation.ts +348 -92
- package/src/memory/v2/qdrant.ts +198 -1
- package/src/memory/v2/reranker.ts +177 -0
- package/src/memory/v2/sim.ts +113 -77
- package/src/memory/v2/skill-content.ts +4 -3
- package/src/memory/v2/skill-store.ts +91 -53
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +28 -5
- package/src/memory/v2/types.ts +10 -10
- package/src/messaging/providers/gmail/types.ts +0 -49
- package/src/messaging/providers/slack/adapter.ts +1 -31
- package/src/messaging/providers/slack/types.ts +0 -32
- package/src/notifications/README.md +10 -10
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/copy-composer.ts +13 -0
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/notifications/signal.ts +4 -0
- package/src/oauth/AGENTS.md +3 -1
- package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
- package/src/oauth/connect-orchestrator.ts +6 -0
- package/src/oauth/connection-resolver.test.ts +66 -1
- package/src/oauth/connection-resolver.ts +55 -1
- package/src/oauth/credential-token-resolver.ts +1 -3
- package/src/oauth/manual-token-connection.ts +0 -4
- package/src/oauth/oauth-connect-state.ts +77 -0
- package/src/oauth/seed-providers.ts +58 -1
- package/src/outbound-proxy/index.ts +1 -37
- package/src/outbound-proxy/logging.ts +1 -1
- package/src/outbound-proxy/policy.ts +6 -5
- package/src/outbound-proxy/router.ts +2 -1
- package/src/permissions/approval-policy.test.ts +6 -275
- package/src/permissions/approval-policy.ts +0 -51
- package/src/permissions/checker.test.ts +0 -1
- package/src/permissions/checker.ts +3 -17
- package/src/permissions/gateway-threshold-reader.ts +2 -0
- package/src/permissions/prompter.ts +34 -1
- package/src/permissions/secret-prompter.ts +6 -2
- package/src/plugins/defaults/injectors.ts +35 -2
- package/src/plugins/defaults/memory-retrieval.ts +5 -6
- package/src/plugins/types.ts +7 -0
- package/src/proactive-artifact/aux-message-injector.ts +74 -0
- package/src/proactive-artifact/decision.test.ts +226 -0
- package/src/proactive-artifact/decision.ts +165 -0
- package/src/proactive-artifact/index.ts +7 -0
- package/src/proactive-artifact/job.test.ts +867 -0
- package/src/proactive-artifact/job.ts +352 -0
- package/src/proactive-artifact/message-copy.ts +41 -0
- package/src/proactive-artifact/trigger-state.test.ts +277 -0
- package/src/proactive-artifact/trigger-state.ts +119 -0
- package/src/prompts/bootstrap-cleanup.ts +27 -0
- package/src/prompts/normalize-onboarding.ts +80 -0
- package/src/prompts/persona-resolver.ts +101 -9
- package/src/prompts/system-prompt.ts +23 -24
- package/src/prompts/templates/BOOTSTRAP.md +13 -5
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/providers/__tests__/retry-callsite.test.ts +222 -1
- package/src/providers/model-intents.ts +7 -0
- package/src/providers/openrouter/client.ts +8 -0
- package/src/providers/retry.ts +50 -0
- package/src/providers/speech-to-text/provider-catalog.ts +7 -8
- package/src/providers/types.ts +1 -0
- package/src/runtime/__tests__/agent-wake.test.ts +456 -3
- package/src/runtime/agent-wake.ts +238 -100
- package/src/runtime/assistant-event-hub.ts +151 -99
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
- package/src/runtime/auth/middleware.ts +0 -96
- package/src/runtime/auth/route-policy.ts +32 -0
- package/src/runtime/auth/same-actor.ts +216 -0
- package/src/runtime/btw-sidechain.ts +2 -3
- package/src/runtime/channel-invite-transport.ts +2 -48
- package/src/runtime/channel-invite-transports/email.ts +1 -1
- package/src/runtime/channel-invite-transports/slack.ts +1 -1
- package/src/runtime/channel-invite-transports/telegram.ts +1 -1
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
- package/src/runtime/channel-invite-types.ts +54 -0
- package/src/runtime/channel-readiness-service.ts +32 -13
- package/src/runtime/channel-retry-sweep.ts +65 -1
- package/src/runtime/guardian-reply-router.ts +10 -0
- package/src/runtime/http-server.ts +3 -329
- package/src/runtime/http-types.ts +0 -5
- package/src/runtime/local-actor-identity.ts +52 -11
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
- package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
- package/src/runtime/migrations/migration-transport.ts +7 -7
- package/src/runtime/migrations/vbundle-builder.ts +327 -60
- package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
- package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
- package/src/runtime/migrations/vbundle-importer.ts +245 -68
- package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
- package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
- package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
- package/src/runtime/migrations/vbundle-validator.ts +114 -0
- package/src/runtime/pending-interactions.ts +43 -9
- package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
- package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
- package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
- package/src/runtime/routes/approval-interception-types.ts +13 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
- package/src/runtime/routes/backup-routes.ts +15 -38
- package/src/runtime/routes/btw-routes.ts +14 -37
- package/src/runtime/routes/client-routes.ts +21 -2
- package/src/runtime/routes/contact-prompt-routes.ts +183 -0
- package/src/runtime/routes/contact-routes.ts +0 -25
- package/src/runtime/routes/conversation-query-routes.ts +36 -1
- package/src/runtime/routes/conversation-routes.ts +65 -39
- package/src/runtime/routes/debug-bash-routes.ts +163 -0
- package/src/runtime/routes/disk-pressure-routes.ts +121 -0
- package/src/runtime/routes/document-pdf-renderer.ts +169 -0
- package/src/runtime/routes/documents-routes.ts +32 -75
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +38 -0
- package/src/runtime/routes/gateway-log-routes.ts +79 -0
- package/src/runtime/routes/guardian-approval-interception.ts +2 -8
- package/src/runtime/routes/heartbeat-routes.ts +103 -38
- package/src/runtime/routes/host-app-control-routes.ts +134 -0
- package/src/runtime/routes/host-bash-routes.ts +56 -6
- package/src/runtime/routes/host-browser-routes.ts +108 -13
- package/src/runtime/routes/host-cu-routes.ts +66 -9
- package/src/runtime/routes/host-file-routes.ts +54 -5
- package/src/runtime/routes/host-transfer-routes.ts +122 -19
- package/src/runtime/routes/http-adapter.ts +1 -0
- package/src/runtime/routes/identity-intro-cache.ts +30 -0
- package/src/runtime/routes/identity-routes.ts +21 -180
- package/src/runtime/routes/inbound-message-handler.ts +78 -21
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -0
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
- package/src/runtime/routes/index.ts +14 -0
- package/src/runtime/routes/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.test.ts +41 -15
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +474 -1
- package/src/runtime/routes/migration-routes.ts +96 -0
- package/src/runtime/routes/oauth-connect-routes.ts +153 -0
- package/src/runtime/routes/schedule-routes.ts +7 -0
- package/src/runtime/verification-outbound-actions.ts +4 -4
- package/src/runtime/verification-templates.ts +4 -7
- package/src/schedule/integration-status.ts +66 -2
- package/src/schedule/recurrence-engine.ts +4 -1
- package/src/schedule/retry-backoff.ts +18 -0
- package/src/schedule/retry-policy.ts +82 -0
- package/src/schedule/run-script.ts +37 -5
- package/src/schedule/schedule-recovery.ts +64 -0
- package/src/schedule/schedule-store.ts +106 -2
- package/src/schedule/scheduler-types.ts +25 -0
- package/src/schedule/scheduler.ts +83 -39
- package/src/security/encrypted-store.ts +2 -0
- package/src/security/oauth-callback-registry.ts +8 -0
- package/src/security/secure-keys.ts +55 -0
- package/src/sequence/analytics.ts +5 -5
- package/src/sequence/engine.ts +1 -1
- package/src/skills/catalog-files.ts +2 -8
- package/src/skills/include-graph.ts +5 -5
- package/src/skills/remote-skill-policy.ts +10 -16
- package/src/skills/skill-file-provider.ts +1 -1
- package/src/skills/skill-file-types.ts +13 -0
- package/src/skills/skillssh-audit-types.ts +28 -0
- package/src/skills/skillssh-registry.ts +8 -21
- package/src/subagent/index.ts +1 -7
- package/src/subagent/manager.ts +1 -15
- package/src/tasks/task-runner.ts +0 -1
- package/src/tasks/task-store.ts +0 -3
- package/src/telemetry/types.ts +2 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
- package/src/tools/apps/executors.ts +56 -69
- package/src/tools/background-tool-registry.ts +17 -3
- package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
- package/src/tools/browser/browser-execution.ts +2 -2
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
- package/src/tools/browser/cdp-client/factory.ts +23 -24
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/computer-use/definitions.ts +42 -20
- package/src/tools/executor.ts +2 -0
- package/src/tools/host-filesystem/edit.test.ts +151 -0
- package/src/tools/host-filesystem/edit.ts +68 -0
- package/src/tools/host-filesystem/read.test.ts +129 -0
- package/src/tools/host-filesystem/read.ts +68 -0
- package/src/tools/host-filesystem/transfer.test.ts +127 -2
- package/src/tools/host-filesystem/transfer.ts +78 -3
- package/src/tools/host-filesystem/write.test.ts +134 -0
- package/src/tools/host-filesystem/write.ts +68 -0
- package/src/tools/host-terminal/host-shell.ts +66 -1
- package/src/tools/mcp/mcp-tool-factory.ts +2 -1
- package/src/tools/memory/register.test.ts +12 -9
- package/src/tools/memory/register.ts +1 -2
- package/src/tools/provider-tool-name.ts +28 -0
- package/src/tools/registry.ts +30 -9
- package/src/tools/schedule/create.ts +6 -0
- package/src/tools/schedule/list.ts +2 -0
- package/src/tools/schedule/update.ts +10 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
- package/src/tools/shared/filesystem/path-policy.ts +25 -1
- package/src/tools/skills/load.ts +0 -32
- package/src/tools/terminal/shell.ts +9 -1
- package/src/tools/tool-approval-handler.ts +32 -11
- package/src/tools/types.ts +28 -2
- package/src/tts/provider-catalog.ts +3 -5
- package/src/usage/pricing.ts +1 -1
- package/src/util/disk-usage.ts +138 -0
- package/src/util/platform.ts +21 -11
- package/src/util/process-liveness.ts +26 -0
- package/src/workspace/hatched-date.ts +86 -0
- package/src/workspace/heartbeat-service.ts +19 -0
- package/src/workspace/migrations/003-seed-device-id.ts +1 -1
- package/src/workspace/migrations/006-services-config.ts +8 -5
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
- package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
- package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
- package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
- package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
- package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
- package/src/__tests__/twilio-rest.test.ts +0 -34
- package/src/backup/__tests__/backup-key.test.ts +0 -152
- package/src/backup/__tests__/backup-worker.test.ts +0 -782
- package/src/backup/__tests__/offsite-writer.test.ts +0 -641
- package/src/backup/__tests__/stream-crypt.test.ts +0 -228
- package/src/backup/backup-key.ts +0 -137
- package/src/backup/backup-worker.ts +0 -472
- package/src/backup/offsite-writer.ts +0 -222
- package/src/backup/stream-crypt.ts +0 -263
- package/src/daemon/message-types/pairing.ts +0 -58
- package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
- package/src/memory/v2/skill-qdrant.ts +0 -395
- package/src/outbound-proxy/config.ts +0 -20
- package/src/outbound-proxy/health.ts +0 -18
- package/src/outbound-proxy/types.ts +0 -150
- package/src/runtime/capability-tokens.ts +0 -190
- package/src/signals/bash.ts +0 -198
- package/src/signals/mcp-reload.ts +0 -18
package/src/config/loader.ts
CHANGED
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
} from "node:fs";
|
|
8
8
|
import { basename, dirname, join } from "node:path";
|
|
9
9
|
|
|
10
|
+
import { safeStatSync } from "../util/fs.js";
|
|
10
11
|
import { getLogger } from "../util/logger.js";
|
|
11
12
|
import {
|
|
12
13
|
ensureDataDir,
|
|
@@ -22,8 +23,22 @@ export { API_KEY_PROVIDERS } from "../providers/provider-secret-catalog.js";
|
|
|
22
23
|
const log = getLogger("config");
|
|
23
24
|
|
|
24
25
|
let cached: AssistantConfig | null = null;
|
|
26
|
+
let cachedFileSignature: ConfigFileSignature | null = null;
|
|
25
27
|
let loading = false;
|
|
26
28
|
|
|
29
|
+
type ConfigFileSignature =
|
|
30
|
+
| {
|
|
31
|
+
path: string;
|
|
32
|
+
exists: true;
|
|
33
|
+
size: number;
|
|
34
|
+
mtimeMs: number;
|
|
35
|
+
ctimeMs: number;
|
|
36
|
+
}
|
|
37
|
+
| {
|
|
38
|
+
path: string;
|
|
39
|
+
exists: false;
|
|
40
|
+
};
|
|
41
|
+
|
|
27
42
|
function getConfigPath(): string {
|
|
28
43
|
return getWorkspaceConfigPath();
|
|
29
44
|
}
|
|
@@ -32,6 +47,48 @@ function ensureMigratedDataDir(): void {
|
|
|
32
47
|
ensureDataDir();
|
|
33
48
|
}
|
|
34
49
|
|
|
50
|
+
function readConfigFileSignature(configPath: string): ConfigFileSignature {
|
|
51
|
+
const stats = safeStatSync(configPath);
|
|
52
|
+
if (!stats) {
|
|
53
|
+
return {
|
|
54
|
+
path: configPath,
|
|
55
|
+
exists: false,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
path: configPath,
|
|
61
|
+
exists: true,
|
|
62
|
+
size: stats.size,
|
|
63
|
+
mtimeMs: stats.mtimeMs,
|
|
64
|
+
ctimeMs: stats.ctimeMs,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function configFileSignaturesEqual(
|
|
69
|
+
a: ConfigFileSignature,
|
|
70
|
+
b: ConfigFileSignature,
|
|
71
|
+
): boolean {
|
|
72
|
+
if (a.path !== b.path || a.exists !== b.exists) return false;
|
|
73
|
+
if (!a.exists || !b.exists) return true;
|
|
74
|
+
return (
|
|
75
|
+
a.size === b.size && a.mtimeMs === b.mtimeMs && a.ctimeMs === b.ctimeMs
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function getCachedConfigIfFresh(): AssistantConfig | null {
|
|
80
|
+
if (!cached || !cachedFileSignature) return null;
|
|
81
|
+
|
|
82
|
+
const currentSignature = readConfigFileSignature(getConfigPath());
|
|
83
|
+
if (configFileSignaturesEqual(cachedFileSignature, currentSignature)) {
|
|
84
|
+
return cached;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
cached = null;
|
|
88
|
+
cachedFileSignature = null;
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
|
|
35
92
|
/**
|
|
36
93
|
* Parse a raw config through the Zod schema, applying all nested defaults.
|
|
37
94
|
*
|
|
@@ -49,6 +106,38 @@ function cloneDefaultConfig(): AssistantConfig {
|
|
|
49
106
|
return applyNestedDefaults({});
|
|
50
107
|
}
|
|
51
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Returns deployment-context-aware config defaults that override schema
|
|
111
|
+
* defaults for platform-managed assistants. Only applied when initializing
|
|
112
|
+
* a fresh config (config.json does not yet exist).
|
|
113
|
+
*
|
|
114
|
+
* IS_PLATFORM is set by the Vellum platform launcher for all hosted
|
|
115
|
+
* assistant deployments. Local, Docker, and bare-metal assistants are
|
|
116
|
+
* unaffected.
|
|
117
|
+
*/
|
|
118
|
+
function getDeploymentContextDefaults(): Record<string, unknown> {
|
|
119
|
+
if (process.env.IS_PLATFORM !== "true" && process.env.IS_PLATFORM !== "1") {
|
|
120
|
+
return {};
|
|
121
|
+
}
|
|
122
|
+
const managed = { mode: "managed" as const };
|
|
123
|
+
return {
|
|
124
|
+
services: {
|
|
125
|
+
inference: managed,
|
|
126
|
+
"image-generation": managed,
|
|
127
|
+
"web-search": managed,
|
|
128
|
+
"google-oauth": managed,
|
|
129
|
+
"outlook-oauth": managed,
|
|
130
|
+
"linear-oauth": managed,
|
|
131
|
+
"github-oauth": managed,
|
|
132
|
+
"notion-oauth": managed,
|
|
133
|
+
"asana-oauth": managed,
|
|
134
|
+
"todoist-oauth": managed,
|
|
135
|
+
"discord-oauth": managed,
|
|
136
|
+
"hubspot-oauth": managed,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
52
141
|
/**
|
|
53
142
|
* Build a filesystem-safe ISO-8601 timestamp for use in quarantine filenames.
|
|
54
143
|
* Replaces `:` (invalid on Windows, confusing on macOS Finder) with `-` so the
|
|
@@ -237,6 +326,11 @@ const DEPRECATED_FIELDS: Record<string, string> = {
|
|
|
237
326
|
"permissions.autoApproveUpTo":
|
|
238
327
|
"permissions.autoApproveUpTo has been removed. The gateway now controls all " +
|
|
239
328
|
"auto-approve thresholds. The field will be removed from your config file.",
|
|
329
|
+
"memory.jobs.batchSize":
|
|
330
|
+
"memory.jobs.batchSize has been removed. The memory job worker now uses " +
|
|
331
|
+
"per-lane concurrency caps (slowLlmConcurrency, fastConcurrency, " +
|
|
332
|
+
"embedConcurrency) instead of a single batch size. " +
|
|
333
|
+
"The field will be removed from your config file.",
|
|
240
334
|
};
|
|
241
335
|
|
|
242
336
|
/**
|
|
@@ -289,42 +383,6 @@ function deleteNestedKeyByDotPath(
|
|
|
289
383
|
deleteNestedKey(obj, keys);
|
|
290
384
|
}
|
|
291
385
|
|
|
292
|
-
/**
|
|
293
|
-
* Deep-merge missing keys from `defaults` into `target`.
|
|
294
|
-
* Only adds keys that do not already exist in `target`; never overwrites.
|
|
295
|
-
* Returns true if any key was added.
|
|
296
|
-
*/
|
|
297
|
-
export function deepMergeMissing(
|
|
298
|
-
target: Record<string, unknown>,
|
|
299
|
-
defaults: Record<string, unknown>,
|
|
300
|
-
): boolean {
|
|
301
|
-
let changed = false;
|
|
302
|
-
for (const key of Object.keys(defaults)) {
|
|
303
|
-
if (!(key in target)) {
|
|
304
|
-
target[key] = defaults[key];
|
|
305
|
-
changed = true;
|
|
306
|
-
} else if (
|
|
307
|
-
defaults[key] != null &&
|
|
308
|
-
typeof defaults[key] === "object" &&
|
|
309
|
-
!Array.isArray(defaults[key]) &&
|
|
310
|
-
target[key] != null &&
|
|
311
|
-
typeof target[key] === "object" &&
|
|
312
|
-
!Array.isArray(target[key])
|
|
313
|
-
) {
|
|
314
|
-
// Recurse into nested objects
|
|
315
|
-
if (
|
|
316
|
-
deepMergeMissing(
|
|
317
|
-
target[key] as Record<string, unknown>,
|
|
318
|
-
defaults[key] as Record<string, unknown>,
|
|
319
|
-
)
|
|
320
|
-
) {
|
|
321
|
-
changed = true;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return changed;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
386
|
/**
|
|
329
387
|
* Recursively strip `null` leaves from a plain-object value, returning a
|
|
330
388
|
* deep clone with all `null`-valued keys removed at every nesting level.
|
|
@@ -346,6 +404,13 @@ function stripNullLeaves(value: unknown): unknown {
|
|
|
346
404
|
return out;
|
|
347
405
|
}
|
|
348
406
|
|
|
407
|
+
function readPlainObject(value: unknown): Record<string, unknown> | null {
|
|
408
|
+
if (value == null || typeof value !== "object" || Array.isArray(value)) {
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
411
|
+
return value as Record<string, unknown>;
|
|
412
|
+
}
|
|
413
|
+
|
|
349
414
|
/**
|
|
350
415
|
* Deep-merge `overrides` into `target`, overwriting leaf values.
|
|
351
416
|
* Recursively merges nested objects; scalars and arrays from `overrides`
|
|
@@ -409,51 +474,32 @@ export function deepMergeOverwrite(
|
|
|
409
474
|
}
|
|
410
475
|
}
|
|
411
476
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
function backfillConfigDefaults(
|
|
417
|
-
configPath: string,
|
|
418
|
-
fullDefaults: Record<string, unknown>,
|
|
419
|
-
): void {
|
|
420
|
-
let raw: unknown;
|
|
421
|
-
try {
|
|
422
|
-
raw = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
423
|
-
} catch {
|
|
424
|
-
return; // Unreadable file — skip backfill
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
// Only backfill into plain objects (not arrays, strings, etc.)
|
|
428
|
-
if (raw == null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
477
|
+
export type DefaultWorkspaceConfigMergeResult = {
|
|
478
|
+
providedLlmProfileNames: Set<string>;
|
|
479
|
+
providedLlmActiveProfile: boolean;
|
|
480
|
+
};
|
|
431
481
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
// reloads and backfills again endlessly.
|
|
438
|
-
const newJson = JSON.stringify(raw, null, 2) + "\n";
|
|
439
|
-
const existingJson = readFileSync(configPath, "utf-8");
|
|
440
|
-
if (newJson !== existingJson) {
|
|
441
|
-
writeFileSync(configPath, newJson);
|
|
442
|
-
log.info("Backfilled missing config defaults in %s", configPath);
|
|
443
|
-
}
|
|
482
|
+
function emptyDefaultWorkspaceConfigMergeResult(): DefaultWorkspaceConfigMergeResult {
|
|
483
|
+
return {
|
|
484
|
+
providedLlmProfileNames: new Set(),
|
|
485
|
+
providedLlmActiveProfile: false,
|
|
486
|
+
};
|
|
444
487
|
}
|
|
445
488
|
|
|
446
489
|
/**
|
|
447
490
|
* Merge default workspace config from the file referenced by
|
|
448
491
|
* VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH into the workspace config on disk.
|
|
449
492
|
*
|
|
450
|
-
* Called once at daemon startup (before the first loadConfig()) so
|
|
451
|
-
*
|
|
452
|
-
*
|
|
493
|
+
* Called once at daemon startup (before the first loadConfig()) so platform
|
|
494
|
+
* overrides are persisted to disk before the daemon's first config read.
|
|
495
|
+
* Schema defaults are no longer materialized into the file on load — the
|
|
496
|
+
* in-memory `loadConfig()` cache applies them at access time instead.
|
|
453
497
|
*/
|
|
454
|
-
export function mergeDefaultWorkspaceConfig():
|
|
498
|
+
export function mergeDefaultWorkspaceConfig(): DefaultWorkspaceConfigMergeResult {
|
|
455
499
|
const defaultConfigPath = process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH;
|
|
456
|
-
if (!defaultConfigPath || !existsSync(defaultConfigPath))
|
|
500
|
+
if (!defaultConfigPath || !existsSync(defaultConfigPath)) {
|
|
501
|
+
return emptyDefaultWorkspaceConfigMergeResult();
|
|
502
|
+
}
|
|
457
503
|
|
|
458
504
|
let defaults: unknown;
|
|
459
505
|
try {
|
|
@@ -464,7 +510,7 @@ export function mergeDefaultWorkspaceConfig(): void {
|
|
|
464
510
|
"Failed to read default workspace config from %s",
|
|
465
511
|
defaultConfigPath,
|
|
466
512
|
);
|
|
467
|
-
return;
|
|
513
|
+
return emptyDefaultWorkspaceConfigMergeResult();
|
|
468
514
|
}
|
|
469
515
|
|
|
470
516
|
if (
|
|
@@ -472,16 +518,44 @@ export function mergeDefaultWorkspaceConfig(): void {
|
|
|
472
518
|
typeof defaults !== "object" ||
|
|
473
519
|
Array.isArray(defaults)
|
|
474
520
|
) {
|
|
475
|
-
return;
|
|
521
|
+
return emptyDefaultWorkspaceConfigMergeResult();
|
|
476
522
|
}
|
|
477
523
|
|
|
524
|
+
const llmDefaults = readPlainObject(
|
|
525
|
+
(defaults as Record<string, unknown>).llm,
|
|
526
|
+
);
|
|
527
|
+
const providedProfiles = readPlainObject(llmDefaults?.profiles);
|
|
528
|
+
const mergeResult: DefaultWorkspaceConfigMergeResult = {
|
|
529
|
+
providedLlmProfileNames: new Set(
|
|
530
|
+
providedProfiles ? Object.keys(providedProfiles) : [],
|
|
531
|
+
),
|
|
532
|
+
providedLlmActiveProfile:
|
|
533
|
+
llmDefaults != null &&
|
|
534
|
+
Object.prototype.hasOwnProperty.call(llmDefaults, "activeProfile"),
|
|
535
|
+
};
|
|
536
|
+
|
|
478
537
|
const configPath = getConfigPath();
|
|
479
538
|
let existing: Record<string, unknown> = {};
|
|
480
539
|
if (existsSync(configPath)) {
|
|
481
540
|
try {
|
|
482
541
|
existing = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
483
|
-
} catch {
|
|
484
|
-
|
|
542
|
+
} catch (err) {
|
|
543
|
+
quarantineCorruptConfig(configPath, err);
|
|
544
|
+
// After preserving the corrupt file, start fresh so the default overlay
|
|
545
|
+
// can still initialize a valid config for this startup.
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
if (mergeResult.providedLlmProfileNames.size > 0) {
|
|
550
|
+
// Default-config profile entries are authoritative fragments. Remove any
|
|
551
|
+
// old same-name profile first so recursive merge does not leave stale
|
|
552
|
+
// provider-specific leaves behind.
|
|
553
|
+
const existingLlm = readPlainObject(existing.llm);
|
|
554
|
+
const existingProfiles = readPlainObject(existingLlm?.profiles);
|
|
555
|
+
if (existingProfiles) {
|
|
556
|
+
for (const name of mergeResult.providedLlmProfileNames) {
|
|
557
|
+
delete existingProfiles[name];
|
|
558
|
+
}
|
|
485
559
|
}
|
|
486
560
|
}
|
|
487
561
|
|
|
@@ -492,6 +566,7 @@ export function mergeDefaultWorkspaceConfig(): void {
|
|
|
492
566
|
mkdirSync(dir, { recursive: true });
|
|
493
567
|
}
|
|
494
568
|
writeFileSync(configPath, JSON.stringify(existing, null, 2) + "\n");
|
|
569
|
+
invalidateConfigCache();
|
|
495
570
|
|
|
496
571
|
// Move the temp file into the workspace directory as a permanent record.
|
|
497
572
|
// This prevents re-application on daemon restart (the env var still points
|
|
@@ -507,10 +582,13 @@ export function mergeDefaultWorkspaceConfig(): void {
|
|
|
507
582
|
} catch {
|
|
508
583
|
log.info("Merged default workspace config from %s", defaultConfigPath);
|
|
509
584
|
}
|
|
585
|
+
|
|
586
|
+
return mergeResult;
|
|
510
587
|
}
|
|
511
588
|
|
|
512
589
|
export function loadConfig(): AssistantConfig {
|
|
513
|
-
|
|
590
|
+
const freshCached = getCachedConfigIfFresh();
|
|
591
|
+
if (freshCached) return freshCached;
|
|
514
592
|
|
|
515
593
|
// Re-entrancy guard: log calls during loading (e.g. file-mode warning)
|
|
516
594
|
// can trigger loadConfig again. Return defaults to break the cycle
|
|
@@ -587,35 +665,56 @@ export function loadConfig(): AssistantConfig {
|
|
|
587
665
|
}
|
|
588
666
|
}
|
|
589
667
|
|
|
590
|
-
//
|
|
591
|
-
// users can discover and edit all available
|
|
592
|
-
//
|
|
593
|
-
//
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
668
|
+
// First-launch seed only: when config.json does not exist, write the full
|
|
669
|
+
// schema defaults to disk so users can discover and edit all available
|
|
670
|
+
// options. When the file already exists, leave it alone — disk represents
|
|
671
|
+
// user intent, while the in-memory `cached: AssistantConfig` (above) has
|
|
672
|
+
// all schema defaults applied via `applyNestedDefaults`/`validateWithSchema`,
|
|
673
|
+
// so consumers calling `getConfig().memory.v2.bm25_b` continue to receive
|
|
674
|
+
// the schema default whenever the field is absent on disk.
|
|
675
|
+
//
|
|
676
|
+
// The previous behavior — eagerly merging missing keys back into the file
|
|
677
|
+
// on every load — silently baked stale defaults into existing users'
|
|
678
|
+
// config.json. Once a default landed in the file, future schema-default
|
|
679
|
+
// changes were inert because the merge only filled absent keys and never
|
|
680
|
+
// reconciled existing values. Contract: disk = user intent, in-memory
|
|
681
|
+
// cache = effective values.
|
|
682
|
+
if (!configFileExisted) {
|
|
683
|
+
try {
|
|
684
|
+
const dir = dirname(configPath);
|
|
685
|
+
if (!existsSync(dir)) {
|
|
686
|
+
mkdirSync(dir, { recursive: true });
|
|
687
|
+
}
|
|
688
|
+
// Strip dataDir (runtime-derived) from the persisted config
|
|
689
|
+
const { dataDir: _, ...persistable } = config;
|
|
690
|
+
|
|
691
|
+
// Layer deployment context defaults on top of schema defaults.
|
|
692
|
+
// These are overrides the daemon derives from its environment (e.g.
|
|
693
|
+
// IS_PLATFORM → all service modes = "managed"). Schema defaults
|
|
694
|
+
// remain the fallback for non-platform deployments.
|
|
695
|
+
const contextDefaults = getDeploymentContextDefaults();
|
|
696
|
+
if (Object.keys(contextDefaults).length > 0) {
|
|
697
|
+
deepMergeOverwrite(
|
|
698
|
+
persistable as Record<string, unknown>,
|
|
699
|
+
contextDefaults,
|
|
700
|
+
);
|
|
701
|
+
}
|
|
603
702
|
writeFileSync(configPath, JSON.stringify(persistable, null, 2) + "\n");
|
|
604
703
|
log.info("Wrote default config to %s", configPath);
|
|
605
|
-
}
|
|
606
|
-
|
|
704
|
+
} catch (err) {
|
|
705
|
+
log.warn({ err }, "Failed to write default config file");
|
|
607
706
|
}
|
|
608
|
-
} catch (err) {
|
|
609
|
-
log.warn({ err }, "Failed to write/backfill config file");
|
|
610
707
|
}
|
|
611
708
|
|
|
612
709
|
cached = config;
|
|
710
|
+
cachedFileSignature = readConfigFileSignature(configPath);
|
|
613
711
|
|
|
614
712
|
loading = false;
|
|
615
713
|
return config;
|
|
616
714
|
} catch (err) {
|
|
617
715
|
// Loading failed — clear cached so the next call retries
|
|
618
716
|
cached = null;
|
|
717
|
+
cachedFileSignature = null;
|
|
619
718
|
loading = false;
|
|
620
719
|
throw err;
|
|
621
720
|
}
|
|
@@ -636,15 +735,6 @@ function isManagedGeminiFFEnabled(config: AssistantConfig): boolean {
|
|
|
636
735
|
}
|
|
637
736
|
}
|
|
638
737
|
|
|
639
|
-
export function saveConfig(config: AssistantConfig): void {
|
|
640
|
-
ensureMigratedDataDir();
|
|
641
|
-
const configPath = getConfigPath();
|
|
642
|
-
|
|
643
|
-
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
644
|
-
|
|
645
|
-
cached = config;
|
|
646
|
-
}
|
|
647
|
-
|
|
648
738
|
export function getConfig(): AssistantConfig {
|
|
649
739
|
return loadConfig();
|
|
650
740
|
}
|
|
@@ -658,7 +748,8 @@ export function getConfig(): AssistantConfig {
|
|
|
658
748
|
* workspace-existence check runs.
|
|
659
749
|
*/
|
|
660
750
|
export function getConfigReadOnly(): AssistantConfig {
|
|
661
|
-
|
|
751
|
+
const freshCached = getCachedConfigIfFresh();
|
|
752
|
+
if (freshCached) return freshCached;
|
|
662
753
|
|
|
663
754
|
const configPath = getConfigPath();
|
|
664
755
|
let fileConfig: Record<string, unknown> = {};
|
|
@@ -675,6 +766,7 @@ export function getConfigReadOnly(): AssistantConfig {
|
|
|
675
766
|
|
|
676
767
|
export function invalidateConfigCache(): void {
|
|
677
768
|
cached = null;
|
|
769
|
+
cachedFileSignature = null;
|
|
678
770
|
loading = false;
|
|
679
771
|
}
|
|
680
772
|
|
|
@@ -712,6 +804,7 @@ export function saveRawConfig(config: Record<string, unknown>): void {
|
|
|
712
804
|
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
713
805
|
|
|
714
806
|
cached = null; // invalidate cache
|
|
807
|
+
cachedFileSignature = null;
|
|
715
808
|
}
|
|
716
809
|
|
|
717
810
|
export function getNestedValue(
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Fields removed or reset:
|
|
6
6
|
* - `ingress.publicBaseUrl` → set to `""`
|
|
7
7
|
* - `ingress.enabled` → deleted
|
|
8
|
+
* - `ingress.publicBaseUrlManagedBy` → deleted
|
|
8
9
|
* - `daemon` → deleted entirely
|
|
9
10
|
* - `skills.load.extraDirs` → set to `[]`
|
|
10
11
|
* - `hostBrowser.cdpInspect.desktopAuto` → deleted **only when the source
|
|
@@ -41,6 +42,7 @@ export function sanitizeConfigForTransfer(configJson: string): string {
|
|
|
41
42
|
const ingress = config.ingress as Record<string, unknown>;
|
|
42
43
|
ingress.publicBaseUrl = "";
|
|
43
44
|
delete ingress.enabled;
|
|
45
|
+
delete ingress.publicBaseUrlManagedBy;
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
// Strip daemon entirely
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
import { MemoryJobsConfigSchema } from "../memory-lifecycle.js";
|
|
4
|
+
|
|
5
|
+
describe("MemoryJobsConfigSchema", () => {
|
|
6
|
+
test("parses an empty object to documented defaults", () => {
|
|
7
|
+
const parsed = MemoryJobsConfigSchema.parse({});
|
|
8
|
+
expect(parsed).toEqual({
|
|
9
|
+
workerConcurrency: 2,
|
|
10
|
+
stalledJobTimeoutMs: 30 * 60 * 1000,
|
|
11
|
+
slowLlmConcurrency: 1,
|
|
12
|
+
fastConcurrency: 2,
|
|
13
|
+
embedConcurrency: 2,
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test("derives lane caps from workerConcurrency when only it is set", () => {
|
|
18
|
+
const parsed = MemoryJobsConfigSchema.parse({ workerConcurrency: 4 });
|
|
19
|
+
expect(parsed.workerConcurrency).toBe(4);
|
|
20
|
+
expect(parsed.slowLlmConcurrency).toBe(2);
|
|
21
|
+
expect(parsed.fastConcurrency).toBe(4);
|
|
22
|
+
expect(parsed.embedConcurrency).toBe(4);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test("floors and clamps slowLlmConcurrency to at least 1 when deriving", () => {
|
|
26
|
+
const parsed = MemoryJobsConfigSchema.parse({ workerConcurrency: 1 });
|
|
27
|
+
expect(parsed.slowLlmConcurrency).toBe(1);
|
|
28
|
+
expect(parsed.fastConcurrency).toBe(1);
|
|
29
|
+
expect(parsed.embedConcurrency).toBe(1);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("explicit lane cap overrides the derivation", () => {
|
|
33
|
+
const parsed = MemoryJobsConfigSchema.parse({
|
|
34
|
+
workerConcurrency: 4,
|
|
35
|
+
slowLlmConcurrency: 1,
|
|
36
|
+
});
|
|
37
|
+
expect(parsed.slowLlmConcurrency).toBe(1);
|
|
38
|
+
expect(parsed.fastConcurrency).toBe(4);
|
|
39
|
+
expect(parsed.embedConcurrency).toBe(4);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("explicit lane caps without workerConcurrency keep workerConcurrency default", () => {
|
|
43
|
+
const parsed = MemoryJobsConfigSchema.parse({
|
|
44
|
+
slowLlmConcurrency: 3,
|
|
45
|
+
fastConcurrency: 5,
|
|
46
|
+
embedConcurrency: 7,
|
|
47
|
+
});
|
|
48
|
+
expect(parsed.workerConcurrency).toBe(2);
|
|
49
|
+
expect(parsed.slowLlmConcurrency).toBe(3);
|
|
50
|
+
expect(parsed.fastConcurrency).toBe(5);
|
|
51
|
+
expect(parsed.embedConcurrency).toBe(7);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test.each([
|
|
55
|
+
"slowLlmConcurrency",
|
|
56
|
+
"fastConcurrency",
|
|
57
|
+
"embedConcurrency",
|
|
58
|
+
"workerConcurrency",
|
|
59
|
+
] as const)("rejects %s = 0", (field) => {
|
|
60
|
+
expect(() => MemoryJobsConfigSchema.parse({ [field]: 0 })).toThrow();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test.each([
|
|
64
|
+
"slowLlmConcurrency",
|
|
65
|
+
"fastConcurrency",
|
|
66
|
+
"embedConcurrency",
|
|
67
|
+
"workerConcurrency",
|
|
68
|
+
] as const)("rejects negative %s", (field) => {
|
|
69
|
+
expect(() => MemoryJobsConfigSchema.parse({ [field]: -1 })).toThrow();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test.each([
|
|
73
|
+
"slowLlmConcurrency",
|
|
74
|
+
"fastConcurrency",
|
|
75
|
+
"embedConcurrency",
|
|
76
|
+
"workerConcurrency",
|
|
77
|
+
] as const)("rejects non-integer %s", (field) => {
|
|
78
|
+
expect(() => MemoryJobsConfigSchema.parse({ [field]: 1.5 })).toThrow();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -7,7 +7,7 @@ describe("MemoryV2ConfigSchema", () => {
|
|
|
7
7
|
test("parses an empty object to documented defaults", () => {
|
|
8
8
|
const parsed = MemoryV2ConfigSchema.parse({});
|
|
9
9
|
expect(parsed).toEqual({
|
|
10
|
-
enabled:
|
|
10
|
+
enabled: true,
|
|
11
11
|
sweep_enabled: false,
|
|
12
12
|
d: 0.3,
|
|
13
13
|
c_user: 0.3,
|
|
@@ -15,14 +15,23 @@ describe("MemoryV2ConfigSchema", () => {
|
|
|
15
15
|
c_now: 0.2,
|
|
16
16
|
k: 0.5,
|
|
17
17
|
hops: 2,
|
|
18
|
-
top_k:
|
|
19
|
-
|
|
18
|
+
top_k: 25,
|
|
19
|
+
ann_candidate_limit: null,
|
|
20
20
|
epsilon: 0.01,
|
|
21
|
-
dense_weight: 0.
|
|
22
|
-
sparse_weight: 0.
|
|
21
|
+
dense_weight: 0.85,
|
|
22
|
+
sparse_weight: 0.15,
|
|
23
|
+
bm25_k1: 1.2,
|
|
24
|
+
bm25_b: 0.4,
|
|
23
25
|
consolidation_interval_hours: 4,
|
|
24
26
|
max_page_chars: 5000,
|
|
25
27
|
consolidation_prompt_path: null,
|
|
28
|
+
rerank: {
|
|
29
|
+
enabled: false,
|
|
30
|
+
top_k: 50,
|
|
31
|
+
alpha: 0.3,
|
|
32
|
+
model: "Alibaba-NLP/gte-reranker-modernbert-base",
|
|
33
|
+
dtype: "q8",
|
|
34
|
+
},
|
|
26
35
|
});
|
|
27
36
|
});
|
|
28
37
|
|
|
@@ -152,12 +161,11 @@ describe("MemoryConfigSchema integration with v2 block", () => {
|
|
|
152
161
|
test("parses an empty memory config and includes a v2 block with defaults", () => {
|
|
153
162
|
const parsed = MemoryConfigSchema.parse({});
|
|
154
163
|
expect(parsed.v2).toBeDefined();
|
|
155
|
-
expect(parsed.v2.enabled).toBe(
|
|
164
|
+
expect(parsed.v2.enabled).toBe(true);
|
|
156
165
|
expect(parsed.v2.sweep_enabled).toBe(false);
|
|
157
166
|
expect(parsed.v2.d).toBe(0.3);
|
|
158
|
-
expect(parsed.v2.dense_weight).toBe(0.
|
|
159
|
-
expect(parsed.v2.sparse_weight).toBe(0.
|
|
160
|
-
expect(parsed.v2.top_k_skills).toBe(5);
|
|
167
|
+
expect(parsed.v2.dense_weight).toBe(0.85);
|
|
168
|
+
expect(parsed.v2.sparse_weight).toBe(0.15);
|
|
161
169
|
expect(parsed.v2.consolidation_interval_hours).toBe(4);
|
|
162
170
|
expect(parsed.v2.max_page_chars).toBe(5000);
|
|
163
171
|
});
|
|
@@ -264,6 +264,20 @@ const CATALOG_RECORD: CatalogRecord = {
|
|
|
264
264
|
description: "General-purpose LLM inference call site for skill use.",
|
|
265
265
|
domain: "skills",
|
|
266
266
|
},
|
|
267
|
+
proactiveArtifactDecision: {
|
|
268
|
+
id: "proactiveArtifactDecision",
|
|
269
|
+
displayName: "Proactive Artifact Decision",
|
|
270
|
+
description:
|
|
271
|
+
"Decides what personalized artifact to build for new users based on conversation context.",
|
|
272
|
+
domain: "agentLoop",
|
|
273
|
+
},
|
|
274
|
+
proactiveArtifactBuild: {
|
|
275
|
+
id: "proactiveArtifactBuild",
|
|
276
|
+
displayName: "Proactive Artifact Build",
|
|
277
|
+
description:
|
|
278
|
+
"Builds the personalized artifact in a background conversation with tool access.",
|
|
279
|
+
domain: "agentLoop",
|
|
280
|
+
},
|
|
267
281
|
};
|
|
268
282
|
|
|
269
283
|
// Source of truth for call-site display metadata. API responses and usage
|
|
@@ -232,12 +232,3 @@ export const CallsConfigSchema = z
|
|
|
232
232
|
.describe(
|
|
233
233
|
"Phone call configuration — controls telephony, voice, safety, and call behavior",
|
|
234
234
|
);
|
|
235
|
-
|
|
236
|
-
export type CallsConfig = z.infer<typeof CallsConfigSchema>;
|
|
237
|
-
export type CallsDisclosureConfig = z.infer<typeof CallsDisclosureConfigSchema>;
|
|
238
|
-
export type CallsSafetyConfig = z.infer<typeof CallsSafetyConfigSchema>;
|
|
239
|
-
export type CallsVoiceConfig = z.infer<typeof CallsVoiceConfigSchema>;
|
|
240
|
-
export type CallerIdentityConfig = z.infer<typeof CallerIdentityConfigSchema>;
|
|
241
|
-
export type CallsVerificationConfig = z.infer<
|
|
242
|
-
typeof CallsVerificationConfigSchema
|
|
243
|
-
>;
|
|
@@ -121,8 +121,3 @@ export const SlackConfigSchema = z
|
|
|
121
121
|
.describe("Slack bot display name"),
|
|
122
122
|
})
|
|
123
123
|
.describe("Slack channel configuration");
|
|
124
|
-
|
|
125
|
-
export type TwilioConfig = z.infer<typeof TwilioConfigSchema>;
|
|
126
|
-
export type WhatsAppConfig = z.infer<typeof WhatsAppConfigSchema>;
|
|
127
|
-
export type TelegramConfig = z.infer<typeof TelegramConfigSchema>;
|
|
128
|
-
export type SlackConfig = z.infer<typeof SlackConfigSchema>;
|