@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
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
type DiskPressureBlockedCapability,
|
|
3
|
+
type DiskPressureState,
|
|
4
|
+
type DiskPressureStatus,
|
|
5
|
+
} from "../api/events/disk-pressure-status-changed.js";
|
|
3
6
|
import { buildAssistantEvent } from "../runtime/assistant-event.js";
|
|
4
7
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
5
8
|
import { cancelBackgroundTools } from "../tools/background-tool-registry.js";
|
|
@@ -8,34 +11,32 @@ import { getLogger } from "../util/logger.js";
|
|
|
8
11
|
|
|
9
12
|
export const DISK_PRESSURE_WARNING_THRESHOLD_PERCENT = 80;
|
|
10
13
|
export const DISK_PRESSURE_THRESHOLD_PERCENT = 95;
|
|
14
|
+
// Hysteresis lower bound: once locked, the guard stays locked until usage
|
|
15
|
+
// falls below this clear threshold. The deadband between this and the
|
|
16
|
+
// critical threshold stops the lock from flapping when usage hovers near
|
|
17
|
+
// 95% — otherwise clearing the lock immediately resumes background work,
|
|
18
|
+
// which can refill the disk and re-trip the lock on the next sample.
|
|
19
|
+
export const DISK_PRESSURE_CLEAR_THRESHOLD_PERCENT = 90;
|
|
20
|
+
// Warning-side hysteresis lower bound: once in the warning state, usage must
|
|
21
|
+
// fall below this clear threshold before warning resolves. The deadband between
|
|
22
|
+
// this and the warning threshold stops the in-chat disk-pressure banner from
|
|
23
|
+
// flapping when usage hovers near 80% — without it, a brief dip below 80%
|
|
24
|
+
// clears the warning state, which discards the banner's (state-scoped) dismissal
|
|
25
|
+
// so it re-appears the moment usage ticks back up.
|
|
26
|
+
export const DISK_PRESSURE_WARNING_CLEAR_THRESHOLD_PERCENT = 77;
|
|
11
27
|
export const DISK_PRESSURE_CHECK_INTERVAL_MS = 60_000;
|
|
12
28
|
export const DISK_PRESSURE_OVERRIDE_CONFIRMATION = "I understand the risks";
|
|
13
29
|
export const DISK_PRESSURE_BLOCKED_CAPABILITIES = [
|
|
14
30
|
"agent-turns",
|
|
15
31
|
"background-work",
|
|
16
32
|
"remote-ingress",
|
|
17
|
-
] as const;
|
|
18
|
-
|
|
19
|
-
export
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
export interface DiskPressureStatus {
|
|
25
|
-
enabled: boolean;
|
|
26
|
-
state: DiskPressureState;
|
|
27
|
-
locked: boolean;
|
|
28
|
-
acknowledged: boolean;
|
|
29
|
-
overrideActive: boolean;
|
|
30
|
-
effectivelyLocked: boolean;
|
|
31
|
-
lockId: string | null;
|
|
32
|
-
usagePercent: number | null;
|
|
33
|
-
thresholdPercent: number;
|
|
34
|
-
path: string | null;
|
|
35
|
-
lastCheckedAt: string | null;
|
|
36
|
-
blockedCapabilities: DiskPressureBlockedCapability[];
|
|
37
|
-
error: string | null;
|
|
38
|
-
}
|
|
33
|
+
] as const satisfies readonly DiskPressureBlockedCapability[];
|
|
34
|
+
|
|
35
|
+
export {
|
|
36
|
+
type DiskPressureBlockedCapability,
|
|
37
|
+
type DiskPressureState,
|
|
38
|
+
type DiskPressureStatus,
|
|
39
|
+
};
|
|
39
40
|
|
|
40
41
|
export type DiskPressureTransitionResult =
|
|
41
42
|
| { ok: true; status: DiskPressureStatus }
|
|
@@ -119,24 +120,10 @@ function replaceStatus(next: DiskPressureStatus): DiskPressureStatus {
|
|
|
119
120
|
return cloneStatus(state.status);
|
|
120
121
|
}
|
|
121
122
|
|
|
122
|
-
function
|
|
123
|
-
return isAssistantFeatureFlagEnabled("safe-storage-limits", getConfig());
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function resetToDisabled(): DiskPressureStatus {
|
|
127
|
-
const previous = cloneStatus(state.status);
|
|
128
|
-
stopDiskPressureGuard();
|
|
129
|
-
state.status = cloneStatus(DISABLED_STATUS);
|
|
130
|
-
publishStatusChangedIfNeeded(previous);
|
|
131
|
-
return cloneStatus(state.status);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function ensureEnabledStatus(): DiskPressureStatus | null {
|
|
135
|
-
if (!isEnabled()) return resetToDisabled();
|
|
123
|
+
function ensureEnabledStatus(): void {
|
|
136
124
|
if (!state.status.enabled) {
|
|
137
125
|
state.status = cloneStatus(OPEN_STATUS);
|
|
138
126
|
}
|
|
139
|
-
return null;
|
|
140
127
|
}
|
|
141
128
|
|
|
142
129
|
function nextLockId(): string {
|
|
@@ -192,8 +179,7 @@ function rejectTransition(
|
|
|
192
179
|
}
|
|
193
180
|
|
|
194
181
|
export function startDiskPressureGuard(): DiskPressureStatus {
|
|
195
|
-
|
|
196
|
-
if (disabledStatus) return disabledStatus;
|
|
182
|
+
ensureEnabledStatus();
|
|
197
183
|
|
|
198
184
|
if (!state.timer) {
|
|
199
185
|
state.timer = setInterval(() => {
|
|
@@ -212,8 +198,7 @@ export function stopDiskPressureGuard(): void {
|
|
|
212
198
|
}
|
|
213
199
|
|
|
214
200
|
export function evaluateDiskPressureNow(): DiskPressureStatus {
|
|
215
|
-
|
|
216
|
-
if (disabledStatus) return disabledStatus;
|
|
201
|
+
ensureEnabledStatus();
|
|
217
202
|
|
|
218
203
|
let usageInfo: ReturnType<typeof getDiskUsageInfo>;
|
|
219
204
|
try {
|
|
@@ -229,8 +214,28 @@ export function evaluateDiskPressureNow(): DiskPressureStatus {
|
|
|
229
214
|
const usagePercent = roundPercent(
|
|
230
215
|
(usageInfo.usedMb / usageInfo.totalMb) * 100,
|
|
231
216
|
);
|
|
232
|
-
|
|
233
|
-
|
|
217
|
+
// Hysteresis: while locked, hold until usage drops below the lower clear
|
|
218
|
+
// threshold; otherwise lock at the critical threshold.
|
|
219
|
+
const criticalThreshold = state.status.locked
|
|
220
|
+
? DISK_PRESSURE_CLEAR_THRESHOLD_PERCENT
|
|
221
|
+
: DISK_PRESSURE_THRESHOLD_PERCENT;
|
|
222
|
+
const isCritical = usagePercent >= criticalThreshold;
|
|
223
|
+
// Mirror the critical deadband for the warning band: once in an active
|
|
224
|
+
// pressure state (warning or critical), hold warning until usage clears the
|
|
225
|
+
// lower warning-clear threshold. Treating "critical" as active here matters
|
|
226
|
+
// for a direct step-down: when cleanup frees a lot of space in one sample,
|
|
227
|
+
// usage can drop straight from a critical lock to e.g. 78%, which is below
|
|
228
|
+
// the 80% warning trigger but above the 77% clear threshold. Using the full
|
|
229
|
+
// 80% threshold in that case would report "ok" and discard the warning/
|
|
230
|
+
// dismissal, reopening the flapping window on the next tick back up. The
|
|
231
|
+
// deadband must apply consistently whether we arrived in the warning band
|
|
232
|
+
// from below (rising past 80%) or from above (falling out of critical).
|
|
233
|
+
const inActivePressureState =
|
|
234
|
+
state.status.state === "warning" || state.status.state === "critical";
|
|
235
|
+
const warningThreshold = inActivePressureState
|
|
236
|
+
? DISK_PRESSURE_WARNING_CLEAR_THRESHOLD_PERCENT
|
|
237
|
+
: DISK_PRESSURE_WARNING_THRESHOLD_PERCENT;
|
|
238
|
+
const isWarning = !isCritical && usagePercent >= warningThreshold;
|
|
234
239
|
const lastCheckedAt = new Date().toISOString();
|
|
235
240
|
|
|
236
241
|
if (!isCritical && !isWarning) {
|
|
@@ -277,14 +282,13 @@ export function evaluateDiskPressureNow(): DiskPressureStatus {
|
|
|
277
282
|
}
|
|
278
283
|
|
|
279
284
|
export function getDiskPressureStatus(): DiskPressureStatus {
|
|
280
|
-
if (!isEnabled()) return cloneStatus(DISABLED_STATUS);
|
|
281
285
|
if (!state.status.enabled) return cloneStatus(OPEN_STATUS);
|
|
282
286
|
return cloneStatus(state.status);
|
|
283
287
|
}
|
|
284
288
|
|
|
285
289
|
export function acknowledgeDiskPressureLock(): DiskPressureTransitionResult {
|
|
286
|
-
|
|
287
|
-
const status =
|
|
290
|
+
ensureEnabledStatus();
|
|
291
|
+
const status = cloneStatus(state.status);
|
|
288
292
|
if (!status.locked) {
|
|
289
293
|
return rejectTransition(
|
|
290
294
|
"not_locked",
|
|
@@ -310,8 +314,8 @@ export function acknowledgeDiskPressureLock(): DiskPressureTransitionResult {
|
|
|
310
314
|
export function overrideDiskPressureLock(
|
|
311
315
|
confirmation: string,
|
|
312
316
|
): DiskPressureTransitionResult {
|
|
313
|
-
|
|
314
|
-
const status =
|
|
317
|
+
ensureEnabledStatus();
|
|
318
|
+
const status = cloneStatus(state.status);
|
|
315
319
|
if (!status.locked) {
|
|
316
320
|
return rejectTransition(
|
|
317
321
|
"not_locked",
|
|
@@ -65,6 +65,7 @@ import { getConfig } from "../config/loader.js";
|
|
|
65
65
|
import type { AssistantConfig } from "../config/schema.js";
|
|
66
66
|
import { HOOKS } from "../plugin-api/constants.js";
|
|
67
67
|
import { registerDefaultPlugins } from "../plugins/defaults/index.js";
|
|
68
|
+
import { installPluginRuntime } from "../plugins/external-api.js";
|
|
68
69
|
import { buildExternalPlugin } from "../plugins/external-plugin-loader.js";
|
|
69
70
|
import {
|
|
70
71
|
registerPluginSkills,
|
|
@@ -82,6 +83,7 @@ import {
|
|
|
82
83
|
type PluginShutdownContext,
|
|
83
84
|
type PluginSkillRegistration,
|
|
84
85
|
} from "../plugins/types.js";
|
|
86
|
+
import { loadUserPlugins } from "../plugins/user-loader.js";
|
|
85
87
|
import {
|
|
86
88
|
registerSkillRoute,
|
|
87
89
|
type SkillRouteHandle,
|
|
@@ -99,16 +101,6 @@ import { registerShutdownHook } from "./shutdown-registry.js";
|
|
|
99
101
|
|
|
100
102
|
const log = getLogger("plugins-bootstrap");
|
|
101
103
|
|
|
102
|
-
/**
|
|
103
|
-
* Minimal context required to bootstrap the plugin layer. Kept intentionally
|
|
104
|
-
* small so the call site in `lifecycle.ts` can construct it from whatever
|
|
105
|
-
* state is already available at that point in startup.
|
|
106
|
-
*/
|
|
107
|
-
export interface DaemonContext {
|
|
108
|
-
config: AssistantConfig;
|
|
109
|
-
assistantVersion: string;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
104
|
/**
|
|
113
105
|
* Resolve one credential value. Returns the raw secret string or throws a
|
|
114
106
|
* {@link PluginExecutionError} tagged with the plugin name so the caller can
|
|
@@ -191,6 +183,37 @@ function getDisabledPluginFlag(
|
|
|
191
183
|
return undefined;
|
|
192
184
|
}
|
|
193
185
|
|
|
186
|
+
/**
|
|
187
|
+
* Bring the plugin layer up during daemon startup. Runs the full sequence in
|
|
188
|
+
* the one order the rest of the system depends on:
|
|
189
|
+
*
|
|
190
|
+
* 1. Install the `globalThis.__vellumPluginRuntime` bridge so plugins can touch
|
|
191
|
+
* it from their module body (see `plugins/external-api.ts` — compiled-binary
|
|
192
|
+
* module identity).
|
|
193
|
+
* 2. Register the first-party defaults so their middleware and injectors
|
|
194
|
+
* compose innermost, ahead of any user plugins.
|
|
195
|
+
* 3. Load user plugins from `<workspaceDir>/plugins/*`. A failing user plugin is
|
|
196
|
+
* logged and skipped; `loadUserPlugins()` closes the registration window
|
|
197
|
+
* when it returns, so the defaults must already be registered by then.
|
|
198
|
+
* 4. Run every registered plugin's `init()` via {@link bootstrapPlugins}.
|
|
199
|
+
*
|
|
200
|
+
* Plugin bootstrap is wrapped so a failing plugin cannot block daemon startup —
|
|
201
|
+
* the daemon comes up with degraded plugin functionality instead.
|
|
202
|
+
*/
|
|
203
|
+
export async function initializePlugins(): Promise<void> {
|
|
204
|
+
installPluginRuntime();
|
|
205
|
+
registerDefaultPlugins();
|
|
206
|
+
await loadUserPlugins();
|
|
207
|
+
try {
|
|
208
|
+
await bootstrapPlugins();
|
|
209
|
+
} catch (err) {
|
|
210
|
+
log.warn(
|
|
211
|
+
{ err },
|
|
212
|
+
"Plugin bootstrap failed — continuing startup with degraded plugin functionality",
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
194
217
|
/**
|
|
195
218
|
* Run every registered plugin's `init()` hook sequentially and install a
|
|
196
219
|
* reverse-order shutdown hook. See the module docstring for full semantics.
|
|
@@ -203,7 +226,7 @@ function getDisabledPluginFlag(
|
|
|
203
226
|
* and before the first conversation is served. First-party defaults are
|
|
204
227
|
* registered inline via {@link registerDefaultPlugins}.
|
|
205
228
|
*/
|
|
206
|
-
export async function bootstrapPlugins(
|
|
229
|
+
export async function bootstrapPlugins(): Promise<void> {
|
|
207
230
|
// Register first-party default plugins. Each default wraps one of the
|
|
208
231
|
// assistant's canonical pipelines (`toolExecute`, `llmCall`, ...) with a
|
|
209
232
|
// passthrough so the pipeline shape is explicit at boot even when no
|
|
@@ -223,6 +246,8 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
|
|
|
223
246
|
|
|
224
247
|
log.info({ count: plugins.length }, "bootstrapPlugins: initializing plugins");
|
|
225
248
|
|
|
249
|
+
const assistantConfig = getConfig();
|
|
250
|
+
|
|
226
251
|
// Plugins that passed `requiresFlag` gating and therefore need the full
|
|
227
252
|
// init → contribute → shutdown lifecycle. Plugins skipped by the flag gate
|
|
228
253
|
// are omitted from this list so the shutdown hook below never tears down
|
|
@@ -245,7 +270,7 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
|
|
|
245
270
|
// shutdown hook below. Only `assistantVersion` is exposed today; future
|
|
246
271
|
// additions live on {@link PluginShutdownContext}.
|
|
247
272
|
const shutdownContext: PluginShutdownContext = {
|
|
248
|
-
assistantVersion:
|
|
273
|
+
assistantVersion: APP_VERSION,
|
|
249
274
|
};
|
|
250
275
|
|
|
251
276
|
async function rollbackPlugin(active: ActivePlugin): Promise<void> {
|
|
@@ -266,7 +291,7 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
|
|
|
266
291
|
|
|
267
292
|
for (const plugin of plugins) {
|
|
268
293
|
const name = plugin.manifest.name;
|
|
269
|
-
const disabledFlag = getDisabledPluginFlag(plugin,
|
|
294
|
+
const disabledFlag = getDisabledPluginFlag(plugin, assistantConfig);
|
|
270
295
|
if (disabledFlag !== undefined) {
|
|
271
296
|
log.info(
|
|
272
297
|
{ plugin: name, flag: disabledFlag },
|
|
@@ -277,7 +302,7 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
|
|
|
277
302
|
}
|
|
278
303
|
|
|
279
304
|
try {
|
|
280
|
-
activePlugins.push(await initializePlugin(plugin,
|
|
305
|
+
activePlugins.push(await initializePlugin(plugin, assistantConfig));
|
|
281
306
|
} catch (err) {
|
|
282
307
|
unregisterPlugin(name);
|
|
283
308
|
await teardownPartialInit();
|
|
@@ -326,7 +351,7 @@ interface ActivePlugin {
|
|
|
326
351
|
|
|
327
352
|
async function initializePlugin(
|
|
328
353
|
plugin: Plugin,
|
|
329
|
-
|
|
354
|
+
assistantConfig: AssistantConfig,
|
|
330
355
|
): Promise<ActivePlugin> {
|
|
331
356
|
const name = plugin.manifest.name;
|
|
332
357
|
const routeHandles: SkillRouteHandle[] = [];
|
|
@@ -341,7 +366,7 @@ async function initializePlugin(
|
|
|
341
366
|
const config = validatePluginConfig(
|
|
342
367
|
name,
|
|
343
368
|
plugin.manifest.config,
|
|
344
|
-
getPluginConfigRaw(
|
|
369
|
+
getPluginConfigRaw(assistantConfig, name),
|
|
345
370
|
);
|
|
346
371
|
|
|
347
372
|
const initContext = {
|
|
@@ -349,7 +374,7 @@ async function initializePlugin(
|
|
|
349
374
|
credentials,
|
|
350
375
|
logger: log.child({ plugin: name }),
|
|
351
376
|
pluginStorageDir: ensurePluginStorageDir(name),
|
|
352
|
-
assistantVersion:
|
|
377
|
+
assistantVersion: APP_VERSION,
|
|
353
378
|
};
|
|
354
379
|
|
|
355
380
|
if (plugin.tools && plugin.tools.length > 0) {
|
|
@@ -417,7 +442,7 @@ async function initializePlugin(
|
|
|
417
442
|
} catch (err) {
|
|
418
443
|
if (initCompleted) {
|
|
419
444
|
await teardownPlugin({ plugin, routeHandles }, "bootstrap-failed", {
|
|
420
|
-
assistantVersion:
|
|
445
|
+
assistantVersion: APP_VERSION,
|
|
421
446
|
});
|
|
422
447
|
} else {
|
|
423
448
|
for (const handle of routeHandles) {
|
|
@@ -519,11 +544,8 @@ export async function reregisterExternalPlugin(
|
|
|
519
544
|
return;
|
|
520
545
|
}
|
|
521
546
|
|
|
522
|
-
const
|
|
523
|
-
|
|
524
|
-
assistantVersion: APP_VERSION,
|
|
525
|
-
};
|
|
526
|
-
const disabledFlag = getDisabledPluginFlag(plugin, ctx.config);
|
|
547
|
+
const assistantConfig = getConfig();
|
|
548
|
+
const disabledFlag = getDisabledPluginFlag(plugin, assistantConfig);
|
|
527
549
|
if (disabledFlag !== undefined) {
|
|
528
550
|
log.info(
|
|
529
551
|
{ plugin: pluginName, flag: disabledFlag },
|
|
@@ -535,7 +557,7 @@ export async function reregisterExternalPlugin(
|
|
|
535
557
|
const existing = getRegisteredPlugin(pluginName);
|
|
536
558
|
if (existing === undefined) {
|
|
537
559
|
try {
|
|
538
|
-
await initializePlugin(plugin,
|
|
560
|
+
await initializePlugin(plugin, assistantConfig);
|
|
539
561
|
setRegisteredPlugin(plugin);
|
|
540
562
|
log.info({ plugin: pluginName }, "external plugin registered post-boot");
|
|
541
563
|
} catch (err) {
|
|
@@ -14,12 +14,6 @@ export interface OnboardingGreetingContext {
|
|
|
14
14
|
googleConnected?: boolean;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export const CANNED_FIRST_GREETING = [
|
|
18
|
-
"Hey,",
|
|
19
|
-
"",
|
|
20
|
-
"We can get into whatever you've got, or just talk first — that tends to go better. Up to you.",
|
|
21
|
-
].join("\n");
|
|
22
|
-
|
|
23
17
|
/**
|
|
24
18
|
* Returns `true` when all of the following are true:
|
|
25
19
|
* - `conversationMessageCount === 0` (no prior messages in this conversation)
|
|
@@ -49,6 +43,28 @@ export function getCannedFirstGreeting(
|
|
|
49
43
|
return CANNED_FIRST_GREETING;
|
|
50
44
|
}
|
|
51
45
|
|
|
46
|
+
/**
|
|
47
|
+
* Builds a natural self-introduction to send *on behalf of the user* in place
|
|
48
|
+
* of the wake-up greeting, so the assistant generates a real response instead
|
|
49
|
+
* of replaying canned copy. Names come from the onboarding context; missing
|
|
50
|
+
* names are dropped so the line stays natural:
|
|
51
|
+
* - both: "Hi Vela, I'm alex. Nice to meet you."
|
|
52
|
+
* - assistant only: "Hi Vela. Nice to meet you."
|
|
53
|
+
* - user only: "Hi, I'm alex. Nice to meet you."
|
|
54
|
+
* When neither name is known there is nothing personal to say, so this returns
|
|
55
|
+
* `undefined` and the caller falls back to the canned greeting.
|
|
56
|
+
*/
|
|
57
|
+
export function buildSelfIntroMessage(
|
|
58
|
+
onboarding?: OnboardingGreetingContext,
|
|
59
|
+
): string | undefined {
|
|
60
|
+
const assistant = onboarding?.assistantName?.trim();
|
|
61
|
+
const user = onboarding?.userName?.trim();
|
|
62
|
+
if (!assistant && !user) return undefined;
|
|
63
|
+
const hi = assistant ? `Hi ${assistant}` : "Hi";
|
|
64
|
+
const intro = user ? `, I'm ${user}` : "";
|
|
65
|
+
return `${hi}${intro}. Nice to meet you.`;
|
|
66
|
+
}
|
|
67
|
+
|
|
52
68
|
const TONE_INTRO_CLOSE: Record<Tone, string> = {
|
|
53
69
|
grounded: "",
|
|
54
70
|
warm: "Good to meet you.",
|
|
@@ -67,30 +83,54 @@ function buildIntroLine(
|
|
|
67
83
|
return [greeting, who, close].filter(Boolean).join(" ");
|
|
68
84
|
}
|
|
69
85
|
|
|
70
|
-
|
|
86
|
+
// Every greeting variant — the no-onboarding CANNED greeting and all four
|
|
87
|
+
// personalized tones — ends with a migration offer. The opener (task-vs-talk)
|
|
88
|
+
// and the migration offer are kept as separate per-tone maps and composed in
|
|
89
|
+
// `buildInvite`, rather than inlined as one full sentence per variant, so the
|
|
90
|
+
// offer cannot be silently dropped from a variant when the opener copy is
|
|
91
|
+
// edited. The first-greeting test asserts every variant still includes it.
|
|
92
|
+
const TONE_INVITE_OPENER: Record<Tone, string> = {
|
|
71
93
|
grounded:
|
|
72
94
|
"We can get into whatever you've got, or just talk first — that tends to go better. Up to you.",
|
|
73
95
|
warm: "We can start on something specific, or just talk for a bit first — honestly that tends to work out better. Either way, I'm here.",
|
|
74
96
|
energetic:
|
|
75
|
-
"We can jump straight into whatever you've got, or take a few minutes to just talk first.
|
|
97
|
+
"We can jump straight into whatever you've got, or take a few minutes to just talk first.",
|
|
76
98
|
poetic:
|
|
77
99
|
"We can start with whatever's in front of you, or just talk for a bit first. Either way.",
|
|
78
100
|
};
|
|
79
101
|
|
|
102
|
+
const TONE_MIGRATION_OFFER: Record<Tone, string> = {
|
|
103
|
+
grounded:
|
|
104
|
+
"And you don't have to start me from scratch — if you've built up a ChatGPT or Claude, bring it over and I'll learn from it fast. Best head start you can give me.",
|
|
105
|
+
warm: "And you don't have to start me from scratch — if there's a ChatGPT or Claude that already knows you, bring it over and I'll get up to speed fast. Honestly, it's the best head start you could give me.",
|
|
106
|
+
energetic:
|
|
107
|
+
"And you don't have to start me from scratch — if you've built up a ChatGPT or Claude, bring it over and I'll get up to speed fast. Best head start you can give me — want to start there?",
|
|
108
|
+
poetic:
|
|
109
|
+
"And you don't have to start me from nothing — if there's a ChatGPT or Claude that already knows you, bring it over and I'll learn from it. The best head start you could give me.",
|
|
110
|
+
};
|
|
111
|
+
|
|
80
112
|
const TONE_GOOGLE_SCAN: Record<Tone, string> = {
|
|
81
113
|
grounded:
|
|
82
|
-
"I can scan
|
|
83
|
-
warm: "Also — I can scan
|
|
114
|
+
"I can scan Gmail in the background while we talk — just say the word.",
|
|
115
|
+
warm: "Also — I can scan Gmail in the background while we chat, if you'd like. Just let me know.",
|
|
84
116
|
energetic:
|
|
85
|
-
"Oh, and I can scan
|
|
117
|
+
"Oh, and I can scan Gmail in the background right now — want me to?",
|
|
86
118
|
poetic:
|
|
87
|
-
"I can also look through
|
|
119
|
+
"I can also look through Gmail quietly in the background — say the word.",
|
|
88
120
|
};
|
|
89
121
|
|
|
90
122
|
function buildInvite(tone: Tone = "grounded"): string {
|
|
91
|
-
return
|
|
123
|
+
return `${TONE_INVITE_OPENER[tone]} ${TONE_MIGRATION_OFFER[tone]}`;
|
|
92
124
|
}
|
|
93
125
|
|
|
126
|
+
// Composed from the grounded opener + migration offer so the no-onboarding
|
|
127
|
+
// greeting reuses the same source as the personalized grounded greeting rather
|
|
128
|
+
// than duplicating the copy. Defined after the tone maps so they are
|
|
129
|
+
// initialized before this module-level evaluation runs.
|
|
130
|
+
export const CANNED_FIRST_GREETING = ["Hey,", "", buildInvite("grounded")].join(
|
|
131
|
+
"\n",
|
|
132
|
+
);
|
|
133
|
+
|
|
94
134
|
const VALID_TONES = new Set<string>([
|
|
95
135
|
"grounded",
|
|
96
136
|
"warm",
|
|
@@ -44,9 +44,9 @@ export function createGuardianActionCopyGenerator(): GuardianActionCopyGenerator
|
|
|
44
44
|
|
|
45
45
|
const response = await provider.sendMessage(
|
|
46
46
|
[{ role: "user", content: [{ type: "text", text: prompt }] }],
|
|
47
|
-
[],
|
|
48
|
-
GUARDIAN_ACTION_COPY_SYSTEM_PROMPT,
|
|
49
47
|
{
|
|
48
|
+
tools: [],
|
|
49
|
+
systemPrompt: GUARDIAN_ACTION_COPY_SYSTEM_PROMPT,
|
|
50
50
|
config: {
|
|
51
51
|
max_tokens: options.maxTokens ?? GUARDIAN_ACTION_COPY_MAX_TOKENS,
|
|
52
52
|
callSite: "guardianQuestionCopy",
|
|
@@ -3,7 +3,6 @@ import { v4 as uuid } from "uuid";
|
|
|
3
3
|
import { clearAll, getConversation } from "../../memory/conversation-crud.js";
|
|
4
4
|
import { resolveConversationId } from "../../memory/conversation-key-store.js";
|
|
5
5
|
import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
|
|
6
|
-
import * as pendingInteractions from "../../runtime/pending-interactions.js";
|
|
7
6
|
import { getSubagentManager } from "../../subagent/index.js";
|
|
8
7
|
import { createAbortReason } from "../../util/abort-reasons.js";
|
|
9
8
|
import { truncate } from "../../util/truncate.js";
|
|
@@ -28,23 +27,11 @@ export function handleConfirmationResponse(msg: ConfirmationResponse): void {
|
|
|
28
27
|
for (const [conversationId, conversation] of conversationEntries()) {
|
|
29
28
|
if (conversation.hasPendingConfirmation(msg.requestId)) {
|
|
30
29
|
touchConversation(conversationId);
|
|
31
|
-
conversation.handleConfirmationResponse(
|
|
32
|
-
msg.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
undefined,
|
|
37
|
-
{ source: "button" },
|
|
38
|
-
);
|
|
39
|
-
// Idempotent cleanup: the prompter's `resolveConfirmation` already
|
|
40
|
-
// resolved the interaction with the correct approved/rejected state
|
|
41
|
-
// before we reach here, so the entry is typically gone. This call is
|
|
42
|
-
// a safety net for paths where the prompter no-ops; map decision to
|
|
43
|
-
// state to keep the emitted event accurate when it does fire.
|
|
44
|
-
pendingInteractions.resolve(
|
|
45
|
-
msg.requestId,
|
|
46
|
-
decision === "allow" ? "approved" : "rejected",
|
|
47
|
-
);
|
|
30
|
+
conversation.handleConfirmationResponse(msg.requestId, decision, {
|
|
31
|
+
selectedPattern: msg.selectedPattern,
|
|
32
|
+
selectedScope: msg.selectedScope,
|
|
33
|
+
emissionContext: { source: "button" },
|
|
34
|
+
});
|
|
48
35
|
return;
|
|
49
36
|
}
|
|
50
37
|
}
|
|
@@ -225,10 +212,7 @@ export function steerToMessage(
|
|
|
225
212
|
| { steered: true }
|
|
226
213
|
| {
|
|
227
214
|
steered: false;
|
|
228
|
-
reason:
|
|
229
|
-
| "conversation_not_found"
|
|
230
|
-
| "message_not_found"
|
|
231
|
-
| "not_processing";
|
|
215
|
+
reason: "conversation_not_found" | "message_not_found" | "not_processing";
|
|
232
216
|
} {
|
|
233
217
|
const conversation = findConversation(conversationId);
|
|
234
218
|
if (!conversation) {
|
|
@@ -85,11 +85,18 @@ export interface HistorySurface {
|
|
|
85
85
|
surfaceType: string;
|
|
86
86
|
title?: string;
|
|
87
87
|
data: Record<string, unknown>;
|
|
88
|
-
actions?: Array<{
|
|
88
|
+
actions?: Array<{
|
|
89
|
+
id: string;
|
|
90
|
+
label: string;
|
|
91
|
+
style?: string;
|
|
92
|
+
data?: Record<string, unknown>;
|
|
93
|
+
}>;
|
|
89
94
|
display?: string;
|
|
90
95
|
persistent?: boolean;
|
|
91
96
|
completed?: boolean;
|
|
92
97
|
completionSummary?: string;
|
|
98
|
+
/** Id of the tool call that produced this surface (the `ui_show` proxy tool). Lets the client gate app previews on the tool result's arrival rather than whole-turn streaming state. */
|
|
99
|
+
toolCallId?: string;
|
|
93
100
|
}
|
|
94
101
|
|
|
95
102
|
/**
|
|
@@ -371,6 +378,8 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
|
|
|
371
378
|
typeof block.completionSummary === "string"
|
|
372
379
|
? block.completionSummary
|
|
373
380
|
: undefined,
|
|
381
|
+
toolCallId:
|
|
382
|
+
typeof block.toolCallId === "string" ? block.toolCallId : undefined,
|
|
374
383
|
};
|
|
375
384
|
surfaces.push(surface);
|
|
376
385
|
contentOrder.push(`surface:${surfaces.length - 1}`);
|
|
@@ -328,6 +328,7 @@ function toSlimSkillResponse(
|
|
|
328
328
|
const origin = deriveOrigin(kind, summary.directoryPath, installMeta);
|
|
329
329
|
const status: SlimSkillResponse["status"] = state;
|
|
330
330
|
|
|
331
|
+
const category = inferCategory(summary.displayName, summary.description);
|
|
331
332
|
const base = {
|
|
332
333
|
id: summary.id,
|
|
333
334
|
name: summary.displayName,
|
|
@@ -335,6 +336,7 @@ function toSlimSkillResponse(
|
|
|
335
336
|
emoji: summary.emoji,
|
|
336
337
|
kind,
|
|
337
338
|
status,
|
|
339
|
+
category,
|
|
338
340
|
} as const;
|
|
339
341
|
|
|
340
342
|
switch (origin) {
|
|
@@ -511,16 +513,13 @@ export async function listSkillsFiltered(filter: SkillListFilter): Promise<{
|
|
|
511
513
|
// Compute category counts BEFORE applying the category filter
|
|
512
514
|
const categoryCounts: Record<string, number> = {};
|
|
513
515
|
for (const s of skills) {
|
|
514
|
-
|
|
515
|
-
categoryCounts[cat] = (categoryCounts[cat] ?? 0) + 1;
|
|
516
|
+
categoryCounts[s.category] = (categoryCounts[s.category] ?? 0) + 1;
|
|
516
517
|
}
|
|
517
518
|
const totalCount = skills.length;
|
|
518
519
|
|
|
519
520
|
// Apply category filter
|
|
520
521
|
if (filter.category) {
|
|
521
|
-
skills = skills.filter(
|
|
522
|
-
(s) => inferCategory(s.name, s.description) === filter.category,
|
|
523
|
-
);
|
|
522
|
+
skills = skills.filter((s) => s.category === filter.category);
|
|
524
523
|
}
|
|
525
524
|
|
|
526
525
|
// Sort: installed first, community origins before core within installed,
|
|
@@ -610,6 +609,7 @@ export async function getSkill(
|
|
|
610
609
|
kind: slim.kind,
|
|
611
610
|
origin: slim.origin,
|
|
612
611
|
status: slim.status,
|
|
612
|
+
category: slim.category,
|
|
613
613
|
slug: slim.slug,
|
|
614
614
|
author: slim.author,
|
|
615
615
|
stars: slim.stars,
|
|
@@ -649,6 +649,7 @@ export async function getSkill(
|
|
|
649
649
|
kind: slim.kind,
|
|
650
650
|
origin: slim.origin,
|
|
651
651
|
status: slim.status,
|
|
652
|
+
category: slim.category,
|
|
652
653
|
slug: slim.slug,
|
|
653
654
|
sourceRepo: slim.sourceRepo,
|
|
654
655
|
installs: slim.installs,
|
|
@@ -679,6 +680,7 @@ export async function getSkill(
|
|
|
679
680
|
kind: slim.kind,
|
|
680
681
|
origin: slim.origin,
|
|
681
682
|
status: slim.status,
|
|
683
|
+
category: slim.category,
|
|
682
684
|
};
|
|
683
685
|
return { skill: detail };
|
|
684
686
|
}
|
|
@@ -1367,6 +1369,7 @@ export async function searchSkills(
|
|
|
1367
1369
|
kind: "catalog" as const,
|
|
1368
1370
|
origin: "vellum" as const,
|
|
1369
1371
|
status: "available" as const,
|
|
1372
|
+
category: inferCategory(s.displayName, s.description),
|
|
1370
1373
|
};
|
|
1371
1374
|
});
|
|
1372
1375
|
|
|
@@ -1385,6 +1388,7 @@ export async function searchSkills(
|
|
|
1385
1388
|
kind: "catalog" as const,
|
|
1386
1389
|
origin: "clawhub" as const,
|
|
1387
1390
|
status: "available" as const,
|
|
1391
|
+
category: inferCategory(s.name, s.description),
|
|
1388
1392
|
slug: s.slug,
|
|
1389
1393
|
author: s.author,
|
|
1390
1394
|
stars: s.stars,
|
|
@@ -1411,6 +1415,7 @@ export async function searchSkills(
|
|
|
1411
1415
|
kind: "catalog" as const,
|
|
1412
1416
|
origin: "skillssh" as const,
|
|
1413
1417
|
status: "available" as const,
|
|
1418
|
+
category: inferCategory(r.name, ""),
|
|
1414
1419
|
slug: r.id,
|
|
1415
1420
|
sourceRepo: r.source,
|
|
1416
1421
|
installs: r.installs,
|
|
@@ -1562,15 +1567,11 @@ export async function draftSkill(params: {
|
|
|
1562
1567
|
body.slice(0, 2000),
|
|
1563
1568
|
].join("\n");
|
|
1564
1569
|
|
|
1565
|
-
const response = await provider.sendMessage(
|
|
1566
|
-
[
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
config: { callSite: "skillCategoryInference", max_tokens: 256 },
|
|
1571
|
-
signal,
|
|
1572
|
-
},
|
|
1573
|
-
);
|
|
1570
|
+
const response = await provider.sendMessage([userMessage(prompt)], {
|
|
1571
|
+
tools: [],
|
|
1572
|
+
config: { callSite: "skillCategoryInference", max_tokens: 256 },
|
|
1573
|
+
signal,
|
|
1574
|
+
});
|
|
1574
1575
|
cleanup();
|
|
1575
1576
|
|
|
1576
1577
|
const responseText = extractText(response);
|