@vellumai/assistant 0.10.12 → 0.11.0-staging.1
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/AGENTS.md +1 -1
- package/ARCHITECTURE.md +4 -5
- package/README.md +1 -1
- package/docs/architecture/memory.md +60 -23
- package/docs/error-handling.md +3 -3
- package/docs/guardian-request-flow.md +112 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/openapi.yaml +246 -10
- package/package.json +2 -2
- package/src/__tests__/acp-session.test.ts +3 -3
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
- package/src/__tests__/anthropic-provider.test.ts +40 -0
- package/src/__tests__/approval-cascade.test.ts +5 -5
- package/src/__tests__/approval-routes-http.test.ts +3 -3
- package/src/__tests__/ask-question-resolver.test.ts +207 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
- package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
- package/src/__tests__/assistant-event-hub.test.ts +13 -11
- package/src/__tests__/assistant-event.test.ts +12 -9
- package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -58
- package/src/__tests__/assistant-stream-state.test.ts +17 -7
- package/src/__tests__/avatar-identity-sync.test.ts +3 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +134 -18
- package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
- package/src/__tests__/channel-approvals.test.ts +0 -27
- package/src/__tests__/channel-guardian.test.ts +85 -512
- package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
- package/src/__tests__/channel-retry-sweep.test.ts +88 -1
- package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
- package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
- package/src/__tests__/config-model-image-provider.test.ts +20 -0
- package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
- package/src/__tests__/config-schema.test.ts +14 -2
- package/src/__tests__/config-set-platform-guard.test.ts +11 -12
- package/src/__tests__/config-sounds-sync.test.ts +4 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
- package/src/__tests__/context-search-memory-source.test.ts +1 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
- package/src/__tests__/context-token-estimator.test.ts +54 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
- package/src/__tests__/conversation-agent-loop.test.ts +39 -30
- package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
- package/src/__tests__/conversation-evictor.test.ts +49 -0
- package/src/__tests__/conversation-fork-crud.test.ts +1 -1
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
- package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
- package/src/__tests__/conversation-queue.test.ts +81 -81
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
- package/src/__tests__/conversation-slash-queue.test.ts +11 -11
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +2 -2
- package/src/__tests__/conversation-summarize-route.test.ts +9 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
- package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
- package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
- package/src/__tests__/conversation-sync-tags.test.ts +5 -5
- package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
- package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/daemon-assistant-events.test.ts +14 -15
- package/src/__tests__/db-test-helpers.ts +13 -27
- package/src/__tests__/disk-pressure-routes.test.ts +12 -3
- package/src/__tests__/document-tool-security.test.ts +95 -0
- package/src/__tests__/drain-kick-guard.test.ts +232 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
- package/src/__tests__/emit-event-signal.test.ts +5 -6
- package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
- package/src/__tests__/events-tail-route.test.ts +6 -4
- package/src/__tests__/feature-flag-test-helpers.ts +10 -20
- package/src/__tests__/file-edit-tool.test.ts +24 -4
- package/src/__tests__/file-list-tool.test.ts +2 -1
- package/src/__tests__/file-read-tool.test.ts +62 -10
- package/src/__tests__/file-write-tool.test.ts +24 -5
- package/src/__tests__/followup-tools.test.ts +58 -0
- package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-question-mode.test.ts +42 -3
- package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
- package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
- package/src/__tests__/host-browser-proxy.test.ts +1 -1
- package/src/__tests__/host-file-edit-tool.test.ts +3 -3
- package/src/__tests__/host-file-read-tool.test.ts +2 -2
- package/src/__tests__/host-file-write-tool.test.ts +7 -3
- package/src/__tests__/host-shell-tool.test.ts +17 -5
- package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +65 -8
- package/src/__tests__/injection-block.test.ts +4 -4
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
- package/src/__tests__/injector-v3-suppression.test.ts +6 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
- package/src/__tests__/list-messages-page-latest.test.ts +2 -2
- package/src/__tests__/llm-usage-store.test.ts +67 -4
- package/src/__tests__/log-redact.test.ts +18 -0
- package/src/__tests__/managed-profile-guard.test.ts +27 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +62 -11
- package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
- package/src/__tests__/notification-decision-strategy.test.ts +115 -11
- package/src/__tests__/notification-deep-link.test.ts +12 -12
- package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +315 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
- package/src/__tests__/persistence-layering-guard.test.ts +2 -2
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
- package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
- package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
- package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
- package/src/__tests__/require-fresh-approval.test.ts +38 -38
- package/src/__tests__/run-due-schedules.test.ts +72 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +44 -5
- package/src/__tests__/schedule-store.test.ts +3 -3
- package/src/__tests__/schedule-tools.test.ts +176 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
- package/src/__tests__/secret-response-routing.test.ts +3 -3
- package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
- package/src/__tests__/secret-scanner.test.ts +36 -0
- package/src/__tests__/send-endpoint-busy.test.ts +7 -7
- package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
- package/src/__tests__/starter-task-flow.test.ts +6 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-disposal.test.ts +40 -11
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
- package/src/__tests__/subagent-manager-notify.test.ts +73 -14
- package/src/__tests__/subagent-notify-parent.test.ts +48 -4
- package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
- package/src/__tests__/subagent-tools.test.ts +64 -0
- package/src/__tests__/sync-message-contract.test.ts +3 -3
- package/src/__tests__/terminal-tools.test.ts +12 -3
- package/src/__tests__/test-preload.ts +9 -0
- package/src/__tests__/tool-approval-handler.test.ts +583 -43
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
- package/src/__tests__/tool-executor.test.ts +116 -0
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
- package/src/__tests__/tool-start-timestamp.test.ts +4 -4
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
- package/src/__tests__/ui-work-result-surface.test.ts +3 -3
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
- package/src/__tests__/voice-session-bridge.test.ts +44 -44
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
- package/src/__tests__/workspace-policy.test.ts +399 -0
- package/src/acp/__tests__/client-handler.test.ts +3 -3
- package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
- package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
- package/src/acp/client-handler.ts +3 -3
- package/src/acp/session-manager.ts +8 -8
- package/src/api/events/subagent-event.ts +2 -2
- package/src/api/responses/memory-v2-activation-log.ts +2 -2
- package/src/approvals/AGENTS.md +2 -0
- package/src/approvals/guardian-request-resolvers.ts +118 -24
- package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +158 -4
- package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
- package/src/calls/call-controller.ts +27 -27
- package/src/calls/call-conversation-messages.ts +58 -18
- package/src/calls/voice-control-protocol.ts +56 -0
- package/src/calls/voice-session-bridge.ts +156 -58
- package/src/calls/voice-triage-escalate.ts +2 -3
- package/src/channels/config.ts +8 -0
- package/src/channels/types.ts +1 -0
- package/src/cli/commands/config.ts +49 -13
- package/src/cli/commands/memory/index.help.ts +4 -2
- package/src/cli/commands/memory/memory-retrospective.ts +5 -0
- package/src/cli/lib/bundled-marketplace.json +12 -0
- package/src/cli.ts +2 -109
- package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
- package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
- package/src/config/assistant-feature-flags.ts +1 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
- package/src/config/feature-flag-cache.ts +6 -16
- package/src/config/feature-flag-registry.json +14 -30
- package/src/config/loader.ts +7 -1
- package/src/config/memory-tier.ts +15 -10
- package/src/config/memory-v3-gate.test.ts +278 -1
- package/src/config/memory-v3-gate.ts +88 -26
- package/src/config/raw-config-utils.ts +1 -1
- package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/live-voice.ts +33 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrospective.ts +13 -0
- package/src/config/schemas/memory-substrate.ts +183 -0
- package/src/config/schemas/memory-v2.ts +3 -2
- package/src/config/schemas/memory-v3.ts +11 -4
- package/src/config/schemas/memory.ts +35 -1
- package/src/config/schemas/services.ts +10 -2
- package/src/config/substrate-twin-shadowing.ts +195 -0
- package/src/config/webhook-routing.ts +67 -0
- package/src/context/compactor.ts +10 -3
- package/src/context/token-estimator.ts +21 -0
- package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
- package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
- package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
- package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
- package/src/daemon/channel-ui-capability.ts +70 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
- package/src/daemon/conversation-agent-loop.ts +12 -5
- package/src/daemon/conversation-evictor.ts +26 -4
- package/src/daemon/conversation-launch.ts +11 -14
- package/src/daemon/conversation-messaging.ts +14 -14
- package/src/daemon/conversation-notifiers.ts +2 -2
- package/src/daemon/conversation-process.ts +133 -21
- package/src/daemon/conversation-queue-manager.ts +7 -7
- package/src/daemon/conversation-runtime-assembly.ts +16 -0
- package/src/daemon/conversation-store.ts +11 -3
- package/src/daemon/conversation-surfaces.ts +4 -4
- package/src/daemon/conversation-tool-setup.ts +13 -7
- package/src/daemon/conversation-usage.ts +12 -11
- package/src/daemon/conversation.ts +38 -15
- package/src/daemon/disk-pressure-guard.ts +5 -12
- package/src/daemon/embedding-reconcile.ts +14 -9
- package/src/daemon/handlers/config-channels.ts +40 -134
- package/src/daemon/handlers/config-model.ts +15 -7
- package/src/daemon/handlers/conversations.ts +4 -2
- package/src/daemon/handlers/shared.ts +29 -0
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/lifecycle.ts +13 -0
- package/src/daemon/message-protocol.ts +8 -144
- package/src/daemon/message-types/computer-use.ts +0 -12
- package/src/daemon/message-types/conversations.ts +9 -345
- package/src/daemon/message-types/host-app-control.ts +0 -9
- package/src/daemon/message-types/host-browser.ts +0 -7
- package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
- package/src/daemon/message-types/messages.ts +0 -48
- package/src/daemon/message-types/notifications.ts +0 -7
- package/src/daemon/message-types/skills.ts +0 -5
- package/src/daemon/message-types/surfaces.ts +0 -9
- package/src/daemon/message-types/sync.ts +0 -2
- package/src/daemon/process-message.ts +5 -5
- package/src/daemon/skill-memory-refresh.ts +5 -5
- package/src/daemon/tool-side-effects.ts +13 -13
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +4 -4
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
- package/src/heartbeat/heartbeat-run-store.ts +81 -4
- package/src/heartbeat/heartbeat-service.ts +32 -1
- package/src/home/__tests__/feed-writer.test.ts +7 -7
- package/src/home/__tests__/home-content-refresh.test.ts +3 -0
- package/src/home/__tests__/suggested-prompts.test.ts +1 -0
- package/src/home/feed-writer.ts +6 -13
- package/src/home/home-content-refresh.ts +6 -9
- package/src/home/relationship-state-writer.ts +5 -12
- package/src/home/suggested-prompts-cache.ts +6 -19
- package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
- package/src/ipc/events-publish-client.ts +44 -0
- package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
- package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
- package/src/ipc/routes/events-ipc-routes.ts +11 -31
- package/src/live-voice/__tests__/front-decision.test.ts +4 -176
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
- package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
- package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
- package/src/live-voice/__tests__/live-voice-vad.test.ts +218 -422
- package/src/live-voice/front-decision.ts +5 -155
- package/src/live-voice/live-voice-metrics.ts +4 -1
- package/src/live-voice/live-voice-session.ts +650 -333
- package/src/live-voice/progress-phrases.ts +17 -0
- package/src/live-voice/protocol.ts +15 -0
- package/src/media/app-icon-generator.ts +15 -8
- package/src/media/avatar-router.ts +9 -5
- package/src/media/image-credentials.ts +42 -10
- package/src/media/image-service.ts +1 -13
- package/src/media/types.ts +26 -3
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/__tests__/broadcaster.test.ts +95 -0
- package/src/notifications/adapters/macos.ts +3 -3
- package/src/notifications/broadcaster.ts +57 -0
- package/src/notifications/copy-composer.ts +0 -15
- package/src/notifications/decision-engine.ts +21 -22
- package/src/notifications/guardian-question-mode.ts +57 -2
- package/src/notifications/home-feed-side-effect.ts +4 -0
- package/src/notifications/signal.ts +6 -4
- package/src/notifications/trusted-contact-payloads.ts +3 -4
- package/src/notifications/vellum-card-affinity.ts +39 -0
- package/src/oauth/AGENTS.md +1 -1
- package/src/permissions/channel-permission-query.test.ts +69 -0
- package/src/permissions/channel-permission-query.ts +73 -1
- package/src/permissions/checker.test.ts +85 -9
- package/src/permissions/checker.ts +17 -22
- package/src/permissions/confirmation-guardian-request.test.ts +2 -2
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/gateway-threshold-reader.test.ts +224 -17
- package/src/permissions/gateway-threshold-reader.ts +82 -10
- package/src/permissions/ipc-risk-types.ts +8 -0
- package/src/permissions/prompter.ts +5 -5
- package/src/permissions/question-guardian-request.test.ts +222 -0
- package/src/permissions/question-guardian-request.ts +179 -0
- package/src/permissions/question-prompter.test.ts +8 -8
- package/src/permissions/question-prompter.ts +18 -0
- package/src/permissions/secret-prompter.ts +2 -4
- package/src/permissions/workspace-policy.ts +236 -34
- package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
- package/src/persistence/__tests__/message-content-file.test.ts +58 -3
- package/src/persistence/conversation-crud.ts +93 -0
- package/src/persistence/conversation-key-store.ts +63 -0
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-singleton.ts +14 -27
- package/src/persistence/delivery-crud.ts +45 -0
- package/src/persistence/embeddings/embedding-backend.ts +2 -1
- package/src/persistence/embeddings/embedding-identity.ts +7 -3
- package/src/persistence/job-utils.ts +32 -27
- package/src/persistence/jobs-store.ts +92 -3
- package/src/persistence/lifecycle-quiesce.ts +80 -0
- package/src/persistence/llm-usage-store.ts +45 -8
- package/src/persistence/message-content-file.ts +4 -4
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
- package/src/persistence/schema/infrastructure.ts +11 -0
- package/src/persistence/steps.ts +7 -1
- package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
- package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
- package/src/plugin-api/conversation-turn.ts +4 -4
- package/src/plugin-api/event-hub-facade.ts +15 -6
- package/src/plugin-api/index.ts +10 -4
- package/src/plugin-api/publish-event.ts +36 -0
- package/src/plugins/AGENTS.md +2 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/index.ts +9 -13
- package/src/plugins/defaults/memory/AGENTS.md +775 -0
- package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
- package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
- package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
- package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
- package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
- package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
- package/src/plugins/defaults/memory/graph/store.ts +1 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
- package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
- package/src/plugins/defaults/memory/indexer.ts +146 -89
- package/src/plugins/defaults/memory/injectors.ts +86 -41
- package/src/plugins/defaults/memory/job-handlers.ts +130 -39
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
- package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
- package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
- package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
- package/src/plugins/defaults/memory/startup.ts +58 -21
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
- package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
- package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
- package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
- package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
- package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
- package/src/plugins/defaults/memory/tools.test.ts +1 -1
- package/src/plugins/defaults/memory/tools.ts +1 -1
- package/src/plugins/defaults/memory/v1/README.md +5 -0
- package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
- package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
- package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
- package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
- package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
- package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
- package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
- package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
- package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
- package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
- package/src/plugins/defaults/memory/v2/activation.ts +30 -163
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
- package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/injection.ts +36 -26
- package/src/plugins/defaults/memory/v2/migration.ts +2 -2
- package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
- package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
- package/src/plugins/defaults/memory/v2/router.ts +38 -15
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
- package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
- package/src/plugins/defaults/memory/v3/card.ts +25 -9
- package/src/plugins/defaults/memory/v3/edge.ts +52 -18
- package/src/plugins/defaults/memory/v3/gate.ts +4 -4
- package/src/plugins/defaults/memory/v3/injector.ts +10 -3
- package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
- package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
- package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
- package/src/plugins/defaults/memory/v3/prune.ts +40 -16
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
- package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
- package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
- package/src/plugins/defaults/memory/v3/types.ts +4 -1
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
- package/src/plugins/defaults/memory/validation.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -1
- package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
- package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
- package/src/plugins/types.ts +2 -2
- package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
- package/src/providers/anthropic/client.ts +15 -6
- package/src/providers/content-block-schema.ts +26 -0
- package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +30 -14
- package/src/providers/model-catalog.ts +77 -0
- package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
- package/src/providers/openai/chat-completions-provider.ts +65 -17
- package/src/providers/openai/input-audio.ts +76 -0
- package/src/providers/openrouter/client.ts +0 -2
- package/src/providers/platform-proxy/constants.ts +4 -0
- package/src/providers/poolside/client.ts +42 -0
- package/src/providers/registry.ts +40 -8
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +39 -1
- package/src/providers/vercel-ai-gateway/client.ts +0 -2
- package/src/runtime/AGENTS.md +7 -5
- package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
- package/src/runtime/__tests__/question-resolution.test.ts +111 -0
- package/src/runtime/access-request-helper.ts +7 -15
- package/src/runtime/assistant-event-hub.ts +43 -31
- package/src/runtime/assistant-event-publish-options.ts +31 -0
- package/src/runtime/assistant-event.ts +19 -30
- package/src/runtime/assistant-stream-state.ts +4 -4
- package/src/runtime/channel-approvals.ts +0 -25
- package/src/runtime/channel-readiness-service.ts +99 -40
- package/src/runtime/channel-retry-sweep.ts +38 -15
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
- package/src/runtime/guardian-reply-router.ts +108 -0
- package/src/runtime/http-server.ts +8 -0
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/process-role.ts +42 -0
- package/src/runtime/question-request-guardian-bridge.ts +184 -0
- package/src/runtime/question-resolution.ts +153 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
- package/src/runtime/routes/acp-routes.ts +2 -2
- package/src/runtime/routes/bookmark-routes.ts +3 -15
- package/src/runtime/routes/canned-message-complete.ts +2 -2
- package/src/runtime/routes/consolidation-routes.ts +8 -2
- package/src/runtime/routes/conversation-list-routes.ts +3 -19
- package/src/runtime/routes/conversation-management-routes.ts +1 -5
- package/src/runtime/routes/conversation-query-routes.ts +52 -8
- package/src/runtime/routes/conversation-routes.ts +36 -22
- package/src/runtime/routes/credential-request-routes.ts +0 -1
- package/src/runtime/routes/filing-routes.ts +7 -7
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
- package/src/runtime/routes/image-generation-routes.ts +12 -9
- package/src/runtime/routes/inbound-message-handler.ts +17 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
- package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
- package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/lifecycle-routes.ts +199 -0
- package/src/runtime/routes/platform-routes.ts +3 -8
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
- package/src/runtime/routes/question-routes.ts +34 -87
- package/src/runtime/routes/secret-routes.ts +11 -1
- package/src/runtime/routes/settings-routes.ts +8 -18
- package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
- package/src/runtime/routes/workspace-routes.test.ts +7 -4
- package/src/runtime/slack-reply-session.test.ts +12 -12
- package/src/runtime/slack-reply-session.ts +17 -17
- package/src/runtime/sync/sync-publisher.test.ts +7 -5
- package/src/runtime/tool-grant-request-helper.ts +4 -0
- package/src/schedule/schedule-store.ts +70 -0
- package/src/schedule/scheduler.ts +27 -0
- package/src/security/AGENTS.md +1 -1
- package/src/security/credential-key.ts +17 -0
- package/src/security/secret-ingress.ts +14 -105
- package/src/security/secret-patterns.ts +8 -139
- package/src/security/secret-scanner.ts +8 -3
- package/src/security/store-path-override.ts +6 -16
- package/src/sequence/store.ts +8 -0
- package/src/signals/emit-event.ts +5 -10
- package/src/signals/event-stream.ts +20 -10
- package/src/subagent/manager.ts +76 -25
- package/src/subagent/notify.ts +8 -0
- package/src/subagent/types.ts +13 -3
- package/src/telegram/__tests__/webhook-health.test.ts +442 -0
- package/src/telegram/webhook-health.ts +478 -0
- package/src/telemetry/AGENTS.md +6 -0
- package/src/telemetry/memory-corpus-size.test.ts +129 -0
- package/src/telemetry/memory-corpus-size.ts +184 -0
- package/src/telemetry/memory-tier-reporter.test.ts +67 -2
- package/src/telemetry/memory-tier-reporter.ts +30 -3
- package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
- package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
- package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
- package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
- package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
- package/src/tools/acp/abort.ts +21 -1
- package/src/tools/acp/context.ts +5 -5
- package/src/tools/acp/spawn.test.ts +15 -5
- package/src/tools/acp/spawn.ts +26 -3
- package/src/tools/acp/status.ts +20 -1
- package/src/tools/acp/steer.test.ts +20 -0
- package/src/tools/acp/steer.ts +23 -2
- package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
- package/src/tools/ask-question/ask-question-tool.ts +68 -92
- package/src/tools/browser/browser-screencast.ts +6 -6
- package/src/tools/calls/call-end.ts +24 -3
- package/src/tools/calls/call-start.ts +35 -11
- package/src/tools/calls/call-status.ts +20 -1
- package/src/tools/document/document-comment-tool.test.ts +49 -0
- package/src/tools/document/document-comment-tool.ts +45 -6
- package/src/tools/document/document-tool.ts +142 -24
- package/src/tools/executor.ts +27 -13
- package/src/tools/filesystem/edit.ts +62 -60
- package/src/tools/filesystem/list.ts +36 -29
- package/src/tools/filesystem/read.ts +56 -39
- package/src/tools/filesystem/write.ts +44 -38
- package/src/tools/followups/followup_create.ts +41 -12
- package/src/tools/followups/followup_list.ts +34 -6
- package/src/tools/followups/followup_resolve.ts +26 -4
- package/src/tools/host-filesystem/edit.ts +50 -60
- package/src/tools/host-filesystem/read.ts +45 -39
- package/src/tools/host-filesystem/write.ts +31 -36
- package/src/tools/host-terminal/host-shell.ts +76 -62
- package/src/tools/policy-context.ts +27 -10
- package/src/tools/schedule/create.ts +76 -33
- package/src/tools/schedule/delete.ts +21 -2
- package/src/tools/schedule/list.ts +25 -3
- package/src/tools/schedule/update.ts +105 -48
- package/src/tools/shared/filesystem/path-policy.ts +246 -40
- package/src/tools/shared/zod-tool-schema.ts +117 -0
- package/src/tools/subagent/abort.ts +12 -4
- package/src/tools/subagent/consult-deadline.ts +9 -3
- package/src/tools/subagent/message.ts +21 -5
- package/src/tools/subagent/notify-parent.ts +44 -23
- package/src/tools/subagent/read.ts +15 -4
- package/src/tools/subagent/resolve.ts +26 -4
- package/src/tools/subagent/spawn.ts +37 -13
- package/src/tools/subagent/status.ts +12 -4
- package/src/tools/system/request-permission.ts +35 -26
- package/src/tools/terminal/shell.ts +68 -55
- package/src/tools/tool-approval-handler.ts +327 -53
- package/src/tools/tool-input-schemas.ts +85 -0
- package/src/tools/tool-types.ts +7 -0
- package/src/tools/types.ts +8 -0
- package/src/tools/workflows/manage-workflows.ts +30 -2
- package/src/tools/workflows/run-workflow.test.ts +54 -2
- package/src/tools/workflows/run-workflow.ts +32 -4
- package/src/util/fs-symlinks.ts +30 -0
- package/src/util/log-redact.ts +7 -3
- package/src/vellum-assistant-namespace.d.ts +80 -0
- package/src/watcher/watcher-store.ts +8 -0
- package/src/workflows/leaf-runner.test.ts +104 -2
- package/src/workflows/leaf-runner.ts +31 -6
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
- package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
- package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
- package/src/workspace/migrations/registry.ts +4 -0
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/secret-patterns.test.ts +0 -27
- package/src/config/__tests__/proc-to-skills.test.ts +0 -21
- package/src/config/memory-tier.test.ts +0 -44
- package/src/daemon/message-types/acp.ts +0 -20
- package/src/daemon/message-types/apps.ts +0 -11
- package/src/daemon/message-types/background-tools.ts +0 -14
- package/src/daemon/message-types/bookmarks.ts +0 -13
- package/src/daemon/message-types/contacts.ts +0 -13
- package/src/daemon/message-types/document-comments.ts +0 -14
- package/src/daemon/message-types/documents.ts +0 -13
- package/src/daemon/message-types/home.ts +0 -15
- package/src/daemon/message-types/host-bash.ts +0 -12
- package/src/daemon/message-types/host-cu.ts +0 -10
- package/src/daemon/message-types/host-file.ts +0 -12
- package/src/daemon/message-types/host-transfer.ts +0 -12
- package/src/daemon/message-types/integrations.ts +0 -90
- package/src/daemon/message-types/memory.ts +0 -10
- package/src/daemon/message-types/schedules.ts +0 -14
- package/src/daemon/message-types/settings.ts +0 -17
- package/src/daemon/message-types/subagents.ts +0 -63
- package/src/daemon/message-types/upgrades.ts +0 -14
- package/src/daemon/message-types/workflows.ts +0 -25
- package/src/daemon/message-types/workspace.ts +0 -137
- package/src/live-voice/ack-phrases.ts +0 -58
- package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
- package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
- package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
- package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
|
|
3
5
|
import {
|
|
4
6
|
addDocumentConversation,
|
|
5
7
|
deleteDocument,
|
|
@@ -14,6 +16,10 @@ import {
|
|
|
14
16
|
updateDocumentContent,
|
|
15
17
|
} from "../../documents/document-store.js";
|
|
16
18
|
import { canActOnPrivilegedDocuments } from "../../runtime/effective-capabilities.js";
|
|
19
|
+
import {
|
|
20
|
+
invalidToolInputResult,
|
|
21
|
+
nullAsOmitted,
|
|
22
|
+
} from "../shared/zod-tool-schema.js";
|
|
17
23
|
import type { ToolContext, ToolExecutionResult } from "../types.js";
|
|
18
24
|
|
|
19
25
|
function isPrivilegedDocumentActor(context: ToolContext): boolean {
|
|
@@ -62,14 +68,83 @@ function validateSurfaceId(
|
|
|
62
68
|
return input.surface_id;
|
|
63
69
|
}
|
|
64
70
|
|
|
71
|
+
// ── Model-input schemas ─────────────────────────────────────────────
|
|
72
|
+
//
|
|
73
|
+
// One schema per tool entry point, `safeParse`d at the top of each
|
|
74
|
+
// `execute*`. Skill-owned tools are skipped by the central
|
|
75
|
+
// `TOOL_INPUT_SCHEMAS` gate, so validation lives in the executor
|
|
76
|
+
// (`ask_question` pre-registry precedent); the advertised `input_schema`
|
|
77
|
+
// stays hand-written in the document-editor skill's `TOOLS.json`, and
|
|
78
|
+
// `document-tool-input-schemas.test.ts` guards the two against structural
|
|
79
|
+
// drift.
|
|
80
|
+
//
|
|
81
|
+
// Tolerance matches the executors' own reads — the schemas only reject
|
|
82
|
+
// values the executors would otherwise pass downstream unchecked
|
|
83
|
+
// (`document_find`'s `query` reaching `.toLowerCase()` as a non-string) or
|
|
84
|
+
// persist unvalidated (`document_create`'s `title`):
|
|
85
|
+
//
|
|
86
|
+
// - `nullAsOmitted` on optionals where null and absent are equivalent under
|
|
87
|
+
// the falsy/`??` reads — including `surface_id`, whose bespoke
|
|
88
|
+
// `validateSurfaceId` / `resolveUpdateSurfaceId` error messages stay the
|
|
89
|
+
// contract for the missing/empty cases.
|
|
90
|
+
// - `.catch(undefined)` on `document_list`'s `query`, which the executor
|
|
91
|
+
// silently ignores when malformed (falls back to the conversation list).
|
|
92
|
+
// - `document_update`'s `mode` is deliberately UNDECLARED (loose
|
|
93
|
+
// passthrough): its bespoke check owns the error message and the
|
|
94
|
+
// `{ mode: null }` tolerance that mirrors `validateInputAgainstSchema`.
|
|
95
|
+
|
|
96
|
+
export const documentOpenInputSchema = z.looseObject({
|
|
97
|
+
surface_id: nullAsOmitted(z.string()),
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
export const documentCreateInputSchema = z.looseObject({
|
|
101
|
+
title: nullAsOmitted(z.string()),
|
|
102
|
+
initial_content: nullAsOmitted(z.string()),
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
export const documentUpdateInputSchema = z.looseObject({
|
|
106
|
+
surface_id: nullAsOmitted(z.string()),
|
|
107
|
+
content: nullAsOmitted(z.string()),
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
export const documentReadInputSchema = documentOpenInputSchema;
|
|
111
|
+
|
|
112
|
+
export const documentListInputSchema = z.looseObject({
|
|
113
|
+
query: z.string().optional().catch(undefined),
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
export const documentDeleteInputSchema = documentOpenInputSchema;
|
|
117
|
+
|
|
118
|
+
export const documentFindInputSchema = z.looseObject({
|
|
119
|
+
surface_id: nullAsOmitted(z.string()),
|
|
120
|
+
query: z.string(),
|
|
121
|
+
regex: nullAsOmitted(z.boolean()),
|
|
122
|
+
case_sensitive: nullAsOmitted(z.boolean()),
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
export const documentReplaceTextInputSchema = z.looseObject({
|
|
126
|
+
surface_id: nullAsOmitted(z.string()),
|
|
127
|
+
find: z.string(),
|
|
128
|
+
replace: nullAsOmitted(z.string()),
|
|
129
|
+
regex: nullAsOmitted(z.boolean()),
|
|
130
|
+
case_sensitive: nullAsOmitted(z.boolean()),
|
|
131
|
+
max_replacements: nullAsOmitted(z.number()),
|
|
132
|
+
});
|
|
133
|
+
|
|
65
134
|
// ── Exported execute functions ──────────────────────────────────────
|
|
66
135
|
|
|
67
136
|
export function executeDocumentOpen(
|
|
68
137
|
input: Record<string, unknown>,
|
|
69
138
|
context: ToolContext,
|
|
70
139
|
): ToolExecutionResult {
|
|
140
|
+
const parsedInput = documentOpenInputSchema.safeParse(input);
|
|
141
|
+
if (!parsedInput.success) {
|
|
142
|
+
return invalidToolInputResult("document_open", parsedInput.error);
|
|
143
|
+
}
|
|
71
144
|
const surfaceIdOrError = validateSurfaceId(input);
|
|
72
|
-
if (typeof surfaceIdOrError !== "string")
|
|
145
|
+
if (typeof surfaceIdOrError !== "string") {
|
|
146
|
+
return surfaceIdOrError;
|
|
147
|
+
}
|
|
73
148
|
const surfaceId = surfaceIdOrError;
|
|
74
149
|
if (!canAccessDocument(surfaceId, context)) {
|
|
75
150
|
return documentNotFound(surfaceId);
|
|
@@ -140,17 +215,23 @@ function maybeReuseEmptyDocument(
|
|
|
140
215
|
initialContent: string,
|
|
141
216
|
context: ToolContext,
|
|
142
217
|
): ToolExecutionResult | null {
|
|
143
|
-
if (initialContent.length === 0)
|
|
218
|
+
if (initialContent.length === 0) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
144
221
|
const existing = findRecentEmptyDocumentByTitle(
|
|
145
222
|
context.conversationId,
|
|
146
223
|
title,
|
|
147
224
|
EMPTY_DOCUMENT_DEDUPE_WINDOW_MS,
|
|
148
225
|
);
|
|
149
|
-
if (!existing)
|
|
226
|
+
if (!existing) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
150
229
|
|
|
151
230
|
const surfaceId = existing.surfaceId;
|
|
152
231
|
const update = updateDocumentContent(surfaceId, initialContent, "replace");
|
|
153
|
-
if (!update.success)
|
|
232
|
+
if (!update.success) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
154
235
|
|
|
155
236
|
// Defensive idempotent insert (saveDocument from the create-new path already
|
|
156
237
|
// ran addDocumentConversation; INSERT OR IGNORE makes this a safe no-op).
|
|
@@ -200,11 +281,17 @@ export function executeDocumentCreate(
|
|
|
200
281
|
input: Record<string, unknown>,
|
|
201
282
|
context: ToolContext,
|
|
202
283
|
): ToolExecutionResult {
|
|
203
|
-
const
|
|
204
|
-
|
|
284
|
+
const parsedInput = documentCreateInputSchema.safeParse(input);
|
|
285
|
+
if (!parsedInput.success) {
|
|
286
|
+
return invalidToolInputResult("document_create", parsedInput.error);
|
|
287
|
+
}
|
|
288
|
+
const title = parsedInput.data.title || "Untitled Document";
|
|
289
|
+
const initialContent = parsedInput.data.initial_content || "";
|
|
205
290
|
|
|
206
291
|
const reused = maybeReuseEmptyDocument(title, initialContent, context);
|
|
207
|
-
if (reused)
|
|
292
|
+
if (reused) {
|
|
293
|
+
return reused;
|
|
294
|
+
}
|
|
208
295
|
|
|
209
296
|
const surfaceId = `doc-${randomUUID()}`;
|
|
210
297
|
|
|
@@ -298,11 +385,17 @@ export function executeDocumentUpdate(
|
|
|
298
385
|
input: Record<string, unknown>,
|
|
299
386
|
context: ToolContext,
|
|
300
387
|
): ToolExecutionResult {
|
|
388
|
+
const parsedInput = documentUpdateInputSchema.safeParse(input);
|
|
389
|
+
if (!parsedInput.success) {
|
|
390
|
+
return invalidToolInputResult("document_update", parsedInput.error);
|
|
391
|
+
}
|
|
301
392
|
if (typeof input.content !== "string") {
|
|
302
393
|
return invalidInput("content is required and must be a string");
|
|
303
394
|
}
|
|
304
395
|
const surfaceIdOrError = resolveUpdateSurfaceId(input, context);
|
|
305
|
-
if (typeof surfaceIdOrError !== "string")
|
|
396
|
+
if (typeof surfaceIdOrError !== "string") {
|
|
397
|
+
return surfaceIdOrError;
|
|
398
|
+
}
|
|
306
399
|
const surfaceId = surfaceIdOrError;
|
|
307
400
|
// Loose `!= null` to match validateInputAgainstSchema, which treats null as
|
|
308
401
|
// "absent" for enum checks — without this, { mode: null } passes the
|
|
@@ -368,8 +461,14 @@ export function executeDocumentRead(
|
|
|
368
461
|
input: Record<string, unknown>,
|
|
369
462
|
context: ToolContext,
|
|
370
463
|
): ToolExecutionResult {
|
|
464
|
+
const parsedInput = documentReadInputSchema.safeParse(input);
|
|
465
|
+
if (!parsedInput.success) {
|
|
466
|
+
return invalidToolInputResult("document_read", parsedInput.error);
|
|
467
|
+
}
|
|
371
468
|
const surfaceIdOrError = validateSurfaceId(input);
|
|
372
|
-
if (typeof surfaceIdOrError !== "string")
|
|
469
|
+
if (typeof surfaceIdOrError !== "string") {
|
|
470
|
+
return surfaceIdOrError;
|
|
471
|
+
}
|
|
373
472
|
const surfaceId = surfaceIdOrError;
|
|
374
473
|
if (!canAccessDocument(surfaceId, context)) {
|
|
375
474
|
return documentNotFound(surfaceId);
|
|
@@ -396,10 +495,11 @@ export function executeDocumentList(
|
|
|
396
495
|
input: Record<string, unknown>,
|
|
397
496
|
context: ToolContext,
|
|
398
497
|
): ToolExecutionResult {
|
|
399
|
-
const
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
498
|
+
const parsedInput = documentListInputSchema.safeParse(input);
|
|
499
|
+
if (!parsedInput.success) {
|
|
500
|
+
return invalidToolInputResult("document_list", parsedInput.error);
|
|
501
|
+
}
|
|
502
|
+
const query = parsedInput.data.query?.trim() || undefined;
|
|
403
503
|
const docs = query
|
|
404
504
|
? searchDocumentsByTitle(
|
|
405
505
|
query,
|
|
@@ -427,8 +527,14 @@ export function executeDocumentDelete(
|
|
|
427
527
|
input: Record<string, unknown>,
|
|
428
528
|
context: ToolContext,
|
|
429
529
|
): ToolExecutionResult {
|
|
530
|
+
const parsedInput = documentDeleteInputSchema.safeParse(input);
|
|
531
|
+
if (!parsedInput.success) {
|
|
532
|
+
return invalidToolInputResult("document_delete", parsedInput.error);
|
|
533
|
+
}
|
|
430
534
|
const surfaceIdOrError = validateSurfaceId(input);
|
|
431
|
-
if (typeof surfaceIdOrError !== "string")
|
|
535
|
+
if (typeof surfaceIdOrError !== "string") {
|
|
536
|
+
return surfaceIdOrError;
|
|
537
|
+
}
|
|
432
538
|
const surfaceId = surfaceIdOrError;
|
|
433
539
|
if (!canAccessDocument(surfaceId, context)) {
|
|
434
540
|
return documentNotFound(surfaceId);
|
|
@@ -452,12 +558,18 @@ export function executeDocumentFind(
|
|
|
452
558
|
input: Record<string, unknown>,
|
|
453
559
|
context: ToolContext,
|
|
454
560
|
): ToolExecutionResult {
|
|
561
|
+
const parsedInput = documentFindInputSchema.safeParse(input);
|
|
562
|
+
if (!parsedInput.success) {
|
|
563
|
+
return invalidToolInputResult("document_find", parsedInput.error);
|
|
564
|
+
}
|
|
455
565
|
const surfaceIdOrError = validateSurfaceId(input);
|
|
456
|
-
if (typeof surfaceIdOrError !== "string")
|
|
566
|
+
if (typeof surfaceIdOrError !== "string") {
|
|
567
|
+
return surfaceIdOrError;
|
|
568
|
+
}
|
|
457
569
|
const surfaceId = surfaceIdOrError;
|
|
458
|
-
const query =
|
|
459
|
-
const regex =
|
|
460
|
-
const caseSensitive =
|
|
570
|
+
const query = parsedInput.data.query;
|
|
571
|
+
const regex = parsedInput.data.regex ?? false;
|
|
572
|
+
const caseSensitive = parsedInput.data.case_sensitive ?? false;
|
|
461
573
|
|
|
462
574
|
if (!canAccessDocument(surfaceId, context)) {
|
|
463
575
|
return documentNotFound(surfaceId);
|
|
@@ -505,14 +617,20 @@ export function executeDocumentReplaceText(
|
|
|
505
617
|
input: Record<string, unknown>,
|
|
506
618
|
context: ToolContext,
|
|
507
619
|
): ToolExecutionResult {
|
|
620
|
+
const parsedInput = documentReplaceTextInputSchema.safeParse(input);
|
|
621
|
+
if (!parsedInput.success) {
|
|
622
|
+
return invalidToolInputResult("document_replace_text", parsedInput.error);
|
|
623
|
+
}
|
|
508
624
|
const surfaceIdOrError = validateSurfaceId(input);
|
|
509
|
-
if (typeof surfaceIdOrError !== "string")
|
|
625
|
+
if (typeof surfaceIdOrError !== "string") {
|
|
626
|
+
return surfaceIdOrError;
|
|
627
|
+
}
|
|
510
628
|
const surfaceId = surfaceIdOrError;
|
|
511
|
-
const find =
|
|
512
|
-
const replace =
|
|
513
|
-
const regex =
|
|
514
|
-
const caseSensitive =
|
|
515
|
-
const maxReplacements =
|
|
629
|
+
const find = parsedInput.data.find;
|
|
630
|
+
const replace = parsedInput.data.replace ?? "";
|
|
631
|
+
const regex = parsedInput.data.regex ?? false;
|
|
632
|
+
const caseSensitive = parsedInput.data.case_sensitive ?? false;
|
|
633
|
+
const maxReplacements = parsedInput.data.max_replacements;
|
|
516
634
|
|
|
517
635
|
if (!canAccessDocument(surfaceId, context)) {
|
|
518
636
|
return documentNotFound(surfaceId);
|
package/src/tools/executor.ts
CHANGED
|
@@ -19,6 +19,8 @@ import {
|
|
|
19
19
|
} from "../workflows/capabilities.js";
|
|
20
20
|
import { getWorkflowRunManager } from "../workflows/run-manager.js";
|
|
21
21
|
import { executeWithTimeout, safeTimeoutMs } from "./execution-timeout.js";
|
|
22
|
+
import { fileEditInputSchema } from "./filesystem/edit.js";
|
|
23
|
+
import { fileWriteInputSchema } from "./filesystem/write.js";
|
|
22
24
|
import { PermissionChecker } from "./permission-checker.js";
|
|
23
25
|
import { getToolOwner } from "./registry.js";
|
|
24
26
|
import { extractAndSanitize } from "./sensitive-output-placeholders.js";
|
|
@@ -99,6 +101,13 @@ export class ToolExecutor {
|
|
|
99
101
|
}
|
|
100
102
|
|
|
101
103
|
const tool = gateResult.tool;
|
|
104
|
+
// The pre-execution gate parsed model-generated input against the tool's
|
|
105
|
+
// registered Zod schema (`TOOL_INPUT_SCHEMAS`) before any grant was
|
|
106
|
+
// consumed; substitute the parsed value (with `.catch()` recoveries
|
|
107
|
+
// applied) so validation and execution see the same input.
|
|
108
|
+
if (gateResult.parsedInput) {
|
|
109
|
+
input = gateResult.parsedInput;
|
|
110
|
+
}
|
|
102
111
|
|
|
103
112
|
try {
|
|
104
113
|
// A workflow run whose capability manifest grants side-effecting tools or
|
|
@@ -469,6 +478,11 @@ export function computePerToolTimeoutMs(
|
|
|
469
478
|
/**
|
|
470
479
|
* Compute a preview diff for file tools so the confirmation prompt can show
|
|
471
480
|
* what will change. Returns undefined for non-file tools or on any error.
|
|
481
|
+
* Out-of-workspace targets deliberately produce no preview (strict
|
|
482
|
+
* sandboxPolicy): the preview runs before the user answers the prompt, and
|
|
483
|
+
* external file content must not be read — let alone shipped in the
|
|
484
|
+
* confirmation payload — ahead of approval. Host file tools have no preview
|
|
485
|
+
* for the same reason.
|
|
472
486
|
*/
|
|
473
487
|
function computePreviewDiff(
|
|
474
488
|
toolName: string,
|
|
@@ -484,11 +498,13 @@ function computePreviewDiff(
|
|
|
484
498
|
| undefined {
|
|
485
499
|
try {
|
|
486
500
|
if (toolName === "file_write") {
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
501
|
+
// Parse with the tool's own schema so the preview reads the same shape
|
|
502
|
+
// the executor will (a call the schema rejects gets no preview).
|
|
503
|
+
const parsed = fileWriteInputSchema.safeParse(input);
|
|
504
|
+
if (!parsed.success) {
|
|
490
505
|
return undefined;
|
|
491
506
|
}
|
|
507
|
+
const { path: rawPath, content } = parsed.data;
|
|
492
508
|
const pathCheck = sandboxPolicy(rawPath, workingDir, {
|
|
493
509
|
mustExist: false,
|
|
494
510
|
});
|
|
@@ -508,17 +524,15 @@ function computePreviewDiff(
|
|
|
508
524
|
}
|
|
509
525
|
|
|
510
526
|
if (toolName === "file_edit") {
|
|
511
|
-
const
|
|
512
|
-
|
|
513
|
-
const newString = input.new_string as string;
|
|
514
|
-
if (
|
|
515
|
-
!rawPath ||
|
|
516
|
-
typeof oldString !== "string" ||
|
|
517
|
-
typeof newString !== "string" ||
|
|
518
|
-
oldString.length === 0
|
|
519
|
-
) {
|
|
527
|
+
const parsed = fileEditInputSchema.safeParse(input);
|
|
528
|
+
if (!parsed.success) {
|
|
520
529
|
return undefined;
|
|
521
530
|
}
|
|
531
|
+
const {
|
|
532
|
+
path: rawPath,
|
|
533
|
+
old_string: oldString,
|
|
534
|
+
new_string: newString,
|
|
535
|
+
} = parsed.data;
|
|
522
536
|
const pathCheck = sandboxPolicy(rawPath, workingDir);
|
|
523
537
|
if (!pathCheck.ok) {
|
|
524
538
|
return undefined;
|
|
@@ -532,7 +546,7 @@ function computePreviewDiff(
|
|
|
532
546
|
return undefined;
|
|
533
547
|
}
|
|
534
548
|
const content = readFileSync(filePath, "utf-8");
|
|
535
|
-
const replaceAll =
|
|
549
|
+
const replaceAll = parsed.data.replace_all === true;
|
|
536
550
|
const result = applyEdit(content, oldString, newString, replaceAll);
|
|
537
551
|
if (!result.ok) {
|
|
538
552
|
return undefined;
|
|
@@ -1,13 +1,54 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import { RiskLevel } from "../../permissions/types.js";
|
|
2
4
|
import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
|
|
3
5
|
import { formatEditDiff } from "../shared/filesystem/format-diff.js";
|
|
4
|
-
import {
|
|
6
|
+
import { sandboxPolicyWithHostFallback } from "../shared/filesystem/path-policy.js";
|
|
7
|
+
import {
|
|
8
|
+
invalidToolInputResult,
|
|
9
|
+
toToolInputSchema,
|
|
10
|
+
} from "../shared/zod-tool-schema.js";
|
|
5
11
|
import type {
|
|
6
12
|
ToolContext,
|
|
7
13
|
ToolDefinition,
|
|
8
14
|
ToolExecutionResult,
|
|
9
15
|
} from "../types.js";
|
|
10
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Model-input schema, the single source for both runtime validation (via
|
|
19
|
+
* `TOOL_INPUT_SCHEMAS`) and the advertised `input_schema` below. `replace_all`
|
|
20
|
+
* catches to `undefined` because the tool has always treated anything but a
|
|
21
|
+
* literal `true` as "single match" — a malformed value degrades the same way
|
|
22
|
+
* instead of failing the call.
|
|
23
|
+
*/
|
|
24
|
+
export const fileEditInputSchema = z.looseObject({
|
|
25
|
+
path: z
|
|
26
|
+
.string()
|
|
27
|
+
.min(1)
|
|
28
|
+
.describe(
|
|
29
|
+
"The path to the file to edit (absolute or relative to working directory)",
|
|
30
|
+
),
|
|
31
|
+
old_string: z
|
|
32
|
+
.string()
|
|
33
|
+
.min(1, { message: "old_string must not be empty" })
|
|
34
|
+
.describe("The exact text to find in the file"),
|
|
35
|
+
new_string: z.string().describe("The replacement text"),
|
|
36
|
+
replace_all: z
|
|
37
|
+
.boolean()
|
|
38
|
+
.describe(
|
|
39
|
+
"Replace all occurrences of old_string instead of requiring a unique match (default: false)",
|
|
40
|
+
)
|
|
41
|
+
.optional()
|
|
42
|
+
.catch(undefined),
|
|
43
|
+
activity: z
|
|
44
|
+
.string()
|
|
45
|
+
.describe(
|
|
46
|
+
"Brief non-technical explanation of what you are doing and why, shown as a status update.",
|
|
47
|
+
)
|
|
48
|
+
.optional()
|
|
49
|
+
.catch(undefined),
|
|
50
|
+
});
|
|
51
|
+
|
|
11
52
|
export const fileEditTool = {
|
|
12
53
|
name: "file_edit",
|
|
13
54
|
description:
|
|
@@ -16,67 +57,23 @@ export const fileEditTool = {
|
|
|
16
57
|
executionTarget: "sandbox",
|
|
17
58
|
defaultRiskLevel: RiskLevel.Low,
|
|
18
59
|
|
|
19
|
-
input_schema: {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
path: {
|
|
23
|
-
type: "string",
|
|
24
|
-
description:
|
|
25
|
-
"The path to the file to edit (absolute or relative to working directory)",
|
|
26
|
-
},
|
|
27
|
-
old_string: {
|
|
28
|
-
type: "string",
|
|
29
|
-
description: "The exact text to find in the file",
|
|
30
|
-
},
|
|
31
|
-
new_string: {
|
|
32
|
-
type: "string",
|
|
33
|
-
description: "The replacement text",
|
|
34
|
-
},
|
|
35
|
-
replace_all: {
|
|
36
|
-
type: "boolean",
|
|
37
|
-
description:
|
|
38
|
-
"Replace all occurrences of old_string instead of requiring a unique match (default: false)",
|
|
39
|
-
},
|
|
40
|
-
activity: {
|
|
41
|
-
type: "string",
|
|
42
|
-
description:
|
|
43
|
-
"Brief non-technical explanation of what you are doing and why, shown as a status update.",
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
required: ["path", "old_string", "new_string", "activity"],
|
|
47
|
-
},
|
|
60
|
+
input_schema: toToolInputSchema(fileEditInputSchema, {
|
|
61
|
+
advertiseRequired: ["activity"],
|
|
62
|
+
}),
|
|
48
63
|
|
|
49
64
|
async execute(
|
|
50
65
|
input: Record<string, unknown>,
|
|
51
66
|
context: ToolContext,
|
|
52
67
|
): Promise<ToolExecutionResult> {
|
|
53
|
-
const
|
|
54
|
-
if (!
|
|
55
|
-
return
|
|
56
|
-
content: "Error: path is required and must be a string",
|
|
57
|
-
isError: true,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const oldString = input.old_string;
|
|
62
|
-
if (typeof oldString !== "string") {
|
|
63
|
-
return {
|
|
64
|
-
content: "Error: old_string is required and must be a string",
|
|
65
|
-
isError: true,
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const newString = input.new_string;
|
|
70
|
-
if (typeof newString !== "string") {
|
|
71
|
-
return {
|
|
72
|
-
content: "Error: new_string is required and must be a string",
|
|
73
|
-
isError: true,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (oldString.length === 0) {
|
|
78
|
-
return { content: "Error: old_string must not be empty", isError: true };
|
|
68
|
+
const parsed = fileEditInputSchema.safeParse(input);
|
|
69
|
+
if (!parsed.success) {
|
|
70
|
+
return invalidToolInputResult("file_edit", parsed.error);
|
|
79
71
|
}
|
|
72
|
+
const {
|
|
73
|
+
path: rawPath,
|
|
74
|
+
old_string: oldString,
|
|
75
|
+
new_string: newString,
|
|
76
|
+
} = parsed.data;
|
|
80
77
|
|
|
81
78
|
if (oldString === newString) {
|
|
82
79
|
return {
|
|
@@ -85,10 +82,10 @@ export const fileEditTool = {
|
|
|
85
82
|
};
|
|
86
83
|
}
|
|
87
84
|
|
|
88
|
-
const replaceAll =
|
|
85
|
+
const replaceAll = parsed.data.replace_all === true;
|
|
89
86
|
|
|
90
87
|
const ops = new FileSystemOps((path, opts) =>
|
|
91
|
-
|
|
88
|
+
sandboxPolicyWithHostFallback(path, context.workingDir, opts),
|
|
92
89
|
);
|
|
93
90
|
|
|
94
91
|
const result = ops.editFileSafe({
|
|
@@ -116,8 +113,13 @@ export const fileEditTool = {
|
|
|
116
113
|
content: `Error editing file: ${error.message}`,
|
|
117
114
|
isError: true,
|
|
118
115
|
};
|
|
119
|
-
default:
|
|
120
|
-
|
|
116
|
+
default: {
|
|
117
|
+
const hint =
|
|
118
|
+
error.code === "PATH_OUT_OF_BOUNDS"
|
|
119
|
+
? ". To edit files outside the workspace, use the host_file_edit tool instead."
|
|
120
|
+
: "";
|
|
121
|
+
return { content: `Error: ${error.message}${hint}`, isError: true };
|
|
122
|
+
}
|
|
121
123
|
}
|
|
122
124
|
}
|
|
123
125
|
|
|
@@ -1,12 +1,40 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import { RiskLevel } from "../../permissions/types.js";
|
|
2
4
|
import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
|
|
3
5
|
import { sandboxPolicy } from "../shared/filesystem/path-policy.js";
|
|
6
|
+
import {
|
|
7
|
+
invalidToolInputResult,
|
|
8
|
+
toToolInputSchema,
|
|
9
|
+
} from "../shared/zod-tool-schema.js";
|
|
4
10
|
import type {
|
|
5
11
|
ToolContext,
|
|
6
12
|
ToolDefinition,
|
|
7
13
|
ToolExecutionResult,
|
|
8
14
|
} from "../types.js";
|
|
9
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Model-input schema, the single source for both runtime validation (via
|
|
18
|
+
* `TOOL_INPUT_SCHEMAS`) and the advertised `input_schema` below. `glob`
|
|
19
|
+
* catches to `undefined` because the tool has always ignored non-string
|
|
20
|
+
* values rather than failing the listing.
|
|
21
|
+
*/
|
|
22
|
+
export const fileListInputSchema = z.looseObject({
|
|
23
|
+
path: z.string().min(1).describe("The directory path to list"),
|
|
24
|
+
glob: z
|
|
25
|
+
.string()
|
|
26
|
+
.describe("Filter entries by glob pattern, e.g. '*.md'")
|
|
27
|
+
.optional()
|
|
28
|
+
.catch(undefined),
|
|
29
|
+
activity: z
|
|
30
|
+
.string()
|
|
31
|
+
.describe(
|
|
32
|
+
"Brief non-technical explanation of what you are doing and why, shown as a status update.",
|
|
33
|
+
)
|
|
34
|
+
.optional()
|
|
35
|
+
.catch(undefined),
|
|
36
|
+
});
|
|
37
|
+
|
|
10
38
|
export const fileListTool = {
|
|
11
39
|
name: "file_list",
|
|
12
40
|
description:
|
|
@@ -15,46 +43,25 @@ export const fileListTool = {
|
|
|
15
43
|
executionTarget: "sandbox",
|
|
16
44
|
defaultRiskLevel: RiskLevel.Low,
|
|
17
45
|
|
|
18
|
-
input_schema: {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
path: {
|
|
22
|
-
type: "string",
|
|
23
|
-
description: "The directory path to list",
|
|
24
|
-
},
|
|
25
|
-
glob: {
|
|
26
|
-
type: "string",
|
|
27
|
-
description: "Filter entries by glob pattern, e.g. '*.md'",
|
|
28
|
-
},
|
|
29
|
-
activity: {
|
|
30
|
-
type: "string",
|
|
31
|
-
description:
|
|
32
|
-
"Brief non-technical explanation of what you are doing and why, shown as a status update.",
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
required: ["path", "activity"],
|
|
36
|
-
},
|
|
46
|
+
input_schema: toToolInputSchema(fileListInputSchema, {
|
|
47
|
+
advertiseRequired: ["activity"],
|
|
48
|
+
}),
|
|
37
49
|
|
|
38
50
|
async execute(
|
|
39
51
|
input: Record<string, unknown>,
|
|
40
52
|
context: ToolContext,
|
|
41
53
|
): Promise<ToolExecutionResult> {
|
|
42
|
-
const
|
|
43
|
-
if (!
|
|
44
|
-
return
|
|
45
|
-
content: "Error: path is required and must be a string",
|
|
46
|
-
isError: true,
|
|
47
|
-
};
|
|
54
|
+
const parsed = fileListInputSchema.safeParse(input);
|
|
55
|
+
if (!parsed.success) {
|
|
56
|
+
return invalidToolInputResult("file_list", parsed.error);
|
|
48
57
|
}
|
|
58
|
+
const { path: rawPath, glob } = parsed.data;
|
|
49
59
|
|
|
50
60
|
const ops = new FileSystemOps((path, opts) =>
|
|
51
61
|
sandboxPolicy(path, context.workingDir, opts),
|
|
52
62
|
);
|
|
53
63
|
|
|
54
|
-
const result = ops.listDirSafe({
|
|
55
|
-
path: rawPath,
|
|
56
|
-
glob: typeof input.glob === "string" ? input.glob : undefined,
|
|
57
|
-
});
|
|
64
|
+
const result = ops.listDirSafe({ path: rawPath, glob });
|
|
58
65
|
|
|
59
66
|
if (!result.ok) {
|
|
60
67
|
const { error } = result;
|