@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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Cron } from "croner";
|
|
1
2
|
import { z } from "zod";
|
|
2
3
|
|
|
3
4
|
export const HeartbeatConfigSchema = z
|
|
@@ -10,8 +11,22 @@ export const HeartbeatConfigSchema = z
|
|
|
10
11
|
.number({ error: "heartbeat.intervalMs must be a number" })
|
|
11
12
|
.int("heartbeat.intervalMs must be an integer")
|
|
12
13
|
.positive("heartbeat.intervalMs must be a positive integer")
|
|
13
|
-
.default(
|
|
14
|
+
.default(30 * 60_000)
|
|
14
15
|
.describe("Time between heartbeat checks in milliseconds"),
|
|
16
|
+
cronExpression: z
|
|
17
|
+
.string()
|
|
18
|
+
.nullable()
|
|
19
|
+
.default(null)
|
|
20
|
+
.describe(
|
|
21
|
+
"Cron expression for heartbeat timing. When set, heartbeats fire at the specified clock times instead of using intervalMs.",
|
|
22
|
+
),
|
|
23
|
+
timezone: z
|
|
24
|
+
.string()
|
|
25
|
+
.nullable()
|
|
26
|
+
.default(null)
|
|
27
|
+
.describe(
|
|
28
|
+
"Timezone for cron expression evaluation, e.g. 'America/New_York'. Ignored when cronExpression is null.",
|
|
29
|
+
),
|
|
15
30
|
activeHoursStart: z
|
|
16
31
|
.number({ error: "heartbeat.activeHoursStart must be a number" })
|
|
17
32
|
.int("heartbeat.activeHoursStart must be an integer")
|
|
@@ -80,6 +95,54 @@ export const HeartbeatConfigSchema = z
|
|
|
80
95
|
message,
|
|
81
96
|
});
|
|
82
97
|
}
|
|
98
|
+
|
|
99
|
+
// Validate cronExpression and timezone when cronExpression is set.
|
|
100
|
+
// Separate the validations so timezone errors are attributed to the
|
|
101
|
+
// timezone path — if both paths point at cronExpression, the config
|
|
102
|
+
// loader's delete-and-retry would strip cronExpression but leave the
|
|
103
|
+
// invalid timezone, cascading to a full defaults reset.
|
|
104
|
+
if (config.cronExpression != null) {
|
|
105
|
+
try {
|
|
106
|
+
new Cron(config.cronExpression, { maxRuns: 0 });
|
|
107
|
+
} catch (err) {
|
|
108
|
+
ctx.addIssue({
|
|
109
|
+
code: z.ZodIssueCode.custom,
|
|
110
|
+
path: ["cronExpression"],
|
|
111
|
+
message: err instanceof Error ? err.message : String(err),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
if (config.timezone != null) {
|
|
115
|
+
try {
|
|
116
|
+
new Cron(config.cronExpression, {
|
|
117
|
+
maxRuns: 0,
|
|
118
|
+
timezone: config.timezone,
|
|
119
|
+
});
|
|
120
|
+
} catch {
|
|
121
|
+
// The cron expression itself is valid (or already flagged above),
|
|
122
|
+
// so a failure here is from the timezone.
|
|
123
|
+
try {
|
|
124
|
+
Intl.DateTimeFormat(undefined, { timeZone: config.timezone });
|
|
125
|
+
} catch (tzErr) {
|
|
126
|
+
ctx.addIssue({
|
|
127
|
+
code: z.ZodIssueCode.custom,
|
|
128
|
+
path: ["timezone"],
|
|
129
|
+
message: tzErr instanceof Error ? tzErr.message : String(tzErr),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} else if (config.timezone != null) {
|
|
135
|
+
// cronExpression is null but timezone is set — validate timezone independently
|
|
136
|
+
try {
|
|
137
|
+
Intl.DateTimeFormat(undefined, { timeZone: config.timezone });
|
|
138
|
+
} catch (err) {
|
|
139
|
+
ctx.addIssue({
|
|
140
|
+
code: z.ZodIssueCode.custom,
|
|
141
|
+
path: ["timezone"],
|
|
142
|
+
message: err instanceof Error ? err.message : String(err),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
83
146
|
});
|
|
84
147
|
|
|
85
148
|
export type HeartbeatConfig = z.infer<typeof HeartbeatConfigSchema>;
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
|
+
function emptyOrAbsoluteHttpUrl(fieldPath: string) {
|
|
4
|
+
return z
|
|
5
|
+
.string({ error: `${fieldPath} must be a string` })
|
|
6
|
+
.refine(
|
|
7
|
+
(val) => val === "" || /^https?:\/\//i.test(val),
|
|
8
|
+
`${fieldPath} must be an absolute URL starting with http:// or https://`,
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
|
|
3
12
|
const IngressWebhookConfigSchema = z
|
|
4
13
|
.object({
|
|
5
14
|
secret: z
|
|
@@ -74,12 +83,7 @@ const IngressBaseSchema = z
|
|
|
74
83
|
.boolean({ error: "ingress.enabled must be a boolean" })
|
|
75
84
|
.optional()
|
|
76
85
|
.describe("Whether the ingress HTTP server is enabled"),
|
|
77
|
-
publicBaseUrl:
|
|
78
|
-
.string({ error: "ingress.publicBaseUrl must be a string" })
|
|
79
|
-
.refine(
|
|
80
|
-
(val) => val === "" || /^https?:\/\//i.test(val),
|
|
81
|
-
"ingress.publicBaseUrl must be an absolute URL starting with http:// or https://",
|
|
82
|
-
)
|
|
86
|
+
publicBaseUrl: emptyOrAbsoluteHttpUrl("ingress.publicBaseUrl")
|
|
83
87
|
.default("")
|
|
84
88
|
.describe(
|
|
85
89
|
"Public-facing base URL for the ingress server (used in webhook callbacks)",
|
|
@@ -70,6 +70,8 @@ export const LLMCallSiteEnum = z.enum([
|
|
|
70
70
|
"inference",
|
|
71
71
|
"feedEventCopy",
|
|
72
72
|
"trustRuleSuggestion",
|
|
73
|
+
"proactiveArtifactDecision",
|
|
74
|
+
"proactiveArtifactBuild",
|
|
73
75
|
]);
|
|
74
76
|
export type LLMCallSite = z.infer<typeof LLMCallSiteEnum>;
|
|
75
77
|
|
|
@@ -91,7 +93,6 @@ export type LLMCallSite = z.infer<typeof LLMCallSiteEnum>;
|
|
|
91
93
|
* mapping table.
|
|
92
94
|
*/
|
|
93
95
|
const EffortEnum = z.enum(["none", "low", "medium", "high", "xhigh", "max"]);
|
|
94
|
-
export type Effort = z.infer<typeof EffortEnum>;
|
|
95
96
|
|
|
96
97
|
export const SpeedEnum = z.enum(["standard", "fast"]);
|
|
97
98
|
export type Speed = z.infer<typeof SpeedEnum>;
|
|
@@ -102,7 +103,6 @@ export type Speed = z.infer<typeof SpeedEnum>;
|
|
|
102
103
|
* are stripped in `retry.ts` normalization.
|
|
103
104
|
*/
|
|
104
105
|
const VerbosityEnum = z.enum(["low", "medium", "high"]);
|
|
105
|
-
export type Verbosity = z.infer<typeof VerbosityEnum>;
|
|
106
106
|
|
|
107
107
|
// ---------------------------------------------------------------------------
|
|
108
108
|
// Leaf primitives (shared between LLMConfigBase and LLMConfigFragment)
|
|
@@ -150,7 +150,6 @@ const ThinkingSchema = z.object({
|
|
|
150
150
|
enabled: ThinkingEnabledSchema.default(true),
|
|
151
151
|
streamThinking: ThinkingStreamThinkingSchema.default(true),
|
|
152
152
|
});
|
|
153
|
-
export type Thinking = z.infer<typeof ThinkingSchema>;
|
|
154
153
|
|
|
155
154
|
// Fragment view: every field optional, no defaults injected. Defining this
|
|
156
155
|
// separately (rather than `ThinkingSchema.partial()`) avoids having Zod
|
|
@@ -243,7 +242,6 @@ const OpenRouterOnlyItemSchema = z.string().min(1);
|
|
|
243
242
|
const OpenRouterSchema = z.object({
|
|
244
243
|
only: z.array(OpenRouterOnlyItemSchema).default([]),
|
|
245
244
|
});
|
|
246
|
-
export type OpenRouter = z.infer<typeof OpenRouterSchema>;
|
|
247
245
|
|
|
248
246
|
const OpenRouterDeepPartialSchema = z.object({
|
|
249
247
|
only: z.array(OpenRouterOnlyItemSchema).optional(),
|
|
@@ -257,8 +255,8 @@ const OpenRouterDeepPartialSchema = z.object({
|
|
|
257
255
|
* Distinguishes daemon-managed profiles (overwritten on every startup) from
|
|
258
256
|
* user-created ones (never touched by the daemon).
|
|
259
257
|
*/
|
|
260
|
-
|
|
261
|
-
|
|
258
|
+
const ProfileSource = z.enum(["managed", "user"]);
|
|
259
|
+
type ProfileSource = z.infer<typeof ProfileSource>;
|
|
262
260
|
|
|
263
261
|
// ---------------------------------------------------------------------------
|
|
264
262
|
// Pricing overrides
|
|
@@ -270,7 +268,6 @@ const PricingOverrideSchema = z.object({
|
|
|
270
268
|
inputPer1M: z.number().nonnegative(),
|
|
271
269
|
outputPer1M: z.number().nonnegative(),
|
|
272
270
|
});
|
|
273
|
-
export type PricingOverride = z.infer<typeof PricingOverrideSchema>;
|
|
274
271
|
|
|
275
272
|
// ---------------------------------------------------------------------------
|
|
276
273
|
// Base config (all fields defaulted) and Fragment (all fields optional)
|
|
@@ -302,7 +299,7 @@ export type LLMConfigBase = z.infer<typeof LLMConfigBase>;
|
|
|
302
299
|
* objects so callers can override individual leaves (e.g. `{ thinking:
|
|
303
300
|
* { enabled: false } }`).
|
|
304
301
|
*/
|
|
305
|
-
|
|
302
|
+
const LLMConfigFragment = z.object({
|
|
306
303
|
provider: LLMProvider.optional(),
|
|
307
304
|
model: ModelSchema.optional(),
|
|
308
305
|
maxTokens: MaxTokensSchema.optional(),
|
|
@@ -314,7 +311,7 @@ export const LLMConfigFragment = z.object({
|
|
|
314
311
|
contextWindow: ContextWindowDeepPartialSchema.optional(),
|
|
315
312
|
openrouter: OpenRouterDeepPartialSchema.optional(),
|
|
316
313
|
});
|
|
317
|
-
|
|
314
|
+
type LLMConfigFragment = z.infer<typeof LLMConfigFragment>;
|
|
318
315
|
|
|
319
316
|
/**
|
|
320
317
|
* A named profile entry: an `LLMConfigFragment` augmented with
|
|
@@ -337,7 +334,7 @@ export type ProfileEntry = z.infer<typeof ProfileEntry>;
|
|
|
337
334
|
const LLMCallSiteConfig = LLMConfigFragment.extend({
|
|
338
335
|
profile: z.string().min(1).optional(),
|
|
339
336
|
});
|
|
340
|
-
|
|
337
|
+
type LLMCallSiteConfig = z.infer<typeof LLMCallSiteConfig>;
|
|
341
338
|
|
|
342
339
|
// ---------------------------------------------------------------------------
|
|
343
340
|
// Top-level LLM schema
|
|
@@ -1,29 +1,82 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
3
|
+
const DEFAULT_WORKER_CONCURRENCY = 2;
|
|
4
|
+
const DEFAULT_SLOW_LLM_CONCURRENCY = 1;
|
|
5
|
+
const DEFAULT_FAST_CONCURRENCY = 2;
|
|
6
|
+
const DEFAULT_EMBED_CONCURRENCY = 2;
|
|
7
|
+
|
|
8
|
+
const positiveInt = (field: string) =>
|
|
9
|
+
z
|
|
10
|
+
.number({ error: `memory.jobs.${field} must be a number` })
|
|
11
|
+
.int(`memory.jobs.${field} must be an integer`)
|
|
12
|
+
.positive(`memory.jobs.${field} must be a positive integer`);
|
|
13
|
+
|
|
14
|
+
// Input shape allows all fields to be omitted so we can distinguish
|
|
15
|
+
// "user explicitly set workerConcurrency" from "user accepted the default"
|
|
16
|
+
// when deriving lane caps. The output shape (after transform) always has
|
|
17
|
+
// all four fields populated.
|
|
18
|
+
const MemoryJobsConfigInputSchema = z.object({
|
|
19
|
+
workerConcurrency: positiveInt("workerConcurrency")
|
|
20
|
+
.optional()
|
|
21
|
+
.describe("Number of concurrent workers processing memory jobs"),
|
|
22
|
+
stalledJobTimeoutMs: positiveInt("stalledJobTimeoutMs")
|
|
23
|
+
.default(30 * 60 * 1000)
|
|
24
|
+
.describe(
|
|
25
|
+
"Timeout in milliseconds after which a stalled memory job is considered failed",
|
|
26
|
+
),
|
|
27
|
+
slowLlmConcurrency: positiveInt("slowLlmConcurrency")
|
|
28
|
+
.optional()
|
|
29
|
+
.describe(
|
|
30
|
+
"Concurrent slow LLM-bound jobs (graph consolidation, narrative refine, etc.)",
|
|
31
|
+
),
|
|
32
|
+
fastConcurrency: positiveInt("fastConcurrency")
|
|
33
|
+
.optional()
|
|
34
|
+
.describe(
|
|
35
|
+
"Concurrent fast jobs (concept-page embed, prunes, media processing, etc.)",
|
|
36
|
+
),
|
|
37
|
+
embedConcurrency: positiveInt("embedConcurrency")
|
|
38
|
+
.optional()
|
|
39
|
+
.describe(
|
|
40
|
+
"Concurrent segment-embed jobs (gated by Qdrant circuit breaker)",
|
|
41
|
+
),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export const MemoryJobsConfigSchema = MemoryJobsConfigInputSchema.transform(
|
|
45
|
+
(input) => {
|
|
46
|
+
// When `workerConcurrency` is explicitly set but lane caps are not,
|
|
47
|
+
// derive lane caps so existing user configs gain the per-lane fix
|
|
48
|
+
// without edits. Explicit lane caps always win.
|
|
49
|
+
const workerConcurrencyExplicit = input.workerConcurrency !== undefined;
|
|
50
|
+
const workerConcurrency =
|
|
51
|
+
input.workerConcurrency ?? DEFAULT_WORKER_CONCURRENCY;
|
|
52
|
+
|
|
53
|
+
const slowLlmConcurrency =
|
|
54
|
+
input.slowLlmConcurrency ??
|
|
55
|
+
(workerConcurrencyExplicit
|
|
56
|
+
? Math.max(1, Math.floor(workerConcurrency / 2))
|
|
57
|
+
: DEFAULT_SLOW_LLM_CONCURRENCY);
|
|
58
|
+
|
|
59
|
+
const fastConcurrency =
|
|
60
|
+
input.fastConcurrency ??
|
|
61
|
+
(workerConcurrencyExplicit
|
|
62
|
+
? workerConcurrency
|
|
63
|
+
: DEFAULT_FAST_CONCURRENCY);
|
|
64
|
+
|
|
65
|
+
const embedConcurrency =
|
|
66
|
+
input.embedConcurrency ??
|
|
67
|
+
(workerConcurrencyExplicit
|
|
68
|
+
? workerConcurrency
|
|
69
|
+
: DEFAULT_EMBED_CONCURRENCY);
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
workerConcurrency,
|
|
73
|
+
stalledJobTimeoutMs: input.stalledJobTimeoutMs,
|
|
74
|
+
slowLlmConcurrency,
|
|
75
|
+
fastConcurrency,
|
|
76
|
+
embedConcurrency,
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
).describe("Memory background job processing configuration");
|
|
27
80
|
|
|
28
81
|
export const MemoryRetentionConfigSchema = z
|
|
29
82
|
.object({
|
|
@@ -96,6 +149,19 @@ export const MemoryCleanupConfigSchema = z
|
|
|
96
149
|
.describe(
|
|
97
150
|
"Retention period for LLM request/response logs in milliseconds (null keeps forever, 0 prunes immediately)",
|
|
98
151
|
),
|
|
152
|
+
traceEventRetentionDays: z
|
|
153
|
+
.number({
|
|
154
|
+
error: "memory.cleanup.traceEventRetentionDays must be a number",
|
|
155
|
+
})
|
|
156
|
+
.int("memory.cleanup.traceEventRetentionDays must be an integer")
|
|
157
|
+
.nonnegative(
|
|
158
|
+
"memory.cleanup.traceEventRetentionDays must be non-negative",
|
|
159
|
+
)
|
|
160
|
+
.max(365, "memory.cleanup.traceEventRetentionDays must be <= 365 days")
|
|
161
|
+
.default(3)
|
|
162
|
+
.describe(
|
|
163
|
+
"Number of days to retain trace events before cleanup (0 disables pruning)",
|
|
164
|
+
),
|
|
99
165
|
})
|
|
100
166
|
.describe("Automatic memory cleanup and garbage collection settings");
|
|
101
167
|
|
|
@@ -7,6 +7,33 @@ import { z } from "zod";
|
|
|
7
7
|
*/
|
|
8
8
|
const WEIGHT_SUM_TOLERANCE = 0.001;
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Default cross-encoder model for memory v2 reranking.
|
|
12
|
+
* `Alibaba-NLP/gte-reranker-modernbert-base` (149M, Apache-2.0) — 2025
|
|
13
|
+
* ModernBERT-backbone reranker; smaller, newer, and cleaner-licensed than
|
|
14
|
+
* the bge family while matching or beating their retrieval-benchmark scores.
|
|
15
|
+
* Has ONNX exports at the standard `onnx/model.onnx` path.
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_RERANK_MODEL = "Alibaba-NLP/gte-reranker-modernbert-base";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* ONNX weight precision passed to `@huggingface/transformers`. Sourced from
|
|
21
|
+
* transformers.js's supported `dtype` values; `q8` (int8) is ~3× faster than
|
|
22
|
+
* `fp32` on CPU with negligible reranker accuracy loss. Single source of
|
|
23
|
+
* truth for both the schema enum and the `LocalRerankBackend` type.
|
|
24
|
+
*/
|
|
25
|
+
export const RerankDtypeEnum = z.enum([
|
|
26
|
+
"fp32",
|
|
27
|
+
"fp16",
|
|
28
|
+
"q8",
|
|
29
|
+
"int8",
|
|
30
|
+
"uint8",
|
|
31
|
+
"q4",
|
|
32
|
+
"bnb4",
|
|
33
|
+
"q4f16",
|
|
34
|
+
]);
|
|
35
|
+
export type RerankDtype = z.infer<typeof RerankDtypeEnum>;
|
|
36
|
+
|
|
10
37
|
/**
|
|
11
38
|
* Memory v2 (concept-page activation model) configuration.
|
|
12
39
|
*
|
|
@@ -21,7 +48,7 @@ export const MemoryV2ConfigSchema = z
|
|
|
21
48
|
.object({
|
|
22
49
|
enabled: z
|
|
23
50
|
.boolean({ error: "memory.v2.enabled must be a boolean" })
|
|
24
|
-
.default(
|
|
51
|
+
.default(true)
|
|
25
52
|
.describe(
|
|
26
53
|
"Whether the v2 memory subsystem (concept-page activation model) is enabled. Independent of the memory-v2-enabled feature flag — both must be true for v2 to run.",
|
|
27
54
|
),
|
|
@@ -83,17 +110,18 @@ export const MemoryV2ConfigSchema = z
|
|
|
83
110
|
.number({ error: "memory.v2.top_k must be a number" })
|
|
84
111
|
.int("memory.v2.top_k must be an integer")
|
|
85
112
|
.positive("memory.v2.top_k must be a positive integer")
|
|
86
|
-
.default(
|
|
113
|
+
.default(25)
|
|
87
114
|
.describe(
|
|
88
|
-
"Number of top-activation concept pages considered for injection per turn",
|
|
115
|
+
"Number of top-activation entries (concept pages and skills combined) considered for injection per turn. Skills are scored alongside concepts in the same pool; this cap covers both.",
|
|
89
116
|
),
|
|
90
|
-
|
|
91
|
-
.number({ error: "memory.v2.
|
|
92
|
-
.int()
|
|
93
|
-
.
|
|
94
|
-
.
|
|
117
|
+
ann_candidate_limit: z
|
|
118
|
+
.number({ error: "memory.v2.ann_candidate_limit must be a number" })
|
|
119
|
+
.int("memory.v2.ann_candidate_limit must be an integer")
|
|
120
|
+
.positive("memory.v2.ann_candidate_limit must be a positive integer")
|
|
121
|
+
.nullable()
|
|
122
|
+
.default(null)
|
|
95
123
|
.describe(
|
|
96
|
-
"
|
|
124
|
+
"Per-channel cap on the unrestricted ANN candidate query (dense and sparse each return up to this many hits before they are unioned and fed into the activation pipeline). `null` = unlimited (every page in the v2 collection is eligible). Increase or null this out to surface more candidates at the cost of higher per-turn embedding/scoring work.",
|
|
97
125
|
),
|
|
98
126
|
epsilon: z
|
|
99
127
|
.number({ error: "memory.v2.epsilon must be a number" })
|
|
@@ -107,17 +135,52 @@ export const MemoryV2ConfigSchema = z
|
|
|
107
135
|
.number({ error: "memory.v2.dense_weight must be a number" })
|
|
108
136
|
.min(0, "memory.v2.dense_weight must be >= 0")
|
|
109
137
|
.max(1, "memory.v2.dense_weight must be <= 1")
|
|
110
|
-
.default(0.
|
|
138
|
+
.default(0.85)
|
|
111
139
|
.describe(
|
|
112
|
-
"Weight on dense (cosine) similarity in the hybrid retrieval score",
|
|
140
|
+
"Weight on dense (cosine) similarity in the hybrid retrieval score — dense embeddings dominate the score.",
|
|
113
141
|
),
|
|
114
142
|
sparse_weight: z
|
|
115
143
|
.number({ error: "memory.v2.sparse_weight must be a number" })
|
|
116
144
|
.min(0, "memory.v2.sparse_weight must be >= 0")
|
|
117
145
|
.max(1, "memory.v2.sparse_weight must be <= 1")
|
|
118
|
-
.default(0.
|
|
146
|
+
.default(0.15)
|
|
147
|
+
.describe(
|
|
148
|
+
"Weight on sparse (BM25-style) similarity in the hybrid retrieval score — sparse acts as a discriminator for keyword-rich queries.",
|
|
149
|
+
),
|
|
150
|
+
// Adaptive sparse-weighting knobs. Both fields are intentionally
|
|
151
|
+
// optional with no default — the schema serialiser drops absent
|
|
152
|
+
// optionals so these stay invisible to operators who never tune them.
|
|
153
|
+
// The defaults live in `effectiveWeights` (sim.ts).
|
|
154
|
+
min_sparse_spread: z
|
|
155
|
+
.number({ error: "memory.v2.min_sparse_spread must be a number" })
|
|
156
|
+
.min(0, "memory.v2.min_sparse_spread must be >= 0")
|
|
157
|
+
.max(1, "memory.v2.min_sparse_spread must be <= 1")
|
|
158
|
+
.optional()
|
|
159
|
+
.describe(
|
|
160
|
+
"Adaptive sparse weighting: when the spread (max - min) of normalized sparse scores across the candidate hit set falls below this, sparse contribution collapses to 0. Linear interpolation between this and `full_sparse_spread`. Optional escape hatch — leave unset to use the built-in default.",
|
|
161
|
+
),
|
|
162
|
+
full_sparse_spread: z
|
|
163
|
+
.number({ error: "memory.v2.full_sparse_spread must be a number" })
|
|
164
|
+
.min(0, "memory.v2.full_sparse_spread must be >= 0")
|
|
165
|
+
.max(1, "memory.v2.full_sparse_spread must be <= 1")
|
|
166
|
+
.optional()
|
|
119
167
|
.describe(
|
|
120
|
-
"
|
|
168
|
+
"Adaptive sparse weighting: at or above this spread, sparse weight stays at the configured `sparse_weight`. Optional escape hatch — leave unset to use the built-in default.",
|
|
169
|
+
),
|
|
170
|
+
bm25_k1: z
|
|
171
|
+
.number({ error: "memory.v2.bm25_k1 must be a number" })
|
|
172
|
+
.min(0, "memory.v2.bm25_k1 must be >= 0")
|
|
173
|
+
.default(1.2)
|
|
174
|
+
.describe(
|
|
175
|
+
"BM25 term-frequency saturation parameter. Standard Lucene default — increase to make repeated mentions of a term matter more, decrease to flatten the curve.",
|
|
176
|
+
),
|
|
177
|
+
bm25_b: z
|
|
178
|
+
.number({ error: "memory.v2.bm25_b must be a number" })
|
|
179
|
+
.min(0, "memory.v2.bm25_b must be >= 0")
|
|
180
|
+
.max(1, "memory.v2.bm25_b must be <= 1")
|
|
181
|
+
.default(0.4)
|
|
182
|
+
.describe(
|
|
183
|
+
"BM25 document-length normalization. 0 disables length normalization, 1 fully normalizes. Lucene's default is 0.75 (tuned for narrative/web corpora); we run lower because concept-page collections include structured list pages with high information density per word — full Lucene normalization over-penalizes them.",
|
|
121
184
|
),
|
|
122
185
|
consolidation_interval_hours: z
|
|
123
186
|
.number({
|
|
@@ -148,6 +211,51 @@ export const MemoryV2ConfigSchema = z
|
|
|
148
211
|
.describe(
|
|
149
212
|
"Optional path to a file whose contents replace the bundled consolidation prompt. Absolute paths are used as-is, a leading `~/` is expanded to the home directory, otherwise the path is resolved under the workspace root. The loaded contents may include `{{CUTOFF}}`, which is substituted with the run's ISO-8601 cutoff timestamp. If the file is missing, unreadable, or empty, the bundled prompt is used and a warning is logged.",
|
|
150
213
|
),
|
|
214
|
+
rerank: z
|
|
215
|
+
.object({
|
|
216
|
+
enabled: z
|
|
217
|
+
.boolean()
|
|
218
|
+
.default(false)
|
|
219
|
+
.describe(
|
|
220
|
+
"Whether to apply cross-encoder reranking as an additive A_o boost on the user + assistant channels. Disabled by default — opt in once measured.",
|
|
221
|
+
),
|
|
222
|
+
top_k: z
|
|
223
|
+
.number()
|
|
224
|
+
.int()
|
|
225
|
+
.positive()
|
|
226
|
+
.max(200)
|
|
227
|
+
.default(50)
|
|
228
|
+
.describe(
|
|
229
|
+
"Number of candidates from the top of the pre-rerank-A_o pool to send through the reranker. Tail candidates contribute zero rerank boost and keep their pure fused activation.",
|
|
230
|
+
),
|
|
231
|
+
alpha: z
|
|
232
|
+
.number()
|
|
233
|
+
.min(0)
|
|
234
|
+
.max(1)
|
|
235
|
+
.default(0.3)
|
|
236
|
+
.describe(
|
|
237
|
+
"Per-channel rerank weight: each top-K slug gets `alpha · normalized_rerank` added to A_o weighted by `c_user` (user channel) or `c_assistant` (assistant channel). Top reranker hit can lift A_o by up to `(c_user + c_assistant) · alpha`; bottom of top_k stays roughly unchanged.",
|
|
238
|
+
),
|
|
239
|
+
model: z
|
|
240
|
+
.string()
|
|
241
|
+
.default(DEFAULT_RERANK_MODEL)
|
|
242
|
+
.describe(
|
|
243
|
+
"HuggingFace model id for the cross-encoder. Must have an ONNX export reachable from huggingface.co/<model>/resolve/main/onnx/model.onnx.",
|
|
244
|
+
),
|
|
245
|
+
dtype: RerankDtypeEnum.default("q8").describe(
|
|
246
|
+
"ONNX weight precision passed to `@huggingface/transformers`. `q8` (int8) is ~3× faster than `fp32` on CPU with negligible reranker accuracy loss. The worker fails to spawn if the configured model has no matching quantized export — `reranker.ts` then falls back to pure fused scores for the turn.",
|
|
247
|
+
),
|
|
248
|
+
})
|
|
249
|
+
.default({
|
|
250
|
+
enabled: false,
|
|
251
|
+
top_k: 50,
|
|
252
|
+
alpha: 0.3,
|
|
253
|
+
model: DEFAULT_RERANK_MODEL,
|
|
254
|
+
dtype: "q8",
|
|
255
|
+
})
|
|
256
|
+
.describe(
|
|
257
|
+
"Cross-encoder rerank configuration. When enabled, picks the top-K candidates by pre-rerank A_o, runs the cross-encoder once per channel (user, assistant) on that unified set, and adds an alpha-weighted normalized boost to A_o for each scored slug.",
|
|
258
|
+
),
|
|
151
259
|
})
|
|
152
260
|
.describe(
|
|
153
261
|
"Memory v2 — concept-page activation model with hourly LLM-driven consolidation",
|
|
@@ -1,5 +1,41 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
|
+
const IANA_TIMEZONE_IDENTIFIER_RE =
|
|
4
|
+
/^(?:UTC|[A-Za-z][A-Za-z0-9_+-]*(?:\/[A-Za-z0-9_+-]+)+)$/;
|
|
5
|
+
|
|
6
|
+
function canonicalizeIanaTimezone(timezone: string): string | null {
|
|
7
|
+
const trimmed = timezone.trim();
|
|
8
|
+
if (trimmed.length === 0) {
|
|
9
|
+
return "";
|
|
10
|
+
}
|
|
11
|
+
if (!IANA_TIMEZONE_IDENTIFIER_RE.test(trimmed)) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
16
|
+
timeZone: trimmed,
|
|
17
|
+
}).resolvedOptions().timeZone;
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function timezoneConfigField(path: string) {
|
|
24
|
+
return z
|
|
25
|
+
.string({ error: `${path} must be a string` })
|
|
26
|
+
.transform((value, ctx) => {
|
|
27
|
+
const canonical = canonicalizeIanaTimezone(value);
|
|
28
|
+
if (canonical === null) {
|
|
29
|
+
ctx.addIssue({
|
|
30
|
+
code: "custom",
|
|
31
|
+
message: `${path} must be a valid IANA timezone identifier or an empty string`,
|
|
32
|
+
});
|
|
33
|
+
return z.NEVER;
|
|
34
|
+
}
|
|
35
|
+
return canonical;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
3
39
|
export const PlatformConfigSchema = z
|
|
4
40
|
.object({
|
|
5
41
|
baseUrl: z
|
|
@@ -10,6 +46,12 @@ export const PlatformConfigSchema = z
|
|
|
10
46
|
)
|
|
11
47
|
.default("")
|
|
12
48
|
.describe("Base URL of the Vellum platform API"),
|
|
49
|
+
subdomain: z
|
|
50
|
+
.string({ error: "platform.subdomain must be a string" })
|
|
51
|
+
.default("")
|
|
52
|
+
.describe(
|
|
53
|
+
"Registered subdomain on vellum.me (e.g. 'apollobot' → apollobot.vellum.me). Set automatically by 'assistant domain register'.",
|
|
54
|
+
),
|
|
13
55
|
})
|
|
14
56
|
.describe("Vellum platform connection settings");
|
|
15
57
|
|
|
@@ -50,11 +92,15 @@ export const DaemonConfigSchema = z
|
|
|
50
92
|
|
|
51
93
|
export const UiConfigSchema = z
|
|
52
94
|
.object({
|
|
53
|
-
userTimezone:
|
|
54
|
-
.
|
|
95
|
+
userTimezone: timezoneConfigField("ui.userTimezone")
|
|
96
|
+
.optional()
|
|
97
|
+
.describe(
|
|
98
|
+
"Manual IANA timezone override used for assistant temporal grounding and date/time display (e.g. 'America/New_York'). Use an empty string to clear the setting.",
|
|
99
|
+
),
|
|
100
|
+
detectedTimezone: timezoneConfigField("ui.detectedTimezone")
|
|
55
101
|
.optional()
|
|
56
102
|
.describe(
|
|
57
|
-
"IANA timezone identifier for
|
|
103
|
+
"IANA timezone identifier detected from the client environment for assistant temporal grounding when no manual override is configured (e.g. 'America/New_York'). Use an empty string to clear the setting.",
|
|
58
104
|
),
|
|
59
105
|
})
|
|
60
106
|
.describe(
|