@vellumai/assistant 0.6.4 → 0.6.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/.prettierignore +5 -0
- package/ARCHITECTURE.md +32 -36
- package/Dockerfile +12 -0
- package/README.md +3 -4
- package/bun.lock +8 -3
- package/docs/architecture/integrations.md +1 -20
- package/docs/architecture/security.md +16 -16
- package/docs/error-handling.md +111 -0
- package/docs/skills.md +10 -10
- package/docs/stt-provider-onboarding.md +2 -1
- package/knip.json +9 -2
- package/node_modules/@vellumai/ces-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-contracts/src/__tests__/trust-rules.test.ts +471 -0
- package/node_modules/@vellumai/ces-contracts/src/trust-rules.ts +398 -4
- package/node_modules/@vellumai/credential-storage/bun.lock +2 -2
- package/node_modules/@vellumai/credential-storage/package.json +2 -2
- package/node_modules/@vellumai/credential-storage/src/oauth-runtime.ts +20 -2
- package/node_modules/@vellumai/egress-proxy/bun.lock +2 -2
- package/node_modules/@vellumai/egress-proxy/package.json +2 -2
- package/openapi.yaml +123 -11
- package/package.json +6 -3
- package/scripts/generate-openapi.ts +50 -11
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +318 -0
- package/src/__tests__/agent-loop-sentry-hygiene.test.ts +137 -0
- package/src/__tests__/agent-loop.test.ts +112 -1
- package/src/__tests__/anthropic-error-formatting.test.ts +98 -0
- package/src/__tests__/anthropic-provider.test.ts +171 -2
- package/src/__tests__/approval-cascade.test.ts +31 -10
- package/src/__tests__/approval-routes-http.test.ts +134 -10
- package/src/__tests__/assistant-attachments.test.ts +44 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -0
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-identifier-parity-guard.test.ts +53 -0
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +23 -33
- package/src/__tests__/browser-skill-endstate.test.ts +51 -182
- package/src/__tests__/btw-routes.test.ts +47 -1
- package/src/__tests__/call-controller.test.ts +1 -2
- package/src/__tests__/call-site-routing-provider.test.ts +214 -0
- package/src/__tests__/catalog-cache.test.ts +27 -4
- package/src/__tests__/channel-approval-routes.test.ts +4 -4
- package/src/__tests__/channel-reply-delivery.test.ts +300 -2
- package/src/__tests__/checker.test.ts +428 -501
- package/src/__tests__/cli-command-risk-guard.test.ts +30 -33
- package/src/__tests__/compaction-circuit-breaker.test.ts +336 -0
- package/src/__tests__/compaction.benchmark.test.ts +1 -1
- package/src/__tests__/config-analysis.test.ts +11 -28
- package/src/__tests__/config-loader-backfill.test.ts +174 -0
- package/src/__tests__/config-loader-corrupt.test.ts +183 -0
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +202 -0
- package/src/__tests__/config-schema-cmd.test.ts +11 -5
- package/src/__tests__/config-schema.test.ts +427 -114
- package/src/__tests__/config-watcher.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +72 -73
- package/src/__tests__/contacts-write.test.ts +4 -4
- package/src/__tests__/context-token-estimator.test.ts +191 -1
- package/src/__tests__/context-window-manager.test.ts +530 -2
- package/src/__tests__/conversation-abort-tool-results.test.ts +30 -16
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +61 -17
- package/src/__tests__/conversation-agent-loop.test.ts +412 -82
- package/src/__tests__/conversation-attachments.test.ts +1 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +30 -9
- package/src/__tests__/conversation-error.test.ts +37 -6
- package/src/__tests__/conversation-history-web-search.test.ts +6 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +36 -0
- package/src/__tests__/conversation-lifecycle.test.ts +336 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +27 -10
- package/src/__tests__/conversation-pre-run-repair.test.ts +30 -16
- package/src/__tests__/conversation-process-callsite.test.ts +306 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +30 -16
- package/src/__tests__/conversation-queue.test.ts +41 -26
- package/src/__tests__/conversation-routes-disk-view.test.ts +29 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +31 -3
- package/src/__tests__/conversation-runtime-assembly.test.ts +2735 -55
- package/src/__tests__/conversation-runtime-workspace.test.ts +12 -12
- package/src/__tests__/conversation-skill-tools.test.ts +12 -146
- package/src/__tests__/conversation-slash-queue.test.ts +34 -19
- package/src/__tests__/conversation-slash-unknown.test.ts +30 -16
- package/src/__tests__/conversation-speed-override.test.ts +30 -11
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1035 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +630 -0
- package/src/__tests__/conversation-title-service.test.ts +2 -2
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +1 -1
- package/src/__tests__/conversation-unread-route.test.ts +2 -2
- package/src/__tests__/conversation-usage.test.ts +3 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +31 -10
- package/src/__tests__/conversation-workspace-injection.test.ts +43 -15
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +44 -16
- package/src/__tests__/credential-broker-browser-fill.test.ts +110 -0
- package/src/__tests__/credential-security-invariants.test.ts +3 -0
- package/src/__tests__/credential-storage-oauth-compat.test.ts +18 -0
- package/src/__tests__/credential-storage-static-compat.test.ts +28 -0
- package/src/__tests__/credential-vault-unit.test.ts +135 -19
- package/src/__tests__/credentials-cli.test.ts +1 -9
- package/src/__tests__/cross-provider-web-search.test.ts +84 -0
- package/src/__tests__/daemon-server-persist-and-process-callsite.test.ts +92 -0
- package/src/__tests__/delete-propagation.test.ts +437 -0
- package/src/__tests__/dm-backfill.test.ts +417 -0
- package/src/__tests__/dm-persistence.test.ts +227 -0
- package/src/__tests__/edit-propagation.test.ts +280 -0
- package/src/__tests__/ephemeral-permissions.test.ts +93 -3
- package/src/__tests__/estimator-calibration-integration.test.ts +208 -0
- package/src/__tests__/estimator-calibration.test.ts +213 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +26 -7
- package/src/__tests__/file-write-tool.test.ts +151 -1
- package/src/__tests__/filing-service.test.ts +255 -0
- package/src/__tests__/gemini-provider.test.ts +0 -3
- package/src/__tests__/guardian-grant-minting.test.ts +8 -0
- package/src/__tests__/headless-browser-interactions.test.ts +1 -1
- package/src/__tests__/heartbeat-service.test.ts +96 -15
- package/src/__tests__/host-shell-tool.test.ts +124 -18
- package/src/__tests__/http-user-message-parity.test.ts +29 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +340 -0
- package/src/__tests__/intent-routing.test.ts +1 -40
- package/src/__tests__/llm-catalog-parity.test.ts +174 -0
- package/src/__tests__/llm-context-normalization.test.ts +121 -0
- package/src/__tests__/llm-resolver.test.ts +214 -0
- package/src/__tests__/llm-schema.test.ts +223 -0
- package/src/__tests__/managed-proxy-context.test.ts +6 -2
- package/src/__tests__/messaging-skill-split.test.ts +3 -34
- package/src/__tests__/migration-import-from-url.test.ts +684 -0
- package/src/__tests__/model-intents.test.ts +9 -83
- package/src/__tests__/notification-decision-fallback.test.ts +0 -10
- package/src/__tests__/notification-decision-identity.test.ts +0 -9
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -9
- package/src/__tests__/oauth-store.test.ts +10 -7
- package/src/__tests__/oauth2-gateway-transport.test.ts +8 -3
- package/src/__tests__/oauth2-refresh-retry.test.ts +279 -0
- package/src/__tests__/openai-provider.test.ts +7 -0
- package/src/__tests__/openai-responses-provider.test.ts +396 -0
- package/src/__tests__/openrouter-provider-only.test.ts +135 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +293 -0
- package/src/__tests__/permission-checker-host-gate.test.ts +1 -1
- package/src/__tests__/permission-mode.test.ts +16 -0
- package/src/__tests__/permission-types.test.ts +0 -1
- package/src/__tests__/persona-resolver.test.ts +13 -13
- package/src/__tests__/pkb-autoinject.test.ts +37 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
- package/src/__tests__/pricing.test.ts +50 -3
- package/src/__tests__/profiler-routes.test.ts +1 -1
- package/src/__tests__/provider-commit-message-generator.test.ts +14 -84
- package/src/__tests__/provider-env-vars-scope.test.ts +52 -0
- package/src/__tests__/provider-error-scenarios.test.ts +135 -6
- package/src/__tests__/provider-managed-proxy-integration.test.ts +42 -11
- package/src/__tests__/provider-registry-ollama.test.ts +1 -2
- package/src/__tests__/proxy-approval-callback.test.ts +0 -1
- package/src/__tests__/reaction-persistence.test.ts +560 -0
- package/src/__tests__/relay-server.test.ts +1 -1
- package/src/__tests__/require-fresh-approval.test.ts +1 -1
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +136 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +226 -0
- package/src/__tests__/risk-classifier-parity.test.ts +230 -0
- package/src/__tests__/sanitize-config-for-transfer.test.ts +78 -1
- package/src/__tests__/secret-ingress-http.test.ts +28 -0
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +125 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +2 -3
- package/src/__tests__/secret-scanner-executor.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +29 -1
- package/src/__tests__/server-history-render.test.ts +31 -0
- package/src/__tests__/shell-parser-property.test.ts +13 -13
- package/src/__tests__/skill-cache-store.test.ts +182 -0
- package/src/__tests__/skills.test.ts +19 -33
- package/src/__tests__/slack-app-setup-skill-regression.test.ts +3 -1
- package/src/__tests__/slack-skill.test.ts +3 -8
- package/src/__tests__/starter-bundle.test.ts +35 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +280 -0
- package/src/__tests__/suggestion-routes.test.ts +160 -3
- package/src/__tests__/system-prompt.test.ts +22 -35
- package/src/__tests__/task-runner.test.ts +3 -1
- package/src/__tests__/tcc-sandbox-deny.test.ts +198 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +2 -52
- package/src/__tests__/thread-backfill.test.ts +941 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +2 -2
- package/src/__tests__/tool-executor.test.ts +60 -94
- package/src/__tests__/trust-store.test.ts +442 -109
- package/src/__tests__/update-bulletin-job.test.ts +389 -0
- package/src/__tests__/usage-cache-backfill-migration.test.ts +3 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -22
- package/src/__tests__/voice-session-bridge.test.ts +39 -0
- package/src/__tests__/volume-security-guard.test.ts +3 -2
- package/src/__tests__/web-search-history.test.ts +337 -0
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +343 -0
- package/src/__tests__/workspace-migration-043-release-notes-latex-rendering.test.ts +202 -0
- package/src/__tests__/workspace-migration-045-release-notes-meet-avatar.test.ts +210 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +11 -11
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +841 -0
- package/src/__tests__/workspace-policy.test.ts +1 -13
- package/src/acp/client-handler.ts +1 -2
- package/src/agent/loop.ts +209 -17
- package/src/avatar/resvg-lazy.test.ts +136 -0
- package/src/avatar/resvg-lazy.ts +82 -9
- package/src/avatar/traits-png-sync.ts +21 -1
- package/src/browser/__tests__/operations.test.ts +163 -0
- package/src/browser/identifiers.ts +51 -0
- package/src/browser/operations.ts +660 -0
- package/src/browser/types.ts +81 -0
- package/src/calls/guardian-question-copy.ts +2 -2
- package/src/calls/telephony-stt-routing.ts +1 -1
- package/src/calls/voice-session-bridge.ts +1 -0
- package/src/cli/AGENTS.md +1 -1
- package/src/cli/commands/__tests__/attachment.test.ts +438 -0
- package/src/cli/commands/__tests__/browser.test.ts +554 -0
- package/src/cli/commands/__tests__/cache.test.ts +623 -0
- package/src/cli/commands/__tests__/email-list.test.ts +6 -0
- package/src/cli/commands/__tests__/email-send.test.ts +93 -1
- package/src/cli/commands/__tests__/image-generation.test.ts +666 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +451 -0
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +454 -0
- package/src/cli/commands/__tests__/task.test.ts +913 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +594 -0
- package/src/cli/commands/__tests__/ui-confirm.test.ts +650 -0
- package/src/cli/commands/__tests__/ui.test.ts +1215 -0
- package/src/cli/commands/__tests__/watchers.test.ts +716 -0
- package/src/cli/commands/attachment.ts +182 -0
- package/src/cli/commands/browser.ts +350 -0
- package/src/cli/commands/cache.ts +341 -0
- package/src/cli/commands/completions.ts +0 -3
- package/src/cli/commands/config.ts +6 -6
- package/src/cli/commands/conversations-import.ts +347 -0
- package/src/cli/commands/conversations.ts +14 -1
- package/src/cli/commands/email.ts +234 -194
- package/src/cli/commands/image-generation.ts +300 -0
- package/src/cli/commands/inference.ts +200 -0
- package/src/cli/commands/memory.ts +127 -17
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -1
- package/src/cli/commands/stt.ts +339 -0
- package/src/cli/commands/task.ts +795 -0
- package/src/cli/commands/trust.ts +50 -19
- package/src/cli/commands/tts.ts +273 -0
- package/src/cli/commands/ui.ts +670 -0
- package/src/cli/commands/watchers.ts +509 -0
- package/src/cli/lib/daemon-credential-client.ts +0 -19
- package/src/cli/program.ts +23 -4
- package/src/cli.ts +0 -37
- package/src/config/bundled-skills/conversations/tools/rename-conversation.ts +23 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +2 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +4 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +8 -1
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +15 -1
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +21 -1
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +11 -12
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +9 -8
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-tool-registry.ts +0 -175
- package/src/config/env.ts +7 -2
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/llm-resolver.ts +128 -0
- package/src/config/loader.ts +194 -10
- package/src/config/raw-config-utils.ts +30 -2
- package/src/config/sanitize-for-transfer.ts +35 -0
- package/src/config/schema.ts +30 -41
- package/src/config/schemas/analysis.ts +3 -22
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/filing.ts +2 -7
- package/src/config/schemas/heartbeat.ts +0 -5
- package/src/config/schemas/inference.ts +3 -23
- package/src/config/schemas/llm.ts +318 -0
- package/src/config/schemas/memory-processing.ts +1 -9
- package/src/config/schemas/notifications.ts +4 -11
- package/src/config/schemas/platform.ts +3 -9
- package/src/config/schemas/security.ts +33 -0
- package/src/config/schemas/services.ts +9 -4
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/schemas/tts.ts +53 -0
- package/src/config/schemas/updates.ts +1 -1
- package/src/config/schemas/workspace-git.ts +3 -40
- package/src/config/skills.ts +2 -2
- package/src/context/__tests__/compact-prompt.test.ts +45 -0
- package/src/context/__tests__/microcompact.test.ts +805 -0
- package/src/context/estimator-calibration.ts +136 -0
- package/src/context/microcompact.ts +443 -0
- package/src/context/prompts/compact.md +12 -0
- package/src/context/token-estimator.ts +61 -3
- package/src/context/window-manager.ts +229 -25
- package/src/credential-execution/approval-bridge.ts +0 -1
- package/src/credential-execution/executable-discovery.ts +19 -8
- package/src/credential-execution/process-manager.test.ts +109 -0
- package/src/credential-execution/process-manager.ts +65 -2
- package/src/daemon/approval-generators.ts +29 -4
- package/src/daemon/assistant-attachments.ts +24 -13
- package/src/daemon/classifier.ts +2 -2
- package/src/daemon/config-watcher.ts +0 -1
- package/src/daemon/context-overflow-reducer.ts +4 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +79 -12
- package/src/daemon/conversation-agent-loop.ts +462 -80
- package/src/daemon/conversation-attachments.ts +2 -6
- package/src/daemon/conversation-error.ts +36 -1
- package/src/daemon/conversation-lifecycle.ts +30 -6
- package/src/daemon/conversation-messaging.ts +73 -4
- package/src/daemon/conversation-process.ts +10 -4
- package/src/daemon/conversation-queue-manager.ts +3 -0
- package/src/daemon/conversation-runtime-assembly.ts +760 -29
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +389 -1
- package/src/daemon/conversation-tool-setup.ts +10 -5
- package/src/daemon/conversation-usage.ts +1 -1
- package/src/daemon/conversation.ts +118 -30
- package/src/daemon/external-skills-bootstrap.ts +41 -0
- package/src/daemon/guardian-action-generators.ts +34 -14
- package/src/daemon/handlers/config-model.test.ts +86 -0
- package/src/daemon/handlers/config-model.ts +54 -12
- package/src/daemon/handlers/conversations.ts +9 -2
- package/src/daemon/handlers/shared.ts +39 -11
- package/src/daemon/handlers/skills.ts +2 -2
- package/src/daemon/handlers/slack-channel-oauth-install.ts +197 -0
- package/src/daemon/lifecycle.ts +76 -14
- package/src/daemon/message-types/conversations.ts +14 -0
- package/src/daemon/message-types/messages.ts +9 -1
- package/src/daemon/message-types/trust.ts +0 -2
- package/src/daemon/parse-actual-tokens-from-error.test.ts +57 -1
- package/src/daemon/parse-actual-tokens-from-error.ts +66 -0
- package/src/daemon/pkb-context-tracker.test.ts +169 -0
- package/src/daemon/pkb-context-tracker.ts +125 -0
- package/src/daemon/pkb-reminder-builder.test.ts +70 -0
- package/src/daemon/pkb-reminder-builder.ts +31 -0
- package/src/daemon/providers-setup.ts +6 -0
- package/src/daemon/server.ts +117 -9
- package/src/daemon/tool-side-effects.ts +0 -9
- package/src/daemon/watch-handler.ts +4 -4
- package/src/daemon/web-search-history.ts +126 -0
- package/src/events/domain-events.ts +0 -1
- package/src/filing/filing-service.ts +9 -10
- package/src/heartbeat/heartbeat-service.ts +76 -28
- package/src/home/__tests__/feed-scheduler.test.ts +39 -11
- package/src/home/__tests__/rollup-producer.test.ts +44 -0
- package/src/home/assistant-feed-authoring.ts +4 -0
- package/src/home/emit-feed-event.ts +4 -0
- package/src/home/feed-scheduler.ts +20 -4
- package/src/home/feed-types.ts +56 -2
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/home/rollup-producer.ts +34 -5
- package/src/home/suggested-prompts.ts +101 -0
- package/src/ipc/__tests__/attachment-ipc.test.ts +213 -0
- package/src/ipc/__tests__/browser-ipc.test.ts +339 -0
- package/src/ipc/__tests__/cache-ipc.test.ts +266 -0
- package/src/ipc/__tests__/socket-path.test.ts +73 -0
- package/src/ipc/__tests__/task-ipc.test.ts +577 -0
- package/src/ipc/__tests__/ui-request-route.test.ts +495 -0
- package/src/ipc/__tests__/watcher-ipc.test.ts +295 -0
- package/src/ipc/cli-client.ts +2 -1
- package/src/ipc/cli-server.ts +26 -8
- package/src/ipc/gateway-client.ts +4 -4
- package/src/ipc/routes/attachment.ts +114 -0
- package/src/ipc/routes/browser-context.ts +61 -0
- package/src/ipc/routes/browser.ts +96 -0
- package/src/ipc/routes/cache.ts +96 -0
- package/src/ipc/routes/index.ts +17 -1
- package/src/ipc/routes/task-queue.ts +226 -0
- package/src/ipc/routes/task.ts +173 -0
- package/src/ipc/routes/ui-request.ts +50 -0
- package/src/ipc/routes/watcher.ts +203 -0
- package/src/ipc/socket-path.ts +100 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +9 -8
- package/src/memory/__tests__/conversation-group-migration.test.ts +99 -0
- package/src/memory/admin.ts +18 -0
- package/src/memory/conversation-analyze-job.ts +14 -13
- package/src/memory/conversation-attention-store.ts +13 -6
- package/src/memory/conversation-crud.ts +103 -3
- package/src/memory/conversation-group-migration.ts +38 -6
- package/src/memory/conversation-title-service.ts +7 -4
- package/src/memory/db-init.ts +2 -0
- package/src/memory/embedding-backend.ts +1 -1
- package/src/memory/graph/compaction.ts +299 -0
- package/src/memory/graph/consolidation.ts +4 -4
- package/src/memory/graph/conversation-graph-memory.ts +89 -29
- package/src/memory/graph/extraction.test.ts +272 -2
- package/src/memory/graph/extraction.ts +173 -51
- package/src/memory/graph/graph-search.test.ts +92 -0
- package/src/memory/graph/graph-search.ts +4 -1
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +459 -0
- package/src/memory/graph/retriever.ts +230 -48
- package/src/memory/graph/store.ts +41 -0
- package/src/memory/graph/tool-handlers.ts +27 -0
- package/src/memory/graph/tools.ts +6 -1
- package/src/memory/indexer.ts +5 -5
- package/src/memory/job-handlers/conversation-starters.ts +23 -20
- package/src/memory/job-handlers/summarization.ts +2 -2
- package/src/memory/job-utils.ts +7 -1
- package/src/memory/jobs/embed-pkb-file.test.ts +168 -0
- package/src/memory/jobs/embed-pkb-file.ts +54 -0
- package/src/memory/jobs-store.ts +44 -3
- package/src/memory/jobs-worker.ts +4 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +1 -1
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +2 -2
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +82 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/pkb/pkb-index.test.ts +368 -0
- package/src/memory/pkb/pkb-index.ts +255 -0
- package/src/memory/pkb/pkb-reconcile.test.ts +251 -0
- package/src/memory/pkb/pkb-reconcile.ts +148 -0
- package/src/memory/pkb/pkb-search.test.ts +438 -0
- package/src/memory/pkb/pkb-search.ts +137 -0
- package/src/memory/pkb/types.ts +53 -0
- package/src/memory/qdrant-client.ts +122 -1
- package/src/memory/slack-thread-store.ts +37 -0
- package/src/messaging/providers/gmail/adapter.ts +6 -16
- package/src/messaging/providers/gmail/client.ts +22 -0
- package/src/messaging/providers/gmail/types.ts +7 -0
- package/src/messaging/providers/slack/adapter.ts +14 -2
- package/src/messaging/providers/slack/backfill.test.ts +257 -0
- package/src/messaging/providers/slack/backfill.ts +101 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +316 -0
- package/src/messaging/providers/slack/message-metadata.ts +123 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1373 -0
- package/src/messaging/providers/slack/render-transcript.ts +443 -0
- package/src/messaging/style-analyzer.ts +5 -2
- package/src/notifications/README.md +9 -5
- package/src/notifications/decision-engine.ts +3 -9
- package/src/notifications/preference-extractor.ts +2 -6
- package/src/oauth/oauth-store.ts +1 -0
- package/src/oauth/platform-connection.test.ts +47 -0
- package/src/oauth/platform-connection.ts +15 -5
- package/src/oauth/seed-providers.ts +4 -2
- package/src/permissions/approval-policy.test.ts +948 -0
- package/src/permissions/approval-policy.ts +257 -0
- package/src/permissions/bash-risk-classifier.test.ts +1208 -0
- package/src/permissions/bash-risk-classifier.ts +707 -0
- package/src/permissions/checker.ts +217 -708
- package/src/permissions/command-registry.test.ts +535 -0
- package/src/permissions/command-registry.ts +825 -0
- package/src/permissions/defaults.ts +26 -78
- package/src/permissions/file-risk-classifier.test.ts +535 -0
- package/src/permissions/file-risk-classifier.ts +274 -0
- package/src/permissions/risk-types.ts +205 -0
- package/src/permissions/secret-prompter.ts +53 -2
- package/src/permissions/skill-risk-classifier.test.ts +311 -0
- package/src/permissions/skill-risk-classifier.ts +214 -0
- package/src/permissions/trust-client.ts +52 -25
- package/src/permissions/trust-store-interface.ts +1 -6
- package/src/permissions/trust-store.ts +161 -62
- package/src/permissions/types.ts +23 -14
- package/src/permissions/web-risk-classifier.test.ts +170 -0
- package/src/permissions/web-risk-classifier.ts +89 -0
- package/src/permissions/workspace-policy.ts +1 -16
- package/src/platform/client.ts +19 -1
- package/src/prompts/persona-resolver.ts +3 -3
- package/src/prompts/system-prompt.ts +19 -20
- package/src/prompts/templates/SOUL.md +2 -2
- package/src/prompts/update-bulletin-job.ts +190 -0
- package/src/providers/__tests__/context-overflow-error.test.ts +328 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +102 -0
- package/src/providers/__tests__/retry-callsite.test.ts +424 -0
- package/src/providers/anthropic/client.ts +183 -14
- package/src/providers/call-site-routing.ts +71 -0
- package/src/providers/gemini/client.ts +65 -2
- package/src/providers/managed-proxy/constants.ts +2 -1
- package/src/providers/model-catalog.ts +501 -33
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/openai/chat-completions-provider.ts +57 -1
- package/src/providers/openai/responses-provider.ts +86 -9
- package/src/providers/openrouter/client.ts +76 -9
- package/src/providers/provider-env-vars.ts +56 -0
- package/src/providers/provider-send-message.ts +22 -5
- package/src/providers/ratelimit.ts +4 -0
- package/src/providers/registry.ts +19 -8
- package/src/providers/retry.ts +174 -39
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +55 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +17 -0
- package/src/providers/speech-to-text/resolve.ts +7 -0
- package/src/providers/speech-to-text/xai-realtime.test.ts +578 -0
- package/src/providers/speech-to-text/xai-realtime.ts +796 -0
- package/src/providers/speech-to-text/xai.test.ts +155 -0
- package/src/providers/speech-to-text/xai.ts +97 -0
- package/src/providers/types.ts +93 -3
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/__tests__/agent-wake.test.ts +43 -2
- package/src/runtime/__tests__/interactive-ui.test.ts +673 -0
- package/src/runtime/agent-wake.ts +63 -22
- package/src/runtime/auth/route-policy.ts +4 -0
- package/src/runtime/btw-sidechain.ts +13 -3
- package/src/runtime/channel-reply-delivery.ts +106 -2
- package/src/runtime/decision-token.ts +116 -0
- package/src/runtime/gateway-client.ts +2 -2
- package/src/runtime/http-router.ts +32 -0
- package/src/runtime/http-server.ts +52 -1
- package/src/runtime/http-types.ts +23 -1
- package/src/runtime/interactive-ui.ts +362 -0
- package/src/runtime/invite-instruction-generator.ts +2 -2
- package/src/runtime/migrations/__tests__/gcs-signed-url.test.ts +176 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +390 -0
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +221 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +1540 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +453 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +222 -0
- package/src/runtime/migrations/gcs-signed-url.ts +162 -0
- package/src/runtime/migrations/vbundle-importer.ts +154 -9
- package/src/runtime/migrations/vbundle-metadata-merge.ts +124 -0
- package/src/runtime/migrations/vbundle-streaming-importer.ts +2522 -0
- package/src/runtime/migrations/vbundle-streaming-validator.ts +244 -0
- package/src/runtime/migrations/vbundle-tar-stream.ts +217 -0
- package/src/runtime/migrations/vbundle-validator.ts +15 -6
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +111 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +114 -75
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +246 -0
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +58 -0
- package/src/runtime/routes/approval-routes.ts +12 -17
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +9 -0
- package/src/runtime/routes/avatar-routes.ts +20 -4
- package/src/runtime/routes/btw-routes.ts +1 -4
- package/src/runtime/routes/conversation-management-routes.ts +20 -2
- package/src/runtime/routes/conversation-routes.ts +133 -27
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/diagnostics-routes.ts +6 -4
- package/src/runtime/routes/events-routes.ts +16 -0
- package/src/runtime/routes/guardian-approval-interception.ts +33 -3
- package/src/runtime/routes/guardian-approval-prompt.ts +13 -3
- package/src/runtime/routes/home-feed-routes.ts +120 -2
- package/src/runtime/routes/inbound-message-handler.ts +912 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +113 -2
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +61 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +129 -6
- package/src/runtime/routes/integrations/slack/channel.ts +25 -3
- package/src/runtime/routes/llm-context-normalization.ts +23 -1
- package/src/runtime/routes/migration-routes.ts +720 -124
- package/src/runtime/routes/settings-routes.ts +4 -2
- package/src/runtime/routes/trust-rules-routes.ts +30 -14
- package/src/runtime/routes/work-items-routes.test.ts +1 -1
- package/src/runtime/routes/work-items-routes.ts +3 -2
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +25 -43
- package/src/runtime/services/analyze-conversation.ts +12 -16
- package/src/runtime/skill-route-registry.ts +28 -6
- package/src/schedule/scheduler.ts +8 -0
- package/src/security/__tests__/provider-key-env-fallback.test.ts +119 -0
- package/src/security/__tests__/untrusted-content.test.ts +109 -0
- package/src/security/oauth2.ts +98 -35
- package/src/security/secure-keys.ts +7 -8
- package/src/security/token-manager.ts +27 -13
- package/src/security/untrusted-content.ts +102 -0
- package/src/skills/catalog-cache.ts +26 -7
- package/src/skills/catalog-install.ts +31 -3
- package/src/skills/skill-cache-store.ts +97 -0
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +76 -0
- package/src/stt/daemon-batch-transcriber.ts +33 -0
- package/src/stt/stt-stream-session.ts +8 -1
- package/src/stt/types.ts +5 -1
- package/src/subagent/manager.ts +41 -13
- package/src/tasks/ephemeral-permissions.ts +9 -4
- package/src/telemetry/usage-telemetry-reporter.ts +27 -5
- package/src/tools/browser/__tests__/browser-status.test.ts +45 -2
- package/src/tools/browser/browser-execution.ts +65 -38
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +22 -0
- package/src/tools/credentials/tool-policy.ts +39 -5
- package/src/tools/credentials/vault.ts +9 -4
- package/src/tools/executor.ts +4 -0
- package/src/tools/filesystem/write.ts +52 -0
- package/src/tools/host-terminal/host-shell.ts +45 -5
- package/src/tools/memory/register.test.ts +185 -0
- package/src/tools/memory/register.ts +3 -1
- package/src/tools/network/web-fetch.ts +20 -10
- package/src/tools/network/web-search.ts +19 -4
- package/src/tools/permission-checker.ts +36 -15
- package/src/tools/policy-context.ts +25 -8
- package/src/tools/registry.ts +55 -3
- package/src/tools/side-effects.ts +0 -11
- package/src/tools/skills/execute.ts +2 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/terminal/backends/native.ts +51 -2
- package/src/tools/terminal/safe-env.ts +3 -2
- package/src/tools/terminal/shell.ts +1 -0
- package/src/tools/tool-manifest.ts +6 -21
- package/src/tools/types.ts +12 -3
- package/src/tools/verification-control-plane-policy.ts +1 -1
- package/src/tts/__tests__/provider-adapters.test.ts +240 -13
- package/src/tts/provider-catalog.ts +18 -0
- package/src/tts/providers/index.ts +2 -0
- package/src/tts/providers/xai-provider.ts +224 -0
- package/src/tts/types.ts +46 -0
- package/src/types/tar-stream.d.ts +66 -0
- package/src/util/json.ts +17 -0
- package/src/util/platform.ts +2 -2
- package/src/util/pricing.ts +15 -5
- package/src/watcher/engine.ts +1 -1
- package/src/watcher/providers/google-calendar.ts +134 -8
- package/src/watcher/providers/outlook-calendar.ts +42 -2
- package/src/workspace/git-service.ts +23 -4
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +516 -0
- package/src/workspace/migrations/039-drop-legacy-llm-keys.ts +171 -0
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +154 -0
- package/src/workspace/migrations/041-backfill-google-gmail-settings-scope.ts +57 -0
- package/src/workspace/migrations/042-fix-backfill-google-gmail-settings-scope.ts +70 -0
- package/src/workspace/migrations/043-release-notes-latex-rendering.ts +75 -0
- package/src/workspace/migrations/044-bump-stale-provider-stream-timeout.ts +51 -0
- package/src/workspace/migrations/045-release-notes-meet-avatar.ts +130 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/registry.ts +16 -0
- package/src/workspace/provider-commit-message-generator.ts +19 -38
- package/src/__tests__/gmail-archive-fallback.test.ts +0 -193
- package/src/__tests__/gmail-archive-gate.test.ts +0 -246
- package/src/__tests__/gmail-preferences.test.ts +0 -117
- package/src/__tests__/outlook-attachments.test.ts +0 -301
- package/src/__tests__/outlook-automation-tools.test.ts +0 -425
- package/src/__tests__/outlook-categories.test.ts +0 -212
- package/src/__tests__/outlook-compose-tools.test.ts +0 -325
- package/src/__tests__/outlook-declutter-tools.test.ts +0 -585
- package/src/__tests__/outlook-follow-up.test.ts +0 -196
- package/src/__tests__/outlook-trash.test.ts +0 -77
- package/src/__tests__/outlook-unsubscribe.test.ts +0 -279
- package/src/__tests__/update-bulletin-format.test.ts +0 -181
- package/src/__tests__/update-bulletin-state.test.ts +0 -135
- package/src/__tests__/update-bulletin.test.ts +0 -478
- package/src/__tests__/update-template-contract.test.ts +0 -29
- package/src/cli/commands/doctor.ts +0 -341
- package/src/config/bundled-skills/browser/SKILL.md +0 -88
- package/src/config/bundled-skills/browser/TOOLS.json +0 -516
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-hover.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-scroll.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-select-option.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-status.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -12
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +0 -49
- package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -12
- package/src/config/bundled-skills/chatgpt-import/SKILL.md +0 -27
- package/src/config/bundled-skills/chatgpt-import/TOOLS.json +0 -27
- package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +0 -378
- package/src/config/bundled-skills/gmail/SKILL.md +0 -221
- package/src/config/bundled-skills/gmail/TOOLS.json +0 -588
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +0 -256
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +0 -112
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +0 -44
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +0 -81
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +0 -108
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +0 -146
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +0 -53
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +0 -59
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +0 -82
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +0 -26
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +0 -347
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +0 -29
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +0 -122
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +0 -67
- package/src/config/bundled-skills/gmail/tools/scan-result-store.ts +0 -100
- package/src/config/bundled-skills/gmail/tools/shared.ts +0 -47
- package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -226
- package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -223
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -27
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -48
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -19
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -36
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -58
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/google-calendar/types.ts +0 -97
- package/src/config/bundled-skills/outlook/SKILL.md +0 -196
- package/src/config/bundled-skills/outlook/TOOLS.json +0 -530
- package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +0 -85
- package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +0 -77
- package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +0 -84
- package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +0 -94
- package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +0 -49
- package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +0 -237
- package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +0 -161
- package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +0 -32
- package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +0 -272
- package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +0 -29
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +0 -129
- package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +0 -87
- package/src/config/bundled-skills/outlook/tools/shared.ts +0 -20
- package/src/config/bundled-skills/outlook-calendar/SKILL.md +0 -51
- package/src/config/bundled-skills/outlook-calendar/TOOLS.json +0 -221
- package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +0 -252
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +0 -53
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +0 -74
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +0 -18
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +0 -46
- package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +0 -36
- package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +0 -17
- package/src/config/bundled-skills/outlook-calendar/types.ts +0 -120
- package/src/config/bundled-skills/slack/SKILL.md +0 -108
- package/src/config/bundled-skills/tasks/SKILL.md +0 -37
- package/src/config/bundled-skills/tasks/TOOLS.json +0 -353
- package/src/config/bundled-skills/tasks/icon.svg +0 -34
- package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -12
- package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -12
- package/src/config/bundled-skills/watcher/SKILL.md +0 -31
- package/src/config/bundled-skills/watcher/TOOLS.json +0 -167
- package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -12
- package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -12
- package/src/prompts/templates/UPDATES.md +0 -50
- package/src/prompts/update-bulletin-format.ts +0 -85
- package/src/prompts/update-bulletin-state.ts +0 -58
- package/src/prompts/update-bulletin-template-path.ts +0 -13
- package/src/prompts/update-bulletin.ts +0 -139
- package/src/shared/provider-env-vars.ts +0 -19
- package/src/tools/watcher/create.ts +0 -86
- package/src/tools/watcher/delete.ts +0 -36
- package/src/tools/watcher/digest.ts +0 -54
- package/src/tools/watcher/list.ts +0 -83
- package/src/tools/watcher/update.ts +0 -71
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
2
2
|
import { getConfig } from "../config/loader.js";
|
|
3
3
|
import { getHookManager } from "../hooks/manager.js";
|
|
4
|
+
import { resolveThreshold } from "../permissions/approval-policy.js";
|
|
4
5
|
import {
|
|
5
6
|
check,
|
|
6
7
|
classifyRisk,
|
|
@@ -29,7 +30,12 @@ import type { Tool, ToolContext, ToolLifecycleEvent } from "./types.js";
|
|
|
29
30
|
const log = getLogger("permission-checker");
|
|
30
31
|
|
|
31
32
|
export type PermissionDecision =
|
|
32
|
-
| {
|
|
33
|
+
| {
|
|
34
|
+
allowed: true;
|
|
35
|
+
decision: string;
|
|
36
|
+
riskLevel: string;
|
|
37
|
+
wasPrompted?: boolean;
|
|
38
|
+
}
|
|
33
39
|
| { allowed: false; decision: string; riskLevel: string; content: string };
|
|
34
40
|
|
|
35
41
|
export class PermissionChecker {
|
|
@@ -95,7 +101,7 @@ export class PermissionChecker {
|
|
|
95
101
|
}
|
|
96
102
|
}
|
|
97
103
|
|
|
98
|
-
const risk = await classifyRisk(
|
|
104
|
+
const { level: risk, reason: riskReason } = await classifyRisk(
|
|
99
105
|
name,
|
|
100
106
|
input,
|
|
101
107
|
context.workingDir,
|
|
@@ -163,6 +169,7 @@ export class PermissionChecker {
|
|
|
163
169
|
conversationId: context.conversationId,
|
|
164
170
|
requestId: context.requestId,
|
|
165
171
|
riskLevel,
|
|
172
|
+
riskReason,
|
|
166
173
|
decision: "deny",
|
|
167
174
|
reason: result.reason,
|
|
168
175
|
durationMs,
|
|
@@ -204,20 +211,36 @@ export class PermissionChecker {
|
|
|
204
211
|
// Exception: inline-command skill loads (skill_load_dynamic:*) must
|
|
205
212
|
// never be silently auto-approved — they execute embedded commands
|
|
206
213
|
// and require explicit human review or a pinned trust rule.
|
|
207
|
-
// Exception:
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
//
|
|
214
|
+
// Exception: tools above the configured background threshold are
|
|
215
|
+
// denied — unattended sessions must not auto-approve operations that
|
|
216
|
+
// could cause significant damage if triggered by prompt injection
|
|
217
|
+
// from untrusted content.
|
|
211
218
|
const isDynamicSkillLoad =
|
|
212
219
|
result.matchedRule?.pattern.startsWith("skill_load_dynamic:") ===
|
|
213
220
|
true;
|
|
221
|
+
const bgThreshold = resolveThreshold(
|
|
222
|
+
cfg.permissions.autoApproveUpTo,
|
|
223
|
+
"background",
|
|
224
|
+
);
|
|
225
|
+
const thresholdOrdinal: Record<string, number> = {
|
|
226
|
+
none: -1,
|
|
227
|
+
low: 0,
|
|
228
|
+
medium: 1,
|
|
229
|
+
};
|
|
230
|
+
const riskOrdinal: Record<string, number> = {
|
|
231
|
+
[RiskLevel.Low]: 0,
|
|
232
|
+
[RiskLevel.Medium]: 1,
|
|
233
|
+
[RiskLevel.High]: 2,
|
|
234
|
+
};
|
|
235
|
+
const withinThreshold =
|
|
236
|
+
(riskOrdinal[riskLevel] ?? 2) <= (thresholdOrdinal[bgThreshold] ?? 0);
|
|
214
237
|
if (
|
|
215
238
|
context.isInteractive === false &&
|
|
216
239
|
context.trustClass === "guardian" &&
|
|
217
240
|
!context.requireFreshApproval &&
|
|
218
241
|
!isDynamicSkillLoad &&
|
|
219
242
|
!v2ForcePrompt &&
|
|
220
|
-
|
|
243
|
+
withinThreshold
|
|
221
244
|
) {
|
|
222
245
|
log.info(
|
|
223
246
|
{ toolName: name, riskLevel },
|
|
@@ -247,6 +270,7 @@ export class PermissionChecker {
|
|
|
247
270
|
conversationId: context.conversationId,
|
|
248
271
|
requestId: context.requestId,
|
|
249
272
|
riskLevel,
|
|
273
|
+
riskReason,
|
|
250
274
|
decision: "deny",
|
|
251
275
|
reason: "Non-interactive session: no client to approve prompt",
|
|
252
276
|
durationMs,
|
|
@@ -321,6 +345,7 @@ export class PermissionChecker {
|
|
|
321
345
|
conversationId: context.conversationId,
|
|
322
346
|
requestId: context.requestId,
|
|
323
347
|
riskLevel,
|
|
348
|
+
riskReason,
|
|
324
349
|
reason: result.reason,
|
|
325
350
|
allowlistOptions: promptOptions.allowlistOptions,
|
|
326
351
|
scopeOptions: promptOptions.scopeOptions,
|
|
@@ -386,6 +411,7 @@ export class PermissionChecker {
|
|
|
386
411
|
conversationId: context.conversationId,
|
|
387
412
|
requestId: context.requestId,
|
|
388
413
|
riskLevel,
|
|
414
|
+
riskReason,
|
|
389
415
|
decision: "deny",
|
|
390
416
|
reason: denialReason,
|
|
391
417
|
durationMs,
|
|
@@ -434,6 +460,7 @@ export class PermissionChecker {
|
|
|
434
460
|
conversationId: context.conversationId,
|
|
435
461
|
requestId: context.requestId,
|
|
436
462
|
riskLevel,
|
|
463
|
+
riskReason,
|
|
437
464
|
decision: "always_deny",
|
|
438
465
|
reason: denialReason,
|
|
439
466
|
durationMs,
|
|
@@ -448,19 +475,13 @@ export class PermissionChecker {
|
|
|
448
475
|
|
|
449
476
|
if (
|
|
450
477
|
promptOptions.persistentDecisionsAllowed &&
|
|
451
|
-
|
|
452
|
-
decision === "always_allow_high_risk") &&
|
|
478
|
+
decision === "always_allow" &&
|
|
453
479
|
response.selectedPattern
|
|
454
480
|
) {
|
|
455
481
|
const ruleOptions: {
|
|
456
|
-
allowHighRisk?: boolean;
|
|
457
482
|
executionTarget?: string;
|
|
458
483
|
} = {};
|
|
459
484
|
|
|
460
|
-
if (decision === "always_allow_high_risk") {
|
|
461
|
-
ruleOptions.allowHighRisk = true;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
485
|
if (policyContext?.executionTarget != null) {
|
|
465
486
|
ruleOptions.executionTarget = policyContext.executionTarget;
|
|
466
487
|
}
|
|
@@ -502,7 +523,7 @@ export class PermissionChecker {
|
|
|
502
523
|
);
|
|
503
524
|
}
|
|
504
525
|
|
|
505
|
-
return { allowed: true, decision, riskLevel };
|
|
526
|
+
return { allowed: true, decision, riskLevel, wasPrompted: true };
|
|
506
527
|
}
|
|
507
528
|
|
|
508
529
|
// result.decision === 'allow'
|
|
@@ -1,7 +1,24 @@
|
|
|
1
|
+
import type { ExecutionContext } from "../permissions/approval-policy.js";
|
|
1
2
|
import type { PolicyContext } from "../permissions/types.js";
|
|
2
3
|
import { getTaskRunRules } from "../tasks/ephemeral-permissions.js";
|
|
3
4
|
import type { Tool, ToolContext } from "./types.js";
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Derive the execution context from the tool context fields.
|
|
8
|
+
* - Guardian + non-interactive → "background" (scheduled jobs, reminders)
|
|
9
|
+
* - Non-interactive (non-guardian) → "headless"
|
|
10
|
+
* - Otherwise → "conversation"
|
|
11
|
+
*/
|
|
12
|
+
function deriveExecutionContext(context?: ToolContext): ExecutionContext {
|
|
13
|
+
if (context?.isInteractive === false && context.trustClass === "guardian") {
|
|
14
|
+
return "background";
|
|
15
|
+
}
|
|
16
|
+
if (context?.isInteractive === false) {
|
|
17
|
+
return "headless";
|
|
18
|
+
}
|
|
19
|
+
return "conversation";
|
|
20
|
+
}
|
|
21
|
+
|
|
5
22
|
/**
|
|
6
23
|
* Build a PolicyContext from tool metadata and execution context.
|
|
7
24
|
* When executing within a task run, ephemeral permission rules are
|
|
@@ -10,23 +27,23 @@ import type { Tool, ToolContext } from "./types.js";
|
|
|
10
27
|
export function buildPolicyContext(
|
|
11
28
|
tool: Tool,
|
|
12
29
|
context?: ToolContext,
|
|
13
|
-
): PolicyContext
|
|
30
|
+
): PolicyContext {
|
|
14
31
|
const ephemeralRules = context?.taskRunId
|
|
15
32
|
? getTaskRunRules(context.taskRunId)
|
|
16
33
|
: undefined;
|
|
17
34
|
|
|
35
|
+
const executionContext = deriveExecutionContext(context);
|
|
36
|
+
|
|
18
37
|
if (tool.origin === "skill") {
|
|
19
38
|
return {
|
|
20
39
|
executionTarget: tool.executionTarget,
|
|
21
40
|
ephemeralRules: ephemeralRules?.length ? ephemeralRules : undefined,
|
|
41
|
+
executionContext,
|
|
22
42
|
};
|
|
23
43
|
}
|
|
24
44
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return undefined;
|
|
45
|
+
return {
|
|
46
|
+
ephemeralRules: ephemeralRules?.length ? ephemeralRules : undefined,
|
|
47
|
+
executionContext,
|
|
48
|
+
};
|
|
32
49
|
}
|
package/src/tools/registry.ts
CHANGED
|
@@ -16,6 +16,48 @@ const log = getLogger("tool-registry");
|
|
|
16
16
|
|
|
17
17
|
const tools = new Map<string, Tool>();
|
|
18
18
|
|
|
19
|
+
// ── External tool registry ───────────────────────────────────────────
|
|
20
|
+
// Skills register their tools here at initialization time so the tool
|
|
21
|
+
// manifest can include them without importing from `../skills/`.
|
|
22
|
+
//
|
|
23
|
+
// Each registration is stored as a provider closure. Closures are
|
|
24
|
+
// resolved at `getExternalTools()` time (which `initializeTools()`
|
|
25
|
+
// calls), not at registration time — this lets a skill defer its
|
|
26
|
+
// feature-flag check until after the daemon has run
|
|
27
|
+
// `mergeDefaultWorkspaceConfig()`, so skills see the merged config
|
|
28
|
+
// instead of forcing an early `loadConfig()` against unmerged defaults.
|
|
29
|
+
const externalToolProviders: Array<() => Tool[]> = [];
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Register tools provided by an external skill. Called during skill
|
|
33
|
+
* initialization (e.g. meet-join bootstrap).
|
|
34
|
+
*
|
|
35
|
+
* Accepts either a concrete `Tool[]` (resolved eagerly at the caller)
|
|
36
|
+
* or a `() => Tool[]` closure (resolved lazily inside
|
|
37
|
+
* `getExternalTools()`). Skills that perform feature-flag or config
|
|
38
|
+
* reads to decide which tools to surface must pass a closure so the
|
|
39
|
+
* read happens after daemon-startup config merging.
|
|
40
|
+
*
|
|
41
|
+
* Lives in registry.ts (not tool-manifest.ts) to avoid a circular
|
|
42
|
+
* dependency: skills/load.ts → … → meet-join/register.ts → tool-manifest.ts
|
|
43
|
+
* → skills/load.ts. Keeping it here lets external skill bootstraps import
|
|
44
|
+
* from registry.ts, which is already a leaf in the dependency graph.
|
|
45
|
+
*/
|
|
46
|
+
export function registerExternalTools(
|
|
47
|
+
toolsOrProvider: Tool[] | (() => Tool[]),
|
|
48
|
+
): void {
|
|
49
|
+
const provider =
|
|
50
|
+
typeof toolsOrProvider === "function"
|
|
51
|
+
? toolsOrProvider
|
|
52
|
+
: () => toolsOrProvider;
|
|
53
|
+
externalToolProviders.push(provider);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Return all externally registered tools. */
|
|
57
|
+
export function getExternalTools(): Tool[] {
|
|
58
|
+
return externalToolProviders.flatMap((provider) => provider());
|
|
59
|
+
}
|
|
60
|
+
|
|
19
61
|
// Snapshot of core tools captured after initializeTools() completes.
|
|
20
62
|
// Used by __resetRegistryForTesting() to restore eager tools that cannot
|
|
21
63
|
// be re-registered because ESM import caching prevents side effects
|
|
@@ -245,6 +287,15 @@ export async function initializeTools(): Promise<void> {
|
|
|
245
287
|
registerTool(tool);
|
|
246
288
|
}
|
|
247
289
|
|
|
290
|
+
// External skill tools — registered by skill bootstrap modules via
|
|
291
|
+
// `registerExternalTools()`. Called at init time (not spread into
|
|
292
|
+
// `explicitTools`) so registrations that happen between module-load
|
|
293
|
+
// and `initializeTools()` are picked up.
|
|
294
|
+
const extTools = getExternalTools();
|
|
295
|
+
for (const tool of extTools) {
|
|
296
|
+
registerTool(tool);
|
|
297
|
+
}
|
|
298
|
+
|
|
248
299
|
// Host tools are registered explicitly so host access stays opt-in until
|
|
249
300
|
// this point in startup, rather than as module side effects.
|
|
250
301
|
const hostTools = [
|
|
@@ -272,13 +323,14 @@ export async function initializeTools(): Promise<void> {
|
|
|
272
323
|
// arbitrary test tools that were registered before init.
|
|
273
324
|
//
|
|
274
325
|
// A pre-existing tool is included only if it is a known manifest tool
|
|
275
|
-
// (declared in eagerModuleToolNames, explicitTools, or
|
|
276
|
-
// This handles ESM cache hits where
|
|
277
|
-
// the registry before init ran.
|
|
326
|
+
// (declared in eagerModuleToolNames, explicitTools, hostTools, or any
|
|
327
|
+
// registered external skill tool). This handles ESM cache hits where
|
|
328
|
+
// eager-module tools are already in the registry before init ran.
|
|
278
329
|
if (!coreToolsSnapshot) {
|
|
279
330
|
const manifestToolNames = new Set<string>([
|
|
280
331
|
...eagerModuleToolNames,
|
|
281
332
|
...explicitTools.map((t: Tool) => t.name),
|
|
333
|
+
...extTools.map((t: Tool) => t.name),
|
|
282
334
|
...hostTools.map((t: Tool) => t.name),
|
|
283
335
|
...cesTools.map((t: Tool) => t.name),
|
|
284
336
|
...allComputerUseTools.map((t: Tool) => t.name),
|
|
@@ -12,17 +12,6 @@ const SIDE_EFFECT_TOOLS: ReadonlySet<string> = new Set([
|
|
|
12
12
|
"bash",
|
|
13
13
|
"host_bash",
|
|
14
14
|
"web_fetch",
|
|
15
|
-
"browser_navigate",
|
|
16
|
-
"browser_click",
|
|
17
|
-
"browser_type",
|
|
18
|
-
"browser_press_key",
|
|
19
|
-
"browser_scroll",
|
|
20
|
-
"browser_select_option",
|
|
21
|
-
"browser_hover",
|
|
22
|
-
"browser_close",
|
|
23
|
-
"browser_attach",
|
|
24
|
-
"browser_detach",
|
|
25
|
-
"browser_fill_credential",
|
|
26
15
|
"document_create",
|
|
27
16
|
"document_update",
|
|
28
17
|
"schedule_create",
|
|
@@ -6,7 +6,7 @@ import type { Tool, ToolContext, ToolExecutionResult } from "../types.js";
|
|
|
6
6
|
export class SkillExecuteTool implements Tool {
|
|
7
7
|
name = "skill_execute";
|
|
8
8
|
description =
|
|
9
|
-
"Execute a tool provided by a loaded skill. Use this instead of calling skill tools directly. The skill's instructions (from skill_load) describe available tools and their parameters.";
|
|
9
|
+
"Execute a tool provided by a loaded skill. Use this instead of calling skill tools directly. The skill's instructions (from skill_load) describe available tools and their parameters. For browser automation, use the `assistant browser` CLI commands instead.";
|
|
10
10
|
category = "skills";
|
|
11
11
|
defaultRiskLevel = RiskLevel.Low;
|
|
12
12
|
|
|
@@ -20,7 +20,7 @@ export class SkillExecuteTool implements Tool {
|
|
|
20
20
|
tool: {
|
|
21
21
|
type: "string",
|
|
22
22
|
description:
|
|
23
|
-
"The skill tool name to execute (e.g. '
|
|
23
|
+
"The skill tool name to execute (e.g. 'task_create', 'deploy_run')",
|
|
24
24
|
},
|
|
25
25
|
input: {
|
|
26
26
|
type: "object",
|
|
@@ -152,6 +152,7 @@ function spawnRunner(
|
|
|
152
152
|
workingDir: context.workingDir,
|
|
153
153
|
conversationId: context.conversationId,
|
|
154
154
|
});
|
|
155
|
+
env.__CONVERSATION_ID = context.conversationId;
|
|
155
156
|
|
|
156
157
|
const child = spawn(wrapped.command, wrapped.args, {
|
|
157
158
|
cwd: runDir,
|
|
@@ -219,7 +220,8 @@ function spawnRunner(
|
|
|
219
220
|
if (code !== 0) {
|
|
220
221
|
const truncatedStderr =
|
|
221
222
|
stderr.length > MAX_OUTPUT_CHARS
|
|
222
|
-
? safeStringSlice(stderr, 0, MAX_OUTPUT_CHARS) +
|
|
223
|
+
? safeStringSlice(stderr, 0, MAX_OUTPUT_CHARS) +
|
|
224
|
+
"\n[stderr truncated]"
|
|
223
225
|
: stderr;
|
|
224
226
|
resolve({
|
|
225
227
|
content: `Skill tool script "${executorPath}" exited with code ${code}:\n${truncatedStderr}`,
|
|
@@ -230,7 +232,8 @@ function spawnRunner(
|
|
|
230
232
|
|
|
231
233
|
const truncatedStdout =
|
|
232
234
|
stdout.length > MAX_OUTPUT_CHARS
|
|
233
|
-
? safeStringSlice(stdout, 0, MAX_OUTPUT_CHARS) +
|
|
235
|
+
? safeStringSlice(stdout, 0, MAX_OUTPUT_CHARS) +
|
|
236
|
+
"\n[stdout truncated]"
|
|
234
237
|
: stdout;
|
|
235
238
|
resolve({ content: truncatedStdout, isError: false });
|
|
236
239
|
});
|
|
@@ -12,6 +12,35 @@ const log = getLogger("sandbox");
|
|
|
12
12
|
|
|
13
13
|
const HASH_DISPLAY_LENGTH = 12;
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* macOS TCC-protected directories that trigger permission prompts when accessed.
|
|
17
|
+
* Unconditionally denied in the SBPL sandbox profile to prevent the assistant
|
|
18
|
+
* from triggering Photos, Contacts, Calendar, etc. dialogs during filesystem
|
|
19
|
+
* traversal (e.g. `find ~ -name .git`).
|
|
20
|
+
*
|
|
21
|
+
* Paths are relative to $HOME. Includes both TCC-protected directories that
|
|
22
|
+
* trigger prompts for all apps and directories like ~/Desktop and ~/Documents
|
|
23
|
+
* that are TCC-protected under App Sandbox or Full Disk Access checks.
|
|
24
|
+
*/
|
|
25
|
+
export const MACOS_TCC_PROTECTED_PATHS = [
|
|
26
|
+
"Desktop",
|
|
27
|
+
"Documents",
|
|
28
|
+
"Pictures/Photos Library.photoslibrary",
|
|
29
|
+
"Library/Photos",
|
|
30
|
+
"Library/Calendars",
|
|
31
|
+
"Library/Reminders",
|
|
32
|
+
"Library/Application Support/AddressBook",
|
|
33
|
+
"Library/Messages",
|
|
34
|
+
"Library/Mail",
|
|
35
|
+
"Library/Safari",
|
|
36
|
+
"Library/Cookies",
|
|
37
|
+
"Library/HomeKit",
|
|
38
|
+
"Library/IdentityServices",
|
|
39
|
+
"Library/Metadata/CoreSpotlight",
|
|
40
|
+
"Library/PersonalizationPortrait",
|
|
41
|
+
"Library/Suggestions",
|
|
42
|
+
];
|
|
43
|
+
|
|
15
44
|
/**
|
|
16
45
|
* Build a macOS sandbox-exec SBPL profile.
|
|
17
46
|
*
|
|
@@ -34,6 +63,18 @@ function buildSandboxProfile(
|
|
|
34
63
|
? ";; Allow network access (proxied mode - needed to reach the credential proxy)\n(allow network*)"
|
|
35
64
|
: ";; Block network access\n(deny network*)";
|
|
36
65
|
|
|
66
|
+
// Block macOS TCC-protected directories to prevent permission prompts
|
|
67
|
+
// during filesystem traversal. Placed AFTER (allow file-read*) because
|
|
68
|
+
// SBPL uses last-match-wins semantics.
|
|
69
|
+
const home = process.env.HOME ?? "";
|
|
70
|
+
const tccDenyRules = home
|
|
71
|
+
? "\n;; Block macOS TCC-protected directories to prevent permission prompts\n" +
|
|
72
|
+
MACOS_TCC_PROTECTED_PATHS.map(
|
|
73
|
+
(rel) =>
|
|
74
|
+
`(deny file-read* (subpath "${escapeSBPL(join(home, rel))}") (with no-log))`,
|
|
75
|
+
).join("\n")
|
|
76
|
+
: "";
|
|
77
|
+
|
|
37
78
|
// Build deny-read rules for protected paths (CES shell lockdown).
|
|
38
79
|
// These are placed AFTER the allow file-read* rule because SBPL uses
|
|
39
80
|
// last-match-wins semantics - the more specific deny overrides the
|
|
@@ -55,6 +96,13 @@ function buildSandboxProfile(
|
|
|
55
96
|
|
|
56
97
|
;; Allow read access to the filesystem (tools, libraries, etc.)
|
|
57
98
|
(allow file-read*)
|
|
99
|
+
${tccDenyRules}
|
|
100
|
+
|
|
101
|
+
;; Re-allow reads for the working directory even if it falls under a TCC-denied
|
|
102
|
+
;; subtree (e.g. ~/Desktop/my-project). SBPL is last-match-wins, so this
|
|
103
|
+
;; override must come after the TCC deny rules above but BEFORE the CES
|
|
104
|
+
;; deny-read rules below — credential isolation always takes precedence.
|
|
105
|
+
(allow file-read* (subpath "__WORKING_DIR__"))
|
|
58
106
|
${denyReadRules}
|
|
59
107
|
|
|
60
108
|
;; Allow write access to the working directory and its children
|
|
@@ -120,12 +168,13 @@ function getProfilePath(
|
|
|
120
168
|
if (!existsSync(dir)) {
|
|
121
169
|
mkdirSync(dir, { recursive: true });
|
|
122
170
|
}
|
|
123
|
-
// Include the network flag
|
|
124
|
-
// with different configurations don't collide.
|
|
171
|
+
// Include the network flag, deny-read paths, and HOME in the hash so
|
|
172
|
+
// profiles with different configurations don't collide.
|
|
125
173
|
let hashInput = allowNetwork ? `${workingDir}:proxied` : workingDir;
|
|
126
174
|
if (denyReadPaths && denyReadPaths.length > 0) {
|
|
127
175
|
hashInput += `:deny-read:${denyReadPaths.sort().join(",")}`;
|
|
128
176
|
}
|
|
177
|
+
hashInput += `:home:${process.env.HOME ?? ""}`;
|
|
129
178
|
const hash = createHash("sha256")
|
|
130
179
|
.update(hashInput)
|
|
131
180
|
.digest("hex")
|
|
@@ -30,9 +30,11 @@ export const SAFE_ENV_VARS = [
|
|
|
30
30
|
"VELLUM_DEV",
|
|
31
31
|
"VELLUM_DEBUG",
|
|
32
32
|
"VELLUM_ENVIRONMENT",
|
|
33
|
+
"BASE_DATA_DIR",
|
|
33
34
|
"VELLUM_WORKSPACE_DIR",
|
|
34
35
|
"CES_BOOTSTRAP_SOCKET_DIR",
|
|
35
36
|
"GATEWAY_INTERNAL_URL",
|
|
37
|
+
"GATEWAY_SECURITY_DIR",
|
|
36
38
|
"VELLUM_PLATFORM_URL",
|
|
37
39
|
"VELLUM_ASSISTANT_PLATFORM_URL",
|
|
38
40
|
"VELLUM_DOCS_BASE_URL",
|
|
@@ -82,8 +84,7 @@ export function buildSanitizedEnv(): Record<string, string> {
|
|
|
82
84
|
// Ensure UTF-8 locale so multi-byte characters (em dashes, curly quotes,
|
|
83
85
|
// arrows, etc.) survive piping through tools like pbcopy without corruption.
|
|
84
86
|
// macOS (Darwin) does not provide C.UTF-8, so use en_US.UTF-8 there.
|
|
85
|
-
const utf8Locale =
|
|
86
|
-
process.platform === "darwin" ? "en_US.UTF-8" : "C.UTF-8";
|
|
87
|
+
const utf8Locale = process.platform === "darwin" ? "en_US.UTF-8" : "C.UTF-8";
|
|
87
88
|
if (!env.LANG) env.LANG = utf8Locale;
|
|
88
89
|
if (!env.LC_ALL) env.LC_ALL = utf8Locale;
|
|
89
90
|
return env;
|
|
@@ -29,24 +29,6 @@ import { requestSystemPermissionTool } from "./system/request-permission.js";
|
|
|
29
29
|
import { shellTool } from "./terminal/shell.js";
|
|
30
30
|
import type { Tool } from "./types.js";
|
|
31
31
|
|
|
32
|
-
// ── External tool registry ───────────────────────────────────────────
|
|
33
|
-
// Skills register their tools here at initialization time so the tool
|
|
34
|
-
// manifest can include them without importing from `../skills/`.
|
|
35
|
-
const externalTools: Tool[] = [];
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Register tools provided by an external skill. Called during skill
|
|
39
|
-
* initialization.
|
|
40
|
-
*/
|
|
41
|
-
export function registerExternalTools(tools: Tool[]): void {
|
|
42
|
-
externalTools.push(...tools);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** Return all externally registered tools. */
|
|
46
|
-
export function getExternalTools(): Tool[] {
|
|
47
|
-
return [...externalTools];
|
|
48
|
-
}
|
|
49
|
-
|
|
50
32
|
// ── Eager side-effect modules ───────────────────────────────────────
|
|
51
33
|
// These static imports trigger top-level `registerTool()` side effects on
|
|
52
34
|
// first evaluation. The named imports above serve double duty: they give us
|
|
@@ -109,9 +91,12 @@ export const explicitTools: Tool[] = [
|
|
|
109
91
|
recallTool,
|
|
110
92
|
credentialStoreTool,
|
|
111
93
|
notifyParentTool,
|
|
112
|
-
//
|
|
113
|
-
//
|
|
114
|
-
|
|
94
|
+
// NOTE: external skill tools (registered via registerExternalTools in
|
|
95
|
+
// registry.ts) are intentionally NOT included here. `explicitTools` is a
|
|
96
|
+
// module-level const whose value is fixed at first evaluation, so
|
|
97
|
+
// external tools registered after this file loads would be missed.
|
|
98
|
+
// `initializeTools()` in `registry.ts` calls `getExternalTools()`
|
|
99
|
+
// separately at runtime so late registrations are picked up.
|
|
115
100
|
];
|
|
116
101
|
|
|
117
102
|
// ── CES tools (feature-flag gated) ──────────────────────────────────
|
package/src/tools/types.ts
CHANGED
|
@@ -31,6 +31,8 @@ export interface ToolExecutionStartEvent extends ToolLifecycleEventBase {
|
|
|
31
31
|
export interface ToolPermissionPromptEvent extends ToolLifecycleEventBase {
|
|
32
32
|
type: "permission_prompt";
|
|
33
33
|
riskLevel: string;
|
|
34
|
+
/** Classifier-provided reason explaining why the risk level was assigned (bash/host_bash only). */
|
|
35
|
+
riskReason?: string;
|
|
34
36
|
reason: string;
|
|
35
37
|
allowlistOptions: AllowlistOption[];
|
|
36
38
|
scopeOptions: ScopeOption[];
|
|
@@ -41,6 +43,8 @@ export interface ToolPermissionPromptEvent extends ToolLifecycleEventBase {
|
|
|
41
43
|
export interface ToolPermissionDeniedEvent extends ToolLifecycleEventBase {
|
|
42
44
|
type: "permission_denied";
|
|
43
45
|
riskLevel: string;
|
|
46
|
+
/** Classifier-provided reason explaining why the risk level was assigned (bash/host_bash only). */
|
|
47
|
+
riskReason?: string;
|
|
44
48
|
decision: "deny" | "always_deny";
|
|
45
49
|
reason: string;
|
|
46
50
|
durationMs: number;
|
|
@@ -163,6 +167,8 @@ export interface ToolContext {
|
|
|
163
167
|
callSessionId?: string;
|
|
164
168
|
/** True when the tool invocation was triggered by a user clicking a surface action button (not a regular message). */
|
|
165
169
|
triggeredBySurfaceAction?: boolean;
|
|
170
|
+
/** True when the user explicitly approved this tool invocation via the interactive permission prompt (not auto-approved by trust rules or temporary overrides). */
|
|
171
|
+
approvedViaPrompt?: boolean;
|
|
166
172
|
/**
|
|
167
173
|
* True when the invocation is inside a scheduled task run whose
|
|
168
174
|
* `required_tools` array pre-authorized this tool at task-creation time.
|
|
@@ -228,9 +234,12 @@ export interface ToolExecutionResult {
|
|
|
228
234
|
sensitiveBindings?: SensitiveOutputBinding[];
|
|
229
235
|
/**
|
|
230
236
|
* When true, the agent loop should yield control back to the user after
|
|
231
|
-
* returning this result
|
|
232
|
-
*
|
|
233
|
-
*
|
|
237
|
+
* returning this result — tool results are pushed to history and the loop
|
|
238
|
+
* breaks without another LLM call. Two callers set this: interactive
|
|
239
|
+
* surfaces (tables with action buttons, file uploads) that force-stop the
|
|
240
|
+
* loop so the LLM cannot bypass the "wait for user action" instruction,
|
|
241
|
+
* and tools like `remember` that expose a `finish_turn` parameter letting
|
|
242
|
+
* the LLM voluntarily end its turn.
|
|
234
243
|
*/
|
|
235
244
|
yieldToUser?: boolean;
|
|
236
245
|
/**
|
|
@@ -28,7 +28,7 @@ const VERIFICATION_PATH_REGEX = /\/v1\/channel-verification-sessions/;
|
|
|
28
28
|
const COMMAND_TOOLS = new Set(["bash", "host_bash"]);
|
|
29
29
|
|
|
30
30
|
/** Tools whose `input.url` (string) may contain verification endpoint paths. */
|
|
31
|
-
const URL_TOOLS = new Set(["network_request", "web_fetch"
|
|
31
|
+
const URL_TOOLS = new Set(["network_request", "web_fetch"]);
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* Normalize a string to defeat common URL obfuscation techniques before matching:
|