@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,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `vellum backup` — manage automated
|
|
2
|
+
* `vellum backup` — manage automated backup configuration and list snapshots.
|
|
3
3
|
*
|
|
4
4
|
* All subcommands run in-process (they do not call the daemon HTTP port).
|
|
5
5
|
* Config mutations go through `loadRawConfig` / `setNestedValue` / `saveRawConfig`
|
|
@@ -12,31 +12,22 @@ import { dirname } from "node:path";
|
|
|
12
12
|
|
|
13
13
|
import type { Command } from "commander";
|
|
14
14
|
|
|
15
|
-
import { readBackupKey } from "../../backup/backup-key.js";
|
|
16
|
-
import { createSnapshotNow } from "../../backup/backup-worker.js";
|
|
17
15
|
import {
|
|
18
16
|
listSnapshotsInDir,
|
|
19
17
|
type SnapshotEntry,
|
|
20
18
|
} from "../../backup/list-snapshots.js";
|
|
21
19
|
import {
|
|
22
|
-
getBackupKeyPath,
|
|
23
20
|
getLocalBackupsDir,
|
|
24
21
|
resolveOffsiteDestinations,
|
|
25
22
|
} from "../../backup/paths.js";
|
|
26
|
-
import { restoreFromSnapshot, verifySnapshot } from "../../backup/restore.js";
|
|
27
23
|
import {
|
|
28
24
|
getConfig,
|
|
29
|
-
invalidateConfigCache,
|
|
30
25
|
loadRawConfig,
|
|
31
26
|
saveRawConfig,
|
|
32
27
|
setNestedValue,
|
|
33
28
|
} from "../../config/loader.js";
|
|
34
29
|
import type { BackupDestination } from "../../config/schema.js";
|
|
35
|
-
import { isDaemonRunning } from "../../daemon/daemon-control.js";
|
|
36
30
|
import { getMemoryCheckpoint } from "../../memory/checkpoints.js";
|
|
37
|
-
import { resetDb } from "../../memory/db-connection.js";
|
|
38
|
-
import { DefaultPathResolver } from "../../runtime/migrations/vbundle-import-analyzer.js";
|
|
39
|
-
import { getWorkspaceDir, getWorkspaceHooksDir } from "../../util/platform.js";
|
|
40
31
|
import { log } from "../logger.js";
|
|
41
32
|
|
|
42
33
|
// ---------------------------------------------------------------------------
|
|
@@ -87,7 +78,7 @@ function formatDurationShort(ms: number): string {
|
|
|
87
78
|
|
|
88
79
|
/**
|
|
89
80
|
* Check whether an offsite destination's parent directory exists. Mirrors the
|
|
90
|
-
* reachability check in
|
|
81
|
+
* reachability check in the backup worker — if the parent is missing (e.g.
|
|
91
82
|
* iCloud Drive not enabled, external SSD unplugged) the destination is
|
|
92
83
|
* considered unreachable and we skip it at runtime.
|
|
93
84
|
*/
|
|
@@ -405,242 +396,9 @@ export async function handleList(): Promise<void> {
|
|
|
405
396
|
}
|
|
406
397
|
|
|
407
398
|
// ---------------------------------------------------------------------------
|
|
408
|
-
// create
|
|
409
399
|
// ---------------------------------------------------------------------------
|
|
410
400
|
|
|
411
|
-
export async function handleCreate(): Promise<void> {
|
|
412
|
-
const cfg = getConfig().backup;
|
|
413
|
-
try {
|
|
414
|
-
const result = await createSnapshotNow(cfg, new Date());
|
|
415
|
-
log.info(`Created snapshot: ${result.local.path}`);
|
|
416
|
-
log.info(` size: ${formatBytes(result.local.sizeBytes)}`);
|
|
417
|
-
log.info(` duration: ${result.durationMs}ms`);
|
|
418
|
-
if (result.offsite.length === 0) {
|
|
419
|
-
log.info(` offsite: (none)`);
|
|
420
|
-
} else {
|
|
421
|
-
log.info(` offsite:`);
|
|
422
|
-
for (const r of result.offsite) {
|
|
423
|
-
if (r.entry) {
|
|
424
|
-
log.info(
|
|
425
|
-
` ok ${r.destination.path} -> ${r.entry.filename}`,
|
|
426
|
-
);
|
|
427
|
-
} else if (r.skipped) {
|
|
428
|
-
log.info(` skipped ${r.destination.path} (${r.skipped})`);
|
|
429
|
-
} else {
|
|
430
|
-
log.info(
|
|
431
|
-
` error ${r.destination.path} (${r.error ?? "unknown"})`,
|
|
432
|
-
);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
} catch (err) {
|
|
437
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
438
|
-
if (message.toLowerCase().includes("snapshot in progress")) {
|
|
439
|
-
log.error(
|
|
440
|
-
"Another snapshot is already running. Wait for it to finish, then retry.",
|
|
441
|
-
);
|
|
442
|
-
} else {
|
|
443
|
-
log.error(`Snapshot failed: ${message}`);
|
|
444
|
-
}
|
|
445
|
-
process.exitCode = 1;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
// ---------------------------------------------------------------------------
|
|
450
|
-
// restore / verify helpers
|
|
451
|
-
// ---------------------------------------------------------------------------
|
|
452
401
|
|
|
453
|
-
/** True when a snapshot path ends in `.vbundle.enc`. */
|
|
454
|
-
function isEncryptedPath(path: string): boolean {
|
|
455
|
-
return path.endsWith(".vbundle.enc");
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
/**
|
|
459
|
-
* Load the backup key when the snapshot is encrypted. Throws a user-facing
|
|
460
|
-
* error when the key file is missing or corrupt.
|
|
461
|
-
*/
|
|
462
|
-
async function loadKeyForEncryptedSnapshot(
|
|
463
|
-
snapshotPath: string,
|
|
464
|
-
): Promise<Buffer | undefined> {
|
|
465
|
-
if (!isEncryptedPath(snapshotPath)) return undefined;
|
|
466
|
-
const keyPath = getBackupKeyPath();
|
|
467
|
-
const key = await readBackupKey(keyPath);
|
|
468
|
-
if (!key) {
|
|
469
|
-
throw new Error(
|
|
470
|
-
`Encrypted snapshot requires backup key at ${keyPath}, but none was found. ` +
|
|
471
|
-
`The key is generated the first time automatic backup runs against an encrypted ` +
|
|
472
|
-
`destination.`,
|
|
473
|
-
);
|
|
474
|
-
}
|
|
475
|
-
return key;
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
/**
|
|
479
|
-
* Prompt for y/N confirmation. Defaults to `false` on empty input, EOF, or
|
|
480
|
-
* anything other than `y` / `yes` (case-insensitive).
|
|
481
|
-
*/
|
|
482
|
-
async function promptConfirm(question: string): Promise<boolean> {
|
|
483
|
-
const readline = await import("node:readline");
|
|
484
|
-
const rl = readline.createInterface({
|
|
485
|
-
input: process.stdin,
|
|
486
|
-
output: process.stdout,
|
|
487
|
-
});
|
|
488
|
-
const answer = await new Promise<string>((resolve) => {
|
|
489
|
-
rl.question(question, resolve);
|
|
490
|
-
});
|
|
491
|
-
rl.close();
|
|
492
|
-
const normalized = answer.trim().toLowerCase();
|
|
493
|
-
return normalized === "y" || normalized === "yes";
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
// ---------------------------------------------------------------------------
|
|
497
|
-
// restore
|
|
498
|
-
// ---------------------------------------------------------------------------
|
|
499
|
-
|
|
500
|
-
export interface RestoreOptions {
|
|
501
|
-
path?: string;
|
|
502
|
-
latest?: boolean;
|
|
503
|
-
yes?: boolean;
|
|
504
|
-
force?: boolean;
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
export async function handleRestore(opts: RestoreOptions): Promise<void> {
|
|
508
|
-
if (!opts.path && !opts.latest) {
|
|
509
|
-
log.error(
|
|
510
|
-
"Must specify --path <snapshot> or --latest. " +
|
|
511
|
-
"Run 'vellum backup list' to see available snapshots.",
|
|
512
|
-
);
|
|
513
|
-
process.exitCode = 1;
|
|
514
|
-
return;
|
|
515
|
-
}
|
|
516
|
-
if (opts.path && opts.latest) {
|
|
517
|
-
log.error("Cannot combine --path and --latest. Drop one.");
|
|
518
|
-
process.exitCode = 1;
|
|
519
|
-
return;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
// Safety gate: a restore while the assistant is running is dangerous.
|
|
523
|
-
// The assistant holds an open SQLite handle (referencing the old inode on
|
|
524
|
-
// Unix), a cached config, and cached trust rules. Overwriting the files
|
|
525
|
-
// under a running process corrupts state. Refuse unless `--force` says the
|
|
526
|
-
// caller knows what they're doing.
|
|
527
|
-
if (!opts.force && isDaemonRunning()) {
|
|
528
|
-
log.error(
|
|
529
|
-
"Assistant is running — stop it first with 'vellum sleep' before restoring " +
|
|
530
|
-
"(safe restore requires an idle assistant). Pass --force to override.",
|
|
531
|
-
);
|
|
532
|
-
process.exitCode = 1;
|
|
533
|
-
return;
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
let snapshotPath: string;
|
|
537
|
-
if (opts.path) {
|
|
538
|
-
snapshotPath = opts.path;
|
|
539
|
-
} else {
|
|
540
|
-
// `--latest` is explicitly scoped to local snapshots — offsite files may
|
|
541
|
-
// not exist after a machine swap (per the plan), so we keep the selection
|
|
542
|
-
// rule predictable.
|
|
543
|
-
const cfg = getConfig().backup;
|
|
544
|
-
const localDir = getLocalBackupsDir(cfg.localDirectory);
|
|
545
|
-
const entries = await listSnapshotsInDir(localDir);
|
|
546
|
-
if (entries.length === 0) {
|
|
547
|
-
log.error(
|
|
548
|
-
`No local snapshots found in ${localDir}. ` +
|
|
549
|
-
`Run 'vellum backup create' to make one, or pass --path with an explicit file.`,
|
|
550
|
-
);
|
|
551
|
-
process.exitCode = 1;
|
|
552
|
-
return;
|
|
553
|
-
}
|
|
554
|
-
snapshotPath = entries[0]!.path;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
if (!opts.yes) {
|
|
558
|
-
const confirmed = await promptConfirm(
|
|
559
|
-
`Restore from ${snapshotPath}? This will overwrite workspace files. (y/N) `,
|
|
560
|
-
);
|
|
561
|
-
if (!confirmed) {
|
|
562
|
-
log.info("Restore cancelled");
|
|
563
|
-
return;
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
let key: Buffer | undefined;
|
|
568
|
-
try {
|
|
569
|
-
key = await loadKeyForEncryptedSnapshot(snapshotPath);
|
|
570
|
-
} catch (err) {
|
|
571
|
-
log.error(err instanceof Error ? err.message : String(err));
|
|
572
|
-
process.exitCode = 1;
|
|
573
|
-
return;
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
try {
|
|
577
|
-
const workspaceDir = getWorkspaceDir();
|
|
578
|
-
const hooksDir = getWorkspaceHooksDir();
|
|
579
|
-
const pathResolver = new DefaultPathResolver(workspaceDir, hooksDir);
|
|
580
|
-
|
|
581
|
-
// Close the SQLite singleton before the bundle is written. If the
|
|
582
|
-
// assistant process was running in-process (tests, `--force`) the
|
|
583
|
-
// singleton may still reference the old file; resetting closes the
|
|
584
|
-
// handle so the restored DB file is picked up cleanly on the next
|
|
585
|
-
// getDb() call.
|
|
586
|
-
resetDb();
|
|
587
|
-
|
|
588
|
-
const result = await restoreFromSnapshot(snapshotPath, {
|
|
589
|
-
key,
|
|
590
|
-
pathResolver,
|
|
591
|
-
workspaceDir,
|
|
592
|
-
});
|
|
593
|
-
|
|
594
|
-
// Invalidate the in-process config cache so the restored settings.json
|
|
595
|
-
// takes effect without requiring a daemon restart.
|
|
596
|
-
invalidateConfigCache();
|
|
597
|
-
|
|
598
|
-
log.info(`Restored from ${snapshotPath}`);
|
|
599
|
-
log.info(` bundle_id: ${result.manifest.bundle_id}`);
|
|
600
|
-
log.info(` schema_version: ${result.manifest.schema_version}`);
|
|
601
|
-
log.info(` files restored: ${result.restoredFiles}`);
|
|
602
|
-
} catch (err) {
|
|
603
|
-
log.error(
|
|
604
|
-
`Restore failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
605
|
-
);
|
|
606
|
-
process.exitCode = 1;
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
// ---------------------------------------------------------------------------
|
|
611
|
-
// verify
|
|
612
|
-
// ---------------------------------------------------------------------------
|
|
613
|
-
|
|
614
|
-
export async function handleVerify(path: string): Promise<void> {
|
|
615
|
-
let key: Buffer | undefined;
|
|
616
|
-
try {
|
|
617
|
-
key = await loadKeyForEncryptedSnapshot(path);
|
|
618
|
-
} catch (err) {
|
|
619
|
-
log.error(err instanceof Error ? err.message : String(err));
|
|
620
|
-
process.exitCode = 1;
|
|
621
|
-
return;
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
try {
|
|
625
|
-
const result = await verifySnapshot(path, { key });
|
|
626
|
-
if (result.valid) {
|
|
627
|
-
log.info(`OK: ${path}`);
|
|
628
|
-
if (result.manifest) {
|
|
629
|
-
log.info(` schema_version: ${result.manifest.schema_version}`);
|
|
630
|
-
log.info(` bundle_id: ${result.manifest.bundle_id}`);
|
|
631
|
-
}
|
|
632
|
-
} else {
|
|
633
|
-
log.error(`Invalid: ${path}`);
|
|
634
|
-
if (result.error) log.error(` ${result.error}`);
|
|
635
|
-
process.exitCode = 1;
|
|
636
|
-
}
|
|
637
|
-
} catch (err) {
|
|
638
|
-
log.error(
|
|
639
|
-
`Verify failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
640
|
-
);
|
|
641
|
-
process.exitCode = 1;
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
402
|
|
|
645
403
|
// ---------------------------------------------------------------------------
|
|
646
404
|
// Command wiring
|
|
@@ -650,7 +408,7 @@ export function registerBackupCommand(program: Command): void {
|
|
|
650
408
|
const backup = program
|
|
651
409
|
.command("backup")
|
|
652
410
|
.description(
|
|
653
|
-
"Manage automated
|
|
411
|
+
"Manage automated backup configuration and list snapshots",
|
|
654
412
|
);
|
|
655
413
|
|
|
656
414
|
backup.addHelpText(
|
|
@@ -659,7 +417,7 @@ export function registerBackupCommand(program: Command): void {
|
|
|
659
417
|
Backups capture a snapshot of the assistant workspace (config, conversations,
|
|
660
418
|
trust rules, hooks, the SQLite database) as a .vbundle file. Credentials are
|
|
661
419
|
NOT included — they live in the OS keychain / CES and users re-authenticate
|
|
662
|
-
integrations after a restore. The automated worker runs on a configurable
|
|
420
|
+
integrations after a restore (via the gateway). The automated worker runs on a configurable
|
|
663
421
|
interval and writes to a local pool under ~/.vellum/backups/local/, optionally
|
|
664
422
|
mirroring each snapshot to one or more offsite destinations (iCloud Drive by
|
|
665
423
|
default).
|
|
@@ -672,10 +430,7 @@ Examples:
|
|
|
672
430
|
$ vellum backup enable --interval 6 --retention 3
|
|
673
431
|
$ vellum backup destinations add /Volumes/BackupSSD/vellum --plaintext
|
|
674
432
|
$ vellum backup status
|
|
675
|
-
$ vellum backup list
|
|
676
|
-
$ vellum backup create
|
|
677
|
-
$ vellum backup restore --latest --yes
|
|
678
|
-
$ vellum backup verify ~/.vellum/backups/local/backup-20260411-093000.vbundle`,
|
|
433
|
+
$ vellum backup list`,
|
|
679
434
|
);
|
|
680
435
|
|
|
681
436
|
backup
|
|
@@ -841,7 +596,7 @@ Examples:
|
|
|
841
596
|
});
|
|
842
597
|
|
|
843
598
|
// ---------------------------------------------------------------------------
|
|
844
|
-
// status / list
|
|
599
|
+
// status / list
|
|
845
600
|
// ---------------------------------------------------------------------------
|
|
846
601
|
|
|
847
602
|
backup
|
|
@@ -880,84 +635,4 @@ Examples:
|
|
|
880
635
|
await handleList();
|
|
881
636
|
});
|
|
882
637
|
|
|
883
|
-
backup
|
|
884
|
-
.command("create")
|
|
885
|
-
.description("Create a backup snapshot immediately (ignores interval)")
|
|
886
|
-
.addHelpText(
|
|
887
|
-
"after",
|
|
888
|
-
`
|
|
889
|
-
Triggers an on-demand snapshot. Bypasses the interval gate so it will run even
|
|
890
|
-
if the automated worker just ran, but still honours the concurrency mutex --
|
|
891
|
-
a second concurrent caller errors with "snapshot in progress". Does NOT update
|
|
892
|
-
the last-run checkpoint (manual snapshots should not reset the cadence).
|
|
893
|
-
|
|
894
|
-
Examples:
|
|
895
|
-
$ vellum backup create`,
|
|
896
|
-
)
|
|
897
|
-
.action(async () => {
|
|
898
|
-
await handleCreate();
|
|
899
|
-
});
|
|
900
|
-
|
|
901
|
-
backup
|
|
902
|
-
.command("restore")
|
|
903
|
-
.description("Restore a backup snapshot into the workspace")
|
|
904
|
-
.option(
|
|
905
|
-
"--path <path>",
|
|
906
|
-
"Absolute path to the .vbundle or .vbundle.enc file to restore",
|
|
907
|
-
)
|
|
908
|
-
.option(
|
|
909
|
-
"--latest",
|
|
910
|
-
"Restore the newest local snapshot (offsite files are not considered)",
|
|
911
|
-
)
|
|
912
|
-
.option("--yes", "Skip the confirmation prompt")
|
|
913
|
-
.option(
|
|
914
|
-
"--force",
|
|
915
|
-
"Restore even when the assistant is running (unsafe — only use if you know what you're doing)",
|
|
916
|
-
)
|
|
917
|
-
.addHelpText(
|
|
918
|
-
"after",
|
|
919
|
-
`
|
|
920
|
-
Restores a snapshot by writing its contents back into the workspace.
|
|
921
|
-
Encryption is auto-detected from the file extension; encrypted snapshots
|
|
922
|
-
(.vbundle.enc) require the backup key at ~/.vellum/workspace/.backup.key.
|
|
923
|
-
|
|
924
|
-
Prompts for confirmation unless --yes is passed.
|
|
925
|
-
|
|
926
|
-
--latest selects the newest local snapshot only. Offsite files may not exist
|
|
927
|
-
on a new machine after a workspace migration, so --latest refuses to dig into
|
|
928
|
-
them on purpose.
|
|
929
|
-
|
|
930
|
-
Safety: refuses to run while the assistant is running, because the live
|
|
931
|
-
SQLite handle and cached config/trust rules can corrupt the restored state.
|
|
932
|
-
Stop the assistant first with 'vellum sleep'. Pass --force to override (only
|
|
933
|
-
use this if you understand the risk).
|
|
934
|
-
|
|
935
|
-
Examples:
|
|
936
|
-
$ vellum backup restore --latest --yes
|
|
937
|
-
$ vellum backup restore --path ~/.vellum/backups/local/backup-20260411-093000.vbundle`,
|
|
938
|
-
)
|
|
939
|
-
.action(async (opts: RestoreOptions) => {
|
|
940
|
-
await handleRestore(opts);
|
|
941
|
-
});
|
|
942
|
-
|
|
943
|
-
backup
|
|
944
|
-
.command("verify <path>")
|
|
945
|
-
.description("Verify a backup snapshot without restoring it")
|
|
946
|
-
.addHelpText(
|
|
947
|
-
"after",
|
|
948
|
-
`
|
|
949
|
-
Arguments:
|
|
950
|
-
path Absolute path to a .vbundle or .vbundle.enc snapshot file.
|
|
951
|
-
|
|
952
|
-
Runs the same validation the importer would run but never touches the
|
|
953
|
-
workspace. Encryption is auto-detected from the file extension; encrypted
|
|
954
|
-
snapshots require the backup key at ~/.vellum/workspace/.backup.key.
|
|
955
|
-
|
|
956
|
-
Examples:
|
|
957
|
-
$ vellum backup verify ~/.vellum/backups/local/backup-20260411-093000.vbundle
|
|
958
|
-
$ vellum backup verify /Volumes/BackupSSD/vellum/backup-20260411-093000.vbundle.enc`,
|
|
959
|
-
)
|
|
960
|
-
.action(async (path: string) => {
|
|
961
|
-
await handleVerify(path);
|
|
962
|
-
});
|
|
963
638
|
}
|
package/src/cli/commands/bash.ts
CHANGED
|
@@ -1,23 +1,11 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import {
|
|
3
|
-
existsSync,
|
|
4
|
-
mkdirSync,
|
|
5
|
-
readFileSync,
|
|
6
|
-
unlinkSync,
|
|
7
|
-
writeFileSync,
|
|
8
|
-
} from "node:fs";
|
|
9
|
-
import { join } from "node:path";
|
|
10
|
-
|
|
11
1
|
import type { Command } from "commander";
|
|
12
2
|
|
|
13
|
-
import {
|
|
3
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
14
4
|
import { log } from "../logger.js";
|
|
15
5
|
|
|
16
6
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
17
|
-
const POLL_INTERVAL_MS = 100;
|
|
18
7
|
|
|
19
|
-
interface
|
|
20
|
-
requestId: string;
|
|
8
|
+
interface DebugBashResult {
|
|
21
9
|
stdout: string;
|
|
22
10
|
stderr: string;
|
|
23
11
|
exitCode: number | null;
|
|
@@ -39,20 +27,16 @@ export function registerBashCommand(program: Command): void {
|
|
|
39
27
|
.addHelpText(
|
|
40
28
|
"after",
|
|
41
29
|
`
|
|
42
|
-
Sends a shell command to the running assistant for execution via the
|
|
43
|
-
|
|
44
|
-
|
|
30
|
+
Sends a shell command to the running assistant for execution via the IPC
|
|
31
|
+
socket. The assistant spawns the command in its own process environment and
|
|
32
|
+
returns stdout, stderr, and the exit code.
|
|
45
33
|
|
|
46
34
|
This is a developer debugging tool for inspecting how the assistant invokes and
|
|
47
35
|
observes shell commands. The command runs with the assistant's environment, working
|
|
48
36
|
directory, and process context — not the caller's shell.
|
|
49
37
|
|
|
50
38
|
Requires the assistant to be running with VELLUM_DEBUG=1. When debug mode is off
|
|
51
|
-
(the default), the assistant
|
|
52
|
-
|
|
53
|
-
The CLI writes the command to signals/bash.<requestId> and polls
|
|
54
|
-
signals/bash.<requestId>.result for the output. The assistant must be running
|
|
55
|
-
for this to work.
|
|
39
|
+
(the default), the assistant returns an error immediately.
|
|
56
40
|
|
|
57
41
|
Arguments:
|
|
58
42
|
command The shell command string to execute (e.g. "echo hello", "ls -la").
|
|
@@ -64,7 +48,7 @@ Examples:
|
|
|
64
48
|
$ assistant bash "env | grep PATH" --timeout 10000
|
|
65
49
|
$ assistant bash "ls -la"`,
|
|
66
50
|
)
|
|
67
|
-
.action((command: string, opts: { timeout: string }) => {
|
|
51
|
+
.action(async (command: string, opts: { timeout: string }) => {
|
|
68
52
|
const timeoutMs = parseInt(opts.timeout, 10);
|
|
69
53
|
if (!Number.isFinite(timeoutMs) || timeoutMs < 1) {
|
|
70
54
|
log.error("Invalid timeout value. Must be a positive integer.");
|
|
@@ -72,105 +56,48 @@ Examples:
|
|
|
72
56
|
return;
|
|
73
57
|
}
|
|
74
58
|
|
|
75
|
-
const
|
|
76
|
-
|
|
59
|
+
const result = await cliIpcCall<DebugBashResult>(
|
|
60
|
+
"debug_bash",
|
|
61
|
+
{ body: { command, timeoutMs } },
|
|
62
|
+
{ timeoutMs: timeoutMs + 10_000 },
|
|
63
|
+
);
|
|
77
64
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
} catch {
|
|
81
|
-
log.error("Failed to create signals directory.");
|
|
65
|
+
if (!result.ok) {
|
|
66
|
+
log.error(result.error ?? "Failed to reach the assistant.");
|
|
82
67
|
process.exitCode = 1;
|
|
83
68
|
return;
|
|
84
69
|
}
|
|
85
70
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
try {
|
|
91
|
-
writeFileSync(
|
|
92
|
-
signalPath,
|
|
93
|
-
JSON.stringify({ requestId, command, timeoutMs }),
|
|
94
|
-
);
|
|
95
|
-
} catch {
|
|
96
|
-
log.error("Failed to write bash signal file.");
|
|
71
|
+
const data = result.result!;
|
|
72
|
+
|
|
73
|
+
if (data.error) {
|
|
74
|
+
log.error(data.error);
|
|
97
75
|
process.exitCode = 1;
|
|
98
76
|
return;
|
|
99
77
|
}
|
|
100
78
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const deadline = Date.now() + timeoutMs + 5_000; // extra buffer for assistant overhead
|
|
106
|
-
|
|
107
|
-
const poll = setInterval(() => {
|
|
108
|
-
if (Date.now() > deadline) {
|
|
109
|
-
clearInterval(poll);
|
|
110
|
-
cleanupSignalFiles();
|
|
111
|
-
log.error(
|
|
112
|
-
"Timed out waiting for response. Is the assistant running?",
|
|
113
|
-
);
|
|
114
|
-
process.exitCode = 1;
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if (!existsSync(resultPath)) return;
|
|
119
|
-
|
|
120
|
-
let result: BashSignalResult;
|
|
121
|
-
try {
|
|
122
|
-
const content = readFileSync(resultPath, "utf-8");
|
|
123
|
-
result = JSON.parse(content) as BashSignalResult;
|
|
124
|
-
} catch {
|
|
125
|
-
// File may be partially written; retry on next poll.
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Ignore stale results from a previous invocation.
|
|
130
|
-
if (result.requestId !== requestId) return;
|
|
131
|
-
|
|
132
|
-
clearInterval(poll);
|
|
133
|
-
cleanupSignalFiles();
|
|
134
|
-
|
|
135
|
-
if (result.error) {
|
|
136
|
-
log.error(result.error);
|
|
137
|
-
process.exitCode = 1;
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (result.stdout) {
|
|
142
|
-
process.stdout.write(result.stdout);
|
|
143
|
-
if (!result.stdout.endsWith("\n")) {
|
|
144
|
-
process.stdout.write("\n");
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (result.stderr) {
|
|
149
|
-
process.stderr.write(result.stderr);
|
|
150
|
-
if (!result.stderr.endsWith("\n")) {
|
|
151
|
-
process.stderr.write("\n");
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
if (result.timedOut) {
|
|
156
|
-
log.info(`Command timed out in assistant.`);
|
|
79
|
+
if (data.stdout) {
|
|
80
|
+
process.stdout.write(data.stdout);
|
|
81
|
+
if (!data.stdout.endsWith("\n")) {
|
|
82
|
+
process.stdout.write("\n");
|
|
157
83
|
}
|
|
84
|
+
}
|
|
158
85
|
|
|
159
|
-
|
|
160
|
-
|
|
86
|
+
if (data.stderr) {
|
|
87
|
+
process.stderr.write(data.stderr);
|
|
88
|
+
if (!data.stderr.endsWith("\n")) {
|
|
89
|
+
process.stderr.write("\n");
|
|
161
90
|
}
|
|
91
|
+
}
|
|
162
92
|
|
|
163
|
-
|
|
164
|
-
|
|
93
|
+
if (data.timedOut) {
|
|
94
|
+
log.info(`Command timed out in assistant.`);
|
|
95
|
+
}
|
|
165
96
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
try {
|
|
169
|
-
unlinkSync(p);
|
|
170
|
-
} catch {
|
|
171
|
-
// Best-effort cleanup; the file may already be gone.
|
|
172
|
-
}
|
|
173
|
-
}
|
|
97
|
+
if (data.exitCode != null && data.exitCode !== 0) {
|
|
98
|
+
log.info(`Exit code: ${data.exitCode}`);
|
|
174
99
|
}
|
|
100
|
+
|
|
101
|
+
process.exitCode = data.exitCode ?? 1;
|
|
175
102
|
});
|
|
176
103
|
}
|