@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
package/docs/plugins.md
CHANGED
|
@@ -94,8 +94,6 @@ time. Its shape (see
|
|
|
94
94
|
export interface PluginManifest {
|
|
95
95
|
name: string; // kebab-case, unique
|
|
96
96
|
version: string; // semver, informational
|
|
97
|
-
provides?: Record<string, string>; // reserved; not consumed at runtime today
|
|
98
|
-
requires: Record<string, string>; // capability → version required from the assistant
|
|
99
97
|
requiresCredential?: string[]; // credential keys resolved before init()
|
|
100
98
|
requiresFlag?: string[]; // feature flag keys that must all be enabled
|
|
101
99
|
config?: unknown; // Zod-like parser for plugins.<name>
|
|
@@ -104,25 +102,45 @@ export interface PluginManifest {
|
|
|
104
102
|
|
|
105
103
|
| Field | Required | Purpose |
|
|
106
104
|
| -------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
107
|
-
| `name` | yes | Unique plugin identifier. Duplicate names fail registration. Used as the directory under `<workspaceDir>/plugins-data/<name>/` and the attribution tag in logs.
|
|
105
|
+
| `name` | yes | Unique plugin identifier. Duplicate names fail registration. Used as the directory under `<workspaceDir>/plugins-data/<name>/` and the attribution tag in logs. |
|
|
108
106
|
| `version` | yes | Plugin's own semver. Informational — the registry does not compare it. |
|
|
109
|
-
| `provides` | no | Reserved for future cross-plugin composition and not currently consumed by the assistant. Plugin authors may set this field, but no runtime code reads it yet — it is declared here so future cross-plugin work can land without a manifest version bump. Do not rely on it for any runtime behavior today. |
|
|
110
|
-
| `requires` | yes | Must include `pluginRuntime: "v1"` at minimum. The registry checks every entry against `ASSISTANT_API_VERSIONS` and refuses to register plugins that ask for a capability or version the assistant does not expose. |
|
|
111
107
|
| `requiresCredential` | no | Credential keys the plugin needs. The bootstrap resolves them via the credential store before `init()` runs and hands the values to the plugin in `ctx.credentials`. A missing credential fails startup with a clear error. |
|
|
112
108
|
| `requiresFlag` | no | Assistant feature-flag keys that must all be ON for the plugin to activate. If any listed flag is disabled at bootstrap, the plugin is skipped entirely: `init()` is not invoked and no tools, routes, skills, or shutdown hooks are registered for it. See [Feature-flag gating](#feature-flag-gating) below. |
|
|
113
109
|
| `config` | no | A parser-like validator (Zod schema, or any object with a `.parse(input)` method). If supplied, the bootstrap validates `config.plugins.<name>` through it before passing the result into `init()`. |
|
|
114
110
|
|
|
115
|
-
|
|
116
|
-
[`registry.ts`](../src/plugins/registry.ts). It lists:
|
|
111
|
+
### Host-compat: `peerDependencies["@vellumai/plugin-api"]`
|
|
117
112
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
- One `*Api` entry per pipeline slot (e.g. `llmCallApi`, `toolExecuteApi`,
|
|
121
|
-
`titleGenerateApi`, …).
|
|
113
|
+
Plugins declare which assistant versions they support via standard
|
|
114
|
+
`peerDependencies` in their `package.json`:
|
|
122
115
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"name": "@me/my-logger",
|
|
119
|
+
"version": "1.2.3",
|
|
120
|
+
"peerDependencies": {
|
|
121
|
+
"@vellumai/plugin-api": "^0.8.0"
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
At load time, the external-plugin loader resolves the assistant's running
|
|
127
|
+
version and runs `semver.satisfies(assistantVersion, range)` against the
|
|
128
|
+
declared range. The contract is currently soft while the plugin-installation
|
|
129
|
+
flow is in flux:
|
|
130
|
+
|
|
131
|
+
- **Range satisfied** — plugin loads.
|
|
132
|
+
- **Range not satisfied** — loader logs an error (`log.error`) and loads
|
|
133
|
+
the plugin anyway.
|
|
134
|
+
- **Range unparseable** — loader logs an error and loads the plugin anyway.
|
|
135
|
+
- **`@vellumai/plugin-api` peerDep absent** — loader logs a warning and
|
|
136
|
+
loads the plugin without a host-compat claim.
|
|
137
|
+
|
|
138
|
+
Once the install flow settles, the two error-logging branches above will
|
|
139
|
+
harden into hard rejections (with per-plugin isolation catching the
|
|
140
|
+
throw so one bad plugin can't brick the rest of the registry).
|
|
141
|
+
|
|
142
|
+
In-tree default plugins do not declare a peerDep — they ship with the
|
|
143
|
+
assistant binary and are version-locked by construction.
|
|
126
144
|
|
|
127
145
|
### Example manifest
|
|
128
146
|
|
|
@@ -130,11 +148,6 @@ update their `requires` map.
|
|
|
130
148
|
const manifest: PluginManifest = {
|
|
131
149
|
name: "my-logger",
|
|
132
150
|
version: "1.2.3",
|
|
133
|
-
provides: {},
|
|
134
|
-
requires: {
|
|
135
|
-
pluginRuntime: "v1",
|
|
136
|
-
llmCallApi: "v1",
|
|
137
|
-
},
|
|
138
151
|
requiresCredential: ["LOGGER_API_KEY"],
|
|
139
152
|
requiresFlag: ["my-logger-enabled"],
|
|
140
153
|
config: z.object({
|
|
@@ -179,17 +192,33 @@ Feature Flags" section for the full procedure.
|
|
|
179
192
|
|
|
180
193
|
## Registration
|
|
181
194
|
|
|
182
|
-
A plugin's `register.ts` calls `registerPlugin()` at module load time
|
|
195
|
+
A plugin's `register.ts` calls `registerPlugin()` at module load time. The
|
|
196
|
+
function is exposed via the `globalThis.__vellumPluginRuntime` bridge so the
|
|
197
|
+
plugin file does not need to import from the daemon's source tree:
|
|
183
198
|
|
|
184
199
|
```typescript
|
|
185
|
-
import { registerPlugin } from "<path-to-assistant>/src/plugins/registry.js";
|
|
186
200
|
import type { Plugin } from "<path-to-assistant>/src/plugins/types.js";
|
|
187
201
|
|
|
202
|
+
interface VellumPluginRuntime {
|
|
203
|
+
readonly version: 1;
|
|
204
|
+
readonly registerPlugin: (plugin: Plugin) => void;
|
|
205
|
+
readonly assistantEventHub: import("<path-to-assistant>/src/runtime/assistant-event-hub.js").AssistantEventHub;
|
|
206
|
+
readonly getSecureKeyAsync: (account: string) => Promise<string | undefined>;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const runtime = (globalThis as { __vellumPluginRuntime?: VellumPluginRuntime })
|
|
210
|
+
.__vellumPluginRuntime;
|
|
211
|
+
if (!runtime || runtime.version !== 1) {
|
|
212
|
+
throw new Error(
|
|
213
|
+
"vellum plugin runtime not available — install a recent assistant build",
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
const { registerPlugin } = runtime;
|
|
217
|
+
|
|
188
218
|
const myPlugin: Plugin = {
|
|
189
219
|
manifest: {
|
|
190
220
|
name: "my-plugin",
|
|
191
221
|
version: "0.1.0",
|
|
192
|
-
requires: { pluginRuntime: "v1" },
|
|
193
222
|
},
|
|
194
223
|
middleware: {
|
|
195
224
|
/* ... */
|
|
@@ -199,6 +228,20 @@ const myPlugin: Plugin = {
|
|
|
199
228
|
registerPlugin(myPlugin);
|
|
200
229
|
```
|
|
201
230
|
|
|
231
|
+
**Why the bridge?** When the daemon is a `bun --compile` binary, its modules
|
|
232
|
+
are bundled into the executable. Plugins that import the daemon's modules by
|
|
233
|
+
absolute path (`/abs/path/to/assistant/src/plugins/registry.js`) reload fresh
|
|
234
|
+
disk copies into a separate module graph, and any `registerPlugin()` call in
|
|
235
|
+
the plugin lands in a registry the daemon never reads. The
|
|
236
|
+
`globalThis.__vellumPluginRuntime` handle is the same instance the daemon's
|
|
237
|
+
bundled code holds onto, so plugin registrations always reach the right
|
|
238
|
+
place — whether the daemon was built with `bun --compile` or is running from
|
|
239
|
+
source.
|
|
240
|
+
|
|
241
|
+
Type-only imports (`import type { Plugin } from "..."`) remain free to use
|
|
242
|
+
absolute paths to the assistant source — the TypeScript compiler erases them
|
|
243
|
+
and they have no module-identity effect at runtime.
|
|
244
|
+
|
|
202
245
|
**Rules:**
|
|
203
246
|
|
|
204
247
|
- Exactly one `registerPlugin()` call per plugin. The registry rejects
|
|
@@ -210,6 +253,8 @@ registerPlugin(myPlugin);
|
|
|
210
253
|
this plugin" — use `requiresFlag` or a guard inside `init()` instead.
|
|
211
254
|
- The file runs before any lifecycle hooks. Keep it fast — heavy work
|
|
212
255
|
belongs in `init()`.
|
|
256
|
+
- The bridge is installed by the daemon before `loadUserPlugins()` runs, so
|
|
257
|
+
the global is always present when a plugin's module body executes.
|
|
213
258
|
|
|
214
259
|
## Middleware patterns
|
|
215
260
|
|
|
@@ -419,7 +464,6 @@ Declare required credential keys in `manifest.requiresCredential`:
|
|
|
419
464
|
const manifest: PluginManifest = {
|
|
420
465
|
name: "my-plugin",
|
|
421
466
|
version: "1.0.0",
|
|
422
|
-
requires: { pluginRuntime: "v1" },
|
|
423
467
|
requiresCredential: ["MY_PLUGIN_API_KEY"],
|
|
424
468
|
};
|
|
425
469
|
```
|
|
@@ -458,7 +502,6 @@ const configSchema = z.object({
|
|
|
458
502
|
const manifest: PluginManifest = {
|
|
459
503
|
name: "my-plugin",
|
|
460
504
|
version: "1.0.0",
|
|
461
|
-
requires: { pluginRuntime: "v1" },
|
|
462
505
|
config: configSchema,
|
|
463
506
|
};
|
|
464
507
|
```
|
|
@@ -487,8 +530,8 @@ export interface PluginInitContext {
|
|
|
487
530
|
credentials: Record<string, string>; // resolved credentials from requiresCredential
|
|
488
531
|
logger: unknown; // pino child logger, tagged { plugin: <name> }
|
|
489
532
|
pluginStorageDir: string; // <workspaceDir>/plugins-data/<name>/ (created by bootstrap)
|
|
490
|
-
assistantVersion: string; // assistant semver
|
|
491
|
-
|
|
533
|
+
assistantVersion: string; // assistant semver — same value used by the loader
|
|
534
|
+
// against your peerDependencies range
|
|
492
535
|
}
|
|
493
536
|
```
|
|
494
537
|
|
|
@@ -635,14 +678,6 @@ assistant's module graph.
|
|
|
635
678
|
Do not add new HTTP endpoints to implement plugin-to-plugin messaging
|
|
636
679
|
inside a single assistant process.
|
|
637
680
|
|
|
638
|
-
`manifest.provides` is reserved as the hook for a future cross-plugin
|
|
639
|
-
capability-negotiation protocol but is **not currently consumed by any
|
|
640
|
-
runtime code**. Declaring `provides` today has no behavioral effect —
|
|
641
|
-
plugins must not depend on it for capability discovery or any other
|
|
642
|
-
runtime purpose. The field is intentionally retained on the manifest so
|
|
643
|
-
that adding real consumers later does not require bumping
|
|
644
|
-
`pluginRuntime` or any other capability version.
|
|
645
|
-
|
|
646
681
|
## Hot reload
|
|
647
682
|
|
|
648
683
|
**Not supported in v1.** Registering a plugin takes effect at assistant
|
|
@@ -661,23 +696,29 @@ loop externally.
|
|
|
661
696
|
|
|
662
697
|
## Troubleshooting
|
|
663
698
|
|
|
664
|
-
###
|
|
699
|
+
### `external plugin X: peerDependencies["@vellumai/plugin-api"] requires "<range>" but assistant is <version> — loading anyway`
|
|
665
700
|
|
|
666
|
-
|
|
667
|
-
plugin
|
|
701
|
+
Logged at `error` level. Your plugin's declared
|
|
702
|
+
`peerDependencies["@vellumai/plugin-api"]` range does not include the
|
|
703
|
+
running assistant's version. The plugin still loads while the install
|
|
704
|
+
flow is being shaped, but a future release will turn this into a hard
|
|
705
|
+
rejection. Either widen the range in your `package.json` (typically by
|
|
706
|
+
bumping the major in `^X.Y.Z`) or upgrade the assistant.
|
|
668
707
|
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
708
|
+
### `external plugin X: peerDependencies["@vellumai/plugin-api"] is not a valid semver range — loading anyway`
|
|
709
|
+
|
|
710
|
+
Logged at `error` level, same lenient policy as above. The value declared
|
|
711
|
+
under `peerDependencies["@vellumai/plugin-api"]` is not parseable as a
|
|
712
|
+
semver range. Use a standard range expression such as `^0.8.0`,
|
|
713
|
+
`>=0.8.0 <0.10`, or an exact version.
|
|
672
714
|
|
|
673
|
-
###
|
|
715
|
+
### `external plugin X missing plugin-api peerDependency — loading without host-compat claim`
|
|
674
716
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
match.
|
|
717
|
+
Warning, not an error. Your plugin's `package.json` does not declare a
|
|
718
|
+
`peerDependencies["@vellumai/plugin-api"]` entry, so the loader has no
|
|
719
|
+
host-compat range to check and loads the plugin without that guard. Add
|
|
720
|
+
the peerDep so future assistant upgrades surface incompatibility before
|
|
721
|
+
the plugin runs.
|
|
681
722
|
|
|
682
723
|
### "plugin X is already registered"
|
|
683
724
|
|
package/docs/skills.md
CHANGED
|
@@ -6,20 +6,22 @@ This document describes the security model for the Vellum Assistant skill system
|
|
|
6
6
|
|
|
7
7
|
Skills extend the assistant's capabilities by providing instructions (via `SKILL.md`) and optional custom tools (via `TOOLS.json`). Skills can be **bundled** (shipped with the application), **managed** (user-installed via `scaffold_managed_skill`), **workspace** (project-local), or **extra** (additional directories configured by the user).
|
|
8
8
|
|
|
9
|
+
For managed skills, the installed source of truth is a valid directory at `~/.vellum/workspace/skills/<id>/` containing a top-level `SKILL.md` with standardized frontmatter. The assistant parses that frontmatter at startup and when skill directories change, then seeds Memory V2 skill entries under `skills/<id>` so the assistant can discover available skills from memory. The legacy `SKILLS.md` index is removed by workspace migration and is no longer created by install or scaffold paths.
|
|
10
|
+
|
|
9
11
|
Because skills can introduce arbitrary tool behavior, they are subject to stricter permission defaults than core tools.
|
|
10
12
|
|
|
11
13
|
## Permission Defaults for Skill Tools
|
|
12
14
|
|
|
13
15
|
Skill-origin tools follow a stricter default permission policy than core tools:
|
|
14
16
|
|
|
15
|
-
| Scenario | Core tool behavior
|
|
16
|
-
| ------------------------------------------------- |
|
|
17
|
+
| Scenario | Core tool behavior | Skill tool behavior |
|
|
18
|
+
| ------------------------------------------------- | ----------------------------------- | ------------------- |
|
|
17
19
|
| Low risk, no matching rule | Auto-allowed (at default threshold) | **Prompted** |
|
|
18
|
-
| Medium risk, no matching rule | Prompted
|
|
19
|
-
| High risk, no matching rule | Prompted
|
|
20
|
-
| Allow rule matches, non-high risk | Auto-allowed
|
|
21
|
-
| Allow rule matches, high risk, containerized bash | Auto-allowed (runtime check)
|
|
22
|
-
| Allow rule matches, high risk, other | Prompted
|
|
20
|
+
| Medium risk, no matching rule | Prompted | Prompted |
|
|
21
|
+
| High risk, no matching rule | Prompted | Prompted |
|
|
22
|
+
| Allow rule matches, non-high risk | Auto-allowed | Auto-allowed |
|
|
23
|
+
| Allow rule matches, high risk, containerized bash | Auto-allowed (runtime check) | Auto-allowed |
|
|
24
|
+
| Allow rule matches, high risk, other | Prompted | Prompted |
|
|
23
25
|
|
|
24
26
|
Even if a skill's `TOOLS.json` declares `"risk": "low"` for one of its tools, the permission checker will prompt the user unless an explicit trust rule in `~/.vellum/protected/trust.json` allows it. This prevents third-party skill tools from silently auto-executing.
|
|
25
27
|
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import tsParser from "@typescript-eslint/parser";
|
|
2
|
+
import { RuleTester } from "eslint";
|
|
3
|
+
|
|
4
|
+
import rule from "../cli-no-daemon-internals.js";
|
|
5
|
+
|
|
6
|
+
const tester = new RuleTester({
|
|
7
|
+
languageOptions: {
|
|
8
|
+
ecmaVersion: 2022,
|
|
9
|
+
sourceType: "module",
|
|
10
|
+
parser: tsParser,
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
tester.run("cli/no-daemon-internals", rule, {
|
|
15
|
+
valid: [
|
|
16
|
+
// ipc-tagged file importing only allowed sources
|
|
17
|
+
{
|
|
18
|
+
code: `
|
|
19
|
+
import type { Command } from "commander";
|
|
20
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
21
|
+
import { log } from "../logger.js";
|
|
22
|
+
import { printTable } from "../output.js";
|
|
23
|
+
|
|
24
|
+
registerCommand(program, {
|
|
25
|
+
name: "example",
|
|
26
|
+
transport: "ipc",
|
|
27
|
+
build: () => {},
|
|
28
|
+
});
|
|
29
|
+
`,
|
|
30
|
+
},
|
|
31
|
+
// local-tagged file importing allowed sources
|
|
32
|
+
{
|
|
33
|
+
code: `
|
|
34
|
+
import type { Command } from "commander";
|
|
35
|
+
import { loadRawConfig } from "../../config/loader.js";
|
|
36
|
+
import { getWorkspaceDir } from "../../util/platform.js";
|
|
37
|
+
|
|
38
|
+
registerCommand(program, {
|
|
39
|
+
name: "local-example",
|
|
40
|
+
transport: "local",
|
|
41
|
+
build: () => {},
|
|
42
|
+
});
|
|
43
|
+
`,
|
|
44
|
+
},
|
|
45
|
+
// bootstrap-tagged file importing allowed sources
|
|
46
|
+
{
|
|
47
|
+
code: `
|
|
48
|
+
import type { Command } from "commander";
|
|
49
|
+
import { AssistantConfigSchema } from "../../config/schema.js";
|
|
50
|
+
|
|
51
|
+
registerCommand(program, {
|
|
52
|
+
name: "bootstrap-example",
|
|
53
|
+
transport: "bootstrap",
|
|
54
|
+
build: () => {},
|
|
55
|
+
});
|
|
56
|
+
`,
|
|
57
|
+
},
|
|
58
|
+
// ipc-tagged file importing from ../lib/ prefix (shared lib)
|
|
59
|
+
{
|
|
60
|
+
code: `
|
|
61
|
+
import type { Command } from "commander";
|
|
62
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
63
|
+
import { readFileSync } from "../lib/daemon-credential-client.js";
|
|
64
|
+
|
|
65
|
+
registerCommand(program, {
|
|
66
|
+
name: "lib-example",
|
|
67
|
+
transport: "ipc",
|
|
68
|
+
build: () => {},
|
|
69
|
+
});
|
|
70
|
+
`,
|
|
71
|
+
},
|
|
72
|
+
// File with zero imports and no registerCommand — utility file
|
|
73
|
+
{
|
|
74
|
+
code: `
|
|
75
|
+
function utilHelper() {
|
|
76
|
+
return 42;
|
|
77
|
+
}
|
|
78
|
+
export { utilHelper };
|
|
79
|
+
`,
|
|
80
|
+
},
|
|
81
|
+
// Helper module — has imports but does not call registerCommand directly.
|
|
82
|
+
// Helper modules under commands/ (e.g. oauth/shared.ts, lib/cache-fs.ts)
|
|
83
|
+
// are not command entries and the rule must not fire on them, even when
|
|
84
|
+
// they import from outside the registrar allowlists.
|
|
85
|
+
{
|
|
86
|
+
code: `
|
|
87
|
+
import type { Command } from "commander";
|
|
88
|
+
import { getProvider } from "../../../oauth/oauth-store.js";
|
|
89
|
+
|
|
90
|
+
export function buildAuthFlow(program) {
|
|
91
|
+
// helper module — no registerCommand call here; the actual
|
|
92
|
+
// command file imports this and calls registerCommand itself.
|
|
93
|
+
}
|
|
94
|
+
`,
|
|
95
|
+
},
|
|
96
|
+
// local-tagged file importing ../logger and ../output — both must be on
|
|
97
|
+
// the local allowlist (regression test for the allowlist gap that
|
|
98
|
+
// false-positived autonomy/config/completions/keys/credential-execution).
|
|
99
|
+
{
|
|
100
|
+
code: `
|
|
101
|
+
import type { Command } from "commander";
|
|
102
|
+
import { log } from "../logger.js";
|
|
103
|
+
import { writeOutput } from "../output.js";
|
|
104
|
+
|
|
105
|
+
registerCommand(program, {
|
|
106
|
+
name: "local-with-output",
|
|
107
|
+
transport: "local",
|
|
108
|
+
build: () => {},
|
|
109
|
+
});
|
|
110
|
+
`,
|
|
111
|
+
},
|
|
112
|
+
// Type-only imports are erased at compile time and must not count as
|
|
113
|
+
// runtime boundary violations, even when the source path is outside the
|
|
114
|
+
// allowlist (e.g. `import type` from runtime/routes for response shapes).
|
|
115
|
+
{
|
|
116
|
+
code: `
|
|
117
|
+
import type { Command } from "commander";
|
|
118
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
119
|
+
import type { MemoryV2Result } from "../../runtime/routes/memory-v2-routes.js";
|
|
120
|
+
|
|
121
|
+
registerCommand(program, {
|
|
122
|
+
name: "ipc-with-type-import",
|
|
123
|
+
transport: "ipc",
|
|
124
|
+
build: () => {},
|
|
125
|
+
});
|
|
126
|
+
`,
|
|
127
|
+
},
|
|
128
|
+
// Inline `import { type X }` form: importKind is set per specifier,
|
|
129
|
+
// not on the declaration. When every specifier is type-only the import
|
|
130
|
+
// is erased and must not flag a forbidden-runtime-import violation.
|
|
131
|
+
{
|
|
132
|
+
code: `
|
|
133
|
+
import type { Command } from "commander";
|
|
134
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
135
|
+
import { type MemoryV2Result, type ScoreBreakdown } from "../../runtime/routes/memory-v2-routes.js";
|
|
136
|
+
|
|
137
|
+
registerCommand(program, {
|
|
138
|
+
name: "ipc-with-inline-type-import",
|
|
139
|
+
transport: "ipc",
|
|
140
|
+
build: () => {},
|
|
141
|
+
});
|
|
142
|
+
`,
|
|
143
|
+
},
|
|
144
|
+
// Chained registerCommand pattern: `registerCommand(...).command(...)`.
|
|
145
|
+
// The outer call's callee is a MemberExpression whose object is the
|
|
146
|
+
// inner registerCommand call. The AST walker must follow callee +
|
|
147
|
+
// MemberExpression.object so findTransport() locates the registerCommand
|
|
148
|
+
// call and applies the correct transport allowlist.
|
|
149
|
+
{
|
|
150
|
+
code: `
|
|
151
|
+
import type { Command } from "commander";
|
|
152
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
153
|
+
|
|
154
|
+
registerCommand(program, {
|
|
155
|
+
name: "ipc-chained",
|
|
156
|
+
transport: "ipc",
|
|
157
|
+
build: () => {},
|
|
158
|
+
}).command("subcmd").description("desc");
|
|
159
|
+
`,
|
|
160
|
+
},
|
|
161
|
+
// Sibling subcommand composition: an index file (e.g. oauth/index.ts)
|
|
162
|
+
// imports sibling subcommand files (./connect.js, ./disconnect.js) to
|
|
163
|
+
// attach them under a parent group. The imported file is itself a
|
|
164
|
+
// command and the rule checks its imports independently, so this can't
|
|
165
|
+
// smuggle daemon internals.
|
|
166
|
+
{
|
|
167
|
+
code: `
|
|
168
|
+
import type { Command } from "commander";
|
|
169
|
+
import { registerCommand } from "../../lib/register-command.js";
|
|
170
|
+
import { setupConnect } from "./connect.js";
|
|
171
|
+
import { setupDisconnect } from "./disconnect.js";
|
|
172
|
+
|
|
173
|
+
registerCommand(program, {
|
|
174
|
+
name: "ipc-index-composition",
|
|
175
|
+
transport: "ipc",
|
|
176
|
+
build: () => {},
|
|
177
|
+
});
|
|
178
|
+
`,
|
|
179
|
+
},
|
|
180
|
+
// Nested command file (commands/oauth/foo.ts) needs deeper relative
|
|
181
|
+
// paths to the IPC client, lib/, logger, and output. Without the
|
|
182
|
+
// depth-2 entries the rule would false-positive on every nested
|
|
183
|
+
// command (oauth/*, platform/*).
|
|
184
|
+
{
|
|
185
|
+
code: `
|
|
186
|
+
import type { Command } from "commander";
|
|
187
|
+
import { cliIpcCall } from "../../../ipc/cli-client.js";
|
|
188
|
+
import { registerCommand } from "../../lib/register-command.js";
|
|
189
|
+
import { log } from "../../logger.js";
|
|
190
|
+
import { writeOutput } from "../../output.js";
|
|
191
|
+
|
|
192
|
+
registerCommand(program, {
|
|
193
|
+
name: "ipc-nested",
|
|
194
|
+
transport: "ipc",
|
|
195
|
+
build: () => {},
|
|
196
|
+
});
|
|
197
|
+
`,
|
|
198
|
+
},
|
|
199
|
+
// Shared CLI utils (src/cli/utils/*) — sibling utility directory used
|
|
200
|
+
// by task/ui/conversations-defer for ID resolution and parsing. Lives
|
|
201
|
+
// alongside lib/ but historically wasn't on the allowlist.
|
|
202
|
+
{
|
|
203
|
+
code: `
|
|
204
|
+
import type { Command } from "commander";
|
|
205
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
206
|
+
import { resolveConversationId } from "../utils/conversation-id.js";
|
|
207
|
+
import { parseDuration } from "../utils/parse-duration.js";
|
|
208
|
+
|
|
209
|
+
registerCommand(program, {
|
|
210
|
+
name: "ipc-with-utils",
|
|
211
|
+
transport: "ipc",
|
|
212
|
+
build: () => {},
|
|
213
|
+
});
|
|
214
|
+
`,
|
|
215
|
+
},
|
|
216
|
+
// status.ts pattern: when the daemon is unreachable, the command falls
|
|
217
|
+
// back to a local socket-path probe + platform helpers. Both imports
|
|
218
|
+
// are part of the documented daemon-down fallback contract (§3.7).
|
|
219
|
+
{
|
|
220
|
+
code: `
|
|
221
|
+
import type { Command } from "commander";
|
|
222
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
223
|
+
import { getSocketPath } from "../../ipc/socket-path.js";
|
|
224
|
+
import { getWorkspaceDir } from "../../util/platform.js";
|
|
225
|
+
|
|
226
|
+
registerCommand(program, {
|
|
227
|
+
name: "ipc-status",
|
|
228
|
+
transport: "ipc",
|
|
229
|
+
build: () => {},
|
|
230
|
+
});
|
|
231
|
+
`,
|
|
232
|
+
},
|
|
233
|
+
// local-tagged keys.ts pattern: the secure-key helpers are designed to
|
|
234
|
+
// run in-process (not over IPC), so direct security/* imports are part
|
|
235
|
+
// of the contract.
|
|
236
|
+
{
|
|
237
|
+
code: `
|
|
238
|
+
import type { Command } from "commander";
|
|
239
|
+
import { credentialKey } from "../../security/credential-key.js";
|
|
240
|
+
import { getSecureKeyAsync } from "../../security/secure-keys.js";
|
|
241
|
+
|
|
242
|
+
registerCommand(program, {
|
|
243
|
+
name: "local-keys",
|
|
244
|
+
transport: "local",
|
|
245
|
+
build: () => {},
|
|
246
|
+
});
|
|
247
|
+
`,
|
|
248
|
+
},
|
|
249
|
+
// local-tagged credential-execution.ts pattern: speaks to the CES
|
|
250
|
+
// sidecar via service-contracts RPC; the daemon is not involved.
|
|
251
|
+
{
|
|
252
|
+
code: `
|
|
253
|
+
import type { Command } from "commander";
|
|
254
|
+
import { credentialRpc } from "@vellumai/service-contracts/credential-rpc";
|
|
255
|
+
import { connect } from "../../credential-execution/client.js";
|
|
256
|
+
|
|
257
|
+
registerCommand(program, {
|
|
258
|
+
name: "local-ces",
|
|
259
|
+
transport: "local",
|
|
260
|
+
build: () => {},
|
|
261
|
+
});
|
|
262
|
+
`,
|
|
263
|
+
},
|
|
264
|
+
// local-tagged config.ts uses zod for schema validation and reaches
|
|
265
|
+
// across to oauth/shared.ts for the managed-mode platform-connection
|
|
266
|
+
// check (documented cross-namespace helper).
|
|
267
|
+
{
|
|
268
|
+
code: `
|
|
269
|
+
import type { Command } from "commander";
|
|
270
|
+
import { z } from "zod";
|
|
271
|
+
import { loadRawConfig } from "../../config/loader.js";
|
|
272
|
+
import { requirePlatformConnection } from "./oauth/shared.js";
|
|
273
|
+
|
|
274
|
+
registerCommand(program, {
|
|
275
|
+
name: "local-config",
|
|
276
|
+
transport: "local",
|
|
277
|
+
build: () => {},
|
|
278
|
+
});
|
|
279
|
+
`,
|
|
280
|
+
},
|
|
281
|
+
],
|
|
282
|
+
|
|
283
|
+
invalid: [
|
|
284
|
+
// registerCommand called without a string transport prop — the actual
|
|
285
|
+
// missingTransport case (command-entry file forgot to declare its class).
|
|
286
|
+
{
|
|
287
|
+
code: `
|
|
288
|
+
import type { Command } from "commander";
|
|
289
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
290
|
+
|
|
291
|
+
registerCommand(program, {
|
|
292
|
+
name: "no-transport",
|
|
293
|
+
build: () => {},
|
|
294
|
+
});
|
|
295
|
+
`,
|
|
296
|
+
errors: [
|
|
297
|
+
{
|
|
298
|
+
messageId: "missingTransport",
|
|
299
|
+
},
|
|
300
|
+
],
|
|
301
|
+
},
|
|
302
|
+
// ipc-tagged file importing a forbidden runtime route
|
|
303
|
+
{
|
|
304
|
+
code: `
|
|
305
|
+
import type { Command } from "commander";
|
|
306
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
307
|
+
import { healthRoutes } from "../../runtime/routes/health-routes.js";
|
|
308
|
+
|
|
309
|
+
registerCommand(program, {
|
|
310
|
+
name: "bad-ipc",
|
|
311
|
+
transport: "ipc",
|
|
312
|
+
build: () => {},
|
|
313
|
+
});
|
|
314
|
+
`,
|
|
315
|
+
errors: [
|
|
316
|
+
{
|
|
317
|
+
messageId: "forbiddenImport",
|
|
318
|
+
data: {
|
|
319
|
+
transport: "ipc",
|
|
320
|
+
source: "../../runtime/routes/health-routes.js",
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
],
|
|
324
|
+
},
|
|
325
|
+
// ipc-tagged file importing a skills catalog module
|
|
326
|
+
{
|
|
327
|
+
code: `
|
|
328
|
+
import type { Command } from "commander";
|
|
329
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
330
|
+
import { SkillsCatalog } from "../../skills/catalog.js";
|
|
331
|
+
|
|
332
|
+
registerCommand(program, {
|
|
333
|
+
name: "bad-ipc-skills",
|
|
334
|
+
transport: "ipc",
|
|
335
|
+
build: () => {},
|
|
336
|
+
});
|
|
337
|
+
`,
|
|
338
|
+
errors: [
|
|
339
|
+
{
|
|
340
|
+
messageId: "forbiddenImport",
|
|
341
|
+
data: {
|
|
342
|
+
transport: "ipc",
|
|
343
|
+
source: "../../skills/catalog.js",
|
|
344
|
+
},
|
|
345
|
+
},
|
|
346
|
+
],
|
|
347
|
+
},
|
|
348
|
+
// local-tagged file importing a forbidden runtime route
|
|
349
|
+
{
|
|
350
|
+
code: `
|
|
351
|
+
import type { Command } from "commander";
|
|
352
|
+
import { loadRawConfig } from "../../config/loader.js";
|
|
353
|
+
import { healthRoutes } from "../../runtime/routes/health-routes.js";
|
|
354
|
+
|
|
355
|
+
registerCommand(program, {
|
|
356
|
+
name: "bad-local",
|
|
357
|
+
transport: "local",
|
|
358
|
+
build: () => {},
|
|
359
|
+
});
|
|
360
|
+
`,
|
|
361
|
+
errors: [
|
|
362
|
+
{
|
|
363
|
+
messageId: "forbiddenImport",
|
|
364
|
+
data: {
|
|
365
|
+
transport: "local",
|
|
366
|
+
source: "../../runtime/routes/health-routes.js",
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
],
|
|
370
|
+
},
|
|
371
|
+
// Nested command file (commands/oauth/foo.ts) STILL rejects runtime
|
|
372
|
+
// route imports. Locking in the boundary so the depth-2 allowlist
|
|
373
|
+
// additions don't accidentally open daemon-internal namespaces.
|
|
374
|
+
{
|
|
375
|
+
code: `
|
|
376
|
+
import type { Command } from "commander";
|
|
377
|
+
import { cliIpcCall } from "../../../ipc/cli-client.js";
|
|
378
|
+
import { healthRoutes } from "../../../runtime/routes/health-routes.js";
|
|
379
|
+
|
|
380
|
+
registerCommand(program, {
|
|
381
|
+
name: "bad-ipc-nested",
|
|
382
|
+
transport: "ipc",
|
|
383
|
+
build: () => {},
|
|
384
|
+
});
|
|
385
|
+
`,
|
|
386
|
+
errors: [
|
|
387
|
+
{
|
|
388
|
+
messageId: "forbiddenImport",
|
|
389
|
+
data: {
|
|
390
|
+
transport: "ipc",
|
|
391
|
+
source: "../../../runtime/routes/health-routes.js",
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
],
|
|
395
|
+
},
|
|
396
|
+
// services/, agents/, llm/ namespaces remain forbidden for ipc commands.
|
|
397
|
+
{
|
|
398
|
+
code: `
|
|
399
|
+
import type { Command } from "commander";
|
|
400
|
+
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
401
|
+
import { dispatchAgent } from "../../agents/dispatcher.js";
|
|
402
|
+
|
|
403
|
+
registerCommand(program, {
|
|
404
|
+
name: "bad-ipc-agents",
|
|
405
|
+
transport: "ipc",
|
|
406
|
+
build: () => {},
|
|
407
|
+
});
|
|
408
|
+
`,
|
|
409
|
+
errors: [
|
|
410
|
+
{
|
|
411
|
+
messageId: "forbiddenImport",
|
|
412
|
+
data: {
|
|
413
|
+
transport: "ipc",
|
|
414
|
+
source: "../../agents/dispatcher.js",
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
],
|
|
418
|
+
},
|
|
419
|
+
],
|
|
420
|
+
});
|