@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
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `toolResultTruncate` behavior: tail-drops oversized tool-result text
|
|
3
|
+
* down to a character budget, plus the truncation primitive it wraps.
|
|
4
|
+
*
|
|
5
|
+
* This module is side-effect free: importing it does not register any plugin.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
ToolResultTruncateArgs,
|
|
10
|
+
ToolResultTruncateResult,
|
|
11
|
+
} from "./types.js";
|
|
12
|
+
|
|
13
|
+
const HIGH_SURROGATE_START = 0xd800;
|
|
14
|
+
const HIGH_SURROGATE_END = 0xdbff;
|
|
15
|
+
const LOW_SURROGATE_START = 0xdc00;
|
|
16
|
+
const LOW_SURROGATE_END = 0xdfff;
|
|
17
|
+
|
|
18
|
+
function isHighSurrogate(code: number): boolean {
|
|
19
|
+
return code >= HIGH_SURROGATE_START && code <= HIGH_SURROGATE_END;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function isLowSurrogate(code: number): boolean {
|
|
23
|
+
return code >= LOW_SURROGATE_START && code <= LOW_SURROGATE_END;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Slice a string by code-unit indices without splitting a surrogate pair, so
|
|
28
|
+
* the result never ends or begins mid-emoji. Indices are clamped to the
|
|
29
|
+
* string bounds; a cut that would land between a high/low surrogate is nudged
|
|
30
|
+
* inward to the nearest whole code point.
|
|
31
|
+
*/
|
|
32
|
+
function safeStringSlice(
|
|
33
|
+
str: string,
|
|
34
|
+
start = 0,
|
|
35
|
+
end: number = str.length,
|
|
36
|
+
): string {
|
|
37
|
+
let safeStart = Math.max(0, Math.min(str.length, start));
|
|
38
|
+
let safeEnd = Math.max(safeStart, Math.min(str.length, end));
|
|
39
|
+
|
|
40
|
+
if (safeEnd < str.length && safeEnd > safeStart) {
|
|
41
|
+
const lastCode = str.charCodeAt(safeEnd - 1);
|
|
42
|
+
if (isHighSurrogate(lastCode)) {
|
|
43
|
+
safeEnd--;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (safeStart > 0 && safeStart < str.length) {
|
|
48
|
+
const firstCode = str.charCodeAt(safeStart);
|
|
49
|
+
if (isLowSurrogate(firstCode)) {
|
|
50
|
+
safeStart++;
|
|
51
|
+
if (safeStart > safeEnd) safeEnd = safeStart;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return str.slice(safeStart, safeEnd);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Minimum number of characters to preserve when truncating.
|
|
60
|
+
*/
|
|
61
|
+
export const MIN_KEEP_CHARS = 2_000;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Suffix appended to truncated tool results.
|
|
65
|
+
*/
|
|
66
|
+
export const TRUNCATION_SUFFIX =
|
|
67
|
+
"\n\n[Content truncated — original exceeded size limit. Use offset/limit parameters or request specific sections for large content.]";
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Truncate text with newline-boundary awareness.
|
|
71
|
+
*
|
|
72
|
+
* If `text.length <= maxChars`, the text is returned as-is.
|
|
73
|
+
* Otherwise we look for the last newline that falls within 80% of the budget
|
|
74
|
+
* so we get a clean cut. At least `MIN_KEEP_CHARS` characters are always
|
|
75
|
+
* preserved.
|
|
76
|
+
*/
|
|
77
|
+
export function truncateToolResultText(text: string, maxChars: number): string {
|
|
78
|
+
if (text.length <= maxChars) {
|
|
79
|
+
return text;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const effectiveMax = Math.max(maxChars, MIN_KEEP_CHARS);
|
|
83
|
+
const cutPoint = effectiveMax - TRUNCATION_SUFFIX.length;
|
|
84
|
+
|
|
85
|
+
// Look for a newline within the last 20% of the budget for a clean break.
|
|
86
|
+
const threshold = Math.floor(cutPoint * 0.8);
|
|
87
|
+
const lastNewline = text.lastIndexOf("\n", cutPoint);
|
|
88
|
+
|
|
89
|
+
const sliceEnd = lastNewline >= threshold ? lastNewline : cutPoint;
|
|
90
|
+
|
|
91
|
+
// If sliceEnd covers the full text, nothing was actually removed — return
|
|
92
|
+
// the original text without appending the suffix.
|
|
93
|
+
if (sliceEnd >= text.length) {
|
|
94
|
+
return text;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return safeStringSlice(text, 0, sliceEnd) + TRUNCATION_SUFFIX;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Truncate a single tool-result block's content to `args.maxChars`. Exported
|
|
102
|
+
* so the agent loop can call it directly and tests can verify the default
|
|
103
|
+
* behavior.
|
|
104
|
+
*/
|
|
105
|
+
export function defaultToolResultTruncateTerminal(
|
|
106
|
+
args: ToolResultTruncateArgs,
|
|
107
|
+
): ToolResultTruncateResult {
|
|
108
|
+
const truncated = truncateToolResultText(args.content, args.maxChars);
|
|
109
|
+
return {
|
|
110
|
+
content: truncated,
|
|
111
|
+
truncated: truncated !== args.content,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Argument and result shapes for the default `toolResultTruncate` behavior.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Input to tool-result truncation: the raw tool-result text and the character
|
|
7
|
+
* budget the caller computed from the context-window share.
|
|
8
|
+
*/
|
|
9
|
+
export type ToolResultTruncateArgs = {
|
|
10
|
+
readonly content: string;
|
|
11
|
+
readonly maxChars: number;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Output of tool-result truncation: the (possibly truncated) content and a
|
|
16
|
+
* boolean indicating whether the input was actually shortened. Callers use
|
|
17
|
+
* `truncated` for telemetry / warnings.
|
|
18
|
+
*/
|
|
19
|
+
export type ToolResultTruncateResult = {
|
|
20
|
+
readonly content: string;
|
|
21
|
+
readonly truncated: boolean;
|
|
22
|
+
};
|
|
@@ -50,7 +50,7 @@ import { z } from "zod";
|
|
|
50
50
|
|
|
51
51
|
import assistantPkg from "../../package.json" with { type: "json" };
|
|
52
52
|
import { finalizeTool } from "../tools/tool-defaults.js";
|
|
53
|
-
import type {
|
|
53
|
+
import type { Tool, ToolDefinition } from "../tools/types.js";
|
|
54
54
|
import { getLogger } from "../util/logger.js";
|
|
55
55
|
import { registerPlugin } from "./registry.js";
|
|
56
56
|
import type {
|
|
@@ -276,7 +276,7 @@ async function buildPluginFromDir(pluginDir: string): Promise<Plugin> {
|
|
|
276
276
|
const hooks = await loadHooks(pluginDir, name);
|
|
277
277
|
if (hooks !== undefined) plugin.hooks = hooks;
|
|
278
278
|
|
|
279
|
-
const tools:
|
|
279
|
+
const tools: Tool[] = [];
|
|
280
280
|
for (const { name: toolName, path: toolPath } of listSurfaceDir(
|
|
281
281
|
join(pluginDir, "tools"),
|
|
282
282
|
)) {
|
package/src/plugins/pipeline.ts
CHANGED
|
@@ -36,17 +36,6 @@ import {
|
|
|
36
36
|
type TurnContext,
|
|
37
37
|
} from "./types.js";
|
|
38
38
|
|
|
39
|
-
// Side-effect import: register every first-party default plugin at module
|
|
40
|
-
// load so downstream consumers (production bootstrap AND tests that skip
|
|
41
|
-
// `bootstrapPlugins()`) observe a fully-populated registry by default.
|
|
42
|
-
// Every code path that calls `runPipeline` imports this module, so by the
|
|
43
|
-
// time the first pipeline runs the defaults are already in place. User
|
|
44
|
-
// plugins load via `loadUserPlugins()` inside `bootstrapPlugins()` (which
|
|
45
|
-
// runs AFTER all static side-effect imports), so the onion ordering
|
|
46
|
-
// (defaults inner, user middleware outer) across all 14 pipelines is
|
|
47
|
-
// preserved in production.
|
|
48
|
-
import "./defaults/index.js";
|
|
49
|
-
|
|
50
39
|
const moduleLogger = getLogger("plugin-pipeline");
|
|
51
40
|
|
|
52
41
|
// ─── Default timeouts ───────────────────────────────────────────────────────
|
|
@@ -67,7 +56,6 @@ export const DEFAULT_TIMEOUTS: Record<PipelineName, number | null> = {
|
|
|
67
56
|
llmCall: null,
|
|
68
57
|
toolExecute: null,
|
|
69
58
|
memoryRetrieval: null,
|
|
70
|
-
historyRepair: null,
|
|
71
59
|
tokenEstimate: null,
|
|
72
60
|
compaction: null,
|
|
73
61
|
overflowReduce: null,
|
package/src/plugins/types.ts
CHANGED
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
* Design doc: `.private/plans/agent-plugin-system.md`.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
+
import type { CompactionCircuitClosedEvent } from "../api/events/compaction-circuit-closed.js";
|
|
20
|
+
import type { CompactionCircuitOpenEvent } from "../api/events/compaction-circuit-open.js";
|
|
19
21
|
import type { ContextWindowConfig } from "../config/schemas/inference.js";
|
|
20
22
|
import type {
|
|
21
23
|
ContextWindowManager,
|
|
@@ -28,11 +30,11 @@ import type {
|
|
|
28
30
|
ChannelCommandContext,
|
|
29
31
|
InjectionMode,
|
|
30
32
|
} from "../daemon/conversation-runtime-assembly.js";
|
|
31
|
-
import type { RepairResult } from "../daemon/history-repair.js";
|
|
32
|
-
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
33
33
|
import type { PkbContextConversation } from "../daemon/pkb-context-tracker.js";
|
|
34
34
|
import type { TrustContext } from "../daemon/trust-context.js";
|
|
35
|
+
import type { MessageRole } from "../memory/conversation-crud.js";
|
|
35
36
|
import type { QdrantSparseVector } from "../memory/qdrant-client.js";
|
|
37
|
+
import type { PluginHookFn } from "../plugin-api/types.js";
|
|
36
38
|
import type {
|
|
37
39
|
ContentBlock,
|
|
38
40
|
Message,
|
|
@@ -42,12 +44,12 @@ import type {
|
|
|
42
44
|
ToolDefinition,
|
|
43
45
|
} from "../providers/types.js";
|
|
44
46
|
import type { SkillRoute } from "../runtime/skill-route-registry.js";
|
|
45
|
-
import type {
|
|
46
|
-
LoadedTool,
|
|
47
|
-
ToolContext,
|
|
48
|
-
ToolExecutionResult,
|
|
49
|
-
} from "../tools/types.js";
|
|
47
|
+
import type { Tool, ToolContext, ToolExecutionResult } from "../tools/types.js";
|
|
50
48
|
import { AssistantError, ErrorCode } from "../util/errors.js";
|
|
49
|
+
import type {
|
|
50
|
+
ToolResultTruncateArgs,
|
|
51
|
+
ToolResultTruncateResult,
|
|
52
|
+
} from "./defaults/tool-result-truncate/types.js";
|
|
51
53
|
|
|
52
54
|
// ─── Manifest ────────────────────────────────────────────────────────────────
|
|
53
55
|
|
|
@@ -88,11 +90,12 @@ export interface PluginManifest {
|
|
|
88
90
|
config?: unknown;
|
|
89
91
|
}
|
|
90
92
|
|
|
91
|
-
// ───
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
//
|
|
93
|
+
// ─── Public plugin-API types ─────────────────────────────────────────────────
|
|
94
|
+
// Defined in `assistant/src/plugin-api/types.ts` and re-exported here so
|
|
95
|
+
// existing internal call sites keep working. Plugin authors import these from
|
|
96
|
+
// `@vellumai/plugin-api`.
|
|
95
97
|
export type {
|
|
98
|
+
PluginHookFn,
|
|
96
99
|
PluginInitContext,
|
|
97
100
|
PluginShutdownContext,
|
|
98
101
|
} from "../plugin-api/types.js";
|
|
@@ -122,7 +125,6 @@ export type PipelineName =
|
|
|
122
125
|
| "llmCall"
|
|
123
126
|
| "toolExecute"
|
|
124
127
|
| "memoryRetrieval"
|
|
125
|
-
| "historyRepair"
|
|
126
128
|
| "tokenEstimate"
|
|
127
129
|
| "compaction"
|
|
128
130
|
| "overflowReduce"
|
|
@@ -144,22 +146,20 @@ export type TurnResult = { readonly output: unknown };
|
|
|
144
146
|
/**
|
|
145
147
|
* Pipeline arguments for `llmCall` — mirrors the inputs to
|
|
146
148
|
* {@link Provider.sendMessage}. The terminal handler (the default plugin)
|
|
147
|
-
* delegates straight to `args.provider.sendMessage(args.messages, args.
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
149
|
+
* delegates straight to `args.provider.sendMessage(args.messages, args.options)`;
|
|
150
|
+
* middleware may observe or rewrite any field before that call, short-circuit
|
|
151
|
+
* with a synthetic {@link LLMCallResult}, or post-process the response on the
|
|
152
|
+
* way out.
|
|
151
153
|
*
|
|
152
154
|
* `provider` is passed in `args` (rather than resolved from the runtime) so
|
|
153
155
|
* middleware can swap it deterministically per-call. `options` carries the
|
|
154
|
-
* full `SendMessageOptions` bag — `
|
|
155
|
-
* middleware can substitute streaming handlers
|
|
156
|
-
* without reconstructing them.
|
|
156
|
+
* full `SendMessageOptions` bag — `tools`, `systemPrompt`, `config`,
|
|
157
|
+
* `onEvent`, and `signal` — so middleware can substitute streaming handlers,
|
|
158
|
+
* tool sets, or cancellation signals without reconstructing them.
|
|
157
159
|
*/
|
|
158
160
|
export type LLMCallArgs = {
|
|
159
161
|
readonly provider: Provider;
|
|
160
162
|
readonly messages: Message[];
|
|
161
|
-
readonly tools?: ToolDefinition[];
|
|
162
|
-
readonly systemPrompt?: string;
|
|
163
163
|
readonly options?: SendMessageOptions;
|
|
164
164
|
};
|
|
165
165
|
export type LLMCallResult = ProviderResponse;
|
|
@@ -235,32 +235,6 @@ export interface MemoryResult {
|
|
|
235
235
|
readonly memoryGraphBlocks: ReadonlyArray<MemoryBlock>;
|
|
236
236
|
}
|
|
237
237
|
|
|
238
|
-
/**
|
|
239
|
-
* Arguments for the `historyRepair` pipeline. `history` is the pre-repair
|
|
240
|
-
* message list scheduled for the next provider call; `provider` is the
|
|
241
|
-
* downstream provider key (`ctx.provider.name`) so plugins that want to
|
|
242
|
-
* special-case repair per provider can discriminate without looking up the
|
|
243
|
-
* ambient provider from `TurnContext`.
|
|
244
|
-
*
|
|
245
|
-
* The pipeline currently wraps only the standard pre-run repair pass
|
|
246
|
-
* (`repairHistory`). The orchestrator's one-shot deep-repair fallback
|
|
247
|
-
* (`deepRepairHistory`), invoked only after a provider ordering error,
|
|
248
|
-
* remains a direct call. Adding a `mode` discriminator here would be
|
|
249
|
-
* premature — deep-repair has no known plugin-level consumer yet.
|
|
250
|
-
*/
|
|
251
|
-
export type HistoryRepairArgs = {
|
|
252
|
-
readonly history: Message[];
|
|
253
|
-
readonly provider: string;
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Result of the `historyRepair` pipeline. Carries both the repaired message
|
|
258
|
-
* list and the `RepairStats` record the orchestrator logs when any repair
|
|
259
|
-
* happened — the default plugin forwards the shape unchanged from
|
|
260
|
-
* {@link repairHistory}.
|
|
261
|
-
*/
|
|
262
|
-
export type HistoryRepairResult = RepairResult;
|
|
263
|
-
|
|
264
238
|
/**
|
|
265
239
|
* Inputs to the `tokenEstimate` pipeline. The default middleware delegates
|
|
266
240
|
* these straight to {@link estimatePromptTokensRaw}; custom plugins may
|
|
@@ -439,18 +413,25 @@ export interface OverflowReduceResult {
|
|
|
439
413
|
* Pipeline arguments for `persistence` — a discriminated union over the
|
|
440
414
|
* message-CRUD operations plugins may observe, redirect, or short-circuit:
|
|
441
415
|
*
|
|
442
|
-
* - `add`
|
|
443
|
-
*
|
|
444
|
-
*
|
|
445
|
-
*
|
|
446
|
-
*
|
|
447
|
-
*
|
|
448
|
-
*
|
|
449
|
-
* - `
|
|
450
|
-
*
|
|
451
|
-
*
|
|
452
|
-
*
|
|
453
|
-
*
|
|
416
|
+
* - `add` — append a new message (`addMessage`). Mirrors
|
|
417
|
+
* `addMessage(conversationId, role, content, options?)`.
|
|
418
|
+
* When `syncToDisk` is set, the default plugin also runs
|
|
419
|
+
* {@link syncMessageToDisk} against the just-persisted row
|
|
420
|
+
* so the JSONL disk view stays consistent. The
|
|
421
|
+
* `createdAtMs` field carries the conversation's creation
|
|
422
|
+
* timestamp — needed to resolve the disk-view directory.
|
|
423
|
+
* - `reserve` — pre-allocate an empty assistant anchor row
|
|
424
|
+
* (`reserveMessage`) so the agent loop can stamp streaming
|
|
425
|
+
* events with stable identity before any content is
|
|
426
|
+
* produced. Returns the same row shape as `add`.
|
|
427
|
+
* - `updateContent` — overwrite the content of an existing message
|
|
428
|
+
* (`updateMessageContent`). Used to finalize a previously
|
|
429
|
+
* reserved row, and by consolidation paths.
|
|
430
|
+
* - `update` — shallow-merge metadata into an existing message
|
|
431
|
+
* (`updateMessageMetadata`). Returns `void`.
|
|
432
|
+
* - `delete` — remove a single message (`deleteMessageById`). Returns
|
|
433
|
+
* the {@link DeletedMemoryIds}-shaped segment/summary IDs
|
|
434
|
+
* the caller must clean up out-of-band.
|
|
454
435
|
*
|
|
455
436
|
* The discriminated `op` field lets plugin middleware narrow the union and
|
|
456
437
|
* tailor behavior per-operation (e.g. "only observe deletes", "redirect
|
|
@@ -459,7 +440,7 @@ export interface OverflowReduceResult {
|
|
|
459
440
|
export type PersistAddArgs = {
|
|
460
441
|
readonly op: "add";
|
|
461
442
|
readonly conversationId: string;
|
|
462
|
-
readonly role:
|
|
443
|
+
readonly role: MessageRole;
|
|
463
444
|
readonly content: string;
|
|
464
445
|
readonly metadata?: Record<string, unknown>;
|
|
465
446
|
readonly addOptions?: { readonly skipIndexing?: boolean };
|
|
@@ -473,6 +454,19 @@ export type PersistAddArgs = {
|
|
|
473
454
|
readonly createdAtMs?: number;
|
|
474
455
|
};
|
|
475
456
|
|
|
457
|
+
export type PersistReserveArgs = {
|
|
458
|
+
readonly op: "reserve";
|
|
459
|
+
readonly conversationId: string;
|
|
460
|
+
readonly role: MessageRole;
|
|
461
|
+
readonly metadata?: Record<string, unknown>;
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
export type PersistUpdateContentArgs = {
|
|
465
|
+
readonly op: "updateContent";
|
|
466
|
+
readonly messageId: string;
|
|
467
|
+
readonly content: string;
|
|
468
|
+
};
|
|
469
|
+
|
|
476
470
|
export type PersistUpdateArgs = {
|
|
477
471
|
readonly op: "update";
|
|
478
472
|
readonly messageId: string;
|
|
@@ -486,6 +480,8 @@ export type PersistDeleteArgs = {
|
|
|
486
480
|
|
|
487
481
|
export type PersistArgs =
|
|
488
482
|
| PersistAddArgs
|
|
483
|
+
| PersistReserveArgs
|
|
484
|
+
| PersistUpdateContentArgs
|
|
489
485
|
| PersistUpdateArgs
|
|
490
486
|
| PersistDeleteArgs;
|
|
491
487
|
|
|
@@ -506,6 +502,25 @@ export type PersistAddResult = {
|
|
|
506
502
|
};
|
|
507
503
|
};
|
|
508
504
|
|
|
505
|
+
/**
|
|
506
|
+
* Result row returned by a `reserve` op — same row shape as `add` but with
|
|
507
|
+
* empty `content` (`"[]"`) and tagged distinctly so middleware can branch
|
|
508
|
+
* on intent.
|
|
509
|
+
*/
|
|
510
|
+
export type PersistReserveResult = {
|
|
511
|
+
readonly op: "reserve";
|
|
512
|
+
readonly message: {
|
|
513
|
+
readonly id: string;
|
|
514
|
+
readonly conversationId: string;
|
|
515
|
+
readonly role: string;
|
|
516
|
+
readonly content: string;
|
|
517
|
+
readonly createdAt: number;
|
|
518
|
+
readonly metadata?: string;
|
|
519
|
+
};
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
export type PersistUpdateContentResult = { readonly op: "updateContent" };
|
|
523
|
+
|
|
509
524
|
export type PersistUpdateResult = { readonly op: "update" };
|
|
510
525
|
|
|
511
526
|
/** IDs of segments/summaries the caller must remove from Qdrant. */
|
|
@@ -517,6 +532,8 @@ export type PersistDeleteResult = {
|
|
|
517
532
|
|
|
518
533
|
export type PersistResult =
|
|
519
534
|
| PersistAddResult
|
|
535
|
+
| PersistReserveResult
|
|
536
|
+
| PersistUpdateContentResult
|
|
520
537
|
| PersistUpdateResult
|
|
521
538
|
| PersistDeleteResult;
|
|
522
539
|
|
|
@@ -558,26 +575,6 @@ export type TitleGenerateArgs = TitleArgs;
|
|
|
558
575
|
*/
|
|
559
576
|
export type TitleGenerateResult = TitleResult;
|
|
560
577
|
|
|
561
|
-
/**
|
|
562
|
-
* Input to the `toolResultTruncate` pipeline: the raw tool-result text and
|
|
563
|
-
* the character budget the caller computed from the context-window share
|
|
564
|
-
* (see `calculateMaxToolResultChars` in `context/tool-result-truncation.ts`).
|
|
565
|
-
*/
|
|
566
|
-
export type ToolResultTruncateArgs = {
|
|
567
|
-
readonly content: string;
|
|
568
|
-
readonly maxChars: number;
|
|
569
|
-
};
|
|
570
|
-
|
|
571
|
-
/**
|
|
572
|
-
* Output of the `toolResultTruncate` pipeline: the (possibly truncated)
|
|
573
|
-
* content and a boolean flag indicating whether the pipeline actually
|
|
574
|
-
* shortened the input. Callers use `truncated` for telemetry / warnings.
|
|
575
|
-
*/
|
|
576
|
-
export type ToolResultTruncateResult = {
|
|
577
|
-
readonly content: string;
|
|
578
|
-
readonly truncated: boolean;
|
|
579
|
-
};
|
|
580
|
-
|
|
581
578
|
/**
|
|
582
579
|
* Snapshot of the just-completed assistant turn plus retry/context counters
|
|
583
580
|
* the `emptyResponse` pipeline needs to decide whether to nudge, accept, or
|
|
@@ -613,6 +610,17 @@ export interface EmptyResponseArgs {
|
|
|
613
610
|
* visible text. See `agent/loop.ts` for why the whole-run scan matters.
|
|
614
611
|
*/
|
|
615
612
|
readonly priorAssistantHadVisibleText: boolean;
|
|
613
|
+
/**
|
|
614
|
+
* Provider-reported stop reason for the assistant turn being evaluated.
|
|
615
|
+
* `null`/`undefined` when the provider didn't report one (older
|
|
616
|
+
* providers, partial responses). The default terminal uses this to
|
|
617
|
+
* distinguish an explicit safety-classifier refusal (Anthropic's
|
|
618
|
+
* `"refusal"`) from an organically-empty turn — refusals deserve a
|
|
619
|
+
* nudge even on the very first model call of the run, whereas an
|
|
620
|
+
* organically-empty first call usually means the model legitimately
|
|
621
|
+
* had nothing to say.
|
|
622
|
+
*/
|
|
623
|
+
readonly stopReason: string | null | undefined;
|
|
616
624
|
}
|
|
617
625
|
|
|
618
626
|
/**
|
|
@@ -685,8 +693,11 @@ export type ToolErrorResult = ToolErrorDecision;
|
|
|
685
693
|
*
|
|
686
694
|
* `onEvent` is optional — when provided, the default plugin emits
|
|
687
695
|
* `compaction_circuit_open` / `compaction_circuit_closed` transition events
|
|
688
|
-
* through it.
|
|
689
|
-
*
|
|
696
|
+
* through it. Its parameter is narrowed to {@link CompactionCircuitEvent} (the
|
|
697
|
+
* only two messages this pipeline ever emits) rather than the full
|
|
698
|
+
* `ServerMessage` union, so a caller whose outbound channel can carry just
|
|
699
|
+
* these two events can satisfy it. Callers that only want to query without
|
|
700
|
+
* emitting can omit it.
|
|
690
701
|
*/
|
|
691
702
|
export type CircuitBreakerArgs = {
|
|
692
703
|
readonly key: string;
|
|
@@ -696,9 +707,20 @@ export type CircuitBreakerArgs = {
|
|
|
696
707
|
consecutiveCompactionFailures: number;
|
|
697
708
|
compactionCircuitOpenUntil: number | null;
|
|
698
709
|
};
|
|
699
|
-
readonly onEvent?: (msg:
|
|
710
|
+
readonly onEvent?: (msg: CompactionCircuitEvent) => void;
|
|
700
711
|
};
|
|
701
712
|
|
|
713
|
+
/**
|
|
714
|
+
* The complete set of transition events the `circuitBreaker` pipeline emits:
|
|
715
|
+
* `compaction_circuit_open` when the breaker trips and `compaction_circuit_closed`
|
|
716
|
+
* on the open→closed transition. Both are a subset of `ServerMessage`, so any
|
|
717
|
+
* existing `ServerMessage` sink remains assignable to a
|
|
718
|
+
* `(msg: CompactionCircuitEvent) => void` parameter.
|
|
719
|
+
*/
|
|
720
|
+
export type CompactionCircuitEvent =
|
|
721
|
+
| CompactionCircuitOpenEvent
|
|
722
|
+
| CompactionCircuitClosedEvent;
|
|
723
|
+
|
|
702
724
|
/**
|
|
703
725
|
* Result of a `circuitBreaker` pipeline invocation.
|
|
704
726
|
*
|
|
@@ -723,7 +745,6 @@ export interface PipelineMiddlewareMap {
|
|
|
723
745
|
llmCall: Middleware<LLMCallArgs, LLMCallResult>;
|
|
724
746
|
toolExecute: Middleware<ToolExecuteArgs, ToolExecuteResult>;
|
|
725
747
|
memoryRetrieval: Middleware<MemoryArgs, MemoryResult>;
|
|
726
|
-
historyRepair: Middleware<HistoryRepairArgs, HistoryRepairResult>;
|
|
727
748
|
tokenEstimate: Middleware<TokenEstimateArgs, TokenEstimateResult>;
|
|
728
749
|
compaction: Middleware<CompactionArgs, CompactionResult>;
|
|
729
750
|
overflowReduce: Middleware<OverflowReduceArgs, OverflowReduceResult>;
|
|
@@ -1064,22 +1085,6 @@ export interface PluginSkillRegistration {
|
|
|
1064
1085
|
|
|
1065
1086
|
// ─── Plugin ──────────────────────────────────────────────────────────────────
|
|
1066
1087
|
|
|
1067
|
-
/**
|
|
1068
|
-
* A plugin lifecycle hook. Receives a per-lifecycle context shape and
|
|
1069
|
-
* may return either a transformed context or `void`. Today's runtime
|
|
1070
|
-
* consumes only the resolved-or-rejected nature of the promise; the
|
|
1071
|
-
* `TCtx` return is reserved for future hooks that fan a transformed
|
|
1072
|
-
* context out to downstream plugins.
|
|
1073
|
-
*
|
|
1074
|
-
* Each known hook key has a documented context shape:
|
|
1075
|
-
* - `init` — {@link PluginInitContext}
|
|
1076
|
-
* - `shutdown` — {@link PluginShutdownContext}
|
|
1077
|
-
*
|
|
1078
|
-
* Unknown keys are populated by the loader for forward compatibility
|
|
1079
|
-
* but are not invoked by today's runtime.
|
|
1080
|
-
*/
|
|
1081
|
-
export type PluginHookFn<TCtx = unknown> = (ctx: TCtx) => Promise<TCtx | void>;
|
|
1082
|
-
|
|
1083
1088
|
/**
|
|
1084
1089
|
* Map of lifecycle hooks contributed by a plugin. Keys match file
|
|
1085
1090
|
* basenames under `<plugin>/hooks/` — the external loader populates one
|
|
@@ -1113,10 +1118,10 @@ export interface Plugin {
|
|
|
1113
1118
|
* `@vellumai/plugin-api`); the loader derives `name` from the
|
|
1114
1119
|
* `tools/<name>.ts` basename and runs the definition through
|
|
1115
1120
|
* `finalizeTool` to fill omitted required fields, producing the
|
|
1116
|
-
* `
|
|
1121
|
+
* `Tool` values stored here. Category / ownership metadata is
|
|
1117
1122
|
* stamped by `registerPluginTools` at registration time.
|
|
1118
1123
|
*/
|
|
1119
|
-
tools?:
|
|
1124
|
+
tools?: Tool[];
|
|
1120
1125
|
/** HTTP route registrations served by the assistant. */
|
|
1121
1126
|
routes?: PluginRouteRegistration[];
|
|
1122
1127
|
/** Skill registrations loaded at startup. */
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
*
|
|
38
38
|
* Call order relative to the rest of the plugin system:
|
|
39
39
|
*
|
|
40
|
-
* first-party registrations (
|
|
41
|
-
* → loadUserPlugins() ← this module
|
|
40
|
+
* first-party default registrations (explicit, at daemon startup)
|
|
41
|
+
* → loadUserPlugins() ← this module (closes registration)
|
|
42
42
|
* → bootstrapPlugins() (init for everyone registered so far)
|
|
43
43
|
*
|
|
44
44
|
* Design doc: `.private/plans/agent-plugin-system.md` (PR 29).
|
|
@@ -92,7 +92,8 @@ const USER_PLUGIN_IMPORT_TIMEOUT_MS = 10_000;
|
|
|
92
92
|
export async function loadUserPlugins(
|
|
93
93
|
options: { importTimeoutMs?: number } = {},
|
|
94
94
|
): Promise<void> {
|
|
95
|
-
const importTimeoutMs =
|
|
95
|
+
const importTimeoutMs =
|
|
96
|
+
options.importTimeoutMs ?? USER_PLUGIN_IMPORT_TIMEOUT_MS;
|
|
96
97
|
|
|
97
98
|
// Materialize the workspace-level `@vellumai/plugin-api` shim *before*
|
|
98
99
|
// we dynamic-import any user plugins. The shim file must exist on disk
|
|
@@ -90,7 +90,6 @@ mock.module("../daemon/process-message.js", () => ({
|
|
|
90
90
|
processMessage: async (
|
|
91
91
|
conversationId: string,
|
|
92
92
|
prompt: string,
|
|
93
|
-
_attachmentIds: unknown,
|
|
94
93
|
options: unknown,
|
|
95
94
|
) => {
|
|
96
95
|
processMessageCalls.push({ conversationId, prompt, options });
|
|
@@ -148,8 +147,7 @@ let addMessageCalls: Array<{
|
|
|
148
147
|
conversationId: string;
|
|
149
148
|
role: string;
|
|
150
149
|
content: string;
|
|
151
|
-
|
|
152
|
-
opts: unknown;
|
|
150
|
+
options: unknown;
|
|
153
151
|
}> = [];
|
|
154
152
|
|
|
155
153
|
mock.module("../memory/conversation-crud.js", () => ({
|
|
@@ -157,12 +155,12 @@ mock.module("../memory/conversation-crud.js", () => ({
|
|
|
157
155
|
conversationId: string,
|
|
158
156
|
role: string,
|
|
159
157
|
content: string,
|
|
160
|
-
|
|
161
|
-
opts: unknown,
|
|
158
|
+
options: unknown,
|
|
162
159
|
) => {
|
|
163
|
-
addMessageCalls.push({ conversationId, role, content,
|
|
160
|
+
addMessageCalls.push({ conversationId, role, content, options });
|
|
164
161
|
return { id: `msg-${addMessageCalls.length}` };
|
|
165
162
|
},
|
|
163
|
+
reserveMessage: mock(async () => ({ id: "msg-reserve" })),
|
|
166
164
|
}));
|
|
167
165
|
|
|
168
166
|
// emitNotificationSignal mock
|
|
@@ -181,6 +179,15 @@ mock.module("../notifications/emit-signal.js", () => ({
|
|
|
181
179
|
},
|
|
182
180
|
}));
|
|
183
181
|
|
|
182
|
+
// app sync invalidation mock
|
|
183
|
+
let publishAppsChangedCalls: Array<string | undefined> = [];
|
|
184
|
+
|
|
185
|
+
mock.module("../runtime/sync/resource-sync-events.js", () => ({
|
|
186
|
+
publishAppsChanged: (originClientId?: string) => {
|
|
187
|
+
publishAppsChangedCalls.push(originClientId);
|
|
188
|
+
},
|
|
189
|
+
}));
|
|
190
|
+
|
|
184
191
|
// findConversation mock
|
|
185
192
|
type MockConversation = {
|
|
186
193
|
processing: boolean;
|
|
@@ -303,6 +310,7 @@ function resetState() {
|
|
|
303
310
|
releaseClaimCalls = 0;
|
|
304
311
|
addMessageCalls = [];
|
|
305
312
|
emitSignalCalls = [];
|
|
313
|
+
publishAppsChangedCalls = [];
|
|
306
314
|
broadcastCalls = [];
|
|
307
315
|
mockConversations = new Map();
|
|
308
316
|
logWarnCalls = [];
|
|
@@ -462,10 +470,13 @@ describe("runProactiveArtifactJob", () => {
|
|
|
462
470
|
type: "app_files_changed",
|
|
463
471
|
appId: "app-123",
|
|
464
472
|
});
|
|
473
|
+
expect(publishAppsChangedCalls).toEqual([undefined]);
|
|
465
474
|
|
|
466
475
|
// Message injection: addMessage called with skipIndexing
|
|
467
476
|
expect(addMessageCalls).toHaveLength(1);
|
|
468
|
-
expect(
|
|
477
|
+
expect(
|
|
478
|
+
(addMessageCalls[0].options as Record<string, unknown>).skipIndexing,
|
|
479
|
+
).toBe(true);
|
|
469
480
|
expect(addMessageCalls[0].conversationId).toBe("conv-1");
|
|
470
481
|
const injectedAppContent = JSON.parse(addMessageCalls[0].content);
|
|
471
482
|
expect(injectedAppContent[0].text).toContain("Library");
|
|
@@ -714,7 +725,9 @@ describe("injectAuxAssistantMessage", () => {
|
|
|
714
725
|
expect(addMessageCalls).toHaveLength(1);
|
|
715
726
|
expect(addMessageCalls[0].conversationId).toBe("conv-inject-1");
|
|
716
727
|
expect(addMessageCalls[0].role).toBe("assistant");
|
|
717
|
-
expect(
|
|
728
|
+
expect(
|
|
729
|
+
(addMessageCalls[0].options as Record<string, unknown>).skipIndexing,
|
|
730
|
+
).toBe(true);
|
|
718
731
|
|
|
719
732
|
// Pushed to in-memory messages
|
|
720
733
|
expect(messages).toHaveLength(1);
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
extractText,
|
|
32
32
|
getConfiguredProvider,
|
|
33
33
|
} from "../providers/provider-send-message.js";
|
|
34
|
+
import { publishAppsChanged } from "../runtime/sync/resource-sync-events.js";
|
|
34
35
|
import { getLogger } from "../util/logger.js";
|
|
35
36
|
import { injectAuxAssistantMessage } from "./aux-message-injector.js";
|
|
36
37
|
import {
|
|
@@ -160,6 +161,7 @@ export async function runProactiveArtifactJob(params: {
|
|
|
160
161
|
|
|
161
162
|
if (artifactType === "app") {
|
|
162
163
|
params.broadcastMessage({ type: "app_files_changed", appId: artifactId });
|
|
164
|
+
publishAppsChanged();
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
// ── Post-build message copy ─────────────────────────────────────
|
|
@@ -284,7 +286,7 @@ For apps, keep scope tight — single file or 2-3 files max, under ~300 lines. S
|
|
|
284
286
|
|
|
285
287
|
Write the source code following the skill instructions, then compile via app_refresh.`;
|
|
286
288
|
|
|
287
|
-
await processMessage(conversation.id, prompt,
|
|
289
|
+
await processMessage(conversation.id, prompt, {
|
|
288
290
|
callSite: "proactiveArtifactBuild",
|
|
289
291
|
trustContext: INTERNAL_GUARDIAN_TRUST_CONTEXT,
|
|
290
292
|
});
|