@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 { extname } from "node:path";
|
|
2
2
|
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
|
|
3
5
|
import { supportsHostProxy } from "../../channels/types.js";
|
|
4
6
|
import { HostFileProxy } from "../../daemon/host-file-proxy.js";
|
|
5
7
|
import { RiskLevel } from "../../permissions/types.js";
|
|
@@ -14,12 +16,45 @@ import {
|
|
|
14
16
|
readImageFile,
|
|
15
17
|
} from "../shared/filesystem/image-read.js";
|
|
16
18
|
import { hostPolicy } from "../shared/filesystem/path-policy.js";
|
|
19
|
+
import {
|
|
20
|
+
invalidToolInputResult,
|
|
21
|
+
toToolInputSchema,
|
|
22
|
+
} from "../shared/zod-tool-schema.js";
|
|
17
23
|
import type {
|
|
18
24
|
ToolContext,
|
|
19
25
|
ToolDefinition,
|
|
20
26
|
ToolExecutionResult,
|
|
21
27
|
} from "../types.js";
|
|
22
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Model-input schema, the single source for both runtime validation (via
|
|
31
|
+
* `TOOL_INPUT_SCHEMAS`) and the advertised `input_schema` below — mirrors
|
|
32
|
+
* `filesystem/read.ts`. `offset`/`limit` catch to `undefined` so a
|
|
33
|
+
* non-numeric value reads the whole file instead of failing the call;
|
|
34
|
+
* `target_client_id` catches so a non-string (or empty) value means
|
|
35
|
+
* "untargeted".
|
|
36
|
+
*/
|
|
37
|
+
export const hostFileReadInputSchema = z.looseObject({
|
|
38
|
+
path: z.string().min(1).describe("Absolute path to the host file to read"),
|
|
39
|
+
offset: z
|
|
40
|
+
.number()
|
|
41
|
+
.describe("Line number to start reading from (1-indexed)")
|
|
42
|
+
.optional()
|
|
43
|
+
.catch(undefined),
|
|
44
|
+
limit: z
|
|
45
|
+
.number()
|
|
46
|
+
.describe("Maximum number of lines to read")
|
|
47
|
+
.optional()
|
|
48
|
+
.catch(undefined),
|
|
49
|
+
target_client_id: z
|
|
50
|
+
.string()
|
|
51
|
+
.describe(
|
|
52
|
+
"ID of the specific client to execute this on. Required when multiple clients support host_file; omit when only one is connected. Obtain IDs from `assistant clients list --capability host_file`.",
|
|
53
|
+
)
|
|
54
|
+
.optional()
|
|
55
|
+
.catch(undefined),
|
|
56
|
+
});
|
|
57
|
+
|
|
23
58
|
export const hostFileReadTool = {
|
|
24
59
|
name: "host_file_read",
|
|
25
60
|
description:
|
|
@@ -28,46 +63,21 @@ export const hostFileReadTool = {
|
|
|
28
63
|
executionTarget: "host",
|
|
29
64
|
defaultRiskLevel: RiskLevel.Medium,
|
|
30
65
|
|
|
31
|
-
input_schema:
|
|
32
|
-
type: "object",
|
|
33
|
-
properties: {
|
|
34
|
-
path: {
|
|
35
|
-
type: "string",
|
|
36
|
-
description: "Absolute path to the host file to read",
|
|
37
|
-
},
|
|
38
|
-
offset: {
|
|
39
|
-
type: "number",
|
|
40
|
-
description: "Line number to start reading from (1-indexed)",
|
|
41
|
-
},
|
|
42
|
-
limit: {
|
|
43
|
-
type: "number",
|
|
44
|
-
description: "Maximum number of lines to read",
|
|
45
|
-
},
|
|
46
|
-
target_client_id: {
|
|
47
|
-
type: "string",
|
|
48
|
-
description:
|
|
49
|
-
"ID of the specific client to execute this on. Required when multiple clients support host_file; omit when only one is connected. Obtain IDs from `assistant clients list --capability host_file`.",
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
required: ["path"],
|
|
53
|
-
},
|
|
66
|
+
input_schema: toToolInputSchema(hostFileReadInputSchema),
|
|
54
67
|
|
|
55
68
|
async execute(
|
|
56
69
|
input: Record<string, unknown>,
|
|
57
70
|
context: ToolContext,
|
|
58
71
|
): Promise<ToolExecutionResult> {
|
|
59
|
-
const
|
|
60
|
-
if (!
|
|
61
|
-
return
|
|
62
|
-
content: "Error: path is required and must be a string",
|
|
63
|
-
isError: true,
|
|
64
|
-
};
|
|
72
|
+
const parsed = hostFileReadInputSchema.safeParse(input);
|
|
73
|
+
if (!parsed.success) {
|
|
74
|
+
return invalidToolInputResult("host_file_read", parsed.error);
|
|
65
75
|
}
|
|
76
|
+
const { path: rawPath, offset, limit } = parsed.data;
|
|
66
77
|
|
|
67
78
|
const targetClientId =
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
? input.target_client_id
|
|
79
|
+
parsed.data.target_client_id !== ""
|
|
80
|
+
? parsed.data.target_client_id
|
|
71
81
|
: undefined;
|
|
72
82
|
|
|
73
83
|
const transportInterface = context.transportInterface;
|
|
@@ -130,8 +140,8 @@ export const hostFileReadTool = {
|
|
|
130
140
|
{
|
|
131
141
|
operation: "read",
|
|
132
142
|
path: rawPath,
|
|
133
|
-
offset
|
|
134
|
-
limit
|
|
143
|
+
offset,
|
|
144
|
+
limit,
|
|
135
145
|
targetClientId,
|
|
136
146
|
},
|
|
137
147
|
context.conversationId,
|
|
@@ -160,11 +170,7 @@ export const hostFileReadTool = {
|
|
|
160
170
|
|
|
161
171
|
const ops = new FileSystemOps(hostPolicy);
|
|
162
172
|
|
|
163
|
-
const result = ops.readFileSafe({
|
|
164
|
-
path: rawPath,
|
|
165
|
-
offset: typeof input.offset === "number" ? input.offset : undefined,
|
|
166
|
-
limit: typeof input.limit === "number" ? input.limit : undefined,
|
|
167
|
-
});
|
|
173
|
+
const result = ops.readFileSafe({ path: rawPath, offset, limit });
|
|
168
174
|
|
|
169
175
|
if (!result.ok) {
|
|
170
176
|
const { error } = result;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import { supportsHostProxy } from "../../channels/types.js";
|
|
2
4
|
import { HostFileProxy } from "../../daemon/host-file-proxy.js";
|
|
3
5
|
import { RiskLevel } from "../../permissions/types.js";
|
|
@@ -5,12 +7,34 @@ import { assistantEventHub } from "../../runtime/assistant-event-hub.js";
|
|
|
5
7
|
import { FileSystemOps } from "../shared/filesystem/file-ops-service.js";
|
|
6
8
|
import { formatWriteSummary } from "../shared/filesystem/format-diff.js";
|
|
7
9
|
import { hostPolicy } from "../shared/filesystem/path-policy.js";
|
|
10
|
+
import {
|
|
11
|
+
invalidToolInputResult,
|
|
12
|
+
toToolInputSchema,
|
|
13
|
+
} from "../shared/zod-tool-schema.js";
|
|
8
14
|
import type {
|
|
9
15
|
ToolContext,
|
|
10
16
|
ToolDefinition,
|
|
11
17
|
ToolExecutionResult,
|
|
12
18
|
} from "../types.js";
|
|
13
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Model-input schema, the single source for both runtime validation (via
|
|
22
|
+
* `TOOL_INPUT_SCHEMAS`) and the advertised `input_schema` below — mirrors
|
|
23
|
+
* `filesystem/write.ts`. `target_client_id` catches to `undefined` so a
|
|
24
|
+
* non-string (or empty) value means "untargeted".
|
|
25
|
+
*/
|
|
26
|
+
export const hostFileWriteInputSchema = z.looseObject({
|
|
27
|
+
path: z.string().min(1).describe("Absolute host path to the file to write"),
|
|
28
|
+
content: z.string().describe("The content to write to the file"),
|
|
29
|
+
target_client_id: z
|
|
30
|
+
.string()
|
|
31
|
+
.describe(
|
|
32
|
+
"ID of the specific client to execute this on. Required when multiple clients support host_file; omit when only one is connected. Obtain IDs from `assistant clients list --capability host_file`.",
|
|
33
|
+
)
|
|
34
|
+
.optional()
|
|
35
|
+
.catch(undefined),
|
|
36
|
+
});
|
|
37
|
+
|
|
14
38
|
export const hostFileWriteTool = {
|
|
15
39
|
name: "host_file_write",
|
|
16
40
|
description:
|
|
@@ -19,50 +43,21 @@ export const hostFileWriteTool = {
|
|
|
19
43
|
executionTarget: "host",
|
|
20
44
|
defaultRiskLevel: RiskLevel.Medium,
|
|
21
45
|
|
|
22
|
-
input_schema:
|
|
23
|
-
type: "object",
|
|
24
|
-
properties: {
|
|
25
|
-
path: {
|
|
26
|
-
type: "string",
|
|
27
|
-
description: "Absolute host path to the file to write",
|
|
28
|
-
},
|
|
29
|
-
content: {
|
|
30
|
-
type: "string",
|
|
31
|
-
description: "The content to write to the file",
|
|
32
|
-
},
|
|
33
|
-
target_client_id: {
|
|
34
|
-
type: "string",
|
|
35
|
-
description:
|
|
36
|
-
"ID of the specific client to execute this on. Required when multiple clients support host_file; omit when only one is connected. Obtain IDs from `assistant clients list --capability host_file`.",
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
required: ["path", "content"],
|
|
40
|
-
},
|
|
46
|
+
input_schema: toToolInputSchema(hostFileWriteInputSchema),
|
|
41
47
|
|
|
42
48
|
async execute(
|
|
43
49
|
input: Record<string, unknown>,
|
|
44
50
|
context: ToolContext,
|
|
45
51
|
): Promise<ToolExecutionResult> {
|
|
46
|
-
const
|
|
47
|
-
if (!
|
|
48
|
-
return
|
|
49
|
-
content: "Error: path is required and must be a string",
|
|
50
|
-
isError: true,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const fileContent = input.content;
|
|
55
|
-
if (typeof fileContent !== "string") {
|
|
56
|
-
return {
|
|
57
|
-
content: "Error: content is required and must be a string",
|
|
58
|
-
isError: true,
|
|
59
|
-
};
|
|
52
|
+
const parsed = hostFileWriteInputSchema.safeParse(input);
|
|
53
|
+
if (!parsed.success) {
|
|
54
|
+
return invalidToolInputResult("host_file_write", parsed.error);
|
|
60
55
|
}
|
|
56
|
+
const { path: rawPath, content: fileContent } = parsed.data;
|
|
61
57
|
|
|
62
58
|
const targetClientId =
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
? input.target_client_id
|
|
59
|
+
parsed.data.target_client_id !== ""
|
|
60
|
+
? parsed.data.target_client_id
|
|
66
61
|
: undefined;
|
|
67
62
|
|
|
68
63
|
const transportInterface = context.transportInterface;
|
|
@@ -11,6 +11,8 @@ import { existsSync } from "node:fs";
|
|
|
11
11
|
import { homedir } from "node:os";
|
|
12
12
|
import { isAbsolute } from "node:path";
|
|
13
13
|
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
|
|
14
16
|
import { supportsHostProxy } from "../../channels/types.js";
|
|
15
17
|
import { getConfig } from "../../config/loader.js";
|
|
16
18
|
import { HostBashProxy } from "../../daemon/host-bash-proxy.js";
|
|
@@ -36,6 +38,11 @@ import {
|
|
|
36
38
|
formatShellOutput,
|
|
37
39
|
MAX_OUTPUT_LENGTH,
|
|
38
40
|
} from "../shared/shell-output.js";
|
|
41
|
+
import {
|
|
42
|
+
invalidToolInputResult,
|
|
43
|
+
nullAsOmitted,
|
|
44
|
+
toToolInputSchema,
|
|
45
|
+
} from "../shared/zod-tool-schema.js";
|
|
39
46
|
import { buildSanitizedEnv } from "../terminal/safe-env.js";
|
|
40
47
|
import type {
|
|
41
48
|
ToolContext,
|
|
@@ -90,6 +97,56 @@ function buildHostBashProxyEnv(conversationId: string): Record<string, string> {
|
|
|
90
97
|
return env;
|
|
91
98
|
}
|
|
92
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Model-input schema, the single source for both runtime validation (via
|
|
102
|
+
* `TOOL_INPUT_SCHEMAS`) and the advertised `input_schema` below.
|
|
103
|
+
* `timeout_seconds` / `background` / `target_client_id` / `activity` catch
|
|
104
|
+
* to `undefined` so a malformed value degrades to its default (configured
|
|
105
|
+
* timeout, foreground, untargeted, status-only). `working_dir` treats an
|
|
106
|
+
* explicit null as omitted (the run defaults to the user home) but does NOT
|
|
107
|
+
* catch — a malformed working directory fails the parse rather than
|
|
108
|
+
* silently running in the wrong place, and the null-byte / absolute-path
|
|
109
|
+
* checks stay bespoke below.
|
|
110
|
+
*/
|
|
111
|
+
export const hostShellInputSchema = z.looseObject({
|
|
112
|
+
command: z.string().min(1).describe("The host shell command to execute."),
|
|
113
|
+
activity: z
|
|
114
|
+
.string()
|
|
115
|
+
.describe(
|
|
116
|
+
'Brief non-technical explanation of what this command does and why, shown to a non-technical user in the permission prompt. Avoid jargon and technical terms. Good: "to check if a required program is installed on your computer". Bad: "to check if gcloud CLI is installed". Good: "to download a helper program". Bad: "to run npm install".',
|
|
117
|
+
)
|
|
118
|
+
.optional()
|
|
119
|
+
.catch(undefined),
|
|
120
|
+
working_dir: nullAsOmitted(
|
|
121
|
+
z
|
|
122
|
+
.string()
|
|
123
|
+
.describe(
|
|
124
|
+
"Optional absolute host working directory (defaults to user home)",
|
|
125
|
+
),
|
|
126
|
+
),
|
|
127
|
+
timeout_seconds: z
|
|
128
|
+
.number()
|
|
129
|
+
.describe(
|
|
130
|
+
"Optional timeout in seconds. Uses configured default and max limits.",
|
|
131
|
+
)
|
|
132
|
+
.optional()
|
|
133
|
+
.catch(undefined),
|
|
134
|
+
background: z
|
|
135
|
+
.boolean()
|
|
136
|
+
.describe(
|
|
137
|
+
"Run the command in the background on the host machine. The tool returns immediately with a background tool ID. When the process exits, its output is delivered to the conversation as a wake.",
|
|
138
|
+
)
|
|
139
|
+
.optional()
|
|
140
|
+
.catch(undefined),
|
|
141
|
+
target_client_id: z
|
|
142
|
+
.string()
|
|
143
|
+
.describe(
|
|
144
|
+
"ID of the specific client to execute this command on. Required when multiple clients support host_bash; omit when only one client is connected. Obtain IDs from `assistant clients list --capability host_bash`.",
|
|
145
|
+
)
|
|
146
|
+
.optional()
|
|
147
|
+
.catch(undefined),
|
|
148
|
+
});
|
|
149
|
+
|
|
93
150
|
export const hostShellTool = {
|
|
94
151
|
name: "host_bash",
|
|
95
152
|
description:
|
|
@@ -98,64 +155,24 @@ export const hostShellTool = {
|
|
|
98
155
|
executionTarget: "host",
|
|
99
156
|
defaultRiskLevel: RiskLevel.Medium,
|
|
100
157
|
|
|
101
|
-
input_schema: {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
command: {
|
|
105
|
-
type: "string",
|
|
106
|
-
description: "The host shell command to execute.",
|
|
107
|
-
},
|
|
108
|
-
activity: {
|
|
109
|
-
type: "string",
|
|
110
|
-
description:
|
|
111
|
-
'Brief non-technical explanation of what this command does and why, shown to a non-technical user in the permission prompt. Avoid jargon and technical terms. Good: "to check if a required program is installed on your computer". Bad: "to check if gcloud CLI is installed". Good: "to download a helper program". Bad: "to run npm install".',
|
|
112
|
-
},
|
|
113
|
-
working_dir: {
|
|
114
|
-
type: "string",
|
|
115
|
-
description:
|
|
116
|
-
"Optional absolute host working directory (defaults to user home)",
|
|
117
|
-
},
|
|
118
|
-
timeout_seconds: {
|
|
119
|
-
type: "number",
|
|
120
|
-
description:
|
|
121
|
-
"Optional timeout in seconds. Uses configured default and max limits.",
|
|
122
|
-
},
|
|
123
|
-
background: {
|
|
124
|
-
type: "boolean",
|
|
125
|
-
description:
|
|
126
|
-
"Run the command in the background on the host machine. The tool returns immediately with a background tool ID. When the process exits, its output is delivered to the conversation as a wake.",
|
|
127
|
-
},
|
|
128
|
-
target_client_id: {
|
|
129
|
-
type: "string",
|
|
130
|
-
description:
|
|
131
|
-
"ID of the specific client to execute this command on. Required when multiple clients support host_bash; omit when only one client is connected. Obtain IDs from `assistant clients list --capability host_bash`.",
|
|
132
|
-
},
|
|
133
|
-
},
|
|
134
|
-
required: ["command", "activity"],
|
|
135
|
-
},
|
|
158
|
+
input_schema: toToolInputSchema(hostShellInputSchema, {
|
|
159
|
+
advertiseRequired: ["activity"],
|
|
160
|
+
}),
|
|
136
161
|
|
|
137
162
|
async execute(
|
|
138
163
|
input: Record<string, unknown>,
|
|
139
164
|
context: ToolContext,
|
|
140
165
|
): Promise<ToolExecutionResult> {
|
|
141
|
-
const
|
|
142
|
-
if (!
|
|
143
|
-
return
|
|
144
|
-
content: "Error: command is required and must be a string",
|
|
145
|
-
isError: true,
|
|
146
|
-
};
|
|
166
|
+
const parsed = hostShellInputSchema.safeParse(input);
|
|
167
|
+
if (!parsed.success) {
|
|
168
|
+
return invalidToolInputResult("host_bash", parsed.error);
|
|
147
169
|
}
|
|
170
|
+
const command = parsed.data.command;
|
|
148
171
|
if (command.includes("\0")) {
|
|
149
172
|
return { content: "Error: command contains null bytes", isError: true };
|
|
150
173
|
}
|
|
151
174
|
|
|
152
|
-
const rawWorkingDir =
|
|
153
|
-
if (rawWorkingDir != null && typeof rawWorkingDir !== "string") {
|
|
154
|
-
return {
|
|
155
|
-
content: "Error: working_dir must be a string when provided",
|
|
156
|
-
isError: true,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
175
|
+
const rawWorkingDir = parsed.data.working_dir;
|
|
159
176
|
if (typeof rawWorkingDir === "string" && rawWorkingDir.includes("\0")) {
|
|
160
177
|
return {
|
|
161
178
|
content: "Error: working_dir contains null bytes",
|
|
@@ -168,7 +185,7 @@ export const hostShellTool = {
|
|
|
168
185
|
isError: true,
|
|
169
186
|
};
|
|
170
187
|
}
|
|
171
|
-
const background =
|
|
188
|
+
const background = parsed.data.background === true;
|
|
172
189
|
if (background && context.diskPressureCleanupModeActive === true) {
|
|
173
190
|
return {
|
|
174
191
|
content:
|
|
@@ -178,9 +195,8 @@ export const hostShellTool = {
|
|
|
178
195
|
}
|
|
179
196
|
|
|
180
197
|
const targetClientId =
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
? input.target_client_id
|
|
198
|
+
parsed.data.target_client_id !== ""
|
|
199
|
+
? parsed.data.target_client_id
|
|
184
200
|
: undefined;
|
|
185
201
|
|
|
186
202
|
const config = getConfig();
|
|
@@ -230,10 +246,7 @@ export const hostShellTool = {
|
|
|
230
246
|
// Proxy to connected client for execution on the user's machine
|
|
231
247
|
// when a capable client is available (managed/cloud-hosted mode).
|
|
232
248
|
if (HostBashProxy.instance.isAvailable()) {
|
|
233
|
-
const rawSec =
|
|
234
|
-
typeof input.timeout_seconds === "number"
|
|
235
|
-
? input.timeout_seconds
|
|
236
|
-
: shellDefaultTimeoutSec;
|
|
249
|
+
const rawSec = parsed.data.timeout_seconds ?? shellDefaultTimeoutSec;
|
|
237
250
|
const normalizedTimeout = Math.max(
|
|
238
251
|
1,
|
|
239
252
|
Math.min(rawSec, shellMaxTimeoutSec),
|
|
@@ -419,10 +432,7 @@ export const hostShellTool = {
|
|
|
419
432
|
const workingDir =
|
|
420
433
|
typeof rawWorkingDir === "string" ? rawWorkingDir : homedir();
|
|
421
434
|
|
|
422
|
-
const requestedSec =
|
|
423
|
-
typeof input.timeout_seconds === "number"
|
|
424
|
-
? input.timeout_seconds
|
|
425
|
-
: shellDefaultTimeoutSec;
|
|
435
|
+
const requestedSec = parsed.data.timeout_seconds ?? shellDefaultTimeoutSec;
|
|
426
436
|
const timeoutSec = Math.max(1, Math.min(requestedSec, shellMaxTimeoutSec));
|
|
427
437
|
const timeoutMs = timeoutSec * 1000;
|
|
428
438
|
|
|
@@ -500,7 +510,9 @@ export const hostShellTool = {
|
|
|
500
510
|
let completed = false;
|
|
501
511
|
|
|
502
512
|
child.on("close", (code) => {
|
|
503
|
-
if (completed) {
|
|
513
|
+
if (completed) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
504
516
|
completed = true;
|
|
505
517
|
clearTimeout(timer);
|
|
506
518
|
const stdout = Buffer.concat(stdoutChunks).toString();
|
|
@@ -572,7 +584,9 @@ export const hostShellTool = {
|
|
|
572
584
|
});
|
|
573
585
|
|
|
574
586
|
child.on("error", (err) => {
|
|
575
|
-
if (completed) {
|
|
587
|
+
if (completed) {
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
576
590
|
completed = true;
|
|
577
591
|
clearTimeout(timer);
|
|
578
592
|
const status = aborted ? "cancelled" : "failed";
|
|
@@ -1,10 +1,29 @@
|
|
|
1
1
|
import { getConfig } from "../config/loader.js";
|
|
2
|
-
import {
|
|
2
|
+
import { isV3TierActive } from "../config/memory-v3-gate.js";
|
|
3
3
|
import type { ExecutionContext } from "../permissions/approval-policy.js";
|
|
4
|
+
import type { ChannelPermissionCoordinates } from "../permissions/channel-permission-query.js";
|
|
4
5
|
import type { PolicyContext } from "../permissions/types.js";
|
|
5
6
|
import { getToolOwner } from "./registry.js";
|
|
6
7
|
import type { Tool, ToolContext } from "./types.js";
|
|
7
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Channel coordinates of the turn, in {@link PolicyContext} shape. The
|
|
11
|
+
* permission checker reaches these through the policy context, while the
|
|
12
|
+
* sensitive-tool gate runs before one exists and reads a `ToolContext`
|
|
13
|
+
* directly — both resolve the same permission-matrix cell, so the field
|
|
14
|
+
* mapping lives here once rather than in each lane.
|
|
15
|
+
*/
|
|
16
|
+
export function channelCoordinatesFromToolContext(
|
|
17
|
+
context?: ToolContext,
|
|
18
|
+
): ChannelPermissionCoordinates {
|
|
19
|
+
return {
|
|
20
|
+
trustClass: context?.trustClass,
|
|
21
|
+
sourceChannel: context?.executionChannel,
|
|
22
|
+
channelExternalId: context?.channelPermissionChannelId,
|
|
23
|
+
channelConversationType: context?.channelConversationType,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
8
27
|
/**
|
|
9
28
|
* Derive the execution context from the tool context fields.
|
|
10
29
|
* - Guardian + non-interactive → "background" (scheduled jobs, reminders)
|
|
@@ -42,15 +61,13 @@ export function buildPolicyContext(
|
|
|
42
61
|
// origin-scoped grant can fire for them.
|
|
43
62
|
const originSignals = {
|
|
44
63
|
requestOrigin: context?.requestOrigin,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
// inactive, just by reading this boolean.
|
|
53
|
-
procToSkillsActive: isProcToSkillsActive(getConfig()),
|
|
64
|
+
...channelCoordinatesFromToolContext(context),
|
|
65
|
+
// Precompute the proc-to-skills gate — the v3 tier being active, i.e.
|
|
66
|
+
// memory on AND v3 live — here so the permission checker, a leaf module
|
|
67
|
+
// that must not read config, can deny the memory-retrospective
|
|
68
|
+
// skill-authoring grant whenever the feature is inactive just by reading
|
|
69
|
+
// this boolean.
|
|
70
|
+
procToSkillsActive: isV3TierActive(getConfig()),
|
|
54
71
|
};
|
|
55
72
|
|
|
56
73
|
const ownerKind = getToolOwner(tool.name)?.kind;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
1
3
|
import { resolveCapabilities } from "../../runtime/capabilities.js";
|
|
2
4
|
import { validateScheduleInferenceProfile } from "../../schedule/inference-profile.js";
|
|
3
5
|
import { formatIntegrationSummary } from "../../schedule/integration-status.js";
|
|
@@ -18,6 +20,10 @@ import {
|
|
|
18
20
|
CapabilityManifestSchema,
|
|
19
21
|
resolveCapabilities as resolveWorkflowCapabilities,
|
|
20
22
|
} from "../../workflows/capabilities.js";
|
|
23
|
+
import {
|
|
24
|
+
invalidToolInputResult,
|
|
25
|
+
nullAsOmitted,
|
|
26
|
+
} from "../shared/zod-tool-schema.js";
|
|
21
27
|
import type { ToolContext, ToolExecutionResult } from "../types.js";
|
|
22
28
|
|
|
23
29
|
const VALID_MODES: ScheduleMode[] = ["notify", "execute", "script", "workflow"];
|
|
@@ -27,6 +33,48 @@ const VALID_ROUTING_INTENTS: RoutingIntent[] = [
|
|
|
27
33
|
"all_channels",
|
|
28
34
|
];
|
|
29
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Model-input schema, `safeParse`d at the top of {@link executeScheduleCreate}.
|
|
38
|
+
* Skill-owned tools are skipped by the central `TOOL_INPUT_SCHEMAS` gate, so
|
|
39
|
+
* validation lives in the executor (`ask_question` pre-registry precedent);
|
|
40
|
+
* the advertised `input_schema` stays hand-written in the schedule skill's
|
|
41
|
+
* `TOOLS.json`, and `schedule-tool-input-schemas.test.ts` guards the two
|
|
42
|
+
* against structural drift.
|
|
43
|
+
*
|
|
44
|
+
* Tolerance matches the executor's own reads — this schema only rejects
|
|
45
|
+
* values the executor would otherwise pass into the store unchecked:
|
|
46
|
+
*
|
|
47
|
+
* - `nullAsOmitted` on optionals read via `?? fallback`, where null and
|
|
48
|
+
* absent are equivalent.
|
|
49
|
+
* - `.catch(undefined)` on `workflow_name`, which the executor
|
|
50
|
+
* silently coerces to null when malformed.
|
|
51
|
+
* - `mode`, `routing_intent`, `capabilities`, and `workflow_args` are
|
|
52
|
+
* deliberately UNDECLARED (loose passthrough): the first two keep their
|
|
53
|
+
* bespoke `VALID_*` error messages, `capabilities` must reach
|
|
54
|
+
* `CapabilityManifestSchema` (and the `requireFreshApproval` promotion in
|
|
55
|
+
* `executor.ts`) unaltered, and `workflow_args` accepts any JSON value the
|
|
56
|
+
* workflow runtime accepts.
|
|
57
|
+
*/
|
|
58
|
+
export const scheduleCreateInputSchema = z.looseObject({
|
|
59
|
+
name: nullAsOmitted(z.string()),
|
|
60
|
+
description: nullAsOmitted(z.string()),
|
|
61
|
+
syntax: nullAsOmitted(z.enum(["cron", "rrule"])),
|
|
62
|
+
expression: nullAsOmitted(z.string()),
|
|
63
|
+
fire_at: nullAsOmitted(z.string()),
|
|
64
|
+
timezone: nullAsOmitted(z.string()),
|
|
65
|
+
message: nullAsOmitted(z.string()),
|
|
66
|
+
script: nullAsOmitted(z.string()),
|
|
67
|
+
enabled: nullAsOmitted(z.boolean()),
|
|
68
|
+
workflow_name: z.string().optional().catch(undefined),
|
|
69
|
+
routing_hints: nullAsOmitted(z.looseObject({})),
|
|
70
|
+
quiet: nullAsOmitted(z.boolean()),
|
|
71
|
+
reuse_conversation: nullAsOmitted(z.boolean()),
|
|
72
|
+
max_retries: nullAsOmitted(z.int()),
|
|
73
|
+
retry_backoff_ms: nullAsOmitted(z.int()),
|
|
74
|
+
timeout_ms: z.int().optional(),
|
|
75
|
+
inference_profile: z.string().optional(),
|
|
76
|
+
});
|
|
77
|
+
|
|
30
78
|
export async function executeScheduleCreate(
|
|
31
79
|
input: Record<string, unknown>,
|
|
32
80
|
context: ToolContext,
|
|
@@ -38,27 +86,32 @@ export async function executeScheduleCreate(
|
|
|
38
86
|
isError: true,
|
|
39
87
|
};
|
|
40
88
|
}
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
const
|
|
89
|
+
const parsedInput = scheduleCreateInputSchema.safeParse(input);
|
|
90
|
+
if (!parsedInput.success) {
|
|
91
|
+
return invalidToolInputResult("schedule_create", parsedInput.error);
|
|
92
|
+
}
|
|
93
|
+
const parsed = parsedInput.data;
|
|
94
|
+
|
|
95
|
+
const name = parsed.name;
|
|
96
|
+
const description = parsed.description;
|
|
97
|
+
const timezone = parsed.timezone ?? null;
|
|
98
|
+
const message = parsed.message ?? "";
|
|
99
|
+
const script = parsed.script ?? null;
|
|
100
|
+
const enabled = parsed.enabled ?? true;
|
|
101
|
+
const fireAt = parsed.fire_at;
|
|
102
|
+
// mode / routing_intent / workflow_args (and capabilities, read below) stay
|
|
103
|
+
// raw-input reads: they are undeclared in the schema (see its doc comment).
|
|
48
104
|
const mode = (input.mode as ScheduleMode | undefined) ?? "execute";
|
|
49
105
|
const routingIntent = input.routing_intent as string | undefined;
|
|
50
|
-
const routingHints =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
const timeoutMs = input.timeout_ms as number | undefined;
|
|
58
|
-
const workflowName =
|
|
59
|
-
typeof input.workflow_name === "string" ? input.workflow_name.trim() : null;
|
|
106
|
+
const routingHints = parsed.routing_hints;
|
|
107
|
+
const quiet = parsed.quiet ?? false;
|
|
108
|
+
const reuseConversation = parsed.reuse_conversation;
|
|
109
|
+
const maxRetries = parsed.max_retries;
|
|
110
|
+
const retryBackoffMs = parsed.retry_backoff_ms;
|
|
111
|
+
const timeoutMs = parsed.timeout_ms;
|
|
112
|
+
const workflowName = parsed.workflow_name?.trim() ?? null;
|
|
60
113
|
const workflowArgs = input.workflow_args;
|
|
61
|
-
const inferenceProfile =
|
|
114
|
+
const inferenceProfile = parsed.inference_profile;
|
|
62
115
|
|
|
63
116
|
// Validated workflow capability manifest, resolved only for workflow mode.
|
|
64
117
|
// Left null for non-workflow modes so `createSchedule` persists no manifest.
|
|
@@ -72,30 +125,20 @@ export async function executeScheduleCreate(
|
|
|
72
125
|
}
|
|
73
126
|
|
|
74
127
|
if (inferenceProfile !== undefined) {
|
|
75
|
-
if (typeof inferenceProfile !== "string") {
|
|
76
|
-
return {
|
|
77
|
-
content: "Error: inference_profile must be a string",
|
|
78
|
-
isError: true,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
128
|
const profileError = validateScheduleInferenceProfile(inferenceProfile);
|
|
82
129
|
if (profileError) {
|
|
83
130
|
return { content: `Error: ${profileError}`, isError: true };
|
|
84
131
|
}
|
|
85
132
|
}
|
|
86
133
|
|
|
87
|
-
if (!name
|
|
134
|
+
if (!name) {
|
|
88
135
|
return {
|
|
89
136
|
content: "Error: name is required and must be a string",
|
|
90
137
|
isError: true,
|
|
91
138
|
};
|
|
92
139
|
}
|
|
93
140
|
|
|
94
|
-
if (
|
|
95
|
-
!description ||
|
|
96
|
-
typeof description !== "string" ||
|
|
97
|
-
description.trim().length === 0
|
|
98
|
-
) {
|
|
141
|
+
if (!description || description.trim().length === 0) {
|
|
99
142
|
return {
|
|
100
143
|
content: "Error: description is required and must be a non-empty string",
|
|
101
144
|
isError: true,
|
|
@@ -112,7 +155,7 @@ export async function executeScheduleCreate(
|
|
|
112
155
|
|
|
113
156
|
// Mode-specific field validation
|
|
114
157
|
if (mode === "script") {
|
|
115
|
-
if (!script
|
|
158
|
+
if (!script) {
|
|
116
159
|
return {
|
|
117
160
|
content:
|
|
118
161
|
"Error: script is required for script mode and must be a non-empty string",
|
|
@@ -251,8 +294,8 @@ export async function executeScheduleCreate(
|
|
|
251
294
|
|
|
252
295
|
// ── Recurring schedule (expression) ──────────────────────────────
|
|
253
296
|
const resolved = normalizeScheduleSyntax({
|
|
254
|
-
syntax:
|
|
255
|
-
expression:
|
|
297
|
+
syntax: parsed.syntax,
|
|
298
|
+
expression: parsed.expression,
|
|
256
299
|
});
|
|
257
300
|
|
|
258
301
|
if (!resolved) {
|