@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
|
@@ -13,12 +13,13 @@ import { getLogger } from "../util/logger.js";
|
|
|
13
13
|
import { getAllTools, getTool } from "./registry.js";
|
|
14
14
|
import { isSideEffectTool } from "./side-effects.js";
|
|
15
15
|
import { summarizeToolInput } from "./tool-input-summary.js";
|
|
16
|
-
import
|
|
17
|
-
ExecutionTarget,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
import {
|
|
17
|
+
type ExecutionTarget,
|
|
18
|
+
isDiskPressureCleanupToolName,
|
|
19
|
+
type Tool,
|
|
20
|
+
type ToolContext,
|
|
21
|
+
type ToolExecutionResult,
|
|
22
|
+
type ToolLifecycleEvent,
|
|
22
23
|
} from "./types.js";
|
|
23
24
|
import { enforceVerificationControlPlanePolicy } from "./verification-control-plane-policy.js";
|
|
24
25
|
|
|
@@ -292,11 +293,7 @@ export class ToolApprovalHandler {
|
|
|
292
293
|
executionTarget,
|
|
293
294
|
);
|
|
294
295
|
|
|
295
|
-
if (
|
|
296
|
-
isUntrustedTrustClass(context.trustClass) &&
|
|
297
|
-
guardianApprovalRequired &&
|
|
298
|
-
context.trustClass !== "trusted_contact"
|
|
299
|
-
) {
|
|
296
|
+
if (isUntrustedTrustClass(context.trustClass) && guardianApprovalRequired) {
|
|
300
297
|
const inputDigest = computeToolApprovalDigest(name, input);
|
|
301
298
|
needsGrantConsumption = true;
|
|
302
299
|
deferredConsumeParams = {
|
|
@@ -313,6 +310,30 @@ export class ToolApprovalHandler {
|
|
|
313
310
|
};
|
|
314
311
|
}
|
|
315
312
|
|
|
313
|
+
if (
|
|
314
|
+
context.diskPressureCleanupModeActive === true &&
|
|
315
|
+
!isDiskPressureCleanupToolName(name)
|
|
316
|
+
) {
|
|
317
|
+
const msg = `Tool "${name}" is not available during disk pressure cleanup mode.`;
|
|
318
|
+
const durationMs = Date.now() - startTime;
|
|
319
|
+
emitLifecycleEvent({
|
|
320
|
+
type: "error",
|
|
321
|
+
toolName: name,
|
|
322
|
+
executionTarget,
|
|
323
|
+
input,
|
|
324
|
+
workingDir: context.workingDir,
|
|
325
|
+
conversationId: context.conversationId,
|
|
326
|
+
requestId: context.requestId,
|
|
327
|
+
riskLevel,
|
|
328
|
+
decision: "error",
|
|
329
|
+
durationMs,
|
|
330
|
+
errorMessage: msg,
|
|
331
|
+
isExpected: true,
|
|
332
|
+
errorCategory: "tool_failure",
|
|
333
|
+
});
|
|
334
|
+
return { allowed: false, result: { content: msg, isError: true } };
|
|
335
|
+
}
|
|
336
|
+
|
|
316
337
|
// Gate tools not active for the current turn
|
|
317
338
|
if (context.allowedToolNames && !context.allowedToolNames.has(name)) {
|
|
318
339
|
const msg = `Tool "${name}" is not currently active. Load the skill that provides this tool first.`;
|
package/src/tools/types.ts
CHANGED
|
@@ -18,6 +18,20 @@ import type { SecretPromptResult } from "../permissions/secret-prompter.js";
|
|
|
18
18
|
import type { ContentBlock } from "../providers/types.js";
|
|
19
19
|
import type { TrustClass } from "../runtime/actor-trust-resolver.js";
|
|
20
20
|
|
|
21
|
+
export const DISK_PRESSURE_CLEANUP_TOOL_NAMES: ReadonlySet<string> = new Set([
|
|
22
|
+
"bash",
|
|
23
|
+
"host_bash",
|
|
24
|
+
"file_read",
|
|
25
|
+
"file_list",
|
|
26
|
+
"host_file_read",
|
|
27
|
+
"background_tool_list",
|
|
28
|
+
"background_tool_cancel",
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
export function isDiskPressureCleanupToolName(name: string): boolean {
|
|
32
|
+
return DISK_PRESSURE_CLEANUP_TOOL_NAMES.has(name);
|
|
33
|
+
}
|
|
34
|
+
|
|
21
35
|
// ---------------------------------------------------------------------------
|
|
22
36
|
// Re-exports + concrete overlays for types that live in
|
|
23
37
|
// @vellumai/skill-host-contracts.
|
|
@@ -138,6 +152,10 @@ export interface ToolExecutedEvent {
|
|
|
138
152
|
riskLevel: string;
|
|
139
153
|
/** ID of the trust rule that matched this invocation (if any). */
|
|
140
154
|
matchedTrustRuleId?: string;
|
|
155
|
+
/** How the approval decision was reached. Copied from PermissionDecision for analytics consumers. */
|
|
156
|
+
approvalMode?: string;
|
|
157
|
+
/** Why the approval decision was reached (stable enum). Copied from PermissionDecision for analytics consumers. */
|
|
158
|
+
approvalReason?: string;
|
|
141
159
|
decision: string;
|
|
142
160
|
durationMs: number;
|
|
143
161
|
result: ToolExecutionResult;
|
|
@@ -173,6 +191,8 @@ export interface ToolContext {
|
|
|
173
191
|
proxyToolResolver?: ProxyToolResolver;
|
|
174
192
|
/** When set, only tools in this set may execute. Tools outside the set are blocked with an error. */
|
|
175
193
|
allowedToolNames?: Set<string>;
|
|
194
|
+
/** True when this turn is restricted to storage cleanup-safe tools. */
|
|
195
|
+
diskPressureCleanupModeActive?: boolean;
|
|
176
196
|
/** Prompt the user for a secret value via native SecureField UI. */
|
|
177
197
|
requestSecret?: (params: {
|
|
178
198
|
service: string;
|
|
@@ -188,8 +208,6 @@ export interface ToolContext {
|
|
|
188
208
|
sendToClient?: (msg: { type: string; [key: string]: unknown }) => void;
|
|
189
209
|
/** True when an interactive client is connected (not just a no-op callback). */
|
|
190
210
|
isInteractive?: boolean;
|
|
191
|
-
/** Memory scope ID from the conversation's memory policy, so memory tools can target the correct scope. */
|
|
192
|
-
memoryScopeId?: string;
|
|
193
211
|
/** When true, tools with side effects should always prompt for confirmation. */
|
|
194
212
|
forcePromptSideEffects?: boolean;
|
|
195
213
|
/**
|
|
@@ -264,6 +282,14 @@ export interface ToolContext {
|
|
|
264
282
|
* `executeSubagentSpawn` in tools/subagent/spawn.ts.
|
|
265
283
|
*/
|
|
266
284
|
overrideProfile?: string;
|
|
285
|
+
/**
|
|
286
|
+
* Canonical principal ID of the actor on whose behalf this tool invocation
|
|
287
|
+
* is running. Sourced from `conversation.trustContext.guardianPrincipalId`.
|
|
288
|
+
* Used by host proxies to bind cross-client targeted execution to the same
|
|
289
|
+
* authenticated user identity. May be undefined for legacy/internal flows
|
|
290
|
+
* with no resolved actor identity.
|
|
291
|
+
*/
|
|
292
|
+
sourceActorPrincipalId?: string;
|
|
267
293
|
}
|
|
268
294
|
|
|
269
295
|
export interface Tool {
|
|
@@ -13,8 +13,6 @@
|
|
|
13
13
|
|
|
14
14
|
import type { TtsCallMode, TtsProviderId } from "./types.js";
|
|
15
15
|
|
|
16
|
-
export type { TtsCallMode } from "./types.js";
|
|
17
|
-
|
|
18
16
|
// ---------------------------------------------------------------------------
|
|
19
17
|
// Catalog entry model
|
|
20
18
|
// ---------------------------------------------------------------------------
|
|
@@ -22,7 +20,7 @@ export type { TtsCallMode } from "./types.js";
|
|
|
22
20
|
/**
|
|
23
21
|
* Metadata about a secret (API key / credential) required by a provider.
|
|
24
22
|
*/
|
|
25
|
-
|
|
23
|
+
interface TtsProviderSecretRequirement {
|
|
26
24
|
/**
|
|
27
25
|
* The key used to retrieve this secret from the secure credential store.
|
|
28
26
|
*
|
|
@@ -49,7 +47,7 @@ export interface TtsProviderSecretRequirement {
|
|
|
49
47
|
* These describe static, provider-wide traits — they do not change based
|
|
50
48
|
* on runtime configuration or per-request parameters.
|
|
51
49
|
*/
|
|
52
|
-
|
|
50
|
+
interface TtsProviderCatalogCapabilities {
|
|
53
51
|
/** Whether the provider supports chunk-level streaming synthesis. */
|
|
54
52
|
readonly supportsStreaming: boolean;
|
|
55
53
|
|
|
@@ -64,7 +62,7 @@ export interface TtsProviderCatalogCapabilities {
|
|
|
64
62
|
* metadata level — identity, display name, telephony call mode,
|
|
65
63
|
* capabilities, and secret requirements.
|
|
66
64
|
*/
|
|
67
|
-
|
|
65
|
+
interface TtsProviderCatalogEntry {
|
|
68
66
|
/** Unique provider identifier matching {@link TtsProviderId}. */
|
|
69
67
|
readonly id: TtsProviderId;
|
|
70
68
|
|
package/src/usage/pricing.ts
CHANGED
|
@@ -13,7 +13,7 @@ import type {
|
|
|
13
13
|
|
|
14
14
|
const log = getLogger("usage-pricing");
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
function normalizeTokenCount(value: number | null | undefined): number {
|
|
17
17
|
if (typeof value !== "number" || !Number.isFinite(value)) return 0;
|
|
18
18
|
return Math.max(value, 0);
|
|
19
19
|
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, statfsSync } from "node:fs";
|
|
3
|
+
|
|
4
|
+
import { getMinikubeStorageSize } from "../config/env-registry.js";
|
|
5
|
+
import { getWorkspaceDir } from "./platform.js";
|
|
6
|
+
|
|
7
|
+
export interface DiskUsageInfo {
|
|
8
|
+
path: string;
|
|
9
|
+
totalMb: number;
|
|
10
|
+
usedMb: number;
|
|
11
|
+
freeMb: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Measure the on-disk usage of one or more directory paths using `du -sb`.
|
|
16
|
+
* Returns the sum of all paths in bytes, or null on failure.
|
|
17
|
+
*/
|
|
18
|
+
function getDirectorySizeBytes(paths: string[]): number | null {
|
|
19
|
+
try {
|
|
20
|
+
const existing = paths.filter((p) => existsSync(p));
|
|
21
|
+
if (existing.length === 0) return null;
|
|
22
|
+
const result = spawnSync("du", ["-sb", ...existing], {
|
|
23
|
+
encoding: "utf-8",
|
|
24
|
+
timeout: 30_000,
|
|
25
|
+
});
|
|
26
|
+
if (result.status !== 0) return null;
|
|
27
|
+
let total = 0;
|
|
28
|
+
for (const line of result.stdout.trim().split("\n")) {
|
|
29
|
+
const size = parseInt(line.split("\t")[0], 10);
|
|
30
|
+
if (!isNaN(size) && size > 0) total += size;
|
|
31
|
+
}
|
|
32
|
+
return total > 0 ? total : null;
|
|
33
|
+
} catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const DU_CACHE_TTL_MS = 60_000;
|
|
39
|
+
let duCacheValue: number | null = null;
|
|
40
|
+
let duCacheTime = 0;
|
|
41
|
+
let duCachePaths: string | null = null;
|
|
42
|
+
|
|
43
|
+
function getCachedDirectorySizeBytes(paths: string[]): number | null {
|
|
44
|
+
const key = paths.join("\0");
|
|
45
|
+
const now = Date.now();
|
|
46
|
+
if (duCachePaths === key && now - duCacheTime < DU_CACHE_TTL_MS) {
|
|
47
|
+
return duCacheValue;
|
|
48
|
+
}
|
|
49
|
+
duCacheValue = getDirectorySizeBytes(paths);
|
|
50
|
+
duCacheTime = now;
|
|
51
|
+
duCachePaths = key;
|
|
52
|
+
return duCacheValue;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function __resetDiskUsageCacheForTests(): void {
|
|
56
|
+
duCacheValue = null;
|
|
57
|
+
duCacheTime = 0;
|
|
58
|
+
duCachePaths = null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function getDiskUsageInfo(): DiskUsageInfo | null {
|
|
62
|
+
try {
|
|
63
|
+
const wsDir = getWorkspaceDir();
|
|
64
|
+
const diskPath = existsSync(wsDir) ? wsDir : "/";
|
|
65
|
+
const stats = statfsSync(diskPath);
|
|
66
|
+
const fsTotalBytes = stats.bsize * stats.blocks;
|
|
67
|
+
const fsFreeBytes = stats.bsize * stats.bavail;
|
|
68
|
+
const bytesToMb = (b: number) =>
|
|
69
|
+
Math.round((b / (1024 * 1024)) * 100) / 100;
|
|
70
|
+
|
|
71
|
+
// Minikube mode: the platform passes the PVC storage size so we can
|
|
72
|
+
// report accurate capacity. On hostPath-backed PVCs statfsSync reports
|
|
73
|
+
// the host's entire filesystem rather than the PVC. Detect this by
|
|
74
|
+
// comparing filesystem size against PVC size — if the filesystem is
|
|
75
|
+
// larger, measure actual directory usage with `du` instead.
|
|
76
|
+
const storageSizeRaw = getMinikubeStorageSize();
|
|
77
|
+
if (storageSizeRaw) {
|
|
78
|
+
const pvcTotalBytes = parseK8sMemoryBytes(storageSizeRaw);
|
|
79
|
+
if (pvcTotalBytes !== null && fsTotalBytes > pvcTotalBytes * 1.1) {
|
|
80
|
+
const volumePaths = [diskPath];
|
|
81
|
+
if (diskPath !== "/data" && existsSync("/data")) {
|
|
82
|
+
volumePaths.push("/data");
|
|
83
|
+
}
|
|
84
|
+
const usedBytes = getCachedDirectorySizeBytes(volumePaths);
|
|
85
|
+
if (usedBytes !== null) {
|
|
86
|
+
return {
|
|
87
|
+
path: diskPath,
|
|
88
|
+
totalMb: bytesToMb(pvcTotalBytes),
|
|
89
|
+
usedMb: bytesToMb(usedBytes),
|
|
90
|
+
freeMb: bytesToMb(Math.max(0, pvcTotalBytes - usedBytes)),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
path: diskPath,
|
|
98
|
+
totalMb: bytesToMb(fsTotalBytes),
|
|
99
|
+
usedMb: bytesToMb(fsTotalBytes - fsFreeBytes),
|
|
100
|
+
freeMb: bytesToMb(fsFreeBytes),
|
|
101
|
+
};
|
|
102
|
+
} catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Parse a Kubernetes-style memory string (e.g. "3Gi", "512Mi", "1G") into bytes.
|
|
109
|
+
* Returns null if the value is not a recognized format.
|
|
110
|
+
*/
|
|
111
|
+
export function parseK8sMemoryBytes(value: string): number | null {
|
|
112
|
+
const match = value
|
|
113
|
+
.trim()
|
|
114
|
+
.match(/^(\d+(?:\.\d+)?)\s*(Ki|Mi|Gi|Ti|Pi|Ei|k|M|G|T|P|E|m)?$/);
|
|
115
|
+
if (!match) return null;
|
|
116
|
+
const num = parseFloat(match[1]);
|
|
117
|
+
const unit = match[2] ?? "";
|
|
118
|
+
const multipliers: Record<string, number> = {
|
|
119
|
+
"": 1,
|
|
120
|
+
m: 1e-3,
|
|
121
|
+
k: 1e3,
|
|
122
|
+
M: 1e6,
|
|
123
|
+
G: 1e9,
|
|
124
|
+
T: 1e12,
|
|
125
|
+
P: 1e15,
|
|
126
|
+
E: 1e18,
|
|
127
|
+
Ki: 1024,
|
|
128
|
+
Mi: 1024 ** 2,
|
|
129
|
+
Gi: 1024 ** 3,
|
|
130
|
+
Ti: 1024 ** 4,
|
|
131
|
+
Pi: 1024 ** 5,
|
|
132
|
+
Ei: 1024 ** 6,
|
|
133
|
+
};
|
|
134
|
+
const mult = multipliers[unit];
|
|
135
|
+
if (mult === undefined) return null;
|
|
136
|
+
const bytes = Math.round(num * mult);
|
|
137
|
+
return bytes > 0 ? bytes : null;
|
|
138
|
+
}
|
package/src/util/platform.ts
CHANGED
|
@@ -7,14 +7,25 @@ import { getWorkspaceDirOverride } from "../config/env-registry.js";
|
|
|
7
7
|
/**
|
|
8
8
|
* The daemon's root data directory (`~/.vellum`).
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Used as a fallback when `VELLUM_WORKSPACE_DIR` is not set, and as a
|
|
11
|
+
* stable constant for paths (like `.env`) that intentionally live at the
|
|
12
|
+
* host home directory regardless of workspace relocation.
|
|
13
13
|
*/
|
|
14
14
|
const VELLUM_ROOT = join(homedir(), ".vellum");
|
|
15
15
|
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Returns the Vellum root directory.
|
|
18
|
+
*
|
|
19
|
+
* Resolution order (mirrors workspace/migrations/utils.ts):
|
|
20
|
+
* 1. Parent of VELLUM_WORKSPACE_DIR — e.g. /data/.vellum/workspace → /data/.vellum
|
|
21
|
+
* 2. If that parent is "/" (workspace at top level), fall back to ~/.vellum
|
|
22
|
+
*/
|
|
17
23
|
export function vellumRoot(): string {
|
|
24
|
+
const override = getWorkspaceDirOverride();
|
|
25
|
+
if (override) {
|
|
26
|
+
const parent = dirname(override);
|
|
27
|
+
if (parent !== "/") return parent;
|
|
28
|
+
}
|
|
18
29
|
return VELLUM_ROOT;
|
|
19
30
|
}
|
|
20
31
|
|
|
@@ -160,17 +171,16 @@ export function getHistoryPath(): string {
|
|
|
160
171
|
}
|
|
161
172
|
|
|
162
173
|
/**
|
|
163
|
-
* Returns the protected directory
|
|
164
|
-
*
|
|
165
|
-
*
|
|
174
|
+
* Returns the protected directory. Security-sensitive files — trust rules,
|
|
175
|
+
* encrypted credential store, signing keys, feature-flag overrides, device
|
|
176
|
+
* approval lists — live here.
|
|
166
177
|
*
|
|
167
178
|
* This directory is:
|
|
168
|
-
* - Outside the workspace
|
|
169
179
|
* - Outside the sandbox write boundary (tools cannot modify it)
|
|
170
180
|
* - Skipped in containerized mode (credentials via CES, trust via gateway)
|
|
171
181
|
*/
|
|
172
182
|
export function getProtectedDir(): string {
|
|
173
|
-
return join(
|
|
183
|
+
return join(vellumRoot(), "protected");
|
|
174
184
|
}
|
|
175
185
|
|
|
176
186
|
/** Returns ~/.vellum/workspace/signals — the directory for IPC signal files. */
|
|
@@ -204,7 +214,7 @@ export function getBinDir(): string {
|
|
|
204
214
|
|
|
205
215
|
/** Returns the path to the dot-env file (~/.vellum/.env). Stays at root because it contains secrets. */
|
|
206
216
|
export function getDotEnvPath(): string {
|
|
207
|
-
return join(
|
|
217
|
+
return join(vellumRoot(), ".env");
|
|
208
218
|
}
|
|
209
219
|
|
|
210
220
|
/** Returns the path to the embed-worker PID file (~/.vellum/workspace/embed-worker.pid). */
|
|
@@ -368,7 +378,7 @@ export function getBundledBunPath(): string | undefined {
|
|
|
368
378
|
}
|
|
369
379
|
|
|
370
380
|
export function ensureDataDir(): void {
|
|
371
|
-
const root =
|
|
381
|
+
const root = vellumRoot();
|
|
372
382
|
const workspace = getWorkspaceDir();
|
|
373
383
|
const wsData = join(workspace, "data");
|
|
374
384
|
const dirs = [
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-process liveness probe shared by file-locking helpers.
|
|
3
|
+
*
|
|
4
|
+
* Uses `kill(pid, 0)`, which sends no signal but probes the OS for whether a
|
|
5
|
+
* process exists and whether the caller has permission to signal it. Returns
|
|
6
|
+
* `false` for obviously invalid PIDs and for any error indicating the process
|
|
7
|
+
* is gone (most commonly ESRCH). Returns `true` for ESRCH-negative results
|
|
8
|
+
* (process exists) and for EPERM (process exists but is owned by another user
|
|
9
|
+
* — still alive, still must not be taken over).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { kill } from "node:process";
|
|
13
|
+
|
|
14
|
+
export function isProcessAlive(pid: number): boolean {
|
|
15
|
+
if (!Number.isInteger(pid) || pid <= 0) return false;
|
|
16
|
+
try {
|
|
17
|
+
kill(pid, 0);
|
|
18
|
+
return true;
|
|
19
|
+
} catch (err) {
|
|
20
|
+
const code = (err as NodeJS.ErrnoException).code;
|
|
21
|
+
// EPERM means the PID exists but we cannot signal it — treat as alive so
|
|
22
|
+
// we don't accidentally take over another user's lock.
|
|
23
|
+
if (code === "EPERM") return true;
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { getDataDir } from "../util/platform.js";
|
|
5
|
+
|
|
6
|
+
const HATCHED_SIDECAR_FILENAME = "hatched.json";
|
|
7
|
+
|
|
8
|
+
export function getHatchedSidecarPath(): string {
|
|
9
|
+
return join(getDataDir(), HATCHED_SIDECAR_FILENAME);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function normalizeHatchedAt(value: unknown): string | undefined {
|
|
13
|
+
if (typeof value !== "string") return undefined;
|
|
14
|
+
|
|
15
|
+
const parsedTime = Date.parse(value);
|
|
16
|
+
if (isNaN(parsedTime) || parsedTime <= 0) return undefined;
|
|
17
|
+
|
|
18
|
+
return new Date(parsedTime).toISOString();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function readHatchedAtSidecar(): string | undefined {
|
|
22
|
+
try {
|
|
23
|
+
const parsed = JSON.parse(
|
|
24
|
+
readFileSync(getHatchedSidecarPath(), "utf-8"),
|
|
25
|
+
) as { hatchedAt?: unknown };
|
|
26
|
+
return normalizeHatchedAt(parsed.hatchedAt);
|
|
27
|
+
} catch {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function writeHatchedAtSidecar(hatchedAt: string): void {
|
|
33
|
+
const normalized = normalizeHatchedAt(hatchedAt);
|
|
34
|
+
if (!normalized) return;
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
mkdirSync(getDataDir(), { recursive: true });
|
|
38
|
+
writeFileSync(
|
|
39
|
+
getHatchedSidecarPath(),
|
|
40
|
+
JSON.stringify({ hatchedAt: normalized }, null, 2),
|
|
41
|
+
"utf-8",
|
|
42
|
+
);
|
|
43
|
+
} catch {
|
|
44
|
+
// Best-effort stability; callers still return a valid timestamp.
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function selectHatchedAtFromStats(stats: {
|
|
49
|
+
birthtime: Date;
|
|
50
|
+
mtime: Date;
|
|
51
|
+
}): Date | undefined {
|
|
52
|
+
const candidates = [stats.birthtime, stats.mtime];
|
|
53
|
+
return candidates.find((candidate) => candidate.getTime() > 0);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function readIdentityFileHatchedAt(identityPath: string): string | undefined {
|
|
57
|
+
try {
|
|
58
|
+
return selectHatchedAtFromStats(statSync(identityPath))?.toISOString();
|
|
59
|
+
} catch {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function resolveHatchedAtReadOnly(
|
|
65
|
+
identityPath: string,
|
|
66
|
+
now: Date = new Date(),
|
|
67
|
+
): string {
|
|
68
|
+
return (
|
|
69
|
+
readHatchedAtSidecar() ??
|
|
70
|
+
readIdentityFileHatchedAt(identityPath) ??
|
|
71
|
+
now.toISOString()
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function resolveAndPersistHatchedAt(
|
|
76
|
+
identityPath: string,
|
|
77
|
+
now: Date = new Date(),
|
|
78
|
+
): string {
|
|
79
|
+
const sidecarHatchedAt = readHatchedAtSidecar();
|
|
80
|
+
if (sidecarHatchedAt) return sidecarHatchedAt;
|
|
81
|
+
|
|
82
|
+
const hatchedAt =
|
|
83
|
+
readIdentityFileHatchedAt(identityPath) ?? now.toISOString();
|
|
84
|
+
writeHatchedAtSidecar(hatchedAt);
|
|
85
|
+
return hatchedAt;
|
|
86
|
+
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
checkDiskPressureBackgroundGate,
|
|
3
|
+
diskPressureBackgroundSkipLogFields,
|
|
4
|
+
shouldLogDiskPressureBackgroundSkip,
|
|
5
|
+
} from "../daemon/disk-pressure-background-gate.js";
|
|
1
6
|
import { getLogger } from "../util/logger.js";
|
|
2
7
|
import { getEnrichmentService } from "./commit-message-enrichment-service.js";
|
|
3
8
|
import {
|
|
@@ -137,6 +142,20 @@ export class WorkspaceHeartbeatService {
|
|
|
137
142
|
return { checked: 0, committed: 0, skipped: 0, failed: 0 };
|
|
138
143
|
}
|
|
139
144
|
|
|
145
|
+
const diskPressureGate = checkDiskPressureBackgroundGate("background-work");
|
|
146
|
+
if (diskPressureGate.action === "skip") {
|
|
147
|
+
if (shouldLogDiskPressureBackgroundSkip("workspace-heartbeat")) {
|
|
148
|
+
log.warn(
|
|
149
|
+
{
|
|
150
|
+
source: "workspace-heartbeat",
|
|
151
|
+
...diskPressureBackgroundSkipLogFields(diskPressureGate),
|
|
152
|
+
},
|
|
153
|
+
"Workspace heartbeat skipped during disk pressure cleanup mode",
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
return { checked: 0, committed: 0, skipped: 0, failed: 0 };
|
|
157
|
+
}
|
|
158
|
+
|
|
140
159
|
const doCheck = async (): Promise<HeartbeatCheckResult> => {
|
|
141
160
|
const result: HeartbeatCheckResult = {
|
|
142
161
|
checked: 0,
|
|
@@ -45,7 +45,7 @@ export const seedDeviceIdMigration: WorkspaceMigration = {
|
|
|
45
45
|
|
|
46
46
|
// b. Read the lockfile to find an existing installationId.
|
|
47
47
|
// The lockfile is always under the user's home directory, never under
|
|
48
|
-
//
|
|
48
|
+
// Check both the current and legacy filenames.
|
|
49
49
|
const home = homedir();
|
|
50
50
|
const lockCandidates = [
|
|
51
51
|
join(home, ".vellum.lock.json"),
|
|
@@ -37,8 +37,9 @@ export const servicesConfigMigration: WorkspaceMigration = {
|
|
|
37
37
|
|
|
38
38
|
// Skip if no legacy fields remain — either already migrated or a fresh install
|
|
39
39
|
// where schema defaults are correct. We check for legacy fields instead of
|
|
40
|
-
// services existence because
|
|
41
|
-
// services object
|
|
40
|
+
// services existence because legacy daemons (before defaults were applied
|
|
41
|
+
// only in-memory) may have written a default services object to disk
|
|
42
|
+
// before migrations run.
|
|
42
43
|
const hasLegacyFields =
|
|
43
44
|
"provider" in config ||
|
|
44
45
|
"model" in config ||
|
|
@@ -46,7 +47,8 @@ export const servicesConfigMigration: WorkspaceMigration = {
|
|
|
46
47
|
"webSearchProvider" in config;
|
|
47
48
|
if (!hasLegacyFields) return;
|
|
48
49
|
|
|
49
|
-
// Start from existing services (may have
|
|
50
|
+
// Start from existing services (legacy daemons may have written a
|
|
51
|
+
// schema-default services object to disk before this migration runs)
|
|
50
52
|
// so we don't discard any non-default values already written there.
|
|
51
53
|
const existingServices =
|
|
52
54
|
config.services != null &&
|
|
@@ -96,8 +98,9 @@ export const servicesConfigMigration: WorkspaceMigration = {
|
|
|
96
98
|
// Legacy top-level fields (provider, model) are the user's actual
|
|
97
99
|
// configuration from before the services structure existed. If they're
|
|
98
100
|
// present as strings they take precedence over any `existingServices`
|
|
99
|
-
// values, which
|
|
100
|
-
// The spread preserves any extra keys that
|
|
101
|
+
// values, which on legacy daemons may just be schema defaults that an
|
|
102
|
+
// older loader wrote to disk. The spread preserves any extra keys that
|
|
103
|
+
// legacy daemons may have written alongside.
|
|
101
104
|
services.inference = {
|
|
102
105
|
...(existingServices.inference ?? {}),
|
|
103
106
|
mode: inferenceMode,
|
|
@@ -7,16 +7,10 @@ import {
|
|
|
7
7
|
unlinkSync,
|
|
8
8
|
writeFileSync,
|
|
9
9
|
} 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
|
-
/** Inlined from platform.ts to satisfy migration self-containment rule (AGENTS.md). */
|
|
16
|
-
function getRootDir(): string {
|
|
17
|
-
const base = process.env.BASE_DATA_DIR?.trim() || homedir();
|
|
18
|
-
return join(base, ".vellum");
|
|
19
|
-
}
|
|
13
|
+
import { getVellumRoot } from "./utils.js";
|
|
20
14
|
|
|
21
15
|
export const extractFeatureFlagsToProtectedMigration: WorkspaceMigration = {
|
|
22
16
|
id: "016-extract-feature-flags-to-protected",
|
|
@@ -26,7 +20,7 @@ export const extractFeatureFlagsToProtectedMigration: WorkspaceMigration = {
|
|
|
26
20
|
down(workspaceDir: string): void {
|
|
27
21
|
// Reverse: read feature flags from protected directory and write them
|
|
28
22
|
// back to config.json as assistantFeatureFlagValues.
|
|
29
|
-
const protectedDir = join(
|
|
23
|
+
const protectedDir = join(getVellumRoot(), "protected");
|
|
30
24
|
const featureFlagsPath = join(protectedDir, "feature-flags.json");
|
|
31
25
|
|
|
32
26
|
if (!existsSync(featureFlagsPath)) return;
|
|
@@ -111,7 +105,7 @@ export const extractFeatureFlagsToProtectedMigration: WorkspaceMigration = {
|
|
|
111
105
|
}
|
|
112
106
|
|
|
113
107
|
// Write feature flags to protected directory
|
|
114
|
-
const protectedDir = join(
|
|
108
|
+
const protectedDir = join(getVellumRoot(), "protected");
|
|
115
109
|
mkdirSync(protectedDir, { recursive: true });
|
|
116
110
|
|
|
117
111
|
const featureFlagsPath = join(protectedDir, "feature-flags.json");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Workspace migration 021: Move signals directory from root to workspace.
|
|
3
3
|
*
|
|
4
|
-
* Previously, `~/.vellum/signals/` lived directly under
|
|
4
|
+
* Previously, `~/.vellum/signals/` lived directly under the Vellum root. This
|
|
5
5
|
* migration moves any existing signal files into `~/.vellum/workspace/signals/`
|
|
6
6
|
* so that getSignalsDir() resolves correctly under the workspace.
|
|
7
7
|
*
|
|
@@ -13,23 +13,17 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import { existsSync, mkdirSync, readdirSync, renameSync } from "node:fs";
|
|
16
|
-
import { homedir } from "node:os";
|
|
17
16
|
import { join } from "node:path";
|
|
18
17
|
|
|
19
18
|
import type { WorkspaceMigration } from "./types.js";
|
|
20
|
-
|
|
21
|
-
/** Inlined from platform.ts to satisfy migration self-containment rule (AGENTS.md). */
|
|
22
|
-
function getRootDir(): string {
|
|
23
|
-
const base = process.env.BASE_DATA_DIR?.trim() || homedir();
|
|
24
|
-
return join(base, ".vellum");
|
|
25
|
-
}
|
|
19
|
+
import { getVellumRoot } from "./utils.js";
|
|
26
20
|
|
|
27
21
|
export const moveSignalsToWorkspaceMigration: WorkspaceMigration = {
|
|
28
22
|
id: "021-move-signals-to-workspace",
|
|
29
23
|
description: "Move signals directory from root to workspace",
|
|
30
24
|
|
|
31
25
|
run(workspaceDir: string): void {
|
|
32
|
-
const oldSignalsDir = join(
|
|
26
|
+
const oldSignalsDir = join(getVellumRoot(), "signals");
|
|
33
27
|
const newSignalsDir = join(workspaceDir, "signals");
|
|
34
28
|
|
|
35
29
|
mkdirSync(newSignalsDir, { recursive: true });
|
|
@@ -56,7 +50,7 @@ export const moveSignalsToWorkspaceMigration: WorkspaceMigration = {
|
|
|
56
50
|
},
|
|
57
51
|
|
|
58
52
|
down(workspaceDir: string): void {
|
|
59
|
-
const oldSignalsDir = join(
|
|
53
|
+
const oldSignalsDir = join(getVellumRoot(), "signals");
|
|
60
54
|
const newSignalsDir = join(workspaceDir, "signals");
|
|
61
55
|
|
|
62
56
|
mkdirSync(oldSignalsDir, { recursive: true });
|