@vellumai/assistant 0.10.2-dev.202606250318.5e7cfb0 → 0.10.2
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/bun.lock +0 -20
- package/docs/workspace-tools.md +33 -42
- package/eslint-rules/cli-no-daemon-internals.js +0 -6
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +0 -31
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +0 -44
- package/node_modules/@vellumai/gateway-client/src/index.ts +0 -14
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +0 -17
- package/node_modules/@vellumai/service-contracts/package.json +0 -1
- package/node_modules/@vellumai/service-contracts/src/index.ts +0 -1
- package/openapi.yaml +0 -155
- package/package.json +1 -4
- package/scripts/test.sh +15 -36
- package/src/__tests__/actor-token-service.test.ts +14 -36
- package/src/__tests__/agent-loop-override-profile.test.ts +0 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +0 -2
- package/src/__tests__/annotate-activity-metadata.test.ts +0 -2
- package/src/__tests__/annotate-risk-options.test.ts +0 -2
- package/src/__tests__/approval-cascade.test.ts +0 -2
- package/src/__tests__/assistant-attachments.test.ts +0 -42
- package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
- package/src/__tests__/btw-routes.test.ts +0 -2
- package/src/__tests__/build-persisted-content.test.ts +0 -2
- package/src/__tests__/call-controller.test.ts +0 -19
- package/src/__tests__/channel-guardian.test.ts +58 -94
- package/src/__tests__/channel-reply-delivery.test.ts +0 -2
- package/src/__tests__/compaction-events.test.ts +0 -2
- package/src/__tests__/compaction.benchmark.test.ts +0 -2
- package/src/__tests__/compactor-call-site-logging.test.ts +0 -2
- package/src/__tests__/compactor-low-watermark-cut.test.ts +0 -2
- package/src/__tests__/compactor-preserved-tail-count.test.ts +0 -2
- package/src/__tests__/compactor-summary-call-truncation.test.ts +0 -2
- package/src/__tests__/compactor-web-search-strip.test.ts +0 -2
- package/src/__tests__/config-loader-backfill.test.ts +10 -123
- package/src/__tests__/config-schema.test.ts +0 -1
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -31
- package/src/__tests__/contacts-relay-reads.test.ts +15 -13
- package/src/__tests__/conversation-abort-tool-results.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop.test.ts +0 -134
- package/src/__tests__/conversation-analysis-routes.test.ts +0 -2
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +0 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -2
- package/src/__tests__/conversation-history-web-search.test.ts +0 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +0 -2
- package/src/__tests__/conversation-load-history-stripped.test.ts +0 -2
- package/src/__tests__/conversation-pairing.test.ts +0 -2
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +0 -2
- package/src/__tests__/conversation-process-callsite.test.ts +0 -2
- package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -2
- package/src/__tests__/conversation-queue.test.ts +0 -91
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -14
- package/src/__tests__/conversation-routes-slash-commands.test.ts +0 -14
- package/src/__tests__/conversation-slash-queue.test.ts +0 -2
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -2
- package/src/__tests__/conversation-speed-override.test.ts +0 -2
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -29
- package/src/__tests__/conversation-title-service.test.ts +0 -2
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -47
- package/src/__tests__/conversation-usage.test.ts +0 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -2
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -2
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -2
- package/src/__tests__/credential-security-invariants.test.ts +1 -1
- package/src/__tests__/db-migration-rollback.test.ts +171 -205
- package/src/__tests__/db-test-helpers.ts +4 -5
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -4
- package/src/__tests__/disk-pressure-guard.test.ts +0 -41
- package/src/__tests__/dm-persistence.test.ts +0 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +5 -10
- package/src/__tests__/events-dev-bypass-actor.test.ts +1 -7
- package/src/__tests__/exploration-drift-hook.test.ts +2 -3
- package/src/__tests__/filing-service.test.ts +0 -2
- package/src/__tests__/guardian-binding-drift-heal.test.ts +10 -75
- package/src/__tests__/guardian-dispatch.test.ts +1 -95
- package/src/__tests__/guardian-outbound-http.test.ts +0 -13
- package/src/__tests__/heartbeat-disk-pressure.test.ts +0 -2
- package/src/__tests__/heartbeat-service.test.ts +0 -2
- package/src/__tests__/helpers/channel-test-adapter.ts +7 -1
- package/src/__tests__/host-app-control-routes.test.ts +30 -24
- package/src/__tests__/host-bash-routes.test.ts +41 -31
- package/src/__tests__/host-browser-routes.test.ts +32 -26
- package/src/__tests__/host-cu-routes-targeted.test.ts +33 -25
- package/src/__tests__/host-file-routes-targeted.test.ts +52 -40
- package/src/__tests__/host-transfer-routes-targeted.test.ts +43 -31
- package/src/__tests__/http-user-message-parity.test.ts +8 -290
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -28
- package/src/__tests__/inbound-slack-persistence.test.ts +0 -2
- package/src/__tests__/invite-redemption-service.test.ts +0 -198
- package/src/__tests__/llm-context-normalization.test.ts +0 -105
- package/src/__tests__/llm-request-log-error-payload.test.ts +9 -71
- package/src/__tests__/llm-usage-store.test.ts +0 -25
- package/src/__tests__/mcp-health-check.test.ts +1 -2
- package/src/__tests__/media-stream-server-integration.test.ts +0 -127
- package/src/__tests__/memory-retrieval-hook.test.ts +0 -2
- package/src/__tests__/messaging-send-tool.test.ts +0 -2
- package/src/__tests__/migration-import-from-url.test.ts +2 -2
- package/src/__tests__/mtime-cache.test.ts +5 -146
- package/src/__tests__/native-web-search.test.ts +0 -2
- package/src/__tests__/non-member-access-request.test.ts +17 -189
- package/src/__tests__/notification-broadcaster.test.ts +0 -4
- package/src/__tests__/notification-decision-recipient-context.test.ts +32 -33
- package/src/__tests__/notification-deep-link.test.ts +0 -6
- package/src/__tests__/notification-guardian-path.test.ts +0 -19
- package/src/__tests__/openai-provider.test.ts +12 -22
- package/src/__tests__/openai-responses-provider.test.ts +2 -12
- package/src/__tests__/outbound-slack-persistence.test.ts +0 -2
- package/src/__tests__/pending-interactions-resolved-event.test.ts +4 -7
- package/src/__tests__/persistence-secret-redaction.test.ts +0 -2
- package/src/__tests__/plugin-bootstrap.test.ts +73 -3
- package/src/__tests__/plugin-route-contribution.test.ts +17 -4
- package/src/__tests__/plugin-tool-contribution.test.ts +18 -3
- package/src/__tests__/plugin-types.test.ts +2 -0
- package/src/__tests__/process-message-background-slack.test.ts +0 -2
- package/src/__tests__/process-message-display-content.test.ts +0 -2
- package/src/__tests__/provider-error-scenarios.test.ts +4 -5
- package/src/__tests__/provider-usage-tracking.test.ts +0 -39
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +0 -2
- package/src/__tests__/registry.test.ts +1 -4
- package/src/__tests__/relay-server.test.ts +25 -694
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -0
- package/src/__tests__/secret-ingress-http.test.ts +0 -14
- package/src/__tests__/send-endpoint-busy.test.ts +8 -30
- package/src/__tests__/skills.test.ts +0 -44
- package/src/__tests__/slack-inbound-verification.test.ts +2 -47
- package/src/__tests__/stt-hints.test.ts +13 -44
- package/src/__tests__/subagent-detail.test.ts +0 -27
- package/src/__tests__/subagent-disposal.test.ts +0 -65
- package/src/__tests__/subagent-notify-parent.test.ts +0 -2
- package/src/__tests__/subagent-role-registry.test.ts +2 -7
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +0 -2
- package/src/__tests__/subagent-tools.test.ts +0 -2
- package/src/__tests__/suggestion-routes.test.ts +0 -2
- package/src/__tests__/title-generate-hook.test.ts +0 -2
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -2
- package/src/__tests__/tool-executor.test.ts +11 -16
- package/src/__tests__/tool-preview-lifecycle.test.ts +0 -2
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +0 -2
- package/src/__tests__/tool-start-timestamp.test.ts +0 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +10 -10
- package/src/__tests__/twilio-routes.test.ts +0 -96
- package/src/__tests__/ui-file-upload-surface.test.ts +0 -86
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
- package/src/__tests__/voice-invite-redemption.test.ts +0 -33
- package/src/__tests__/web-search-backend-failure.test.ts +0 -2
- package/src/__tests__/workspace-migration-remove-hooks.test.ts +35 -14
- package/src/__tests__/workspace-tool-loader.test.ts +2 -195
- package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
- package/src/agent/loop.ts +0 -56
- package/src/api/index.ts +1 -19
- package/src/api/responses/llm-request-log-entry.ts +0 -29
- package/src/api/responses/subagent-detail.ts +0 -17
- package/src/api/surfaces.ts +3 -39
- package/src/approvals/guardian-request-resolvers.ts +11 -1
- package/src/calls/__tests__/relay-setup-router.test.ts +4 -262
- package/src/calls/call-domain.ts +3 -3
- package/src/calls/guardian-dispatch.ts +8 -10
- package/src/calls/inbound-trust-reader.ts +1 -17
- package/src/calls/media-stream-server.ts +0 -21
- package/src/calls/relay-server.ts +50 -167
- package/src/calls/relay-setup-router.ts +7 -37
- package/src/calls/relay-verification.ts +4 -4
- package/src/calls/stt-hints.ts +12 -9
- package/src/calls/twilio-routes.ts +4 -14
- package/src/channels/types.ts +20 -10
- package/src/cli/commands/__tests__/cache.test.ts +1 -8
- package/src/cli/commands/cache.ts +181 -194
- package/src/cli/commands/db/__tests__/repair.test.ts +5 -6
- package/src/cli/commands/db/status.ts +1 -37
- package/src/cli/commands/mcp.ts +218 -252
- package/src/cli/commands/memory/index.ts +0 -2
- package/src/cli/commands/plugins.ts +3 -75
- package/src/cli/lib/__tests__/install-from-github.test.ts +0 -102
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +1 -160
- package/src/cli/lib/list-installed-plugins.ts +1 -179
- package/src/config/__tests__/sync-gated-profiles.test.ts +3 -11
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +17 -27
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +3 -13
- package/src/config/bundled-skills/subagent/SKILL.md +1 -1
- package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
- package/src/config/feature-flag-registry.json +13 -5
- package/src/config/loader.ts +5 -38
- package/src/config/schemas/__tests__/memory-v3.test.ts +0 -1
- package/src/config/schemas/memory-lifecycle.ts +0 -12
- package/src/config/schemas/memory-v3.ts +0 -7
- package/src/config/schemas/memory.ts +0 -4
- package/src/config/schemas/timeouts.ts +0 -8
- package/src/config/seed-inference-profiles.ts +11 -21
- package/src/config/skills.ts +5 -27
- package/src/config/sync-gated-profiles.ts +13 -12
- package/src/contacts/contacts-write.ts +0 -3
- package/src/daemon/assistant-attachments.ts +4 -27
- package/src/daemon/conversation-agent-loop.ts +0 -28
- package/src/daemon/conversation-process.ts +16 -35
- package/src/daemon/conversation-surfaces.ts +38 -111
- package/src/daemon/conversation-tool-setup.ts +16 -50
- package/src/daemon/conversation.ts +1 -13
- package/src/daemon/disk-pressure-guard.ts +2 -12
- package/src/daemon/event-loop-watchdog.ts +1 -28
- package/src/daemon/external-plugins-bootstrap.ts +34 -4
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -25
- package/src/daemon/handlers/config-a2a.ts +14 -6
- package/src/daemon/handlers/config-channels.ts +22 -78
- package/src/daemon/handlers/conversations.ts +0 -77
- package/src/daemon/lifecycle.ts +0 -4
- package/src/daemon/mcp-reload-service.ts +0 -10
- package/src/daemon/memory-v2-startup.test.ts +0 -72
- package/src/daemon/memory-v2-startup.ts +19 -87
- package/src/daemon/message-types/conversations.ts +0 -2
- package/src/daemon/message-types/surfaces.ts +12 -12
- package/src/daemon/server.ts +4 -0
- package/src/daemon/shutdown-handlers.ts +0 -20
- package/src/daemon/tool-setup-types.ts +0 -9
- package/src/daemon/workspace-tools-watcher.ts +328 -0
- package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
- package/src/ipc/assistant-server.ts +2 -2
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
- package/src/mcp/client.ts +1 -15
- package/src/mcp/mcp-auth-orchestrator.ts +1 -6
- package/src/mcp/mcp-oauth-provider.ts +8 -19
- package/src/memory/__tests__/memory-retrospective-job.test.ts +0 -8
- package/src/memory/conversation-crud.ts +0 -38
- package/src/memory/db-connection.ts +3 -22
- package/src/memory/db-init.ts +502 -36
- package/src/memory/db-singleton.ts +4 -6
- package/src/memory/jobs-worker.ts +0 -58
- package/src/memory/llm-request-log-store.ts +1 -26
- package/src/memory/llm-usage-store.ts +20 -48
- package/src/memory/memory-retrospective-job.ts +8 -9
- package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +56 -130
- package/src/memory/migrations/__tests__/run-migrations.test.ts +2 -2
- package/src/memory/migrations/registry.ts +573 -0
- package/src/memory/migrations/run-migrations.ts +6 -90
- package/src/memory/migrations/validate-migration-state.ts +66 -101
- package/src/memory/schema/conversations.ts +0 -9
- package/src/memory/schema/infrastructure.ts +0 -20
- package/src/memory/v2/__tests__/cli-command-store.test.ts +0 -25
- package/src/memory/v2/__tests__/skill-store.test.ts +0 -80
- package/src/memory/v2/cli-command-store.ts +38 -75
- package/src/memory/v2/prompts/consolidation.ts +82 -13
- package/src/memory/v2/prompts/router.ts +93 -21
- package/src/memory/v2/skill-store.ts +31 -68
- package/src/notifications/__tests__/broadcaster.test.ts +8 -16
- package/src/notifications/__tests__/decision-engine.test.ts +9 -78
- package/src/notifications/broadcaster.ts +1 -8
- package/src/notifications/decision-engine.ts +7 -15
- package/src/notifications/destination-resolver.ts +24 -68
- package/src/notifications/emit-signal.ts +14 -39
- package/src/permissions/question-prompter.test.ts +1 -1
- package/src/permissions/question-prompter.ts +4 -7
- package/src/plugin-api/index.ts +6 -6
- package/src/plugin-api/types.ts +5 -3
- package/src/plugin-api/vision-support.test.ts +4 -28
- package/src/plugin-api/vision-support.ts +31 -66
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +0 -161
- package/src/plugins/defaults/advisor/consult.ts +6 -110
- package/src/plugins/defaults/advisor/steering.ts +2 -14
- package/src/plugins/defaults/advisor/tools/advisor.ts +5 -32
- package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +1 -2
- package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +7 -47
- package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +11 -10
- package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +20 -12
- package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +11 -42
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +3 -33
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +4 -48
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +8 -4
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +15 -43
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +2 -11
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +13 -77
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +11 -12
- package/src/plugins/mtime-cache.ts +291 -76
- package/src/plugins/pipeline.ts +13 -111
- package/src/plugins/types.ts +2 -0
- package/src/providers/anthropic/client.ts +0 -5
- package/src/providers/call-site-routing.ts +0 -4
- package/src/providers/model-catalog.ts +0 -16
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/chat-completions-provider.ts +83 -37
- package/src/providers/openai/responses-provider.ts +46 -50
- package/src/providers/openrouter/client.ts +0 -5
- package/src/providers/provider-send-message.ts +0 -4
- package/src/providers/ratelimit.ts +0 -4
- package/src/providers/retry.ts +0 -4
- package/src/providers/types.ts +0 -9
- package/src/providers/usage-tracking.ts +0 -4
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +3 -335
- package/src/runtime/access-request-helper.ts +39 -19
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/assistant-event-hub.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +2 -9
- package/src/runtime/auth/require-bound-guardian.ts +11 -21
- package/src/runtime/channel-verification-service.ts +31 -56
- package/src/runtime/confirmation-request-guardian-bridge.ts +3 -3
- package/src/runtime/guardian-vellum-migration.ts +7 -66
- package/src/runtime/invite-redemption-service.ts +187 -198
- package/src/runtime/local-actor-identity.ts +11 -76
- package/src/runtime/pending-interactions.ts +1 -11
- package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +5 -56
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +0 -187
- package/src/runtime/routes/browser-routes.ts +1 -1
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -13
- package/src/runtime/routes/channel-verification-routes.ts +3 -3
- package/src/runtime/routes/contact-routes.ts +32 -8
- package/src/runtime/routes/conversation-cli-routes.ts +5 -4
- package/src/runtime/routes/conversation-list-routes.ts +7 -4
- package/src/runtime/routes/conversation-query-routes.ts +0 -72
- package/src/runtime/routes/conversation-routes.ts +85 -84
- package/src/runtime/routes/events-routes.ts +2 -2
- package/src/runtime/routes/global-search-routes.ts +1 -3
- package/src/runtime/routes/guardian-action-routes.ts +5 -4
- package/src/runtime/routes/host-app-control-routes.ts +4 -5
- package/src/runtime/routes/host-bash-routes.ts +4 -5
- package/src/runtime/routes/host-browser-routes.ts +11 -9
- package/src/runtime/routes/host-cu-routes.ts +4 -5
- package/src/runtime/routes/host-file-routes.ts +4 -5
- package/src/runtime/routes/host-transfer-routes.ts +6 -6
- package/src/runtime/routes/http-adapter.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +2 -3
- package/src/runtime/routes/inbound-message-handler.ts +5 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +5 -97
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +49 -61
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -16
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +7 -7
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +8 -21
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +3 -14
- package/src/runtime/routes/index.ts +0 -2
- package/src/runtime/routes/llm-context-normalization.ts +0 -83
- package/src/runtime/routes/mcp-auth-routes.ts +19 -171
- package/src/runtime/routes/migration-rollback-routes.ts +3 -4
- package/src/runtime/routes/migration-routes.ts +1 -4
- package/src/runtime/routes/subagents-routes.ts +0 -5
- package/src/runtime/routes/surface-action-routes.ts +56 -42
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -1
- package/src/runtime/services/conversation-serializer.ts +9 -7
- package/src/runtime/tool-grant-request-helper.ts +3 -3
- package/src/runtime/trust-verdict-consumer.ts +9 -85
- package/src/runtime/verification-outbound-actions.ts +18 -18
- package/src/signals/user-message.ts +0 -16
- package/src/subagent/manager.ts +0 -9
- package/src/subagent/types.ts +3 -3
- package/src/telemetry/types.ts +1 -34
- package/src/telemetry/usage-telemetry-reporter.test.ts +2 -3
- package/src/telemetry/usage-telemetry-reporter.ts +3 -87
- package/src/tools/ask-question/ask-question-tool.test.ts +0 -29
- package/src/tools/ask-question/ask-question-tool.ts +0 -13
- package/src/tools/executor.ts +4 -4
- package/src/tools/registry.ts +0 -18
- package/src/tools/shared/filesystem/path-policy.ts +5 -12
- package/src/tools/tool-approval-handler.ts +1 -1
- package/src/tools/tool-defaults.ts +2 -9
- package/src/tools/tool-manifest.ts +0 -3
- package/src/tools/types.ts +2 -17
- package/src/tools/workspace-tools/loader.ts +244 -348
- package/src/util/errors.ts +1 -26
- package/src/util/platform.ts +0 -5
- package/src/workflows/library.test.ts +0 -140
- package/src/workflows/library.ts +28 -82
- package/src/workspace/migrations/017-seed-persona-dirs.ts +34 -3
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +24 -3
- package/src/workspace/migrations/048-remove-workspace-hooks.ts +66 -14
- package/src/workspace/migrations/registry.ts +0 -2
- package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +0 -91
- package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +0 -48
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +0 -28
- package/node_modules/@vellumai/service-contracts/src/channels.ts +0 -41
- package/src/__tests__/code-search-tool.test.ts +0 -585
- package/src/__tests__/guardian-expiry-notifier.test.ts +0 -282
- package/src/__tests__/mcp-config-secret-boundary.test.ts +0 -390
- package/src/__tests__/plugin-pipeline.test.ts +0 -96
- package/src/__tests__/sse-actor-principal-guardian-source.test.ts +0 -102
- package/src/__tests__/steer-on-enqueue-question.test.ts +0 -181
- package/src/__tests__/workspace-migration-111-prune-seeded-callsite-defaults.test.ts +0 -208
- package/src/agent/loop-exclusive-tool.test.ts +0 -150
- package/src/api/constants/sse-replay.ts +0 -41
- package/src/api/events/conversation-notice.ts +0 -26
- package/src/approvals/guardian-channel-delivery.ts +0 -30
- package/src/approvals/guardian-expiry-notifier.ts +0 -148
- package/src/cli/commands/memory/__tests__/worker.test.ts +0 -302
- package/src/cli/commands/memory/worker.ts +0 -175
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +0 -143
- package/src/config/prune-seeded-callsite-defaults.ts +0 -110
- package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +0 -129
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +0 -312
- package/src/contacts/__tests__/member-write-relay.test.ts +0 -202
- package/src/contacts/guardian-delivery-reader.ts +0 -223
- package/src/contacts/member-write-relay.ts +0 -189
- package/src/daemon/conversation-notices.ts +0 -60
- package/src/daemon/handlers/__tests__/config-channels.test.ts +0 -225
- package/src/hooks/hook-loader.ts +0 -341
- package/src/mcp/mcp-header-store.ts +0 -134
- package/src/memory/__tests__/301-create-watchdog-events.test.ts +0 -110
- package/src/memory/__tests__/prompt-override.test.ts +0 -192
- package/src/memory/__tests__/watchdog-events-store.test.ts +0 -161
- package/src/memory/migrations/300-add-processing-started-at.ts +0 -30
- package/src/memory/migrations/301-create-watchdog-events.ts +0 -45
- package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +0 -224
- package/src/memory/prompt-override.ts +0 -129
- package/src/memory/steps.ts +0 -573
- package/src/memory/watchdog-events-store.ts +0 -87
- package/src/memory/worker-control.ts +0 -118
- package/src/memory/worker-process.ts +0 -72
- package/src/notifications/__tests__/connected-channels.test.ts +0 -114
- package/src/notifications/__tests__/destination-resolver.test.ts +0 -256
- package/src/onboarding/checkin-event.test.ts +0 -222
- package/src/onboarding/checkin-event.ts +0 -321
- package/src/onboarding/schedule-checkin.ts +0 -190
- package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +0 -106
- package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +0 -60
- package/src/plugins/defaults/advisor/context-pack.ts +0 -288
- package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +0 -146
- package/src/plugins/surface-import.ts +0 -121
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +0 -321
- package/src/providers/openai/api-error-normalization.ts +0 -270
- package/src/runtime/__tests__/channel-verification-service.test.ts +0 -133
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +0 -181
- package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +0 -66
- package/src/runtime/__tests__/local-principal-trust.test.ts +0 -164
- package/src/runtime/anchored-guardian.test.ts +0 -156
- package/src/runtime/anchored-guardian.ts +0 -135
- package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +0 -99
- package/src/runtime/local-principal-trust.ts +0 -52
- package/src/runtime/routes/__tests__/contact-routes.test.ts +0 -212
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -93
- package/src/runtime/routes/onboarding-checkin-routes.ts +0 -86
- package/src/tools/filesystem/search.ts +0 -543
- package/src/util/telemetry-db-path.ts +0 -24
- package/src/workspace/migrations/111-prune-seeded-callsite-defaults.ts +0 -134
|
@@ -28,7 +28,6 @@ import {
|
|
|
28
28
|
assembleBoundedTurnTrace,
|
|
29
29
|
isTurnSettled,
|
|
30
30
|
} from "../memory/turn-trace-store.js";
|
|
31
|
-
import { queryUnreportedWatchdogEvents } from "../memory/watchdog-events-store.js";
|
|
32
31
|
import { VellumPlatformClient } from "../platform/client.js";
|
|
33
32
|
import {
|
|
34
33
|
getCachedShareAnalytics,
|
|
@@ -77,9 +76,6 @@ const CHECKPOINT_KEY_SKILL_LOADED_WATERMARK =
|
|
|
77
76
|
"telemetry:skill_loaded:last_reported_at";
|
|
78
77
|
const CHECKPOINT_KEY_SKILL_LOADED_WATERMARK_ID =
|
|
79
78
|
"telemetry:skill_loaded:last_reported_id";
|
|
80
|
-
const CHECKPOINT_KEY_WATCHDOG_WATERMARK = "telemetry:watchdog:last_reported_at";
|
|
81
|
-
const CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID =
|
|
82
|
-
"telemetry:watchdog:last_reported_id";
|
|
83
79
|
// Written into the `*_id` watermark checkpoints by the opt-out flush branch.
|
|
84
80
|
// Sorts lexicographically above every real row ID (all event stores generate
|
|
85
81
|
// lowercase v4 UUIDs), so the compound cursor's same-millisecond arm
|
|
@@ -104,7 +100,6 @@ const WATERMARK_KEY_PAIRS: ReadonlyArray<readonly [string, string]> = [
|
|
|
104
100
|
CHECKPOINT_KEY_SKILL_LOADED_WATERMARK,
|
|
105
101
|
CHECKPOINT_KEY_SKILL_LOADED_WATERMARK_ID,
|
|
106
102
|
],
|
|
107
|
-
[CHECKPOINT_KEY_WATCHDOG_WATERMARK, CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID],
|
|
108
103
|
];
|
|
109
104
|
const REPORT_INTERVAL_MS = 5 * 60 * 1000;
|
|
110
105
|
const INITIAL_FLUSH_DELAY_MS = 30_000; // Delay first flush to let CES handshake complete
|
|
@@ -128,37 +123,6 @@ export function setUsageTelemetryReporter(
|
|
|
128
123
|
_instance = reporter;
|
|
129
124
|
}
|
|
130
125
|
|
|
131
|
-
// ---------------------------------------------------------------------------
|
|
132
|
-
// Helpers
|
|
133
|
-
// ---------------------------------------------------------------------------
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Parse a stored `watchdog_events.detail` JSON text column into the object the
|
|
137
|
-
* platform expects. Returns null for a null column or an unparseable/corrupted
|
|
138
|
-
* blob (mirroring the turn `client` metadata parse: a bad blob emits null
|
|
139
|
-
* rather than failing the batch). A non-object (e.g. a bare number or string)
|
|
140
|
-
* also resolves to null, since the platform serializer treats `detail` as a
|
|
141
|
-
* JSON object bag.
|
|
142
|
-
*/
|
|
143
|
-
function parseWatchdogDetail(
|
|
144
|
-
raw: string | null,
|
|
145
|
-
): Record<string, unknown> | null {
|
|
146
|
-
if (!raw) return null;
|
|
147
|
-
try {
|
|
148
|
-
const parsed = JSON.parse(raw) as unknown;
|
|
149
|
-
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
150
|
-
return parsed as Record<string, unknown>;
|
|
151
|
-
}
|
|
152
|
-
return null;
|
|
153
|
-
} catch {
|
|
154
|
-
log.warn(
|
|
155
|
-
{ rawDetail: raw.slice(0, 200) },
|
|
156
|
-
"Telemetry watchdog: failed to parse detail; emitting null",
|
|
157
|
-
);
|
|
158
|
-
return null;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
126
|
// ---------------------------------------------------------------------------
|
|
163
127
|
// Reporter
|
|
164
128
|
// ---------------------------------------------------------------------------
|
|
@@ -343,8 +307,7 @@ export class UsageTelemetryReporter {
|
|
|
343
307
|
undefined;
|
|
344
308
|
|
|
345
309
|
// Read skill-loaded watermark (compound cursor: createdAt + id).
|
|
346
|
-
//
|
|
347
|
-
// cannot exist and the standard 0 default is safe.
|
|
310
|
+
// Brand-new table, so the standard 0 default is safe.
|
|
348
311
|
const skillLoadedWatermark = Number(
|
|
349
312
|
getMemoryCheckpoint(CHECKPOINT_KEY_SKILL_LOADED_WATERMARK) ?? "0",
|
|
350
313
|
);
|
|
@@ -352,15 +315,6 @@ export class UsageTelemetryReporter {
|
|
|
352
315
|
getMemoryCheckpoint(CHECKPOINT_KEY_SKILL_LOADED_WATERMARK_ID) ??
|
|
353
316
|
undefined;
|
|
354
317
|
|
|
355
|
-
// Read watchdog watermark (compound cursor: createdAt + id).
|
|
356
|
-
// Writes are gated on share_analytics consent, so opted-out rows
|
|
357
|
-
// cannot exist and the standard 0 default is safe.
|
|
358
|
-
const watchdogWatermark = Number(
|
|
359
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_WATCHDOG_WATERMARK) ?? "0",
|
|
360
|
-
);
|
|
361
|
-
const watchdogWatermarkId =
|
|
362
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID) ?? undefined;
|
|
363
|
-
|
|
364
318
|
// Query unreported events
|
|
365
319
|
const events = queryUnreportedUsageEvents(
|
|
366
320
|
watermark,
|
|
@@ -397,11 +351,6 @@ export class UsageTelemetryReporter {
|
|
|
397
351
|
skillLoadedWatermarkId,
|
|
398
352
|
BATCH_SIZE,
|
|
399
353
|
);
|
|
400
|
-
const watchdogEvents = queryUnreportedWatchdogEvents(
|
|
401
|
-
watchdogWatermark,
|
|
402
|
-
watchdogWatermarkId,
|
|
403
|
-
BATCH_SIZE,
|
|
404
|
-
);
|
|
405
354
|
|
|
406
355
|
// Trace completeness barrier (trace-eligible owners only).
|
|
407
356
|
//
|
|
@@ -469,8 +418,7 @@ export class UsageTelemetryReporter {
|
|
|
469
418
|
onboardingEvents.length === 0 &&
|
|
470
419
|
authFallbackEvents.length === 0 &&
|
|
471
420
|
toolExecutedEvents.length === 0 &&
|
|
472
|
-
skillLoadedEvents.length === 0
|
|
473
|
-
watchdogEvents.length === 0
|
|
421
|
+
skillLoadedEvents.length === 0
|
|
474
422
|
)
|
|
475
423
|
return;
|
|
476
424
|
|
|
@@ -494,7 +442,6 @@ export class UsageTelemetryReporter {
|
|
|
494
442
|
authFallbackCount: authFallbackEvents.length,
|
|
495
443
|
toolExecutedCount: toolExecutedEvents.length,
|
|
496
444
|
skillLoadedCount: skillLoadedEvents.length,
|
|
497
|
-
watchdogCount: watchdogEvents.length,
|
|
498
445
|
},
|
|
499
446
|
"Telemetry flush: resolved auth context",
|
|
500
447
|
);
|
|
@@ -727,23 +674,6 @@ export class UsageTelemetryReporter {
|
|
|
727
674
|
assistant_version: APP_VERSION,
|
|
728
675
|
}),
|
|
729
676
|
),
|
|
730
|
-
...watchdogEvents.map(
|
|
731
|
-
(e): TelemetryEvent => ({
|
|
732
|
-
type: "watchdog",
|
|
733
|
-
daemon_event_id: e.id,
|
|
734
|
-
recorded_at: e.createdAt,
|
|
735
|
-
check_name: e.checkName,
|
|
736
|
-
value: e.value,
|
|
737
|
-
// `detail` is stored as JSON text; parse defensively so a
|
|
738
|
-
// corrupted blob never fails the batch flush. A parse failure
|
|
739
|
-
// emits null rather than dropping the event.
|
|
740
|
-
detail: parseWatchdogDetail(e.detail),
|
|
741
|
-
// `watchdog_events` has no record-time version column — same
|
|
742
|
-
// upload-time APP_VERSION stamping as the other non-llm_usage
|
|
743
|
-
// event types.
|
|
744
|
-
assistant_version: APP_VERSION,
|
|
745
|
-
}),
|
|
746
|
-
),
|
|
747
677
|
];
|
|
748
678
|
|
|
749
679
|
const organizationId = getPlatformOrganizationId() || undefined;
|
|
@@ -866,19 +796,6 @@ export class UsageTelemetryReporter {
|
|
|
866
796
|
);
|
|
867
797
|
}
|
|
868
798
|
|
|
869
|
-
// Advance watchdog watermark (compound cursor)
|
|
870
|
-
if (watchdogEvents.length > 0) {
|
|
871
|
-
const lastWatchdog = watchdogEvents[watchdogEvents.length - 1];
|
|
872
|
-
setMemoryCheckpoint(
|
|
873
|
-
CHECKPOINT_KEY_WATCHDOG_WATERMARK,
|
|
874
|
-
String(lastWatchdog.createdAt),
|
|
875
|
-
);
|
|
876
|
-
setMemoryCheckpoint(
|
|
877
|
-
CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID,
|
|
878
|
-
lastWatchdog.id,
|
|
879
|
-
);
|
|
880
|
-
}
|
|
881
|
-
|
|
882
799
|
// If we got a full batch of any type, there may be more — recurse.
|
|
883
800
|
// Turns use the REPORTED count: when the completeness barrier truncates
|
|
884
801
|
// the batch, the deferred turns must wait for a later flush (by which
|
|
@@ -891,8 +808,7 @@ export class UsageTelemetryReporter {
|
|
|
891
808
|
onboardingEvents.length === BATCH_SIZE ||
|
|
892
809
|
authFallbackEvents.length === BATCH_SIZE ||
|
|
893
810
|
toolExecutedEvents.length === BATCH_SIZE ||
|
|
894
|
-
skillLoadedEvents.length === BATCH_SIZE
|
|
895
|
-
watchdogEvents.length === BATCH_SIZE
|
|
811
|
+
skillLoadedEvents.length === BATCH_SIZE
|
|
896
812
|
) {
|
|
897
813
|
await this._doFlush(batchCount + 1);
|
|
898
814
|
}
|
|
@@ -206,35 +206,6 @@ describe("AskQuestionTool.execute", () => {
|
|
|
206
206
|
expect(result.content).toBe("Question aborted");
|
|
207
207
|
});
|
|
208
208
|
|
|
209
|
-
test("short-circuits without prompting when no interactive user is present", async () => {
|
|
210
|
-
setNextResult(singleCompleted({ decision: "option", optionId: "a" }));
|
|
211
|
-
|
|
212
|
-
const result = await askQuestionTool.execute(
|
|
213
|
-
validInput,
|
|
214
|
-
makeContext({ isInteractive: false }),
|
|
215
|
-
);
|
|
216
|
-
|
|
217
|
-
// The prompter must never be invoked — there is no one to answer, so the
|
|
218
|
-
// turn proceeds with defaults instead of parking on the response backstop.
|
|
219
|
-
expect(calls).toHaveLength(0);
|
|
220
|
-
expect(result.isError).toBe(false);
|
|
221
|
-
expect(result.content.toLowerCase()).toContain("no interactive user");
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
test("still prompts when isInteractive is true or unset", async () => {
|
|
225
|
-
setNextResult(singleCompleted({ decision: "option", optionId: "a" }));
|
|
226
|
-
|
|
227
|
-
// The short-circuit keys off an explicit `false`, not a missing flag, so an
|
|
228
|
-
// interactive turn (or one that never set the flag) still prompts.
|
|
229
|
-
await askQuestionTool.execute(
|
|
230
|
-
validInput,
|
|
231
|
-
makeContext({ isInteractive: true }),
|
|
232
|
-
);
|
|
233
|
-
await askQuestionTool.execute(validInput, makeContext());
|
|
234
|
-
|
|
235
|
-
expect(calls).toHaveLength(2);
|
|
236
|
-
});
|
|
237
|
-
|
|
238
209
|
test("rejects a question with fewer than 2 options", async () => {
|
|
239
210
|
setNextResult(singleCompleted({ decision: "option", optionId: "a" }));
|
|
240
211
|
const result = await askQuestionTool.execute(
|
|
@@ -182,19 +182,6 @@ export const askQuestionTool = {
|
|
|
182
182
|
|
|
183
183
|
const questions: SingleQuestion[] = parsed.data.questions;
|
|
184
184
|
|
|
185
|
-
// No interactive user is present to answer (scheduled/headless/background
|
|
186
|
-
// turn). Don't park the turn on a prompt no one can resolve — proceed with
|
|
187
|
-
// defaults immediately. Non-interactive turns are already instructed not to
|
|
188
|
-
// ask (NON_INTERACTIVE_CONTEXT_BLOCK); this is the backstop for when the
|
|
189
|
-
// model asks anyway, so it doesn't wait out the full response timeout.
|
|
190
|
-
if (context.isInteractive === false) {
|
|
191
|
-
return {
|
|
192
|
-
content:
|
|
193
|
-
"No interactive user is present to answer; proceeding with reasonable defaults.",
|
|
194
|
-
isError: false,
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
|
|
198
185
|
const prompter = new QuestionPrompter();
|
|
199
186
|
const result = await prompter.prompt({
|
|
200
187
|
conversationId: context.conversationId,
|
package/src/tools/executor.ts
CHANGED
|
@@ -528,8 +528,8 @@ export { isSideEffectTool } from "./side-effects.js";
|
|
|
528
528
|
* handles cleanup before the executor wrapper trips.
|
|
529
529
|
*
|
|
530
530
|
* `ask_question` blocks on user input inside `execute()` via `QuestionPrompter`,
|
|
531
|
-
* which waits up to `
|
|
532
|
-
*
|
|
531
|
+
* which waits up to `permissionTimeoutSec`. We give the wrapper the same 5s
|
|
532
|
+
* buffer over that deadline so the prompter's own timeout fires first and
|
|
533
533
|
* returns its clean "User did not respond within timeout" result — otherwise
|
|
534
534
|
* the shorter generic budget trips first, orphaning the still-pending prompt
|
|
535
535
|
* behind the confusing "may still be running in the background" error.
|
|
@@ -556,8 +556,8 @@ export function computePerToolTimeoutMs(
|
|
|
556
556
|
return (shellTimeoutSec + 5) * 1000;
|
|
557
557
|
}
|
|
558
558
|
if (name === "ask_question") {
|
|
559
|
-
const {
|
|
560
|
-
return (
|
|
559
|
+
const { permissionTimeoutSec } = getConfig().timeouts;
|
|
560
|
+
return (permissionTimeoutSec + 5) * 1000;
|
|
561
561
|
}
|
|
562
562
|
const rawTimeoutSec = getConfig().timeouts.toolExecutionTimeoutSec;
|
|
563
563
|
return safeTimeoutMs(rawTimeoutSec);
|
package/src/tools/registry.ts
CHANGED
|
@@ -826,20 +826,6 @@ export function getWorkspaceToolNames(): string[] {
|
|
|
826
826
|
.map((t) => t.name);
|
|
827
827
|
}
|
|
828
828
|
|
|
829
|
-
/**
|
|
830
|
-
* Return tool definitions for all currently registered workspace-origin
|
|
831
|
-
* tools. Used by the conversation tool resolver to re-read workspace tools
|
|
832
|
-
* from the registry each turn, the same way {@link getMcpToolDefinitions}
|
|
833
|
-
* lets a conversation pick up MCP tools registered after it was created —
|
|
834
|
-
* here so reconciled edits under `<workspaceDir>/tools/` are picked up
|
|
835
|
-
* without recreating the conversation.
|
|
836
|
-
*/
|
|
837
|
-
export function getWorkspaceToolDefinitions(): Tool[] {
|
|
838
|
-
return Array.from(tools.values()).filter(
|
|
839
|
-
(t) => ownersByName.get(t.name)?.kind === "workspace",
|
|
840
|
-
);
|
|
841
|
-
}
|
|
842
|
-
|
|
843
829
|
/**
|
|
844
830
|
* Return the names of core tools currently stripped via workspace
|
|
845
831
|
* `.removed` sentinels — i.e. names where the stash holds an entry but
|
|
@@ -982,10 +968,6 @@ export async function initializeTools(): Promise<void> {
|
|
|
982
968
|
// Workspace tools land after the core snapshot above so they're never
|
|
983
969
|
// baked into the test-reset baseline.
|
|
984
970
|
//
|
|
985
|
-
// `loadWorkspaceTools` is idempotent: this is the first reconcile, and
|
|
986
|
-
// conversation reads re-run it later to pick up on-disk edits without a
|
|
987
|
-
// restart (see workspace-tools/loader.ts).
|
|
988
|
-
//
|
|
989
971
|
// Imported dynamically because the loader imports back from this module
|
|
990
972
|
// (registerWorkspaceTools / removeCoreToolViaWorkspace); a static import
|
|
991
973
|
// here would create a registry ↔ loader cycle.
|
|
@@ -20,16 +20,6 @@ export type PathFailureReason = "not_absolute" | "out_of_bounds" | "denied";
|
|
|
20
20
|
*/
|
|
21
21
|
const DENIED_BASENAMES = new Set([".backup.key", "backup.key"]);
|
|
22
22
|
|
|
23
|
-
/**
|
|
24
|
-
* Whether a path's basename is on the denylist of files the assistant must
|
|
25
|
-
* never read or write. Shared so callers that walk the filesystem (e.g.
|
|
26
|
-
* `code_search`) apply the same denylist as `sandboxPolicy`/`hostPolicy`,
|
|
27
|
-
* keeping the three in sync.
|
|
28
|
-
*/
|
|
29
|
-
export function isDeniedBasename(path: string): boolean {
|
|
30
|
-
return DENIED_BASENAMES.has(basename(path));
|
|
31
|
-
}
|
|
32
|
-
|
|
33
23
|
export type PathResult =
|
|
34
24
|
| { ok: true; resolved: string }
|
|
35
25
|
| { ok: false; reason: PathFailureReason; error: string };
|
|
@@ -148,7 +138,10 @@ export function sandboxPolicy(
|
|
|
148
138
|
|
|
149
139
|
// Check both the logical path and the symlink-resolved path so a symlink
|
|
150
140
|
// with a non-denied name pointing at a denied file is still caught.
|
|
151
|
-
if (
|
|
141
|
+
if (
|
|
142
|
+
DENIED_BASENAMES.has(basename(resolved)) ||
|
|
143
|
+
DENIED_BASENAMES.has(basename(realResolved))
|
|
144
|
+
) {
|
|
152
145
|
return {
|
|
153
146
|
ok: false,
|
|
154
147
|
reason: "denied",
|
|
@@ -175,7 +168,7 @@ export function hostPolicy(rawPath: string): PathResult {
|
|
|
175
168
|
error: `path must be absolute for host file access: ${rawPath}`,
|
|
176
169
|
};
|
|
177
170
|
}
|
|
178
|
-
if (
|
|
171
|
+
if (DENIED_BASENAMES.has(basename(rawPath))) {
|
|
179
172
|
return {
|
|
180
173
|
ok: false,
|
|
181
174
|
reason: "denied",
|
|
@@ -553,7 +553,7 @@ export class ToolApprovalHandler {
|
|
|
553
553
|
const inputDigest =
|
|
554
554
|
deferredConsumeParams?.inputDigest ??
|
|
555
555
|
computeToolApprovalDigest(name, input);
|
|
556
|
-
const escalation =
|
|
556
|
+
const escalation = createOrReuseToolGrantRequest({
|
|
557
557
|
assistantId: context.assistantId,
|
|
558
558
|
sourceChannel: context.executionChannel as ChannelId,
|
|
559
559
|
conversationId: context.conversationId,
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
* is a `Tool` (`Required<ToolDefinition>`).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { resolveExecutionTarget } from "./execution-target.js";
|
|
14
13
|
import type {
|
|
15
14
|
RiskLevel,
|
|
16
15
|
Tool,
|
|
@@ -31,10 +30,7 @@ import type {
|
|
|
31
30
|
* are rejected at the JSON-schema layer.
|
|
32
31
|
* - `executionTarget` defaults to `sandbox` — author-supplied tool code
|
|
33
32
|
* runs in the assistant container by default; opt in to `host` when
|
|
34
|
-
* the tool proxies work to the connected client.
|
|
35
|
-
* heuristic (`host_*` / `computer_use_*` resolves to host) is applied
|
|
36
|
-
* by `resolveExecutionTarget` in `finalizeTool`, so a tool named
|
|
37
|
-
* `host_my_thing` defaults to host even without an explicit field.
|
|
33
|
+
* the tool proxies work to the connected client.
|
|
38
34
|
* - `category` defaults to empty — Slack channel `allowedToolCategories`
|
|
39
35
|
* policy denies uncategorized tools when a category allow-list is set,
|
|
40
36
|
* which is the correct deny-by-default for tools the author didn't
|
|
@@ -94,10 +90,8 @@ export function finalizeTool(tool: ToolDefinition, defaultName = ""): Tool {
|
|
|
94
90
|
content: `tool ${name} has no execute implementation`,
|
|
95
91
|
isError: true,
|
|
96
92
|
});
|
|
97
|
-
const executionTarget =
|
|
98
|
-
tool.executionTarget ?? resolveExecutionTarget({ name });
|
|
93
|
+
const executionTarget = tool.executionTarget ?? TOOL_DEFAULTS.executionTarget;
|
|
99
94
|
const category = tool.category ?? TOOL_DEFAULTS.category;
|
|
100
|
-
const exclusive = tool.exclusive ?? false;
|
|
101
95
|
return {
|
|
102
96
|
...tool,
|
|
103
97
|
name,
|
|
@@ -107,6 +101,5 @@ export function finalizeTool(tool: ToolDefinition, defaultName = ""): Tool {
|
|
|
107
101
|
executionTarget,
|
|
108
102
|
execute,
|
|
109
103
|
category,
|
|
110
|
-
exclusive,
|
|
111
104
|
};
|
|
112
105
|
}
|
|
@@ -18,7 +18,6 @@ import { runAuthenticatedCommandTool } from "./credential-execution/run-authenti
|
|
|
18
18
|
import { fileEditTool } from "./filesystem/edit.js";
|
|
19
19
|
import { fileListTool } from "./filesystem/list.js";
|
|
20
20
|
import { fileReadTool } from "./filesystem/read.js";
|
|
21
|
-
import { codeSearchTool } from "./filesystem/search.js";
|
|
22
21
|
import { fileWriteTool } from "./filesystem/write.js";
|
|
23
22
|
import { recallTool, rememberTool } from "./memory/register.js";
|
|
24
23
|
import { webFetchTool } from "./network/web-fetch.js";
|
|
@@ -60,7 +59,6 @@ export const eagerModuleToolNames: string[] = [
|
|
|
60
59
|
"file_write",
|
|
61
60
|
"file_edit",
|
|
62
61
|
"file_list",
|
|
63
|
-
"code_search",
|
|
64
62
|
"web_search",
|
|
65
63
|
"web_fetch",
|
|
66
64
|
"skill_execute",
|
|
@@ -83,7 +81,6 @@ export const explicitTools: ToolDefinition[] = [
|
|
|
83
81
|
fileWriteTool,
|
|
84
82
|
fileEditTool,
|
|
85
83
|
fileListTool,
|
|
86
|
-
codeSearchTool,
|
|
87
84
|
webFetchTool,
|
|
88
85
|
webSearchTool,
|
|
89
86
|
skillExecuteTool,
|
package/src/tools/types.ts
CHANGED
|
@@ -449,15 +449,6 @@ export const ToolDefinitionSchema = z.object({
|
|
|
449
449
|
) => Promise<ToolExecutionResult>
|
|
450
450
|
>()
|
|
451
451
|
.optional(),
|
|
452
|
-
/**
|
|
453
|
-
* When true, this tool runs alone in its turn. If the model emits it
|
|
454
|
-
* alongside other tool calls, the agent loop executes only this one and
|
|
455
|
-
* defers the siblings — returning them un-run with a benign notice — so the
|
|
456
|
-
* model incorporates this tool's output before acting on anything else. The
|
|
457
|
-
* `advisor` tool sets this so its guidance lands before the agent commits to
|
|
458
|
-
* a path. Default false (the loop runs sibling calls concurrently as usual).
|
|
459
|
-
*/
|
|
460
|
-
exclusive: z.boolean().optional(),
|
|
461
452
|
});
|
|
462
453
|
|
|
463
454
|
/**
|
|
@@ -469,14 +460,8 @@ export const ToolDefinitionSchema = z.object({
|
|
|
469
460
|
*/
|
|
470
461
|
export type ToolDefinition = z.infer<typeof ToolDefinitionSchema>;
|
|
471
462
|
|
|
472
|
-
/**
|
|
473
|
-
|
|
474
|
-
* is required except `exclusive`, which stays optional — most tools never set
|
|
475
|
-
* it, and the agent loop reads it as `?.exclusive === true`, so forcing every
|
|
476
|
-
* hand-built `Tool` (MCP/meet/test fixtures) to carry it would be noise.
|
|
477
|
-
*/
|
|
478
|
-
export type Tool = Required<Omit<ToolDefinition, "exclusive">> &
|
|
479
|
-
Pick<ToolDefinition, "exclusive">;
|
|
463
|
+
/** Tool after the loader has derived its name and filled defaults. */
|
|
464
|
+
export type Tool = Required<ToolDefinition>;
|
|
480
465
|
|
|
481
466
|
/** The kind of extension that owns a tool. Core tools have no owner. */
|
|
482
467
|
export type OwnerKind = "skill" | "mcp" | "plugin" | "workspace";
|