@vellumai/assistant 0.8.5 → 0.8.7
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 +33 -1
- package/ARCHITECTURE.md +1 -1
- package/Dockerfile +1 -0
- package/bun.lock +11 -2
- package/bunfig.toml +6 -1
- package/docker-entrypoint.sh +8 -6
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +67 -31
- package/examples/plugins/echo/register.ts +4 -7
- package/knip.json +1 -0
- package/node_modules/@vellumai/environments/bun.lock +24 -0
- package/node_modules/@vellumai/environments/package.json +18 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
- package/node_modules/@vellumai/environments/src/index.ts +11 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
- package/node_modules/@vellumai/environments/src/types.ts +70 -0
- package/node_modules/@vellumai/environments/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +15 -17
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +10 -3
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
- package/openapi.yaml +5585 -469
- package/package.json +7 -3
- package/scripts/generate-openapi.ts +20 -13
- package/src/__tests__/actor-token-service.test.ts +3 -2
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +336 -42
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +21 -33
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +6 -4
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +207 -341
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +5 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -40
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/annotate-risk-options.test.ts +1 -0
- package/src/__tests__/anthropic-provider.test.ts +201 -55
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +5 -0
- package/src/__tests__/approval-cascade.test.ts +5 -11
- package/src/__tests__/approval-routes-http.test.ts +13 -15
- package/src/__tests__/assert-not-live-db.ts +79 -0
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -27
- package/src/__tests__/audit-log-rotation.test.ts +2 -2
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/avatar-e2e.test.ts +7 -37
- package/src/__tests__/avatar-generator.test.ts +12 -42
- package/src/__tests__/avatar-identity-sync.test.ts +28 -3
- package/src/__tests__/background-shell-bash.test.ts +3 -7
- package/src/__tests__/background-workers-disk-pressure.test.ts +5 -8
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +10 -14
- package/src/__tests__/call-controller.test.ts +3 -2
- package/src/__tests__/call-pointer-messages.test.ts +5 -3
- package/src/__tests__/call-site-routing-provider.test.ts +22 -40
- package/src/__tests__/catalog-files.test.ts +1 -0
- package/src/__tests__/channel-approval-routes.test.ts +51 -22
- package/src/__tests__/channel-approvals.test.ts +3 -1
- package/src/__tests__/channel-guardian.test.ts +3 -2
- package/src/__tests__/channel-invite-transport.test.ts +1 -5
- package/src/__tests__/channel-readiness-routes.test.ts +0 -4
- package/src/__tests__/channel-readiness-slack-remote.test.ts +170 -0
- package/src/__tests__/channel-reply-delivery.test.ts +35 -0
- package/src/__tests__/channel-retry-sweep.test.ts +388 -79
- package/src/__tests__/checker.test.ts +12 -12
- package/src/__tests__/circuit-breaker-pipeline.test.ts +3 -3
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-events.test.ts +6 -17
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
- package/src/__tests__/compaction-trail-store.test.ts +186 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +1 -0
- package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +7 -5
- package/src/__tests__/computer-use-tools.test.ts +14 -16
- package/src/__tests__/config-loader-backfill.test.ts +13 -28
- package/src/__tests__/config-loader-corrupt.test.ts +5 -5
- package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
- package/src/__tests__/config-schema.test.ts +10 -10
- package/src/__tests__/config-watcher.test.ts +28 -0
- package/src/__tests__/connection-model-compat.test.ts +83 -0
- package/src/__tests__/contacts-tools.test.ts +3 -2
- package/src/__tests__/context-search-agent-runner.test.ts +6 -3
- package/src/__tests__/context-token-estimator.test.ts +56 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +19 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +4 -2
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +13 -27
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +464 -90
- package/src/__tests__/conversation-agent-loop.test.ts +1069 -64
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -3
- package/src/__tests__/conversation-app-control-instantiation.test.ts +29 -19
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +2 -1
- package/src/__tests__/conversation-attention-store.test.ts +101 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
- package/src/__tests__/conversation-clear-safety.test.ts +20 -10
- package/src/__tests__/conversation-confirmation-signals.test.ts +16 -45
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +10 -17
- package/src/__tests__/conversation-error.test.ts +30 -0
- package/src/__tests__/conversation-fork-crud.test.ts +132 -157
- package/src/__tests__/conversation-fork-route.test.ts +19 -16
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
- package/src/__tests__/conversation-lifecycle.test.ts +4 -2
- package/src/__tests__/conversation-list-source.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +5 -3
- package/src/__tests__/conversation-load-history-stripped.test.ts +2 -1
- package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
- package/src/__tests__/conversation-pairing.test.ts +87 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +30 -7
- package/src/__tests__/conversation-process-callsite.test.ts +28 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +58 -44
- package/src/__tests__/conversation-queue.test.ts +603 -455
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -20
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +35 -10
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -4
- package/src/__tests__/conversation-runtime-assembly.test.ts +98 -22
- package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
- package/src/__tests__/conversation-skill-tools.test.ts +38 -142
- package/src/__tests__/conversation-slash-queue.test.ts +120 -62
- package/src/__tests__/conversation-slash-unknown.test.ts +18 -15
- package/src/__tests__/conversation-speed-override.test.ts +9 -22
- package/src/__tests__/conversation-stream-state.test.ts +484 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +52 -15
- package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +13 -32
- package/src/__tests__/conversation-sync-tags.test.ts +128 -12
- package/src/__tests__/conversation-title-service.test.ts +1 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +53 -11
- package/src/__tests__/conversation-unread-route.test.ts +14 -2
- package/src/__tests__/conversation-usage.test.ts +1 -2
- package/src/__tests__/conversation-wipe.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +4 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +53 -22
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +32 -7
- package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
- package/src/__tests__/credential-broker-server-use.test.ts +5 -5
- package/src/__tests__/credential-execution-client.test.ts +72 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +10 -12
- package/src/__tests__/credential-execution-tools.test.ts +1 -2
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +5 -6
- package/src/__tests__/credential-vault-unit.test.ts +19 -19
- package/src/__tests__/credential-vault.test.ts +5 -5
- package/src/__tests__/cross-provider-web-search.test.ts +61 -3
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-connection-isolation.test.ts +7 -6
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
- package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -0
- package/src/__tests__/db-test-helpers.ts +58 -0
- package/src/__tests__/disk-pressure-guard.test.ts +119 -36
- package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
- package/src/__tests__/disk-pressure-routes.test.ts +9 -35
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-persistence.test.ts +33 -42
- package/src/__tests__/document-create-dedupe.test.ts +189 -0
- package/src/__tests__/document-find-replace.test.ts +3 -2
- package/src/__tests__/document-tool-security.test.ts +81 -2
- package/src/__tests__/dynamic-page-surface.test.ts +68 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-pipeline.test.ts +127 -5
- package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
- package/src/__tests__/encrypted-store.test.ts +11 -9
- package/src/__tests__/feature-flag-test-helpers.ts +53 -0
- package/src/__tests__/filing-service.test.ts +3 -2
- package/src/__tests__/first-greeting.test.ts +103 -12
- package/src/__tests__/gateway-flag-listener.test.ts +0 -1
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +375 -26
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-outbound-http.test.ts +3 -2
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +10 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
- package/src/__tests__/heartbeat-service.test.ts +3 -1
- package/src/__tests__/helpers/mock-logger.ts +26 -0
- package/src/__tests__/history-repair-hook.test.ts +161 -0
- package/src/__tests__/history-repair-observability.test.ts +1 -1
- package/src/__tests__/history-repair.test.ts +2 -1
- package/src/__tests__/host-app-control-proxy.test.ts +2 -0
- package/src/__tests__/host-bash-routes.test.ts +1 -0
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-edit-tool.test.ts +4 -2
- package/src/__tests__/host-file-proxy.test.ts +31 -0
- package/src/__tests__/host-file-read-tool.test.ts +4 -2
- package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-write-tool.test.ts +9 -3
- package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
- package/src/__tests__/host-shell-tool.test.ts +11 -5
- package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +31 -9
- package/src/__tests__/identity-intro-cache.test.ts +154 -22
- package/src/__tests__/inbound-slack-persistence.test.ts +51 -74
- package/src/__tests__/inference-profile-reaper.test.ts +3 -2
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
- package/src/__tests__/injector-background-turn.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +4 -18
- package/src/__tests__/injector-document-comments.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/injector-v3-suppression.test.ts +220 -0
- package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +93 -11
- package/src/__tests__/list-messages-page-latest.test.ts +0 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
- package/src/__tests__/llm-call-pipeline.test.ts +21 -15
- package/src/__tests__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
- package/src/__tests__/llm-resolver.test.ts +346 -39
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/llm-usage-store.test.ts +45 -0
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +14 -0
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messaging-send-tool.test.ts +9 -4
- package/src/__tests__/migration-export-http.test.ts +12 -12
- package/src/__tests__/migration-import-commit-http.test.ts +8 -8
- package/src/__tests__/migration-import-from-url.test.ts +3 -3
- package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +18 -2
- package/src/__tests__/model-intents.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +44 -22
- package/src/__tests__/notification-decision-identity.test.ts +9 -18
- package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- package/src/__tests__/oauth-commands-routes.test.ts +38 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
- package/src/__tests__/oauth-store.test.ts +3 -2
- package/src/__tests__/onboarding-template-contract.test.ts +13 -2
- package/src/__tests__/openai-provider.test.ts +74 -79
- package/src/__tests__/openai-responses-provider.test.ts +90 -86
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +48 -2
- package/src/__tests__/overflow-reduce-pipeline.test.ts +2 -4
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persistence-pipeline.test.ts +154 -27
- package/src/__tests__/persistence-secret-redaction.test.ts +85 -13
- package/src/__tests__/pipeline-runner.test.ts +2 -3
- package/src/__tests__/plugin-bootstrap.test.ts +60 -36
- package/src/__tests__/plugin-route-contribution.test.ts +6 -16
- package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
- package/src/__tests__/plugin-tool-contribution.test.ts +51 -64
- package/src/__tests__/plugin-types.test.ts +7 -14
- package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
- package/src/__tests__/process-message-background-slack.test.ts +38 -32
- package/src/__tests__/process-message-display-content.test.ts +49 -64
- package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
- package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
- package/src/__tests__/provider-error-scenarios.test.ts +7 -6
- package/src/__tests__/provider-platform-proxy-integration.test.ts +215 -8
- package/src/__tests__/provider-registry-ollama.test.ts +45 -22
- package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
- package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
- package/src/__tests__/provider-usage-tracking.test.ts +0 -6
- package/src/__tests__/ratelimit.test.ts +9 -4
- package/src/__tests__/recording-handler.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +82 -76
- package/src/__tests__/relay-server.test.ts +30 -23
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
- package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
- package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +353 -0
- package/src/__tests__/schedule-routes.test.ts +80 -10
- package/src/__tests__/schedule-store.test.ts +83 -1
- package/src/__tests__/schedule-tools.test.ts +125 -0
- package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
- package/src/__tests__/secret-ingress-http.test.ts +7 -3
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
- package/src/__tests__/secret-response-routing.test.ts +13 -11
- package/src/__tests__/secure-keys.test.ts +3 -3
- package/src/__tests__/send-endpoint-busy.test.ts +83 -43
- package/src/__tests__/server-history-render.test.ts +4 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +19 -21
- package/src/__tests__/skill-feature-flags.test.ts +20 -22
- package/src/__tests__/skill-load-feature-flag.test.ts +15 -15
- package/src/__tests__/skill-projection-feature-flag.test.ts +44 -30
- package/src/__tests__/skill-projection.benchmark.test.ts +5 -7
- package/src/__tests__/skill-tool-factory.test.ts +96 -95
- package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
- package/src/__tests__/skillssh-files.test.ts +1 -0
- package/src/__tests__/slack-channel-config.test.ts +3 -3
- package/src/__tests__/starter-task-flow.test.ts +6 -6
- package/src/__tests__/strip-memory-injections.test.ts +102 -14
- package/src/__tests__/subagent-call-site-routing.test.ts +13 -5
- package/src/__tests__/subagent-disposal.test.ts +27 -8
- package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
- package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
- package/src/__tests__/subagent-manager-notify.test.ts +20 -8
- package/src/__tests__/subagent-notify-parent.test.ts +5 -4
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
- package/src/__tests__/subagent-tools.test.ts +2 -1
- package/src/__tests__/suggestion-routes.test.ts +4 -3
- package/src/__tests__/sync-message-contract.test.ts +19 -16
- package/src/__tests__/system-prompt.test.ts +92 -0
- package/src/__tests__/terminal-tools.test.ts +3 -24
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-pipeline.test.ts +1 -1
- package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
- package/src/__tests__/tool-error-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +20 -7
- package/src/__tests__/tool-executor.test.ts +55 -10
- package/src/__tests__/tool-preview-lifecycle.test.ts +14 -11
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
- package/src/__tests__/tool-result-truncation.test.ts +3 -1
- package/src/__tests__/tools-audio-read.test.ts +113 -0
- package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
- package/src/__tests__/turn-events-store.test.ts +11 -7
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +10 -7
- package/src/__tests__/voice-session-bridge.test.ts +50 -35
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
- package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/acp/session-manager.ts +5 -6
- package/src/agent/compaction-circuit.ts +140 -0
- package/src/agent/loop.ts +489 -85
- package/src/api/README.md +126 -2
- package/src/api/constants/call-sites.ts +27 -0
- package/src/api/constants/tool-execution.ts +21 -0
- package/src/api/events/assistant-activity-state.ts +75 -0
- package/src/api/events/assistant-outbound-attachment.ts +49 -0
- package/src/api/events/assistant-text-delta.ts +30 -0
- package/src/api/events/assistant-turn-start.ts +31 -0
- package/src/api/events/avatar-updated.ts +24 -0
- package/src/api/events/compaction-circuit-closed.ts +26 -0
- package/src/api/events/compaction-circuit-open.ts +28 -0
- package/src/api/events/confirmation-request.ts +114 -0
- package/src/api/events/contact-request.ts +33 -0
- package/src/api/events/conversation-error.ts +77 -0
- package/src/api/events/conversation-list-invalidated.ts +38 -0
- package/src/api/events/conversation-title-updated.ts +24 -0
- package/src/api/events/disk-pressure-status-changed.ts +61 -0
- package/src/api/events/document-comment-created.ts +44 -0
- package/src/api/events/document-comment-deleted.ts +22 -0
- package/src/api/events/document-comment-reopened.ts +23 -0
- package/src/api/events/document-comment-resolved.ts +25 -0
- package/src/api/events/document-editor-update.ts +27 -0
- package/src/api/events/error.ts +32 -0
- package/src/api/events/generation-cancelled.ts +22 -0
- package/src/api/events/generation-handoff.ts +39 -0
- package/src/api/events/home-feed-updated.ts +26 -0
- package/src/api/events/identity-changed.ts +32 -0
- package/src/api/events/interaction-resolved.ts +50 -0
- package/src/api/events/message-complete.ts +40 -0
- package/src/api/events/message-dequeued.ts +21 -0
- package/src/api/events/message-queued-deleted.ts +23 -0
- package/src/api/events/message-queued.ts +22 -0
- package/src/api/events/message-request-complete.ts +29 -0
- package/src/api/events/navigate-settings.ts +20 -0
- package/src/api/events/notification-intent.ts +33 -0
- package/src/api/events/open-url.ts +28 -0
- package/src/api/events/question-request.ts +67 -0
- package/src/{events → api/events}/relationship-state-updated.ts +6 -8
- package/src/api/events/secret-request.ts +42 -0
- package/src/api/events/subagent-event.ts +79 -0
- package/src/api/events/subagent-spawned.ts +40 -0
- package/src/api/events/subagent-status-changed.ts +65 -0
- package/src/api/events/sync-changed.ts +29 -0
- package/src/api/events/tool-result.ts +129 -0
- package/src/api/events/tool-use-start.ts +30 -0
- package/src/api/events/turn-profile-auto-routed.ts +28 -0
- package/src/api/events/ui-surface-complete.ts +30 -0
- package/src/api/events/ui-surface-dismiss.ts +22 -0
- package/src/api/events/ui-surface-show.ts +67 -0
- package/src/api/events/ui-surface-update.ts +26 -0
- package/src/api/events/usage-update.ts +34 -0
- package/src/api/events/user-message-echo.ts +35 -0
- package/src/api/index.ts +482 -3
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/disk-pressure-status.ts +26 -0
- package/src/api/responses/home.ts +217 -0
- package/src/api/responses/llm-context-response.ts +41 -0
- package/src/api/responses/llm-request-log-entry.ts +93 -0
- package/src/api/responses/memory-recall-log.ts +65 -0
- package/src/api/responses/memory-v2-activation-log.ts +78 -0
- package/src/api/responses/memory-v3-selection-log.ts +50 -0
- package/src/api/responses/subagent-detail.ts +48 -0
- package/src/approvals/guardian-decision-primitive.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +6 -9
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +193 -0
- package/src/avatar/avatar-manifest.ts +195 -0
- package/src/avatar/avatar-store.ts +113 -0
- package/src/avatar/traits-png-sync.ts +8 -2
- package/src/background-wake/background-wake-routes.test.ts +687 -52
- package/src/background-wake/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +4 -1
- package/src/background-wake/platform-client.test.ts +308 -0
- package/src/background-wake/platform-client.ts +167 -0
- package/src/background-wake/publisher.ts +91 -0
- package/src/background-wake/runtime-registry.ts +2 -2
- package/src/background-wake/wake-intent-hooks.test.ts +282 -0
- package/src/calls/call-conversation-messages.ts +6 -4
- package/src/calls/guardian-action-sweep.ts +6 -4
- package/src/calls/guardian-dispatch.ts +1 -0
- package/src/calls/relay-server.ts +12 -8
- package/src/calls/voice-session-bridge.ts +17 -31
- package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/avatar.ts +17 -11
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/conversations.ts +15 -1
- package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
- package/src/cli/commands/db/__tests__/status.test.ts +253 -0
- package/src/cli/commands/db/format.ts +48 -0
- package/src/cli/commands/db/index.ts +29 -0
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
- package/src/cli/commands/db/repair-step-integrity.ts +146 -0
- package/src/cli/commands/db/repair-steps.ts +164 -0
- package/src/cli/commands/db/repair.ts +141 -0
- package/src/cli/commands/db/status.ts +366 -0
- package/src/cli/commands/memory-v3.ts +168 -203
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/cli-colors.ts +24 -6
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +6 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +25 -44
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
- package/src/config/bundled-skills/document-editor/SKILL.md +5 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +2 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +10 -2
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
- package/src/config/call-site-defaults.ts +3 -8
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +42 -26
- package/src/config/llm-context-resolution.ts +10 -1
- package/src/config/llm-resolver.ts +121 -15
- package/src/config/loader.ts +4 -5
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -211
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +92 -4
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +0 -227
- package/src/config/schemas/memory-v3.ts +39 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/services.ts +6 -2
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/compactor.ts +54 -31
- package/src/context/token-estimator.ts +29 -5
- package/src/context/tool-result-truncation.ts +1 -43
- package/src/context/window-manager.ts +138 -20
- package/src/credential-execution/executable-discovery.ts +40 -0
- package/src/credential-execution/process-manager.ts +6 -2
- package/src/credential-health/credential-health-service.ts +125 -40
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +15 -17
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -2
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +11 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +613 -155
- package/src/daemon/conversation-agent-loop.ts +409 -605
- package/src/daemon/conversation-error.ts +40 -12
- package/src/daemon/conversation-history.ts +22 -6
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +10 -38
- package/src/daemon/conversation-messaging.ts +83 -44
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +174 -116
- package/src/daemon/conversation-runtime-assembly.ts +76 -30
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-store.ts +6 -5
- package/src/daemon/conversation-surfaces.ts +124 -103
- package/src/daemon/conversation-tool-setup.ts +36 -48
- package/src/daemon/conversation.ts +111 -166
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +7 -4
- package/src/daemon/disk-pressure-guard.ts +54 -50
- package/src/daemon/external-plugins-bootstrap.ts +46 -24
- package/src/daemon/first-greeting.ts +53 -13
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/conversations.ts +6 -22
- package/src/daemon/handlers/shared.ts +10 -1
- package/src/daemon/handlers/skills.ts +15 -14
- package/src/daemon/host-app-control-proxy.ts +54 -1
- package/src/daemon/host-cu-proxy.ts +46 -22
- package/src/daemon/host-file-proxy.ts +25 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -6
- package/src/daemon/lifecycle.ts +40 -67
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +10 -17
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +25 -125
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/documents.ts +3 -9
- package/src/daemon/message-types/home.ts +5 -18
- package/src/daemon/message-types/integrations.ts +4 -13
- package/src/daemon/message-types/messages.ts +47 -377
- package/src/daemon/message-types/notifications.ts +2 -32
- package/src/daemon/message-types/settings.ts +3 -8
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/subagents.ts +6 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/process-message.ts +58 -55
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +28 -0
- package/src/daemon/switch-inference-profile-tool.ts +13 -3
- package/src/daemon/tool-setup-types.ts +0 -6
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +21 -1
- package/src/documents/document-store.ts +38 -0
- package/src/export/__tests__/transcript-formatter.test.ts +1 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +31 -0
- package/src/heartbeat/heartbeat-run-store.ts +31 -0
- package/src/heartbeat/heartbeat-service.ts +79 -0
- package/src/home/__tests__/feed-writer.test.ts +161 -0
- package/src/home/__tests__/post-connect-feed.test.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +55 -59
- package/src/home/feature-gate.ts +22 -0
- package/src/home/feed-types.ts +36 -221
- package/src/home/feed-writer.ts +146 -7
- package/src/home/suggested-prompts.ts +27 -145
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- package/src/ipc/gateway-client.test.ts +4 -1
- package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
- package/src/ipc/routes/route-adapter.ts +45 -6
- package/src/ipc/skill-routes/__tests__/memory.test.ts +19 -9
- package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
- package/src/ipc/skill-routes/__tests__/registries.test.ts +59 -20
- package/src/ipc/skill-routes/memory.ts +27 -13
- package/src/ipc/skill-routes/providers.ts +5 -6
- package/src/ipc/skill-routes/registries.ts +39 -88
- package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
- package/src/memory/__tests__/conversation-queries.test.ts +192 -8
- package/src/memory/__tests__/db-maintenance.test.ts +128 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +1 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +11 -6
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +386 -115
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +12 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/db-singleton.ts +77 -0
- package/src/memory/delivery-channels.ts +82 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +41 -8
- package/src/memory/graph/extraction.ts +6 -9
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +3 -3
- package/src/memory/graph/retriever.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +32 -32
- package/src/memory/job-handlers/embedding.test.ts +3 -2
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
- package/src/memory/jobs-store.ts +3 -1
- package/src/memory/jobs-worker.ts +63 -40
- package/src/memory/llm-request-log-source-clickhouse.ts +55 -1
- package/src/memory/llm-request-log-source-local.ts +13 -0
- package/src/memory/llm-request-log-source.ts +21 -6
- package/src/memory/llm-request-log-store.ts +147 -3
- package/src/memory/llm-usage-store.ts +10 -0
- package/src/memory/memory-marker.ts +17 -0
- package/src/memory/memory-retrospective-job.ts +6 -2
- package/src/memory/memory-v2-activation-log-store.ts +13 -1
- package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
- package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
- package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
- package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
- package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
- package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
- package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/schema/conversations.ts +9 -1
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/schema/infrastructure.ts +11 -0
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +9 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +9 -4
- package/src/memory/v2/__tests__/harness-runner.test.ts +26 -0
- package/src/memory/v2/__tests__/migration.test.ts +11 -3
- package/src/memory/v2/__tests__/page-index.test.ts +37 -1
- package/src/memory/v2/__tests__/router.test.ts +14 -4
- package/src/memory/v2/__tests__/sweep-job.test.ts +9 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +89 -9
- package/src/memory/v2/harness/metrics.ts +5 -1
- package/src/memory/v2/harness/replay-input.ts +19 -3
- package/src/memory/v2/harness/runner.ts +6 -0
- package/src/memory/v2/harness/trace.ts +6 -0
- package/src/memory/v2/migration.ts +5 -3
- package/src/memory/v2/page-index.ts +11 -0
- package/src/memory/v2/router.ts +8 -11
- package/src/memory/v2/sweep-job.ts +8 -11
- package/src/memory/v2/types.ts +1 -0
- package/src/memory/v3/__tests__/assign.test.ts +242 -0
- package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
- package/src/memory/v3/__tests__/core.test.ts +39 -0
- package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
- package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
- package/src/memory/v3/__tests__/health.test.ts +203 -0
- package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
- package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
- package/src/memory/v3/__tests__/needle.test.ts +107 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
- package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
- package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
- package/src/memory/v3/__tests__/router.test.ts +260 -0
- package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
- package/src/memory/v3/__tests__/selector.test.ts +404 -0
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
- package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
- package/src/memory/v3/__tests__/tree.test.ts +192 -0
- package/src/memory/v3/__tests__/types.test.ts +54 -0
- package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
- package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/memory/v3/assign.ts +268 -0
- package/src/memory/v3/capabilities.ts +124 -0
- package/src/memory/v3/core.ts +26 -0
- package/src/memory/v3/data/README.md +84 -0
- package/src/memory/v3/data/assignments.json +5 -0
- package/src/memory/v3/data/core.json +1 -0
- package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
- package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
- package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +314 -0
- package/src/memory/v3/needle.ts +115 -0
- package/src/memory/v3/orchestrate.ts +114 -0
- package/src/memory/v3/page-content.ts +34 -0
- package/src/memory/v3/provider-blocks.ts +16 -0
- package/src/memory/v3/reconcile.ts +523 -0
- package/src/memory/v3/render-injection.ts +32 -0
- package/src/memory/v3/router.ts +184 -0
- package/src/memory/v3/selection-log-store.ts +84 -0
- package/src/memory/v3/selector.ts +211 -0
- package/src/memory/v3/shadow-plugin.ts +379 -0
- package/src/memory/v3/snapshot.ts +209 -0
- package/src/memory/v3/tree.ts +174 -0
- package/src/memory/v3/types.ts +46 -60
- package/src/memory/v3/working-set.ts +88 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.ts +2 -2
- package/src/messaging/style-analyzer.ts +8 -11
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
- package/src/notifications/adapters/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +30 -8
- package/src/notifications/decision-engine.ts +10 -13
- package/src/notifications/decisions-store.ts +32 -1
- package/src/notifications/deliveries-store.ts +45 -0
- package/src/notifications/edit-notification.ts +201 -0
- package/src/notifications/emit-signal.ts +11 -1
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/notifications/signal.ts +10 -0
- package/src/notifications/types.ts +37 -0
- package/src/oauth/byo-connection.test.ts +67 -3
- package/src/oauth/byo-connection.ts +32 -5
- package/src/oauth/connect-orchestrator.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +76 -0
- package/src/oauth/connection-resolver.ts +49 -10
- package/src/oauth/manual-token-connection.ts +51 -3
- package/src/oauth/seed-providers.ts +3 -0
- package/src/permissions/approval-policy.test.ts +19 -5
- package/src/permissions/approval-policy.ts +14 -3
- package/src/permissions/checker.ts +21 -8
- package/src/permissions/prompter.ts +42 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/platform/client.test.ts +24 -1
- package/src/platform/client.ts +8 -0
- package/src/platform/feature-gate.ts +15 -0
- package/src/plugin-api/index.ts +2 -0
- package/src/plugin-api/types.ts +25 -3
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
- package/src/plugins/defaults/circuit-breaker/package.json +15 -0
- package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +35 -0
- package/src/plugins/defaults/compaction/terminal.ts +73 -0
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +28 -0
- package/src/plugins/defaults/empty-response/terminal.ts +106 -0
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/history-repair/package.json +15 -0
- package/src/plugins/defaults/history-repair/register.ts +24 -0
- package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
- package/src/plugins/defaults/index.ts +29 -40
- package/src/plugins/defaults/injectors/package.json +15 -0
- package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +16 -46
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
- package/src/plugins/defaults/llm-call/package.json +15 -0
- package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
- package/src/plugins/defaults/memory-retrieval/package.json +15 -0
- package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
- package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
- package/src/plugins/defaults/overflow-reduce/package.json +15 -0
- package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
- package/src/plugins/defaults/persistence/package.json +15 -0
- package/src/plugins/defaults/persistence/register.ts +38 -0
- package/src/plugins/defaults/persistence/terminal.ts +83 -0
- package/src/plugins/defaults/title-generate/package.json +15 -0
- package/src/plugins/defaults/title-generate/register.ts +35 -0
- package/src/plugins/defaults/title-generate/terminal.ts +31 -0
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
- package/src/plugins/defaults/token-estimate/package.json +15 -0
- package/src/plugins/defaults/token-estimate/register.ts +34 -0
- package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +35 -0
- package/src/plugins/defaults/tool-error/terminal.ts +47 -0
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
- package/src/plugins/defaults/tool-execute/package.json +15 -0
- package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
- package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +0 -12
- package/src/plugins/types.ts +107 -102
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +0 -1
- package/src/proactive-artifact/job.test.ts +21 -8
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/system-prompt.ts +38 -40
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +10 -10
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/prompts/templates/system-sections.ts +6 -0
- package/src/providers/__tests__/connection-model-compat.test.ts +3 -4
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -25
- package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
- package/src/providers/anthropic/client.ts +24 -5
- package/src/providers/call-site-routing.ts +34 -18
- package/src/providers/connection-model-compat.ts +23 -0
- package/src/providers/connection-resolution.ts +39 -20
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +176 -37
- package/src/providers/gemini/inline-media.ts +74 -0
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
- package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
- package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
- package/src/providers/inference/auth.ts +0 -8
- package/src/providers/inference/connections.ts +3 -66
- package/src/providers/inference/resolve-auth.ts +2 -3
- package/src/providers/model-catalog.ts +35 -1
- package/src/providers/model-intents.ts +3 -3
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -7
- package/src/providers/openai/chat-completions-provider.ts +111 -16
- package/src/providers/openai/codex-models.ts +2 -0
- package/src/providers/openai/responses-provider.ts +54 -57
- package/src/providers/openrouter/client.ts +14 -14
- package/src/providers/provider-send-message.ts +23 -14
- package/src/providers/ratelimit.ts +1 -9
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +16 -9
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/types.ts +20 -2
- package/src/providers/usage-tracking.ts +1 -9
- package/src/runtime/__tests__/agent-wake.test.ts +132 -26
- package/src/runtime/__tests__/background-job-runner.test.ts +2 -3
- package/src/runtime/access-request-helper.ts +1 -0
- package/src/runtime/agent-wake.ts +93 -18
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
- package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
- package/src/runtime/auth/route-policy.ts +42 -1069
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +3 -14
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +70 -5
- package/src/runtime/channel-reply-delivery.ts +23 -0
- package/src/runtime/channel-retry-sweep.ts +59 -30
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/conversation-stream-state.ts +294 -0
- package/src/runtime/http-router.ts +19 -22
- package/src/runtime/http-types.ts +12 -6
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/migrations/vbundle-builder.ts +3 -2
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +436 -0
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +26 -72
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +58 -5
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
- package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
- package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
- package/src/runtime/routes/__tests__/tts-routes.test.ts +3 -3
- package/src/runtime/routes/acp-routes-list.test.ts +3 -0
- package/src/runtime/routes/acp-routes.test.ts +97 -75
- package/src/runtime/routes/acp-routes.ts +29 -6
- package/src/runtime/routes/app-management-routes.ts +208 -28
- package/src/runtime/routes/app-routes.ts +25 -5
- package/src/runtime/routes/approval-routes.ts +16 -4
- package/src/runtime/routes/attachment-routes.ts +25 -1
- package/src/runtime/routes/audio-routes.ts +1 -0
- package/src/runtime/routes/audit-routes.ts +5 -0
- package/src/runtime/routes/auth-routes.ts +5 -0
- package/src/runtime/routes/avatar-routes.ts +238 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +201 -23
- package/src/runtime/routes/backup-routes.ts +45 -0
- package/src/runtime/routes/bookmark-routes.ts +13 -0
- package/src/runtime/routes/brain-graph-routes.ts +9 -0
- package/src/runtime/routes/browser-routes.ts +5 -0
- package/src/runtime/routes/browser-tabs-routes.ts +5 -0
- package/src/runtime/routes/btw-routes.ts +9 -5
- package/src/runtime/routes/cache-routes.ts +13 -0
- package/src/runtime/routes/call-routes.ts +21 -10
- package/src/runtime/routes/channel-availability-routes.ts +5 -1
- package/src/runtime/routes/channel-readiness-routes.ts +37 -4
- package/src/runtime/routes/channel-route-definitions.ts +21 -0
- package/src/runtime/routes/channel-verification-routes.ts +21 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
- package/src/runtime/routes/client-routes.ts +9 -0
- package/src/runtime/routes/consolidation-routes.ts +13 -5
- package/src/runtime/routes/contact-prompt-routes.ts +9 -0
- package/src/runtime/routes/contact-routes.ts +90 -23
- package/src/runtime/routes/content-source-routes.ts +5 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +11 -1
- package/src/runtime/routes/conversation-attention-routes.ts +5 -0
- package/src/runtime/routes/conversation-cli-routes.ts +54 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +292 -0
- package/src/runtime/routes/conversation-list-routes.ts +225 -9
- package/src/runtime/routes/conversation-management-routes.ts +96 -28
- package/src/runtime/routes/conversation-query-routes.ts +148 -51
- package/src/runtime/routes/conversation-routes.ts +259 -158
- package/src/runtime/routes/conversation-starter-routes.ts +22 -13
- package/src/runtime/routes/conversations-import-routes.ts +25 -7
- package/src/runtime/routes/credential-prompt-routes.ts +5 -0
- package/src/runtime/routes/credential-routes.ts +25 -6
- package/src/runtime/routes/debug-bash-routes.ts +5 -0
- package/src/runtime/routes/debug-routes.ts +11 -2
- package/src/runtime/routes/defer-routes.ts +13 -0
- package/src/runtime/routes/diagnostics-routes.ts +37 -46
- package/src/runtime/routes/disk-pressure-routes.ts +17 -31
- package/src/runtime/routes/document-comments-routes.ts +46 -27
- package/src/runtime/routes/documents-routes.ts +31 -11
- package/src/runtime/routes/domain-routes.ts +61 -28
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/events-routes.ts +114 -9
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +5 -0
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +32 -5
- package/src/runtime/routes/guardian-action-routes.ts +9 -0
- package/src/runtime/routes/guardian-approval-interception.ts +0 -31
- package/src/runtime/routes/heartbeat-routes.ts +25 -9
- package/src/runtime/routes/home-feed-routes.ts +149 -16
- package/src/runtime/routes/home-state-routes.ts +8 -40
- package/src/runtime/routes/host-app-control-routes.ts +5 -0
- package/src/runtime/routes/host-bash-routes.ts +5 -0
- package/src/runtime/routes/host-browser-routes.ts +13 -0
- package/src/runtime/routes/host-cu-routes.ts +5 -0
- package/src/runtime/routes/host-file-routes.ts +26 -6
- package/src/runtime/routes/host-transfer-routes.ts +13 -2
- package/src/runtime/routes/http-adapter.ts +1 -2
- package/src/runtime/routes/identity-intro-cache.ts +72 -16
- package/src/runtime/routes/identity-routes.ts +42 -11
- package/src/runtime/routes/image-generation-routes.ts +5 -0
- package/src/runtime/routes/inbound-message-handler.ts +15 -11
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +524 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +72 -27
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
- package/src/runtime/routes/inference-provider-connection-routes.ts +26 -31
- package/src/runtime/routes/inference-send-routes.ts +11 -11
- package/src/runtime/routes/integrations/a2a.ts +30 -7
- package/src/runtime/routes/integrations/slack/channel.ts +19 -3
- package/src/runtime/routes/integrations/slack/share.ts +9 -2
- package/src/runtime/routes/integrations/telegram.ts +28 -9
- package/src/runtime/routes/integrations/twilio.ts +35 -7
- package/src/runtime/routes/integrations/vercel.ts +18 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/llm-context-normalization.ts +7 -2
- package/src/runtime/routes/log-export-routes.ts +28 -10
- package/src/runtime/routes/mcp-auth-routes.ts +25 -0
- package/src/runtime/routes/memory-item-routes.ts +21 -10
- package/src/runtime/routes/memory-v2-routes.ts +90 -36
- package/src/runtime/routes/memory-v3-routes.ts +283 -259
- package/src/runtime/routes/migration-rollback-routes.ts +5 -1
- package/src/runtime/routes/migration-routes.ts +49 -13
- package/src/runtime/routes/notification-routes.ts +80 -2
- package/src/runtime/routes/oauth-apps.ts +33 -11
- package/src/runtime/routes/oauth-commands-routes.ts +43 -15
- package/src/runtime/routes/oauth-connect-routes.ts +9 -0
- package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
- package/src/runtime/routes/oauth-providers.ts +35 -10
- package/src/runtime/routes/platform-routes.ts +21 -0
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
- package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +0 -1
- package/src/runtime/routes/playground/inject-failures.ts +13 -8
- package/src/runtime/routes/playground/reset-circuit.ts +14 -9
- package/src/runtime/routes/playground/seed-conversation.ts +1 -1
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
- package/src/runtime/routes/playground/state.ts +4 -3
- package/src/runtime/routes/plugins-routes.ts +22 -19
- package/src/runtime/routes/profiler-routes.ts +17 -4
- package/src/runtime/routes/ps-routes.ts +5 -0
- package/src/runtime/routes/publish-routes.ts +13 -3
- package/src/runtime/routes/question-routes.ts +5 -0
- package/src/runtime/routes/recording-routes.ts +25 -12
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +137 -47
- package/src/runtime/routes/secret-routes.ts +17 -4
- package/src/runtime/routes/sequence-routes.ts +33 -0
- package/src/runtime/routes/settings-routes.ts +65 -19
- package/src/runtime/routes/skills-routes.ts +133 -69
- package/src/runtime/routes/slack-channel-routes.ts +5 -0
- package/src/runtime/routes/stt-routes.ts +13 -6
- package/src/runtime/routes/subagents-routes.ts +24 -18
- package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
- package/src/runtime/routes/surface-action-routes.ts +10 -38
- package/src/runtime/routes/surface-content-routes.ts +21 -6
- package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +5 -0
- package/src/runtime/routes/tts-routes.ts +13 -6
- package/src/runtime/routes/types.ts +17 -8
- package/src/runtime/routes/ui-request-routes.ts +5 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
- package/src/runtime/routes/usage-routes.ts +71 -3
- package/src/runtime/routes/user-routes-cli.ts +9 -0
- package/src/runtime/routes/user-routes.ts +5 -1
- package/src/runtime/routes/wake-conversation-routes.ts +5 -0
- package/src/runtime/routes/watcher-routes.ts +21 -0
- package/src/runtime/routes/webhook-routes.ts +9 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +8 -0
- package/src/runtime/routes/work-items-routes.ts +47 -19
- package/src/runtime/routes/workspace-commit-routes.ts +5 -0
- package/src/runtime/routes/workspace-routes.test.ts +42 -0
- package/src/runtime/routes/workspace-routes.ts +120 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +4 -4
- package/src/runtime/services/analyze-conversation.ts +3 -6
- package/src/runtime/services/conversation-serializer.ts +24 -2
- package/src/runtime/slack-dm-text-delivery.ts +177 -0
- package/src/runtime/sync/resource-sync-events.ts +17 -3
- package/src/runtime/sync/sync-publisher.ts +2 -2
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- package/src/schedule/run-script.ts +28 -3
- package/src/schedule/schedule-store.ts +16 -1
- package/src/schedule/scheduler.ts +114 -16
- package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
- package/src/security/encrypted-store.ts +7 -16
- package/src/security/store-path-override.ts +61 -0
- package/src/signals/user-message.ts +10 -16
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/clawhub-files.ts +2 -0
- package/src/skills/skillssh-files.ts +2 -0
- package/src/skills/validate-input.ts +177 -0
- package/src/subagent/manager.ts +16 -19
- package/src/subagent/types.ts +6 -0
- package/src/tasks/tool-sanitizer.ts +2 -2
- package/src/telemetry/types.ts +26 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
- package/src/telemetry/usage-telemetry-reporter.ts +31 -0
- package/src/tools/acp/spawn.test.ts +88 -38
- package/src/tools/apps/definitions.ts +42 -24
- package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
- package/src/tools/ask-question/ask-question-tool.ts +85 -90
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/computer-use/definitions.ts +295 -289
- package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
- package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
- package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
- package/src/tools/credentials/vault.ts +112 -111
- package/src/tools/document/document-tool.ts +131 -8
- package/src/tools/execution-target.ts +3 -6
- package/src/tools/execution-timeout.ts +3 -4
- package/src/tools/executor.ts +18 -55
- package/src/tools/filesystem/edit.ts +45 -42
- package/src/tools/filesystem/list.ts +33 -30
- package/src/tools/filesystem/read.ts +54 -35
- package/src/tools/filesystem/write.ts +34 -31
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/edit.ts +44 -42
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/read.ts +49 -35
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/transfer.ts +121 -108
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/host-filesystem/write.ts +33 -31
- package/src/tools/host-terminal/host-shell.ts +50 -48
- package/src/tools/mcp/mcp-tool-factory.ts +0 -2
- package/src/tools/memory/register.ts +23 -24
- package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
- package/src/tools/network/__tests__/web-search.test.ts +211 -3
- package/src/tools/network/managed-search-proxy.ts +183 -0
- package/src/tools/network/web-fetch.ts +49 -46
- package/src/tools/network/web-search.ts +215 -57
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +184 -118
- package/src/tools/schedule/create.ts +12 -1
- package/src/tools/schedule/update.ts +16 -0
- package/src/tools/shared/filesystem/audio-read.ts +122 -0
- package/src/tools/shared/filesystem/image-read.ts +1 -1
- package/src/tools/skills/execute.ts +34 -31
- package/src/tools/skills/load.ts +29 -23
- package/src/tools/skills/skill-tool-factory.ts +17 -36
- package/src/tools/subagent/notify-parent.ts +35 -32
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-defaults.ts +20 -9
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +86 -33
- package/src/tools/ui-surface/definitions.ts +166 -94
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/usage/types.ts +10 -0
- package/src/util/browser.ts +7 -2
- package/src/util/errors.ts +2 -2
- package/src/util/map-limit.ts +27 -0
- package/src/util/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
- package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
- package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
- package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
- package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
- package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
- package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -344
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -468
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
- package/src/memory/v3/__tests__/edges.test.ts +0 -563
- package/src/memory/v3/__tests__/filter.test.ts +0 -512
- package/src/memory/v3/__tests__/gate.test.ts +0 -574
- package/src/memory/v3/__tests__/index-composition.test.ts +0 -233
- package/src/memory/v3/__tests__/loop.test.ts +0 -530
- package/src/memory/v3/__tests__/retriever.test.ts +0 -226
- package/src/memory/v3/__tests__/scouts.test.ts +0 -440
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -312
- package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
- package/src/memory/v3/__tests__/traversal.test.ts +0 -469
- package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
- package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
- package/src/memory/v3/__tests__/tree-walk.test.ts +0 -707
- package/src/memory/v3/__tests__/validate.test.ts +0 -245
- package/src/memory/v3/auto-edges.ts +0 -223
- package/src/memory/v3/coactivation-store.ts +0 -124
- package/src/memory/v3/consolidation-job.ts +0 -323
- package/src/memory/v3/edge-learning-job.ts +0 -160
- package/src/memory/v3/edges.ts +0 -249
- package/src/memory/v3/filter.ts +0 -281
- package/src/memory/v3/gate.ts +0 -334
- package/src/memory/v3/index-composition.ts +0 -113
- package/src/memory/v3/llm-capture.ts +0 -46
- package/src/memory/v3/loop.ts +0 -382
- package/src/memory/v3/maintenance.ts +0 -144
- package/src/memory/v3/prompt-context.ts +0 -33
- package/src/memory/v3/prompts/consolidation.ts +0 -458
- package/src/memory/v3/prompts/system-prompts.ts +0 -196
- package/src/memory/v3/retriever.ts +0 -33
- package/src/memory/v3/scouts.ts +0 -420
- package/src/memory/v3/shadow-middleware.ts +0 -305
- package/src/memory/v3/traversal.ts +0 -206
- package/src/memory/v3/tree-index.ts +0 -237
- package/src/memory/v3/tree-store.ts +0 -394
- package/src/memory/v3/tree-walk.ts +0 -351
- package/src/memory/v3/validate.ts +0 -300
- package/src/plugins/defaults/circuit-breaker.ts +0 -141
- package/src/plugins/defaults/compaction.ts +0 -141
- package/src/plugins/defaults/empty-response.ts +0 -124
- package/src/plugins/defaults/history-repair.ts +0 -83
- package/src/plugins/defaults/persistence.ts +0 -127
- package/src/plugins/defaults/title-generate.ts +0 -90
- package/src/plugins/defaults/token-estimate.ts +0 -101
- package/src/plugins/defaults/tool-error.ts +0 -119
- package/src/plugins/defaults/tool-result-truncate.ts +0 -84
package/src/tools/registry.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import type { ToolDefinition } from "../providers/types.js";
|
|
2
1
|
import { getLogger } from "../util/logger.js";
|
|
3
2
|
import { coreAppProxyTools } from "./apps/definitions.js";
|
|
4
3
|
import { registerAppTools } from "./apps/registry.js";
|
|
5
|
-
import { allComputerUseTools } from "./computer-use/definitions.js";
|
|
6
4
|
import { hostFileEditTool } from "./host-filesystem/edit.js";
|
|
7
5
|
import { hostFileReadTool } from "./host-filesystem/read.js";
|
|
8
6
|
import { hostFileTransferTool } from "./host-filesystem/transfer.js";
|
|
@@ -10,7 +8,8 @@ import { hostFileWriteTool } from "./host-filesystem/write.js";
|
|
|
10
8
|
import { hostShellTool } from "./host-terminal/host-shell.js";
|
|
11
9
|
import { toProviderSafeToolName } from "./provider-tool-name.js";
|
|
12
10
|
import { registerSystemTools } from "./system/register.js";
|
|
13
|
-
import
|
|
11
|
+
import { finalizeTool } from "./tool-defaults.js";
|
|
12
|
+
import type { OwnerInfo, Tool, ToolDefinition } from "./types.js";
|
|
14
13
|
import { allUiSurfaceTools } from "./ui-surface/definitions.js";
|
|
15
14
|
import { registerUiSurfaceTools } from "./ui-surface/registry.js";
|
|
16
15
|
|
|
@@ -18,6 +17,15 @@ const log = getLogger("tool-registry");
|
|
|
18
17
|
|
|
19
18
|
const tools = new Map<string, Tool>();
|
|
20
19
|
|
|
20
|
+
// Authoritative map of tool ownership, keyed by tool name. Populated by the
|
|
21
|
+
// `register*` functions and read by `getToolOwner()`. Lives on the registry
|
|
22
|
+
// (not on the `Tool` object) so callers cannot spoof ownership by writing a
|
|
23
|
+
// field on the manifest — the only way to claim a tool is to go through a
|
|
24
|
+
// `register*` function, which stamps the owner from its arguments. Core
|
|
25
|
+
// tools intentionally have no entry here; `getToolOwner` returns `undefined`
|
|
26
|
+
// for them.
|
|
27
|
+
const ownersByName = new Map<string, OwnerInfo>();
|
|
28
|
+
|
|
21
29
|
// ── External tool registry ───────────────────────────────────────────
|
|
22
30
|
// Skills register their tools here at initialization time so the tool
|
|
23
31
|
// manifest can include them without importing from `../skills/`.
|
|
@@ -28,7 +36,10 @@ const tools = new Map<string, Tool>();
|
|
|
28
36
|
// feature-flag check until after the daemon has run
|
|
29
37
|
// `mergeDefaultWorkspaceConfig()`, so skills see the merged config
|
|
30
38
|
// instead of forcing an early `loadConfig()` against unmerged defaults.
|
|
31
|
-
const externalToolProviders: Array<
|
|
39
|
+
const externalToolProviders: Array<{
|
|
40
|
+
owner: OwnerInfo;
|
|
41
|
+
provider: () => Tool[];
|
|
42
|
+
}> = [];
|
|
32
43
|
|
|
33
44
|
/**
|
|
34
45
|
* Register tools provided by an external skill. Called during skill
|
|
@@ -44,20 +55,30 @@ const externalToolProviders: Array<() => Tool[]> = [];
|
|
|
44
55
|
* dependency: skills/load.ts → … → meet-join/register.ts → tool-manifest.ts
|
|
45
56
|
* → skills/load.ts. Keeping it here lets external skill bootstraps import
|
|
46
57
|
* from registry.ts, which is already a leaf in the dependency graph.
|
|
58
|
+
*
|
|
59
|
+
* `owner` records which extension produced these tools — typed
|
|
60
|
+
* {@link OwnerInfo} so ownership flows through `ownersByName` at
|
|
61
|
+
* `initializeTools()` time, the same way `register*` registers it for
|
|
62
|
+
* IPC-loaded tools. Eager (boot-time) skill bootstraps go through this
|
|
63
|
+
* path rather than `registerSkillTools`, so this is where their owner
|
|
64
|
+
* lookup gets established.
|
|
47
65
|
*/
|
|
48
66
|
export function registerExternalTools(
|
|
67
|
+
owner: OwnerInfo,
|
|
49
68
|
toolsOrProvider: Tool[] | (() => Tool[]),
|
|
50
69
|
): void {
|
|
51
70
|
const provider =
|
|
52
71
|
typeof toolsOrProvider === "function"
|
|
53
72
|
? toolsOrProvider
|
|
54
73
|
: () => toolsOrProvider;
|
|
55
|
-
externalToolProviders.push(provider);
|
|
74
|
+
externalToolProviders.push({ owner, provider });
|
|
56
75
|
}
|
|
57
76
|
|
|
58
|
-
/** Return all externally registered tools. */
|
|
59
|
-
function getExternalTools(): Tool
|
|
60
|
-
return externalToolProviders.flatMap((provider) =>
|
|
77
|
+
/** Return all externally registered tools paired with their owners. */
|
|
78
|
+
function getExternalTools(): Array<{ owner: OwnerInfo; tool: Tool }> {
|
|
79
|
+
return externalToolProviders.flatMap(({ owner, provider }) =>
|
|
80
|
+
provider().map((tool) => ({ owner, tool })),
|
|
81
|
+
);
|
|
61
82
|
}
|
|
62
83
|
|
|
63
84
|
// Snapshot of core tools captured after initializeTools() completes.
|
|
@@ -76,6 +97,27 @@ const skillRefCount = new Map<string, number>();
|
|
|
76
97
|
// separate and covers the case of two extensions choosing the same tool name.
|
|
77
98
|
const pluginRefCount = new Map<string, number>();
|
|
78
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Format an owner for log messages and error strings. Returns a stable
|
|
102
|
+
* human-readable description (e.g. `skill "deploy"`, `plugin "weather"`,
|
|
103
|
+
* `MCP server "github"`). When an owner is missing (core tool) or has an
|
|
104
|
+
* unrecognized kind, returns a fallback string so log/error sites never
|
|
105
|
+
* produce `undefined` interpolations.
|
|
106
|
+
*/
|
|
107
|
+
function describeOwner(owner: OwnerInfo | undefined): string {
|
|
108
|
+
if (!owner) return "core tool";
|
|
109
|
+
switch (owner.kind) {
|
|
110
|
+
case "skill":
|
|
111
|
+
return `skill "${owner.id}"`;
|
|
112
|
+
case "plugin":
|
|
113
|
+
return `plugin "${owner.id}"`;
|
|
114
|
+
case "mcp":
|
|
115
|
+
return `MCP server "${owner.id}"`;
|
|
116
|
+
default:
|
|
117
|
+
return `${(owner as OwnerInfo).kind}-origin tool`;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
79
121
|
function withProviderSafeToolName(tool: Tool): Tool {
|
|
80
122
|
const safeName = toProviderSafeToolName(tool.name);
|
|
81
123
|
if (safeName === tool.name) {
|
|
@@ -88,14 +130,34 @@ function withProviderSafeToolName(tool: Tool): Tool {
|
|
|
88
130
|
};
|
|
89
131
|
}
|
|
90
132
|
|
|
91
|
-
|
|
92
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Memoize `finalizeTool(definition, name)` by the definition reference so
|
|
135
|
+
* idempotent re-registration (test reset helpers, module re-imports) stays a
|
|
136
|
+
* silent no-op — the same `ToolDefinition` always finalizes to the same `Tool`
|
|
137
|
+
* instance, and the existing `existing === tool` short-circuit below keeps
|
|
138
|
+
* working.
|
|
139
|
+
*/
|
|
140
|
+
const finalizedByDefinition = new WeakMap<ToolDefinition, Tool>();
|
|
141
|
+
|
|
142
|
+
export function registerTool(definition: ToolDefinition): void {
|
|
143
|
+
const name = definition.name;
|
|
144
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
145
|
+
throw new Error(
|
|
146
|
+
"registerTool: tool.name is required — set it on the literal or finalize through `finalizeTool(def, name)` first",
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
let tool = finalizedByDefinition.get(definition);
|
|
150
|
+
if (!tool) {
|
|
151
|
+
tool = finalizeTool(definition, name);
|
|
152
|
+
finalizedByDefinition.set(definition, tool);
|
|
153
|
+
}
|
|
154
|
+
const existing = tools.get(name);
|
|
93
155
|
if (existing) {
|
|
94
|
-
if (existing === tool) return; // same
|
|
95
|
-
log.warn({ name
|
|
156
|
+
if (existing === tool) return; // same definition re-registered, skip
|
|
157
|
+
log.warn({ name }, "Tool already registered, overwriting");
|
|
96
158
|
}
|
|
97
|
-
tools.set(
|
|
98
|
-
log.info({ name
|
|
159
|
+
tools.set(name, tool);
|
|
160
|
+
log.info({ name, category: tool.category }, "Tool registered");
|
|
99
161
|
}
|
|
100
162
|
|
|
101
163
|
export function getTool(name: string): Tool | undefined {
|
|
@@ -107,98 +169,98 @@ export function getAllTools(): Tool[] {
|
|
|
107
169
|
}
|
|
108
170
|
|
|
109
171
|
/**
|
|
110
|
-
*
|
|
172
|
+
* Return the recorded owner for a tool, or `undefined` if the tool is
|
|
173
|
+
* core-origin (no owner) or unknown. Consumers that need to gate behavior on
|
|
174
|
+
* which extension contributed a tool (permissions checker, approval-handler
|
|
175
|
+
* load hints, conversation-skill-tools projection) call this rather than
|
|
176
|
+
* reading owner off the `Tool` object — the registry is the single source of
|
|
177
|
+
* truth for ownership.
|
|
178
|
+
*/
|
|
179
|
+
export function getToolOwner(name: string): OwnerInfo | undefined {
|
|
180
|
+
return ownersByName.get(name);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Register multiple skill-origin tools owned by `skillId`.
|
|
185
|
+
*
|
|
111
186
|
* Skips any tool whose name collides with a core tool (logs a warning instead
|
|
112
187
|
* of throwing so the remaining tools in the batch still get registered).
|
|
113
188
|
* Throws if a tool name collides with a skill tool owned by a different skill.
|
|
114
|
-
* Allows replacement when the incoming tool has the same
|
|
115
|
-
* which supports hot-reloading a skill without tearing
|
|
189
|
+
* Allows replacement when the incoming tool has the same skill owner id as
|
|
190
|
+
* the existing one, which supports hot-reloading a skill without tearing
|
|
191
|
+
* down first.
|
|
192
|
+
*
|
|
193
|
+
* Ownership is recorded in {@link ownersByName} keyed by tool name; the
|
|
194
|
+
* `Tool` object itself carries no owner metadata, so callers cannot spoof
|
|
195
|
+
* ownership by writing fields on the manifest.
|
|
116
196
|
*/
|
|
117
|
-
export function registerSkillTools(newTools: Tool[]): Tool[] {
|
|
197
|
+
export function registerSkillTools(skillId: string, newTools: Tool[]): Tool[] {
|
|
118
198
|
// Filter out tools that collide with core tools, and validate the rest.
|
|
119
199
|
const accepted: Tool[] = [];
|
|
120
200
|
for (const tool of newTools) {
|
|
121
201
|
const existing = tools.get(tool.name);
|
|
122
202
|
if (existing) {
|
|
123
|
-
const existingIsCore =
|
|
203
|
+
const existingIsCore = !ownersByName.has(tool.name);
|
|
124
204
|
if (existingIsCore) {
|
|
125
205
|
log.warn(
|
|
126
|
-
{ toolName: tool.name,
|
|
127
|
-
`Skill "${
|
|
206
|
+
{ toolName: tool.name, ownerSkillId: skillId },
|
|
207
|
+
`Skill "${skillId}" tried to register tool "${tool.name}" which conflicts with a core tool. Skipping.`,
|
|
128
208
|
);
|
|
129
209
|
continue;
|
|
130
210
|
}
|
|
131
|
-
// Existing is from a different
|
|
211
|
+
// Existing is from a different owner (plugin/mcp) or a different
|
|
132
212
|
// skill — skill tools can only replace themselves (hot-reload).
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
) {
|
|
137
|
-
const owner =
|
|
138
|
-
existing.origin === "skill"
|
|
139
|
-
? `skill "${existing.ownerSkillId}"`
|
|
140
|
-
: existing.origin === "plugin"
|
|
141
|
-
? `plugin "${existing.ownerPluginId}"`
|
|
142
|
-
: existing.origin === "mcp"
|
|
143
|
-
? `MCP server "${existing.ownerMcpServerId}"`
|
|
144
|
-
: `${existing.origin ?? "unknown"}-origin tool`;
|
|
213
|
+
const existingOwner = ownersByName.get(tool.name);
|
|
214
|
+
const existingSkillId =
|
|
215
|
+
existingOwner?.kind === "skill" ? existingOwner.id : undefined;
|
|
216
|
+
if (existingOwner?.kind !== "skill" || existingSkillId !== skillId) {
|
|
145
217
|
throw new Error(
|
|
146
|
-
`Skill tool "${tool.name}" is already registered by ${
|
|
218
|
+
`Skill tool "${tool.name}" is already registered by ${describeOwner(existingOwner)}`,
|
|
147
219
|
);
|
|
148
220
|
}
|
|
149
221
|
}
|
|
150
222
|
accepted.push(tool);
|
|
151
223
|
}
|
|
152
224
|
|
|
153
|
-
// Collect unique skill IDs from the batch to bump ref counts
|
|
154
|
-
const skillIds = new Set<string>();
|
|
155
225
|
for (const tool of accepted) {
|
|
156
226
|
tools.set(tool.name, tool);
|
|
157
|
-
|
|
227
|
+
ownersByName.set(tool.name, { kind: "skill", id: skillId });
|
|
158
228
|
log.info(
|
|
159
|
-
{ name: tool.name, ownerSkillId:
|
|
229
|
+
{ name: tool.name, ownerSkillId: skillId },
|
|
160
230
|
"Skill tool registered",
|
|
161
231
|
);
|
|
162
232
|
}
|
|
163
233
|
|
|
164
|
-
|
|
165
|
-
skillRefCount.set(
|
|
234
|
+
if (accepted.length > 0) {
|
|
235
|
+
skillRefCount.set(skillId, (skillRefCount.get(skillId) ?? 0) + 1);
|
|
166
236
|
}
|
|
167
237
|
|
|
168
238
|
return accepted;
|
|
169
239
|
}
|
|
170
240
|
|
|
171
241
|
/**
|
|
172
|
-
* Register tools contributed by
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
*
|
|
242
|
+
* Register tools contributed by the plugin named `pluginName`. Records the
|
|
243
|
+
* plugin owner in {@link ownersByName} keyed by tool name — ownership lives
|
|
244
|
+
* on the registry, never on the `Tool` object itself, so the bootstrap
|
|
245
|
+
* cannot be spoofed into claiming tools on behalf of an unrelated extension
|
|
246
|
+
* by forging fields on the manifest. Plugin ownership is tracked in a
|
|
247
|
+
* namespace disjoint from skill tools: if a plugin's `manifest.name`
|
|
248
|
+
* happens to match a skill id, the two do not share refcount state or
|
|
249
|
+
* conflict-detection paths.
|
|
177
250
|
*
|
|
178
251
|
* Conflict handling mirrors {@link registerSkillTools}: collisions with core
|
|
179
252
|
* tools log a warning and skip; collisions with tools owned by a different
|
|
180
253
|
* plugin, skill, or MCP server throw; re-registering the same plugin's own
|
|
181
254
|
* tool (hot reload) is allowed.
|
|
182
|
-
*
|
|
183
|
-
* The stamp is authoritative: any pre-existing `origin` / `ownerPluginId` /
|
|
184
|
-
* `ownerSkillId` / `ownerMcpServerId` fields on the incoming tools are
|
|
185
|
-
* overwritten so the bootstrap cannot be spoofed into claiming tools on
|
|
186
|
-
* behalf of an unrelated extension.
|
|
187
255
|
*/
|
|
188
256
|
export function registerPluginTools(
|
|
189
257
|
pluginName: string,
|
|
190
|
-
newTools:
|
|
258
|
+
newTools: Tool[],
|
|
191
259
|
): Tool[] {
|
|
192
260
|
const stamped: Tool[] = newTools.map((pluginTool) => {
|
|
193
261
|
const tool: Tool = {
|
|
194
262
|
...pluginTool,
|
|
195
263
|
category: "plugin",
|
|
196
|
-
origin: "plugin" as const,
|
|
197
|
-
ownerPluginId: pluginName,
|
|
198
|
-
ownerSkillId: undefined,
|
|
199
|
-
ownerMcpServerId: undefined,
|
|
200
|
-
ownerSkillBundled: undefined,
|
|
201
|
-
ownerSkillVersionHash: undefined,
|
|
202
264
|
};
|
|
203
265
|
return withProviderSafeToolName(tool);
|
|
204
266
|
});
|
|
@@ -207,25 +269,26 @@ export function registerPluginTools(
|
|
|
207
269
|
for (const tool of stamped) {
|
|
208
270
|
const existing = tools.get(tool.name);
|
|
209
271
|
if (existing) {
|
|
210
|
-
const existingIsCore =
|
|
272
|
+
const existingIsCore = !ownersByName.has(tool.name);
|
|
211
273
|
if (existingIsCore) {
|
|
212
274
|
log.warn(
|
|
213
|
-
{ toolName: tool.name, pluginName },
|
|
275
|
+
{ toolName: tool.name, ownerPluginId: pluginName },
|
|
214
276
|
`Plugin "${pluginName}" tried to register tool "${tool.name}" which conflicts with a core tool. Skipping.`,
|
|
215
277
|
);
|
|
216
278
|
continue;
|
|
217
279
|
}
|
|
218
|
-
|
|
219
|
-
|
|
280
|
+
const existingOwner = ownersByName.get(tool.name);
|
|
281
|
+
if (existingOwner?.kind === "plugin") {
|
|
282
|
+
if (existingOwner.id !== pluginName) {
|
|
220
283
|
throw new Error(
|
|
221
|
-
`Plugin tool "${tool.name}" is already registered by plugin "${
|
|
284
|
+
`Plugin tool "${tool.name}" is already registered by plugin "${existingOwner.id}"`,
|
|
222
285
|
);
|
|
223
286
|
}
|
|
224
287
|
// Same plugin re-registering its own tool (hot reload) — allow.
|
|
225
288
|
} else {
|
|
226
289
|
// Conflict with a skill or MCP-owned tool.
|
|
227
290
|
throw new Error(
|
|
228
|
-
`Plugin "${pluginName}" tried to register tool "${tool.name}" which conflicts with
|
|
291
|
+
`Plugin "${pluginName}" tried to register tool "${tool.name}" which conflicts with ${describeOwner(existingOwner)}`,
|
|
229
292
|
);
|
|
230
293
|
}
|
|
231
294
|
}
|
|
@@ -234,8 +297,9 @@ export function registerPluginTools(
|
|
|
234
297
|
|
|
235
298
|
for (const tool of accepted) {
|
|
236
299
|
tools.set(tool.name, tool);
|
|
300
|
+
ownersByName.set(tool.name, { kind: "plugin", id: pluginName });
|
|
237
301
|
log.info(
|
|
238
|
-
{ name: tool.name, ownerPluginId:
|
|
302
|
+
{ name: tool.name, ownerPluginId: pluginName },
|
|
239
303
|
"Plugin tool registered",
|
|
240
304
|
);
|
|
241
305
|
}
|
|
@@ -264,10 +328,11 @@ export function unregisterPluginTools(pluginName: string): void {
|
|
|
264
328
|
}
|
|
265
329
|
|
|
266
330
|
pluginRefCount.delete(pluginName);
|
|
267
|
-
for (const [name,
|
|
268
|
-
if (
|
|
331
|
+
for (const [name, owner] of ownersByName) {
|
|
332
|
+
if (owner.kind === "plugin" && owner.id === pluginName) {
|
|
269
333
|
tools.delete(name);
|
|
270
|
-
|
|
334
|
+
ownersByName.delete(name);
|
|
335
|
+
log.info({ name, ownerPluginId: pluginName }, "Plugin tool unregistered");
|
|
271
336
|
}
|
|
272
337
|
}
|
|
273
338
|
}
|
|
@@ -296,60 +361,52 @@ export function unregisterSkillTools(skillId: string): void {
|
|
|
296
361
|
|
|
297
362
|
// Last reference - actually remove the tools
|
|
298
363
|
skillRefCount.delete(skillId);
|
|
299
|
-
for (const [name,
|
|
300
|
-
if (
|
|
364
|
+
for (const [name, owner] of ownersByName) {
|
|
365
|
+
if (owner.kind === "skill" && owner.id === skillId) {
|
|
301
366
|
tools.delete(name);
|
|
302
|
-
|
|
367
|
+
ownersByName.delete(name);
|
|
368
|
+
log.info({ name, ownerSkillId: skillId }, "Skill tool unregistered");
|
|
303
369
|
}
|
|
304
370
|
}
|
|
305
371
|
}
|
|
306
372
|
|
|
307
373
|
/**
|
|
308
|
-
* Register multiple MCP-origin tools
|
|
374
|
+
* Register multiple MCP-origin tools owned by the MCP server `serverId`.
|
|
375
|
+
*
|
|
309
376
|
* Skips any tool whose name collides with a core tool (logs a warning).
|
|
310
377
|
* Throws if a tool name collides with a tool owned by a different MCP server.
|
|
378
|
+
*
|
|
379
|
+
* Ownership is recorded in {@link ownersByName} keyed by tool name; the
|
|
380
|
+
* `Tool` object itself carries no owner metadata.
|
|
311
381
|
*/
|
|
312
|
-
export function registerMcpTools(newTools: Tool[]): Tool[] {
|
|
382
|
+
export function registerMcpTools(serverId: string, newTools: Tool[]): Tool[] {
|
|
313
383
|
const accepted: Tool[] = [];
|
|
314
384
|
for (const tool of newTools) {
|
|
315
385
|
const existing = tools.get(tool.name);
|
|
316
386
|
if (existing) {
|
|
317
|
-
const existingIsCore =
|
|
387
|
+
const existingIsCore = !ownersByName.has(tool.name);
|
|
318
388
|
if (existingIsCore) {
|
|
319
389
|
log.warn(
|
|
320
|
-
{ toolName: tool.name,
|
|
321
|
-
`MCP server "${
|
|
390
|
+
{ toolName: tool.name, ownerMcpServerId: serverId },
|
|
391
|
+
`MCP server "${serverId}" tried to register tool "${tool.name}" which conflicts with a core tool. Skipping.`,
|
|
322
392
|
);
|
|
323
393
|
continue;
|
|
324
394
|
}
|
|
325
|
-
|
|
395
|
+
const existingOwner = ownersByName.get(tool.name);
|
|
396
|
+
if (existingOwner?.kind === "skill" || existingOwner?.kind === "plugin") {
|
|
326
397
|
log.warn(
|
|
327
398
|
{
|
|
328
399
|
toolName: tool.name,
|
|
329
|
-
|
|
330
|
-
|
|
400
|
+
ownerMcpServerId: serverId,
|
|
401
|
+
existingOwner,
|
|
331
402
|
},
|
|
332
|
-
`MCP server "${
|
|
403
|
+
`MCP server "${serverId}" tried to register tool "${tool.name}" which conflicts with ${describeOwner(existingOwner)}. Skipping.`,
|
|
333
404
|
);
|
|
334
405
|
continue;
|
|
335
406
|
}
|
|
336
|
-
if (
|
|
337
|
-
log.warn(
|
|
338
|
-
{
|
|
339
|
-
toolName: tool.name,
|
|
340
|
-
serverId: tool.ownerMcpServerId,
|
|
341
|
-
pluginName: existing.ownerPluginId,
|
|
342
|
-
},
|
|
343
|
-
`MCP server "${tool.ownerMcpServerId}" tried to register tool "${tool.name}" which conflicts with plugin tool from "${existing.ownerPluginId}". Skipping.`,
|
|
344
|
-
);
|
|
345
|
-
continue;
|
|
346
|
-
}
|
|
347
|
-
if (
|
|
348
|
-
existing.origin === "mcp" &&
|
|
349
|
-
existing.ownerMcpServerId !== tool.ownerMcpServerId
|
|
350
|
-
) {
|
|
407
|
+
if (existingOwner?.kind === "mcp" && existingOwner.id !== serverId) {
|
|
351
408
|
throw new Error(
|
|
352
|
-
`MCP tool "${tool.name}" is already registered by MCP server "${
|
|
409
|
+
`MCP tool "${tool.name}" is already registered by MCP server "${existingOwner.id}"`,
|
|
353
410
|
);
|
|
354
411
|
}
|
|
355
412
|
}
|
|
@@ -358,8 +415,9 @@ export function registerMcpTools(newTools: Tool[]): Tool[] {
|
|
|
358
415
|
|
|
359
416
|
for (const tool of accepted) {
|
|
360
417
|
tools.set(tool.name, tool);
|
|
418
|
+
ownersByName.set(tool.name, { kind: "mcp", id: serverId });
|
|
361
419
|
log.info(
|
|
362
|
-
{ name: tool.name, ownerMcpServerId:
|
|
420
|
+
{ name: tool.name, ownerMcpServerId: serverId },
|
|
363
421
|
"MCP tool registered",
|
|
364
422
|
);
|
|
365
423
|
}
|
|
@@ -371,9 +429,10 @@ export function registerMcpTools(newTools: Tool[]): Tool[] {
|
|
|
371
429
|
* Unregister all MCP-origin tools from the registry.
|
|
372
430
|
*/
|
|
373
431
|
export function unregisterAllMcpTools(): void {
|
|
374
|
-
for (const [name,
|
|
375
|
-
if (
|
|
432
|
+
for (const [name, owner] of ownersByName) {
|
|
433
|
+
if (owner.kind === "mcp") {
|
|
376
434
|
tools.delete(name);
|
|
435
|
+
ownersByName.delete(name);
|
|
377
436
|
log.info({ name }, "MCP tool unregistered (reload)");
|
|
378
437
|
}
|
|
379
438
|
}
|
|
@@ -384,8 +443,10 @@ export function unregisterAllMcpTools(): void {
|
|
|
384
443
|
* Used by the session resolver to dynamically pick up MCP tools that
|
|
385
444
|
* were registered after session creation (e.g. via `vellum mcp reload`).
|
|
386
445
|
*/
|
|
387
|
-
export function getMcpToolDefinitions():
|
|
388
|
-
return Array.from(tools.values()).filter(
|
|
446
|
+
export function getMcpToolDefinitions(): Tool[] {
|
|
447
|
+
return Array.from(tools.values()).filter(
|
|
448
|
+
(t) => ownersByName.get(t.name)?.kind === "mcp",
|
|
449
|
+
);
|
|
389
450
|
}
|
|
390
451
|
|
|
391
452
|
/**
|
|
@@ -393,7 +454,7 @@ export function getMcpToolDefinitions(): ToolDefinition[] {
|
|
|
393
454
|
*/
|
|
394
455
|
export function getSkillToolNames(): string[] {
|
|
395
456
|
return Array.from(tools.values())
|
|
396
|
-
.filter((t) => t.
|
|
457
|
+
.filter((t) => ownersByName.get(t.name)?.kind === "skill")
|
|
397
458
|
.map((t) => t.name);
|
|
398
459
|
}
|
|
399
460
|
|
|
@@ -404,16 +465,14 @@ export function getSkillRefCount(skillId: string): number {
|
|
|
404
465
|
return skillRefCount.get(skillId) ?? 0;
|
|
405
466
|
}
|
|
406
467
|
|
|
407
|
-
export function getAllToolDefinitions():
|
|
408
|
-
// Exclude proxy tools (e.g. computer_use_* tools) - they are projected
|
|
409
|
-
// into sessions by the skill system, not via the global tool list.
|
|
468
|
+
export function getAllToolDefinitions(): Tool[] {
|
|
410
469
|
// Exclude skill-origin tools - they are managed by the session-level
|
|
411
470
|
// skill projection system (projectSkillTools) and must not leak into
|
|
412
471
|
// the base tool list, which is shared across sessions via the global
|
|
413
472
|
// registry. Including them here causes "Tool names must be unique"
|
|
414
473
|
// errors when the projection appends the same tools a second time.
|
|
415
474
|
return getAllTools().filter(
|
|
416
|
-
(t) =>
|
|
475
|
+
(t) => ownersByName.get(t.name)?.kind !== "skill",
|
|
417
476
|
);
|
|
418
477
|
}
|
|
419
478
|
|
|
@@ -442,10 +501,13 @@ export async function initializeTools(): Promise<void> {
|
|
|
442
501
|
// External skill tools — registered by skill bootstrap modules via
|
|
443
502
|
// `registerExternalTools()`. Called at init time (not spread into
|
|
444
503
|
// `explicitTools`) so registrations that happen between module-load
|
|
445
|
-
// and `initializeTools()` are picked up.
|
|
446
|
-
|
|
447
|
-
|
|
504
|
+
// and `initializeTools()` are picked up. Each provider pairs its tools
|
|
505
|
+
// with an OwnerInfo so the registry can record ownership in
|
|
506
|
+
// {@link ownersByName} alongside the bare `registerTool()` install.
|
|
507
|
+
const extEntries = getExternalTools();
|
|
508
|
+
for (const { owner, tool } of extEntries) {
|
|
448
509
|
registerTool(tool);
|
|
510
|
+
ownersByName.set(tool.name, owner);
|
|
449
511
|
}
|
|
450
512
|
|
|
451
513
|
// Host tools are registered explicitly so host access stays opt-in until
|
|
@@ -480,21 +542,23 @@ export async function initializeTools(): Promise<void> {
|
|
|
480
542
|
// registered external skill tool). This handles ESM cache hits where
|
|
481
543
|
// eager-module tools are already in the registry before init ran.
|
|
482
544
|
if (!coreToolsSnapshot) {
|
|
545
|
+
// Core tool literals always set `name` (verified by `registerTool` —
|
|
546
|
+
// it throws on missing name). The `!` assertions reflect that
|
|
547
|
+
// invariant at the iteration sites.
|
|
483
548
|
const manifestToolNames = new Set<string>([
|
|
484
549
|
...eagerModuleToolNames,
|
|
485
|
-
...explicitTools.map((t
|
|
486
|
-
...
|
|
487
|
-
...hostTools.map((t
|
|
488
|
-
...cesTools.map((t
|
|
489
|
-
...
|
|
490
|
-
...
|
|
491
|
-
...coreAppProxyTools.map((t: Tool) => t.name),
|
|
550
|
+
...explicitTools.map((t) => t.name!),
|
|
551
|
+
...extEntries.map(({ tool }) => tool.name),
|
|
552
|
+
...hostTools.map((t) => t.name!),
|
|
553
|
+
...cesTools.map((t) => t.name!),
|
|
554
|
+
...allUiSurfaceTools.map((t) => t.name!),
|
|
555
|
+
...coreAppProxyTools.map((t) => t.name!),
|
|
492
556
|
]);
|
|
493
557
|
|
|
494
558
|
coreToolsSnapshot = new Map<string, Tool>();
|
|
495
559
|
for (const [name, tool] of tools) {
|
|
496
|
-
|
|
497
|
-
if (
|
|
560
|
+
const ownerKind = ownersByName.get(name)?.kind;
|
|
561
|
+
if (ownerKind === "skill" || ownerKind === "plugin") continue;
|
|
498
562
|
// Exclude pre-existing tools not declared in the manifest
|
|
499
563
|
if (preExisting.has(name) && !manifestToolNames.has(name)) continue;
|
|
500
564
|
coreToolsSnapshot.set(name, tool);
|
|
@@ -516,6 +580,7 @@ export async function initializeTools(): Promise<void> {
|
|
|
516
580
|
*/
|
|
517
581
|
export function __resetRegistryForTesting(): void {
|
|
518
582
|
tools.clear();
|
|
583
|
+
ownersByName.clear();
|
|
519
584
|
skillRefCount.clear();
|
|
520
585
|
pluginRefCount.clear();
|
|
521
586
|
|
|
@@ -533,6 +598,7 @@ export function __resetRegistryForTesting(): void {
|
|
|
533
598
|
*/
|
|
534
599
|
export function __clearRegistryForTesting(): void {
|
|
535
600
|
tools.clear();
|
|
601
|
+
ownersByName.clear();
|
|
536
602
|
skillRefCount.clear();
|
|
537
603
|
pluginRefCount.clear();
|
|
538
604
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { formatIntegrationSummary } from "../../schedule/integration-status.js";
|
|
2
2
|
import { validateRruleSetLines } from "../../schedule/recurrence-engine.js";
|
|
3
3
|
import { normalizeScheduleSyntax } from "../../schedule/recurrence-types.js";
|
|
4
|
+
import { validateScriptTimeoutMs } from "../../schedule/run-script.js";
|
|
4
5
|
import type {
|
|
5
6
|
RoutingIntent,
|
|
6
7
|
ScheduleMode,
|
|
@@ -43,9 +44,17 @@ export async function executeScheduleCreate(
|
|
|
43
44
|
| Record<string, unknown>
|
|
44
45
|
| undefined;
|
|
45
46
|
const quiet = (input.quiet as boolean) ?? false;
|
|
46
|
-
const reuseConversation =
|
|
47
|
+
const reuseConversation = input.reuse_conversation as boolean | undefined;
|
|
47
48
|
const maxRetries = input.max_retries as number | undefined;
|
|
48
49
|
const retryBackoffMs = input.retry_backoff_ms as number | undefined;
|
|
50
|
+
const timeoutMs = input.timeout_ms as number | undefined;
|
|
51
|
+
|
|
52
|
+
if (timeoutMs !== undefined) {
|
|
53
|
+
const timeoutError = validateScriptTimeoutMs(timeoutMs);
|
|
54
|
+
if (timeoutError) {
|
|
55
|
+
return { content: `Error: ${timeoutError}`, isError: true };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
49
58
|
|
|
50
59
|
if (!name || typeof name !== "string") {
|
|
51
60
|
return {
|
|
@@ -134,6 +143,7 @@ export async function executeScheduleCreate(
|
|
|
134
143
|
reuseConversation,
|
|
135
144
|
maxRetries,
|
|
136
145
|
retryBackoffMs,
|
|
146
|
+
timeoutMs,
|
|
137
147
|
});
|
|
138
148
|
|
|
139
149
|
const fireDate = formatLocalDate(job.nextRunAt);
|
|
@@ -214,6 +224,7 @@ export async function executeScheduleCreate(
|
|
|
214
224
|
reuseConversation,
|
|
215
225
|
maxRetries,
|
|
216
226
|
retryBackoffMs,
|
|
227
|
+
timeoutMs,
|
|
217
228
|
});
|
|
218
229
|
|
|
219
230
|
const scheduleDescription =
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
normalizeScheduleSyntax,
|
|
5
5
|
type ScheduleSyntax,
|
|
6
6
|
} from "../../schedule/recurrence-types.js";
|
|
7
|
+
import { validateScriptTimeoutMs } from "../../schedule/run-script.js";
|
|
7
8
|
import type {
|
|
8
9
|
RoutingIntent,
|
|
9
10
|
ScheduleMode,
|
|
@@ -116,6 +117,20 @@ export async function executeScheduleUpdate(
|
|
|
116
117
|
updates.retryBackoffMs = input.retry_backoff_ms;
|
|
117
118
|
}
|
|
118
119
|
|
|
120
|
+
// Script execution timeout override (null clears it, reverting to default)
|
|
121
|
+
if (input.timeout_ms !== undefined) {
|
|
122
|
+
if (input.timeout_ms === null) {
|
|
123
|
+
updates.timeoutMs = null;
|
|
124
|
+
} else {
|
|
125
|
+
const timeoutMs = input.timeout_ms as number;
|
|
126
|
+
const timeoutError = validateScriptTimeoutMs(timeoutMs);
|
|
127
|
+
if (timeoutError) {
|
|
128
|
+
return { content: `Error: ${timeoutError}`, isError: true };
|
|
129
|
+
}
|
|
130
|
+
updates.timeoutMs = timeoutMs;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
119
134
|
// Auto-detect syntax when expression changes without explicit syntax
|
|
120
135
|
if (input.expression !== undefined || input.syntax !== undefined) {
|
|
121
136
|
const resolved = normalizeScheduleSyntax({
|
|
@@ -183,6 +198,7 @@ export async function executeScheduleUpdate(
|
|
|
183
198
|
reuseConversation?: boolean;
|
|
184
199
|
maxRetries?: number;
|
|
185
200
|
retryBackoffMs?: number;
|
|
201
|
+
timeoutMs?: number | null;
|
|
186
202
|
},
|
|
187
203
|
);
|
|
188
204
|
|