@vellumai/assistant 0.8.0 → 0.8.2
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 +11 -0
- package/ARCHITECTURE.md +2 -7
- package/Dockerfile +80 -5
- package/README.md +2 -2
- package/bun.lock +11 -1
- package/docker-entrypoint.sh +21 -0
- package/docker-init-apt-root.sh +94 -0
- package/docker-kata-apt-env.sh +39 -0
- package/docs/plugins.md +88 -47
- package/docs/skills.md +9 -7
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
- package/eslint-rules/cli-no-daemon-internals.js +283 -0
- package/eslint.config.mjs +12 -0
- package/examples/plugins/echo/README.md +27 -27
- package/examples/plugins/echo/package.json +3 -0
- package/examples/plugins/echo/register.ts +31 -31
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/node_modules/@vellumai/slack-text/src/index.test.ts +114 -14
- package/node_modules/@vellumai/slack-text/src/index.ts +82 -18
- package/openapi.yaml +4462 -991
- package/package.json +5 -1
- package/scripts/generate-openapi.ts +135 -14
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +129 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-image-optimize.test.ts +11 -3
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
- package/src/__tests__/anthropic-provider.test.ts +137 -2
- package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/app-executors.test.ts +220 -4
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
- package/src/__tests__/avatar-identity-sync.test.ts +87 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +1 -0
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-site-routing-provider.test.ts +172 -45
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
- package/src/__tests__/channel-availability-routes.test.ts +206 -0
- package/src/__tests__/channel-delivery-store.test.ts +289 -1
- package/src/__tests__/channel-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
- package/src/__tests__/clawhub.test.ts +75 -16
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
- package/src/__tests__/compactor-tail-resolution.test.ts +41 -0
- package/src/__tests__/config-loader-backfill.test.ts +526 -102
- package/src/__tests__/config-loader-corrupt.test.ts +68 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +35 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +278 -0
- package/src/__tests__/config-sounds-sync.test.ts +97 -0
- package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
- package/src/__tests__/config-watcher.test.ts +6 -0
- package/src/__tests__/contacts-tools.test.ts +51 -199
- package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
- package/src/__tests__/context-search-agent-runner.test.ts +22 -138
- package/src/__tests__/context-search-conversations-source.test.ts +159 -18
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -4
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-search-workspace-source.test.ts +7 -0
- package/src/__tests__/context-token-estimator.test.ts +1 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +93 -92
- package/src/__tests__/conversation-agent-loop.test.ts +2 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +80 -3
- package/src/__tests__/conversation-fork-crud.test.ts +323 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +54 -18
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
- package/src/__tests__/conversation-lifecycle.test.ts +297 -0
- package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
- package/src/__tests__/conversation-pairing.test.ts +54 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +25 -2
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
- package/src/__tests__/conversation-queue.test.ts +4 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +80 -13
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-slash-queue.test.ts +59 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
- package/src/__tests__/conversation-sync-tags.test.ts +235 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
- package/src/__tests__/credential-security-invariants.test.ts +8 -8
- package/src/__tests__/daemon-credential-client.test.ts +56 -1
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
- package/src/__tests__/db-proxy-transaction.test.ts +206 -0
- package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
- package/src/__tests__/disk-pressure-tools.test.ts +1 -0
- package/src/__tests__/dm-backfill.test.ts +121 -10
- package/src/__tests__/document-tool-security.test.ts +258 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/edit-propagation.test.ts +33 -0
- package/src/__tests__/empty-response-pipeline.test.ts +0 -4
- package/src/__tests__/external-plugin-loader.test.ts +482 -0
- package/src/__tests__/filing-service.test.ts +163 -3
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +42 -69
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/helpers/tar-fixtures.ts +39 -0
- package/src/__tests__/helpers/wait-for.ts +21 -0
- package/src/__tests__/history-repair-pipeline.test.ts +0 -3
- package/src/__tests__/history-repair.test.ts +162 -0
- package/src/__tests__/host-app-control-proxy.test.ts +365 -1
- package/src/__tests__/host-app-control-routes.test.ts +247 -1
- package/src/__tests__/host-browser-proxy.test.ts +416 -20
- package/src/__tests__/host-browser-routes.test.ts +325 -33
- package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
- package/src/__tests__/image-credentials.test.ts +1 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +156 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +410 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +248 -0
- package/src/__tests__/injector-chain.test.ts +10 -8
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +157 -39
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +107 -3
- package/src/__tests__/list-messages-page-latest.test.ts +55 -0
- package/src/__tests__/llm-call-pipeline.test.ts +0 -3
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +190 -2
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +222 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +100 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/llm-usage-store.test.ts +114 -0
- package/src/__tests__/managed-profile-guard.test.ts +145 -14
- package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
- package/src/__tests__/managed-store.test.ts +84 -192
- package/src/__tests__/mcp-auth-routes.test.ts +1 -0
- package/src/__tests__/mcp-cli.test.ts +182 -220
- package/src/__tests__/mcp-health-check.test.ts +56 -27
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -2009
- package/src/__tests__/oauth-commands-routes.test.ts +863 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-provider.test.ts +24 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +48 -19
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
- package/src/__tests__/persistence-pipeline.test.ts +0 -2
- package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +1 -1
- package/src/__tests__/platform.test.ts +2 -0
- package/src/__tests__/plugin-api-shim.test.ts +125 -0
- package/src/__tests__/plugin-bootstrap.test.ts +41 -38
- package/src/__tests__/plugin-external-api.test.ts +68 -0
- package/src/__tests__/plugin-registry.test.ts +0 -77
- package/src/__tests__/plugin-route-contribution.test.ts +31 -4
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -18
- package/src/__tests__/plugin-types.test.ts +15 -23
- package/src/__tests__/process-message-background-slack.test.ts +53 -0
- package/src/__tests__/process-message-display-content.test.ts +421 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-catalog-visibility.test.ts +142 -0
- package/src/__tests__/provider-error-scenarios.test.ts +111 -0
- package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +20 -12
- package/src/__tests__/provider-registry-ollama.test.ts +12 -4
- package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
- package/src/__tests__/relay-server.test.ts +118 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +151 -0
- package/src/__tests__/schedule-store.test.ts +94 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
- package/src/__tests__/scheduler-recurrence.test.ts +87 -34
- package/src/__tests__/scheduler-reuse-conversation.test.ts +208 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/schema-transforms.test.ts +20 -0
- package/src/__tests__/search-skills-unified.test.ts +0 -5
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +12 -4
- package/src/__tests__/server-history-render.test.ts +43 -0
- package/src/__tests__/shell-credential-ref.test.ts +95 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -12
- package/src/__tests__/skill-load-tool.test.ts +29 -93
- package/src/__tests__/skill-memory.test.ts +23 -3
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
- package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
- package/src/__tests__/skills-install-extract.test.ts +49 -38
- package/src/__tests__/skills-install-staging.test.ts +159 -0
- package/src/__tests__/skills-uninstall.test.ts +9 -41
- package/src/__tests__/skills.test.ts +51 -58
- package/src/__tests__/slack-channel-config.test.ts +9 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/system-prompt.test.ts +737 -63
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/terminal-tools.test.ts +28 -1
- package/src/__tests__/thread-backfill.test.ts +557 -27
- package/src/__tests__/title-generate-pipeline.test.ts +0 -13
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
- package/src/__tests__/tool-error-pipeline.test.ts +0 -3
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +16 -4
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
- package/src/__tests__/turn-events-store.test.ts +256 -0
- package/src/__tests__/twilio-routes.test.ts +4 -0
- package/src/__tests__/update-bulletin-job.test.ts +96 -193
- package/src/__tests__/usage-cli.test.ts +11 -73
- package/src/__tests__/user-plugin-loader.test.ts +143 -5
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/voice-session-bridge.test.ts +198 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +108 -0
- package/src/__tests__/web-search.test.ts +303 -2
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +170 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +241 -0
- package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
- package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
- package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
- package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
- package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
- package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
- package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
- package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
- package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
- package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
- package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
- package/src/acp/__tests__/helpers/which-stub.ts +4 -2
- package/src/acp/resolve-agent.test.ts +25 -0
- package/src/acp/resolve-agent.ts +13 -2
- package/src/acp/session-manager.ts +14 -0
- package/src/agent/image-optimize.ts +13 -5
- package/src/approvals/guardian-request-resolvers.ts +32 -87
- package/src/calls/relay-server.ts +35 -0
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +74 -36
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +109 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -0
- package/src/cli/__tests__/unknown-command.test.ts +24 -0
- package/src/cli/commands/__tests__/avatar.test.ts +540 -0
- package/src/cli/commands/__tests__/backup.test.ts +236 -776
- package/src/cli/commands/__tests__/cache.test.ts +1 -1
- package/src/cli/commands/__tests__/changelog.test.ts +578 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
- package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
- package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
- package/src/cli/commands/__tests__/email-core.test.ts +579 -0
- package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
- package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
- package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
- package/src/cli/commands/__tests__/schedules.test.ts +491 -0
- package/src/cli/commands/__tests__/skills.test.ts +563 -0
- package/src/cli/commands/__tests__/status.test.ts +249 -0
- package/src/cli/commands/__tests__/stt.test.ts +320 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
- package/src/cli/commands/__tests__/tts.test.ts +321 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
- package/src/cli/commands/attachment.ts +8 -3
- package/src/cli/commands/audit.ts +95 -64
- package/src/cli/commands/auth.ts +61 -58
- package/src/cli/commands/avatar.ts +276 -390
- package/src/cli/commands/backup.ts +409 -505
- package/src/cli/commands/bash.ts +9 -5
- package/src/cli/commands/browser.ts +28 -9
- package/src/cli/commands/cache.ts +9 -4
- package/src/cli/commands/changelog.ts +478 -0
- package/src/cli/commands/channel-verification-sessions.ts +238 -317
- package/src/cli/commands/clients.ts +8 -3
- package/src/cli/commands/completions.ts +9 -9
- package/src/cli/commands/config.ts +102 -72
- package/src/cli/commands/contacts.ts +575 -696
- package/src/cli/commands/conversations-defer.ts +17 -69
- package/src/cli/commands/conversations-import.ts +90 -253
- package/src/cli/commands/conversations.ts +429 -434
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- package/src/cli/commands/default-action.ts +10 -53
- package/src/cli/commands/domain.ts +128 -206
- package/src/cli/commands/email.ts +606 -794
- package/src/cli/commands/gateway.ts +8 -1
- package/src/cli/commands/image-generation.ts +157 -205
- package/src/cli/commands/inference-providers.ts +352 -0
- package/src/cli/commands/inference-session.ts +415 -0
- package/src/cli/commands/inference.ts +87 -65
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.ts +103 -287
- package/src/cli/commands/memory-v2.ts +162 -516
- package/src/cli/commands/notifications.ts +342 -304
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +176 -297
- package/src/cli/commands/oauth/disconnect.ts +16 -215
- package/src/cli/commands/oauth/index.ts +49 -45
- package/src/cli/commands/oauth/mode.ts +43 -199
- package/src/cli/commands/oauth/ping.ts +17 -125
- package/src/cli/commands/oauth/providers.ts +732 -921
- package/src/cli/commands/oauth/request.ts +60 -350
- package/src/cli/commands/oauth/shared.ts +11 -121
- package/src/cli/commands/oauth/status.ts +31 -121
- package/src/cli/commands/oauth/token.ts +13 -55
- package/src/cli/commands/pending.ts +19 -10
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
- package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
- package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
- package/src/cli/commands/platform/connect.ts +16 -80
- package/src/cli/commands/platform/disconnect.ts +14 -112
- package/src/cli/commands/platform/index.ts +177 -246
- package/src/cli/commands/plugins.ts +185 -0
- package/src/cli/commands/routes.ts +153 -336
- package/src/cli/commands/schedules.ts +391 -0
- package/src/cli/commands/sequence.ts +316 -360
- package/src/cli/commands/skills.ts +449 -671
- package/src/cli/commands/status.ts +58 -37
- package/src/cli/commands/stt.ts +94 -262
- package/src/cli/commands/task.ts +14 -40
- package/src/cli/commands/telemetry.ts +40 -0
- package/src/cli/commands/trust.ts +8 -3
- package/src/cli/commands/tts.ts +162 -167
- package/src/cli/commands/ui.ts +35 -42
- package/src/cli/commands/usage.ts +188 -126
- package/src/cli/commands/watchers.ts +8 -3
- package/src/cli/commands/webhooks.ts +99 -193
- package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
- package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
- package/src/cli/lib/__tests__/register-command.test.ts +85 -0
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
- package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
- package/src/cli/lib/cli-colors.ts +12 -0
- package/src/cli/lib/confirm-prompt.ts +79 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- package/src/cli/lib/install-from-github.ts +304 -0
- package/src/cli/lib/list-installed-plugins.ts +137 -0
- package/src/cli/lib/nested-value.ts +44 -0
- package/src/cli/lib/open-browser.ts +36 -0
- package/src/cli/lib/register-command.ts +19 -0
- package/src/cli/lib/time-ago.ts +34 -0
- package/src/cli/lib/uninstall-plugin.ts +82 -0
- package/src/cli/lib/unknown-command.ts +111 -0
- package/src/cli/program.ts +40 -6
- package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
- package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
- package/src/cli/utils/conversation-id.ts +30 -0
- package/src/cli/utils/parse-duration.ts +41 -0
- package/src/config/acp-defaults.test.ts +5 -1
- package/src/config/acp-defaults.ts +11 -4
- package/src/config/bundled-skills/acp/TOOLS.json +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +23 -21
- package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
- package/src/config/bundled-skills/contacts/SKILL.md +12 -45
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
- package/src/config/bundled-skills/document/SKILL.md +23 -3
- package/src/config/bundled-skills/document/TOOLS.json +53 -0
- package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
- package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
- package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
- package/src/config/bundled-tool-registry.ts +6 -2
- package/src/config/feature-flag-registry.json +57 -1
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +140 -52
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +8 -7
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
- package/src/config/schemas/call-site-catalog.ts +29 -7
- package/src/config/schemas/channels.ts +8 -0
- package/src/config/schemas/compaction.ts +28 -0
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm-request-logs.ts +81 -0
- package/src/config/schemas/llm.ts +55 -2
- package/src/config/schemas/memory-retrieval.ts +18 -0
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +32 -1
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/schemas/tools.ts +14 -0
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/config/skills.ts +3 -96
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/compactor.ts +1047 -0
- package/src/context/token-estimator.ts +2 -2
- package/src/context/window-manager.ts +197 -1334
- package/src/credential-execution/managed-catalog.ts +37 -0
- package/src/credential-health/credential-health-service.ts +280 -19
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +113 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +183 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +26 -30
- package/src/daemon/config-watcher.ts +94 -29
- package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
- package/src/daemon/conversation-agent-loop.ts +293 -103
- package/src/daemon/conversation-error.ts +188 -33
- package/src/daemon/conversation-lifecycle.ts +80 -26
- package/src/daemon/conversation-messaging.ts +25 -6
- package/src/daemon/conversation-process.ts +85 -31
- package/src/daemon/conversation-runtime-assembly.ts +30 -6
- package/src/daemon/conversation-slash.ts +184 -25
- package/src/daemon/conversation-store.ts +24 -10
- package/src/daemon/conversation-surfaces.ts +76 -12
- package/src/daemon/conversation-tool-setup.ts +63 -21
- package/src/daemon/conversation.ts +81 -10
- package/src/daemon/external-plugins-bootstrap.ts +231 -185
- package/src/daemon/first-greeting.ts +22 -2
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +13 -130
- package/src/daemon/handlers/config-slack-channel.ts +25 -10
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/shared.ts +14 -5
- package/src/daemon/handlers/skills.ts +166 -84
- package/src/daemon/history-repair.ts +61 -7
- package/src/daemon/host-app-control-proxy.ts +129 -29
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +96 -35
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +79 -70
- package/src/daemon/meet-host-supervisor.ts +20 -19
- package/src/daemon/memory-v2-startup.ts +58 -2
- package/src/daemon/message-protocol.ts +7 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +37 -9
- package/src/daemon/message-types/messages.ts +70 -1
- package/src/daemon/message-types/subagents.ts +1 -0
- package/src/daemon/message-types/sync.ts +61 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/plugin-source-watcher.ts +146 -0
- package/src/daemon/process-message.ts +77 -26
- package/src/daemon/server.ts +34 -20
- package/src/daemon/shutdown-handlers.ts +0 -2
- package/src/daemon/skill-memory-refresh.ts +29 -0
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/daemon/tool-side-effects.ts +6 -4
- package/src/daemon/wake-target-adapter.ts +11 -0
- package/src/documents/document-store.ts +221 -3
- package/src/embedded/plugin-api.ts +40 -0
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +79 -53
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +444 -0
- package/src/heartbeat/heartbeat-run-store.ts +3 -1
- package/src/heartbeat/heartbeat-service.ts +189 -127
- package/src/home/__tests__/feed-types.test.ts +99 -127
- package/src/home/__tests__/feed-writer.test.ts +77 -278
- package/src/home/__tests__/post-connect-feed.test.ts +9 -12
- package/src/home/feed-types.ts +41 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +2 -3
- package/src/index.ts +18 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
- package/src/ipc/__tests__/email-ipc.test.ts +506 -0
- package/src/ipc/__tests__/exit-helper.test.ts +104 -0
- package/src/ipc/__tests__/streaming-client.test.ts +237 -0
- package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
- package/src/ipc/assistant-server.ts +55 -6
- package/src/ipc/cli-client.ts +370 -50
- package/src/ipc/routes/db-proxy-transaction.ts +151 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
- package/src/ipc/skill-routes/events.ts +30 -3
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
- package/src/live-voice/live-voice-session-manager.ts +11 -4
- package/src/live-voice/live-voice-session.ts +14 -6
- package/src/mcp/client.ts +20 -4
- package/src/media/image-credentials.ts +3 -3
- package/src/memory/__tests__/bookmark-crud.test.ts +264 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/memory/__tests__/conversation-queries.test.ts +263 -0
- package/src/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +318 -0
- package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
- package/src/memory/__tests__/message-content.test.ts +35 -0
- package/src/memory/bookmark-crud.ts +211 -0
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
- package/src/memory/context-search/agent-protocol.ts +5 -1
- package/src/memory/context-search/agent-runner.ts +60 -85
- package/src/memory/context-search/limits.ts +1 -4
- package/src/memory/context-search/search.ts +23 -113
- package/src/memory/context-search/sources/conversations.ts +80 -8
- package/src/memory/context-search/sources/memory-v2.ts +39 -14
- package/src/memory/context-search/sources/memory.ts +7 -0
- package/src/memory/context-search/sources/workspace.ts +17 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +368 -22
- package/src/memory/conversation-queries.ts +116 -12
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +20 -0
- package/src/memory/delivery-crud.ts +152 -5
- package/src/memory/embedding-backend.ts +6 -5
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/external-conversation-store.ts +66 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +66 -9
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +92 -5
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/tool-handlers.ts +17 -7
- package/src/memory/graph/tools.ts +45 -6
- package/src/memory/indexer.ts +51 -29
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +86 -15
- package/src/memory/jobs/embed-concept-page.ts +65 -20
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +57 -3
- package/src/memory/llm-request-log-source-clickhouse.ts +324 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +64 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/llm-usage-store.ts +125 -5
- package/src/memory/memory-retrospective-constants.ts +13 -0
- package/src/memory/memory-retrospective-enqueue.ts +114 -0
- package/src/memory/memory-retrospective-job.ts +351 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +175 -0
- package/src/memory/memory-retrospective-state.ts +162 -0
- package/src/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/memory/memory-v2-activation-log-store.ts +49 -5
- package/src/memory/memory-v2-concept-frequency.ts +4 -0
- package/src/memory/message-content.ts +38 -1
- package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
- package/src/memory/migrations/229-delete-private-conversations.test.ts +107 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +19 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
- package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
- package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
- package/src/memory/migrations/242-message-bookmarks.ts +38 -0
- package/src/memory/migrations/243-provider-connections.ts +68 -0
- package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
- package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
- package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
- package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
- package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
- package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
- package/src/memory/migrations/index.ts +13 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/onboarding-events-store.ts +106 -0
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/schema/bookmarks.ts +36 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +27 -0
- package/src/memory/schema/infrastructure.ts +12 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +1 -4
- package/src/memory/turn-events-store.ts +127 -2
- package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
- package/src/memory/v2/__tests__/activation.test.ts +11 -12
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
- package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
- package/src/memory/v2/__tests__/injection.test.ts +726 -18
- package/src/memory/v2/__tests__/migration.test.ts +94 -3
- package/src/memory/v2/__tests__/page-index.test.ts +360 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +309 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +138 -3
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +531 -0
- package/src/memory/v2/__tests__/sim.test.ts +45 -1
- package/src/memory/v2/__tests__/skill-store.test.ts +445 -11
- package/src/memory/v2/__tests__/static-context.test.ts +7 -22
- package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
- package/src/memory/v2/activation-store.ts +34 -5
- package/src/memory/v2/activation.ts +40 -27
- package/src/memory/v2/backfill-jobs.ts +17 -84
- package/src/memory/v2/consolidation-job.ts +85 -78
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +466 -109
- package/src/memory/v2/migration.ts +147 -20
- package/src/memory/v2/page-index.ts +221 -0
- package/src/memory/v2/page-store.ts +3 -0
- package/src/memory/v2/prompts/consolidation.ts +9 -7
- package/src/memory/v2/prompts/router.ts +195 -0
- package/src/memory/v2/prompts/sweep.ts +2 -2
- package/src/memory/v2/qdrant.ts +234 -93
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +323 -0
- package/src/memory/v2/sim.ts +25 -12
- package/src/memory/v2/skill-store.ts +204 -30
- package/src/memory/v2/static-context.ts +16 -9
- package/src/memory/v2/sweep-job.ts +122 -96
- package/src/memory/v2/types.ts +10 -6
- package/src/memory/validation.ts +13 -0
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
- package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
- package/src/messaging/providers/slack/adapter.ts +43 -5
- package/src/messaging/providers/slack/client.ts +27 -0
- package/src/messaging/providers/slack/deep-link.ts +65 -0
- package/src/messaging/providers/slack/download.ts +104 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
- package/src/messaging/providers/slack/message-metadata.ts +27 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
- package/src/messaging/providers/slack/render-transcript.ts +69 -5
- package/src/messaging/providers/slack/types.ts +20 -1
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
- package/src/notifications/__tests__/signal-registry.test.ts +17 -0
- package/src/notifications/adapters/platform.ts +171 -0
- package/src/notifications/conversation-pairing.ts +4 -3
- package/src/notifications/copy-composer.ts +15 -0
- package/src/notifications/decision-engine.ts +2 -1
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +48 -2
- package/src/notifications/home-feed-side-effect.ts +165 -0
- package/src/notifications/signal.ts +8 -1
- package/src/oauth/connection-resolver.ts +8 -4
- package/src/oauth/platform-connection.ts +6 -2
- package/src/oauth/seed-providers.ts +10 -1
- package/src/permissions/checker.ts +14 -0
- package/src/permissions/ipc-risk-types.ts +3 -0
- package/src/permissions/question-prompter.test.ts +416 -0
- package/src/permissions/question-prompter.ts +294 -0
- package/src/platform/client.test.ts +1 -1
- package/src/platform/client.ts +1 -1
- package/src/plugin-api/constants.ts +26 -0
- package/src/plugin-api/index.ts +46 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +144 -0
- package/src/plugins/defaults/circuit-breaker.ts +0 -5
- package/src/plugins/defaults/compaction.ts +0 -4
- package/src/plugins/defaults/empty-response.ts +0 -2
- package/src/plugins/defaults/history-repair.ts +0 -2
- package/src/plugins/defaults/injectors.ts +55 -6
- package/src/plugins/defaults/llm-call.ts +0 -2
- package/src/plugins/defaults/memory-retrieval.ts +0 -1
- package/src/plugins/defaults/overflow-reduce.ts +0 -1
- package/src/plugins/defaults/persistence.ts +0 -2
- package/src/plugins/defaults/title-generate.ts +0 -5
- package/src/plugins/defaults/token-estimate.ts +0 -2
- package/src/plugins/defaults/tool-error.ts +0 -7
- package/src/plugins/defaults/tool-execute.ts +0 -2
- package/src/plugins/defaults/tool-result-truncate.ts +0 -4
- package/src/plugins/ensure-plugin-api-shim.ts +96 -0
- package/src/plugins/external-api.ts +104 -0
- package/src/plugins/external-plugin-loader.ts +367 -0
- package/src/plugins/feature-gate.ts +22 -0
- package/src/plugins/pipeline.ts +37 -0
- package/src/plugins/registry.ts +48 -80
- package/src/plugins/types.ts +74 -53
- package/src/plugins/user-loader.ts +85 -43
- package/src/proactive-artifact/aux-message-injector.ts +11 -0
- package/src/proactive-artifact/job.test.ts +49 -9
- package/src/proactive-artifact/job.ts +4 -0
- package/src/proactive-artifact/trigger-state.test.ts +9 -0
- package/src/proactive-artifact/trigger-state.ts +4 -0
- package/src/prompts/__tests__/system-prompt.test.ts +117 -0
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +99 -0
- package/src/prompts/normalize-onboarding.ts +27 -0
- package/src/prompts/sections.ts +302 -0
- package/src/prompts/system-prompt.ts +72 -154
- package/src/prompts/templates/BOOTSTRAP.md +17 -1
- package/src/prompts/templates/system-sections.ts +173 -0
- package/src/prompts/update-bulletin-job.ts +61 -73
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
- package/src/providers/__tests__/inference.test.ts +303 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +14 -32
- package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
- package/src/providers/anthropic/client.ts +123 -54
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +170 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +210 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +401 -0
- package/src/providers/inference/resolve-auth.ts +73 -0
- package/src/providers/model-catalog.ts +386 -6
- package/src/providers/openai/chat-completions-provider.ts +10 -2
- package/src/providers/openai/responses-provider.ts +4 -2
- package/src/providers/openrouter/client.ts +7 -0
- package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -1
- package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
- package/src/providers/provider-availability.ts +17 -2
- package/src/providers/provider-catalog-visibility.ts +36 -0
- package/src/providers/provider-env-vars.ts +17 -7
- package/src/providers/provider-secret-catalog.ts +49 -30
- package/src/providers/provider-send-message.ts +41 -20
- package/src/providers/registry.ts +151 -159
- package/src/providers/retry.ts +65 -11
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- package/src/runtime/__tests__/agent-wake.test.ts +152 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
- package/src/runtime/actor-trust-resolver.ts +32 -10
- package/src/runtime/agent-wake.ts +64 -7
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +311 -9
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +3 -0
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +21 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/migrations/origin-mode.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/pre-first-message-gate.ts +83 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +268 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +319 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +280 -4
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +70 -3
- package/src/runtime/routes/acp-routes-list.test.ts +143 -0
- package/src/runtime/routes/acp-routes.ts +12 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +0 -18
- package/src/runtime/routes/audit-routes.ts +43 -0
- package/src/runtime/routes/auth-routes.ts +72 -0
- package/src/runtime/routes/avatar-routes.ts +273 -20
- package/src/runtime/routes/backup-routes.ts +406 -2
- package/src/runtime/routes/bookmark-routes.ts +156 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/channel-availability-routes.ts +121 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +233 -0
- package/src/runtime/routes/conversation-list-routes.ts +3 -20
- package/src/runtime/routes/conversation-management-routes.ts +47 -85
- package/src/runtime/routes/conversation-query-routes.ts +350 -97
- package/src/runtime/routes/conversation-routes.ts +121 -21
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- package/src/runtime/routes/documents-routes.ts +25 -86
- package/src/runtime/routes/domain-routes.ts +167 -0
- package/src/runtime/routes/email-routes.ts +603 -0
- package/src/runtime/routes/errors.ts +2 -2
- package/src/runtime/routes/events-routes.ts +192 -0
- package/src/runtime/routes/group-routes.ts +5 -0
- package/src/runtime/routes/home-feed-routes.ts +6 -78
- package/src/runtime/routes/host-app-control-routes.ts +44 -2
- package/src/runtime/routes/host-browser-routes.ts +103 -22
- package/src/runtime/routes/http-adapter.ts +2 -0
- package/src/runtime/routes/identity-routes.ts +5 -0
- package/src/runtime/routes/image-generation-routes.ts +99 -0
- package/src/runtime/routes/inbound-conversation.ts +28 -8
- package/src/runtime/routes/inbound-message-handler.ts +236 -41
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +248 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +118 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
- package/src/runtime/routes/index.ts +42 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +285 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +84 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +361 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/slack/share.ts +4 -52
- package/src/runtime/routes/integrations/slack/token.ts +43 -0
- package/src/runtime/routes/integrations/twilio.ts +7 -13
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-v2-routes.ts +13 -398
- package/src/runtime/routes/notification-routes.ts +3 -1
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1097 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
- package/src/runtime/routes/oauth-providers.ts +298 -8
- package/src/runtime/routes/platform-routes.ts +336 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -1
- package/src/runtime/routes/playground/reset-circuit.ts +2 -1
- package/src/runtime/routes/playground/state.ts +2 -1
- package/src/runtime/routes/publish-routes.ts +221 -0
- package/src/runtime/routes/question-routes.ts +259 -0
- package/src/runtime/routes/rename-conversation-routes.ts +2 -33
- package/src/runtime/routes/schedule-routes.ts +79 -0
- package/src/runtime/routes/sequence-routes.ts +291 -0
- package/src/runtime/routes/settings-routes.ts +2 -10
- package/src/runtime/routes/skills-routes.ts +31 -1
- package/src/runtime/routes/stt-routes.ts +240 -3
- package/src/runtime/routes/subagents-routes.ts +57 -18
- package/src/runtime/routes/surface-action-routes.ts +43 -7
- package/src/runtime/routes/telemetry-routes.ts +27 -0
- package/src/runtime/routes/tts-routes.ts +93 -1
- package/src/runtime/routes/types.ts +32 -0
- package/src/runtime/routes/user-routes-cli.ts +243 -0
- package/src/runtime/routes/webhook-routes.ts +165 -0
- package/src/runtime/routes/workspace-routes.test.ts +43 -0
- package/src/runtime/routes/workspace-routes.ts +28 -0
- package/src/runtime/services/conversation-serializer.ts +39 -7
- package/src/runtime/sync/resource-sync-events.ts +117 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/schedule-store.ts +27 -2
- package/src/schedule/scheduler.ts +208 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/__tests__/untrusted-content.test.ts +86 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/security/untrusted-content.ts +93 -8
- package/src/sequence/engine.ts +38 -40
- package/src/skills/catalog-files.ts +1 -1
- package/src/skills/catalog-install.ts +233 -116
- package/src/skills/clawhub.ts +70 -13
- package/src/skills/managed-store.ts +4 -119
- package/src/skills/skillssh-registry.ts +27 -48
- package/src/subagent/manager.ts +28 -15
- package/src/telemetry/types.ts +113 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
- package/src/telemetry/usage-telemetry-reporter.ts +113 -7
- package/src/tools/apps/executors.ts +58 -7
- package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
- package/src/tools/ask-question/ask-question-tool.ts +304 -0
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +29 -14
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
- package/src/tools/browser/cdp-client/factory.ts +66 -5
- package/src/tools/browser/runtime-check.ts +77 -0
- package/src/tools/computer-use/definitions.ts +3 -3
- package/src/tools/credentials/vault.ts +1 -1
- package/src/tools/document/document-tool.ts +124 -1
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +5 -2
- package/src/tools/host-filesystem/transfer.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +1 -1
- package/src/tools/memory/register.test.ts +3 -3
- package/src/tools/memory/register.ts +9 -1
- package/src/tools/network/__tests__/web-search.test.ts +156 -0
- package/src/tools/network/web-search.ts +280 -37
- package/src/tools/permission-checker.ts +14 -6
- package/src/tools/registry.ts +17 -7
- package/src/tools/schedule/create.ts +2 -2
- package/src/tools/schema-transforms.ts +7 -2
- package/src/tools/side-effects.ts +1 -0
- package/src/tools/skills/delete-managed.ts +4 -4
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/scaffold-managed.ts +3 -2
- package/src/tools/subagent/notify-parent.ts +1 -1
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/system/request-permission.ts +2 -2
- package/src/tools/terminal/safe-env.ts +60 -1
- package/src/tools/terminal/shell.ts +44 -0
- package/src/tools/tool-manifest.ts +2 -0
- package/src/tools/types.ts +72 -21
- package/src/tools/ui-surface/definitions.ts +6 -5
- package/src/tts/__tests__/provider-adapters.test.ts +76 -2
- package/src/tts/providers/elevenlabs-provider.ts +75 -1
- package/src/types/onboarding-context.ts +2 -0
- package/src/usage/attribution.ts +3 -2
- package/src/util/errors.ts +17 -0
- package/src/util/platform.ts +10 -0
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +323 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +94 -90
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
- package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +94 -5
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +117 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +95 -0
- package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
- package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
- package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
- package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
- package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
- package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
- package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
- package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
- package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
- package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
- package/src/workspace/migrations/registry.ts +30 -0
- package/src/workspace/migrations/runner.ts +46 -5
- package/src/workspace/migrations/types.ts +17 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/examples/plugins/echo/bun.lock +0 -25
- package/src/__tests__/context-search-pkb-source.test.ts +0 -498
- package/src/__tests__/context-window-manager.test.ts +0 -2093
- package/src/__tests__/credentials-cli.test.ts +0 -1225
- package/src/__tests__/memory-admin-recall.test.ts +0 -213
- package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
- package/src/cli/commands/__tests__/email-download.test.ts +0 -260
- package/src/cli/commands/__tests__/email-list.test.ts +0 -216
- package/src/cli/commands/__tests__/email-register.test.ts +0 -186
- package/src/cli/commands/__tests__/email-send.test.ts +0 -416
- package/src/cli/commands/__tests__/email-status.test.ts +0 -185
- package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
- package/src/cli/commands/__tests__/routes.test.ts +0 -562
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
- package/src/cli/commands/autonomy.ts +0 -365
- package/src/cli/commands/memory.ts +0 -424
- package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
- package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
- package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
- package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
- package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
- package/src/cli/lib/daemon-avatar-client.ts +0 -37
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
- package/src/context/__tests__/compact-prompt.test.ts +0 -63
- package/src/context/prompts/compact.md +0 -26
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
- package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
- package/src/home/__tests__/emit-feed-event.test.ts +0 -169
- package/src/home/__tests__/feed-population-integration.test.ts +0 -312
- package/src/home/__tests__/feed-scheduler.test.ts +0 -222
- package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
- package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
- package/src/home/__tests__/rollup-producer.test.ts +0 -507
- package/src/home/assistant-feed-authoring.ts +0 -135
- package/src/home/emit-feed-event.ts +0 -169
- package/src/home/feed-scheduler.ts +0 -281
- package/src/home/platform-gmail-digest.ts +0 -163
- package/src/home/rewrite-command-preview.ts +0 -66
- package/src/home/rewrite-feed-title.ts +0 -58
- package/src/home/rollup-producer.ts +0 -426
- package/src/memory/admin.ts +0 -326
- package/src/memory/context-search/sources/pkb.ts +0 -476
- package/src/memory/graph/compaction.ts +0 -299
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -29,15 +29,22 @@
|
|
|
29
29
|
* through untouched).
|
|
30
30
|
* 6. Creates `<workspaceDir>/plugins-data/<plugin>/` on demand for per-plugin
|
|
31
31
|
* writable state and exposes it via {@link PluginInitContext.pluginStorageDir}.
|
|
32
|
-
* 7.
|
|
32
|
+
* 7. For each surviving plugin, registers its contributed tools, routes,
|
|
33
|
+
* and skills into their global registries via
|
|
34
|
+
* {@link registerPluginTools}, {@link registerSkillRoute}, and
|
|
35
|
+
* {@link registerPluginSkills}. Contributions land BEFORE `init()` so
|
|
36
|
+
* the plugin's hook can observe a registry where its own model-visible
|
|
37
|
+
* surface is already wired — useful for plugins that want to attach
|
|
38
|
+
* metadata, warm caches, or otherwise interact with their own
|
|
39
|
+
* contributions during initialization.
|
|
40
|
+
* 8. Awaits `plugin.init(ctx)` sequentially. An init failure surfaces as a
|
|
33
41
|
* {@link PluginExecutionError} naming the offending plugin and aborts
|
|
34
42
|
* bootstrap — later plugins' `init()` never runs and the daemon fails
|
|
35
|
-
* startup cleanly rather than coming up in a half-wired state.
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* behind.
|
|
43
|
+
* startup cleanly rather than coming up in a half-wired state. The
|
|
44
|
+
* failing plugin's already-registered tools, routes, and skills are
|
|
45
|
+
* rolled back before the error propagates so the registry never
|
|
46
|
+
* carries state contributed by a plugin that never finished
|
|
47
|
+
* initializing.
|
|
41
48
|
*
|
|
42
49
|
* A single shutdown hook is registered via
|
|
43
50
|
* {@link registerShutdownHook} that walks the plugin list in **reverse
|
|
@@ -54,21 +61,25 @@ import { mkdirSync } from "node:fs";
|
|
|
54
61
|
import { join } from "node:path";
|
|
55
62
|
|
|
56
63
|
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
64
|
+
import { getConfig } from "../config/loader.js";
|
|
57
65
|
import type { AssistantConfig } from "../config/schema.js";
|
|
66
|
+
import { HOOKS } from "../plugin-api/constants.js";
|
|
58
67
|
import { registerDefaultPlugins } from "../plugins/defaults/index.js";
|
|
68
|
+
import { buildExternalPlugin } from "../plugins/external-plugin-loader.js";
|
|
59
69
|
import {
|
|
60
70
|
registerPluginSkills,
|
|
61
71
|
unregisterPluginSkills,
|
|
62
72
|
} from "../plugins/plugin-skill-contributions.js";
|
|
63
73
|
import {
|
|
64
|
-
|
|
74
|
+
getRegisteredPlugin,
|
|
65
75
|
getRegisteredPlugins,
|
|
76
|
+
setRegisteredPlugin,
|
|
66
77
|
unregisterPlugin,
|
|
67
78
|
} from "../plugins/registry.js";
|
|
68
79
|
import {
|
|
69
80
|
type Plugin,
|
|
70
81
|
PluginExecutionError,
|
|
71
|
-
type
|
|
82
|
+
type PluginShutdownContext,
|
|
72
83
|
type PluginSkillRegistration,
|
|
73
84
|
} from "../plugins/types.js";
|
|
74
85
|
import {
|
|
@@ -83,6 +94,7 @@ import {
|
|
|
83
94
|
} from "../tools/registry.js";
|
|
84
95
|
import { getLogger } from "../util/logger.js";
|
|
85
96
|
import { getWorkspaceDir } from "../util/platform.js";
|
|
97
|
+
import { APP_VERSION } from "../version.js";
|
|
86
98
|
import { registerShutdownHook } from "./shutdown-registry.js";
|
|
87
99
|
|
|
88
100
|
const log = getLogger("plugins-bootstrap");
|
|
@@ -169,6 +181,16 @@ function ensurePluginStorageDir(pluginName: string): string {
|
|
|
169
181
|
return dir;
|
|
170
182
|
}
|
|
171
183
|
|
|
184
|
+
function getDisabledPluginFlag(
|
|
185
|
+
plugin: Plugin,
|
|
186
|
+
config: AssistantConfig,
|
|
187
|
+
): string | undefined {
|
|
188
|
+
for (const flagKey of plugin.manifest.requiresFlag ?? []) {
|
|
189
|
+
if (!isAssistantFeatureFlagEnabled(flagKey, config)) return flagKey;
|
|
190
|
+
}
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
|
|
172
194
|
/**
|
|
173
195
|
* Run every registered plugin's `init()` hook sequentially and install a
|
|
174
196
|
* reverse-order shutdown hook. See the module docstring for full semantics.
|
|
@@ -218,8 +240,16 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
|
|
|
218
240
|
// server), the latter drops the plugin's entry from the Map (so
|
|
219
241
|
// `getMiddlewaresFor` / `getInjectors` don't re-enter an uninitialized
|
|
220
242
|
// plugin on the next pipeline invocation).
|
|
243
|
+
// Shutdown context is identical for every plugin in this boot — construct
|
|
244
|
+
// once and reuse across the bootstrap-failure rollback and the normal
|
|
245
|
+
// shutdown hook below. Only `assistantVersion` is exposed today; future
|
|
246
|
+
// additions live on {@link PluginShutdownContext}.
|
|
247
|
+
const shutdownContext: PluginShutdownContext = {
|
|
248
|
+
assistantVersion: ctx.assistantVersion,
|
|
249
|
+
};
|
|
250
|
+
|
|
221
251
|
async function rollbackPlugin(active: ActivePlugin): Promise<void> {
|
|
222
|
-
await teardownPlugin(active, "bootstrap-failed");
|
|
252
|
+
await teardownPlugin(active, "bootstrap-failed", shutdownContext);
|
|
223
253
|
unregisterPlugin(active.plugin.manifest.name);
|
|
224
254
|
}
|
|
225
255
|
|
|
@@ -236,187 +266,20 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
|
|
|
236
266
|
|
|
237
267
|
for (const plugin of plugins) {
|
|
238
268
|
const name = plugin.manifest.name;
|
|
239
|
-
|
|
240
|
-
// Feature-flag gating — if any key in `manifest.requiresFlag` is
|
|
241
|
-
// disabled, skip this plugin entirely. Skipping means: no `init()`, no
|
|
242
|
-
// tool / route / skill contributions, and no shutdown hook entry. A
|
|
243
|
-
// later boot with the flag flipped ON picks up the plugin cleanly.
|
|
244
|
-
const requiredFlags = plugin.manifest.requiresFlag ?? [];
|
|
245
|
-
let disabledFlag: string | undefined;
|
|
246
|
-
for (const flagKey of requiredFlags) {
|
|
247
|
-
if (!isAssistantFeatureFlagEnabled(flagKey, ctx.config)) {
|
|
248
|
-
disabledFlag = flagKey;
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
269
|
+
const disabledFlag = getDisabledPluginFlag(plugin, ctx.config);
|
|
252
270
|
if (disabledFlag !== undefined) {
|
|
253
271
|
log.info(
|
|
254
272
|
{ plugin: name, flag: disabledFlag },
|
|
255
273
|
`skipping plugin ${name}: feature flag ${disabledFlag} is disabled`,
|
|
256
274
|
);
|
|
257
|
-
// Drop the plugin from the registry too. `registerPlugin()` added it at
|
|
258
|
-
// import time, and `getMiddlewaresFor()` / `getInjectors()` iterate over
|
|
259
|
-
// every registered entry — without this call, the gated plugin's
|
|
260
|
-
// middleware and injectors would still participate in every pipeline
|
|
261
|
-
// run and system-prompt assembly despite `init()` never firing.
|
|
262
275
|
unregisterPlugin(name);
|
|
263
276
|
continue;
|
|
264
277
|
}
|
|
265
278
|
|
|
266
|
-
// Collected as routes are accepted so the catch block can revoke exactly
|
|
267
|
-
// the routes this plugin contributed if a later contribution step throws.
|
|
268
|
-
// Hoisted above the try so it's in scope for the error path.
|
|
269
|
-
const routeHandles: SkillRouteHandle[] = [];
|
|
270
|
-
|
|
271
|
-
// Tracks whether `plugin.init()` ran to completion (or the plugin has no
|
|
272
|
-
// init at all). The catch block consults this to decide whether the
|
|
273
|
-
// currently-failing plugin's `onShutdown()` may run: onShutdown is paired
|
|
274
|
-
// with init, so a plugin that never completed init never set up the state
|
|
275
|
-
// onShutdown is meant to tear down. Calling onShutdown in that case would
|
|
276
|
-
// surprise plugin authors (their teardown runs against an uninitialized
|
|
277
|
-
// self) and breaks the documented lifecycle contract.
|
|
278
|
-
let initCompleted = false;
|
|
279
|
-
|
|
280
279
|
try {
|
|
281
|
-
|
|
282
|
-
// before calling `init()` so the plugin receives a fully-populated map.
|
|
283
|
-
const credentials: Record<string, string> = {};
|
|
284
|
-
const required = plugin.manifest.requiresCredential ?? [];
|
|
285
|
-
for (const key of required) {
|
|
286
|
-
credentials[key] = await resolveCredentialOrThrow(name, key);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Per-plugin config block, validated against the manifest's parser-like
|
|
290
|
-
// validator when one is declared.
|
|
291
|
-
const rawConfig = getPluginConfigRaw(ctx.config, name);
|
|
292
|
-
const config = validatePluginConfig(
|
|
293
|
-
name,
|
|
294
|
-
plugin.manifest.config,
|
|
295
|
-
rawConfig,
|
|
296
|
-
);
|
|
297
|
-
|
|
298
|
-
// Per-plugin writable data directory. Created lazily during bootstrap
|
|
299
|
-
// rather than at registration time so the side effect is isolated to
|
|
300
|
-
// the boot path.
|
|
301
|
-
const pluginStorageDir = ensurePluginStorageDir(name);
|
|
302
|
-
|
|
303
|
-
const initContext: PluginInitContext = {
|
|
304
|
-
config,
|
|
305
|
-
credentials,
|
|
306
|
-
logger: log.child({ plugin: name }),
|
|
307
|
-
pluginStorageDir,
|
|
308
|
-
assistantVersion: ctx.assistantVersion,
|
|
309
|
-
apiVersions: ASSISTANT_API_VERSIONS,
|
|
310
|
-
};
|
|
311
|
-
|
|
312
|
-
if (plugin.init) {
|
|
313
|
-
try {
|
|
314
|
-
await plugin.init(initContext);
|
|
315
|
-
} catch (err) {
|
|
316
|
-
throw new PluginExecutionError(
|
|
317
|
-
`plugin ${name} init() failed: ${
|
|
318
|
-
err instanceof Error ? err.message : String(err)
|
|
319
|
-
}`,
|
|
320
|
-
name,
|
|
321
|
-
{ cause: err },
|
|
322
|
-
);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
// Reached when init() succeeded or the plugin has no init hook. The
|
|
326
|
-
// catch block reads this to decide whether onShutdown may run.
|
|
327
|
-
initCompleted = true;
|
|
328
|
-
|
|
329
|
-
// After init succeeds, wire in the plugin's model-visible capabilities.
|
|
330
|
-
// Tool contributions (PR 31) register only after `init()` succeeds so a
|
|
331
|
-
// plugin that fails mid-init never leaves partially-wired tools behind.
|
|
332
|
-
// Tool registration failures are wrapped in a PluginExecutionError so
|
|
333
|
-
// the offending plugin name surfaces in the abort — matching the
|
|
334
|
-
// strict-fail semantics of `init()` errors.
|
|
335
|
-
if (plugin.tools && plugin.tools.length > 0) {
|
|
336
|
-
try {
|
|
337
|
-
const accepted = registerPluginTools(name, plugin.tools);
|
|
338
|
-
log.info(
|
|
339
|
-
{ plugin: name, count: accepted.length },
|
|
340
|
-
"plugin tools registered",
|
|
341
|
-
);
|
|
342
|
-
} catch (err) {
|
|
343
|
-
throw new PluginExecutionError(
|
|
344
|
-
`plugin ${name} tool registration failed: ${
|
|
345
|
-
err instanceof Error ? err.message : String(err)
|
|
346
|
-
}`,
|
|
347
|
-
name,
|
|
348
|
-
{ cause: err },
|
|
349
|
-
);
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
// Route contributions (PR 32) — registered after init() succeeds so a
|
|
354
|
-
// plugin that fails to initialize never exposes a half-wired HTTP
|
|
355
|
-
// surface. Mirrors the skill-route registry shape; see
|
|
356
|
-
// {@link PluginRouteRegistration}. Retain every returned handle so the
|
|
357
|
-
// teardown path unregisters by identity rather than pattern text — two
|
|
358
|
-
// plugins (or a plugin and a skill) that happen to register the same
|
|
359
|
-
// regex must not evict each other's routes during shutdown.
|
|
360
|
-
if (plugin.routes && plugin.routes.length > 0) {
|
|
361
|
-
for (const route of plugin.routes) {
|
|
362
|
-
routeHandles.push(registerSkillRoute(route));
|
|
363
|
-
}
|
|
364
|
-
log.info(
|
|
365
|
-
{ plugin: name, count: plugin.routes.length },
|
|
366
|
-
"plugin routes registered",
|
|
367
|
-
);
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
// Skills register into the in-memory plugin-skill catalog so
|
|
371
|
-
// `skill_load` / `skill_execute` can resolve them alongside filesystem
|
|
372
|
-
// skills. A registration failure aborts bootstrap with the plugin named
|
|
373
|
-
// — same strict-fail posture as init() throws.
|
|
374
|
-
if (plugin.skills && plugin.skills.length > 0) {
|
|
375
|
-
try {
|
|
376
|
-
// `plugin.skills` is typed as `PluginSkillRegistration[]` at the
|
|
377
|
-
// Plugin interface — the type assertion here is a narrowing from
|
|
378
|
-
// that generic slot into the concrete shape the registry expects.
|
|
379
|
-
registerPluginSkills(
|
|
380
|
-
name,
|
|
381
|
-
plugin.skills as readonly PluginSkillRegistration[],
|
|
382
|
-
);
|
|
383
|
-
} catch (err) {
|
|
384
|
-
throw new PluginExecutionError(
|
|
385
|
-
`plugin ${name} skill registration failed: ${
|
|
386
|
-
err instanceof Error ? err.message : String(err)
|
|
387
|
-
}`,
|
|
388
|
-
name,
|
|
389
|
-
{ cause: err },
|
|
390
|
-
);
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
activePlugins.push({ plugin, routeHandles });
|
|
395
|
-
|
|
396
|
-
log.info({ plugin: name }, "plugin initialized");
|
|
280
|
+
activePlugins.push(await initializePlugin(plugin, ctx));
|
|
397
281
|
} catch (err) {
|
|
398
|
-
|
|
399
|
-
// `activePlugins` yet (that push happens only after every contribution
|
|
400
|
-
// step succeeds), so `teardownPartialInit()` alone would leave its
|
|
401
|
-
// already-registered tools, routes, and skills live.
|
|
402
|
-
//
|
|
403
|
-
// Branching on `initCompleted` keeps the init/onShutdown pairing
|
|
404
|
-
// intact. When init succeeded but a later contribution step (tools,
|
|
405
|
-
// routes, skills) threw, the plugin has live init-side state that
|
|
406
|
-
// `onShutdown()` is responsible for cleaning up, so the full
|
|
407
|
-
// rollbackPlugin() path runs. When init itself failed (or a step
|
|
408
|
-
// before init — credential resolution, config validation — threw),
|
|
409
|
-
// onShutdown must not run: calling it would invoke the plugin's
|
|
410
|
-
// teardown against an uninitialized self, violating the lifecycle
|
|
411
|
-
// contract documented on `Plugin.onShutdown`. In the init-failed case
|
|
412
|
-
// there is also nothing to unregister — tools, routes, and skills are
|
|
413
|
-
// all registered after init — so just drop the plugin from the
|
|
414
|
-
// registry (idempotent if already removed).
|
|
415
|
-
if (initCompleted) {
|
|
416
|
-
await rollbackPlugin({ plugin, routeHandles });
|
|
417
|
-
} else {
|
|
418
|
-
unregisterPlugin(name);
|
|
419
|
-
}
|
|
282
|
+
unregisterPlugin(name);
|
|
420
283
|
await teardownPartialInit();
|
|
421
284
|
throw err;
|
|
422
285
|
}
|
|
@@ -445,7 +308,7 @@ export async function bootstrapPlugins(ctx: DaemonContext): Promise<void> {
|
|
|
445
308
|
const shutdownSnapshot: ActivePlugin[] = [...activePlugins];
|
|
446
309
|
registerShutdownHook("plugins", async (reason) => {
|
|
447
310
|
for (let i = shutdownSnapshot.length - 1; i >= 0; i--) {
|
|
448
|
-
await teardownPlugin(shutdownSnapshot[i]!, reason);
|
|
311
|
+
await teardownPlugin(shutdownSnapshot[i]!, reason, shutdownContext);
|
|
449
312
|
}
|
|
450
313
|
});
|
|
451
314
|
}
|
|
@@ -461,6 +324,114 @@ interface ActivePlugin {
|
|
|
461
324
|
readonly routeHandles: readonly SkillRouteHandle[];
|
|
462
325
|
}
|
|
463
326
|
|
|
327
|
+
async function initializePlugin(
|
|
328
|
+
plugin: Plugin,
|
|
329
|
+
ctx: DaemonContext,
|
|
330
|
+
): Promise<ActivePlugin> {
|
|
331
|
+
const name = plugin.manifest.name;
|
|
332
|
+
const routeHandles: SkillRouteHandle[] = [];
|
|
333
|
+
let initCompleted = false;
|
|
334
|
+
|
|
335
|
+
try {
|
|
336
|
+
const credentials: Record<string, string> = {};
|
|
337
|
+
for (const key of plugin.manifest.requiresCredential ?? []) {
|
|
338
|
+
credentials[key] = await resolveCredentialOrThrow(name, key);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
const config = validatePluginConfig(
|
|
342
|
+
name,
|
|
343
|
+
plugin.manifest.config,
|
|
344
|
+
getPluginConfigRaw(ctx.config, name),
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
const initContext = {
|
|
348
|
+
config,
|
|
349
|
+
credentials,
|
|
350
|
+
logger: log.child({ plugin: name }),
|
|
351
|
+
pluginStorageDir: ensurePluginStorageDir(name),
|
|
352
|
+
assistantVersion: ctx.assistantVersion,
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
if (plugin.tools && plugin.tools.length > 0) {
|
|
356
|
+
try {
|
|
357
|
+
const accepted = registerPluginTools(name, plugin.tools);
|
|
358
|
+
log.info(
|
|
359
|
+
{ plugin: name, count: accepted.length },
|
|
360
|
+
"plugin tools registered",
|
|
361
|
+
);
|
|
362
|
+
} catch (err) {
|
|
363
|
+
throw new PluginExecutionError(
|
|
364
|
+
`plugin ${name} tool registration failed: ${
|
|
365
|
+
err instanceof Error ? err.message : String(err)
|
|
366
|
+
}`,
|
|
367
|
+
name,
|
|
368
|
+
{ cause: err },
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
if (plugin.routes && plugin.routes.length > 0) {
|
|
374
|
+
for (const route of plugin.routes) {
|
|
375
|
+
routeHandles.push(registerSkillRoute(route));
|
|
376
|
+
}
|
|
377
|
+
log.info(
|
|
378
|
+
{ plugin: name, count: plugin.routes.length },
|
|
379
|
+
"plugin routes registered",
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
if (plugin.skills && plugin.skills.length > 0) {
|
|
384
|
+
try {
|
|
385
|
+
registerPluginSkills(
|
|
386
|
+
name,
|
|
387
|
+
plugin.skills as readonly PluginSkillRegistration[],
|
|
388
|
+
);
|
|
389
|
+
} catch (err) {
|
|
390
|
+
throw new PluginExecutionError(
|
|
391
|
+
`plugin ${name} skill registration failed: ${
|
|
392
|
+
err instanceof Error ? err.message : String(err)
|
|
393
|
+
}`,
|
|
394
|
+
name,
|
|
395
|
+
{ cause: err },
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
if (plugin.hooks?.[HOOKS.INIT]) {
|
|
401
|
+
try {
|
|
402
|
+
await plugin.hooks[HOOKS.INIT](initContext);
|
|
403
|
+
} catch (err) {
|
|
404
|
+
throw new PluginExecutionError(
|
|
405
|
+
`plugin ${name} init() failed: ${
|
|
406
|
+
err instanceof Error ? err.message : String(err)
|
|
407
|
+
}`,
|
|
408
|
+
name,
|
|
409
|
+
{ cause: err },
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
initCompleted = true;
|
|
414
|
+
|
|
415
|
+
log.info({ plugin: name }, "plugin initialized");
|
|
416
|
+
return { plugin, routeHandles };
|
|
417
|
+
} catch (err) {
|
|
418
|
+
if (initCompleted) {
|
|
419
|
+
await teardownPlugin({ plugin, routeHandles }, "bootstrap-failed", {
|
|
420
|
+
assistantVersion: ctx.assistantVersion,
|
|
421
|
+
});
|
|
422
|
+
} else {
|
|
423
|
+
for (const handle of routeHandles) {
|
|
424
|
+
unregisterSkillRoute(handle);
|
|
425
|
+
}
|
|
426
|
+
unregisterPluginTools(name);
|
|
427
|
+
if (plugin.skills && plugin.skills.length > 0) {
|
|
428
|
+
unregisterPluginSkills(name);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
throw err;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
464
435
|
/**
|
|
465
436
|
* Tear down a single fully-initialized plugin: unregister routes, unregister
|
|
466
437
|
* tools, invoke `onShutdown()` if present, then unregister skills. Every step
|
|
@@ -473,6 +444,7 @@ interface ActivePlugin {
|
|
|
473
444
|
async function teardownPlugin(
|
|
474
445
|
active: ActivePlugin,
|
|
475
446
|
reason: string,
|
|
447
|
+
shutdownContext: PluginShutdownContext,
|
|
476
448
|
): Promise<void> {
|
|
477
449
|
const { plugin, routeHandles } = active;
|
|
478
450
|
const name = plugin.manifest.name;
|
|
@@ -504,17 +476,17 @@ async function teardownPlugin(
|
|
|
504
476
|
);
|
|
505
477
|
}
|
|
506
478
|
|
|
507
|
-
if (plugin.
|
|
479
|
+
if (plugin.hooks?.[HOOKS.SHUTDOWN]) {
|
|
508
480
|
try {
|
|
509
|
-
await plugin.
|
|
481
|
+
await plugin.hooks[HOOKS.SHUTDOWN](shutdownContext);
|
|
510
482
|
} catch (err) {
|
|
511
|
-
// Swallow — we want every plugin's
|
|
483
|
+
// Swallow — we want every plugin's shutdown to get a chance to run
|
|
512
484
|
// even when an earlier one throws. The outer runShutdownHooks already
|
|
513
485
|
// logs at hook level, but the plugin-name attribution here is what
|
|
514
486
|
// operators read first.
|
|
515
487
|
log.warn(
|
|
516
488
|
{ err, plugin: name, reason },
|
|
517
|
-
"plugin
|
|
489
|
+
"plugin shutdown hook failed (continuing with remaining plugins)",
|
|
518
490
|
);
|
|
519
491
|
}
|
|
520
492
|
}
|
|
@@ -530,3 +502,77 @@ async function teardownPlugin(
|
|
|
530
502
|
}
|
|
531
503
|
}
|
|
532
504
|
}
|
|
505
|
+
|
|
506
|
+
/** Rebuild a changed external plugin and swap it into the live registry. */
|
|
507
|
+
export async function reregisterExternalPlugin(
|
|
508
|
+
pluginName: string,
|
|
509
|
+
): Promise<void> {
|
|
510
|
+
const pluginDir = join(getWorkspaceDir(), "plugins", pluginName);
|
|
511
|
+
const plugin = await buildExternalPlugin(pluginDir);
|
|
512
|
+
if (plugin === undefined) return;
|
|
513
|
+
|
|
514
|
+
if (plugin.manifest.name !== pluginName) {
|
|
515
|
+
log.warn(
|
|
516
|
+
{ plugin: pluginName, manifestName: plugin.manifest.name, pluginDir },
|
|
517
|
+
`external plugin reload skipped: directory name "${pluginName}" does not match manifest.name "${plugin.manifest.name}"`,
|
|
518
|
+
);
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
const ctx: DaemonContext = {
|
|
523
|
+
config: getConfig(),
|
|
524
|
+
assistantVersion: APP_VERSION,
|
|
525
|
+
};
|
|
526
|
+
const disabledFlag = getDisabledPluginFlag(plugin, ctx.config);
|
|
527
|
+
if (disabledFlag !== undefined) {
|
|
528
|
+
log.info(
|
|
529
|
+
{ plugin: pluginName, flag: disabledFlag },
|
|
530
|
+
`external plugin reload skipped: feature flag ${disabledFlag} is disabled`,
|
|
531
|
+
);
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
const existing = getRegisteredPlugin(pluginName);
|
|
536
|
+
if (existing === undefined) {
|
|
537
|
+
try {
|
|
538
|
+
await initializePlugin(plugin, ctx);
|
|
539
|
+
setRegisteredPlugin(plugin);
|
|
540
|
+
log.info({ plugin: pluginName }, "external plugin registered post-boot");
|
|
541
|
+
} catch (err) {
|
|
542
|
+
log.error(
|
|
543
|
+
{ err, plugin: pluginName },
|
|
544
|
+
"external plugin post-boot registration failed",
|
|
545
|
+
);
|
|
546
|
+
}
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
try {
|
|
551
|
+
unregisterPluginTools(pluginName);
|
|
552
|
+
} catch (err) {
|
|
553
|
+
log.warn(
|
|
554
|
+
{ err, plugin: pluginName },
|
|
555
|
+
"external plugin reload: tool unregister failed (continuing)",
|
|
556
|
+
);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
setRegisteredPlugin(plugin);
|
|
560
|
+
|
|
561
|
+
if (plugin.tools && plugin.tools.length > 0) {
|
|
562
|
+
try {
|
|
563
|
+
const accepted = registerPluginTools(pluginName, plugin.tools);
|
|
564
|
+
log.info(
|
|
565
|
+
{ plugin: pluginName, count: accepted.length },
|
|
566
|
+
"external plugin reloaded",
|
|
567
|
+
);
|
|
568
|
+
} catch (err) {
|
|
569
|
+
log.error(
|
|
570
|
+
{ err, plugin: pluginName },
|
|
571
|
+
"external plugin reload: tool registration failed",
|
|
572
|
+
);
|
|
573
|
+
}
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
log.info({ plugin: pluginName }, "external plugin reloaded");
|
|
578
|
+
}
|
|
@@ -11,6 +11,7 @@ export interface OnboardingGreetingContext {
|
|
|
11
11
|
tone: string;
|
|
12
12
|
userName?: string;
|
|
13
13
|
assistantName?: string;
|
|
14
|
+
googleConnected?: boolean;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
export const CANNED_FIRST_GREETING = [
|
|
@@ -76,6 +77,16 @@ const TONE_INVITE: Record<Tone, string> = {
|
|
|
76
77
|
"We can start with whatever's in front of you, or just talk for a bit first. Either way.",
|
|
77
78
|
};
|
|
78
79
|
|
|
80
|
+
const TONE_GOOGLE_SCAN: Record<Tone, string> = {
|
|
81
|
+
grounded:
|
|
82
|
+
"I can scan your email, calendar, and drive in the background while we talk — just say the word.",
|
|
83
|
+
warm: "Also — I can scan your email, calendar, and drive in the background while we chat, if you'd like. Just let me know.",
|
|
84
|
+
energetic:
|
|
85
|
+
"Oh, and I can scan your email, calendar, and drive in the background right now — want me to?",
|
|
86
|
+
poetic:
|
|
87
|
+
"I can also look through your email, calendar, and drive quietly in the background — say the word.",
|
|
88
|
+
};
|
|
89
|
+
|
|
79
90
|
function buildInvite(tone: Tone = "grounded"): string {
|
|
80
91
|
return TONE_INVITE[tone];
|
|
81
92
|
}
|
|
@@ -96,11 +107,20 @@ function buildPersonalizedGreeting(ctx: OnboardingGreetingContext): string {
|
|
|
96
107
|
const assistant = ctx.assistantName?.trim();
|
|
97
108
|
const tone = resolveTone(ctx.tone);
|
|
98
109
|
|
|
99
|
-
if (
|
|
110
|
+
if (
|
|
111
|
+
!name &&
|
|
112
|
+
!assistant &&
|
|
113
|
+
!VALID_TONES.has(ctx.tone) &&
|
|
114
|
+
!ctx.googleConnected
|
|
115
|
+
) {
|
|
100
116
|
return CANNED_FIRST_GREETING;
|
|
101
117
|
}
|
|
102
118
|
|
|
103
119
|
const intro = buildIntroLine(name, assistant, tone);
|
|
104
120
|
const invite = buildInvite(tone);
|
|
105
|
-
|
|
121
|
+
const parts = [intro, "", invite];
|
|
122
|
+
if (ctx.googleConnected) {
|
|
123
|
+
parts.push("", TONE_GOOGLE_SCAN[tone]);
|
|
124
|
+
}
|
|
125
|
+
return parts.join("\n");
|
|
106
126
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { loadConfig } from "../config/loader.js";
|
|
2
|
+
import { wrapWithCallSiteRouting } from "../providers/call-site-routing.js";
|
|
2
3
|
import { getConfiguredProvider } from "../providers/provider-send-message.js";
|
|
3
|
-
import { getProvider } from "../providers/registry.js";
|
|
4
|
-
import type { Provider } from "../providers/types.js";
|
|
5
4
|
import {
|
|
6
5
|
buildGuardianActionGenerationPrompt,
|
|
7
6
|
getGuardianActionFallbackMessage,
|
|
@@ -32,8 +31,10 @@ export function createGuardianActionCopyGenerator(): GuardianActionCopyGenerator
|
|
|
32
31
|
if (!baseProvider) return null;
|
|
33
32
|
// Wrap so the per-call `callSite` can route to a different provider
|
|
34
33
|
// transport when `llm.callSites.guardianQuestionCopy.provider` overrides
|
|
35
|
-
// the default.
|
|
36
|
-
|
|
34
|
+
// the default. Connection-aware: when the resolved profile names a
|
|
35
|
+
// `provider_connection`, that connection's auth wins over the legacy
|
|
36
|
+
// registry lookup. See `wrapWithCallSiteRouting`.
|
|
37
|
+
const provider = wrapWithCallSiteRouting(baseProvider, loadConfig());
|
|
37
38
|
|
|
38
39
|
const fallbackText =
|
|
39
40
|
options.fallbackText?.trim() || getGuardianActionFallbackMessage(context);
|
|
@@ -135,7 +136,7 @@ export function createGuardianFollowUpConversationGenerator(): GuardianFollowUpC
|
|
|
135
136
|
if (!baseProvider) {
|
|
136
137
|
throw new Error("No configured provider available for follow-up conversation");
|
|
137
138
|
}
|
|
138
|
-
const provider = wrapWithCallSiteRouting(baseProvider);
|
|
139
|
+
const provider = wrapWithCallSiteRouting(baseProvider, loadConfig());
|
|
139
140
|
|
|
140
141
|
const userPrompt = [
|
|
141
142
|
`Original question from the voice call: "${context.questionText}"`,
|
|
@@ -192,19 +193,3 @@ export function createGuardianFollowUpConversationGenerator(): GuardianFollowUpC
|
|
|
192
193
|
return result;
|
|
193
194
|
};
|
|
194
195
|
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Wrap a base Provider so per-call `callSite` metadata can route the actual
|
|
198
|
-
* transport to a different provider when `llm.callSites.<id>.provider`
|
|
199
|
-
* differs from the default. Without this wrapper, only request metadata
|
|
200
|
-
* reflects the callSite — the HTTP transport stays bound to the default.
|
|
201
|
-
*/
|
|
202
|
-
function wrapWithCallSiteRouting(base: Provider): Provider {
|
|
203
|
-
return new CallSiteRoutingProvider(base, (name) => {
|
|
204
|
-
try {
|
|
205
|
-
return getProvider(name);
|
|
206
|
-
} catch {
|
|
207
|
-
return undefined;
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
}
|