@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
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
import { LlmRequestLogsConfigSchema } from "../llm-request-logs.js";
|
|
4
|
+
|
|
5
|
+
describe("LlmRequestLogsConfigSchema", () => {
|
|
6
|
+
test("parses undefined to the local default", () => {
|
|
7
|
+
expect(LlmRequestLogsConfigSchema.parse(undefined)).toEqual({
|
|
8
|
+
readSource: "local",
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test("parses an explicit local readSource", () => {
|
|
13
|
+
expect(
|
|
14
|
+
LlmRequestLogsConfigSchema.parse({ readSource: "local" }),
|
|
15
|
+
).toEqual({ readSource: "local" });
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test("parses an explicit clickhouse readSource with defaulted connection fields", () => {
|
|
19
|
+
expect(
|
|
20
|
+
LlmRequestLogsConfigSchema.parse({ readSource: "clickhouse" }),
|
|
21
|
+
).toEqual({
|
|
22
|
+
readSource: "clickhouse",
|
|
23
|
+
clickhouse: {
|
|
24
|
+
database: "default",
|
|
25
|
+
table: "llm_request_logs",
|
|
26
|
+
user: "default",
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("rejects an unknown readSource", () => {
|
|
32
|
+
expect(() =>
|
|
33
|
+
LlmRequestLogsConfigSchema.parse({ readSource: "postgres" }),
|
|
34
|
+
).toThrow();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -10,6 +10,10 @@ export const TwilioConfigSchema = z
|
|
|
10
10
|
.string({ error: "twilio.phoneNumber must be a string" })
|
|
11
11
|
.default("")
|
|
12
12
|
.describe("Twilio phone number used for outbound calls and SMS"),
|
|
13
|
+
setupStarted: z
|
|
14
|
+
.boolean({ error: "twilio.setupStarted must be a boolean" })
|
|
15
|
+
.default(false)
|
|
16
|
+
.describe("Whether Twilio setup has ever been started"),
|
|
13
17
|
})
|
|
14
18
|
.describe("Twilio account configuration");
|
|
15
19
|
|
|
@@ -111,6 +115,10 @@ export const SlackConfigSchema = z
|
|
|
111
115
|
.string({ error: "slack.teamName must be a string" })
|
|
112
116
|
.default("")
|
|
113
117
|
.describe("Slack workspace team name"),
|
|
118
|
+
teamUrl: z
|
|
119
|
+
.string({ error: "slack.teamUrl must be a string" })
|
|
120
|
+
.default("")
|
|
121
|
+
.describe("Slack workspace URL"),
|
|
114
122
|
botUserId: z
|
|
115
123
|
.string({ error: "slack.botUserId must be a string" })
|
|
116
124
|
.default("")
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const CompactionConfigSchema = z
|
|
4
|
+
.object({
|
|
5
|
+
enabled: z
|
|
6
|
+
.boolean({ error: "compaction.enabled must be a boolean" })
|
|
7
|
+
.default(true)
|
|
8
|
+
.describe("Whether assistant-driven context compaction is enabled"),
|
|
9
|
+
autoThreshold: z
|
|
10
|
+
.number({ error: "compaction.autoThreshold must be a number" })
|
|
11
|
+
.finite("compaction.autoThreshold must be finite")
|
|
12
|
+
.gt(0, "compaction.autoThreshold must be greater than 0")
|
|
13
|
+
.lte(1, "compaction.autoThreshold must be less than or equal to 1")
|
|
14
|
+
.default(0.7)
|
|
15
|
+
.describe(
|
|
16
|
+
"Fraction of the context window at which automatic compaction fires",
|
|
17
|
+
),
|
|
18
|
+
prompt: z
|
|
19
|
+
.string({ error: "compaction.prompt must be a string" })
|
|
20
|
+
.nullable()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe(
|
|
23
|
+
"Custom compaction instruction. When set, replaces the generic default verbatim. The `{image_manifest}` placeholder is still interpolated.",
|
|
24
|
+
),
|
|
25
|
+
})
|
|
26
|
+
.describe("Assistant-driven context compaction");
|
|
27
|
+
|
|
28
|
+
export type CompactionConfig = z.infer<typeof CompactionConfigSchema>;
|
|
@@ -47,6 +47,15 @@ export const HeartbeatConfigSchema = z
|
|
|
47
47
|
.describe(
|
|
48
48
|
"Hour of the day (0-23) when heartbeat checks stop, or null to disable active hours restriction",
|
|
49
49
|
),
|
|
50
|
+
maxConsecutiveRuns: z
|
|
51
|
+
.number({ error: "heartbeat.maxConsecutiveRuns must be a number" })
|
|
52
|
+
.int("heartbeat.maxConsecutiveRuns must be an integer")
|
|
53
|
+
.positive("heartbeat.maxConsecutiveRuns must be a positive integer")
|
|
54
|
+
.nullable()
|
|
55
|
+
.default(3)
|
|
56
|
+
.describe(
|
|
57
|
+
"Maximum heartbeats that can run consecutively without a guardian message. Counter resets when the guardian sends a message. Set to null for unlimited.",
|
|
58
|
+
),
|
|
50
59
|
})
|
|
51
60
|
.describe("Periodic heartbeat configuration for health monitoring")
|
|
52
61
|
.superRefine((config, ctx) => {
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
* from the credential store (`clickhouse:url`, `clickhouse:password`).
|
|
9
9
|
* The connection options below describe everything else (database/table/user).
|
|
10
10
|
*
|
|
11
|
+
* The shape is a discriminated union on `readSource` so the `clickhouse`
|
|
12
|
+
* block only exists on the ClickHouse branch — there's no stray defaults
|
|
13
|
+
* sitting around when the source is local.
|
|
14
|
+
*
|
|
11
15
|
* Note: the existing retention setting lives under
|
|
12
16
|
* `memory.cleanup.llmRequestLogRetentionMs` and is independent of this block.
|
|
13
17
|
* That covers when local rows get pruned; this block governs where reads
|
|
@@ -37,18 +41,38 @@ export const LlmRequestLogsClickHouseConfigSchema = z
|
|
|
37
41
|
"ClickHouse connection settings used when `readSource` is `clickhouse`",
|
|
38
42
|
);
|
|
39
43
|
|
|
40
|
-
|
|
44
|
+
const LocalLlmRequestLogsConfigSchema = z
|
|
45
|
+
.object({
|
|
46
|
+
readSource: z.literal("local"),
|
|
47
|
+
})
|
|
48
|
+
.describe("Read LLM request logs from local SQLite (default).");
|
|
49
|
+
|
|
50
|
+
const ClickHouseLlmRequestLogsConfigSchema = z
|
|
41
51
|
.object({
|
|
42
|
-
readSource: z
|
|
43
|
-
.enum(["local", "clickhouse"])
|
|
44
|
-
.default("local")
|
|
45
|
-
.describe(
|
|
46
|
-
"Where to read LLM request logs from for Inspector queries. `local` reads the SQLite source-of-truth (default, lowest latency). `clickhouse` reads the mirror, which retains data longer than local but only sees writes that the mirror job has flushed.",
|
|
47
|
-
),
|
|
52
|
+
readSource: z.literal("clickhouse"),
|
|
48
53
|
clickhouse: LlmRequestLogsClickHouseConfigSchema.default(
|
|
49
54
|
LlmRequestLogsClickHouseConfigSchema.parse({}),
|
|
50
55
|
),
|
|
51
56
|
})
|
|
57
|
+
.describe(
|
|
58
|
+
"Read LLM request logs from the ClickHouse mirror. Requires the `clickhouse:url` and `clickhouse:password` credentials to be set.",
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
// The default is baked into the export so the schema matches the sibling
|
|
62
|
+
// pattern across `assistant/src/config/schemas/*` — `Schema.parse(undefined)`
|
|
63
|
+
// returns documented defaults. The discriminated union has no inherent
|
|
64
|
+
// default (no shared discriminator value), so we explicitly select the
|
|
65
|
+
// `local` branch.
|
|
66
|
+
//
|
|
67
|
+
// Note: `LlmRequestLogsConfigSchema.parse({})` still throws — a discriminated
|
|
68
|
+
// union cannot pick a branch without a discriminator. Use `parse(undefined)`
|
|
69
|
+
// or omit the field entirely to get the default.
|
|
70
|
+
export const LlmRequestLogsConfigSchema = z
|
|
71
|
+
.discriminatedUnion("readSource", [
|
|
72
|
+
LocalLlmRequestLogsConfigSchema,
|
|
73
|
+
ClickHouseLlmRequestLogsConfigSchema,
|
|
74
|
+
])
|
|
75
|
+
.default({ readSource: "local" })
|
|
52
76
|
.describe("LLM request log read source configuration");
|
|
53
77
|
|
|
54
78
|
export type LlmRequestLogsConfig = z.infer<typeof LlmRequestLogsConfigSchema>;
|
|
@@ -284,6 +284,21 @@ const MemoryInjectionConfigSchema = z
|
|
|
284
284
|
"Controls how many memory items are injected at conversation start and per turn",
|
|
285
285
|
);
|
|
286
286
|
|
|
287
|
+
const ScratchpadInjectionConfigSchema = z
|
|
288
|
+
.object({
|
|
289
|
+
enabled: z
|
|
290
|
+
.boolean({
|
|
291
|
+
error: "memory.retrieval.scratchpadInjection.enabled must be a boolean",
|
|
292
|
+
})
|
|
293
|
+
.default(true)
|
|
294
|
+
.describe(
|
|
295
|
+
"Whether NOW.md scratchpad content is injected into the conversation prompt. Injection occurs on the first turn and post-compaction; flipping this off takes effect on the next conversation or compaction.",
|
|
296
|
+
),
|
|
297
|
+
})
|
|
298
|
+
.describe(
|
|
299
|
+
"Controls whether the user-maintained NOW.md scratchpad is injected into prompts",
|
|
300
|
+
);
|
|
301
|
+
|
|
287
302
|
export const MemoryRetrievalConfigSchema = z
|
|
288
303
|
.object({
|
|
289
304
|
maxInjectTokens: z
|
|
@@ -312,6 +327,9 @@ export const MemoryRetrievalConfigSchema = z
|
|
|
312
327
|
injection: MemoryInjectionConfigSchema.default(
|
|
313
328
|
MemoryInjectionConfigSchema.parse({}),
|
|
314
329
|
),
|
|
330
|
+
scratchpadInjection: ScratchpadInjectionConfigSchema.default(
|
|
331
|
+
ScratchpadInjectionConfigSchema.parse({}),
|
|
332
|
+
),
|
|
315
333
|
})
|
|
316
334
|
.describe(
|
|
317
335
|
"Controls how memories are retrieved and injected into conversations",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const ToolsConfigSchema = z
|
|
4
|
+
.object({
|
|
5
|
+
exclude: z
|
|
6
|
+
.array(z.string(), { error: "tools.exclude must be an array of strings" })
|
|
7
|
+
.default([])
|
|
8
|
+
.describe(
|
|
9
|
+
"Tool names to suppress. Excluded tools are not sent to the LLM. Names match `ToolDefinition.name` exactly (e.g. `bash`, `mcp__server__tool`).",
|
|
10
|
+
),
|
|
11
|
+
})
|
|
12
|
+
.describe("Tool visibility configuration");
|
|
13
|
+
|
|
14
|
+
export type ToolsConfig = z.infer<typeof ToolsConfigSchema>;
|
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
|
}
|