@vellumai/assistant 0.8.1 → 0.8.3
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 +13 -19
- package/Dockerfile +75 -1
- package/bun.lock +11 -1
- package/docker-entrypoint.sh +17 -0
- package/docker-init-apt-root.sh +167 -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 +642 -5
- 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-loop-exit-reason.test.ts +272 -0
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +195 -0
- 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 +147 -0
- package/src/__tests__/config-get-vision-flag.test.ts +136 -0
- package/src/__tests__/config-loader-backfill.test.ts +115 -18
- 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 +31 -65
- 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 +59 -1
- 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-media-retry.test.ts +19 -8
- 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 +102 -13
- 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__/date-context.test.ts +45 -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 +151 -55
- package/src/__tests__/filing-service.test.ts +140 -0
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
- package/src/__tests__/guardian-action-no-hardcoded-copy.test.ts +0 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +43 -62
- package/src/__tests__/heartbeat-service.test.ts +24 -164
- package/src/__tests__/helpers/channel-test-adapter.ts +0 -2
- 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 +507 -10
- package/src/__tests__/host-proxy-preactivation.test.ts +200 -13
- 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-background-turn.test.ts +153 -0
- package/src/__tests__/injector-chain.test.ts +15 -8
- package/src/__tests__/install-skill-routing.test.ts +155 -37
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +99 -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 +25 -0
- package/src/__tests__/llm-catalog-parity.test.ts +58 -13
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +116 -0
- package/src/__tests__/llm-request-log-error-payload.test.ts +138 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +36 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +29 -53
- package/src/__tests__/llm-resolver.test.ts +255 -2
- package/src/__tests__/llm-usage-store.test.ts +114 -0
- package/src/__tests__/managed-profile-guard.test.ts +41 -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__/notification-decision-fallback.test.ts +0 -91
- package/src/__tests__/notification-decision-strategy.test.ts +14 -31
- package/src/__tests__/notification-deep-link.test.ts +15 -0
- package/src/__tests__/notification-guardian-path.test.ts +1 -2
- package/src/__tests__/notification-platform-adapter.test.ts +5 -4
- package/src/__tests__/notification-telegram-adapter.test.ts +1 -0
- package/src/__tests__/notification-vellum-adapter.test.ts +113 -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 +242 -3
- package/src/__tests__/openai-responses-cutover-guard.test.ts +17 -9
- package/src/__tests__/openrouter-provider-only.test.ts +51 -3
- package/src/__tests__/openrouter-token-estimation.test.ts +34 -25
- 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} +7 -2
- 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 +158 -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} +33 -31
- 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__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +1 -1
- 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 +670 -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-087-memory-router-balanced-profile.test.ts +228 -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/a2a/__tests__/agent-card.test.ts +98 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +597 -0
- package/src/a2a/__tests__/protocol-helpers.test.ts +113 -0
- package/src/a2a/__tests__/task-store.test.ts +246 -0
- package/src/a2a/agent-card.ts +58 -0
- package/src/a2a/feature-gate.ts +8 -0
- package/src/a2a/protocol-constants.ts +21 -0
- package/src/a2a/protocol-errors.ts +50 -0
- package/src/a2a/protocol-types.ts +162 -0
- package/src/a2a/task-store.ts +168 -0
- package/src/acp/resolve-agent.ts +1 -1
- package/src/agent/image-optimize.ts +13 -5
- package/src/agent/loop.ts +167 -18
- package/src/calls/voice-session-bridge.ts +61 -42
- package/src/channels/config.ts +9 -0
- package/src/channels/types.ts +122 -0
- package/src/cli/__tests__/unknown-command.test.ts +24 -0
- package/src/cli/commands/__tests__/changelog.test.ts +304 -319
- package/src/cli/{__tests__ → commands/__tests__}/notifications.test.ts +201 -28
- package/src/cli/commands/__tests__/schedules.test.ts +960 -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 +388 -346
- package/src/cli/commands/plugins.ts +252 -0
- package/src/cli/commands/schedules.ts +683 -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__/search-plugins.test.ts +261 -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 +303 -0
- package/src/cli/lib/list-installed-plugins.ts +137 -0
- package/src/cli/lib/search-plugins.ts +163 -0
- package/src/cli/lib/uninstall-plugin.ts +82 -0
- package/src/cli/lib/unknown-command.ts +111 -0
- package/src/cli/program.ts +52 -2
- package/src/config/assistant-feature-flags.ts +24 -54
- package/src/config/bundled-skills/app-builder/SKILL.md +140 -22
- 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/phone-calls/SKILL.md +1 -1
- 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/call-site-defaults.ts +105 -0
- package/src/config/feature-flag-registry.json +41 -9
- package/src/config/llm-resolver.ts +52 -1
- package/src/config/loader.ts +64 -38
- package/src/config/schema.ts +9 -10
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +3 -3
- package/src/config/schemas/channels.ts +17 -0
- package/src/config/schemas/compaction.ts +28 -0
- package/src/config/schemas/conversations.ts +10 -0
- package/src/config/schemas/heartbeat.ts +23 -0
- package/src/config/schemas/llm-request-logs.ts +31 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrieval.ts +18 -0
- package/src/config/schemas/memory-retrospective.ts +1 -1
- package/src/config/schemas/memory-v2.ts +4 -4
- package/src/config/schemas/memory.ts +3 -1
- package/src/config/schemas/tools.ts +14 -0
- package/src/config/seed-inference-profiles.ts +99 -29
- package/src/config/skills.ts +3 -96
- package/src/context/compactor.ts +1107 -0
- package/src/context/token-estimator.ts +34 -36
- 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 +33 -18
- 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-handlers.ts +78 -0
- package/src/daemon/conversation-agent-loop.ts +198 -11
- 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 +25 -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 -8
- package/src/daemon/date-context.ts +40 -0
- package/src/daemon/external-plugins-bootstrap.ts +217 -181
- package/src/daemon/first-greeting.ts +22 -2
- package/src/daemon/guardian-action-generators.ts +1 -125
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +248 -0
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +154 -0
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +133 -0
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +95 -0
- package/src/daemon/handlers/config-a2a.ts +289 -0
- package/src/daemon/handlers/config-model.ts +6 -5
- package/src/daemon/handlers/config-slack-channel.ts +15 -3
- package/src/daemon/handlers/conversations.ts +1 -0
- 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 +153 -27
- package/src/daemon/host-proxy-preactivation.ts +85 -18
- package/src/daemon/lifecycle.ts +89 -91
- package/src/daemon/meet-host-supervisor.ts +5 -4
- package/src/daemon/memory-v2-startup.ts +85 -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/notifications.ts +21 -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 +11 -54
- package/src/daemon/pkb-reminder-builder.ts +5 -20
- package/src/daemon/plugin-source-watcher.ts +146 -0
- package/src/daemon/process-message.ts +24 -3
- package/src/daemon/server.ts +11 -2
- package/src/daemon/skill-memory-refresh.ts +33 -0
- package/src/daemon/wake-target-adapter.ts +2 -0
- package/src/documents/document-store.ts +221 -3
- package/src/embedded/plugin-api.ts +40 -0
- package/src/export/__tests__/transcript-formatter.test.ts +121 -0
- package/src/export/transcript-formatter.ts +54 -20
- package/src/filing/filing-service.ts +39 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +135 -6
- package/src/heartbeat/heartbeat-run-store.ts +2 -1
- package/src/heartbeat/heartbeat-service.ts +73 -189
- package/src/home/__tests__/feed-types.test.ts +80 -0
- package/src/home/feed-types.ts +36 -2
- package/src/home/post-connect-feed.ts +1 -0
- package/src/index.ts +18 -1
- package/src/ipc/cli-client.ts +147 -45
- 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 +483 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +2 -50
- package/src/memory/__tests__/memory-retrospective-job.test.ts +87 -4
- 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 +197 -11
- package/src/memory/conversation-title-service.ts +26 -4
- package/src/memory/db-init.ts +12 -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 +150 -12
- package/src/memory/graph/conversation-graph-memory.ts +49 -21
- package/src/memory/graph/tools.ts +9 -40
- package/src/memory/indexer.ts +34 -29
- package/src/memory/invite-store.ts +53 -0
- 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 +24 -12
- package/src/memory/llm-request-log-source.ts +19 -52
- package/src/memory/llm-request-log-store.ts +92 -1
- package/src/memory/llm-usage-store.ts +125 -5
- package/src/memory/memory-retrospective-enqueue.ts +1 -20
- package/src/memory/memory-retrospective-job.ts +33 -6
- 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/250-provider-connection-base-url-and-models.ts +28 -0
- package/src/memory/migrations/251-a2a-tasks.ts +49 -0
- package/src/memory/migrations/252-llm-request-log-agent-loop-exit-reason.ts +32 -0
- package/src/memory/migrations/index.ts +9 -0
- package/src/memory/migrations/registry.ts +16 -0
- package/src/memory/onboarding-events-store.ts +106 -0
- package/src/memory/schema/a2a.ts +15 -0
- package/src/memory/schema/bookmarks.ts +0 -2
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/index.ts +1 -0
- package/src/memory/schema/inference.ts +3 -3
- package/src/memory/schema/infrastructure.ts +13 -0
- package/src/memory/turn-events-store.ts +127 -2
- package/src/memory/v2/__tests__/activation-store.test.ts +25 -23
- package/src/memory/v2/__tests__/activation.test.ts +0 -8
- package/src/memory/v2/__tests__/cli-command-store.test.ts +404 -0
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +25 -4
- package/src/memory/v2/__tests__/injection.test.ts +288 -11
- 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/__tests__/static-context.test.ts +12 -1
- package/src/memory/v2/activation-store.ts +14 -16
- package/src/memory/v2/cli-command-content.ts +19 -0
- package/src/memory/v2/cli-command-store.ts +304 -0
- package/src/memory/v2/frontmatter-sweep.ts +7 -1
- package/src/memory/v2/injection.ts +81 -26
- package/src/memory/v2/migration.ts +49 -19
- package/src/memory/v2/page-index.ts +63 -8
- 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/memory/v2/static-context.ts +4 -4
- package/src/memory/v2/types.ts +23 -0
- package/src/messaging/providers/a2a/__tests__/deliver.test.ts +274 -0
- package/src/messaging/providers/a2a/deliver.ts +156 -0
- package/src/messaging/providers/gmail/client.ts +9 -2
- package/src/messaging/providers/index.ts +11 -2
- 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__/broadcaster.test.ts +203 -0
- package/src/notifications/__tests__/decision-engine.test.ts +283 -0
- package/src/notifications/__tests__/deterministic-checks.test.ts +286 -0
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +430 -7
- package/src/notifications/adapters/macos.ts +12 -2
- package/src/notifications/broadcaster.ts +29 -4
- package/src/notifications/conversation-pairing.ts +2 -1
- package/src/notifications/copy-composer.ts +17 -64
- package/src/notifications/decision-engine.ts +113 -45
- package/src/notifications/deterministic-checks.ts +96 -0
- package/src/notifications/emit-signal.ts +21 -1
- package/src/notifications/home-feed-side-effect.ts +138 -5
- package/src/notifications/signal.ts +3 -5
- package/src/notifications/types.ts +8 -0
- package/src/oauth/connection-resolver.ts +8 -4
- package/src/oauth/platform-connection.test.ts +43 -3
- package/src/oauth/platform-connection.ts +19 -6
- 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 +74 -22
- 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 +187 -42
- 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 +40 -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 +10 -43
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +95 -0
- package/src/prompts/normalize-onboarding.ts +27 -0
- package/src/prompts/sections.ts +302 -0
- package/src/prompts/system-prompt.ts +63 -174
- package/src/prompts/templates/BOOTSTRAP.md +17 -1
- package/src/prompts/templates/system-sections.ts +164 -0
- package/src/providers/__tests__/inference.test.ts +24 -7
- package/src/providers/anthropic/client.ts +28 -28
- package/src/providers/call-site-routing.ts +24 -6
- package/src/providers/connection-resolution.ts +68 -11
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +74 -0
- package/src/providers/inference/__tests__/connections-openai-compatible.test.ts +175 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +15 -0
- package/src/providers/inference/adapter-factory.ts +32 -6
- package/src/providers/inference/auth.ts +12 -0
- package/src/providers/inference/backfill.ts +14 -1
- package/src/providers/inference/connections.ts +159 -34
- package/src/providers/inference/resolve-auth.ts +14 -4
- package/src/providers/model-catalog.ts +249 -12
- package/src/providers/model-intents.ts +3 -3
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +235 -0
- package/src/providers/openai/chat-completions-provider.ts +169 -8
- package/src/providers/openrouter/client.ts +49 -4
- package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -2
- 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 +38 -0
- package/src/providers/provider-send-message.ts +27 -12
- package/src/providers/registry.ts +52 -15
- package/src/providers/retry.ts +47 -1
- package/src/runtime/__tests__/agent-wake.test.ts +152 -0
- package/src/runtime/agent-wake.ts +103 -15
- package/src/runtime/auth/route-policy.ts +21 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- package/src/runtime/http-server.ts +7 -16
- package/src/runtime/http-types.ts +19 -47
- 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__/consolidation-routes.test.ts +258 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +172 -23
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +275 -44
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +12 -0
- 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 +126 -0
- package/src/runtime/routes/consolidation-routes.ts +100 -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 +99 -35
- package/src/runtime/routes/conversation-routes.ts +97 -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 +8 -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 +199 -22
- package/src/runtime/routes/integrations/a2a.ts +235 -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 +6 -13
- package/src/runtime/routes/llm-call-sites-routes.ts +11 -1
- 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 +98 -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 +17 -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/memory/register.ts +1 -9
- 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 +107 -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/087-memory-router-balanced-profile.ts +91 -0
- package/src/workspace/migrations/registry.ts +10 -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/__tests__/guardian-action-conversation-turn.test.ts +0 -441
- package/src/context/__tests__/compact-prompt.test.ts +0 -63
- package/src/context/prompts/compact.md +0 -26
- package/src/memory/graph/__tests__/remember-description.test.ts +0 -55
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
- package/src/runtime/guardian-action-conversation-turn.ts +0 -99
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
createConnection,
|
|
4
4
|
disableManagedConnectionsForByokHatch,
|
|
5
5
|
getConnection,
|
|
6
|
+
MANAGED_CONNECTION_NAMES,
|
|
7
|
+
PROVIDERS_REQUIRING_BASE_URL_AND_MODELS,
|
|
6
8
|
} from "../providers/inference/connections.js";
|
|
7
9
|
import { PROVIDER_CATALOG } from "../providers/model-catalog.js";
|
|
8
10
|
import { resolveModelIntent } from "../providers/model-intents.js";
|
|
@@ -17,10 +19,6 @@ import {
|
|
|
17
19
|
|
|
18
20
|
const log = getLogger("seed-inference-profiles");
|
|
19
21
|
|
|
20
|
-
const MANAGED_CONNECTION_NAME = "anthropic-managed";
|
|
21
|
-
const MANAGED_PROFILE_PROVIDER: NonNullable<ProfileEntry["provider"]> =
|
|
22
|
-
"anthropic";
|
|
23
|
-
|
|
24
22
|
/**
|
|
25
23
|
* Template for a daemon-managed inference profile. The profile's model is
|
|
26
24
|
* resolved at seed time from `PROVIDER_MODEL_INTENTS` so the catalog stays the
|
|
@@ -31,16 +29,20 @@ type ManagedProfileTemplate = Omit<
|
|
|
31
29
|
"provider" | "model" | "provider_connection"
|
|
32
30
|
> & {
|
|
33
31
|
intent: ModelIntent;
|
|
32
|
+
provider: NonNullable<ProfileEntry["provider"]>;
|
|
33
|
+
connectionName: string;
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
|
-
* Managed
|
|
38
|
-
*
|
|
37
|
+
* Managed profiles. Overwritten on every daemon boot so Vellum can push
|
|
38
|
+
* model/config updates to customers in new releases. Platform overlays
|
|
39
39
|
* (`preserveProfileNames`) take precedence when present.
|
|
40
40
|
*/
|
|
41
41
|
const MANAGED_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
42
42
|
balanced: {
|
|
43
43
|
intent: "balanced",
|
|
44
|
+
provider: "anthropic",
|
|
45
|
+
connectionName: "anthropic-managed",
|
|
44
46
|
source: "managed",
|
|
45
47
|
label: "Balanced",
|
|
46
48
|
description: "Good balance of quality, cost, and speed",
|
|
@@ -51,6 +53,8 @@ const MANAGED_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
51
53
|
},
|
|
52
54
|
"quality-optimized": {
|
|
53
55
|
intent: "quality-optimized",
|
|
56
|
+
provider: "anthropic",
|
|
57
|
+
connectionName: "anthropic-managed",
|
|
54
58
|
source: "managed",
|
|
55
59
|
label: "Quality",
|
|
56
60
|
description: "Best results with the most capable model",
|
|
@@ -61,6 +65,8 @@ const MANAGED_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
61
65
|
},
|
|
62
66
|
"cost-optimized": {
|
|
63
67
|
intent: "latency-optimized",
|
|
68
|
+
provider: "anthropic",
|
|
69
|
+
connectionName: "anthropic-managed",
|
|
64
70
|
source: "managed",
|
|
65
71
|
label: "Speed",
|
|
66
72
|
description: "Fastest responses at lower cost",
|
|
@@ -74,11 +80,15 @@ const MANAGED_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
74
80
|
/**
|
|
75
81
|
* User profile templates. Materialized at hatch time for off-platform
|
|
76
82
|
* installations. Each points at the user's personal provider connection
|
|
77
|
-
* (backed by their API key in CES).
|
|
83
|
+
* (backed by their API key in CES). The `provider` and `connectionName`
|
|
84
|
+
* fields are placeholders — they are overridden at hatch time with the
|
|
85
|
+
* user's chosen provider and personal connection name.
|
|
78
86
|
*/
|
|
79
87
|
const USER_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
80
88
|
"custom-balanced": {
|
|
81
89
|
intent: "balanced",
|
|
90
|
+
provider: "anthropic",
|
|
91
|
+
connectionName: "",
|
|
82
92
|
source: "user",
|
|
83
93
|
label: "Balanced",
|
|
84
94
|
description: "Good balance of quality, cost, and speed",
|
|
@@ -89,6 +99,8 @@ const USER_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
89
99
|
},
|
|
90
100
|
"custom-quality-optimized": {
|
|
91
101
|
intent: "quality-optimized",
|
|
102
|
+
provider: "anthropic",
|
|
103
|
+
connectionName: "",
|
|
92
104
|
source: "user",
|
|
93
105
|
label: "Quality",
|
|
94
106
|
description: "Best results with the most capable model",
|
|
@@ -99,6 +111,8 @@ const USER_PROFILE_TEMPLATES: Record<string, ManagedProfileTemplate> = {
|
|
|
99
111
|
},
|
|
100
112
|
"custom-cost-optimized": {
|
|
101
113
|
intent: "latency-optimized",
|
|
114
|
+
provider: "anthropic",
|
|
115
|
+
connectionName: "",
|
|
102
116
|
source: "user",
|
|
103
117
|
label: "Speed",
|
|
104
118
|
description: "Fastest responses at lower cost",
|
|
@@ -164,11 +178,12 @@ export function seedInferenceProfiles(
|
|
|
164
178
|
// BYOK mode = off-platform installs. The user is bringing their own provider
|
|
165
179
|
// API key; managed profile labels get a " (Managed)" suffix to disambiguate
|
|
166
180
|
// from the personal "custom-*" profiles that share base labels. Managed
|
|
167
|
-
// profile + connection status is initially "disabled"
|
|
168
|
-
// offer an unusable platform-auth option on day one
|
|
169
|
-
//
|
|
170
|
-
//
|
|
171
|
-
//
|
|
181
|
+
// profile + connection status is initially "disabled" for true BYOK hatches
|
|
182
|
+
// so the picker doesn't offer an unusable platform-auth option on day one.
|
|
183
|
+
// When the hatch overlay explicitly selects a managed profile, the matching
|
|
184
|
+
// managed connection stays active so the first post-onboarding message can
|
|
185
|
+
// use the user's chosen managed route. Post-hatch user toggles survive every
|
|
186
|
+
// subsequent boot.
|
|
172
187
|
const isByokMode = !isPlatform;
|
|
173
188
|
|
|
174
189
|
// 1. Managed profiles. Off-platform: overwrite on every boot so Vellum can
|
|
@@ -198,10 +213,18 @@ export function seedInferenceProfiles(
|
|
|
198
213
|
// rewritten to the suffixed form. Any other previous label value
|
|
199
214
|
// (user-set custom string, explicit null, already-suffixed) is
|
|
200
215
|
// preserved as-is.
|
|
201
|
-
// • status: "disabled" on fresh materialization at hatch only —
|
|
202
|
-
// gated on (isHatch && !previous)
|
|
203
|
-
//
|
|
204
|
-
//
|
|
216
|
+
// • status: "disabled" on fresh materialization at BYOK hatch only —
|
|
217
|
+
// gated on (isHatch && !previous) and skipped for any managed
|
|
218
|
+
// connection explicitly selected by the hatch overlay. Post-hatch
|
|
219
|
+
// boots and existing installs are never auto-disabled. A user
|
|
220
|
+
// re-enable persists across boots via the key-presence preservation
|
|
221
|
+
// below.
|
|
222
|
+
const hatchSelectedManagedConnection = getHatchSelectedManagedConnection(
|
|
223
|
+
llm,
|
|
224
|
+
profiles,
|
|
225
|
+
options,
|
|
226
|
+
);
|
|
227
|
+
|
|
205
228
|
for (const [name, template] of Object.entries(MANAGED_PROFILE_TEMPLATES)) {
|
|
206
229
|
if (preservedProfileNames.has(name)) continue;
|
|
207
230
|
if (isPlatform && readObject(profiles[name]) !== null) continue;
|
|
@@ -212,10 +235,15 @@ export function seedInferenceProfiles(
|
|
|
212
235
|
: template;
|
|
213
236
|
const next = materializeProfile(
|
|
214
237
|
effectiveTemplate,
|
|
215
|
-
|
|
216
|
-
|
|
238
|
+
template.provider,
|
|
239
|
+
template.connectionName,
|
|
217
240
|
) as Record<string, unknown>;
|
|
218
|
-
if (
|
|
241
|
+
if (
|
|
242
|
+
isByokMode &&
|
|
243
|
+
options.isHatch &&
|
|
244
|
+
!previous &&
|
|
245
|
+
template.connectionName !== hatchSelectedManagedConnection
|
|
246
|
+
) {
|
|
219
247
|
next.status = "disabled";
|
|
220
248
|
}
|
|
221
249
|
if (previous) {
|
|
@@ -238,17 +266,24 @@ export function seedInferenceProfiles(
|
|
|
238
266
|
// 2. User profiles — only at hatch time for off-platform installations.
|
|
239
267
|
let userConnectionName: string | undefined;
|
|
240
268
|
if (options.isHatch && !isPlatform) {
|
|
241
|
-
// BYOK hatch: disable
|
|
242
|
-
//
|
|
243
|
-
//
|
|
244
|
-
//
|
|
245
|
-
//
|
|
269
|
+
// BYOK hatch: disable canonical managed connections so the picker doesn't
|
|
270
|
+
// surface unusable platform-auth options on day one. If the hatch overlay
|
|
271
|
+
// selected a managed profile, leave that connection active; the user has
|
|
272
|
+
// already chosen managed inference. Runs only here, only at hatch —
|
|
273
|
+
// `seedCanonicalConnections` leaves `status` alone on subsequent boots so
|
|
274
|
+
// a post-hatch user re-enable persists.
|
|
246
275
|
if (options.db) {
|
|
247
|
-
disableManagedConnectionsForByokHatch(options.db
|
|
276
|
+
disableManagedConnectionsForByokHatch(options.db, {
|
|
277
|
+
excludeConnection: hatchSelectedManagedConnection,
|
|
278
|
+
});
|
|
248
279
|
}
|
|
249
280
|
|
|
250
281
|
const hatchProvider = readString(readObject(llm.default)?.provider);
|
|
251
|
-
if (
|
|
282
|
+
if (
|
|
283
|
+
hatchProvider &&
|
|
284
|
+
hatchProvider !== "ollama" &&
|
|
285
|
+
!PROVIDERS_REQUIRING_BASE_URL_AND_MODELS.has(hatchProvider)
|
|
286
|
+
) {
|
|
252
287
|
userConnectionName = `${hatchProvider}-personal`;
|
|
253
288
|
|
|
254
289
|
if (options.db) {
|
|
@@ -269,8 +304,7 @@ export function seedInferenceProfiles(
|
|
|
269
304
|
}
|
|
270
305
|
}
|
|
271
306
|
|
|
272
|
-
const provider =
|
|
273
|
-
hatchProvider as NonNullable<ProfileEntry["provider"]>;
|
|
307
|
+
const provider = hatchProvider as NonNullable<ProfileEntry["provider"]>;
|
|
274
308
|
for (const [name, template] of Object.entries(USER_PROFILE_TEMPLATES)) {
|
|
275
309
|
if (preservedProfileNames.has(name)) continue;
|
|
276
310
|
profiles[name] = materializeProfile(
|
|
@@ -342,7 +376,7 @@ function materializeProfile(
|
|
|
342
376
|
provider: NonNullable<ProfileEntry["provider"]>,
|
|
343
377
|
connectionName: string,
|
|
344
378
|
): ProfileEntry {
|
|
345
|
-
const { intent, ...rest } = template;
|
|
379
|
+
const { intent, provider: _p, connectionName: _c, ...rest } = template;
|
|
346
380
|
return {
|
|
347
381
|
...rest,
|
|
348
382
|
provider,
|
|
@@ -361,6 +395,42 @@ function readString(value: unknown): string | undefined {
|
|
|
361
395
|
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
362
396
|
}
|
|
363
397
|
|
|
398
|
+
function getHatchSelectedManagedConnection(
|
|
399
|
+
llm: Record<string, unknown>,
|
|
400
|
+
profiles: Record<string, Record<string, unknown>>,
|
|
401
|
+
options: SeedInferenceProfilesOptions,
|
|
402
|
+
): string | undefined {
|
|
403
|
+
if (!options.isHatch || options.preserveActiveProfile !== true) {
|
|
404
|
+
return undefined;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
const activeProfile = readString(llm.activeProfile);
|
|
408
|
+
if (!activeProfile) return undefined;
|
|
409
|
+
|
|
410
|
+
const activeProfileEntry = readObject(profiles[activeProfile]);
|
|
411
|
+
if (
|
|
412
|
+
activeProfileEntry &&
|
|
413
|
+
Object.prototype.hasOwnProperty.call(
|
|
414
|
+
activeProfileEntry,
|
|
415
|
+
"provider_connection",
|
|
416
|
+
)
|
|
417
|
+
) {
|
|
418
|
+
const explicitConnection = readString(
|
|
419
|
+
activeProfileEntry.provider_connection,
|
|
420
|
+
);
|
|
421
|
+
return explicitConnection &&
|
|
422
|
+
MANAGED_CONNECTION_NAMES.has(explicitConnection)
|
|
423
|
+
? explicitConnection
|
|
424
|
+
: undefined;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
const templateConnection =
|
|
428
|
+
MANAGED_PROFILE_TEMPLATES[activeProfile]?.connectionName;
|
|
429
|
+
return templateConnection && MANAGED_CONNECTION_NAMES.has(templateConnection)
|
|
430
|
+
? templateConnection
|
|
431
|
+
: undefined;
|
|
432
|
+
}
|
|
433
|
+
|
|
364
434
|
/**
|
|
365
435
|
* Format the human-readable label seeded onto a personal provider connection
|
|
366
436
|
* at hatch time, e.g. `"Anthropic (Personal)"`. The display name is sourced
|
package/src/config/skills.ts
CHANGED
|
@@ -203,10 +203,6 @@ export function getBundledSkillsDir(): string {
|
|
|
203
203
|
return join(dir, "bundled-skills");
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
-
function getSkillsIndexPath(skillsDir: string): string {
|
|
207
|
-
return join(skillsDir, "SKILLS.md");
|
|
208
|
-
}
|
|
209
|
-
|
|
210
206
|
// ─── Frontmatter parsing ─────────────────────────────────────────────────────
|
|
211
207
|
|
|
212
208
|
interface ParsedFrontmatter {
|
|
@@ -618,94 +614,6 @@ function loadBundledSkills(): SkillSummary[] {
|
|
|
618
614
|
return skills;
|
|
619
615
|
}
|
|
620
616
|
|
|
621
|
-
// ─── Index parsing ───────────────────────────────────────────────────────────
|
|
622
|
-
|
|
623
|
-
function parseIndexEntry(line: string): string | null {
|
|
624
|
-
const bulletMatch = line.trim().match(/^[-*]\s+(.+)$/);
|
|
625
|
-
if (!bulletMatch) return null;
|
|
626
|
-
|
|
627
|
-
let entry = bulletMatch[1].trim();
|
|
628
|
-
const markdownLinkMatch = entry.match(/^\[[^\]]+\]\(([^)]+)\)$/);
|
|
629
|
-
if (markdownLinkMatch) {
|
|
630
|
-
entry = markdownLinkMatch[1].trim();
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
if (entry.startsWith("`") && entry.endsWith("`")) {
|
|
634
|
-
entry = entry.slice(1, -1).trim();
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
return entry.length > 0 ? entry : null;
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
function resolveIndexEntryToDirectory(
|
|
641
|
-
skillsDir: string,
|
|
642
|
-
entry: string,
|
|
643
|
-
): string | null {
|
|
644
|
-
if (isAbsolute(entry)) {
|
|
645
|
-
log.warn(
|
|
646
|
-
{ entry },
|
|
647
|
-
"Skipping SKILLS.md entry because absolute paths are not allowed",
|
|
648
|
-
);
|
|
649
|
-
return null;
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
const resolvedEntryPath = resolve(skillsDir, entry);
|
|
653
|
-
const resolvedDirectory =
|
|
654
|
-
basename(resolvedEntryPath).toLowerCase() === "skill.md"
|
|
655
|
-
? dirname(resolvedEntryPath)
|
|
656
|
-
: resolvedEntryPath;
|
|
657
|
-
|
|
658
|
-
const relativePath = getRelativeToSkillsRoot(skillsDir, resolvedDirectory);
|
|
659
|
-
if (relativePath.length === 0) {
|
|
660
|
-
log.warn(
|
|
661
|
-
{ entry },
|
|
662
|
-
"Skipping SKILLS.md entry that resolves to the skills root",
|
|
663
|
-
);
|
|
664
|
-
return null;
|
|
665
|
-
}
|
|
666
|
-
if (isOutsideSkillsRoot(skillsDir, resolvedDirectory)) {
|
|
667
|
-
log.warn(
|
|
668
|
-
{ entry, resolvedDirectory: getCanonicalPath(resolvedDirectory) },
|
|
669
|
-
"Skipping SKILLS.md entry that resolves outside ~/.vellum/workspace/skills",
|
|
670
|
-
);
|
|
671
|
-
return null;
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
return resolvedDirectory;
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
function getIndexedSkillDirectories(skillsDir: string): string[] | null {
|
|
678
|
-
const indexPath = getSkillsIndexPath(skillsDir);
|
|
679
|
-
if (!existsSync(indexPath)) return null;
|
|
680
|
-
|
|
681
|
-
let rawIndex = "";
|
|
682
|
-
try {
|
|
683
|
-
rawIndex = readFileSync(indexPath, "utf-8");
|
|
684
|
-
} catch (err) {
|
|
685
|
-
log.warn(
|
|
686
|
-
{ err, indexPath },
|
|
687
|
-
"Failed to read SKILLS.md; treating as empty catalog",
|
|
688
|
-
);
|
|
689
|
-
return [];
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
const directories: string[] = [];
|
|
693
|
-
const seen = new Set<string>();
|
|
694
|
-
|
|
695
|
-
for (const line of rawIndex.split(/\r?\n/)) {
|
|
696
|
-
const parsedEntry = parseIndexEntry(line);
|
|
697
|
-
if (!parsedEntry) continue;
|
|
698
|
-
|
|
699
|
-
const directory = resolveIndexEntryToDirectory(skillsDir, parsedEntry);
|
|
700
|
-
if (!directory || seen.has(directory)) continue;
|
|
701
|
-
|
|
702
|
-
seen.add(directory);
|
|
703
|
-
directories.push(directory);
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
return directories;
|
|
707
|
-
}
|
|
708
|
-
|
|
709
617
|
function discoverSkillDirectories(skillsDir: string): string[] {
|
|
710
618
|
if (!existsSync(skillsDir)) return [];
|
|
711
619
|
|
|
@@ -713,7 +621,7 @@ function discoverSkillDirectories(skillsDir: string): string[] {
|
|
|
713
621
|
try {
|
|
714
622
|
const entries = readdirSync(skillsDir, { withFileTypes: true });
|
|
715
623
|
for (const entry of entries) {
|
|
716
|
-
if (!entry.isDirectory()) continue;
|
|
624
|
+
if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
|
|
717
625
|
const directoryPath = join(skillsDir, entry.name);
|
|
718
626
|
if (existsSync(join(directoryPath, "SKILL.md"))) {
|
|
719
627
|
dirs.push(directoryPath);
|
|
@@ -867,8 +775,7 @@ export function loadSkillCatalog(
|
|
|
867
775
|
|
|
868
776
|
// Load managed (user) skills, which take precedence over bundled skills with the same ID
|
|
869
777
|
const skillsDir = getSkillsDir();
|
|
870
|
-
const
|
|
871
|
-
const directories = indexedDirectories ?? discoverSkillDirectories(skillsDir);
|
|
778
|
+
const directories = discoverSkillDirectories(skillsDir);
|
|
872
779
|
|
|
873
780
|
for (const directory of directories) {
|
|
874
781
|
const skill = readSkillFromDirectory(directory, skillsDir, "managed");
|
|
@@ -1164,7 +1071,7 @@ export function resolveSkillSelector(
|
|
|
1164
1071
|
const catalog = loadSkillCatalog(workspaceSkillsDir);
|
|
1165
1072
|
if (catalog.length === 0) {
|
|
1166
1073
|
return {
|
|
1167
|
-
error: `No skills are available.
|
|
1074
|
+
error: `No skills are available. Add skill directories under ${getWorkspaceDirDisplay()}/skills/.`,
|
|
1168
1075
|
errorCode: "empty_catalog",
|
|
1169
1076
|
};
|
|
1170
1077
|
}
|