@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
|
@@ -39,12 +39,15 @@ import {
|
|
|
39
39
|
resolveSlash,
|
|
40
40
|
} from "../../daemon/conversation-slash.js";
|
|
41
41
|
import { getOrCreateConversation as getOrCreateConversationInstance } from "../../daemon/conversation-store.js";
|
|
42
|
+
import { canonicalizeTimeZone } from "../../daemon/date-context.js";
|
|
42
43
|
import {
|
|
43
44
|
getCannedFirstGreeting,
|
|
44
45
|
isWakeUpGreeting,
|
|
45
46
|
} from "../../daemon/first-greeting.js";
|
|
46
47
|
import { renderHistoryContent } from "../../daemon/handlers/shared.js";
|
|
48
|
+
import { HostAppControlProxy } from "../../daemon/host-app-control-proxy.js";
|
|
47
49
|
import { HostCuProxy } from "../../daemon/host-cu-proxy.js";
|
|
50
|
+
import { preactivateHostProxySkills } from "../../daemon/host-proxy-preactivation.js";
|
|
48
51
|
import type { ServerMessage } from "../../daemon/message-protocol.js";
|
|
49
52
|
import type {
|
|
50
53
|
HostProxyTransportMetadata,
|
|
@@ -84,6 +87,8 @@ import {
|
|
|
84
87
|
getOrCreateConversation,
|
|
85
88
|
} from "../../memory/conversation-key-store.js";
|
|
86
89
|
import { searchConversations } from "../../memory/conversation-queries.js";
|
|
90
|
+
import { normalizeOnboardingContext } from "../../prompts/normalize-onboarding.js";
|
|
91
|
+
import { writeOnboardingSection } from "../../prompts/persona-resolver.js";
|
|
87
92
|
import { getConfiguredProvider } from "../../providers/provider-send-message.js";
|
|
88
93
|
import type { Provider } from "../../providers/types.js";
|
|
89
94
|
import { checkIngressForSecrets } from "../../security/secret-ingress.js";
|
|
@@ -997,7 +1002,7 @@ function mergeConsecutiveAssistantMessages(messages: MessageRow[]): {
|
|
|
997
1002
|
/**
|
|
998
1003
|
* Persist the pre-chat onboarding payload to disk.
|
|
999
1004
|
*
|
|
1000
|
-
* Runs only on the very first message of a fresh conversation.
|
|
1005
|
+
* Runs only on the very first message of a fresh conversation. Four
|
|
1001
1006
|
* artifacts are produced:
|
|
1002
1007
|
*
|
|
1003
1008
|
* 1. `data/onboarding-context.json` — sidecar read by the
|
|
@@ -1005,12 +1010,15 @@ function mergeConsecutiveAssistantMessages(messages: MessageRow[]): {
|
|
|
1005
1010
|
* the pure-recomputation write cycle (every turn boundary rebuilds
|
|
1006
1011
|
* facts from markdown; the sidecar is the durable source for the
|
|
1007
1012
|
* tool/task/tone chips).
|
|
1008
|
-
* 2. `IDENTITY.md`
|
|
1009
|
-
*
|
|
1010
|
-
*
|
|
1011
|
-
*
|
|
1012
|
-
*
|
|
1013
|
-
* 3.
|
|
1013
|
+
* 2. `IDENTITY.md` — assistant persona seed file, only written when
|
|
1014
|
+
* missing so we never clobber existing content. Feeds the system
|
|
1015
|
+
* prompt and the relationship-state writer's `parseIdentity`
|
|
1016
|
+
* helper after a daemon restart when the in-memory onboarding
|
|
1017
|
+
* context is gone.
|
|
1018
|
+
* 3. Onboarding section in the guardian persona file — written via
|
|
1019
|
+
* `writeOnboardingSection`, which handles the user's preferred
|
|
1020
|
+
* name (with fallback to root `USER.md`).
|
|
1021
|
+
* 4. `data/relationship-state.json` — kicked off fire-and-forget so
|
|
1014
1022
|
* the Home page can populate immediately on first visit instead
|
|
1015
1023
|
* of waiting for the first agent-turn boundary.
|
|
1016
1024
|
*
|
|
@@ -1055,25 +1063,11 @@ export function persistOnboardingArtifacts(onboarding: {
|
|
|
1055
1063
|
}
|
|
1056
1064
|
}
|
|
1057
1065
|
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
const content = readFileSync(userPath, "utf-8");
|
|
1064
|
-
const updated = content.replace(
|
|
1065
|
-
/^- (?:\*\*)?Name:(?:\*\*)?\s*.*$/m,
|
|
1066
|
-
() => `- **Name:** ${userName}`,
|
|
1067
|
-
);
|
|
1068
|
-
if (updated !== content) {
|
|
1069
|
-
writeFileSync(userPath, updated, "utf-8");
|
|
1070
|
-
}
|
|
1071
|
-
} else {
|
|
1072
|
-
writeFileSync(userPath, `# User\n\n- **Name:** ${userName}\n`, "utf-8");
|
|
1073
|
-
}
|
|
1074
|
-
} catch (err) {
|
|
1075
|
-
log.warn({ err, userPath }, "Failed to seed USER.md from onboarding");
|
|
1076
|
-
}
|
|
1066
|
+
try {
|
|
1067
|
+
const normalized = normalizeOnboardingContext(onboarding);
|
|
1068
|
+
writeOnboardingSection(normalized);
|
|
1069
|
+
} catch (err) {
|
|
1070
|
+
log.warn({ err }, "Failed to write onboarding section to persona file");
|
|
1077
1071
|
}
|
|
1078
1072
|
|
|
1079
1073
|
void writeRelationshipState().catch((err) => {
|
|
@@ -1102,6 +1096,7 @@ export async function handleSendMessage(
|
|
|
1102
1096
|
bypassSecretCheck?: boolean;
|
|
1103
1097
|
hostHomeDir?: string;
|
|
1104
1098
|
hostUsername?: string;
|
|
1099
|
+
clientTimezone?: unknown;
|
|
1105
1100
|
clientId?: string;
|
|
1106
1101
|
clientMessageId?: string;
|
|
1107
1102
|
inferenceProfile?: string | null;
|
|
@@ -1181,6 +1176,10 @@ export async function handleSendMessage(
|
|
|
1181
1176
|
)}`,
|
|
1182
1177
|
);
|
|
1183
1178
|
}
|
|
1179
|
+
const clientTimezone =
|
|
1180
|
+
typeof body.clientTimezone === "string"
|
|
1181
|
+
? (canonicalizeTimeZone(body.clientTimezone) ?? undefined)
|
|
1182
|
+
: undefined;
|
|
1184
1183
|
|
|
1185
1184
|
// When conversationKey is omitted, derive a stable default from
|
|
1186
1185
|
// sourceChannel + sourceInterface so that repeated calls from the same
|
|
@@ -1300,10 +1299,12 @@ export async function handleSendMessage(
|
|
|
1300
1299
|
interfaceId: sourceInterface,
|
|
1301
1300
|
hostHomeDir: body.hostHomeDir,
|
|
1302
1301
|
hostUsername: body.hostUsername,
|
|
1302
|
+
...(clientTimezone ? { clientTimezone } : {}),
|
|
1303
1303
|
} satisfies HostProxyTransportMetadata)
|
|
1304
1304
|
: ({
|
|
1305
1305
|
channelId: sourceChannel,
|
|
1306
1306
|
interfaceId: sourceInterface,
|
|
1307
|
+
...(clientTimezone ? { clientTimezone } : {}),
|
|
1307
1308
|
} satisfies NonHostProxyTransportMetadata);
|
|
1308
1309
|
|
|
1309
1310
|
const conversation = await smDeps.getOrCreateConversation(
|
|
@@ -1320,10 +1321,9 @@ export async function handleSendMessage(
|
|
|
1320
1321
|
|
|
1321
1322
|
// Store pre-chat onboarding context on the conversation when this is the
|
|
1322
1323
|
// very first message (no prior messages loaded). Artifact persistence
|
|
1323
|
-
// (IDENTITY.md, USER.md, sidecar)
|
|
1324
|
-
//
|
|
1325
|
-
// the
|
|
1326
|
-
// path it runs immediately before inference starts.
|
|
1324
|
+
// (IDENTITY.md, USER.md, sidecar) runs before either the canned greeting
|
|
1325
|
+
// broadcast or normal LLM inference so client-side identity reads observe
|
|
1326
|
+
// the selected assistant name.
|
|
1327
1327
|
const isFirstOnboarding =
|
|
1328
1328
|
!!body.onboarding && conversation.messages.length === 0;
|
|
1329
1329
|
if (isFirstOnboarding) {
|
|
@@ -1395,15 +1395,30 @@ export async function handleSendMessage(
|
|
|
1395
1395
|
if (!conversation.isProcessing() || !conversation.hostCuProxy) {
|
|
1396
1396
|
conversation.setHostCuProxy(new HostCuProxy());
|
|
1397
1397
|
}
|
|
1398
|
-
// Only preactivate CU when the conversation is idle — if the conversation is
|
|
1399
|
-
// processing, this message will be queued and preactivation is deferred
|
|
1400
|
-
// to dequeue time in drainQueueImpl to avoid mutating in-flight turn state.
|
|
1401
|
-
if (!conversation.isProcessing()) {
|
|
1402
|
-
conversation.addPreactivatedSkillId("computer-use");
|
|
1403
|
-
}
|
|
1404
1398
|
} else if (!conversation.isProcessing()) {
|
|
1405
1399
|
conversation.setHostCuProxy(undefined);
|
|
1406
1400
|
}
|
|
1401
|
+
// App-control mirrors CU's per-conversation lifecycle: the proxy owns a
|
|
1402
|
+
// singleton lock plus per-session loop tracking. Instantiation is
|
|
1403
|
+
// unconditional when the client supports the capability — feature-flag
|
|
1404
|
+
// gating lives in the skill-projection layer (which reads the
|
|
1405
|
+
// `feature-flag: app-control` declaration in SKILL.md frontmatter), so
|
|
1406
|
+
// an attached proxy is harmless when the flag resolves to off.
|
|
1407
|
+
if (supportsHostProxy(sourceInterface, "host_app_control")) {
|
|
1408
|
+
if (!conversation.isProcessing() || !conversation.hostAppControlProxy) {
|
|
1409
|
+
conversation.setHostAppControlProxy(
|
|
1410
|
+
new HostAppControlProxy(mapping.conversationId),
|
|
1411
|
+
);
|
|
1412
|
+
}
|
|
1413
|
+
} else if (!conversation.isProcessing()) {
|
|
1414
|
+
conversation.setHostAppControlProxy(undefined);
|
|
1415
|
+
}
|
|
1416
|
+
// Only preactivate when the conversation is idle — if it's processing,
|
|
1417
|
+
// this message will be queued and preactivation is deferred to dequeue
|
|
1418
|
+
// time in drainQueueImpl to avoid mutating in-flight turn state.
|
|
1419
|
+
if (!conversation.isProcessing()) {
|
|
1420
|
+
preactivateHostProxySkills(conversation, sourceInterface);
|
|
1421
|
+
}
|
|
1407
1422
|
// Wire sendToClient to the SSE hub so all subsystems can reach the HTTP client.
|
|
1408
1423
|
// hasNoClient must remain `!isInteractive` so downstream tool gating
|
|
1409
1424
|
// (`isToolActiveForContext` for HOST_TOOL_NAMES, `createToolExecutor`'s
|
|
@@ -1473,6 +1488,10 @@ export async function handleSendMessage(
|
|
|
1473
1488
|
conversationId,
|
|
1474
1489
|
};
|
|
1475
1490
|
|
|
1491
|
+
if (isFirstOnboarding) {
|
|
1492
|
+
persistOnboardingArtifacts(body.onboarding!);
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1476
1495
|
setTimeout(() => {
|
|
1477
1496
|
broadcastMessage({
|
|
1478
1497
|
type: "user_message_echo",
|
|
@@ -1493,9 +1512,6 @@ export async function handleSendMessage(
|
|
|
1493
1512
|
"canned-greeting queue drain",
|
|
1494
1513
|
);
|
|
1495
1514
|
|
|
1496
|
-
if (isFirstOnboarding) {
|
|
1497
|
-
persistOnboardingArtifacts(body.onboarding!);
|
|
1498
|
-
}
|
|
1499
1515
|
conversation.warmPromptCache();
|
|
1500
1516
|
}, 0);
|
|
1501
1517
|
|
|
@@ -1974,6 +1990,13 @@ async function generateLlmSuggestion(
|
|
|
1974
1990
|
// prefill-safe model. Keep `stop_sequences: ["</reply>"]` as an
|
|
1975
1991
|
// early-termination hint; the parser below handles both tagged and
|
|
1976
1992
|
// untagged responses so untagged "casual answer" replies still work.
|
|
1993
|
+
//
|
|
1994
|
+
// Force `thinking: disabled` + `effort: none` so the call works on any
|
|
1995
|
+
// user profile — including thinking-enabled profiles (Opus 4.x at
|
|
1996
|
+
// `effort: high|xhigh`, etc.) where Anthropic 400s on `temperature` ≠ 1
|
|
1997
|
+
// when thinking is enabled or in adaptive mode. A 60-token reply chip
|
|
1998
|
+
// doesn't benefit from extended thinking anyway, and burning thinking
|
|
1999
|
+
// tokens here would be wasteful.
|
|
1977
2000
|
const response = await provider.sendMessage(
|
|
1978
2001
|
[{ role: "user", content: [{ type: "text", text: userPrompt }] }],
|
|
1979
2002
|
[], // no tools
|
|
@@ -1984,6 +2007,8 @@ async function generateLlmSuggestion(
|
|
|
1984
2007
|
max_tokens: 60,
|
|
1985
2008
|
stop_sequences: ["</reply>"],
|
|
1986
2009
|
temperature: 0.7,
|
|
2010
|
+
thinking: { type: "disabled" },
|
|
2011
|
+
effort: "none",
|
|
1987
2012
|
},
|
|
1988
2013
|
},
|
|
1989
2014
|
);
|
|
@@ -2257,6 +2282,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
2257
2282
|
.optional(),
|
|
2258
2283
|
conversationType: z.string().optional(),
|
|
2259
2284
|
slashCommand: z.string().optional(),
|
|
2285
|
+
clientTimezone: z.string().optional(),
|
|
2260
2286
|
inferenceProfile: z.string().nullable().optional(),
|
|
2261
2287
|
riskThreshold: z.enum(VALID_RISK_THRESHOLDS).optional(),
|
|
2262
2288
|
}),
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC route for executing shell commands through the assistant process.
|
|
3
|
+
*
|
|
4
|
+
* The CLI sends the command over the IPC socket and receives a single
|
|
5
|
+
* response containing stdout, stderr, and the exit code.
|
|
6
|
+
*
|
|
7
|
+
* **Security**: Gated behind VELLUM_DEBUG=1. When debug mode is off (the
|
|
8
|
+
* default), the handler returns an error immediately so the CLI surfaces a
|
|
9
|
+
* clear rejection instead of hanging. The assistant must be restarted with
|
|
10
|
+
* VELLUM_DEBUG=1 for this route to execute commands.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { spawn } from "node:child_process";
|
|
14
|
+
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
|
|
17
|
+
import { getIsContainerized } from "../../config/env-registry.js";
|
|
18
|
+
import { getWorkspaceDir } from "../../util/platform.js";
|
|
19
|
+
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
20
|
+
|
|
21
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
22
|
+
|
|
23
|
+
function isDebugMode(): boolean {
|
|
24
|
+
return (
|
|
25
|
+
process.env.VELLUM_DEBUG === "1" || process.env.VELLUM_DEBUG === "true"
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface DebugBashResult {
|
|
30
|
+
stdout: string;
|
|
31
|
+
stderr: string;
|
|
32
|
+
exitCode: number | null;
|
|
33
|
+
timedOut: boolean;
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function handleDebugBash({ body }: RouteHandlerArgs): Promise<DebugBashResult> {
|
|
38
|
+
if (getIsContainerized()) {
|
|
39
|
+
return Promise.resolve({
|
|
40
|
+
stdout: "",
|
|
41
|
+
stderr: "",
|
|
42
|
+
exitCode: null,
|
|
43
|
+
timedOut: false,
|
|
44
|
+
error: "debug bash is not available in containerized environments",
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (!isDebugMode()) {
|
|
49
|
+
return Promise.resolve({
|
|
50
|
+
stdout: "",
|
|
51
|
+
stderr: "",
|
|
52
|
+
exitCode: null,
|
|
53
|
+
timedOut: false,
|
|
54
|
+
error:
|
|
55
|
+
"Bash debug execution is disabled. The running assistant process must have been started with VELLUM_DEBUG=1 (setting it on the CLI command alone is not enough). Restart the assistant with: vellum sleep && VELLUM_DEBUG=1 vellum wake",
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const { command, timeoutMs } = body as {
|
|
60
|
+
command?: string;
|
|
61
|
+
timeoutMs?: number;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
if (!command || typeof command !== "string") {
|
|
65
|
+
return Promise.resolve({
|
|
66
|
+
stdout: "",
|
|
67
|
+
stderr: "",
|
|
68
|
+
exitCode: null,
|
|
69
|
+
timedOut: false,
|
|
70
|
+
error: "command is required",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const effectiveTimeout =
|
|
75
|
+
typeof timeoutMs === "number" && timeoutMs > 0
|
|
76
|
+
? timeoutMs
|
|
77
|
+
: DEFAULT_TIMEOUT_MS;
|
|
78
|
+
|
|
79
|
+
return new Promise<DebugBashResult>((resolve) => {
|
|
80
|
+
const stdoutChunks: Buffer[] = [];
|
|
81
|
+
const stderrChunks: Buffer[] = [];
|
|
82
|
+
let timedOut = false;
|
|
83
|
+
let settled = false;
|
|
84
|
+
|
|
85
|
+
const finish = (result: DebugBashResult) => {
|
|
86
|
+
if (settled) return;
|
|
87
|
+
settled = true;
|
|
88
|
+
resolve(result);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const child = spawn("bash", ["-c", command], {
|
|
92
|
+
cwd: getWorkspaceDir(),
|
|
93
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
94
|
+
detached: true,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const timer = setTimeout(() => {
|
|
98
|
+
timedOut = true;
|
|
99
|
+
try {
|
|
100
|
+
process.kill(-child.pid!, "SIGKILL");
|
|
101
|
+
} catch {
|
|
102
|
+
// Process group may have already exited.
|
|
103
|
+
}
|
|
104
|
+
}, effectiveTimeout);
|
|
105
|
+
|
|
106
|
+
child.stdout.on("data", (data: Buffer) => {
|
|
107
|
+
stdoutChunks.push(data);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
child.stderr.on("data", (data: Buffer) => {
|
|
111
|
+
stderrChunks.push(data);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
child.on("close", (code) => {
|
|
115
|
+
clearTimeout(timer);
|
|
116
|
+
finish({
|
|
117
|
+
stdout: Buffer.concat(stdoutChunks).toString(),
|
|
118
|
+
stderr: Buffer.concat(stderrChunks).toString(),
|
|
119
|
+
exitCode: code,
|
|
120
|
+
timedOut,
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
child.on("error", (err) => {
|
|
125
|
+
clearTimeout(timer);
|
|
126
|
+
finish({
|
|
127
|
+
stdout: "",
|
|
128
|
+
stderr: "",
|
|
129
|
+
exitCode: null,
|
|
130
|
+
timedOut: false,
|
|
131
|
+
error: err.message,
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export const ROUTES: RouteDefinition[] = [
|
|
138
|
+
{
|
|
139
|
+
operationId: "debug_bash",
|
|
140
|
+
endpoint: "debug/bash",
|
|
141
|
+
method: "POST",
|
|
142
|
+
requireGuardian: false,
|
|
143
|
+
summary: "Execute a shell command in the assistant process",
|
|
144
|
+
description:
|
|
145
|
+
"Developer debugging tool. Requires the assistant to be running with VELLUM_DEBUG=1.",
|
|
146
|
+
tags: ["debug"],
|
|
147
|
+
requestBody: z.object({
|
|
148
|
+
command: z.string().describe("Shell command to execute via bash -c"),
|
|
149
|
+
timeoutMs: z
|
|
150
|
+
.number()
|
|
151
|
+
.optional()
|
|
152
|
+
.describe("Execution timeout in milliseconds (default: 30000)"),
|
|
153
|
+
}),
|
|
154
|
+
responseBody: z.object({
|
|
155
|
+
stdout: z.string(),
|
|
156
|
+
stderr: z.string(),
|
|
157
|
+
exitCode: z.number().nullable(),
|
|
158
|
+
timedOut: z.boolean(),
|
|
159
|
+
error: z.string().optional(),
|
|
160
|
+
}),
|
|
161
|
+
handler: handleDebugBash,
|
|
162
|
+
},
|
|
163
|
+
];
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
acknowledgeDiskPressureLock,
|
|
5
|
+
DISK_PRESSURE_OVERRIDE_CONFIRMATION,
|
|
6
|
+
getDiskPressureStatus,
|
|
7
|
+
overrideDiskPressureLock,
|
|
8
|
+
} from "../../daemon/disk-pressure-guard.js";
|
|
9
|
+
import { RouteError } from "./errors.js";
|
|
10
|
+
import type { RouteDefinition } from "./types.js";
|
|
11
|
+
|
|
12
|
+
const DiskPressureStatusSchema = z.object({
|
|
13
|
+
enabled: z.boolean(),
|
|
14
|
+
state: z.enum(["disabled", "ok", "critical", "unknown"]),
|
|
15
|
+
locked: z.boolean(),
|
|
16
|
+
acknowledged: z.boolean(),
|
|
17
|
+
overrideActive: z.boolean(),
|
|
18
|
+
effectivelyLocked: z.boolean(),
|
|
19
|
+
lockId: z.string().nullable(),
|
|
20
|
+
usagePercent: z.number().nullable(),
|
|
21
|
+
thresholdPercent: z.number(),
|
|
22
|
+
path: z.string().nullable(),
|
|
23
|
+
lastCheckedAt: z.string().nullable(),
|
|
24
|
+
blockedCapabilities: z.array(
|
|
25
|
+
z.enum(["agent-turns", "background-work", "remote-ingress"]),
|
|
26
|
+
),
|
|
27
|
+
error: z.string().nullable(),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const DiskPressureActionResponseSchema = z.object({
|
|
31
|
+
status: DiskPressureStatusSchema,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const OverrideRequestSchema = z.object({
|
|
35
|
+
confirmation: z.string(),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
function statusResponse() {
|
|
39
|
+
return { status: getDiskPressureStatus() };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function transitionErrorCode(
|
|
43
|
+
reason: "not_locked" | "already_acknowledged" | "already_overridden",
|
|
44
|
+
): string {
|
|
45
|
+
if (reason === "not_locked") return "NOT_LOCKED";
|
|
46
|
+
if (reason === "already_acknowledged") return "ALREADY_ACKNOWLEDGED";
|
|
47
|
+
return "ALREADY_OVERRIDDEN";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const ROUTES: RouteDefinition[] = [
|
|
51
|
+
{
|
|
52
|
+
operationId: "getDiskPressureStatus",
|
|
53
|
+
endpoint: "disk-pressure/status",
|
|
54
|
+
method: "GET",
|
|
55
|
+
policyKey: "disk-pressure/status",
|
|
56
|
+
requirePolicyEnforcement: true,
|
|
57
|
+
summary: "Get disk pressure status",
|
|
58
|
+
description:
|
|
59
|
+
"Return the current disk pressure status snapshot. When safe storage limits are disabled, returns a disabled status.",
|
|
60
|
+
tags: ["disk-pressure"],
|
|
61
|
+
responseBody: DiskPressureActionResponseSchema,
|
|
62
|
+
handler: () => statusResponse(),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
operationId: "acknowledgeDiskPressure",
|
|
66
|
+
endpoint: "disk-pressure/acknowledge",
|
|
67
|
+
method: "POST",
|
|
68
|
+
policyKey: "disk-pressure/acknowledge",
|
|
69
|
+
requirePolicyEnforcement: true,
|
|
70
|
+
summary: "Acknowledge disk pressure",
|
|
71
|
+
description:
|
|
72
|
+
"Acknowledge the current disk pressure lock and enter cleanup mode without overriding assistant protections.",
|
|
73
|
+
tags: ["disk-pressure"],
|
|
74
|
+
responseBody: DiskPressureActionResponseSchema,
|
|
75
|
+
additionalResponses: {
|
|
76
|
+
"409": { description: "No active lock or lock already acknowledged." },
|
|
77
|
+
},
|
|
78
|
+
handler: () => {
|
|
79
|
+
const result = acknowledgeDiskPressureLock();
|
|
80
|
+
if (result.ok) return { status: result.status };
|
|
81
|
+
if (result.reason === "invalid_confirmation") {
|
|
82
|
+
throw new RouteError(result.message, "INVALID_CONFIRMATION", 400);
|
|
83
|
+
}
|
|
84
|
+
throw new RouteError(
|
|
85
|
+
result.message,
|
|
86
|
+
transitionErrorCode(result.reason),
|
|
87
|
+
409,
|
|
88
|
+
);
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
operationId: "overrideDiskPressure",
|
|
93
|
+
endpoint: "disk-pressure/override",
|
|
94
|
+
method: "POST",
|
|
95
|
+
policyKey: "disk-pressure/override",
|
|
96
|
+
requirePolicyEnforcement: true,
|
|
97
|
+
summary: "Override disk pressure",
|
|
98
|
+
description: `Override the current disk pressure lock only after confirming "${DISK_PRESSURE_OVERRIDE_CONFIRMATION}".`,
|
|
99
|
+
tags: ["disk-pressure"],
|
|
100
|
+
requestBody: OverrideRequestSchema,
|
|
101
|
+
responseBody: DiskPressureActionResponseSchema,
|
|
102
|
+
additionalResponses: {
|
|
103
|
+
"400": { description: "Confirmation phrase is invalid." },
|
|
104
|
+
"409": { description: "No active lock or lock already overridden." },
|
|
105
|
+
},
|
|
106
|
+
handler: ({ body }) => {
|
|
107
|
+
const parsed = OverrideRequestSchema.safeParse(body);
|
|
108
|
+
const confirmation = parsed.success ? parsed.data.confirmation : "";
|
|
109
|
+
const result = overrideDiskPressureLock(confirmation);
|
|
110
|
+
if (result.ok) return { status: result.status };
|
|
111
|
+
if (result.reason === "invalid_confirmation") {
|
|
112
|
+
throw new RouteError(result.message, "INVALID_CONFIRMATION", 400);
|
|
113
|
+
}
|
|
114
|
+
throw new RouteError(
|
|
115
|
+
result.message,
|
|
116
|
+
transitionErrorCode(result.reason),
|
|
117
|
+
409,
|
|
118
|
+
);
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
];
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown to PDF renderer for document export.
|
|
3
|
+
*
|
|
4
|
+
* Converts markdown content to styled HTML via `marked`, then renders
|
|
5
|
+
* the HTML to a PDF buffer using Playwright headless Chromium.
|
|
6
|
+
* The HTML template uses print-friendly styling that matches the
|
|
7
|
+
* document editor typography.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { marked } from "marked";
|
|
11
|
+
|
|
12
|
+
import { importPlaywright } from "../../tools/browser/runtime-check.js";
|
|
13
|
+
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Print template
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
const FONT_STACK = `"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif`;
|
|
19
|
+
|
|
20
|
+
function wrapInPrintTemplate(innerHtml: string): string {
|
|
21
|
+
return `<!DOCTYPE html>
|
|
22
|
+
<html>
|
|
23
|
+
<head>
|
|
24
|
+
<meta charset="utf-8">
|
|
25
|
+
<style>
|
|
26
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
27
|
+
|
|
28
|
+
body {
|
|
29
|
+
font-family: ${FONT_STACK};
|
|
30
|
+
font-size: 14px;
|
|
31
|
+
line-height: 1.7;
|
|
32
|
+
color: #1a1a1a;
|
|
33
|
+
background: #ffffff;
|
|
34
|
+
padding: 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
h1 { font-size: 28px; font-weight: 600; margin-top: 32px; margin-bottom: 12px; }
|
|
38
|
+
h2 { font-size: 22px; font-weight: 600; margin-top: 28px; margin-bottom: 10px; }
|
|
39
|
+
h3 { font-size: 18px; font-weight: 600; margin-top: 24px; margin-bottom: 8px; }
|
|
40
|
+
h4, h5, h6 { font-size: 16px; font-weight: 600; margin-top: 20px; margin-bottom: 8px; }
|
|
41
|
+
|
|
42
|
+
p {
|
|
43
|
+
margin-bottom: 12px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
pre {
|
|
47
|
+
background: #f5f5f5;
|
|
48
|
+
border-radius: 8px;
|
|
49
|
+
padding: 12px 16px;
|
|
50
|
+
overflow-x: auto;
|
|
51
|
+
margin-bottom: 12px;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
code {
|
|
55
|
+
font-family: "DM Mono", "SF Mono", monospace;
|
|
56
|
+
font-size: 13px;
|
|
57
|
+
background: #f5f5f5;
|
|
58
|
+
border-radius: 4px;
|
|
59
|
+
padding: 2px 5px;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
pre code {
|
|
63
|
+
background: none;
|
|
64
|
+
padding: 0;
|
|
65
|
+
border-radius: 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
blockquote {
|
|
69
|
+
border-left: 3px solid #6366f1;
|
|
70
|
+
padding-left: 16px;
|
|
71
|
+
margin: 12px 0;
|
|
72
|
+
color: #555555;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
table {
|
|
76
|
+
width: 100%;
|
|
77
|
+
border-collapse: collapse;
|
|
78
|
+
margin: 12px 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
th, td {
|
|
82
|
+
border: 1px solid #e0e0e0;
|
|
83
|
+
padding: 8px 12px;
|
|
84
|
+
text-align: left;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
th {
|
|
88
|
+
background: #f5f5f5;
|
|
89
|
+
font-weight: 600;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
ul, ol {
|
|
93
|
+
margin: 12px 0;
|
|
94
|
+
padding-left: 24px;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
li {
|
|
98
|
+
margin-bottom: 4px;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
a {
|
|
102
|
+
color: #6366f1;
|
|
103
|
+
text-decoration: none;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
hr {
|
|
107
|
+
border: none;
|
|
108
|
+
border-top: 1px solid #e0e0e0;
|
|
109
|
+
margin: 24px 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
img {
|
|
113
|
+
max-width: 100%;
|
|
114
|
+
height: auto;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
</style>
|
|
118
|
+
</head>
|
|
119
|
+
<body>
|
|
120
|
+
${innerHtml}
|
|
121
|
+
</body>
|
|
122
|
+
</html>`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Public API
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Convert a markdown string to a PDF buffer.
|
|
131
|
+
*
|
|
132
|
+
* Parses markdown to HTML via `marked`, wraps it in a print-friendly
|
|
133
|
+
* template, then renders to PDF using Playwright headless Chromium.
|
|
134
|
+
* The browser is always closed in a `finally` block.
|
|
135
|
+
*/
|
|
136
|
+
export async function renderMarkdownToPDF(
|
|
137
|
+
title: string,
|
|
138
|
+
markdown: string,
|
|
139
|
+
): Promise<Buffer> {
|
|
140
|
+
const innerHtml = marked.parse(markdown, {
|
|
141
|
+
gfm: true,
|
|
142
|
+
breaks: true,
|
|
143
|
+
}) as string;
|
|
144
|
+
const fullHtml = wrapInPrintTemplate(innerHtml);
|
|
145
|
+
|
|
146
|
+
const pw = await importPlaywright();
|
|
147
|
+
const browser = await pw.chromium.launch({ headless: true });
|
|
148
|
+
try {
|
|
149
|
+
const context = await browser.newContext({
|
|
150
|
+
javaScriptEnabled: false,
|
|
151
|
+
});
|
|
152
|
+
const page = await context.newPage();
|
|
153
|
+
await page.route("**/*", (route) => route.abort());
|
|
154
|
+
await page.setContent(fullHtml, { waitUntil: "domcontentloaded" });
|
|
155
|
+
const pdfBuffer = await page.pdf({
|
|
156
|
+
format: "A4",
|
|
157
|
+
margin: {
|
|
158
|
+
top: "0.75in",
|
|
159
|
+
bottom: "0.75in",
|
|
160
|
+
left: "0.75in",
|
|
161
|
+
right: "0.75in",
|
|
162
|
+
},
|
|
163
|
+
printBackground: true,
|
|
164
|
+
});
|
|
165
|
+
return Buffer.from(pdfBuffer);
|
|
166
|
+
} finally {
|
|
167
|
+
await browser.close();
|
|
168
|
+
}
|
|
169
|
+
}
|