@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
|
@@ -31,20 +31,16 @@ mock.module("../security/secure-keys.js", () => ({
|
|
|
31
31
|
getSecureKeyAsync: getSecureKeyAsyncMock,
|
|
32
32
|
}));
|
|
33
33
|
|
|
34
|
-
import {
|
|
35
|
-
|
|
36
|
-
clearFeatureFlagOverridesCache,
|
|
37
|
-
} from "../config/assistant-feature-flags.js";
|
|
38
|
-
import type { AssistantConfig } from "../config/schema.js";
|
|
39
|
-
import {
|
|
40
|
-
bootstrapPlugins,
|
|
41
|
-
type DaemonContext,
|
|
42
|
-
} from "../daemon/external-plugins-bootstrap.js";
|
|
34
|
+
import { clearFeatureFlagOverridesCache } from "../config/assistant-feature-flags.js";
|
|
35
|
+
import { bootstrapPlugins } from "../daemon/external-plugins-bootstrap.js";
|
|
43
36
|
import { runShutdownHooks } from "../daemon/shutdown-registry.js";
|
|
44
37
|
import { RiskLevel } from "../permissions/types.js";
|
|
38
|
+
import { registerDefaultPlugins } from "../plugins/defaults/index.js";
|
|
45
39
|
import {
|
|
40
|
+
closeRegistration,
|
|
46
41
|
getInjectors,
|
|
47
42
|
getMiddlewaresFor,
|
|
43
|
+
getRegisteredPlugins,
|
|
48
44
|
registerPlugin,
|
|
49
45
|
resetPluginRegistryForTests,
|
|
50
46
|
} from "../plugins/registry.js";
|
|
@@ -54,6 +50,8 @@ import {
|
|
|
54
50
|
PluginExecutionError,
|
|
55
51
|
type PluginInitContext,
|
|
56
52
|
} from "../plugins/types.js";
|
|
53
|
+
import { APP_VERSION } from "../version.js";
|
|
54
|
+
import { setOverridesForTesting } from "./feature-flag-test-helpers.js";
|
|
57
55
|
|
|
58
56
|
// Redirect plugin storage directory creation into a per-process temp tree so
|
|
59
57
|
// the test doesn't touch the developer's real ~/.vellum.
|
|
@@ -63,12 +61,6 @@ const TEST_WORKSPACE_DIR = join(
|
|
|
63
61
|
);
|
|
64
62
|
process.env.VELLUM_WORKSPACE_DIR = TEST_WORKSPACE_DIR;
|
|
65
63
|
|
|
66
|
-
const fakeConfig = {} as unknown as AssistantConfig;
|
|
67
|
-
const fakeCtx: DaemonContext = {
|
|
68
|
-
config: fakeConfig,
|
|
69
|
-
assistantVersion: "9.9.9-test",
|
|
70
|
-
};
|
|
71
|
-
|
|
72
64
|
/**
|
|
73
65
|
* Test helper. Accepts the new `hooks` bag and ALSO legacy top-level
|
|
74
66
|
* `init` / `onShutdown` for ergonomics — the helper merges them into a
|
|
@@ -125,7 +117,7 @@ describe("plugin bootstrap", () => {
|
|
|
125
117
|
getSecureKeyAsyncMock.mockReset();
|
|
126
118
|
getSecureKeyAsyncMock.mockImplementation(async () => undefined);
|
|
127
119
|
// Reset feature-flag cache so tests start from a known state. Individual
|
|
128
|
-
// tests that exercise `requiresFlag` use `
|
|
120
|
+
// tests that exercise `requiresFlag` use `setOverridesForTesting(...)`
|
|
129
121
|
// to install their own overrides.
|
|
130
122
|
clearFeatureFlagOverridesCache();
|
|
131
123
|
// Clean storage directory between runs so nothing leaks across cases.
|
|
@@ -141,7 +133,7 @@ describe("plugin bootstrap", () => {
|
|
|
141
133
|
});
|
|
142
134
|
registerPlugin(plugin);
|
|
143
135
|
|
|
144
|
-
await bootstrapPlugins(
|
|
136
|
+
await bootstrapPlugins();
|
|
145
137
|
|
|
146
138
|
expect(received).toBeDefined();
|
|
147
139
|
const ctx = received!;
|
|
@@ -157,7 +149,7 @@ describe("plugin bootstrap", () => {
|
|
|
157
149
|
join(TEST_WORKSPACE_DIR, "plugins-data", "alpha"),
|
|
158
150
|
);
|
|
159
151
|
expect(existsSync(ctx.pluginStorageDir)).toBe(true);
|
|
160
|
-
expect(ctx.assistantVersion).toBe(
|
|
152
|
+
expect(ctx.assistantVersion).toBe(APP_VERSION);
|
|
161
153
|
});
|
|
162
154
|
|
|
163
155
|
test("credential resolution: init receives the resolved value under credentials[key]", async () => {
|
|
@@ -178,7 +170,7 @@ describe("plugin bootstrap", () => {
|
|
|
178
170
|
);
|
|
179
171
|
registerPlugin(plugin);
|
|
180
172
|
|
|
181
|
-
await bootstrapPlugins(
|
|
173
|
+
await bootstrapPlugins();
|
|
182
174
|
|
|
183
175
|
expect(getSecureKeyAsyncMock).toHaveBeenCalledTimes(1);
|
|
184
176
|
expect(getSecureKeyAsyncMock).toHaveBeenCalledWith("some-key");
|
|
@@ -198,7 +190,7 @@ describe("plugin bootstrap", () => {
|
|
|
198
190
|
|
|
199
191
|
let caught: unknown;
|
|
200
192
|
try {
|
|
201
|
-
await bootstrapPlugins(
|
|
193
|
+
await bootstrapPlugins();
|
|
202
194
|
} catch (err) {
|
|
203
195
|
caught = err;
|
|
204
196
|
}
|
|
@@ -230,7 +222,7 @@ describe("plugin bootstrap", () => {
|
|
|
230
222
|
|
|
231
223
|
let caught: unknown;
|
|
232
224
|
try {
|
|
233
|
-
await bootstrapPlugins(
|
|
225
|
+
await bootstrapPlugins();
|
|
234
226
|
} catch (err) {
|
|
235
227
|
caught = err;
|
|
236
228
|
}
|
|
@@ -278,7 +270,7 @@ describe("plugin bootstrap", () => {
|
|
|
278
270
|
|
|
279
271
|
let caught: unknown;
|
|
280
272
|
try {
|
|
281
|
-
await bootstrapPlugins(
|
|
273
|
+
await bootstrapPlugins();
|
|
282
274
|
} catch (err) {
|
|
283
275
|
caught = err;
|
|
284
276
|
}
|
|
@@ -306,7 +298,7 @@ describe("plugin bootstrap", () => {
|
|
|
306
298
|
}),
|
|
307
299
|
);
|
|
308
300
|
|
|
309
|
-
await bootstrapPlugins(
|
|
301
|
+
await bootstrapPlugins();
|
|
310
302
|
await runShutdownHooks("test-shutdown");
|
|
311
303
|
|
|
312
304
|
// The last plugin to register must shut down first; the first to register
|
|
@@ -322,7 +314,38 @@ describe("plugin bootstrap", () => {
|
|
|
322
314
|
// tool-result truncate, etc.). Just assert bootstrap completes without
|
|
323
315
|
// throwing — the surface of defaults is verified in each pipeline's own
|
|
324
316
|
// dedicated test file.
|
|
325
|
-
await bootstrapPlugins(
|
|
317
|
+
await bootstrapPlugins();
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
test("startup ordering: defaults registered before the window closes survive bootstrap replay", async () => {
|
|
321
|
+
/**
|
|
322
|
+
* Reproduces the daemon startup ordering the registration regression
|
|
323
|
+
* guards: defaults must register before `loadUserPlugins()` closes the
|
|
324
|
+
* window, so the `registerDefaultPlugins` replay inside `bootstrapPlugins`
|
|
325
|
+
* is swallowed by the duplicate-name check instead of throwing on the
|
|
326
|
+
* closed window and leaving every default unregistered.
|
|
327
|
+
*/
|
|
328
|
+
|
|
329
|
+
// GIVEN the first-party defaults have registered while the window is open
|
|
330
|
+
// (what `initializePlugins()` does at daemon startup)
|
|
331
|
+
registerDefaultPlugins();
|
|
332
|
+
|
|
333
|
+
// AND a user plugin registers after them (what `loadUserPlugins()` does)
|
|
334
|
+
registerPlugin(buildPlugin("user-after-defaults"));
|
|
335
|
+
|
|
336
|
+
// AND the registration window has since closed
|
|
337
|
+
closeRegistration();
|
|
338
|
+
|
|
339
|
+
// WHEN bootstrap runs and replays the default registration
|
|
340
|
+
await bootstrapPlugins();
|
|
341
|
+
|
|
342
|
+
// THEN the defaults are still registered, ahead of the user plugin, so the
|
|
343
|
+
// middleware onion order is unchanged
|
|
344
|
+
const names = getRegisteredPlugins().map((p) => p.manifest.name);
|
|
345
|
+
expect(names).toContain("default-llm-call");
|
|
346
|
+
expect(names.indexOf("default-llm-call")).toBeLessThan(
|
|
347
|
+
names.indexOf("user-after-defaults"),
|
|
348
|
+
);
|
|
326
349
|
});
|
|
327
350
|
|
|
328
351
|
// ── requiresFlag gating (G2.2) ──────────────────────────────────────────
|
|
@@ -335,11 +358,11 @@ describe("plugin bootstrap", () => {
|
|
|
335
358
|
// - no shutdown hook entry is installed (nothing to tear down later).
|
|
336
359
|
// Plugins without `requiresFlag` are unaffected.
|
|
337
360
|
//
|
|
338
|
-
// Uses `
|
|
361
|
+
// Uses `setOverridesForTesting` to control the resolver deterministically
|
|
339
362
|
// — no disk writes, no gateway IPC, no reliance on registry defaults.
|
|
340
363
|
|
|
341
364
|
test("requiresFlag enabled: plugin inits normally", async () => {
|
|
342
|
-
|
|
365
|
+
setOverridesForTesting({ "plugin-gated-enabled": true });
|
|
343
366
|
|
|
344
367
|
let initFired = false;
|
|
345
368
|
const plugin = buildPlugin(
|
|
@@ -353,13 +376,13 @@ describe("plugin bootstrap", () => {
|
|
|
353
376
|
);
|
|
354
377
|
registerPlugin(plugin);
|
|
355
378
|
|
|
356
|
-
await bootstrapPlugins(
|
|
379
|
+
await bootstrapPlugins();
|
|
357
380
|
|
|
358
381
|
expect(initFired).toBe(true);
|
|
359
382
|
});
|
|
360
383
|
|
|
361
384
|
test("requiresFlag disabled: init does not fire and no tools/routes/skills are registered", async () => {
|
|
362
|
-
|
|
385
|
+
setOverridesForTesting({ "plugin-gated-disabled": false });
|
|
363
386
|
|
|
364
387
|
let initFired = false;
|
|
365
388
|
// Attach tool/route/skill contributions alongside init. If gating works,
|
|
@@ -374,6 +397,7 @@ describe("plugin bootstrap", () => {
|
|
|
374
397
|
{
|
|
375
398
|
name: "gated-off-tool",
|
|
376
399
|
description: "should not be registered",
|
|
400
|
+
category: "test",
|
|
377
401
|
defaultRiskLevel: RiskLevel.Low,
|
|
378
402
|
executionTarget: "sandbox",
|
|
379
403
|
input_schema: { type: "object", properties: {}, required: [] },
|
|
@@ -409,7 +433,7 @@ describe("plugin bootstrap", () => {
|
|
|
409
433
|
const { matchSkillRoute } =
|
|
410
434
|
await import("../runtime/skill-route-registry.js");
|
|
411
435
|
|
|
412
|
-
await bootstrapPlugins(
|
|
436
|
+
await bootstrapPlugins();
|
|
413
437
|
|
|
414
438
|
// init must not have fired.
|
|
415
439
|
expect(initFired).toBe(false);
|
|
@@ -432,7 +456,7 @@ describe("plugin bootstrap", () => {
|
|
|
432
456
|
});
|
|
433
457
|
registerPlugin(plugin);
|
|
434
458
|
|
|
435
|
-
await bootstrapPlugins(
|
|
459
|
+
await bootstrapPlugins();
|
|
436
460
|
|
|
437
461
|
expect(initFired).toBe(true);
|
|
438
462
|
});
|
|
@@ -440,7 +464,7 @@ describe("plugin bootstrap", () => {
|
|
|
440
464
|
test("requiresFlag: one disabled flag out of several skips the plugin", async () => {
|
|
441
465
|
// When ANY listed flag is disabled, the plugin is skipped wholesale —
|
|
442
466
|
// this prevents sneaky partial activation on AND semantics.
|
|
443
|
-
|
|
467
|
+
setOverridesForTesting({
|
|
444
468
|
"plugin-multi-a": true,
|
|
445
469
|
"plugin-multi-b": false,
|
|
446
470
|
});
|
|
@@ -457,7 +481,7 @@ describe("plugin bootstrap", () => {
|
|
|
457
481
|
);
|
|
458
482
|
registerPlugin(plugin);
|
|
459
483
|
|
|
460
|
-
await bootstrapPlugins(
|
|
484
|
+
await bootstrapPlugins();
|
|
461
485
|
|
|
462
486
|
expect(initFired).toBe(false);
|
|
463
487
|
});
|
|
@@ -469,7 +493,7 @@ describe("plugin bootstrap", () => {
|
|
|
469
493
|
// injectors still ran on every pipeline invocation and system-prompt
|
|
470
494
|
// assembly even though `init()` had never fired to set up the state they
|
|
471
495
|
// depended on.
|
|
472
|
-
|
|
496
|
+
setOverridesForTesting({ "plugin-middleware-disabled": false });
|
|
473
497
|
|
|
474
498
|
const gatedMiddleware: PipelineMiddlewareMap["llmCall"] = async (
|
|
475
499
|
args,
|
|
@@ -493,7 +517,7 @@ describe("plugin bootstrap", () => {
|
|
|
493
517
|
);
|
|
494
518
|
registerPlugin(plugin);
|
|
495
519
|
|
|
496
|
-
await bootstrapPlugins(
|
|
520
|
+
await bootstrapPlugins();
|
|
497
521
|
|
|
498
522
|
// Neither the middleware slot nor the injector list should expose the
|
|
499
523
|
// flag-gated plugin's contributions. The default plugins also contribute
|
|
@@ -506,7 +530,7 @@ describe("plugin bootstrap", () => {
|
|
|
506
530
|
});
|
|
507
531
|
|
|
508
532
|
test("requiresFlag disabled: no shutdown hook entry installed for the skipped plugin", async () => {
|
|
509
|
-
|
|
533
|
+
setOverridesForTesting({ "plugin-shutdown-flag": false });
|
|
510
534
|
|
|
511
535
|
let shutdownFired = false;
|
|
512
536
|
const plugin = buildPlugin(
|
|
@@ -521,7 +545,7 @@ describe("plugin bootstrap", () => {
|
|
|
521
545
|
);
|
|
522
546
|
registerPlugin(plugin);
|
|
523
547
|
|
|
524
|
-
await bootstrapPlugins(
|
|
548
|
+
await bootstrapPlugins();
|
|
525
549
|
await runShutdownHooks("test-shutdown");
|
|
526
550
|
|
|
527
551
|
// The shutdown hook is a single registered callback that walks a
|
|
@@ -43,11 +43,7 @@ mock.module("../security/secure-keys.js", () => ({
|
|
|
43
43
|
getSecureKeyAsync: getSecureKeyAsyncMock,
|
|
44
44
|
}));
|
|
45
45
|
|
|
46
|
-
import
|
|
47
|
-
import {
|
|
48
|
-
bootstrapPlugins,
|
|
49
|
-
type DaemonContext,
|
|
50
|
-
} from "../daemon/external-plugins-bootstrap.js";
|
|
46
|
+
import { bootstrapPlugins } from "../daemon/external-plugins-bootstrap.js";
|
|
51
47
|
import { runShutdownHooks } from "../daemon/shutdown-registry.js";
|
|
52
48
|
import {
|
|
53
49
|
registerPlugin,
|
|
@@ -69,12 +65,6 @@ const TEST_WORKSPACE_DIR = join(
|
|
|
69
65
|
);
|
|
70
66
|
process.env.VELLUM_WORKSPACE_DIR = TEST_WORKSPACE_DIR;
|
|
71
67
|
|
|
72
|
-
const fakeConfig = {} as unknown as AssistantConfig;
|
|
73
|
-
const fakeCtx: DaemonContext = {
|
|
74
|
-
config: fakeConfig,
|
|
75
|
-
assistantVersion: "9.9.9-test",
|
|
76
|
-
};
|
|
77
|
-
|
|
78
68
|
/** Build a minimal valid plugin with optional route contributions. */
|
|
79
69
|
/**
|
|
80
70
|
* Test helper. Accepts the new `hooks` bag and ALSO legacy top-level
|
|
@@ -149,7 +139,7 @@ describe("plugin route contributions", () => {
|
|
|
149
139
|
}),
|
|
150
140
|
);
|
|
151
141
|
|
|
152
|
-
await bootstrapPlugins(
|
|
142
|
+
await bootstrapPlugins();
|
|
153
143
|
|
|
154
144
|
// init() must have run — route registration is gated on init success.
|
|
155
145
|
expect(initFired).toBe(true);
|
|
@@ -179,7 +169,7 @@ describe("plugin route contributions", () => {
|
|
|
179
169
|
|
|
180
170
|
registerPlugin(buildPlugin("echo-plugin", { routes: [route] }));
|
|
181
171
|
|
|
182
|
-
await bootstrapPlugins(
|
|
172
|
+
await bootstrapPlugins();
|
|
183
173
|
|
|
184
174
|
// Sanity: route is live after bootstrap.
|
|
185
175
|
expect(matchSkillRoute("/_plugin/echo", "GET")).not.toBeNull();
|
|
@@ -197,7 +187,7 @@ describe("plugin route contributions", () => {
|
|
|
197
187
|
// route handling entirely (the guard is `if plugin.routes && length > 0`).
|
|
198
188
|
registerPlugin(buildPlugin("no-routes-plugin", { async init() {} }));
|
|
199
189
|
|
|
200
|
-
await bootstrapPlugins(
|
|
190
|
+
await bootstrapPlugins();
|
|
201
191
|
await runShutdownHooks("test-shutdown");
|
|
202
192
|
|
|
203
193
|
// Nothing to verify beyond "neither throws" — an empty `routes` must not
|
|
@@ -228,7 +218,7 @@ describe("plugin route contributions", () => {
|
|
|
228
218
|
}),
|
|
229
219
|
);
|
|
230
220
|
|
|
231
|
-
await bootstrapPlugins(
|
|
221
|
+
await bootstrapPlugins();
|
|
232
222
|
|
|
233
223
|
// Simulate an external wipe before the shutdown hook runs — e.g. a
|
|
234
224
|
// different subsystem calling `resetSkillRoutesForTests` or a hot-reload
|
|
@@ -301,7 +291,7 @@ describe("plugin route contributions", () => {
|
|
|
301
291
|
}),
|
|
302
292
|
);
|
|
303
293
|
|
|
304
|
-
await bootstrapPlugins(
|
|
294
|
+
await bootstrapPlugins();
|
|
305
295
|
|
|
306
296
|
// Both plugins' routes landed in the registry; matching returns one of
|
|
307
297
|
// them (order defined by registration, but we only care that *some*
|
|
@@ -31,12 +31,8 @@ mock.module("../security/secure-keys.js", () => ({
|
|
|
31
31
|
getSecureKeyAsync: getSecureKeyAsyncMock,
|
|
32
32
|
}));
|
|
33
33
|
|
|
34
|
-
import type { AssistantConfig } from "../config/schema.js";
|
|
35
34
|
import { loadSkillBySelector, loadSkillCatalog } from "../config/skills.js";
|
|
36
|
-
import {
|
|
37
|
-
bootstrapPlugins,
|
|
38
|
-
type DaemonContext,
|
|
39
|
-
} from "../daemon/external-plugins-bootstrap.js";
|
|
35
|
+
import { bootstrapPlugins } from "../daemon/external-plugins-bootstrap.js";
|
|
40
36
|
import { runShutdownHooks } from "../daemon/shutdown-registry.js";
|
|
41
37
|
import {
|
|
42
38
|
getPluginContributedSkillDefinition,
|
|
@@ -64,12 +60,6 @@ const TEST_WORKSPACE_DIR = join(
|
|
|
64
60
|
);
|
|
65
61
|
process.env.VELLUM_WORKSPACE_DIR = TEST_WORKSPACE_DIR;
|
|
66
62
|
|
|
67
|
-
const fakeConfig = {} as unknown as AssistantConfig;
|
|
68
|
-
const fakeCtx: DaemonContext = {
|
|
69
|
-
config: fakeConfig,
|
|
70
|
-
assistantVersion: "9.9.9-test",
|
|
71
|
-
};
|
|
72
|
-
|
|
73
63
|
/** Build a plugin that contributes one or more skills. */
|
|
74
64
|
function buildSkillPlugin(
|
|
75
65
|
name: string,
|
|
@@ -106,7 +96,7 @@ describe("plugin skill contributions", () => {
|
|
|
106
96
|
};
|
|
107
97
|
|
|
108
98
|
registerPlugin(buildSkillPlugin("demo-plugin", [skill]));
|
|
109
|
-
await bootstrapPlugins(
|
|
99
|
+
await bootstrapPlugins();
|
|
110
100
|
|
|
111
101
|
// Ref count bumped to exactly 1 so we can tell register and unregister
|
|
112
102
|
// are balanced downstream.
|
|
@@ -138,7 +128,7 @@ describe("plugin skill contributions", () => {
|
|
|
138
128
|
};
|
|
139
129
|
|
|
140
130
|
registerPlugin(buildSkillPlugin("catalog-plugin", [skill]));
|
|
141
|
-
await bootstrapPlugins(
|
|
131
|
+
await bootstrapPlugins();
|
|
142
132
|
|
|
143
133
|
// loadSkillCatalog is the exact entry point `skill_load` consults via
|
|
144
134
|
// `loadSkillBySelector` -> `resolveSkillSelector`.
|
|
@@ -171,7 +161,7 @@ describe("plugin skill contributions", () => {
|
|
|
171
161
|
};
|
|
172
162
|
|
|
173
163
|
registerPlugin(buildSkillPlugin("ephemeral-plugin", [skill]));
|
|
174
|
-
await bootstrapPlugins(
|
|
164
|
+
await bootstrapPlugins();
|
|
175
165
|
|
|
176
166
|
// Sanity: present before shutdown.
|
|
177
167
|
expect(loadSkillCatalog().some((s) => s.id === "ephemeral-skill")).toBe(
|
|
@@ -206,7 +196,7 @@ describe("plugin skill contributions", () => {
|
|
|
206
196
|
},
|
|
207
197
|
});
|
|
208
198
|
|
|
209
|
-
await bootstrapPlugins(
|
|
199
|
+
await bootstrapPlugins();
|
|
210
200
|
|
|
211
201
|
expect(getPluginSkillRefCount("no-skills-plugin")).toBe(0);
|
|
212
202
|
expect(getPluginContributedSkillSummaries()).toEqual([]);
|
|
@@ -231,7 +221,7 @@ describe("plugin skill contributions", () => {
|
|
|
231
221
|
|
|
232
222
|
let caught: unknown;
|
|
233
223
|
try {
|
|
234
|
-
await bootstrapPlugins(
|
|
224
|
+
await bootstrapPlugins();
|
|
235
225
|
} catch (err) {
|
|
236
226
|
caught = err;
|
|
237
227
|
}
|
|
@@ -347,7 +337,7 @@ describe("plugin skill contributions", () => {
|
|
|
347
337
|
registerPlugin(buildSkillPlugin("shadow-plugin", [pluginSkill]));
|
|
348
338
|
|
|
349
339
|
try {
|
|
350
|
-
await bootstrapPlugins(
|
|
340
|
+
await bootstrapPlugins();
|
|
351
341
|
|
|
352
342
|
const catalog = loadSkillCatalog();
|
|
353
343
|
const entry = catalog.find((s) => s.id === "shared-id");
|
|
@@ -6,9 +6,11 @@
|
|
|
6
6
|
*
|
|
7
7
|
* - Registering a plugin with `tools: Tool[]`, running `bootstrapPlugins`,
|
|
8
8
|
* and observing the contributed tool via `getAllTools()` / `getTool()`.
|
|
9
|
-
* - Tool ownership
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* - Tool ownership (`owner: { kind: "plugin", id: <plugin> }`) recorded
|
|
10
|
+
* authoritatively by `registerPluginTools` into the registry's
|
|
11
|
+
* `ownersByName` map (queried via `getToolOwner(name)`), regardless of
|
|
12
|
+
* what the plugin author set on the incoming object. The `Tool` itself
|
|
13
|
+
* carries no ownership field — the bootstrap is the only writer.
|
|
12
14
|
* - Shutdown hook unregistering the contributed tools so the registry is
|
|
13
15
|
* clean again after teardown.
|
|
14
16
|
* - Direct `registerPluginTools` / `unregisterPluginTools` semantics,
|
|
@@ -37,11 +39,7 @@ mock.module("../security/secure-keys.js", () => ({
|
|
|
37
39
|
getSecureKeyAsync: getSecureKeyAsyncMock,
|
|
38
40
|
}));
|
|
39
41
|
|
|
40
|
-
import
|
|
41
|
-
import {
|
|
42
|
-
bootstrapPlugins,
|
|
43
|
-
type DaemonContext,
|
|
44
|
-
} from "../daemon/external-plugins-bootstrap.js";
|
|
42
|
+
import { bootstrapPlugins } from "../daemon/external-plugins-bootstrap.js";
|
|
45
43
|
import { runShutdownHooks } from "../daemon/shutdown-registry.js";
|
|
46
44
|
import { RiskLevel } from "../permissions/types.js";
|
|
47
45
|
import {
|
|
@@ -55,14 +53,11 @@ import {
|
|
|
55
53
|
getAllTools,
|
|
56
54
|
getPluginRefCount,
|
|
57
55
|
getTool,
|
|
56
|
+
getToolOwner,
|
|
58
57
|
registerPluginTools,
|
|
59
58
|
unregisterPluginTools,
|
|
60
59
|
} from "../tools/registry.js";
|
|
61
|
-
import type {
|
|
62
|
-
LoadedTool,
|
|
63
|
-
ToolContext,
|
|
64
|
-
ToolExecutionResult,
|
|
65
|
-
} from "../tools/types.js";
|
|
60
|
+
import type { Tool, ToolContext, ToolExecutionResult } from "../tools/types.js";
|
|
66
61
|
|
|
67
62
|
// Redirect plugin-storage-directory creation into a per-process temp tree so
|
|
68
63
|
// the test doesn't touch the developer's real ~/.vellum. This matches the
|
|
@@ -73,22 +68,14 @@ const TEST_WORKSPACE_DIR = join(
|
|
|
73
68
|
);
|
|
74
69
|
process.env.VELLUM_WORKSPACE_DIR = TEST_WORKSPACE_DIR;
|
|
75
70
|
|
|
76
|
-
|
|
77
|
-
const fakeCtx: DaemonContext = {
|
|
78
|
-
config: fakeConfig,
|
|
79
|
-
assistantVersion: "9.9.9-test",
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
function makeFakeTool(
|
|
83
|
-
name: string,
|
|
84
|
-
extras: Partial<LoadedTool> = {},
|
|
85
|
-
): LoadedTool {
|
|
71
|
+
function makeFakeTool(name: string, extras: Partial<Tool> = {}): Tool {
|
|
86
72
|
return {
|
|
87
73
|
name,
|
|
88
74
|
description: `Fake ${name}`,
|
|
89
75
|
defaultRiskLevel: RiskLevel.Low,
|
|
90
76
|
executionTarget: "sandbox",
|
|
91
77
|
input_schema: { type: "object", properties: {}, required: [] },
|
|
78
|
+
category: "",
|
|
92
79
|
async execute(
|
|
93
80
|
_input: Record<string, unknown>,
|
|
94
81
|
_context: ToolContext,
|
|
@@ -160,17 +147,21 @@ describe("plugin tool contributions", () => {
|
|
|
160
147
|
});
|
|
161
148
|
registerPlugin(plugin);
|
|
162
149
|
|
|
163
|
-
await bootstrapPlugins(
|
|
150
|
+
await bootstrapPlugins();
|
|
164
151
|
|
|
165
152
|
const retrieved = getTool("plugin-contrib-tool");
|
|
166
153
|
expect(retrieved).toBeDefined();
|
|
167
|
-
// Ownership
|
|
168
|
-
//
|
|
169
|
-
// the
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
|
|
154
|
+
// Ownership is recorded authoritatively by the bootstrap into the
|
|
155
|
+
// registry's `ownersByName` map (keyed by tool name, accessed via
|
|
156
|
+
// `getToolOwner(name)`) — the registry uses it to drive ref-counting
|
|
157
|
+
// and conflict detection when the plugin shuts down or is hot-reloaded.
|
|
158
|
+
// Plugin tools live in their own namespace, disjoint from real skills,
|
|
159
|
+
// so a plugin name that happens to match a skill id cannot collide.
|
|
160
|
+
// Ownership is not stamped on the `Tool` object itself.
|
|
161
|
+
expect(getToolOwner("plugin-contrib-tool")).toEqual({
|
|
162
|
+
kind: "plugin",
|
|
163
|
+
id: "alpha-contributor",
|
|
164
|
+
});
|
|
174
165
|
|
|
175
166
|
// The tool surfaces in the global `getAllTools()` snapshot, which is
|
|
176
167
|
// what downstream consumers (tool-manifest, session projection) read.
|
|
@@ -185,7 +176,7 @@ describe("plugin tool contributions", () => {
|
|
|
185
176
|
});
|
|
186
177
|
registerPlugin(plugin);
|
|
187
178
|
|
|
188
|
-
await bootstrapPlugins(
|
|
179
|
+
await bootstrapPlugins();
|
|
189
180
|
expect(getTool("bravo-tool")).toBeDefined();
|
|
190
181
|
|
|
191
182
|
await runShutdownHooks("test-shutdown");
|
|
@@ -198,7 +189,7 @@ describe("plugin tool contributions", () => {
|
|
|
198
189
|
const plugin = buildPlugin("no-tools", { async init() {} });
|
|
199
190
|
registerPlugin(plugin);
|
|
200
191
|
|
|
201
|
-
await bootstrapPlugins(
|
|
192
|
+
await bootstrapPlugins();
|
|
202
193
|
// No tool should have been registered.
|
|
203
194
|
expect(getAllTools()).toHaveLength(0);
|
|
204
195
|
|
|
@@ -222,7 +213,7 @@ describe("plugin tool contributions", () => {
|
|
|
222
213
|
|
|
223
214
|
expect(getTool("charlie-tool")).toBeUndefined();
|
|
224
215
|
|
|
225
|
-
await bootstrapPlugins(
|
|
216
|
+
await bootstrapPlugins();
|
|
226
217
|
expect(getTool("charlie-tool")).toBeDefined();
|
|
227
218
|
});
|
|
228
219
|
|
|
@@ -238,7 +229,7 @@ describe("plugin tool contributions", () => {
|
|
|
238
229
|
});
|
|
239
230
|
registerPlugin(plugin);
|
|
240
231
|
|
|
241
|
-
await expect(bootstrapPlugins(
|
|
232
|
+
await expect(bootstrapPlugins()).rejects.toThrow(/delta-broken/);
|
|
242
233
|
expect(getTool("delta-tool")).toBeUndefined();
|
|
243
234
|
});
|
|
244
235
|
});
|
|
@@ -248,22 +239,23 @@ describe("registerPluginTools / unregisterPluginTools helpers", () => {
|
|
|
248
239
|
__resetRegistryForTesting();
|
|
249
240
|
});
|
|
250
241
|
|
|
251
|
-
test("registerPluginTools stamps category
|
|
252
|
-
// Even if the plugin author hands in a tool with no category
|
|
253
|
-
//
|
|
254
|
-
//
|
|
242
|
+
test("registerPluginTools stamps category and records ownership in the registry", () => {
|
|
243
|
+
// Even if the plugin author hands in a tool with no category, the
|
|
244
|
+
// helper fills it in and records ownership in the registry's
|
|
245
|
+
// `ownersByName` map — the tool itself never carries an `owner` field,
|
|
246
|
+
// so plugin authors can't spoof ownership by forging one.
|
|
255
247
|
const accepted = registerPluginTools("my-plugin", [
|
|
256
248
|
makeFakeTool("pt_stamped"),
|
|
257
249
|
]);
|
|
258
250
|
expect(accepted).toHaveLength(1);
|
|
259
251
|
expect(accepted[0]?.category).toBe("plugin");
|
|
260
|
-
expect(
|
|
261
|
-
|
|
252
|
+
expect(getToolOwner("pt_stamped")).toEqual({
|
|
253
|
+
kind: "plugin",
|
|
254
|
+
id: "my-plugin",
|
|
255
|
+
});
|
|
262
256
|
|
|
263
257
|
const retrieved = getTool("pt_stamped");
|
|
264
258
|
expect(retrieved?.category).toBe("plugin");
|
|
265
|
-
expect(retrieved?.origin).toBe("plugin");
|
|
266
|
-
expect(retrieved?.ownerPluginId).toBe("my-plugin");
|
|
267
259
|
});
|
|
268
260
|
|
|
269
261
|
test("registerPluginTools exposes provider-safe aliases for unsafe plugin tool names", async () => {
|
|
@@ -313,33 +305,28 @@ describe("registerPluginTools / unregisterPluginTools helpers", () => {
|
|
|
313
305
|
expect(getTool(paddedAlias!)).toBeDefined();
|
|
314
306
|
});
|
|
315
307
|
|
|
316
|
-
test("registerPluginTools
|
|
308
|
+
test("registerPluginTools ignores forged ownership fields on the incoming tool", () => {
|
|
317
309
|
// A plugin author could (maliciously or mistakenly) hand in a tool
|
|
318
|
-
// pre-tagged with another skill's or plugin's ID. The
|
|
319
|
-
//
|
|
320
|
-
//
|
|
321
|
-
//
|
|
322
|
-
//
|
|
323
|
-
//
|
|
310
|
+
// pre-tagged with another skill's or plugin's ID. The `Tool` type now
|
|
311
|
+
// carries no ownership field at all, so any such forgery is purely
|
|
312
|
+
// inert extra data — the registry only populates `ownersByName` from
|
|
313
|
+
// the first argument to `register*Tools`, which is the single source
|
|
314
|
+
// of truth for ownership and cannot be spoofed by forging fields on
|
|
315
|
+
// the manifest.
|
|
324
316
|
//
|
|
325
|
-
//
|
|
326
|
-
//
|
|
327
|
-
// transpiled artifact that arrives with spoofed fields baked in —
|
|
328
|
-
// the bootstrap-side defense is the second layer that must hold.
|
|
317
|
+
// Cast through `unknown` to simulate a hostile or transpiled artifact
|
|
318
|
+
// arriving with extra fields baked in.
|
|
329
319
|
const spoofed = {
|
|
330
320
|
...makeFakeTool("pt_spoof"),
|
|
331
321
|
origin: "skill",
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
ownerSkillVersionHash: "deadbeef",
|
|
335
|
-
} as unknown as LoadedTool;
|
|
322
|
+
owner: { kind: "skill", id: "some-other-skill" },
|
|
323
|
+
} as unknown as Tool;
|
|
336
324
|
registerPluginTools("my-plugin", [spoofed]);
|
|
337
|
-
|
|
338
|
-
expect(
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
expect(retrieved?.ownerSkillVersionHash).toBeUndefined();
|
|
325
|
+
expect(getTool("pt_spoof")).toBeDefined();
|
|
326
|
+
expect(getToolOwner("pt_spoof")).toEqual({
|
|
327
|
+
kind: "plugin",
|
|
328
|
+
id: "my-plugin",
|
|
329
|
+
});
|
|
343
330
|
});
|
|
344
331
|
|
|
345
332
|
test("unregisterPluginTools removes the plugin's tools", () => {
|