@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,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Workspace migration 022: Move hooks directory from root to workspace.
|
|
3
3
|
*
|
|
4
|
-
* Previously, `~/.vellum/hooks/` lived directly under
|
|
4
|
+
* Previously, `~/.vellum/hooks/` lived directly under the Vellum root. This
|
|
5
5
|
* migration moves existing hook directories and files into
|
|
6
6
|
* `~/.vellum/workspace/hooks/` so that getWorkspaceHooksDir() resolves
|
|
7
7
|
* correctly under the workspace.
|
|
@@ -19,23 +19,17 @@ import {
|
|
|
19
19
|
renameSync,
|
|
20
20
|
rmSync,
|
|
21
21
|
} from "node:fs";
|
|
22
|
-
import { homedir } from "node:os";
|
|
23
22
|
import { join } from "node:path";
|
|
24
23
|
|
|
25
24
|
import type { WorkspaceMigration } from "./types.js";
|
|
26
|
-
|
|
27
|
-
/** Inlined from platform.ts to satisfy migration self-containment rule (AGENTS.md). */
|
|
28
|
-
function getRootDir(): string {
|
|
29
|
-
const base = process.env.BASE_DATA_DIR?.trim() || homedir();
|
|
30
|
-
return join(base, ".vellum");
|
|
31
|
-
}
|
|
25
|
+
import { getVellumRoot } from "./utils.js";
|
|
32
26
|
|
|
33
27
|
export const moveHooksToWorkspaceMigration: WorkspaceMigration = {
|
|
34
28
|
id: "022-move-hooks-to-workspace",
|
|
35
29
|
description: "Move hooks directory from root to workspace",
|
|
36
30
|
|
|
37
31
|
run(workspaceDir: string): void {
|
|
38
|
-
const oldHooksDir = join(
|
|
32
|
+
const oldHooksDir = join(getVellumRoot(), "hooks");
|
|
39
33
|
const newHooksDir = join(workspaceDir, "hooks");
|
|
40
34
|
|
|
41
35
|
mkdirSync(newHooksDir, { recursive: true });
|
|
@@ -65,7 +59,7 @@ export const moveHooksToWorkspaceMigration: WorkspaceMigration = {
|
|
|
65
59
|
},
|
|
66
60
|
|
|
67
61
|
down(workspaceDir: string): void {
|
|
68
|
-
const oldHooksDir = join(
|
|
62
|
+
const oldHooksDir = join(getVellumRoot(), "hooks");
|
|
69
63
|
const newHooksDir = join(workspaceDir, "hooks");
|
|
70
64
|
|
|
71
65
|
mkdirSync(oldHooksDir, { recursive: true });
|
|
@@ -2,23 +2,16 @@
|
|
|
2
2
|
* Workspace migration 023: Move config/state JSON files from root to workspace.
|
|
3
3
|
*
|
|
4
4
|
* Previously, dictation-profiles.json, email-guardrails.json, and
|
|
5
|
-
* active-call-leases.json lived directly under
|
|
5
|
+
* active-call-leases.json lived directly under the Vellum root (~/.vellum/).
|
|
6
6
|
* This migration moves them into the workspace directory so they follow
|
|
7
7
|
* the workspace convention for organizational consistency.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { existsSync, renameSync, unlinkSync } from "node:fs";
|
|
11
|
-
import { homedir } from "node:os";
|
|
12
11
|
import { join } from "node:path";
|
|
13
12
|
|
|
14
13
|
import type { WorkspaceMigration } from "./types.js";
|
|
15
|
-
|
|
16
|
-
/** Inlined from platform.ts to satisfy migration self-containment rule (AGENTS.md). */
|
|
17
|
-
function getRootDir(): string {
|
|
18
|
-
const base = process.env.BASE_DATA_DIR?.trim() || homedir();
|
|
19
|
-
return join(base, ".vellum");
|
|
20
|
-
}
|
|
21
|
-
|
|
14
|
+
import { getVellumRoot } from "./utils.js";
|
|
22
15
|
/** Files to move from root → workspace. */
|
|
23
16
|
const CONFIG_FILES = [
|
|
24
17
|
"dictation-profiles.json",
|
|
@@ -32,7 +25,7 @@ export const moveConfigFilesToWorkspaceMigration: WorkspaceMigration = {
|
|
|
32
25
|
"Move dictation-profiles, email-guardrails, and active-call-leases from root to workspace",
|
|
33
26
|
|
|
34
27
|
run(workspaceDir: string): void {
|
|
35
|
-
const rootDir =
|
|
28
|
+
const rootDir = getVellumRoot();
|
|
36
29
|
|
|
37
30
|
for (const file of CONFIG_FILES) {
|
|
38
31
|
const oldPath = join(rootDir, file);
|
|
@@ -60,7 +53,7 @@ export const moveConfigFilesToWorkspaceMigration: WorkspaceMigration = {
|
|
|
60
53
|
},
|
|
61
54
|
|
|
62
55
|
down(workspaceDir: string): void {
|
|
63
|
-
const rootDir =
|
|
56
|
+
const rootDir = getVellumRoot();
|
|
64
57
|
|
|
65
58
|
for (const file of CONFIG_FILES) {
|
|
66
59
|
const newPath = join(workspaceDir, file);
|
|
@@ -25,17 +25,10 @@ import {
|
|
|
25
25
|
renameSync,
|
|
26
26
|
unlinkSync,
|
|
27
27
|
} from "node:fs";
|
|
28
|
-
import { homedir } from "node:os";
|
|
29
28
|
import { join } from "node:path";
|
|
30
29
|
|
|
31
30
|
import type { WorkspaceMigration } from "./types.js";
|
|
32
|
-
|
|
33
|
-
/** Inlined from platform.ts to satisfy migration self-containment rule (AGENTS.md). */
|
|
34
|
-
function getRootDir(): string {
|
|
35
|
-
const base = process.env.BASE_DATA_DIR?.trim() || homedir();
|
|
36
|
-
return join(base, ".vellum");
|
|
37
|
-
}
|
|
38
|
-
|
|
31
|
+
import { getVellumRoot } from "./utils.js";
|
|
39
32
|
/** Individual files to move from root → workspace (with optional subdirectory). */
|
|
40
33
|
const FILE_MOVES: Array<{ name: string; subdir?: string }> = [
|
|
41
34
|
{ name: "daemon-stderr.log", subdir: "logs" },
|
|
@@ -93,7 +86,7 @@ export const moveRuntimeFilesToWorkspaceMigration: WorkspaceMigration = {
|
|
|
93
86
|
"Move daemon-stderr.log, daemon-startup.lock, embed-worker.pid, external/, and bin/ from root to workspace",
|
|
94
87
|
|
|
95
88
|
run(workspaceDir: string): void {
|
|
96
|
-
const rootDir =
|
|
89
|
+
const rootDir = getVellumRoot();
|
|
97
90
|
|
|
98
91
|
// Move individual files
|
|
99
92
|
for (const { name, subdir } of FILE_MOVES) {
|
|
@@ -110,7 +103,7 @@ export const moveRuntimeFilesToWorkspaceMigration: WorkspaceMigration = {
|
|
|
110
103
|
},
|
|
111
104
|
|
|
112
105
|
down(workspaceDir: string): void {
|
|
113
|
-
const rootDir =
|
|
106
|
+
const rootDir = getVellumRoot();
|
|
114
107
|
|
|
115
108
|
// Move individual files back
|
|
116
109
|
for (const { name, subdir } of FILE_MOVES) {
|
|
@@ -22,8 +22,9 @@ import type { WorkspaceMigration } from "./types.js";
|
|
|
22
22
|
* 2. **Fresh install** (config.json absent): write a minimal starter
|
|
23
23
|
* config with just the callSite seeds, using the default provider
|
|
24
24
|
* (anthropic — same as the schema default). `loadConfig()` runs
|
|
25
|
-
* after migrations and
|
|
26
|
-
*
|
|
25
|
+
* after migrations and applies schema defaults only to the
|
|
26
|
+
* in-memory config (disk is left untouched), so our seeded
|
|
27
|
+
* callSites are preserved verbatim.
|
|
27
28
|
*
|
|
28
29
|
* Without the fresh-install branch, new users permanently fall through
|
|
29
30
|
* to `llm.default` (opus + max effort) because `LLMSchema.callSites`
|
|
@@ -12,7 +12,8 @@ import type { WorkspaceMigration } from "./types.js";
|
|
|
12
12
|
* `llm.callSites` without overwriting a user-defined override.
|
|
13
13
|
* 2. **Fresh install** (config.json absent): write a minimal starter
|
|
14
14
|
* config with just this seed. `loadConfig()` runs after migrations
|
|
15
|
-
* and
|
|
15
|
+
* and applies schema defaults to the in-memory config without
|
|
16
|
+
* rewriting disk, so the seeded callSite is preserved as-is.
|
|
16
17
|
*
|
|
17
18
|
* Applied only when:
|
|
18
19
|
* - the resolved provider is Anthropic (other providers own their
|
|
@@ -7,22 +7,17 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { existsSync, renameSync, unlinkSync } from "node:fs";
|
|
10
|
-
import { homedir } from "node:os";
|
|
11
10
|
import { join } from "node:path";
|
|
12
11
|
|
|
13
12
|
import type { WorkspaceMigration } from "./types.js";
|
|
14
|
-
|
|
15
|
-
function getRootDir(): string {
|
|
16
|
-
const base = process.env.BASE_DATA_DIR?.trim() || homedir();
|
|
17
|
-
return join(base, ".vellum");
|
|
18
|
-
}
|
|
13
|
+
import { getVellumRoot } from "./utils.js";
|
|
19
14
|
|
|
20
15
|
export const movePidToWorkspaceMigration: WorkspaceMigration = {
|
|
21
16
|
id: "059-move-pid-to-workspace",
|
|
22
17
|
description: "Move vellum.pid from root to workspace",
|
|
23
18
|
|
|
24
19
|
run(workspaceDir: string): void {
|
|
25
|
-
const oldPath = join(
|
|
20
|
+
const oldPath = join(getVellumRoot(), "vellum.pid");
|
|
26
21
|
const newPath = join(workspaceDir, "vellum.pid");
|
|
27
22
|
if (!existsSync(oldPath)) return;
|
|
28
23
|
if (existsSync(newPath)) {
|
|
@@ -37,7 +32,7 @@ export const movePidToWorkspaceMigration: WorkspaceMigration = {
|
|
|
37
32
|
},
|
|
38
33
|
|
|
39
34
|
down(workspaceDir: string): void {
|
|
40
|
-
const oldPath = join(
|
|
35
|
+
const oldPath = join(getVellumRoot(), "vellum.pid");
|
|
41
36
|
const newPath = join(workspaceDir, "vellum.pid");
|
|
42
37
|
if (!existsSync(newPath)) return;
|
|
43
38
|
if (existsSync(oldPath)) {
|
|
@@ -11,22 +11,17 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { copyFileSync, existsSync, unlinkSync } from "node:fs";
|
|
14
|
-
import { homedir } from "node:os";
|
|
15
14
|
import { join } from "node:path";
|
|
16
15
|
|
|
17
16
|
import type { WorkspaceMigration } from "./types.js";
|
|
18
|
-
|
|
19
|
-
function getRootDir(): string {
|
|
20
|
-
const base = process.env.BASE_DATA_DIR?.trim() || homedir();
|
|
21
|
-
return join(base, ".vellum");
|
|
22
|
-
}
|
|
17
|
+
import { getVellumRoot } from "./utils.js";
|
|
23
18
|
|
|
24
19
|
export const moveBackupKeyToWorkspaceMigration: WorkspaceMigration = {
|
|
25
20
|
id: "061-move-backup-key-to-workspace",
|
|
26
21
|
description: "Move backup.key from protected/ to workspace",
|
|
27
22
|
|
|
28
23
|
run(workspaceDir: string): void {
|
|
29
|
-
const oldPath = join(
|
|
24
|
+
const oldPath = join(getVellumRoot(), "protected", "backup.key");
|
|
30
25
|
const newPath = join(workspaceDir, ".backup.key");
|
|
31
26
|
if (!existsSync(oldPath)) return;
|
|
32
27
|
if (existsSync(newPath)) {
|
|
@@ -42,7 +37,7 @@ export const moveBackupKeyToWorkspaceMigration: WorkspaceMigration = {
|
|
|
42
37
|
},
|
|
43
38
|
|
|
44
39
|
down(workspaceDir: string): void {
|
|
45
|
-
const oldPath = join(
|
|
40
|
+
const oldPath = join(getVellumRoot(), "protected", "backup.key");
|
|
46
41
|
const newPath = join(workspaceDir, ".backup.key");
|
|
47
42
|
if (!existsSync(newPath)) return;
|
|
48
43
|
if (existsSync(oldPath)) {
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
5
|
+
|
|
6
|
+
const THIRTY_MINUTES_MS = 30 * 60 * 1000;
|
|
7
|
+
const LEGACY_DEFAULT_INTERVALS_MS = new Set([
|
|
8
|
+
3 * 60 * 60 * 1000,
|
|
9
|
+
6 * 60 * 60 * 1000,
|
|
10
|
+
]);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Bump stale baked heartbeat defaults to 30 minutes.
|
|
14
|
+
*
|
|
15
|
+
* Older first-launch config files materialized the then-current heartbeat
|
|
16
|
+
* default into `config.json`, so changing the schema default alone would not
|
|
17
|
+
* affect existing default users. A workspace could have intentionally selected
|
|
18
|
+
* one of these exact intervals; product intent is still to move legacy 3h/6h
|
|
19
|
+
* heartbeat schedules to the 30-minute default, and those users can reset the
|
|
20
|
+
* interval after upgrade.
|
|
21
|
+
*/
|
|
22
|
+
export const bumpStaleHeartbeatIntervalMigration: WorkspaceMigration = {
|
|
23
|
+
id: "065-bump-stale-heartbeat-interval",
|
|
24
|
+
description:
|
|
25
|
+
"Bump legacy heartbeat.intervalMs defaults of 3h/6h to the current 30-minute default",
|
|
26
|
+
run(workspaceDir: string): void {
|
|
27
|
+
const configPath = join(workspaceDir, "config.json");
|
|
28
|
+
if (!existsSync(configPath)) return;
|
|
29
|
+
|
|
30
|
+
let config: Record<string, unknown>;
|
|
31
|
+
try {
|
|
32
|
+
const raw = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
33
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return;
|
|
34
|
+
config = raw as Record<string, unknown>;
|
|
35
|
+
} catch {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const heartbeat = config.heartbeat;
|
|
40
|
+
if (!heartbeat || typeof heartbeat !== "object" || Array.isArray(heartbeat))
|
|
41
|
+
return;
|
|
42
|
+
|
|
43
|
+
const heartbeatConfig = heartbeat as Record<string, unknown>;
|
|
44
|
+
const intervalMs = heartbeatConfig.intervalMs;
|
|
45
|
+
if (
|
|
46
|
+
typeof intervalMs !== "number" ||
|
|
47
|
+
!LEGACY_DEFAULT_INTERVALS_MS.has(intervalMs)
|
|
48
|
+
) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
heartbeatConfig.intervalMs = THIRTY_MINUTES_MS;
|
|
53
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
54
|
+
},
|
|
55
|
+
down(_workspaceDir: string): void {
|
|
56
|
+
// Forward-only: the stale value may have been a schema-default artifact,
|
|
57
|
+
// while 30 minutes may also have been explicitly configured later. Without
|
|
58
|
+
// per-workspace state we cannot safely distinguish those cases.
|
|
59
|
+
},
|
|
60
|
+
};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Seed a cheap, bounded default for the `heartbeatAgent` LLM call site.
|
|
8
|
+
*
|
|
9
|
+
* Heartbeats are default-on and now run frequently, so they should not inherit
|
|
10
|
+
* the workspace's active chat profile. The default managed profile is Sonnet
|
|
11
|
+
* with high effort and thinking enabled, which is appropriate for interactive
|
|
12
|
+
* chat but too expensive for a periodic background triage pass.
|
|
13
|
+
*
|
|
14
|
+
* Preserve user-owned model selection. If `heartbeatAgent` already has a
|
|
15
|
+
* `profile`, `provider`, or `model`, this migration leaves the entry unchanged
|
|
16
|
+
* so call-site leaves do not silently override the selected profile/model.
|
|
17
|
+
* Speed-only legacy entries from migration 038 are treated as defaultable.
|
|
18
|
+
*/
|
|
19
|
+
export const seedHeartbeatCallsiteCostDefaultMigration: WorkspaceMigration = {
|
|
20
|
+
id: "066-seed-heartbeat-callsite-cost-default",
|
|
21
|
+
description:
|
|
22
|
+
"Seed cost-optimized defaults for the heartbeatAgent LLM call site",
|
|
23
|
+
run(workspaceDir: string): void {
|
|
24
|
+
if (process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH) return;
|
|
25
|
+
|
|
26
|
+
const configPath = join(workspaceDir, "config.json");
|
|
27
|
+
const configExisted = existsSync(configPath);
|
|
28
|
+
|
|
29
|
+
let config: Record<string, unknown> = {};
|
|
30
|
+
if (configExisted) {
|
|
31
|
+
try {
|
|
32
|
+
const raw = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
33
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return;
|
|
34
|
+
config = raw as Record<string, unknown>;
|
|
35
|
+
} catch {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const llm = readObject(config.llm) ?? {};
|
|
41
|
+
const defaultBlock = readObject(llm.default);
|
|
42
|
+
const provider = readString(defaultBlock?.provider) ?? "anthropic";
|
|
43
|
+
const cheapModel = resolveCheapModel(provider);
|
|
44
|
+
if (cheapModel === undefined) return;
|
|
45
|
+
|
|
46
|
+
const callSites = readObject(llm.callSites) ?? {};
|
|
47
|
+
const existing = readObject(callSites.heartbeatAgent) ?? {};
|
|
48
|
+
if (hasExplicitModelSelection(existing)) return;
|
|
49
|
+
|
|
50
|
+
const seeded: Record<string, unknown> = { ...existing };
|
|
51
|
+
let changed = false;
|
|
52
|
+
|
|
53
|
+
const profiles = readObject(llm.profiles) ?? {};
|
|
54
|
+
const costProfile = readObject(profiles["cost-optimized"]);
|
|
55
|
+
if (readString(costProfile?.provider) === provider) {
|
|
56
|
+
seeded.profile = "cost-optimized";
|
|
57
|
+
} else {
|
|
58
|
+
seeded.provider = provider;
|
|
59
|
+
seeded.model = cheapModel;
|
|
60
|
+
}
|
|
61
|
+
changed = true;
|
|
62
|
+
|
|
63
|
+
changed = seedMissingLeaf(seeded, "maxTokens", 2048) || changed;
|
|
64
|
+
changed = seedMissingLeaf(seeded, "effort", "low") || changed;
|
|
65
|
+
changed = seedMissingLeaf(seeded, "temperature", 0) || changed;
|
|
66
|
+
|
|
67
|
+
const thinking = readObject(seeded.thinking) ?? {};
|
|
68
|
+
const seededThinking = { ...thinking };
|
|
69
|
+
const enabledChanged = seedMissingLeaf(seededThinking, "enabled", false);
|
|
70
|
+
const streamThinkingChanged = seedMissingLeaf(
|
|
71
|
+
seededThinking,
|
|
72
|
+
"streamThinking",
|
|
73
|
+
false,
|
|
74
|
+
);
|
|
75
|
+
const thinkingChanged = enabledChanged || streamThinkingChanged;
|
|
76
|
+
if (thinkingChanged || readObject(seeded.thinking) === null) {
|
|
77
|
+
seeded.thinking = seededThinking;
|
|
78
|
+
changed = true;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const contextWindow = readObject(seeded.contextWindow) ?? {};
|
|
82
|
+
const seededContextWindow = { ...contextWindow };
|
|
83
|
+
const contextChanged = seedMissingLeaf(
|
|
84
|
+
seededContextWindow,
|
|
85
|
+
"maxInputTokens",
|
|
86
|
+
16_000,
|
|
87
|
+
);
|
|
88
|
+
if (contextChanged || readObject(seeded.contextWindow) === null) {
|
|
89
|
+
seeded.contextWindow = seededContextWindow;
|
|
90
|
+
changed = true;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!changed) return;
|
|
94
|
+
|
|
95
|
+
callSites.heartbeatAgent = seeded;
|
|
96
|
+
llm.callSites = callSites;
|
|
97
|
+
config.llm = llm;
|
|
98
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
99
|
+
},
|
|
100
|
+
down(_workspaceDir: string): void {
|
|
101
|
+
// Forward-only: removing the seeded default would make frequent
|
|
102
|
+
// heartbeats inherit the user's potentially expensive chat profile again.
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// Helpers — self-contained per workspace migrations AGENTS.md
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
|
|
110
|
+
const CHEAP_MODELS_BY_PROVIDER: Record<string, string> = {
|
|
111
|
+
anthropic: "claude-haiku-4-5-20251001",
|
|
112
|
+
openai: "gpt-5.4-nano",
|
|
113
|
+
gemini: "gemini-3-flash",
|
|
114
|
+
ollama: "llama3.2",
|
|
115
|
+
fireworks: "accounts/fireworks/models/kimi-k2p5",
|
|
116
|
+
openrouter: "anthropic/claude-haiku-4.5",
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
function resolveCheapModel(provider: string): string | undefined {
|
|
120
|
+
return CHEAP_MODELS_BY_PROVIDER[provider];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function hasExplicitModelSelection(value: Record<string, unknown>): boolean {
|
|
124
|
+
return "profile" in value || "provider" in value || "model" in value;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function seedMissingLeaf(
|
|
128
|
+
target: Record<string, unknown>,
|
|
129
|
+
key: string,
|
|
130
|
+
value: unknown,
|
|
131
|
+
): boolean {
|
|
132
|
+
if (key in target) return false;
|
|
133
|
+
target[key] = value;
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function readObject(value: unknown): Record<string, unknown> | null {
|
|
138
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return value as Record<string, unknown>;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function readString(value: unknown): string | undefined {
|
|
145
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
146
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import {
|
|
2
|
+
appendFileSync,
|
|
3
|
+
existsSync,
|
|
4
|
+
readFileSync,
|
|
5
|
+
writeFileSync,
|
|
6
|
+
} from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
|
|
9
|
+
import { getLogger } from "../../util/logger.js";
|
|
10
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
11
|
+
|
|
12
|
+
const log = getLogger(
|
|
13
|
+
"workspace-migration-067-release-notes-safe-storage-limits",
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
const MIGRATION_ID = "067-release-notes-safe-storage-limits";
|
|
17
|
+
const MARKER = `<!-- release-note-id:${MIGRATION_ID} -->`;
|
|
18
|
+
|
|
19
|
+
const RELEASE_NOTE = `${MARKER}
|
|
20
|
+
## Safe storage limits
|
|
21
|
+
|
|
22
|
+
A new storage protection mode is available behind the safe-storage-limits
|
|
23
|
+
rollout flag. When enabled, the assistant watches workspace disk usage and
|
|
24
|
+
enters cleanup mode if the volume reaches the critical 95% threshold.
|
|
25
|
+
|
|
26
|
+
In cleanup mode, background processes pause and remote messages, including
|
|
27
|
+
trusted-contact messages, are blocked until the guardian frees enough space or
|
|
28
|
+
explicitly overrides the lock. The macOS app now shows a storage cleanup banner
|
|
29
|
+
that must be acknowledged before cleanup chat continues, then keeps a status
|
|
30
|
+
banner visible while cleanup mode is active.
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
export const releaseNotesSafeStorageLimitsMigration: WorkspaceMigration = {
|
|
34
|
+
id: MIGRATION_ID,
|
|
35
|
+
description: "Append release notes for safe storage limits to UPDATES.md",
|
|
36
|
+
|
|
37
|
+
run(workspaceDir: string): void {
|
|
38
|
+
const updatesPath = join(workspaceDir, "UPDATES.md");
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
if (existsSync(updatesPath)) {
|
|
42
|
+
const existing = readFileSync(updatesPath, "utf-8");
|
|
43
|
+
if (existing.includes(MARKER)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const needsLeadingNewline = !existing.endsWith("\n\n");
|
|
47
|
+
const prefix = existing.endsWith("\n") ? "\n" : "\n\n";
|
|
48
|
+
appendFileSync(
|
|
49
|
+
updatesPath,
|
|
50
|
+
needsLeadingNewline ? `${prefix}${RELEASE_NOTE}` : RELEASE_NOTE,
|
|
51
|
+
"utf-8",
|
|
52
|
+
);
|
|
53
|
+
} else {
|
|
54
|
+
writeFileSync(updatesPath, RELEASE_NOTE, "utf-8");
|
|
55
|
+
}
|
|
56
|
+
log.info(
|
|
57
|
+
{ path: updatesPath },
|
|
58
|
+
"Appended safe storage limits release note",
|
|
59
|
+
);
|
|
60
|
+
} catch (err) {
|
|
61
|
+
log.warn(
|
|
62
|
+
{ err, path: updatesPath },
|
|
63
|
+
"Failed to append safe storage limits release note to UPDATES.md",
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
down(_workspaceDir: string): void {
|
|
69
|
+
// Forward-only: UPDATES.md is a user-facing bulletin the assistant
|
|
70
|
+
// processes and deletes on its own.
|
|
71
|
+
},
|
|
72
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
appendFileSync,
|
|
3
|
+
existsSync,
|
|
4
|
+
readFileSync,
|
|
5
|
+
writeFileSync,
|
|
6
|
+
} from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
|
|
9
|
+
import { getLogger } from "../../util/logger.js";
|
|
10
|
+
import type { WorkspaceMigration } from "./types.js";
|
|
11
|
+
|
|
12
|
+
const log = getLogger("workspace-migration-068-release-notes-local-timezone");
|
|
13
|
+
|
|
14
|
+
const MIGRATION_ID = "068-release-notes-local-timezone";
|
|
15
|
+
const MARKER = `<!-- release-note-id:${MIGRATION_ID} -->`;
|
|
16
|
+
|
|
17
|
+
const RELEASE_NOTE = `${MARKER}
|
|
18
|
+
## Local timezone grounding
|
|
19
|
+
|
|
20
|
+
The assistant now grounds \`current_time\` in your local timezone across clients,
|
|
21
|
+
instead of falling back to UTC when the client can report the device timezone.
|
|
22
|
+
|
|
23
|
+
Manual timezone overrides still win when configured, and the assistant can help
|
|
24
|
+
update a stale override after you confirm that your device timezone should be
|
|
25
|
+
used going forward.
|
|
26
|
+
`;
|
|
27
|
+
|
|
28
|
+
export const releaseNotesLocalTimezoneMigration: WorkspaceMigration = {
|
|
29
|
+
id: MIGRATION_ID,
|
|
30
|
+
description:
|
|
31
|
+
"Append release notes for local timezone grounding to UPDATES.md",
|
|
32
|
+
|
|
33
|
+
run(workspaceDir: string): void {
|
|
34
|
+
const updatesPath = join(workspaceDir, "UPDATES.md");
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
if (existsSync(updatesPath)) {
|
|
38
|
+
const existing = readFileSync(updatesPath, "utf-8");
|
|
39
|
+
if (existing.includes(MARKER)) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const needsLeadingNewline = !existing.endsWith("\n\n");
|
|
43
|
+
const prefix = existing.endsWith("\n") ? "\n" : "\n\n";
|
|
44
|
+
appendFileSync(
|
|
45
|
+
updatesPath,
|
|
46
|
+
needsLeadingNewline ? `${prefix}${RELEASE_NOTE}` : RELEASE_NOTE,
|
|
47
|
+
"utf-8",
|
|
48
|
+
);
|
|
49
|
+
} else {
|
|
50
|
+
writeFileSync(updatesPath, RELEASE_NOTE, "utf-8");
|
|
51
|
+
}
|
|
52
|
+
log.info({ path: updatesPath }, "Appended local timezone release note");
|
|
53
|
+
} catch (err) {
|
|
54
|
+
log.warn(
|
|
55
|
+
{ err, path: updatesPath },
|
|
56
|
+
"Failed to append local timezone release note to UPDATES.md",
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
down(_workspaceDir: string): void {
|
|
62
|
+
// Forward-only: UPDATES.md is a user-facing bulletin the assistant
|
|
63
|
+
// processes and deletes on its own.
|
|
64
|
+
},
|
|
65
|
+
};
|
|
@@ -6,6 +6,6 @@ Each migration file must be **fully self-contained**. All helper functions, cons
|
|
|
6
6
|
|
|
7
7
|
- **No external exports.** Migration files must not export anything other than the single `WorkspaceMigration` object. Other code must never import from a migration file.
|
|
8
8
|
- **Duplicate rather than share.** If two migrations need the same helper, duplicate it in both files. Migrations are write-once code — they run once per assistant and are never modified after release. Duplication is preferable to coupling.
|
|
9
|
-
- **Allowed imports:** `./types.js` (for the `WorkspaceMigration` interface), `../../util/logger.js` (for structured logging), and Node/Bun runtime built-ins (`node:fs`, `node:path`, `node:crypto`, `bun:sqlite`, etc.). All other dependencies — both project-internal modules and third-party npm packages — must be inlined. Do not import from shared modules like `../../memory/` or `../../config/`, and do not add npm dependencies.
|
|
9
|
+
- **Allowed imports:** `./types.js` (for the `WorkspaceMigration` interface), `./utils.js` (for shared path-resolution helpers like `getVellumRoot()`), `../../util/logger.js` (for structured logging), and Node/Bun runtime built-ins (`node:fs`, `node:path`, `node:crypto`, `bun:sqlite`, etc.). All other dependencies — both project-internal modules and third-party npm packages — must be inlined. Do not import from shared modules like `../../memory/` or `../../config/`, and do not add npm dependencies.
|
|
10
10
|
- **Graceful on all platforms.** Migrations run on macOS, Linux, and in Docker. Platform-specific operations must no-op gracefully on unsupported platforms — never throw.
|
|
11
11
|
- **Idempotent.** Migrations must be safe to re-run if interrupted. The runner checkpoints state as `"started"` before execution and `"completed"` after, so a crash mid-migration triggers a re-run on next startup.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Workspace migration: Migrate workspace data from /data to /workspace volume.
|
|
3
3
|
*
|
|
4
4
|
* In the old Docker volume layout, workspace data lived at
|
|
5
|
-
*
|
|
5
|
+
* `<vellumRoot>/workspace`. In the new layout, VELLUM_WORKSPACE_DIR points
|
|
6
6
|
* to a dedicated volume (e.g. `/workspace`). On first boot with the new layout,
|
|
7
7
|
* this migration copies existing workspace data from the old location to the
|
|
8
8
|
* new volume so nothing is lost.
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
import { join } from "node:path";
|
|
25
25
|
|
|
26
26
|
import type { WorkspaceMigration } from "./types.js";
|
|
27
|
+
import { getVellumRoot } from "./utils.js";
|
|
27
28
|
|
|
28
29
|
const SENTINEL_FILENAME = ".workspace-volume-migrated";
|
|
29
30
|
|
|
@@ -68,15 +69,8 @@ export const migrateToWorkspaceVolumeMigration: WorkspaceMigration = {
|
|
|
68
69
|
return;
|
|
69
70
|
}
|
|
70
71
|
|
|
71
|
-
// Resolve the old workspace location:
|
|
72
|
-
const
|
|
73
|
-
if (!baseDataDir) {
|
|
74
|
-
// No BASE_DATA_DIR means there's no old location to migrate from
|
|
75
|
-
writeSentinel(sentinelPath);
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const oldWorkspaceDir = join(baseDataDir, ".vellum", "workspace");
|
|
72
|
+
// Resolve the old workspace location: <vellumRoot>/workspace
|
|
73
|
+
const oldWorkspaceDir = join(getVellumRoot(), "workspace");
|
|
80
74
|
|
|
81
75
|
// If the old workspace doesn't exist or is empty, nothing to migrate
|
|
82
76
|
if (!existsSync(oldWorkspaceDir)) {
|
|
@@ -62,6 +62,10 @@ import { moveBackupKeyToWorkspaceMigration } from "./061-move-backup-key-to-work
|
|
|
62
62
|
import { dropMemoryV2EdgesJsonMigration } from "./062-drop-memory-v2-edges-json.js";
|
|
63
63
|
import { releaseNotesDynamicModelContextMigration } from "./063-release-notes-dynamic-model-context.js";
|
|
64
64
|
import { unwindMainAgentOpusSeedMigration } from "./064-unwind-main-agent-opus-seed.js";
|
|
65
|
+
import { bumpStaleHeartbeatIntervalMigration } from "./065-bump-stale-heartbeat-interval.js";
|
|
66
|
+
import { seedHeartbeatCallsiteCostDefaultMigration } from "./066-seed-heartbeat-callsite-cost-default.js";
|
|
67
|
+
import { releaseNotesSafeStorageLimitsMigration } from "./067-release-notes-safe-storage-limits.js";
|
|
68
|
+
import { releaseNotesLocalTimezoneMigration } from "./068-release-notes-local-timezone.js";
|
|
65
69
|
import { migrateToWorkspaceVolumeMigration } from "./migrate-to-workspace-volume.js";
|
|
66
70
|
import type { WorkspaceMigration } from "./types.js";
|
|
67
71
|
|
|
@@ -135,4 +139,8 @@ export const WORKSPACE_MIGRATIONS: WorkspaceMigration[] = [
|
|
|
135
139
|
dropMemoryV2EdgesJsonMigration,
|
|
136
140
|
releaseNotesDynamicModelContextMigration,
|
|
137
141
|
unwindMainAgentOpusSeedMigration,
|
|
142
|
+
bumpStaleHeartbeatIntervalMigration,
|
|
143
|
+
seedHeartbeatCallsiteCostDefaultMigration,
|
|
144
|
+
releaseNotesSafeStorageLimitsMigration,
|
|
145
|
+
releaseNotesLocalTimezoneMigration,
|
|
138
146
|
];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Resolve the legacy Vellum root directory (~/.vellum).
|
|
6
|
+
*
|
|
7
|
+
* Resolution order:
|
|
8
|
+
* 1. Parent of VELLUM_WORKSPACE_DIR — e.g. /data/.vellum/workspace → /data/.vellum
|
|
9
|
+
* 2. If that parent is "/" (workspace at top level, e.g. /workspace), fall back
|
|
10
|
+
* to homedir()/.vellum
|
|
11
|
+
*
|
|
12
|
+
* This replaces the old inlined `getRootDir()` pattern used by individual migrations.
|
|
13
|
+
*/
|
|
14
|
+
export function getVellumRoot(): string {
|
|
15
|
+
const workspaceDir = process.env.VELLUM_WORKSPACE_DIR?.trim();
|
|
16
|
+
if (workspaceDir) {
|
|
17
|
+
const parent = dirname(workspaceDir);
|
|
18
|
+
if (parent !== "/") return parent;
|
|
19
|
+
}
|
|
20
|
+
return join(homedir(), ".vellum");
|
|
21
|
+
}
|