@vellumai/assistant 0.8.1 → 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/ARCHITECTURE.md +2 -7
- package/Dockerfile +75 -1
- package/bun.lock +11 -1
- package/docker-entrypoint.sh +5 -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/examples/plugins/echo/README.md +27 -27
- package/examples/plugins/echo/package.json +3 -0
- package/examples/plugins/echo/register.ts +31 -31
- 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 +325 -3
- package/package.json +3 -1
- package/scripts/generate-openapi.ts +83 -10
- package/scripts/sync-llm-catalog.ts +2 -2
- package/scripts/sync-web-search-catalog.ts +47 -25
- package/src/__tests__/agent-image-optimize.test.ts +11 -3
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
- package/src/__tests__/anthropic-provider.test.ts +45 -0
- package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
- package/src/__tests__/app-executors.test.ts +220 -4
- package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/channel-availability-routes.test.ts +206 -0
- package/src/__tests__/channel-delivery-store.test.ts +289 -1
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
- package/src/__tests__/clawhub.test.ts +75 -16
- package/src/__tests__/compactor-tail-resolution.test.ts +41 -0
- package/src/__tests__/config-schema.test.ts +21 -0
- package/src/__tests__/config-set-route.test.ts +80 -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__/context-search-conversations-source.test.ts +117 -2
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
- 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 +92 -92
- package/src/__tests__/conversation-agent-loop.test.ts +2 -0
- package/src/__tests__/conversation-error.test.ts +42 -3
- package/src/__tests__/conversation-fork-crud.test.ts +82 -0
- package/src/__tests__/conversation-inference-profile-route.test.ts +40 -4
- package/src/__tests__/conversation-lifecycle.test.ts +173 -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-callsite.test.ts +4 -1
- 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 +76 -9
- 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-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 +3 -2
- 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 +60 -36
- package/src/__tests__/filing-service.test.ts +140 -0
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +43 -62
- 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 +73 -0
- package/src/__tests__/host-app-control-proxy.test.ts +266 -10
- 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 +1 -1
- package/src/__tests__/inference-profile-reaper.test.ts +4 -2
- package/src/__tests__/inference-profile-session-handler.test.ts +18 -6
- package/src/__tests__/inference-profile-session-ipc.test.ts +17 -5
- package/src/__tests__/injector-chain.test.ts +10 -8
- package/src/__tests__/install-skill-routing.test.ts +155 -37
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +92 -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-catalog-parity.test.ts +55 -13
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +34 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +29 -53
- package/src/__tests__/llm-usage-store.test.ts +114 -0
- package/src/__tests__/managed-profile-guard.test.ts +31 -29
- package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
- package/src/__tests__/managed-store.test.ts +84 -192
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
- package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
- package/src/__tests__/oauth-commands-routes.test.ts +168 -16
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
- package/src/__tests__/openai-provider.test.ts +24 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +17 -9
- 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 +10 -36
- 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 +0 -1
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +16 -15
- package/src/__tests__/plugin-types.test.ts +3 -13
- package/src/__tests__/process-message-background-slack.test.ts +8 -1
- package/src/__tests__/process-message-display-content.test.ts +421 -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} +8 -8
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
- package/src/__tests__/schedule-routes.test.ts +50 -3
- package/src/__tests__/schedule-store.test.ts +94 -0
- package/src/__tests__/scheduler-reuse-conversation.test.ts +54 -7
- package/src/__tests__/schema-transforms.test.ts +20 -0
- package/src/__tests__/search-skills-unified.test.ts +0 -5
- package/src/__tests__/server-history-render.test.ts +43 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +0 -12
- package/src/__tests__/skill-load-tool.test.ts +27 -89
- 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-tool-filtering.test.ts +50 -0
- package/src/__tests__/system-prompt.test.ts +737 -63
- 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__/user-plugin-loader.test.ts +0 -7
- package/src/__tests__/voice-session-bridge.test.ts +198 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +32 -10
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +115 -3
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +50 -0
- package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -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-migrations-runner.test.ts +111 -3
- package/src/acp/resolve-agent.ts +1 -1
- package/src/agent/image-optimize.ts +13 -5
- package/src/calls/voice-session-bridge.ts +61 -42
- package/src/channels/types.ts +108 -0
- package/src/cli/__tests__/unknown-command.test.ts +24 -0
- package/src/cli/commands/__tests__/changelog.test.ts +304 -319
- package/src/cli/commands/__tests__/schedules.test.ts +491 -0
- package/src/cli/commands/changelog.ts +106 -42
- package/src/cli/commands/conversations.ts +102 -17
- package/src/cli/commands/default-action.ts +10 -53
- package/src/cli/commands/notifications.ts +329 -317
- package/src/cli/commands/plugins.ts +185 -0
- package/src/cli/commands/schedules.ts +391 -0
- package/src/cli/commands/telemetry.ts +40 -0
- 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__/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/install-from-github.ts +304 -0
- package/src/cli/lib/list-installed-plugins.ts +137 -0
- package/src/cli/lib/uninstall-plugin.ts +82 -0
- package/src/cli/lib/unknown-command.ts +111 -0
- package/src/cli/program.ts +38 -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/computer-use/TOOLS.json +15 -52
- 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/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 -0
- package/src/config/feature-flag-registry.json +41 -1
- package/src/config/loader.ts +64 -38
- package/src/config/schema.ts +7 -10
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
- 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 +31 -7
- package/src/config/schemas/llm.ts +3 -0
- package/src/config/schemas/memory-retrieval.ts +18 -0
- package/src/config/schemas/tools.ts +14 -0
- package/src/config/skills.ts +3 -96
- package/src/context/compactor.ts +1047 -0
- package/src/context/token-estimator.ts +2 -2
- package/src/context/window-manager.ts +197 -1520
- 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 +34 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +74 -0
- package/src/daemon/approval-generators.ts +8 -6
- package/src/daemon/config-watcher.ts +94 -31
- package/src/daemon/conversation-agent-loop.ts +169 -9
- package/src/daemon/conversation-error.ts +171 -37
- package/src/daemon/conversation-lifecycle.ts +53 -40
- package/src/daemon/conversation-messaging.ts +25 -6
- package/src/daemon/conversation-process.ts +49 -12
- package/src/daemon/conversation-runtime-assembly.ts +16 -1
- package/src/daemon/conversation-slash.ts +12 -5
- package/src/daemon/conversation-store.ts +11 -4
- package/src/daemon/conversation-tool-setup.ts +39 -7
- package/src/daemon/conversation.ts +33 -1
- package/src/daemon/external-plugins-bootstrap.ts +217 -181
- package/src/daemon/first-greeting.ts +22 -2
- package/src/daemon/handlers/config-model.ts +6 -5
- package/src/daemon/handlers/config-slack-channel.ts +15 -3
- package/src/daemon/handlers/shared.ts +14 -5
- package/src/daemon/handlers/skills.ts +111 -108
- package/src/daemon/history-repair.ts +28 -1
- package/src/daemon/host-app-control-proxy.ts +98 -23
- package/src/daemon/lifecycle.ts +45 -35
- package/src/daemon/meet-host-supervisor.ts +5 -4
- package/src/daemon/memory-v2-startup.ts +49 -0
- package/src/daemon/message-protocol.ts +1 -0
- package/src/daemon/message-types/conversations.ts +25 -0
- package/src/daemon/message-types/messages.ts +61 -0
- package/src/daemon/message-types/subagents.ts +1 -0
- package/src/daemon/message-types/sync.ts +1 -0
- package/src/daemon/pkb-reminder-builder.test.ts +1 -1
- package/src/daemon/pkb-reminder-builder.ts +1 -1
- package/src/daemon/plugin-source-watcher.ts +146 -0
- package/src/daemon/process-message.ts +21 -3
- package/src/daemon/server.ts +11 -2
- package/src/daemon/skill-memory-refresh.ts +29 -0
- package/src/documents/document-store.ts +221 -3
- package/src/embedded/plugin-api.ts +40 -0
- package/src/filing/filing-service.ts +39 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +91 -6
- package/src/heartbeat/heartbeat-run-store.ts +2 -1
- package/src/heartbeat/heartbeat-service.ts +41 -0
- package/src/home/__tests__/feed-types.test.ts +40 -0
- package/src/home/feed-types.ts +22 -0
- package/src/home/post-connect-feed.ts +1 -0
- package/src/index.ts +18 -1
- package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
- package/src/mcp/client.ts +20 -4
- package/src/media/image-credentials.ts +3 -3
- package/src/memory/__tests__/bookmark-crud.test.ts +33 -27
- package/src/memory/__tests__/conversation-queries.test.ts +263 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +119 -14
- package/src/memory/__tests__/message-content.test.ts +35 -0
- package/src/memory/bookmark-crud.ts +42 -10
- package/src/memory/context-search/sources/conversations.ts +62 -2
- package/src/memory/context-search/sources/workspace.ts +4 -0
- package/src/memory/conversation-crud.ts +63 -19
- package/src/memory/conversation-queries.ts +110 -10
- package/src/memory/db-init.ts +6 -0
- package/src/memory/delivery-crud.ts +152 -5
- package/src/memory/embedding-backend.ts +4 -4
- 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/conversation-graph-memory.ts +31 -15
- package/src/memory/graph/tools.ts +3 -3
- package/src/memory/indexer.ts +34 -29
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +73 -0
- package/src/memory/jobs/embed-concept-page.ts +20 -11
- package/src/memory/jobs-worker.ts +6 -1
- package/src/memory/llm-request-log-source-clickhouse.ts +17 -10
- package/src/memory/llm-request-log-source.ts +19 -52
- package/src/memory/llm-usage-store.ts +125 -5
- package/src/memory/memory-retrospective-startup-cleanup.ts +72 -5
- package/src/memory/message-content.ts +1 -1
- package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
- package/src/memory/migrations/229-delete-private-conversations.test.ts +38 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +7 -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/index.ts +6 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/onboarding-events-store.ts +106 -0
- package/src/memory/schema/bookmarks.ts +0 -2
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/inference.ts +1 -3
- package/src/memory/schema/infrastructure.ts +12 -0
- package/src/memory/turn-events-store.ts +127 -2
- package/src/memory/v2/__tests__/activation.test.ts +0 -8
- package/src/memory/v2/__tests__/injection.test.ts +98 -8
- package/src/memory/v2/__tests__/migration.test.ts +87 -0
- package/src/memory/v2/__tests__/page-index.test.ts +83 -0
- package/src/memory/v2/__tests__/prompts-router.test.ts +58 -6
- package/src/memory/v2/__tests__/qdrant.test.ts +66 -3
- package/src/memory/v2/__tests__/router.test.ts +15 -0
- package/src/memory/v2/__tests__/skill-store.test.ts +387 -8
- package/src/memory/v2/injection.ts +32 -6
- package/src/memory/v2/migration.ts +49 -19
- package/src/memory/v2/page-index.ts +35 -5
- package/src/memory/v2/prompts/router.ts +11 -8
- package/src/memory/v2/prompts/sweep.ts +2 -2
- package/src/memory/v2/qdrant.ts +135 -7
- package/src/memory/v2/router.ts +9 -8
- package/src/memory/v2/skill-store.ts +120 -35
- 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/conversation-pairing.ts +2 -1
- package/src/notifications/decision-engine.ts +2 -1
- package/src/notifications/emit-signal.ts +20 -1
- package/src/notifications/home-feed-side-effect.ts +54 -0
- package/src/notifications/signal.ts +3 -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 +2 -0
- package/src/permissions/ipc-risk-types.ts +1 -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 +34 -1
- package/src/plugin-api/types.ts +104 -22
- 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 +36 -3
- 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 +105 -32
- 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 +31 -26
- package/src/plugins/user-loader.ts +21 -2
- package/src/proactive-artifact/aux-message-injector.ts +11 -0
- package/src/proactive-artifact/job.test.ts +37 -5
- package/src/prompts/__tests__/system-prompt.test.ts +12 -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 +63 -166
- package/src/prompts/templates/BOOTSTRAP.md +17 -1
- package/src/prompts/templates/system-sections.ts +173 -0
- package/src/providers/__tests__/inference.test.ts +22 -7
- package/src/providers/anthropic/client.ts +28 -28
- package/src/providers/connection-resolution.ts +7 -0
- package/src/providers/inference/adapter-factory.ts +41 -4
- package/src/providers/inference/connections.ts +74 -29
- package/src/providers/inference/resolve-auth.ts +12 -4
- package/src/providers/model-catalog.ts +294 -12
- package/src/providers/openai/chat-completions-provider.ts +10 -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/registry.ts +22 -14
- package/src/providers/retry.ts +47 -1
- package/src/runtime/__tests__/agent-wake.test.ts +152 -0
- package/src/runtime/agent-wake.ts +42 -14
- package/src/runtime/auth/route-policy.ts +8 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- package/src/runtime/http-types.ts +19 -0
- package/src/runtime/migrations/origin-mode.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +17 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +107 -20
- package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +64 -1
- package/src/runtime/routes/acp-routes-list.test.ts +143 -0
- package/src/runtime/routes/acp-routes.ts +5 -3
- package/src/runtime/routes/auth-routes.ts +1 -1
- package/src/runtime/routes/bookmark-routes.ts +5 -3
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/channel-availability-routes.ts +121 -0
- package/src/runtime/routes/conversation-cli-routes.ts +44 -3
- package/src/runtime/routes/conversation-list-routes.ts +3 -20
- package/src/runtime/routes/conversation-management-routes.ts +17 -42
- package/src/runtime/routes/conversation-query-routes.ts +40 -35
- package/src/runtime/routes/conversation-routes.ts +90 -11
- package/src/runtime/routes/documents-routes.ts +25 -86
- package/src/runtime/routes/group-routes.ts +5 -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 +111 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +32 -1
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
- package/src/runtime/routes/index.ts +6 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +17 -44
- package/src/runtime/routes/inference-profile-session-reaper.ts +7 -21
- package/src/runtime/routes/inference-provider-connection-routes.ts +65 -21
- 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 +6 -13
- package/src/runtime/routes/notification-routes.ts +1 -1
- package/src/runtime/routes/oauth-commands-routes.ts +105 -15
- package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -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 +4 -7
- package/src/runtime/routes/subagents-routes.ts +57 -18
- package/src/runtime/routes/telemetry-routes.ts +27 -0
- package/src/runtime/routes/tts-routes.ts +27 -2
- 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 +93 -1
- package/src/schedule/schedule-store.ts +27 -2
- package/src/schedule/scheduler.ts +9 -1
- package/src/security/__tests__/untrusted-content.test.ts +86 -0
- package/src/security/untrusted-content.ts +93 -8
- 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 +15 -7
- 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/browser-execution.ts +15 -11
- 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/permission-checker.ts +1 -1
- 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/system/request-permission.ts +2 -2
- package/src/tools/terminal/safe-env.ts +60 -1
- 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/util/errors.ts +17 -0
- package/src/util/platform.ts +10 -0
- package/src/watcher/__tests__/engine.test.ts +22 -0
- package/src/watcher/engine.ts +6 -2
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +80 -15
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +35 -22
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +3 -1
- 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 +8 -0
- package/src/workspace/migrations/runner.ts +39 -9
- package/src/workspace/migrations/types.ts +4 -0
- package/examples/plugins/echo/bun.lock +0 -25
- package/src/__tests__/context-window-manager.test.ts +0 -2481
- package/src/context/__tests__/compact-prompt.test.ts +0 -63
- package/src/context/prompts/compact.md +0 -26
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
- /package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +0 -0
package/ARCHITECTURE.md
CHANGED
|
@@ -1227,9 +1227,8 @@ graph TB
|
|
|
1227
1227
|
|
|
1228
1228
|
subgraph "2. Persist (Filesystem)"
|
|
1229
1229
|
SCAFFOLD["scaffold_managed_skill<br/>───────────────<br/>RiskLevel: High<br/>Requires user consent"]
|
|
1230
|
-
MANAGED_STORE["managed-store.ts<br/>───────────────<br/>validateManagedSkillId()<br/>buildSkillMarkdown()<br/>createManagedSkill()
|
|
1230
|
+
MANAGED_STORE["managed-store.ts<br/>───────────────<br/>validateManagedSkillId()<br/>buildSkillMarkdown()<br/>createManagedSkill()"]
|
|
1231
1231
|
SKILL_DIR["~/.vellum/workspace/skills/<id>/<br/>SKILL.md (frontmatter + body)"]
|
|
1232
|
-
INDEX["~/.vellum/workspace/skills/<br/>SKILLS.md (index)"]
|
|
1233
1232
|
end
|
|
1234
1233
|
|
|
1235
1234
|
subgraph "3. Load & Use"
|
|
@@ -1240,7 +1239,6 @@ graph TB
|
|
|
1240
1239
|
subgraph "4. Delete"
|
|
1241
1240
|
DELETE["delete_managed_skill<br/>───────────────<br/>RiskLevel: High<br/>Requires user consent"]
|
|
1242
1241
|
RM_DIR["rmSync skill directory"]
|
|
1243
|
-
RM_INDEX["removeSkillsIndexEntry()"]
|
|
1244
1242
|
end
|
|
1245
1243
|
|
|
1246
1244
|
subgraph "File Watcher"
|
|
@@ -1257,17 +1255,14 @@ graph TB
|
|
|
1257
1255
|
|
|
1258
1256
|
SCAFFOLD --> MANAGED_STORE
|
|
1259
1257
|
MANAGED_STORE --> SKILL_DIR
|
|
1260
|
-
MANAGED_STORE --> INDEX
|
|
1261
1258
|
|
|
1262
1259
|
SKILL_DIR --> WATCHER
|
|
1263
|
-
INDEX --> WATCHER
|
|
1264
1260
|
WATCHER --> EVICT
|
|
1265
1261
|
|
|
1266
1262
|
SKILL_DIR --> SKILL_LOAD
|
|
1267
1263
|
SKILL_LOAD --> SESSION
|
|
1268
1264
|
|
|
1269
1265
|
DELETE --> RM_DIR
|
|
1270
|
-
DELETE --> RM_INDEX
|
|
1271
1266
|
RM_DIR --> WATCHER
|
|
1272
1267
|
```
|
|
1273
1268
|
|
|
@@ -1275,7 +1270,7 @@ graph TB
|
|
|
1275
1270
|
|
|
1276
1271
|
- `evaluate_typescript_code` always forces `sandbox.enabled = true` regardless of global config.
|
|
1277
1272
|
- Snippet contract: must export `default` or `run` with signature `(input: unknown) => unknown | Promise<unknown>`.
|
|
1278
|
-
- Managed-store writes are atomic (tmp file + rename) to prevent partial `SKILL.md`
|
|
1273
|
+
- Managed-store writes are atomic (tmp file + rename) to prevent partial `SKILL.md` files.
|
|
1279
1274
|
- After persist or delete, the file watcher triggers conversation eviction; the next turn runs in a fresh conversation. The model's system prompt instructs it to continue normally.
|
|
1280
1275
|
- macOS UI shows Inspect and Delete controls for managed skills only (source = "managed").
|
|
1281
1276
|
- `skill_load` resolves the recursive include graph (via `include-graph.ts`) before emitting output. Missing children are listed as suggested skills without child `<loaded_skill>` markers; cycles still produce `isError: true` with no marker. Valid includes produce an "Included Skills (immediate)" metadata section showing child ID, name, description, and path.
|
package/Dockerfile
CHANGED
|
@@ -73,6 +73,9 @@ RUN apt-get update && apt-get install -y \
|
|
|
73
73
|
bubblewrap \
|
|
74
74
|
ca-certificates \
|
|
75
75
|
curl \
|
|
76
|
+
debootstrap \
|
|
77
|
+
debian-archive-keyring \
|
|
78
|
+
debconf \
|
|
76
79
|
ffmpeg \
|
|
77
80
|
fonts-freefont-ttf \
|
|
78
81
|
g++ \
|
|
@@ -117,6 +120,7 @@ RUN apt-get update && apt-get install -y \
|
|
|
117
120
|
unzip \
|
|
118
121
|
uuid-runtime \
|
|
119
122
|
vim \
|
|
123
|
+
wget \
|
|
120
124
|
xclip \
|
|
121
125
|
xdg-utils \
|
|
122
126
|
&& rm -rf /var/lib/apt/lists/*
|
|
@@ -147,6 +151,76 @@ ENV PATH="${BUN_INSTALL}/bin:${PATH}"
|
|
|
147
151
|
ENV PYTHONUSERBASE="/home/assistant/.python"
|
|
148
152
|
ENV PATH="${PYTHONUSERBASE}/bin:${PATH}"
|
|
149
153
|
|
|
154
|
+
RUN printf '%s\n' \
|
|
155
|
+
'if [ -r /app/assistant/docker-kata-apt-env.sh ]; then' \
|
|
156
|
+
' . /app/assistant/docker-kata-apt-env.sh' \
|
|
157
|
+
'fi' \
|
|
158
|
+
> /etc/profile.d/vellum-kata-apt-root.sh && \
|
|
159
|
+
printf '%s\n' \
|
|
160
|
+
'' \
|
|
161
|
+
'if [ -r /etc/profile.d/vellum-kata-apt-root.sh ]; then' \
|
|
162
|
+
' . /etc/profile.d/vellum-kata-apt-root.sh' \
|
|
163
|
+
'fi' \
|
|
164
|
+
>> /etc/bash.bashrc && \
|
|
165
|
+
printf '%s\n' \
|
|
166
|
+
'' \
|
|
167
|
+
'if [ -r /etc/profile.d/vellum-kata-apt-root.sh ]; then' \
|
|
168
|
+
' . /etc/profile.d/vellum-kata-apt-root.sh' \
|
|
169
|
+
'fi' \
|
|
170
|
+
>> /root/.bashrc && \
|
|
171
|
+
printf '%s\n' \
|
|
172
|
+
'' \
|
|
173
|
+
'if [ -r /etc/profile.d/vellum-kata-apt-root.sh ]; then' \
|
|
174
|
+
' . /etc/profile.d/vellum-kata-apt-root.sh' \
|
|
175
|
+
'fi' \
|
|
176
|
+
>> /home/assistant/.bashrc && \
|
|
177
|
+
chown assistant:assistant /home/assistant/.bashrc
|
|
178
|
+
|
|
179
|
+
RUN printf '%s\n' \
|
|
180
|
+
'#!/usr/bin/env sh' \
|
|
181
|
+
'set -eu' \
|
|
182
|
+
'if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then' \
|
|
183
|
+
' exec /usr/bin/apt-get "$@"' \
|
|
184
|
+
'fi' \
|
|
185
|
+
'export DEBIAN_FRONTEND=noninteractive' \
|
|
186
|
+
'DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"' \
|
|
187
|
+
'/app/assistant/docker-init-apt-root.sh' \
|
|
188
|
+
'if [ -x "${DATA_ROOT}/bin/sh" ] && [ -x "${DATA_ROOT}/usr/bin/apt-get" ] && [ -f "${DATA_ROOT}/.rootfs-initialized" ] && ! grep -qs " ${DATA_ROOT} .*noexec" /proc/mounts; then' \
|
|
189
|
+
' exec chroot "${DATA_ROOT}" /usr/bin/apt-get "$@"' \
|
|
190
|
+
'fi' \
|
|
191
|
+
'exec /usr/bin/apt-get "$@"' \
|
|
192
|
+
> /usr/local/bin/apt-get && \
|
|
193
|
+
chmod +x /usr/local/bin/apt-get && \
|
|
194
|
+
printf '%s\n' \
|
|
195
|
+
'#!/usr/bin/env sh' \
|
|
196
|
+
'set -eu' \
|
|
197
|
+
'if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then' \
|
|
198
|
+
' exec /usr/bin/apt "$@"' \
|
|
199
|
+
'fi' \
|
|
200
|
+
'export DEBIAN_FRONTEND=noninteractive' \
|
|
201
|
+
'DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"' \
|
|
202
|
+
'/app/assistant/docker-init-apt-root.sh' \
|
|
203
|
+
'if [ -x "${DATA_ROOT}/bin/sh" ] && [ -x "${DATA_ROOT}/usr/bin/apt" ] && [ -f "${DATA_ROOT}/.rootfs-initialized" ] && ! grep -qs " ${DATA_ROOT} .*noexec" /proc/mounts; then' \
|
|
204
|
+
' exec chroot "${DATA_ROOT}" /usr/bin/apt "$@"' \
|
|
205
|
+
'fi' \
|
|
206
|
+
'exec /usr/bin/apt "$@"' \
|
|
207
|
+
> /usr/local/bin/apt && \
|
|
208
|
+
chmod +x /usr/local/bin/apt && \
|
|
209
|
+
printf '%s\n' \
|
|
210
|
+
'#!/usr/bin/env sh' \
|
|
211
|
+
'set -eu' \
|
|
212
|
+
'if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then' \
|
|
213
|
+
' exec /usr/bin/dpkg "$@"' \
|
|
214
|
+
'fi' \
|
|
215
|
+
'DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"' \
|
|
216
|
+
'/app/assistant/docker-init-apt-root.sh' \
|
|
217
|
+
'if [ -x "${DATA_ROOT}/bin/sh" ] && [ -x "${DATA_ROOT}/usr/bin/dpkg" ] && [ -f "${DATA_ROOT}/.rootfs-initialized" ] && ! grep -qs " ${DATA_ROOT} .*noexec" /proc/mounts; then' \
|
|
218
|
+
' exec chroot "${DATA_ROOT}" /usr/bin/dpkg "$@"' \
|
|
219
|
+
'fi' \
|
|
220
|
+
'exec /usr/bin/dpkg "$@"' \
|
|
221
|
+
> /usr/local/bin/dpkg && \
|
|
222
|
+
chmod +x /usr/local/bin/dpkg
|
|
223
|
+
|
|
150
224
|
# Ensure the CES bootstrap socket volume is writable by the non-root CES user.
|
|
151
225
|
RUN mkdir -p /run/ces-bootstrap && chmod 777 /run/ces-bootstrap
|
|
152
226
|
|
|
@@ -161,7 +235,7 @@ ENV IS_CONTAINERIZED=true
|
|
|
161
235
|
# and the generated meet-join manifest from the builder stage.
|
|
162
236
|
COPY --from=builder /app /app
|
|
163
237
|
|
|
164
|
-
RUN chmod +x /app/assistant/docker-entrypoint.sh
|
|
238
|
+
RUN chmod +x /app/assistant/docker-entrypoint.sh /app/assistant/docker-init-apt-root.sh /app/assistant/docker-kata-apt-env.sh
|
|
165
239
|
|
|
166
240
|
# Run the daemon + http server
|
|
167
241
|
CMD ["/app/assistant/docker-entrypoint.sh"]
|
package/bun.lock
CHANGED
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"playwright": "1.58.2",
|
|
38
38
|
"postgres": "3.4.8",
|
|
39
39
|
"rrule": "2.8.1",
|
|
40
|
+
"semver": "7.8.0",
|
|
40
41
|
"stemmer": "2.0.1",
|
|
41
42
|
"tar-stream": "3.1.7",
|
|
42
43
|
"tldts": "7.0.25",
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"@types/archiver": "7.0.0",
|
|
49
50
|
"@types/bun": "1.3.10",
|
|
50
51
|
"@types/node": "25.5.0",
|
|
52
|
+
"@types/semver": "7.5.8",
|
|
51
53
|
"@types/uuid": "10.0.0",
|
|
52
54
|
"drizzle-kit": "0.30.6",
|
|
53
55
|
"eslint": "10.0.3",
|
|
@@ -388,6 +390,8 @@
|
|
|
388
390
|
|
|
389
391
|
"@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="],
|
|
390
392
|
|
|
393
|
+
"@types/semver": ["@types/semver@7.5.8", "", {}, "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ=="],
|
|
394
|
+
|
|
391
395
|
"@types/tedious": ["@types/tedious@4.0.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw=="],
|
|
392
396
|
|
|
393
397
|
"@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="],
|
|
@@ -1080,7 +1084,7 @@
|
|
|
1080
1084
|
|
|
1081
1085
|
"secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="],
|
|
1082
1086
|
|
|
1083
|
-
"semver": ["semver@7.
|
|
1087
|
+
"semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="],
|
|
1084
1088
|
|
|
1085
1089
|
"send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
|
|
1086
1090
|
|
|
@@ -1248,6 +1252,8 @@
|
|
|
1248
1252
|
|
|
1249
1253
|
"@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
|
|
1250
1254
|
|
|
1255
|
+
"@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
|
|
1256
|
+
|
|
1251
1257
|
"@vellumai/ces-client/@types/bun": ["@types/bun@1.2.4", "", { "dependencies": { "bun-types": "1.2.4" } }, "sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA=="],
|
|
1252
1258
|
|
|
1253
1259
|
"@vellumai/ces-client/@vellumai/service-contracts": ["@vellumai/service-contracts@file:../packages/service-contracts", { "dependencies": { "zod": "4.3.6" }, "devDependencies": { "@types/bun": "1.2.4", "typescript": "5.7.3" } }],
|
|
@@ -1274,6 +1280,8 @@
|
|
|
1274
1280
|
|
|
1275
1281
|
"foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
|
1276
1282
|
|
|
1283
|
+
"gel/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
|
|
1284
|
+
|
|
1277
1285
|
"glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="],
|
|
1278
1286
|
|
|
1279
1287
|
"jszip/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
|
|
@@ -1380,6 +1388,8 @@
|
|
|
1380
1388
|
|
|
1381
1389
|
"detective-typescript/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg=="],
|
|
1382
1390
|
|
|
1391
|
+
"detective-typescript/@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
|
|
1392
|
+
|
|
1383
1393
|
"glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="],
|
|
1384
1394
|
|
|
1385
1395
|
"jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
|
package/docker-entrypoint.sh
CHANGED
|
@@ -5,6 +5,11 @@ set -eu
|
|
|
5
5
|
# processes (the `assistant` user, bun's tmpdir, scratch writes) can use it.
|
|
6
6
|
chmod 1777 /tmp 2>/dev/null || true
|
|
7
7
|
|
|
8
|
+
if [ "${VELLUM_SANDBOX_RUNTIME:-}" = "kata" ] && [ -x /app/assistant/docker-init-apt-root.sh ]; then
|
|
9
|
+
. /app/assistant/docker-kata-apt-env.sh
|
|
10
|
+
/app/assistant/docker-init-apt-root.sh
|
|
11
|
+
fi
|
|
12
|
+
|
|
8
13
|
if [ "$(id -u)" = "0" ] && [ "${VELLUM_WORKSPACE_DIR:-}" = "/workspace" ] && [ -d /workspace ]; then
|
|
9
14
|
git config --global --add safe.directory /workspace >/dev/null 2>&1 || true
|
|
10
15
|
git config --global --add safe.directory '/workspace/*' >/dev/null 2>&1 || true
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
set -eu
|
|
3
|
+
|
|
4
|
+
DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"
|
|
5
|
+
SENTINEL="${DATA_ROOT}/.rootfs-initialized"
|
|
6
|
+
HOST_PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
|
7
|
+
|
|
8
|
+
if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then
|
|
9
|
+
exit 0
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
# Bootstrap the alternate root with the host toolchain so the wrapper
|
|
13
|
+
# binaries in /usr/local/bin do not recurse back into this script.
|
|
14
|
+
export PATH="${HOST_PATH}"
|
|
15
|
+
|
|
16
|
+
check_sane_mount() {
|
|
17
|
+
target="$1"
|
|
18
|
+
probe_dev="${target}/.apt-test-dev-null"
|
|
19
|
+
probe_exec="${target}/.apt-test-exec"
|
|
20
|
+
shell_path="/bin/sh"
|
|
21
|
+
|
|
22
|
+
mkdir -p "${target}"
|
|
23
|
+
|
|
24
|
+
if ! mknod "${probe_dev}" c 1 3 2>/dev/null || ! echo test >"${probe_dev}"; then
|
|
25
|
+
rm -f "${probe_dev}"
|
|
26
|
+
: >"${probe_dev}"
|
|
27
|
+
if ! mount -o bind /dev/null "${probe_dev}" >/dev/null 2>&1; then
|
|
28
|
+
rm -f "${probe_dev}"
|
|
29
|
+
return 1
|
|
30
|
+
fi
|
|
31
|
+
if ! echo test >"${probe_dev}"; then
|
|
32
|
+
umount "${probe_dev}" >/dev/null 2>&1 || true
|
|
33
|
+
rm -f "${probe_dev}"
|
|
34
|
+
return 1
|
|
35
|
+
fi
|
|
36
|
+
umount "${probe_dev}" >/dev/null 2>&1 || true
|
|
37
|
+
fi
|
|
38
|
+
rm -f "${probe_dev}"
|
|
39
|
+
|
|
40
|
+
if [ ! -x "${shell_path}" ]; then
|
|
41
|
+
shell_path="$(command -v sh)"
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
cat >"${probe_exec}" <<EOF
|
|
45
|
+
#! ${shell_path}
|
|
46
|
+
:
|
|
47
|
+
EOF
|
|
48
|
+
chmod +x "${probe_exec}"
|
|
49
|
+
if ! "${probe_exec}" >/dev/null 2>&1; then
|
|
50
|
+
rm -f "${probe_exec}"
|
|
51
|
+
return 1
|
|
52
|
+
fi
|
|
53
|
+
rm -f "${probe_exec}"
|
|
54
|
+
|
|
55
|
+
return 0
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if [ -f "${SENTINEL}" ] && [ -x "${DATA_ROOT}/bin/sh" ] && [ -x "${DATA_ROOT}/usr/bin/apt-get" ]; then
|
|
59
|
+
exit 0
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
if grep -qs " ${DATA_ROOT} .*noexec" /proc/mounts; then
|
|
63
|
+
echo "Warning: ${DATA_ROOT} is mounted noexec; skipping persistent apt rootfs bootstrap" >&2
|
|
64
|
+
exit 0
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
if ! check_sane_mount "${DATA_ROOT}"; then
|
|
68
|
+
echo "Warning: ${DATA_ROOT} cannot host a chrootable apt rootfs here; falling back to image-root apt installs" >&2
|
|
69
|
+
exit 0
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
if [ -x "${DATA_ROOT}/bin/sh" ] && [ -x "${DATA_ROOT}/usr/bin/apt-get" ]; then
|
|
73
|
+
touch "${SENTINEL}"
|
|
74
|
+
exit 0
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
SUITE="${VELLUM_APT_DATA_SUITE:-}"
|
|
78
|
+
if [ -z "${SUITE}" ] && [ -r /etc/os-release ]; then
|
|
79
|
+
# shellcheck disable=SC1091
|
|
80
|
+
. /etc/os-release
|
|
81
|
+
SUITE="${VERSION_CODENAME:-trixie}"
|
|
82
|
+
fi
|
|
83
|
+
if [ -z "${SUITE}" ]; then
|
|
84
|
+
SUITE="trixie"
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
MIRROR="${VELLUM_APT_DATA_MIRROR:-http://deb.debian.org/debian}"
|
|
88
|
+
ARCH="$(/usr/bin/dpkg --print-architecture)"
|
|
89
|
+
|
|
90
|
+
mkdir -p "${DATA_ROOT}"
|
|
91
|
+
|
|
92
|
+
debootstrap --variant=minbase --arch="${ARCH}" "${SUITE}" "${DATA_ROOT}" "${MIRROR}"
|
|
93
|
+
|
|
94
|
+
touch "${SENTINEL}"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
|
|
3
|
+
if [ "${VELLUM_SANDBOX_RUNTIME:-}" != "kata" ]; then
|
|
4
|
+
return 0 2>/dev/null || exit 0
|
|
5
|
+
fi
|
|
6
|
+
|
|
7
|
+
export VELLUM_APT_DATA_ROOT="${VELLUM_APT_DATA_ROOT:-/data/system}"
|
|
8
|
+
|
|
9
|
+
_vellum_kata_append_path() {
|
|
10
|
+
case ":${PATH:-}:" in
|
|
11
|
+
*":$1:"*) ;;
|
|
12
|
+
*) PATH="${PATH:+${PATH}:}$1" ;;
|
|
13
|
+
esac
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
_vellum_kata_prepend_library_path() {
|
|
17
|
+
case ":${LD_LIBRARY_PATH:-}:" in
|
|
18
|
+
*":$1:"*) ;;
|
|
19
|
+
*) LD_LIBRARY_PATH="$1${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" ;;
|
|
20
|
+
esac
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
_vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/bin"
|
|
24
|
+
_vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/usr/local/sbin"
|
|
25
|
+
_vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/usr/local/bin"
|
|
26
|
+
_vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/usr/sbin"
|
|
27
|
+
_vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/usr/bin"
|
|
28
|
+
_vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/sbin"
|
|
29
|
+
_vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/usr/games"
|
|
30
|
+
_vellum_kata_append_path "${VELLUM_APT_DATA_ROOT}/games"
|
|
31
|
+
export PATH
|
|
32
|
+
|
|
33
|
+
_vellum_kata_prepend_library_path "${VELLUM_APT_DATA_ROOT}/usr/lib/aarch64-linux-gnu"
|
|
34
|
+
_vellum_kata_prepend_library_path "${VELLUM_APT_DATA_ROOT}/usr/lib/x86_64-linux-gnu"
|
|
35
|
+
_vellum_kata_prepend_library_path "${VELLUM_APT_DATA_ROOT}/usr/lib"
|
|
36
|
+
_vellum_kata_prepend_library_path "${VELLUM_APT_DATA_ROOT}/usr/local/lib"
|
|
37
|
+
export LD_LIBRARY_PATH
|
|
38
|
+
|
|
39
|
+
unset -f _vellum_kata_append_path _vellum_kata_prepend_library_path
|
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
|
|