@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,6 +1,8 @@
|
|
|
1
|
+
import { supportsHostProxy } from "../../channels/types.js";
|
|
1
2
|
import { HostFileProxy } from "../../daemon/host-file-proxy.js";
|
|
2
3
|
import { RiskLevel } from "../../permissions/types.js";
|
|
3
4
|
import type { ToolDefinition } from "../../providers/types.js";
|
|
5
|
+
import { assistantEventHub } from "../../runtime/assistant-event-hub.js";
|
|
4
6
|
import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
|
|
5
7
|
import { formatWriteSummary } from "../shared/filesystem/format-diff.js";
|
|
6
8
|
import { hostPolicy } from "../shared/filesystem/path-policy.js";
|
|
@@ -28,6 +30,11 @@ class HostFileWriteTool implements Tool {
|
|
|
28
30
|
type: "string",
|
|
29
31
|
description: "The content to write to the file",
|
|
30
32
|
},
|
|
33
|
+
target_client_id: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description:
|
|
36
|
+
"ID of the specific client to execute this on. Required when multiple clients support host_file; omit when only one is connected. Obtain IDs from `assistant clients list --capability host_file`.",
|
|
37
|
+
},
|
|
31
38
|
},
|
|
32
39
|
required: ["path", "content"],
|
|
33
40
|
},
|
|
@@ -54,6 +61,64 @@ class HostFileWriteTool implements Tool {
|
|
|
54
61
|
};
|
|
55
62
|
}
|
|
56
63
|
|
|
64
|
+
const targetClientId =
|
|
65
|
+
typeof input.target_client_id === "string" &&
|
|
66
|
+
input.target_client_id !== ""
|
|
67
|
+
? input.target_client_id
|
|
68
|
+
: undefined;
|
|
69
|
+
|
|
70
|
+
const transportInterface = context.transportInterface;
|
|
71
|
+
if (
|
|
72
|
+
targetClientId == null &&
|
|
73
|
+
transportInterface != null &&
|
|
74
|
+
!supportsHostProxy(transportInterface) &&
|
|
75
|
+
assistantEventHub.listClientsByCapability("host_file").length > 1
|
|
76
|
+
) {
|
|
77
|
+
return {
|
|
78
|
+
content: `Error: multiple clients support host_file. Specify which client to use with \`target_client_id\`. Run \`assistant clients list --capability host_file\` to see client IDs and labels.`,
|
|
79
|
+
isError: true,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Guard: non-host-proxy interfaces with no capable clients connected.
|
|
84
|
+
// Without this guard, the request would fall through to local
|
|
85
|
+
// FileSystemOps below and read the daemon container's filesystem
|
|
86
|
+
// instead of the user's host machine.
|
|
87
|
+
if (
|
|
88
|
+
targetClientId == null &&
|
|
89
|
+
transportInterface != null &&
|
|
90
|
+
!supportsHostProxy(transportInterface) &&
|
|
91
|
+
!HostFileProxy.instance.isAvailable()
|
|
92
|
+
) {
|
|
93
|
+
return {
|
|
94
|
+
content:
|
|
95
|
+
"Error: no client with host_file capability is connected. Connect a macOS client to use host_file from a non-desktop interface.",
|
|
96
|
+
isError: true,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Guard: explicit targetClientId provided but proxy is unavailable.
|
|
101
|
+
// Fires on non-host-proxy transports (web, ios) AND on legacy callers
|
|
102
|
+
// without transport metadata, where falling through to local fs would
|
|
103
|
+
// silently target the daemon container's filesystem instead of the
|
|
104
|
+
// intended host client. Skips only when transport is explicitly
|
|
105
|
+
// host-proxy-capable (macos), where local-fs fallback IS the intended
|
|
106
|
+
// offline behavior — a stale target_client_id auto-filled from a prior
|
|
107
|
+
// cross-client turn is silently ignored on those turns.
|
|
108
|
+
// Note: this scoping deliberately differs from host_bash
|
|
109
|
+
// (host-shell.ts:239-247), which rejects unconditionally for any
|
|
110
|
+
// stale target_client_id regardless of transport.
|
|
111
|
+
if (
|
|
112
|
+
targetClientId != null &&
|
|
113
|
+
!HostFileProxy.instance.isAvailable() &&
|
|
114
|
+
(transportInterface == null || !supportsHostProxy(transportInterface))
|
|
115
|
+
) {
|
|
116
|
+
return {
|
|
117
|
+
content: `Error: target client "${targetClientId}" is no longer connected. The specified client may have disconnected since the tool was called. Run \`assistant clients list --capability host_file\` to see currently connected clients.`,
|
|
118
|
+
isError: true,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
57
122
|
// Proxy to connected client for execution on the user's machine
|
|
58
123
|
// when a capable client is available (managed/cloud-hosted mode).
|
|
59
124
|
if (HostFileProxy.instance.isAvailable()) {
|
|
@@ -62,9 +127,12 @@ class HostFileWriteTool implements Tool {
|
|
|
62
127
|
operation: "write",
|
|
63
128
|
path: rawPath,
|
|
64
129
|
content: fileContent,
|
|
130
|
+
targetClientId,
|
|
65
131
|
},
|
|
66
132
|
context.conversationId,
|
|
67
133
|
context.signal,
|
|
134
|
+
targetClientId,
|
|
135
|
+
context.sourceActorPrincipalId,
|
|
68
136
|
);
|
|
69
137
|
}
|
|
70
138
|
|
|
@@ -18,6 +18,7 @@ import { existsSync } from "node:fs";
|
|
|
18
18
|
import { homedir } from "node:os";
|
|
19
19
|
import { isAbsolute } from "node:path";
|
|
20
20
|
|
|
21
|
+
import { supportsHostProxy } from "../../channels/types.js";
|
|
21
22
|
import { getConfig } from "../../config/loader.js";
|
|
22
23
|
import { isCesShellLockdownEnabled } from "../../credential-execution/feature-gates.js";
|
|
23
24
|
import { HostBashProxy } from "../../daemon/host-bash-proxy.js";
|
|
@@ -25,6 +26,7 @@ import { RiskLevel } from "../../permissions/types.js";
|
|
|
25
26
|
import type { ToolDefinition } from "../../providers/types.js";
|
|
26
27
|
import { isUntrustedTrustClass } from "../../runtime/actor-trust-resolver.js";
|
|
27
28
|
import { wakeAgentForOpportunity } from "../../runtime/agent-wake.js";
|
|
29
|
+
import { assistantEventHub } from "../../runtime/assistant-event-hub.js";
|
|
28
30
|
import { redactSecrets } from "../../security/secret-scanner.js";
|
|
29
31
|
import { getLogger } from "../../util/logger.js";
|
|
30
32
|
import {
|
|
@@ -131,6 +133,11 @@ class HostShellTool implements Tool {
|
|
|
131
133
|
description:
|
|
132
134
|
"Run the command in the background on the host machine. The tool returns immediately with a background tool ID. When the process exits, its output is delivered to the conversation as a wake.",
|
|
133
135
|
},
|
|
136
|
+
target_client_id: {
|
|
137
|
+
type: "string",
|
|
138
|
+
description:
|
|
139
|
+
"ID of the specific client to execute this command on. Required when multiple clients support host_bash; omit when only one client is connected. Obtain IDs from `assistant clients list --capability host_bash`.",
|
|
140
|
+
},
|
|
134
141
|
},
|
|
135
142
|
required: ["command", "activity"],
|
|
136
143
|
},
|
|
@@ -172,6 +179,19 @@ class HostShellTool implements Tool {
|
|
|
172
179
|
};
|
|
173
180
|
}
|
|
174
181
|
const background = input.background === true;
|
|
182
|
+
if (background && context.diskPressureCleanupModeActive === true) {
|
|
183
|
+
return {
|
|
184
|
+
content:
|
|
185
|
+
"Error: background host shell commands are not available during disk pressure cleanup mode.",
|
|
186
|
+
isError: true,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const targetClientId =
|
|
191
|
+
typeof input.target_client_id === "string" &&
|
|
192
|
+
input.target_client_id !== ""
|
|
193
|
+
? input.target_client_id
|
|
194
|
+
: undefined;
|
|
175
195
|
|
|
176
196
|
const config = getConfig();
|
|
177
197
|
const { shellDefaultTimeoutSec, shellMaxTimeoutSec } = config.timeouts;
|
|
@@ -190,6 +210,47 @@ class HostShellTool implements Tool {
|
|
|
190
210
|
isCesShellLockdownEnabled(config) &&
|
|
191
211
|
isUntrustedTrustClass(context.trustClass);
|
|
192
212
|
|
|
213
|
+
// Guard: non-host-proxy interfaces need an explicit target when multiple
|
|
214
|
+
// capable clients are connected to avoid ambiguous untargeted broadcasts.
|
|
215
|
+
const transportInterface = context.transportInterface;
|
|
216
|
+
if (
|
|
217
|
+
targetClientId == null &&
|
|
218
|
+
transportInterface != null &&
|
|
219
|
+
!supportsHostProxy(transportInterface) &&
|
|
220
|
+
assistantEventHub.listClientsByCapability("host_bash").length > 1
|
|
221
|
+
) {
|
|
222
|
+
return {
|
|
223
|
+
content: `Error: multiple clients support host_bash. Specify which client to use with \`target_client_id\`. Run \`assistant clients list --capability host_bash\` to see client IDs and labels.`,
|
|
224
|
+
isError: true,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Guard: non-host-proxy interfaces with no capable clients connected.
|
|
229
|
+
if (
|
|
230
|
+
targetClientId == null &&
|
|
231
|
+
transportInterface != null &&
|
|
232
|
+
!supportsHostProxy(transportInterface) &&
|
|
233
|
+
!HostBashProxy.instance.isAvailable()
|
|
234
|
+
) {
|
|
235
|
+
return {
|
|
236
|
+
content:
|
|
237
|
+
"Error: no client with host_bash capability is connected. Connect a macOS client to use host_bash from a non-desktop interface.",
|
|
238
|
+
isError: true,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Guard: explicit targetClientId provided but proxy is unavailable (client
|
|
243
|
+
// disconnected between tool-definition and tool-execution). Without this
|
|
244
|
+
// guard both targetClientId != null guards above are bypassed, and the
|
|
245
|
+
// code falls through to local daemon execution — silently running commands
|
|
246
|
+
// inside the Docker container instead of on the intended host machine.
|
|
247
|
+
if (targetClientId != null && !HostBashProxy.instance.isAvailable()) {
|
|
248
|
+
return {
|
|
249
|
+
content: `Error: target client "${targetClientId}" is no longer connected. The specified client may have disconnected since the tool was called. Run \`assistant clients list --capability host_bash\` to see currently connected clients.`,
|
|
250
|
+
isError: true,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
193
254
|
// Proxy to connected client for execution on the user's machine
|
|
194
255
|
// when a capable client is available (managed/cloud-hosted mode).
|
|
195
256
|
if (HostBashProxy.instance.isAvailable()) {
|
|
@@ -227,9 +288,11 @@ class HostShellTool implements Tool {
|
|
|
227
288
|
working_dir: rawWorkingDir as string | undefined,
|
|
228
289
|
timeout_seconds: normalizedTimeout,
|
|
229
290
|
env: proxyEnv,
|
|
291
|
+
targetClientId,
|
|
230
292
|
},
|
|
231
293
|
context.conversationId,
|
|
232
294
|
abortController.signal,
|
|
295
|
+
context.sourceActorPrincipalId,
|
|
233
296
|
);
|
|
234
297
|
|
|
235
298
|
proxyPromise
|
|
@@ -258,7 +321,7 @@ class HostShellTool implements Tool {
|
|
|
258
321
|
conversationId: context.conversationId,
|
|
259
322
|
command,
|
|
260
323
|
startedAt: Date.now(),
|
|
261
|
-
cancel: () => abortController.abort(),
|
|
324
|
+
cancel: (reason?: string) => abortController.abort(reason),
|
|
262
325
|
});
|
|
263
326
|
|
|
264
327
|
return {
|
|
@@ -273,9 +336,11 @@ class HostShellTool implements Tool {
|
|
|
273
336
|
working_dir: rawWorkingDir as string | undefined,
|
|
274
337
|
timeout_seconds: normalizedTimeout,
|
|
275
338
|
env: proxyEnv,
|
|
339
|
+
targetClientId,
|
|
276
340
|
},
|
|
277
341
|
context.conversationId,
|
|
278
342
|
context.signal,
|
|
343
|
+
context.sourceActorPrincipalId,
|
|
279
344
|
);
|
|
280
345
|
}
|
|
281
346
|
|
|
@@ -2,6 +2,7 @@ import type { McpServerConfig } from "../../config/schemas/mcp.js";
|
|
|
2
2
|
import type { McpServerManager } from "../../mcp/manager.js";
|
|
3
3
|
import { RiskLevel } from "../../permissions/types.js";
|
|
4
4
|
import type { ToolDefinition } from "../../providers/types.js";
|
|
5
|
+
import { toProviderSafeToolName } from "../provider-tool-name.js";
|
|
5
6
|
import { schemaDefinesProperty } from "../schema-transforms.js";
|
|
6
7
|
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
7
8
|
|
|
@@ -16,7 +17,7 @@ const riskMap: Record<string, RiskLevel> = {
|
|
|
16
17
|
* and with core/skill tools.
|
|
17
18
|
*/
|
|
18
19
|
function mcpToolName(serverId: string, toolName: string): string {
|
|
19
|
-
return `mcp__${serverId}__${toolName}
|
|
20
|
+
return toProviderSafeToolName(`mcp__${serverId}__${toolName}`);
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
export interface McpToolMetadata {
|
|
@@ -11,9 +11,15 @@ import {
|
|
|
11
11
|
test,
|
|
12
12
|
} from "bun:test";
|
|
13
13
|
|
|
14
|
+
import { _setOverridesForTesting } from "../../config/assistant-feature-flags.js";
|
|
14
15
|
import { PKB_WORKSPACE_SCOPE } from "../../memory/pkb/types.js";
|
|
15
16
|
import type { ToolContext } from "../types.js";
|
|
16
17
|
|
|
18
|
+
// This test exercises v1 PKB re-index enqueue. The `memory-v2-enabled` flag
|
|
19
|
+
// (registry default `true`) makes the enqueue path skipped — disable it so
|
|
20
|
+
// the v1 PKB index path stays under test.
|
|
21
|
+
_setOverridesForTesting({ "memory-v2-enabled": false });
|
|
22
|
+
|
|
17
23
|
let tmpWorkspace: string;
|
|
18
24
|
let previousWorkspaceEnv: string | undefined;
|
|
19
25
|
|
|
@@ -175,7 +181,7 @@ describe("recallTool.execute", () => {
|
|
|
175
181
|
max_results: 4,
|
|
176
182
|
depth: "deep",
|
|
177
183
|
},
|
|
178
|
-
makeContext(
|
|
184
|
+
makeContext(),
|
|
179
185
|
);
|
|
180
186
|
|
|
181
187
|
expect(result).toEqual({
|
|
@@ -196,7 +202,7 @@ describe("recallTool.execute", () => {
|
|
|
196
202
|
|
|
197
203
|
const result = await recallTool.execute(
|
|
198
204
|
{ query: "fallback search", sources: ["workspace"], depth: "fast" },
|
|
199
|
-
makeContext(
|
|
205
|
+
makeContext(),
|
|
200
206
|
);
|
|
201
207
|
|
|
202
208
|
expect(result).toEqual({
|
|
@@ -205,7 +211,7 @@ describe("recallTool.execute", () => {
|
|
|
205
211
|
});
|
|
206
212
|
});
|
|
207
213
|
|
|
208
|
-
test("propagates tool context
|
|
214
|
+
test("propagates tool context", async () => {
|
|
209
215
|
const controller = new AbortController();
|
|
210
216
|
|
|
211
217
|
await recallTool.execute(
|
|
@@ -221,7 +227,6 @@ describe("recallTool.execute", () => {
|
|
|
221
227
|
expect(recallCalls[0]?.context).toEqual({
|
|
222
228
|
workingDir: "/workspace/project",
|
|
223
229
|
conversationId: "conv-context",
|
|
224
|
-
memoryScopeId: "default",
|
|
225
230
|
config: getConfig(),
|
|
226
231
|
signal: controller.signal,
|
|
227
232
|
});
|
|
@@ -275,9 +280,7 @@ describe("rememberTool.execute — PKB re-index enqueue", () => {
|
|
|
275
280
|
test("enqueues re-index jobs for both buffer and daily archive paths", async () => {
|
|
276
281
|
const result = await rememberTool.execute(
|
|
277
282
|
{ content: "index me please" },
|
|
278
|
-
|
|
279
|
-
// enqueue ignores it and pins to PKB_WORKSPACE_SCOPE instead.
|
|
280
|
-
makeContext({ memoryScopeId: "scope-enqueue" }),
|
|
283
|
+
makeContext(),
|
|
281
284
|
);
|
|
282
285
|
expect(result.isError).toBe(false);
|
|
283
286
|
|
|
@@ -308,7 +311,7 @@ describe("rememberTool.execute — PKB re-index enqueue", () => {
|
|
|
308
311
|
test("does not enqueue when content is empty (write was skipped)", async () => {
|
|
309
312
|
const result = await rememberTool.execute(
|
|
310
313
|
{ content: " " },
|
|
311
|
-
makeContext(
|
|
314
|
+
makeContext(),
|
|
312
315
|
);
|
|
313
316
|
expect(result.isError).toBe(true);
|
|
314
317
|
expect(enqueueCalls).toHaveLength(0);
|
|
@@ -319,7 +322,7 @@ describe("rememberTool.execute — PKB re-index enqueue", () => {
|
|
|
319
322
|
|
|
320
323
|
const result = await rememberTool.execute(
|
|
321
324
|
{ content: "enqueue will throw" },
|
|
322
|
-
makeContext(
|
|
325
|
+
makeContext(),
|
|
323
326
|
);
|
|
324
327
|
|
|
325
328
|
// Remember call succeeded despite enqueue throwing for each write.
|
|
@@ -34,7 +34,7 @@ class RememberTool implements Tool {
|
|
|
34
34
|
const result = handleRemember(
|
|
35
35
|
typedInput,
|
|
36
36
|
context.conversationId,
|
|
37
|
-
|
|
37
|
+
"default",
|
|
38
38
|
getConfig(),
|
|
39
39
|
);
|
|
40
40
|
return {
|
|
@@ -73,7 +73,6 @@ class RecallTool implements Tool {
|
|
|
73
73
|
const result = await runAgenticRecall(input as unknown as RecallInput, {
|
|
74
74
|
workingDir: context.workingDir,
|
|
75
75
|
conversationId: context.conversationId,
|
|
76
|
-
memoryScopeId: context.memoryScopeId ?? "default",
|
|
77
76
|
config,
|
|
78
77
|
signal: context.signal,
|
|
79
78
|
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
const PROVIDER_TOOL_NAME_MAX_LENGTH = 64;
|
|
4
|
+
const PROVIDER_TOOL_NAME_RE = /^[a-zA-Z0-9_-]{1,64}$/;
|
|
5
|
+
const HASH_LENGTH = 12;
|
|
6
|
+
|
|
7
|
+
export function isProviderSafeToolName(name: string): boolean {
|
|
8
|
+
return PROVIDER_TOOL_NAME_RE.test(name);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function toProviderSafeToolName(rawName: string): string {
|
|
12
|
+
const trimmed = rawName.trim();
|
|
13
|
+
if (isProviderSafeToolName(rawName)) {
|
|
14
|
+
return rawName;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const hash = createHash("sha256")
|
|
18
|
+
.update(rawName)
|
|
19
|
+
.digest("hex")
|
|
20
|
+
.slice(0, HASH_LENGTH);
|
|
21
|
+
const suffix = `__${hash}`;
|
|
22
|
+
const maxBaseLength = PROVIDER_TOOL_NAME_MAX_LENGTH - suffix.length;
|
|
23
|
+
const sanitized =
|
|
24
|
+
trimmed.replace(/[^a-zA-Z0-9_-]+/g, "_").replace(/^_+|_+$/g, "") || "tool";
|
|
25
|
+
const base = sanitized.slice(0, maxBaseLength).replace(/_+$/g, "") || "tool";
|
|
26
|
+
|
|
27
|
+
return `${base}${suffix}`;
|
|
28
|
+
}
|
package/src/tools/registry.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { hostFileReadTool } from "./host-filesystem/read.js";
|
|
|
8
8
|
import { hostFileTransferTool } from "./host-filesystem/transfer.js";
|
|
9
9
|
import { hostFileWriteTool } from "./host-filesystem/write.js";
|
|
10
10
|
import { hostShellTool } from "./host-terminal/host-shell.js";
|
|
11
|
+
import { toProviderSafeToolName } from "./provider-tool-name.js";
|
|
11
12
|
import { registerSystemTools } from "./system/register.js";
|
|
12
13
|
import type { Tool } from "./types.js";
|
|
13
14
|
import { allUiSurfaceTools } from "./ui-surface/definitions.js";
|
|
@@ -75,6 +76,24 @@ const skillRefCount = new Map<string, number>();
|
|
|
75
76
|
// separate and covers the case of two extensions choosing the same tool name.
|
|
76
77
|
const pluginRefCount = new Map<string, number>();
|
|
77
78
|
|
|
79
|
+
function withProviderSafeToolName(tool: Tool): Tool {
|
|
80
|
+
const safeName = toProviderSafeToolName(tool.name);
|
|
81
|
+
if (safeName === tool.name) {
|
|
82
|
+
return tool;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
...tool,
|
|
87
|
+
name: safeName,
|
|
88
|
+
getDefinition(): ToolDefinition {
|
|
89
|
+
return {
|
|
90
|
+
...tool.getDefinition(),
|
|
91
|
+
name: safeName,
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
78
97
|
export function registerTool(tool: Tool): void {
|
|
79
98
|
const existing = tools.get(tool.name);
|
|
80
99
|
if (existing) {
|
|
@@ -176,15 +195,17 @@ export function registerPluginTools(
|
|
|
176
195
|
pluginName: string,
|
|
177
196
|
newTools: Tool[],
|
|
178
197
|
): Tool[] {
|
|
179
|
-
const stamped: Tool[] = newTools.map((tool) =>
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
198
|
+
const stamped: Tool[] = newTools.map((tool) =>
|
|
199
|
+
withProviderSafeToolName({
|
|
200
|
+
...tool,
|
|
201
|
+
origin: "plugin" as const,
|
|
202
|
+
ownerPluginId: pluginName,
|
|
203
|
+
ownerSkillId: undefined,
|
|
204
|
+
ownerMcpServerId: undefined,
|
|
205
|
+
ownerSkillBundled: undefined,
|
|
206
|
+
ownerSkillVersionHash: undefined,
|
|
207
|
+
}),
|
|
208
|
+
);
|
|
188
209
|
|
|
189
210
|
const accepted: Tool[] = [];
|
|
190
211
|
for (const tool of stamped) {
|
|
@@ -44,6 +44,8 @@ export async function executeScheduleCreate(
|
|
|
44
44
|
| undefined;
|
|
45
45
|
const quiet = (input.quiet as boolean) ?? false;
|
|
46
46
|
const reuseConversation = (input.reuse_conversation as boolean) ?? false;
|
|
47
|
+
const maxRetries = input.max_retries as number | undefined;
|
|
48
|
+
const retryBackoffMs = input.retry_backoff_ms as number | undefined;
|
|
47
49
|
|
|
48
50
|
if (!name || typeof name !== "string") {
|
|
49
51
|
return {
|
|
@@ -130,6 +132,8 @@ export async function executeScheduleCreate(
|
|
|
130
132
|
routingHints,
|
|
131
133
|
quiet,
|
|
132
134
|
reuseConversation,
|
|
135
|
+
maxRetries,
|
|
136
|
+
retryBackoffMs,
|
|
133
137
|
});
|
|
134
138
|
|
|
135
139
|
const fireDate = formatLocalDate(job.nextRunAt);
|
|
@@ -208,6 +212,8 @@ export async function executeScheduleCreate(
|
|
|
208
212
|
routingHints,
|
|
209
213
|
quiet,
|
|
210
214
|
reuseConversation,
|
|
215
|
+
maxRetries,
|
|
216
|
+
retryBackoffMs,
|
|
211
217
|
});
|
|
212
218
|
|
|
213
219
|
const scheduleDescription =
|
|
@@ -77,6 +77,8 @@ export async function executeScheduleList(
|
|
|
77
77
|
` Last run: ${job.lastRunAt ? formatLocalDate(job.lastRunAt) : "never"}`,
|
|
78
78
|
` Last status: ${job.lastStatus ?? "n/a"}`,
|
|
79
79
|
` Retry count: ${job.retryCount}`,
|
|
80
|
+
` Max retries: ${job.maxRetries}`,
|
|
81
|
+
` Retry backoff: ${job.retryBackoffMs}ms`,
|
|
80
82
|
` Created: ${formatLocalDate(job.createdAt)}`,
|
|
81
83
|
);
|
|
82
84
|
|
|
@@ -108,6 +108,14 @@ export async function executeScheduleUpdate(
|
|
|
108
108
|
updates.reuseConversation = input.reuse_conversation;
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
// Retry policy
|
|
112
|
+
if (input.max_retries !== undefined) {
|
|
113
|
+
updates.maxRetries = input.max_retries;
|
|
114
|
+
}
|
|
115
|
+
if (input.retry_backoff_ms !== undefined) {
|
|
116
|
+
updates.retryBackoffMs = input.retry_backoff_ms;
|
|
117
|
+
}
|
|
118
|
+
|
|
111
119
|
// Auto-detect syntax when expression changes without explicit syntax
|
|
112
120
|
if (input.expression !== undefined || input.syntax !== undefined) {
|
|
113
121
|
const resolved = normalizeScheduleSyntax({
|
|
@@ -173,6 +181,8 @@ export async function executeScheduleUpdate(
|
|
|
173
181
|
routingHints?: Record<string, unknown>;
|
|
174
182
|
quiet?: boolean;
|
|
175
183
|
reuseConversation?: boolean;
|
|
184
|
+
maxRetries?: number;
|
|
185
|
+
retryBackoffMs?: number;
|
|
176
186
|
},
|
|
177
187
|
);
|
|
178
188
|
|
|
@@ -11,7 +11,14 @@ import {
|
|
|
11
11
|
/**
|
|
12
12
|
* Result type shared by both sandbox and host path policies.
|
|
13
13
|
*/
|
|
14
|
-
export type PathFailureReason = "not_absolute" | "out_of_bounds";
|
|
14
|
+
export type PathFailureReason = "not_absolute" | "out_of_bounds" | "denied";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Basenames that must never be read or written by the assistant, regardless
|
|
18
|
+
* of where they resolve. Defense-in-depth: even if a key file is accidentally
|
|
19
|
+
* placed inside the workspace boundary, the assistant cannot access it.
|
|
20
|
+
*/
|
|
21
|
+
const DENIED_BASENAMES = new Set([".backup.key", "backup.key"]);
|
|
15
22
|
|
|
16
23
|
export type PathResult =
|
|
17
24
|
| { ok: true; resolved: string }
|
|
@@ -106,6 +113,16 @@ export function sandboxPolicy(
|
|
|
106
113
|
};
|
|
107
114
|
}
|
|
108
115
|
|
|
116
|
+
// Check both the logical path and the symlink-resolved path so a symlink
|
|
117
|
+
// with a non-denied name pointing at a denied file is still caught.
|
|
118
|
+
if (DENIED_BASENAMES.has(basename(resolved)) || DENIED_BASENAMES.has(basename(realResolved))) {
|
|
119
|
+
return {
|
|
120
|
+
ok: false,
|
|
121
|
+
reason: "denied",
|
|
122
|
+
error: `Access to "${basename(resolved)}" is denied`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
109
126
|
return { ok: true, resolved };
|
|
110
127
|
}
|
|
111
128
|
|
|
@@ -125,5 +142,12 @@ export function hostPolicy(rawPath: string): PathResult {
|
|
|
125
142
|
error: `path must be absolute for host file access: ${rawPath}`,
|
|
126
143
|
};
|
|
127
144
|
}
|
|
145
|
+
if (DENIED_BASENAMES.has(basename(rawPath))) {
|
|
146
|
+
return {
|
|
147
|
+
ok: false,
|
|
148
|
+
reason: "denied",
|
|
149
|
+
error: `Access to "${basename(rawPath)}" is denied`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
128
152
|
return { ok: true, resolved: rawPath };
|
|
129
153
|
}
|
package/src/tools/skills/load.ts
CHANGED
|
@@ -29,9 +29,6 @@ import { getWorkspaceDirDisplay } from "../../util/platform.js";
|
|
|
29
29
|
import { registerTool } from "../registry.js";
|
|
30
30
|
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
31
31
|
|
|
32
|
-
/** Canonical feature flag key for inline skill command expansion. */
|
|
33
|
-
const INLINE_COMMANDS_FLAG_KEY = "inline-skill-commands";
|
|
34
|
-
|
|
35
32
|
/** Skill sources eligible for inline command expansion in v1. */
|
|
36
33
|
const INLINE_COMMAND_ELIGIBLE_SOURCES = new Set([
|
|
37
34
|
"bundled",
|
|
@@ -300,20 +297,6 @@ export class SkillLoadTool implements Tool {
|
|
|
300
297
|
skill.inlineCommandExpansions && skill.inlineCommandExpansions.length > 0;
|
|
301
298
|
|
|
302
299
|
if (hasInlineCommands) {
|
|
303
|
-
const inlineFlagEnabled = isAssistantFeatureFlagEnabled(
|
|
304
|
-
INLINE_COMMANDS_FLAG_KEY,
|
|
305
|
-
config,
|
|
306
|
-
);
|
|
307
|
-
|
|
308
|
-
if (!inlineFlagEnabled) {
|
|
309
|
-
// Feature flag is off: fail closed instead of leaving live tokens in
|
|
310
|
-
// the prompt that the LLM might try to interpret.
|
|
311
|
-
return {
|
|
312
|
-
content: `Error: skill "${skill.id}" contains inline command expansions but the inline-skill-commands feature flag is disabled. Enable the flag to use this skill.`,
|
|
313
|
-
isError: true,
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
|
|
317
300
|
if (skill.source === "extra") {
|
|
318
301
|
// Third-party extra roots are out of scope for inline command
|
|
319
302
|
// expansion in v1. Reject explicitly so the failure is clear.
|
|
@@ -391,21 +374,6 @@ export class SkillLoadTool implements Tool {
|
|
|
391
374
|
childLoaded.skill.inlineCommandExpansions.length > 0;
|
|
392
375
|
|
|
393
376
|
if (childHasInlineCommands) {
|
|
394
|
-
const childInlineFlagEnabled = isAssistantFeatureFlagEnabled(
|
|
395
|
-
INLINE_COMMANDS_FLAG_KEY,
|
|
396
|
-
config,
|
|
397
|
-
);
|
|
398
|
-
|
|
399
|
-
// Fail closed: if the flag is off, reject the entire skill_load
|
|
400
|
-
// just like we do for root skills. Leaving raw !`...` tokens in
|
|
401
|
-
// the prompt would violate the documented fail-closed contract.
|
|
402
|
-
if (!childInlineFlagEnabled) {
|
|
403
|
-
return {
|
|
404
|
-
content: `Error: included skill "${childId}" contains inline command expansions but the inline-skill-commands feature flag is disabled. Enable the flag to use skill "${skill.id}".`,
|
|
405
|
-
isError: true,
|
|
406
|
-
};
|
|
407
|
-
}
|
|
408
|
-
|
|
409
377
|
if (childLoaded.skill.source === "extra") {
|
|
410
378
|
return {
|
|
411
379
|
content: `Error: included skill "${childId}" contains inline command expansions but inline commands are not supported for third-party (extra) skill sources.`,
|
|
@@ -111,6 +111,15 @@ class ShellTool implements Tool {
|
|
|
111
111
|
return { content: "Error: command contains null bytes", isError: true };
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
+
const background = input.background === true;
|
|
115
|
+
if (background && context.diskPressureCleanupModeActive === true) {
|
|
116
|
+
return {
|
|
117
|
+
content:
|
|
118
|
+
"Error: background shell commands are not available during disk pressure cleanup mode.",
|
|
119
|
+
isError: true,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
114
123
|
const config = getConfig();
|
|
115
124
|
const shellLockdownActive =
|
|
116
125
|
isCesShellLockdownEnabled(config) &&
|
|
@@ -276,7 +285,6 @@ class ShellTool implements Tool {
|
|
|
276
285
|
// Background mode: spawn and return immediately. The process output is
|
|
277
286
|
// delivered to the conversation as a wake when the process exits.
|
|
278
287
|
// -----------------------------------------------------------------------
|
|
279
|
-
const background = input.background === true;
|
|
280
288
|
if (background) {
|
|
281
289
|
// Check the registry limit BEFORE spawning so we never leak an
|
|
282
290
|
// untracked process when the registry is full.
|