@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
|
@@ -6,6 +6,7 @@ import type { SecretPromptResult } from "../../permissions/secret-prompter.js";
|
|
|
6
6
|
import { isPlaceholderSentinelText } from "../../providers/anthropic/client.js";
|
|
7
7
|
import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
|
|
8
8
|
import type { AuthContext } from "../../runtime/auth/types.js";
|
|
9
|
+
import { unwrapExternalContentForDisplay } from "../../security/untrusted-content.js";
|
|
9
10
|
import { getLogger } from "../../util/logger.js";
|
|
10
11
|
import { estimateBase64Bytes } from "../assistant-attachments.js";
|
|
11
12
|
import type { ConversationTransportMetadata } from "../message-protocol.js";
|
|
@@ -120,6 +121,8 @@ export interface SlackInboundMessageMetadata {
|
|
|
120
121
|
threadTs?: string;
|
|
121
122
|
/** Resolved sender label (display name preferred, username fallback). */
|
|
122
123
|
displayName?: string;
|
|
124
|
+
/** Canonical Slack external user id for the sender, when available. */
|
|
125
|
+
actorExternalUserId?: string;
|
|
123
126
|
}
|
|
124
127
|
|
|
125
128
|
/**
|
|
@@ -143,6 +146,11 @@ export interface ConversationCreateOptions {
|
|
|
143
146
|
isInteractive?: boolean;
|
|
144
147
|
/** Slack-only non-persisted notice injected into the active model turn. */
|
|
145
148
|
slackRuntimeContextNotice?: string;
|
|
149
|
+
/**
|
|
150
|
+
* Persisted user-facing content. When present, storage/UI use this value
|
|
151
|
+
* while the model-facing turn continues to use `content`.
|
|
152
|
+
*/
|
|
153
|
+
displayContent?: string;
|
|
146
154
|
/** Channel command intent metadata (e.g. Telegram /start). */
|
|
147
155
|
commandIntent?: { type: string; payload?: string; languageCode?: string };
|
|
148
156
|
|
|
@@ -219,7 +227,7 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
|
|
|
219
227
|
} else if (typeof content === "object") {
|
|
220
228
|
text = JSON.stringify(content);
|
|
221
229
|
} else {
|
|
222
|
-
text = String(content);
|
|
230
|
+
text = unwrapExternalContentForDisplay(String(content));
|
|
223
231
|
}
|
|
224
232
|
return {
|
|
225
233
|
text,
|
|
@@ -324,20 +332,21 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
|
|
|
324
332
|
}
|
|
325
333
|
|
|
326
334
|
if (block.type === "text" && typeof block.text === "string") {
|
|
335
|
+
const displayText = unwrapExternalContentForDisplay(block.text);
|
|
327
336
|
// Skip empty/whitespace-only text blocks. During streaming the client
|
|
328
337
|
// discards empty text deltas (guard !text.isEmpty), so including them
|
|
329
338
|
// here produces a contentOrder that differs from the live streaming
|
|
330
339
|
// path — e.g. empty segments between consecutive tool_use blocks that
|
|
331
340
|
// break tool-call grouping in the UI.
|
|
332
|
-
if (
|
|
341
|
+
if (displayText.trim().length === 0) continue;
|
|
333
342
|
// Drop Anthropic provider placeholder sentinels. These are injected
|
|
334
343
|
// into outbound API requests to preserve role alternation and must
|
|
335
344
|
// never be rendered to users. Belt-and-suspenders with the persist-
|
|
336
345
|
// time filter in cleanAssistantContent and migration 222.
|
|
337
|
-
if (isPlaceholderSentinelText(
|
|
338
|
-
textParts.push(
|
|
346
|
+
if (isPlaceholderSentinelText(displayText)) continue;
|
|
347
|
+
textParts.push(displayText);
|
|
339
348
|
ensureSegment();
|
|
340
|
-
currentSegmentParts.push(
|
|
349
|
+
currentSegmentParts.push(displayText);
|
|
341
350
|
seenText = true;
|
|
342
351
|
continue;
|
|
343
352
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { execSync } from "node:child_process";
|
|
2
1
|
import {
|
|
3
2
|
existsSync,
|
|
4
3
|
lstatSync,
|
|
@@ -8,7 +7,6 @@ import {
|
|
|
8
7
|
rmSync,
|
|
9
8
|
statSync,
|
|
10
9
|
} from "node:fs";
|
|
11
|
-
import { homedir } from "node:os";
|
|
12
10
|
import { basename, join, relative, sep } from "node:path";
|
|
13
11
|
|
|
14
12
|
import { isAssistantFeatureFlagEnabled } from "../../config/assistant-feature-flags.js";
|
|
@@ -19,12 +17,9 @@ import {
|
|
|
19
17
|
saveRawConfig,
|
|
20
18
|
} from "../../config/loader.js";
|
|
21
19
|
import { resolveSkillStates, skillFlagKey } from "../../config/skill-state.js";
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
seedSkillGraphNodes,
|
|
26
|
-
seedUninstalledCatalogSkillMemories,
|
|
27
|
-
} from "../../memory/graph/capability-seed.js";
|
|
20
|
+
import type { SkillSummary } from "../../config/skills.js";
|
|
21
|
+
import { loadSkillCatalog } from "../../config/skills.js";
|
|
22
|
+
import { deleteSkillCapabilityNode } from "../../memory/graph/capability-seed.js";
|
|
28
23
|
import {
|
|
29
24
|
createTimeout,
|
|
30
25
|
extractText,
|
|
@@ -37,57 +32,56 @@ import {
|
|
|
37
32
|
MAX_INLINE_TEXT_SIZE,
|
|
38
33
|
} from "../../runtime/routes/workspace-utils.js";
|
|
39
34
|
import { getCatalog } from "../../skills/catalog-cache.js";
|
|
35
|
+
import type { SkillFileEntry } from "../../skills/catalog-files.js";
|
|
40
36
|
import {
|
|
41
37
|
catalogSkillToSlim,
|
|
42
38
|
createVellumCatalogProvider,
|
|
43
39
|
hasHiddenOrSkippedSegment,
|
|
44
40
|
sanitizeRelativePath,
|
|
45
|
-
type SkillFileEntry,
|
|
46
41
|
SKIP_DIRS,
|
|
47
42
|
} from "../../skills/catalog-files.js";
|
|
43
|
+
import type { CatalogSkill } from "../../skills/catalog-install.js";
|
|
48
44
|
import {
|
|
49
|
-
|
|
45
|
+
commitStagedSkillInstall,
|
|
46
|
+
createSkillInstallStagingDir,
|
|
47
|
+
installSkillDependenciesIfPresent,
|
|
50
48
|
installSkillLocally,
|
|
51
|
-
upsertSkillsIndex,
|
|
52
49
|
} from "../../skills/catalog-install.js";
|
|
53
50
|
import { filterByQuery } from "../../skills/catalog-search.js";
|
|
54
51
|
import { inferCategory } from "../../skills/category-inference.js";
|
|
52
|
+
import type { ClawhubInspectResult } from "../../skills/clawhub.js";
|
|
55
53
|
import {
|
|
56
54
|
clawhubCheckUpdates,
|
|
57
55
|
clawhubInspect,
|
|
58
|
-
type ClawhubInspectResult,
|
|
59
56
|
clawhubInstall,
|
|
60
57
|
clawhubSearch,
|
|
61
58
|
clawhubUpdate,
|
|
62
59
|
} from "../../skills/clawhub.js";
|
|
63
60
|
import { createClawhubProvider } from "../../skills/clawhub-files.js";
|
|
64
|
-
import {
|
|
65
|
-
|
|
66
|
-
type SkillInstallMeta,
|
|
67
|
-
} from "../../skills/install-meta.js";
|
|
61
|
+
import type { SkillInstallMeta } from "../../skills/install-meta.js";
|
|
62
|
+
import { readInstallMeta } from "../../skills/install-meta.js";
|
|
68
63
|
import {
|
|
69
64
|
createManagedSkill,
|
|
70
65
|
deleteManagedSkill,
|
|
71
|
-
removeSkillsIndexEntry,
|
|
72
66
|
validateManagedSkillId,
|
|
73
67
|
} from "../../skills/managed-store.js";
|
|
74
68
|
import type { SkillFileProvider } from "../../skills/skill-file-provider.js";
|
|
75
69
|
import { createSkillsShProvider } from "../../skills/skillssh-files.js";
|
|
70
|
+
import type { SkillAuditData } from "../../skills/skillssh-registry.js";
|
|
76
71
|
import {
|
|
77
72
|
fetchSkillAudits,
|
|
78
73
|
installExternalSkill,
|
|
79
74
|
resolveSkillSource,
|
|
80
75
|
searchSkillsRegistry,
|
|
81
|
-
type SkillAuditData,
|
|
82
76
|
} from "../../skills/skillssh-registry.js";
|
|
83
77
|
import { getWorkspaceSkillsDir } from "../../util/platform.js";
|
|
84
78
|
import { getConfigWatcher } from "../config-watcher.js";
|
|
85
|
-
import { maybeSeedMemoryV2Skills } from "../memory-v2-startup.js";
|
|
86
79
|
import type {
|
|
87
80
|
SkillDetailResponse,
|
|
88
81
|
SkillFileContentResponse,
|
|
89
82
|
SlimSkillResponse,
|
|
90
83
|
} from "../message-types/skills.js";
|
|
84
|
+
import { refreshSkillCapabilityMemories } from "../skill-memory-refresh.js";
|
|
91
85
|
import { CONFIG_RELOAD_DEBOUNCE_MS, ensureSkillEntry, log } from "./shared.js";
|
|
92
86
|
|
|
93
87
|
// ─── Provider chain for uninstalled skill file preview ───────────────────────
|
|
@@ -262,19 +256,17 @@ function saveConfigWithSuppression(raw: Record<string, unknown>): void {
|
|
|
262
256
|
* in the daemon. Handles catalog reload, auto-enable, broadcast, and memory
|
|
263
257
|
* seeding.
|
|
264
258
|
*
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
*
|
|
259
|
+
* Dependency installation is handled by the install path: catalog and
|
|
260
|
+
* skills.sh installs handle it internally, while the clawhub path stages the
|
|
261
|
+
* CLI output, installs dependencies, and commits the staged directory before
|
|
262
|
+
* this runs.
|
|
263
|
+
*
|
|
264
|
+
* Discoverability verification is handled by the install path before this runs.
|
|
270
265
|
*
|
|
271
266
|
* NOT used for bundled skills — those have a simpler inline path in
|
|
272
267
|
* `installSkill()` that only auto-enables, broadcasts, and seeds memories.
|
|
273
268
|
*/
|
|
274
|
-
function postInstallSkill(skillId: string
|
|
275
|
-
// Reload skill catalog so the newly installed skill is picked up
|
|
276
|
-
loadSkillCatalog();
|
|
277
|
-
|
|
269
|
+
function postInstallSkill(skillId: string): void {
|
|
278
270
|
// Auto-enable the skill in config
|
|
279
271
|
try {
|
|
280
272
|
const raw = loadRawConfig();
|
|
@@ -290,9 +282,7 @@ function postInstallSkill(skillId: string, _skillDir: string): void {
|
|
|
290
282
|
}
|
|
291
283
|
|
|
292
284
|
// Seed skill memories
|
|
293
|
-
|
|
294
|
-
maybeSeedMemoryV2Skills(getConfig());
|
|
295
|
-
void seedUninstalledCatalogSkillMemories().catch(() => {});
|
|
285
|
+
refreshSkillCapabilityMemories(getConfig());
|
|
296
286
|
}
|
|
297
287
|
|
|
298
288
|
// ─── Kind / origin / status derivation ───────────────────────────────────────
|
|
@@ -635,7 +625,9 @@ export async function getSkill(
|
|
|
635
625
|
(detail as { owner?: typeof data.owner }).owner = data.owner;
|
|
636
626
|
(detail as { stats?: typeof data.stats }).stats = data.stats;
|
|
637
627
|
(
|
|
638
|
-
detail as {
|
|
628
|
+
detail as {
|
|
629
|
+
latestVersion?: typeof data.latestVersion;
|
|
630
|
+
}
|
|
639
631
|
).latestVersion = data.latestVersion;
|
|
640
632
|
(detail as { createdAt?: typeof data.createdAt }).createdAt =
|
|
641
633
|
data.createdAt;
|
|
@@ -691,32 +683,44 @@ export async function getSkill(
|
|
|
691
683
|
return { skill: detail };
|
|
692
684
|
}
|
|
693
685
|
|
|
694
|
-
export function getSkillLocalDetail(
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
} |
|
|
686
|
+
export function getSkillLocalDetail(skillId: string):
|
|
687
|
+
| {
|
|
688
|
+
ok: true;
|
|
689
|
+
id: string;
|
|
690
|
+
name: string;
|
|
691
|
+
description: string;
|
|
692
|
+
emoji: string | null;
|
|
693
|
+
source: string;
|
|
694
|
+
state: string;
|
|
695
|
+
directoryPath: string;
|
|
696
|
+
featureFlag: string | null;
|
|
697
|
+
includes: string[] | null;
|
|
698
|
+
activationHints: string[] | null;
|
|
699
|
+
avoidWhen: string[] | null;
|
|
700
|
+
toolManifest: {
|
|
701
|
+
valid: boolean;
|
|
702
|
+
toolCount: number;
|
|
703
|
+
toolNames: string[];
|
|
704
|
+
} | null;
|
|
705
|
+
installMeta: Record<string, unknown> | null;
|
|
706
|
+
config: {
|
|
707
|
+
enabled: boolean;
|
|
708
|
+
envKeys: string[];
|
|
709
|
+
configKeys: string[];
|
|
710
|
+
} | null;
|
|
711
|
+
}
|
|
712
|
+
| { ok: false; error: string; status: 404 | 500 } {
|
|
713
713
|
try {
|
|
714
714
|
const catalog = loadSkillCatalog();
|
|
715
715
|
const config = getConfig();
|
|
716
716
|
const resolved = resolveSkillStates(catalog, config);
|
|
717
717
|
const match = resolved.find((r) => r.summary.id === skillId);
|
|
718
718
|
if (!match) {
|
|
719
|
-
return {
|
|
719
|
+
return {
|
|
720
|
+
ok: false,
|
|
721
|
+
error: `Skill "${skillId}" not found. Run 'assistant skills list' to see available skills.`,
|
|
722
|
+
status: 404,
|
|
723
|
+
};
|
|
720
724
|
}
|
|
721
725
|
const { summary, state, configEntry } = match;
|
|
722
726
|
const installMeta = readInstallMeta(summary.directoryPath);
|
|
@@ -734,19 +738,31 @@ export function getSkillLocalDetail(
|
|
|
734
738
|
activationHints: summary.activationHints ?? null,
|
|
735
739
|
avoidWhen: summary.avoidWhen ?? null,
|
|
736
740
|
toolManifest: summary.toolManifest
|
|
737
|
-
? {
|
|
741
|
+
? {
|
|
742
|
+
valid: summary.toolManifest.valid,
|
|
743
|
+
toolCount: summary.toolManifest.toolCount,
|
|
744
|
+
toolNames: summary.toolManifest.toolNames,
|
|
745
|
+
}
|
|
746
|
+
: null,
|
|
747
|
+
installMeta: installMeta
|
|
748
|
+
? (installMeta as unknown as Record<string, unknown>)
|
|
738
749
|
: null,
|
|
739
|
-
installMeta: installMeta ? (installMeta as unknown as Record<string, unknown>) : null,
|
|
740
750
|
config: configEntry
|
|
741
751
|
? {
|
|
742
752
|
enabled: configEntry.enabled !== false,
|
|
743
753
|
envKeys: configEntry.env ? Object.keys(configEntry.env) : [],
|
|
744
|
-
configKeys: configEntry.config
|
|
754
|
+
configKeys: configEntry.config
|
|
755
|
+
? Object.keys(configEntry.config)
|
|
756
|
+
: [],
|
|
745
757
|
}
|
|
746
758
|
: null,
|
|
747
759
|
};
|
|
748
760
|
} catch (err) {
|
|
749
|
-
return {
|
|
761
|
+
return {
|
|
762
|
+
ok: false,
|
|
763
|
+
error: err instanceof Error ? err.message : String(err),
|
|
764
|
+
status: 500,
|
|
765
|
+
};
|
|
750
766
|
}
|
|
751
767
|
}
|
|
752
768
|
|
|
@@ -1007,9 +1023,7 @@ export function enableSkill(
|
|
|
1007
1023
|
name: skillId,
|
|
1008
1024
|
state: "enabled",
|
|
1009
1025
|
});
|
|
1010
|
-
|
|
1011
|
-
maybeSeedMemoryV2Skills(getConfig());
|
|
1012
|
-
void seedUninstalledCatalogSkillMemories().catch(() => {});
|
|
1026
|
+
refreshSkillCapabilityMemories(getConfig());
|
|
1013
1027
|
return { success: true };
|
|
1014
1028
|
} catch (err) {
|
|
1015
1029
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -1030,9 +1044,7 @@ export function disableSkill(
|
|
|
1030
1044
|
name: skillId,
|
|
1031
1045
|
state: "disabled",
|
|
1032
1046
|
});
|
|
1033
|
-
|
|
1034
|
-
maybeSeedMemoryV2Skills(getConfig());
|
|
1035
|
-
void seedUninstalledCatalogSkillMemories().catch(() => {});
|
|
1047
|
+
refreshSkillCapabilityMemories(getConfig());
|
|
1036
1048
|
return { success: true };
|
|
1037
1049
|
} catch (err) {
|
|
1038
1050
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -1105,10 +1117,9 @@ export async function installSkill(spec: {
|
|
|
1105
1117
|
if (bundled) {
|
|
1106
1118
|
// Intentional divergence from postInstallSkill(): bundled skills are
|
|
1107
1119
|
// shipped with the assistant binary and are already on disk. They skip
|
|
1108
|
-
//
|
|
1109
|
-
//
|
|
1110
|
-
//
|
|
1111
|
-
// auto-enable, broadcast, and seed memories are needed.
|
|
1120
|
+
// dependency installation (deps are pre-bundled) and catalog reload (the
|
|
1121
|
+
// catalog already includes them). Only auto-enable, broadcast, and seed
|
|
1122
|
+
// memories are needed.
|
|
1112
1123
|
try {
|
|
1113
1124
|
const raw = loadRawConfig();
|
|
1114
1125
|
ensureSkillEntry(raw, spec.slug).enabled = true;
|
|
@@ -1124,9 +1135,7 @@ export async function installSkill(spec: {
|
|
|
1124
1135
|
"Failed to auto-enable bundled skill",
|
|
1125
1136
|
);
|
|
1126
1137
|
}
|
|
1127
|
-
|
|
1128
|
-
maybeSeedMemoryV2Skills(config);
|
|
1129
|
-
void seedUninstalledCatalogSkillMemories().catch(() => {});
|
|
1138
|
+
refreshSkillCapabilityMemories(config);
|
|
1130
1139
|
return { success: true, skillId: spec.slug };
|
|
1131
1140
|
}
|
|
1132
1141
|
|
|
@@ -1150,13 +1159,15 @@ export async function installSkill(spec: {
|
|
|
1150
1159
|
spec.contactId,
|
|
1151
1160
|
);
|
|
1152
1161
|
|
|
1153
|
-
|
|
1154
|
-
postInstallSkill(spec.slug, skillDir);
|
|
1162
|
+
postInstallSkill(spec.slug);
|
|
1155
1163
|
return { success: true, skillId: spec.slug };
|
|
1156
1164
|
}
|
|
1157
1165
|
} catch (err) {
|
|
1158
1166
|
if (spec.catalogOnly) {
|
|
1159
|
-
return {
|
|
1167
|
+
return {
|
|
1168
|
+
success: false,
|
|
1169
|
+
error: `Failed to install catalog skill "${spec.slug}"`,
|
|
1170
|
+
};
|
|
1160
1171
|
}
|
|
1161
1172
|
log.warn(
|
|
1162
1173
|
{ err, skillId: spec.slug },
|
|
@@ -1165,7 +1176,10 @@ export async function installSkill(spec: {
|
|
|
1165
1176
|
}
|
|
1166
1177
|
|
|
1167
1178
|
if (spec.catalogOnly) {
|
|
1168
|
-
return {
|
|
1179
|
+
return {
|
|
1180
|
+
success: false,
|
|
1181
|
+
error: `Skill "${spec.slug}" not found in the Vellum catalog`,
|
|
1182
|
+
};
|
|
1169
1183
|
}
|
|
1170
1184
|
|
|
1171
1185
|
// skills.sh install path: route here when origin is explicitly "skillssh"
|
|
@@ -1187,36 +1201,32 @@ export async function installSkill(spec: {
|
|
|
1187
1201
|
spec.contactId,
|
|
1188
1202
|
);
|
|
1189
1203
|
|
|
1190
|
-
|
|
1191
|
-
postInstallSkill(resolved.skillSlug, skillDir);
|
|
1204
|
+
postInstallSkill(resolved.skillSlug);
|
|
1192
1205
|
return { success: true, skillId: resolved.skillSlug };
|
|
1193
1206
|
}
|
|
1194
1207
|
|
|
1195
1208
|
// Install from clawhub (community)
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
const rawId = result.skillName ?? spec.slug;
|
|
1204
|
-
const skillId = rawId.includes("/") ? rawId.split("/").pop()! : rawId;
|
|
1205
|
-
|
|
1206
|
-
// clawhubInstall uses the clawhub CLI which doesn't handle bun install
|
|
1207
|
-
// or SKILLS.md indexing, so we do those here before post-install.
|
|
1208
|
-
const skillDir = join(getWorkspaceSkillsDir(), skillId);
|
|
1209
|
-
if (existsSync(join(skillDir, "package.json"))) {
|
|
1210
|
-
const bunPath = `${homedir()}/.bun/bin`;
|
|
1211
|
-
execSync("bun install", {
|
|
1212
|
-
cwd: skillDir,
|
|
1213
|
-
stdio: "inherit",
|
|
1214
|
-
env: { ...process.env, PATH: `${bunPath}:${process.env.PATH}` },
|
|
1209
|
+
let skillId = spec.slug;
|
|
1210
|
+
const clawhubProjectRoot = createSkillInstallStagingDir();
|
|
1211
|
+
try {
|
|
1212
|
+
const result = await clawhubInstall(spec.slug, {
|
|
1213
|
+
version: spec.version,
|
|
1214
|
+
contactId: spec.contactId,
|
|
1215
|
+
projectRoot: clawhubProjectRoot,
|
|
1215
1216
|
});
|
|
1217
|
+
if (!result.success) {
|
|
1218
|
+
return { success: false, error: result.error ?? "Unknown error" };
|
|
1219
|
+
}
|
|
1220
|
+
skillId = result.skillId;
|
|
1221
|
+
|
|
1222
|
+
const stagedSkillDir = result.skillDir;
|
|
1223
|
+
installSkillDependenciesIfPresent(stagedSkillDir);
|
|
1224
|
+
commitStagedSkillInstall(skillId, stagedSkillDir);
|
|
1225
|
+
} finally {
|
|
1226
|
+
rmSync(clawhubProjectRoot, { recursive: true, force: true });
|
|
1216
1227
|
}
|
|
1217
|
-
upsertSkillsIndex(skillId);
|
|
1218
1228
|
|
|
1219
|
-
postInstallSkill(skillId
|
|
1229
|
+
postInstallSkill(skillId);
|
|
1220
1230
|
return { success: true, skillId };
|
|
1221
1231
|
} catch (err) {
|
|
1222
1232
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -1258,11 +1268,6 @@ export async function uninstallSkill(
|
|
|
1258
1268
|
return { success: false, error: "Skill not found" };
|
|
1259
1269
|
}
|
|
1260
1270
|
rmSync(skillDir, { recursive: true });
|
|
1261
|
-
try {
|
|
1262
|
-
removeSkillsIndexEntry(skillId);
|
|
1263
|
-
} catch {
|
|
1264
|
-
/* best effort */
|
|
1265
|
-
}
|
|
1266
1271
|
// Best-effort cleanup of capability memory for uninstalled skill
|
|
1267
1272
|
// (managed path handles this internally via deleteManagedSkill)
|
|
1268
1273
|
deleteSkillCapabilityNode(skillId);
|
|
@@ -1283,9 +1288,7 @@ export async function uninstallSkill(
|
|
|
1283
1288
|
state: "uninstalled",
|
|
1284
1289
|
});
|
|
1285
1290
|
|
|
1286
|
-
|
|
1287
|
-
// next incidental seed event (enable/disable/install).
|
|
1288
|
-
maybeSeedMemoryV2Skills(getConfig());
|
|
1291
|
+
refreshSkillCapabilityMemories(getConfig());
|
|
1289
1292
|
|
|
1290
1293
|
return { success: true };
|
|
1291
1294
|
} catch (err) {
|
|
@@ -1546,7 +1549,9 @@ export async function draftSkill(params: {
|
|
|
1546
1549
|
try {
|
|
1547
1550
|
const prompt = [
|
|
1548
1551
|
"Given the following skill body text, generate metadata for a managed skill.",
|
|
1549
|
-
`Return ONLY valid JSON with these fields: ${missing.join(
|
|
1552
|
+
`Return ONLY valid JSON with these fields: ${missing.join(
|
|
1553
|
+
", ",
|
|
1554
|
+
)}.`,
|
|
1550
1555
|
"Field descriptions:",
|
|
1551
1556
|
"- skillId: a short kebab-case identifier (lowercase, alphanumeric + hyphens/dots/underscores, max 50 chars, must start with a letter or digit)",
|
|
1552
1557
|
"- name: a human-readable name (max 100 chars)",
|
|
@@ -1709,9 +1714,7 @@ export async function createSkill(
|
|
|
1709
1714
|
);
|
|
1710
1715
|
}
|
|
1711
1716
|
|
|
1712
|
-
|
|
1713
|
-
maybeSeedMemoryV2Skills(getConfig());
|
|
1714
|
-
void seedUninstalledCatalogSkillMemories().catch(() => {});
|
|
1717
|
+
refreshSkillCapabilityMemories(getConfig());
|
|
1715
1718
|
return { success: true };
|
|
1716
1719
|
} catch (err) {
|
|
1717
1720
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -318,9 +318,36 @@ function downgradeResult(tr: {
|
|
|
318
318
|
content?: unknown;
|
|
319
319
|
}): ContentBlock {
|
|
320
320
|
const content =
|
|
321
|
-
tr.type === "tool_result" ? tr.content :
|
|
321
|
+
tr.type === "tool_result" ? tr.content : formatWebSearchContent(tr.content); // guard:allow-tool-result-only — distinguishes content format between the two types
|
|
322
322
|
return {
|
|
323
323
|
type: "text",
|
|
324
324
|
text: `[orphaned ${tr.type} for ${tr.tool_use_id}]: ${content}`,
|
|
325
325
|
};
|
|
326
326
|
}
|
|
327
|
+
|
|
328
|
+
function formatWebSearchContent(content: unknown): string {
|
|
329
|
+
if (Array.isArray(content)) {
|
|
330
|
+
const entries: string[] = [];
|
|
331
|
+
for (const r of content) {
|
|
332
|
+
if (
|
|
333
|
+
typeof r !== "object" ||
|
|
334
|
+
r == null ||
|
|
335
|
+
(r as { type?: string }).type !== "web_search_result"
|
|
336
|
+
) {
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
const title =
|
|
340
|
+
typeof (r as { title?: unknown }).title === "string"
|
|
341
|
+
? (r as { title: string }).title
|
|
342
|
+
: "(untitled)";
|
|
343
|
+
const url =
|
|
344
|
+
typeof (r as { url?: unknown }).url === "string"
|
|
345
|
+
? (r as { url: string }).url
|
|
346
|
+
: "";
|
|
347
|
+
const idx = entries.length + 1;
|
|
348
|
+
entries.push(url ? `${idx}. ${title}\n ${url}` : `${idx}. ${title}`);
|
|
349
|
+
}
|
|
350
|
+
if (entries.length > 0) return entries.join("\n");
|
|
351
|
+
}
|
|
352
|
+
return "results unavailable";
|
|
353
|
+
}
|