@vellumai/assistant 0.8.4 → 0.8.5
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 +2 -2
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/knip.json +2 -1
- package/openapi.yaml +809 -11
- package/package.json +1 -1
- package/src/__tests__/anthropic-provider.test.ts +34 -37
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
- package/src/__tests__/audit-log-rotation.test.ts +70 -16
- package/src/__tests__/background-workers-disk-pressure.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +2 -3
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-guardian.test.ts +3 -3
- package/src/__tests__/checker.test.ts +6 -15
- package/src/__tests__/compaction-events.test.ts +1 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
- package/src/__tests__/computer-use-tools.test.ts +2 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +197 -2
- package/src/__tests__/conversation-agent-loop.test.ts +163 -122
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +31 -0
- package/src/__tests__/conversation-fork-crud.test.ts +178 -15
- package/src/__tests__/conversation-lifecycle.test.ts +52 -11
- package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +13 -13
- package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
- package/src/__tests__/conversation-skill-tools.test.ts +2 -5
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-sync-tags.test.ts +99 -32
- package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/credential-vault-unit.test.ts +2 -2
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/gateway-flag-listener.test.ts +237 -0
- package/src/__tests__/gemini-provider.test.ts +78 -0
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +7 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +4 -0
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +77 -9
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/mcp-abort-signal.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/model-intents.test.ts +2 -4
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +46 -0
- package/src/__tests__/openai-responses-provider.test.ts +114 -12
- package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -2
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +2 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/registry.test.ts +2 -8
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags.test.ts +2 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
- package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/subagent-notify-parent.test.ts +1 -1
- package/src/__tests__/suggestion-routes.test.ts +1 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +145 -131
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
- package/src/__tests__/tool-executor.test.ts +9 -62
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/workspace-git-service.test.ts +6 -5
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +1 -1
- package/src/agent/loop.ts +8 -0
- package/src/api/README.md +5 -0
- package/src/api/index.ts +4 -0
- package/src/api/package.json +10 -0
- package/src/background-wake/background-wake-routes.test.ts +233 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +176 -1
- package/src/cli/commands/memory-v3-render.ts +344 -0
- package/src/cli/commands/memory-v3.ts +316 -0
- package/src/cli/program.ts +2 -0
- package/src/config/assistant-feature-flags.ts +21 -9
- package/src/config/bundled-skills/document-editor/SKILL.md +11 -2
- package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +7 -6
- package/src/config/feature-flag-registry.json +16 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +213 -1
- package/src/config/schemas/call-site-catalog.ts +21 -7
- package/src/config/schemas/llm.ts +12 -1
- package/src/config/schemas/memory-v2.ts +246 -0
- package/src/config/schemas/memory.ts +2 -1
- package/src/context/compactor.ts +52 -0
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +2 -13
- package/src/daemon/conversation-agent-loop.ts +126 -76
- package/src/daemon/conversation-error.ts +31 -1
- package/src/daemon/conversation-lifecycle.ts +27 -22
- package/src/daemon/conversation-runtime-assembly.ts +10 -9
- package/src/daemon/conversation-tool-setup.ts +63 -3
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +14 -29
- package/src/daemon/disk-pressure-guard.ts +14 -2
- package/src/daemon/handlers/config-model.test.ts +1 -0
- package/src/daemon/handlers/conversations.ts +11 -3
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +4 -4
- package/src/daemon/host-file-proxy.ts +4 -4
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +10 -10
- package/src/daemon/lifecycle.ts +23 -20
- package/src/daemon/meet-manifest-loader.ts +1 -7
- package/src/daemon/message-types/conversations.ts +6 -9
- package/src/daemon/message-types/home.ts +1 -13
- package/src/daemon/message-types/messages.ts +6 -14
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +52 -0
- package/src/daemon/tool-setup-types.ts +13 -0
- package/src/events/relationship-state-updated.ts +25 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -1
- package/src/home/home-greeting.ts +0 -9
- package/src/home/suggested-prompts.ts +0 -9
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/registries.ts +8 -12
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/memory-retrospective-job.test.ts +7 -0
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-crud.ts +71 -70
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-init.ts +10 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +55 -22
- package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
- package/src/memory/llm-request-log-source-local.ts +7 -0
- package/src/memory/llm-request-log-source.ts +9 -2
- package/src/memory/llm-request-log-store.ts +43 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-enqueue.ts +8 -1
- package/src/memory/memory-retrospective-job.ts +5 -0
- package/src/memory/memory-v2-activation-log-store.ts +15 -6
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/index.ts +17 -0
- package/src/memory/migrations/registry.ts +33 -0
- package/src/memory/schema/conversations.ts +1 -1
- package/src/memory/schema/infrastructure.ts +21 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
- package/src/memory/v2/__tests__/injection.test.ts +127 -98
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +171 -3
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +124 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +224 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +106 -0
- package/src/memory/v2/harness/trace.ts +58 -0
- package/src/memory/v2/injection.ts +21 -15
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +171 -18
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +563 -0
- package/src/memory/v3/__tests__/filter.test.ts +512 -0
- package/src/memory/v3/__tests__/gate.test.ts +574 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
- package/src/memory/v3/__tests__/loop.test.ts +530 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +440 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +469 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
- package/src/memory/v3/__tests__/validate.test.ts +245 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +249 -0
- package/src/memory/v3/filter.ts +281 -0
- package/src/memory/v3/gate.ts +334 -0
- package/src/memory/v3/index-composition.ts +113 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +382 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +420 -0
- package/src/memory/v3/shadow-middleware.ts +305 -0
- package/src/memory/v3/traversal.ts +206 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +351 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +300 -0
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/emit-signal.ts +29 -49
- package/src/permissions/prompter.ts +3 -3
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +2 -2
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +18 -11
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +11 -16
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +39 -7
- package/src/prompts/system-prompt.ts +50 -185
- package/src/prompts/templates/BOOTSTRAP.md +2 -2
- package/src/prompts/templates/system-sections.ts +230 -8
- package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +32 -66
- package/src/providers/call-site-routing.ts +14 -2
- package/src/providers/connection-model-compat.ts +38 -0
- package/src/providers/connection-resolution.ts +16 -2
- package/src/providers/gemini/client.ts +49 -6
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +43 -0
- package/src/providers/model-intents.ts +1 -1
- package/src/providers/openai/chat-completions-provider.ts +6 -3
- package/src/providers/openai/codex-models.ts +18 -0
- package/src/providers/openai/responses-provider.ts +78 -21
- package/src/providers/provider-send-message.ts +7 -1
- package/src/providers/retry.ts +34 -3
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/agent-wake.ts +1 -0
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +36 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/migrations/vbundle-builder.ts +10 -3
- package/src/runtime/pending-interactions.ts +0 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +106 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +25 -6
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +188 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +0 -6
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-list-routes.ts +12 -4
- package/src/runtime/routes/conversation-management-routes.ts +77 -20
- package/src/runtime/routes/conversation-query-routes.ts +142 -36
- package/src/runtime/routes/conversation-routes.ts +252 -410
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +24 -8
- package/src/runtime/routes/host-browser-routes.ts +10 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/index.ts +8 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +215 -5
- package/src/runtime/routes/memory-v3-routes.ts +316 -0
- package/src/runtime/routes/migration-routes.ts +21 -24
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +5 -4
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +2 -8
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
- package/src/tools/browser/browser-execution.ts +16 -3
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
- package/src/tools/browser/cdp-client/factory.ts +100 -17
- package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
- package/src/tools/browser/cdp-client/types.ts +65 -0
- package/src/tools/browser/pinned-tabs.ts +96 -40
- package/src/tools/computer-use/definitions.ts +22 -78
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-tool.ts +59 -0
- package/src/tools/execution-target.ts +21 -23
- package/src/tools/executor.ts +6 -1
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -8
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/web-fetch.ts +3 -9
- package/src/tools/network/web-search.ts +25 -32
- package/src/tools/registry.ts +7 -23
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +1 -8
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/types.ts +27 -98
- package/src/tools/ui-surface/definitions.ts +6 -22
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -2
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/daemon/query-complexity-router.ts +0 -75
- package/src/prompts/cache-boundary.ts +0 -8
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { RiskLevel } from "../../permissions/types.js";
|
|
11
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
12
11
|
import type { Tool, ToolExecutionResult } from "../types.js";
|
|
13
12
|
|
|
14
13
|
// ---------------------------------------------------------------------------
|
|
@@ -32,12 +31,9 @@ export const computerUseClickTool: Tool = {
|
|
|
32
31
|
category: "computer-use",
|
|
33
32
|
defaultRiskLevel: RiskLevel.Low,
|
|
34
33
|
executionMode: "proxy",
|
|
34
|
+
executionTarget: "host",
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
return {
|
|
38
|
-
name: this.name,
|
|
39
|
-
description: this.description,
|
|
40
|
-
input_schema: {
|
|
36
|
+
input_schema: {
|
|
41
37
|
type: "object",
|
|
42
38
|
properties: {
|
|
43
39
|
click_type: {
|
|
@@ -71,8 +67,6 @@ export const computerUseClickTool: Tool = {
|
|
|
71
67
|
},
|
|
72
68
|
required: ["reasoning"],
|
|
73
69
|
},
|
|
74
|
-
};
|
|
75
|
-
},
|
|
76
70
|
|
|
77
71
|
execute: proxyExecute,
|
|
78
72
|
};
|
|
@@ -88,12 +82,9 @@ export const computerUseTypeTextTool: Tool = {
|
|
|
88
82
|
category: "computer-use",
|
|
89
83
|
defaultRiskLevel: RiskLevel.Low,
|
|
90
84
|
executionMode: "proxy",
|
|
85
|
+
executionTarget: "host",
|
|
91
86
|
|
|
92
|
-
|
|
93
|
-
return {
|
|
94
|
-
name: this.name,
|
|
95
|
-
description: this.description,
|
|
96
|
-
input_schema: {
|
|
87
|
+
input_schema: {
|
|
97
88
|
type: "object",
|
|
98
89
|
properties: {
|
|
99
90
|
text: {
|
|
@@ -112,8 +103,6 @@ export const computerUseTypeTextTool: Tool = {
|
|
|
112
103
|
},
|
|
113
104
|
required: ["text", "reasoning"],
|
|
114
105
|
},
|
|
115
|
-
};
|
|
116
|
-
},
|
|
117
106
|
|
|
118
107
|
execute: proxyExecute,
|
|
119
108
|
};
|
|
@@ -129,12 +118,9 @@ export const computerUseKeyTool: Tool = {
|
|
|
129
118
|
category: "computer-use",
|
|
130
119
|
defaultRiskLevel: RiskLevel.Low,
|
|
131
120
|
executionMode: "proxy",
|
|
121
|
+
executionTarget: "host",
|
|
132
122
|
|
|
133
|
-
|
|
134
|
-
return {
|
|
135
|
-
name: this.name,
|
|
136
|
-
description: this.description,
|
|
137
|
-
input_schema: {
|
|
123
|
+
input_schema: {
|
|
138
124
|
type: "object",
|
|
139
125
|
properties: {
|
|
140
126
|
key: {
|
|
@@ -154,8 +140,6 @@ export const computerUseKeyTool: Tool = {
|
|
|
154
140
|
},
|
|
155
141
|
required: ["key", "reasoning"],
|
|
156
142
|
},
|
|
157
|
-
};
|
|
158
|
-
},
|
|
159
143
|
|
|
160
144
|
execute: proxyExecute,
|
|
161
145
|
};
|
|
@@ -171,12 +155,9 @@ export const computerUseScrollTool: Tool = {
|
|
|
171
155
|
category: "computer-use",
|
|
172
156
|
defaultRiskLevel: RiskLevel.Low,
|
|
173
157
|
executionMode: "proxy",
|
|
158
|
+
executionTarget: "host",
|
|
174
159
|
|
|
175
|
-
|
|
176
|
-
return {
|
|
177
|
-
name: this.name,
|
|
178
|
-
description: this.description,
|
|
179
|
-
input_schema: {
|
|
160
|
+
input_schema: {
|
|
180
161
|
type: "object",
|
|
181
162
|
properties: {
|
|
182
163
|
element_id: {
|
|
@@ -213,8 +194,6 @@ export const computerUseScrollTool: Tool = {
|
|
|
213
194
|
},
|
|
214
195
|
required: ["direction", "amount", "reasoning"],
|
|
215
196
|
},
|
|
216
|
-
};
|
|
217
|
-
},
|
|
218
197
|
|
|
219
198
|
execute: proxyExecute,
|
|
220
199
|
};
|
|
@@ -230,12 +209,9 @@ export const computerUseDragTool: Tool = {
|
|
|
230
209
|
category: "computer-use",
|
|
231
210
|
defaultRiskLevel: RiskLevel.Low,
|
|
232
211
|
executionMode: "proxy",
|
|
212
|
+
executionTarget: "host",
|
|
233
213
|
|
|
234
|
-
|
|
235
|
-
return {
|
|
236
|
-
name: this.name,
|
|
237
|
-
description: this.description,
|
|
238
|
-
input_schema: {
|
|
214
|
+
input_schema: {
|
|
239
215
|
type: "object",
|
|
240
216
|
properties: {
|
|
241
217
|
element_id: {
|
|
@@ -278,8 +254,6 @@ export const computerUseDragTool: Tool = {
|
|
|
278
254
|
},
|
|
279
255
|
required: ["reasoning"],
|
|
280
256
|
},
|
|
281
|
-
};
|
|
282
|
-
},
|
|
283
257
|
|
|
284
258
|
execute: proxyExecute,
|
|
285
259
|
};
|
|
@@ -294,12 +268,9 @@ export const computerUseWaitTool: Tool = {
|
|
|
294
268
|
category: "computer-use",
|
|
295
269
|
defaultRiskLevel: RiskLevel.Low,
|
|
296
270
|
executionMode: "proxy",
|
|
271
|
+
executionTarget: "host",
|
|
297
272
|
|
|
298
|
-
|
|
299
|
-
return {
|
|
300
|
-
name: this.name,
|
|
301
|
-
description: this.description,
|
|
302
|
-
input_schema: {
|
|
273
|
+
input_schema: {
|
|
303
274
|
type: "object",
|
|
304
275
|
properties: {
|
|
305
276
|
duration_ms: {
|
|
@@ -318,8 +289,6 @@ export const computerUseWaitTool: Tool = {
|
|
|
318
289
|
},
|
|
319
290
|
required: ["duration_ms", "reasoning"],
|
|
320
291
|
},
|
|
321
|
-
};
|
|
322
|
-
},
|
|
323
292
|
|
|
324
293
|
execute: proxyExecute,
|
|
325
294
|
};
|
|
@@ -335,12 +304,9 @@ export const computerUseOpenAppTool: Tool = {
|
|
|
335
304
|
category: "computer-use",
|
|
336
305
|
defaultRiskLevel: RiskLevel.Low,
|
|
337
306
|
executionMode: "proxy",
|
|
307
|
+
executionTarget: "host",
|
|
338
308
|
|
|
339
|
-
|
|
340
|
-
return {
|
|
341
|
-
name: this.name,
|
|
342
|
-
description: this.description,
|
|
343
|
-
input_schema: {
|
|
309
|
+
input_schema: {
|
|
344
310
|
type: "object",
|
|
345
311
|
properties: {
|
|
346
312
|
app_name: {
|
|
@@ -361,8 +327,6 @@ export const computerUseOpenAppTool: Tool = {
|
|
|
361
327
|
},
|
|
362
328
|
required: ["app_name", "reasoning"],
|
|
363
329
|
},
|
|
364
|
-
};
|
|
365
|
-
},
|
|
366
330
|
|
|
367
331
|
execute: proxyExecute,
|
|
368
332
|
};
|
|
@@ -378,12 +342,9 @@ export const computerUseRunAppleScriptTool: Tool = {
|
|
|
378
342
|
category: "computer-use",
|
|
379
343
|
defaultRiskLevel: RiskLevel.Low,
|
|
380
344
|
executionMode: "proxy",
|
|
345
|
+
executionTarget: "host",
|
|
381
346
|
|
|
382
|
-
|
|
383
|
-
return {
|
|
384
|
-
name: this.name,
|
|
385
|
-
description: this.description,
|
|
386
|
-
input_schema: {
|
|
347
|
+
input_schema: {
|
|
387
348
|
type: "object",
|
|
388
349
|
properties: {
|
|
389
350
|
script: {
|
|
@@ -403,8 +364,6 @@ export const computerUseRunAppleScriptTool: Tool = {
|
|
|
403
364
|
},
|
|
404
365
|
required: ["script", "reasoning"],
|
|
405
366
|
},
|
|
406
|
-
};
|
|
407
|
-
},
|
|
408
367
|
|
|
409
368
|
execute: proxyExecute,
|
|
410
369
|
};
|
|
@@ -420,12 +379,9 @@ export const computerUseDoneTool: Tool = {
|
|
|
420
379
|
category: "computer-use",
|
|
421
380
|
defaultRiskLevel: RiskLevel.Low,
|
|
422
381
|
executionMode: "proxy",
|
|
382
|
+
executionTarget: "host",
|
|
423
383
|
|
|
424
|
-
|
|
425
|
-
return {
|
|
426
|
-
name: this.name,
|
|
427
|
-
description: this.description,
|
|
428
|
-
input_schema: {
|
|
384
|
+
input_schema: {
|
|
429
385
|
type: "object",
|
|
430
386
|
properties: {
|
|
431
387
|
summary: {
|
|
@@ -435,8 +391,6 @@ export const computerUseDoneTool: Tool = {
|
|
|
435
391
|
},
|
|
436
392
|
required: ["summary"],
|
|
437
393
|
},
|
|
438
|
-
};
|
|
439
|
-
},
|
|
440
394
|
|
|
441
395
|
execute: proxyExecute,
|
|
442
396
|
};
|
|
@@ -452,12 +406,9 @@ export const computerUseRespondTool: Tool = {
|
|
|
452
406
|
category: "computer-use",
|
|
453
407
|
defaultRiskLevel: RiskLevel.Low,
|
|
454
408
|
executionMode: "proxy",
|
|
409
|
+
executionTarget: "host",
|
|
455
410
|
|
|
456
|
-
|
|
457
|
-
return {
|
|
458
|
-
name: this.name,
|
|
459
|
-
description: this.description,
|
|
460
|
-
input_schema: {
|
|
411
|
+
input_schema: {
|
|
461
412
|
type: "object",
|
|
462
413
|
properties: {
|
|
463
414
|
answer: {
|
|
@@ -471,8 +422,6 @@ export const computerUseRespondTool: Tool = {
|
|
|
471
422
|
},
|
|
472
423
|
required: ["answer", "reasoning"],
|
|
473
424
|
},
|
|
474
|
-
};
|
|
475
|
-
},
|
|
476
425
|
|
|
477
426
|
execute: proxyExecute,
|
|
478
427
|
};
|
|
@@ -488,18 +437,13 @@ const computerUseObserveTool: Tool = {
|
|
|
488
437
|
category: "computer-use",
|
|
489
438
|
defaultRiskLevel: RiskLevel.Low,
|
|
490
439
|
executionMode: "proxy",
|
|
440
|
+
executionTarget: "host",
|
|
491
441
|
|
|
492
|
-
|
|
493
|
-
return {
|
|
494
|
-
name: this.name,
|
|
495
|
-
description: this.description,
|
|
496
|
-
input_schema: {
|
|
442
|
+
input_schema: {
|
|
497
443
|
type: "object",
|
|
498
444
|
properties: {},
|
|
499
445
|
required: [],
|
|
500
446
|
},
|
|
501
|
-
};
|
|
502
|
-
},
|
|
503
447
|
|
|
504
448
|
execute: proxyExecute,
|
|
505
449
|
};
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
import { GrantProposalSchema, renderProposal } from "@vellumai/service-contracts/credential-rpc";
|
|
14
14
|
|
|
15
15
|
import { RiskLevel } from "../../permissions/types.js";
|
|
16
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
17
16
|
import { getLogger } from "../../util/logger.js";
|
|
18
17
|
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
19
18
|
|
|
@@ -24,13 +23,10 @@ class MakeAuthenticatedRequestTool implements Tool {
|
|
|
24
23
|
description =
|
|
25
24
|
"Execute an authenticated HTTP request through CES. CES injects the credential and returns the response - the assistant never sees raw secrets.";
|
|
26
25
|
category = "credential-execution";
|
|
26
|
+
executionTarget = "sandbox" as const;
|
|
27
27
|
defaultRiskLevel = RiskLevel.High;
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
name: this.name,
|
|
32
|
-
description: this.description,
|
|
33
|
-
input_schema: {
|
|
29
|
+
input_schema = {
|
|
34
30
|
type: "object",
|
|
35
31
|
properties: {
|
|
36
32
|
credentialHandle: {
|
|
@@ -68,9 +64,7 @@ class MakeAuthenticatedRequestTool implements Tool {
|
|
|
68
64
|
},
|
|
69
65
|
},
|
|
70
66
|
required: ["credentialHandle", "method", "url", "purpose"],
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
}
|
|
67
|
+
};
|
|
74
68
|
|
|
75
69
|
async execute(
|
|
76
70
|
input: Record<string, unknown>,
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
import type { ManageSecureCommandTool } from "@vellumai/service-contracts/rpc";
|
|
19
19
|
|
|
20
20
|
import { RiskLevel } from "../../permissions/types.js";
|
|
21
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
22
21
|
import { getLogger } from "../../util/logger.js";
|
|
23
22
|
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
24
23
|
|
|
@@ -31,13 +30,10 @@ class ManageSecureCommandToolImpl implements Tool {
|
|
|
31
30
|
"Accepts only bundle metadata for guardian review - never raw bytes or file paths. " +
|
|
32
31
|
"Each invocation requires fresh approval.";
|
|
33
32
|
category = "credential-execution";
|
|
33
|
+
executionTarget = "sandbox" as const;
|
|
34
34
|
defaultRiskLevel = RiskLevel.High;
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
return {
|
|
38
|
-
name: this.name,
|
|
39
|
-
description: this.description,
|
|
40
|
-
input_schema: {
|
|
36
|
+
input_schema = {
|
|
41
37
|
type: "object",
|
|
42
38
|
properties: {
|
|
43
39
|
action: {
|
|
@@ -236,9 +232,7 @@ class ManageSecureCommandToolImpl implements Tool {
|
|
|
236
232
|
},
|
|
237
233
|
},
|
|
238
234
|
required: ["action", "toolName"],
|
|
239
|
-
}
|
|
240
|
-
};
|
|
241
|
-
}
|
|
235
|
+
};
|
|
242
236
|
|
|
243
237
|
async execute(
|
|
244
238
|
input: Record<string, unknown>,
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
import { GrantProposalSchema, renderProposal } from "@vellumai/service-contracts/credential-rpc";
|
|
14
14
|
|
|
15
15
|
import { RiskLevel } from "../../permissions/types.js";
|
|
16
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
17
16
|
import { getLogger } from "../../util/logger.js";
|
|
18
17
|
import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
19
18
|
|
|
@@ -24,13 +23,10 @@ class RunAuthenticatedCommandTool implements Tool {
|
|
|
24
23
|
description =
|
|
25
24
|
"Execute a command with credential environment variables injected by CES. The command runs inside the CES sandbox - the assistant never sees raw secrets.";
|
|
26
25
|
category = "credential-execution";
|
|
26
|
+
executionTarget = "sandbox" as const;
|
|
27
27
|
defaultRiskLevel = RiskLevel.High;
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
name: this.name,
|
|
32
|
-
description: this.description,
|
|
33
|
-
input_schema: {
|
|
29
|
+
input_schema = {
|
|
34
30
|
type: "object",
|
|
35
31
|
properties: {
|
|
36
32
|
credentialHandle: {
|
|
@@ -97,9 +93,7 @@ class RunAuthenticatedCommandTool implements Tool {
|
|
|
97
93
|
},
|
|
98
94
|
},
|
|
99
95
|
required: ["credentialHandle", "command", "purpose"],
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
}
|
|
96
|
+
};
|
|
103
97
|
|
|
104
98
|
async execute(
|
|
105
99
|
input: Record<string, unknown>,
|
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
getActiveConnection,
|
|
11
11
|
} from "../../oauth/oauth-store.js";
|
|
12
12
|
import { RiskLevel } from "../../permissions/types.js";
|
|
13
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
14
13
|
import { credentialKey } from "../../security/credential-key.js";
|
|
15
14
|
import {
|
|
16
15
|
deleteSecureKeyAsync,
|
|
@@ -75,13 +74,10 @@ class CredentialStoreTool implements Tool {
|
|
|
75
74
|
description =
|
|
76
75
|
"Store, list, delete, or prompt for credentials in the secure vault";
|
|
77
76
|
category = "credentials";
|
|
77
|
+
executionTarget = "sandbox" as const;
|
|
78
78
|
defaultRiskLevel = RiskLevel.Low;
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
name: this.name,
|
|
83
|
-
description: this.description,
|
|
84
|
-
input_schema: {
|
|
80
|
+
input_schema = {
|
|
85
81
|
type: "object",
|
|
86
82
|
properties: {
|
|
87
83
|
action: {
|
|
@@ -181,9 +177,7 @@ class CredentialStoreTool implements Tool {
|
|
|
181
177
|
},
|
|
182
178
|
},
|
|
183
179
|
required: ["action"],
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
}
|
|
180
|
+
};
|
|
187
181
|
|
|
188
182
|
async execute(
|
|
189
183
|
input: Record<string, unknown>,
|
|
@@ -42,6 +42,65 @@ export function canAccessDocument(
|
|
|
42
42
|
|
|
43
43
|
// ── Exported execute functions ──────────────────────────────────────
|
|
44
44
|
|
|
45
|
+
export function executeDocumentOpen(
|
|
46
|
+
input: Record<string, unknown>,
|
|
47
|
+
context: ToolContext,
|
|
48
|
+
): ToolExecutionResult {
|
|
49
|
+
const surfaceId = input.surface_id as string;
|
|
50
|
+
if (!canAccessDocument(surfaceId, context)) {
|
|
51
|
+
return documentNotFound(surfaceId);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const doc = getDocumentById(surfaceId);
|
|
55
|
+
if (!doc) {
|
|
56
|
+
return documentNotFound(surfaceId);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (context.sendToClient) {
|
|
60
|
+
context.sendToClient({
|
|
61
|
+
type: "document_editor_show",
|
|
62
|
+
conversationId: context.conversationId,
|
|
63
|
+
surfaceId: doc.surfaceId,
|
|
64
|
+
title: doc.title,
|
|
65
|
+
initialContent: doc.content,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
context.sendToClient({
|
|
69
|
+
type: "ui_surface_show",
|
|
70
|
+
conversationId: context.conversationId,
|
|
71
|
+
surfaceId: `preview-${doc.surfaceId}`,
|
|
72
|
+
surfaceType: "document_preview",
|
|
73
|
+
display: "inline",
|
|
74
|
+
title: doc.title,
|
|
75
|
+
data: {
|
|
76
|
+
title: doc.title,
|
|
77
|
+
surfaceId: doc.surfaceId,
|
|
78
|
+
subtitle: "Document",
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
content: JSON.stringify({
|
|
84
|
+
success: true,
|
|
85
|
+
surface_id: doc.surfaceId,
|
|
86
|
+
title: doc.title,
|
|
87
|
+
word_count: doc.wordCount,
|
|
88
|
+
message: "Document editor opened",
|
|
89
|
+
}),
|
|
90
|
+
isError: false,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
content: JSON.stringify({
|
|
96
|
+
success: false,
|
|
97
|
+
surface_id: surfaceId,
|
|
98
|
+
error: "No client connected to open document editor",
|
|
99
|
+
}),
|
|
100
|
+
isError: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
45
104
|
export function executeDocumentCreate(
|
|
46
105
|
input: Record<string, unknown>,
|
|
47
106
|
context: ToolContext,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { getTool } from "./registry.js";
|
|
2
1
|
import type { ExecutionTarget } from "./types.js";
|
|
3
2
|
|
|
4
3
|
export interface ManifestOverride {
|
|
@@ -6,28 +5,27 @@ export interface ManifestOverride {
|
|
|
6
5
|
execution_target: "host" | "sandbox";
|
|
7
6
|
}
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (toolName.startsWith("host_") || toolName.startsWith("computer_use_")) {
|
|
8
|
+
/**
|
|
9
|
+
* Decide a tool's execution target — sandbox (assistant container) or host
|
|
10
|
+
* (guardian's device via host-bridge proxy). Pure: same input → same output.
|
|
11
|
+
*
|
|
12
|
+
* Resolution order:
|
|
13
|
+
* 1. Declared `executionTarget` on the tool wins.
|
|
14
|
+
* 2. `executionMode === "proxy"` ⇒ host (proxied tools run on the client).
|
|
15
|
+
* 3. Name prefix heuristic — `host_*` / `computer_use_*` ⇒ host.
|
|
16
|
+
* 4. Default sandbox.
|
|
17
|
+
*
|
|
18
|
+
* Called once per tool at load/construction time. The returned value is
|
|
19
|
+
* stamped onto every `LoadedTool`, so runtime reads are just a field read.
|
|
20
|
+
*/
|
|
21
|
+
export function resolveExecutionTarget(tool: {
|
|
22
|
+
name: string;
|
|
23
|
+
executionTarget?: ExecutionTarget;
|
|
24
|
+
executionMode?: "local" | "proxy";
|
|
25
|
+
}): ExecutionTarget {
|
|
26
|
+
if (tool.executionTarget) return tool.executionTarget;
|
|
27
|
+
if (tool.executionMode === "proxy") return "host";
|
|
28
|
+
if (tool.name.startsWith("host_") || tool.name.startsWith("computer_use_")) {
|
|
31
29
|
return "host";
|
|
32
30
|
}
|
|
33
31
|
return "sandbox";
|
package/src/tools/executor.ts
CHANGED
|
@@ -22,6 +22,7 @@ import { getLogger } from "../util/logger.js";
|
|
|
22
22
|
import { resolveExecutionTarget } from "./execution-target.js";
|
|
23
23
|
import { executeWithTimeout, safeTimeoutMs } from "./execution-timeout.js";
|
|
24
24
|
import { PermissionChecker } from "./permission-checker.js";
|
|
25
|
+
import { getTool } from "./registry.js";
|
|
25
26
|
import { extractAndSanitize } from "./sensitive-output-placeholders.js";
|
|
26
27
|
import { applyEdit } from "./shared/filesystem/edit-engine.js";
|
|
27
28
|
import { sandboxPolicy } from "./shared/filesystem/path-policy.js";
|
|
@@ -126,7 +127,11 @@ export class ToolExecutor {
|
|
|
126
127
|
let permApprovalMode: string | undefined;
|
|
127
128
|
let permApprovalReason: string | undefined;
|
|
128
129
|
let permRiskThreshold: string | undefined;
|
|
129
|
-
|
|
130
|
+
// Registered tools have `executionTarget` stamped at load time; the
|
|
131
|
+
// `resolveExecutionTarget` fallback only fires for unknown tools (the
|
|
132
|
+
// executor's name-aliased lookup can race against late registration).
|
|
133
|
+
const executionTarget =
|
|
134
|
+
getTool(name)?.executionTarget ?? resolveExecutionTarget({ name });
|
|
130
135
|
|
|
131
136
|
emitLifecycleEvent(context, {
|
|
132
137
|
type: "start",
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { RiskLevel } from "../../permissions/types.js";
|
|
2
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
3
2
|
import { registerTool } from "../registry.js";
|
|
4
3
|
import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
|
|
5
4
|
import { formatEditDiff } from "../shared/filesystem/format-diff.js";
|
|
@@ -11,13 +10,10 @@ class FileEditTool implements Tool {
|
|
|
11
10
|
description =
|
|
12
11
|
"Replace an exact string in a file on your own machine with a new string. Use this for surgical edits instead of rewriting entire files. Use host_file_edit for files on your guardian's device instead.";
|
|
13
12
|
category = "filesystem";
|
|
13
|
+
executionTarget = "sandbox" as const;
|
|
14
14
|
defaultRiskLevel = RiskLevel.Low;
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
return {
|
|
18
|
-
name: this.name,
|
|
19
|
-
description: this.description,
|
|
20
|
-
input_schema: {
|
|
16
|
+
input_schema = {
|
|
21
17
|
type: "object",
|
|
22
18
|
properties: {
|
|
23
19
|
path: {
|
|
@@ -45,9 +41,7 @@ class FileEditTool implements Tool {
|
|
|
45
41
|
},
|
|
46
42
|
},
|
|
47
43
|
required: ["path", "old_string", "new_string", "activity"],
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
}
|
|
44
|
+
};
|
|
51
45
|
|
|
52
46
|
async execute(
|
|
53
47
|
input: Record<string, unknown>,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { RiskLevel } from "../../permissions/types.js";
|
|
2
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
3
2
|
import { registerTool } from "../registry.js";
|
|
4
3
|
import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
|
|
5
4
|
import { sandboxPolicy } from "../shared/filesystem/path-policy.js";
|
|
@@ -10,13 +9,10 @@ class FileListTool implements Tool {
|
|
|
10
9
|
description =
|
|
11
10
|
"List the contents of a directory on your own machine. Returns file and subdirectory names with type indicators and sizes.";
|
|
12
11
|
category = "filesystem";
|
|
12
|
+
executionTarget = "sandbox" as const;
|
|
13
13
|
defaultRiskLevel = RiskLevel.Low;
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
return {
|
|
17
|
-
name: this.name,
|
|
18
|
-
description: this.description,
|
|
19
|
-
input_schema: {
|
|
15
|
+
input_schema = {
|
|
20
16
|
type: "object",
|
|
21
17
|
properties: {
|
|
22
18
|
path: {
|
|
@@ -34,9 +30,7 @@ class FileListTool implements Tool {
|
|
|
34
30
|
},
|
|
35
31
|
},
|
|
36
32
|
required: ["path", "activity"],
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
}
|
|
33
|
+
};
|
|
40
34
|
|
|
41
35
|
async execute(
|
|
42
36
|
input: Record<string, unknown>,
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { extname } from "node:path";
|
|
2
2
|
|
|
3
3
|
import { RiskLevel } from "../../permissions/types.js";
|
|
4
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
5
4
|
import { registerTool } from "../registry.js";
|
|
6
5
|
import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
|
|
7
6
|
import {
|
|
@@ -16,13 +15,10 @@ class FileReadTool implements Tool {
|
|
|
16
15
|
description =
|
|
17
16
|
"Read the contents of a file on your own machine. For image files (JPEG, PNG, GIF, WebP), returns the image for visual analysis. Use host_file_read for files on your guardian's device instead.";
|
|
18
17
|
category = "filesystem";
|
|
18
|
+
executionTarget = "sandbox" as const;
|
|
19
19
|
defaultRiskLevel = RiskLevel.Low;
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
return {
|
|
23
|
-
name: this.name,
|
|
24
|
-
description: this.description,
|
|
25
|
-
input_schema: {
|
|
21
|
+
input_schema = {
|
|
26
22
|
type: "object",
|
|
27
23
|
properties: {
|
|
28
24
|
path: {
|
|
@@ -45,9 +41,7 @@ class FileReadTool implements Tool {
|
|
|
45
41
|
},
|
|
46
42
|
},
|
|
47
43
|
required: ["path", "activity"],
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
}
|
|
44
|
+
};
|
|
51
45
|
|
|
52
46
|
async execute(
|
|
53
47
|
input: Record<string, unknown>,
|
|
@@ -3,7 +3,6 @@ import { join, resolve, sep } from "node:path";
|
|
|
3
3
|
import { enqueuePkbIndexJob } from "../../memory/jobs/embed-pkb-file.js";
|
|
4
4
|
import { PKB_WORKSPACE_SCOPE } from "../../memory/pkb/types.js";
|
|
5
5
|
import { RiskLevel } from "../../permissions/types.js";
|
|
6
|
-
import type { ToolDefinition } from "../../providers/types.js";
|
|
7
6
|
import { getLogger } from "../../util/logger.js";
|
|
8
7
|
import { getWorkspaceDir } from "../../util/platform.js";
|
|
9
8
|
import { registerTool } from "../registry.js";
|
|
@@ -35,13 +34,10 @@ class FileWriteTool implements Tool {
|
|
|
35
34
|
description =
|
|
36
35
|
"Write content to a file on your own machine, creating it if it does not exist. Use host_file_write for files on your guardian's device instead.";
|
|
37
36
|
category = "filesystem";
|
|
37
|
+
executionTarget = "sandbox" as const;
|
|
38
38
|
defaultRiskLevel = RiskLevel.Low;
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
return {
|
|
42
|
-
name: this.name,
|
|
43
|
-
description: this.description,
|
|
44
|
-
input_schema: {
|
|
40
|
+
input_schema = {
|
|
45
41
|
type: "object",
|
|
46
42
|
properties: {
|
|
47
43
|
path: {
|
|
@@ -60,9 +56,7 @@ class FileWriteTool implements Tool {
|
|
|
60
56
|
},
|
|
61
57
|
},
|
|
62
58
|
required: ["path", "content", "activity"],
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
}
|
|
59
|
+
};
|
|
66
60
|
|
|
67
61
|
async execute(
|
|
68
62
|
input: Record<string, unknown>,
|