@vellumai/assistant 0.8.7 → 0.8.8
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/Dockerfile +20 -4
- package/docker-entrypoint.sh +4 -2
- package/docker-init-apt-root.sh +3 -1
- package/docker-kata-apt-env.sh +3 -1
- package/docker-kata-runtime-family.sh +12 -0
- package/docs/architecture/memory.md +1 -1
- package/docs/plugins.md +75 -79
- package/examples/plugins/echo/README.md +6 -12
- package/examples/plugins/echo/register.ts +0 -41
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +3 -3
- package/openapi.yaml +3381 -348
- package/package.json +1 -1
- package/scripts/generate-openapi.ts +68 -41
- package/src/__tests__/agent-loop-exit-reason.test.ts +34 -39
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +1 -1
- package/src/__tests__/agent-loop.test.ts +37 -87
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
- package/src/__tests__/annotate-activity-metadata.test.ts +262 -0
- package/src/__tests__/annotate-risk-options.test.ts +2 -3
- package/src/__tests__/anthropic-provider.test.ts +95 -2
- package/src/__tests__/assistant-event-hub.test.ts +25 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +8 -0
- package/src/__tests__/{conversation-stream-state.test.ts → assistant-stream-state.test.ts} +252 -91
- package/src/__tests__/auth-fallback-events-store.test.ts +116 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +6 -0
- package/src/__tests__/btw-routes.test.ts +62 -3
- package/src/__tests__/build-persisted-content.test.ts +184 -0
- package/src/__tests__/catalog-files.test.ts +1 -1
- package/src/__tests__/clawhub-files.test.ts +1 -1
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction.benchmark.test.ts +0 -30
- package/src/__tests__/config-watcher.test.ts +1 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +57 -19
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +6 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -4
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +313 -1136
- package/src/__tests__/conversation-agent-loop.test.ts +596 -1616
- package/src/__tests__/conversation-analysis-routes.test.ts +6 -0
- package/src/__tests__/conversation-history-web-search.test.ts +11 -1
- package/src/__tests__/conversation-pairing.test.ts +4 -31
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +6 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +26 -5
- package/src/__tests__/conversation-queue.test.ts +2 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +6 -5
- package/src/__tests__/conversation-runtime-assembly.test.ts +170 -229
- package/src/__tests__/conversation-runtime-workspace.test.ts +3 -24
- package/src/__tests__/conversation-slash-commands.test.ts +8 -42
- package/src/__tests__/conversation-slash-queue.test.ts +6 -1
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +84 -0
- package/src/__tests__/conversation-sync-tags.test.ts +27 -15
- package/src/__tests__/conversation-title-service.test.ts +135 -2
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -1
- package/src/__tests__/cross-provider-web-search.test.ts +214 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +5 -0
- package/src/__tests__/dm-persistence.test.ts +5 -1
- package/src/__tests__/empty-response-hook.test.ts +304 -0
- package/src/__tests__/feature-flag-test-helpers.ts +2 -2
- package/src/__tests__/gemini-image-service.test.ts +13 -0
- package/src/__tests__/helpers/mock-provider.ts +110 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +129 -0
- package/src/__tests__/history-repair-hook.test.ts +1 -0
- package/src/__tests__/identity-intro-cache.test.ts +12 -100
- package/src/__tests__/identity-routes.test.ts +248 -7
- package/src/__tests__/inbound-slack-persistence.test.ts +5 -1
- package/src/__tests__/injector-background-turn.test.ts +2 -8
- package/src/__tests__/injector-chain.test.ts +106 -270
- package/src/__tests__/injector-disk-pressure.test.ts +3 -12
- package/src/__tests__/injector-document-comments.test.ts +2 -2
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +30 -22
- package/src/__tests__/injector-v3-suppression.test.ts +31 -37
- package/src/__tests__/internal-telemetry-routes.test.ts +109 -0
- package/src/__tests__/list-messages-page-latest.test.ts +60 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +20 -0
- package/src/__tests__/llm-usage-store.test.ts +223 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +297 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +103 -35
- package/src/__tests__/native-web-search.test.ts +191 -0
- package/src/__tests__/onboarding-template-contract.test.ts +2 -0
- package/src/__tests__/openai-image-service.test.ts +17 -0
- package/src/__tests__/openai-provider.test.ts +31 -1
- package/src/__tests__/persist-unsendable-image.test.ts +215 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +1 -0
- package/src/__tests__/pipeline-runner.test.ts +29 -39
- package/src/__tests__/pkb-autoinject.test.ts +2 -5
- package/src/__tests__/plugin-bootstrap.test.ts +13 -28
- package/src/__tests__/plugin-registry.test.ts +0 -27
- package/src/__tests__/plugin-types.test.ts +2 -125
- package/src/__tests__/process-message-display-content.test.ts +6 -2
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
- package/src/__tests__/resolve-trust-class.test.ts +4 -4
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +60 -23
- package/src/__tests__/schedule-routes.test.ts +603 -2
- package/src/__tests__/schedule-store.test.ts +41 -0
- package/src/__tests__/schedule-tools.test.ts +35 -0
- package/src/__tests__/server-history-render.test.ts +314 -1
- package/src/__tests__/skillssh-files.test.ts +1 -1
- package/src/__tests__/system-prompt.test.ts +20 -0
- package/src/__tests__/task-scheduler.test.ts +162 -1
- package/src/__tests__/terminal-tools.test.ts +6 -1
- package/src/__tests__/title-generate-hook.test.ts +319 -0
- package/src/__tests__/tool-error-hook.test.ts +278 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +468 -5
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/tool-result-truncate-hook.test.ts +127 -0
- package/src/__tests__/tool-result-truncation.test.ts +0 -2
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +254 -0
- package/src/__tests__/ui-work-result-surface.test.ts +159 -0
- package/src/__tests__/usage-routes.test.ts +285 -1
- package/src/__tests__/user-plugin-loader.test.ts +2 -2
- package/src/__tests__/voice-session-bridge.test.ts +6 -3
- package/src/__tests__/web-search-backend-failure.test.ts +166 -0
- package/src/agent/loop.ts +346 -442
- package/src/api/events/assistant-thinking-delta.ts +33 -0
- package/src/api/events/tool-output-chunk.ts +45 -0
- package/src/api/events/tool-use-preview-start.ts +32 -0
- package/src/api/events/trace-event.ts +69 -0
- package/src/api/index.ts +48 -13
- package/src/api/responses/conversation-message.ts +368 -0
- package/src/avatar/__tests__/avatar-store.test.ts +34 -29
- package/src/cli/commands/__tests__/notifications.test.ts +58 -14
- package/src/cli/commands/notifications.ts +112 -60
- package/src/config/assistant-feature-flags.ts +22 -11
- package/src/config/bundled-skills/app-builder/SKILL.md +3 -20
- package/src/config/bundled-skills/app-builder/references/examples/README.md +17 -0
- package/src/config/bundled-skills/app-builder/references/examples/expense-tracker.md +515 -0
- package/src/config/bundled-skills/app-builder/references/examples/focus-timer.md +342 -0
- package/src/config/bundled-skills/app-builder/references/examples/habit-tracker.md +490 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +1 -1
- package/src/config/bundled-skills/messaging/SKILL.md +0 -7
- package/src/config/feature-flag-cache.ts +3 -3
- package/src/config/feature-flag-registry.json +35 -3
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-v2.ts +8 -0
- package/src/config/schemas/memory-v3.ts +8 -0
- package/src/config/schemas/platform.ts +8 -0
- package/src/config/seed-inference-profiles.ts +2 -2
- package/src/config/skills.ts +13 -0
- package/src/context/compactor.ts +1 -1
- package/src/context/strip-injections.ts +122 -0
- package/src/context/token-estimator.ts +23 -0
- package/src/context/tool-result-truncation.ts +0 -23
- package/src/context/window-manager.ts +3 -6
- package/src/credential-execution/executable-discovery.ts +16 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +6 -0
- package/src/daemon/__tests__/inference-profile-notification.test.ts +153 -0
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +10 -8
- package/src/daemon/assistant-attachments.ts +1 -1
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/context-overflow-reducer.ts +0 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +605 -153
- package/src/daemon/conversation-agent-loop.ts +281 -760
- package/src/daemon/conversation-history.ts +5 -4
- package/src/daemon/conversation-lifecycle.ts +3 -4
- package/src/daemon/conversation-messaging.ts +7 -6
- package/src/daemon/conversation-process.ts +11 -16
- package/src/daemon/conversation-runtime-assembly.ts +130 -347
- package/src/daemon/conversation-slash.ts +6 -25
- package/src/daemon/conversation-surfaces.ts +222 -4
- package/src/daemon/conversation-tool-setup.ts +2 -29
- package/src/daemon/conversation.ts +32 -14
- package/src/daemon/external-plugins-bootstrap.ts +9 -10
- package/src/daemon/handlers/config-a2a.ts +51 -36
- package/src/daemon/handlers/config-slack-channel.ts +20 -14
- package/src/daemon/handlers/config-telegram.ts +16 -2
- package/src/daemon/handlers/shared.ts +156 -84
- package/src/daemon/handlers/skills.ts +39 -10
- package/src/daemon/lifecycle.ts +4 -0
- package/src/daemon/message-types/apps.ts +1 -29
- package/src/daemon/message-types/messages.ts +9 -57
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +136 -3
- package/src/daemon/now-scratchpad.ts +21 -0
- package/src/daemon/orphan-reaper.test.ts +210 -0
- package/src/daemon/orphan-reaper.ts +240 -0
- package/src/daemon/persist-unsendable-image.ts +117 -0
- package/src/daemon/process-message.ts +1 -3
- package/src/daemon/trace-emitter.ts +6 -4
- package/src/daemon/trust-context.ts +19 -0
- package/src/daemon/wake-target-adapter.ts +3 -1
- package/src/home/home-greeting-cache.ts +24 -1
- package/src/ipc/gateway-client.test.ts +2 -2
- package/src/ipc/gateway-client.ts +3 -3
- package/src/media/gemini-image-service.ts +15 -0
- package/src/media/openai-image-service.ts +14 -0
- package/src/media/types.ts +34 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
- package/src/memory/auth-fallback-events-store.ts +94 -0
- package/src/memory/conversation-title-service.ts +65 -41
- package/src/memory/db-init.ts +4 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
- package/src/memory/graph/conversation-graph-memory.ts +65 -0
- package/src/memory/jobs-store.ts +33 -0
- package/src/memory/jobs-worker.ts +31 -4
- package/src/memory/llm-usage-store.ts +224 -50
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
- package/src/memory/migrations/270-schedule-source-conversation.ts +13 -0
- package/src/memory/migrations/271-create-auth-fallback-events.ts +21 -0
- package/src/memory/migrations/index.ts +2 -0
- package/src/memory/pkb/autoinject.ts +61 -0
- package/src/memory/pkb/context.ts +50 -0
- package/src/memory/pkb/types.ts +14 -0
- package/src/memory/schedule-attribution-sql.ts +104 -0
- package/src/memory/schema/infrastructure.ts +16 -0
- package/src/memory/usage-grouped-buckets.ts +6 -1
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -1
- package/src/memory/v2/consolidation-job.ts +1 -1
- package/src/memory/v3/__tests__/health.test.ts +16 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +45 -9
- package/src/memory/v3/__tests__/provider-blocks.test.ts +13 -0
- package/src/memory/v3/__tests__/router.test.ts +101 -29
- package/src/memory/v3/__tests__/selector.test.ts +93 -27
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +23 -5
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/llm-retry.ts +32 -0
- package/src/memory/v3/orchestrate.ts +26 -14
- package/src/memory/v3/provider-blocks.ts +15 -5
- package/src/memory/v3/router.ts +48 -42
- package/src/memory/v3/selector.ts +57 -42
- package/src/memory/v3/shadow-plugin.ts +47 -15
- package/src/memory/v3/types.ts +8 -0
- package/src/notifications/conversation-pairing.ts +8 -15
- package/src/notifications/decision-engine.ts +6 -3
- package/src/notifications/home-feed-side-effect.ts +12 -1
- package/src/permissions/prompter.ts +4 -0
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +8 -1
- package/src/plugin-api/types.ts +151 -1
- package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
- package/src/plugins/defaults/empty-response/register.ts +8 -13
- package/src/plugins/defaults/index.ts +1 -15
- package/src/plugins/defaults/injectors/register.ts +243 -74
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +91 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +216 -0
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +35 -0
- package/src/plugins/defaults/title-generate/hooks/stop.ts +75 -0
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/title-generate/package.json +1 -1
- package/src/plugins/defaults/title-generate/register.ts +18 -18
- package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +118 -0
- package/src/plugins/defaults/tool-error/package.json +1 -1
- package/src/plugins/defaults/tool-error/register.ts +9 -21
- package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +10 -21
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +37 -18
- package/src/plugins/pipeline.ts +6 -18
- package/src/plugins/registry.ts +8 -25
- package/src/plugins/types.ts +43 -474
- package/src/proactive-artifact/aux-message-injector.ts +3 -3
- package/src/proactive-artifact/job.test.ts +7 -12
- package/src/prompts/__tests__/system-prompt.test.ts +36 -0
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +62 -0
- package/src/prompts/templates/BOOTSTRAP.md +2 -2
- package/src/prompts/templates/system-sections.ts +15 -0
- package/src/providers/anthropic/client.ts +37 -29
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -0
- package/src/providers/openai/chat-completions-provider.ts +44 -0
- package/src/providers/openrouter/client.ts +1 -0
- package/src/providers/placeholder-sentinels.ts +35 -0
- package/src/runtime/__tests__/agent-wake.test.ts +5 -1
- package/src/runtime/agent-wake.ts +2 -2
- package/src/runtime/assistant-event-hub.ts +36 -6
- package/src/runtime/{conversation-stream-state.ts → assistant-stream-state.ts} +132 -58
- package/src/runtime/http-router.ts +16 -21
- package/src/runtime/http-types.ts +16 -70
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
- package/src/runtime/routes/app-management-routes.ts +6 -117
- package/src/runtime/routes/app-routes.ts +13 -15
- package/src/runtime/routes/attachment-routes.ts +26 -15
- package/src/runtime/routes/avatar-routes.ts +26 -0
- package/src/runtime/routes/btw-routes.ts +29 -23
- package/src/runtime/routes/consolidation-routes.ts +120 -20
- package/src/runtime/routes/conversation-query-routes.ts +2 -0
- package/src/runtime/routes/conversation-routes.ts +358 -184
- package/src/runtime/routes/documents-routes.ts +4 -0
- package/src/runtime/routes/domain-routes.ts +51 -37
- package/src/runtime/routes/epoch-millis-range.ts +34 -0
- package/src/runtime/routes/events-routes.ts +28 -34
- package/src/runtime/routes/gateway-log-routes.ts +26 -4
- package/src/runtime/routes/heartbeat-routes.ts +32 -12
- package/src/runtime/routes/identity-intro-cache.ts +11 -34
- package/src/runtime/routes/identity-routes.ts +208 -17
- package/src/runtime/routes/image-generation-routes.ts +40 -2
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/integrations/a2a.ts +12 -10
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
- package/src/runtime/routes/integrations/slack/channel.ts +4 -0
- package/src/runtime/routes/integrations/slack/share.ts +27 -6
- package/src/runtime/routes/integrations/telegram.ts +6 -0
- package/src/runtime/routes/integrations/twilio.ts +42 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +88 -0
- package/src/runtime/routes/log-export-routes.ts +8 -0
- package/src/runtime/routes/memory-v2-routes.ts +15 -8
- package/src/runtime/routes/memory-v3-routes.ts +50 -28
- package/src/runtime/routes/oauth-apps.ts +66 -12
- package/src/runtime/routes/oauth-providers.ts +44 -5
- package/src/runtime/routes/platform-routes.ts +81 -5
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +6 -4
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/schedule-routes.ts +152 -42
- package/src/runtime/routes/secret-routes.ts +14 -2
- package/src/runtime/routes/skills-routes.ts +43 -14
- package/src/runtime/routes/tool-call-confirmation-enrichment.test.ts +161 -0
- package/src/runtime/routes/tool-call-confirmation-enrichment.ts +107 -0
- package/src/runtime/routes/trust-rules-routes.ts +26 -2
- package/src/runtime/routes/tts-routes.ts +35 -0
- package/src/runtime/routes/types.ts +66 -8
- package/src/runtime/routes/usage-routes.ts +47 -39
- package/src/runtime/routes/webhook-routes.ts +41 -2
- package/src/runtime/routes/workspace-routes.ts +4 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +6 -0
- package/src/runtime/services/analyze-conversation.ts +2 -2
- package/src/schedule/schedule-store.ts +20 -1
- package/src/schedule/schedule-usage-store.ts +83 -0
- package/src/schedule/scheduler.ts +12 -5
- package/src/skills/catalog-files.ts +2 -2
- package/src/skills/catalog-install.ts +3 -0
- package/src/skills/categories-cache.ts +118 -0
- package/src/skills/clawhub-files.ts +1 -2
- package/src/skills/skillssh-files.ts +1 -2
- package/src/telemetry/types.ts +29 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +112 -3
- package/src/telemetry/usage-telemetry-reporter.ts +57 -2
- package/src/tools/executor.ts +1 -53
- package/src/tools/network/__tests__/web-search-metadata.test.ts +7 -1
- package/src/tools/network/__tests__/web-search.test.ts +11 -3
- package/src/tools/network/web-search-error.test.ts +248 -0
- package/src/tools/network/web-search-error.ts +267 -0
- package/src/tools/network/web-search.ts +207 -48
- package/src/tools/schedule/create.ts +2 -0
- package/src/tools/terminal/safe-env.ts +10 -1
- package/src/tools/ui-surface/definitions.ts +9 -1
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
- package/src/tts/provider-catalog.ts +76 -1
- package/src/util/mutex.ts +47 -0
- package/src/workspace/git-service.ts +1 -42
- package/src/workspace/migrations/095-bump-heartbeat-interval-30m-to-60m.ts +51 -0
- package/src/workspace/migrations/096-reduce-quality-profile-effort.ts +72 -0
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +93 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +0 -44
- package/src/__tests__/empty-response-pipeline.test.ts +0 -423
- package/src/__tests__/llm-call-pipeline.test.ts +0 -287
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -418
- package/src/__tests__/persistence-pipeline.test.ts +0 -503
- package/src/__tests__/title-generate-pipeline.test.ts +0 -211
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -479
- package/src/__tests__/tool-error-pipeline.test.ts +0 -241
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -417
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -341
- package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
- package/src/gallery/default-gallery.ts +0 -1359
- package/src/gallery/gallery-manifest.ts +0 -28
- package/src/home/feature-gate.ts +0 -22
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +0 -22
- package/src/plugins/defaults/empty-response/terminal.ts +0 -106
- package/src/plugins/defaults/injectors/package.json +0 -15
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +0 -17
- package/src/plugins/defaults/llm-call/package.json +0 -15
- package/src/plugins/defaults/llm-call/register.ts +0 -45
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +0 -17
- package/src/plugins/defaults/memory-retrieval/package.json +0 -15
- package/src/plugins/defaults/memory-retrieval/register.ts +0 -181
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +0 -19
- package/src/plugins/defaults/persistence/package.json +0 -15
- package/src/plugins/defaults/persistence/register.ts +0 -38
- package/src/plugins/defaults/persistence/terminal.ts +0 -83
- package/src/plugins/defaults/title-generate/terminal.ts +0 -31
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +0 -23
- package/src/plugins/defaults/token-estimate/package.json +0 -15
- package/src/plugins/defaults/token-estimate/register.ts +0 -34
- package/src/plugins/defaults/token-estimate/terminal.ts +0 -40
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +0 -21
- package/src/plugins/defaults/tool-error/terminal.ts +0 -47
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +0 -23
- package/src/plugins/defaults/tool-execute/package.json +0 -15
- package/src/plugins/defaults/tool-execute/register.ts +0 -49
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +0 -23
- package/src/plugins/defaults/tool-result-truncate/types.ts +0 -22
- package/src/skills/category-inference.ts +0 -111
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `titleGenerate` behavior: kicks off conversation-title generation.
|
|
3
|
-
*
|
|
4
|
-
* This module is side-effect free: importing it does not register any plugin.
|
|
5
|
-
*
|
|
6
|
-
* Delegates to {@link queueGenerateConversationTitle}, which schedules title
|
|
7
|
-
* generation as fire-and-forget background work and falls back to a
|
|
8
|
-
* deterministic placeholder on failure.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { queueGenerateConversationTitle } from "../../../memory/conversation-title-service.js";
|
|
12
|
-
import type { TitleArgs, TitleResult } from "../../types.js";
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Invoke the title-generation service with the provided arguments. Exported
|
|
16
|
-
* for tests that want to exercise the default directly.
|
|
17
|
-
*
|
|
18
|
-
* Returns an empty result — the service is fire-and-forget and surfaces its
|
|
19
|
-
* output through `onTitleUpdated`.
|
|
20
|
-
*/
|
|
21
|
-
export async function defaultTitleGenerateTerminal(
|
|
22
|
-
args: TitleArgs,
|
|
23
|
-
): Promise<TitleResult> {
|
|
24
|
-
queueGenerateConversationTitle({
|
|
25
|
-
conversationId: args.conversationId,
|
|
26
|
-
provider: args.provider,
|
|
27
|
-
userMessage: args.userMessage,
|
|
28
|
-
onTitleUpdated: args.onTitleUpdated,
|
|
29
|
-
});
|
|
30
|
-
return {};
|
|
31
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
EstimateArgs,
|
|
3
|
-
EstimateResult,
|
|
4
|
-
Middleware,
|
|
5
|
-
} from "../../../types.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Passthrough middleware for the `tokenEstimate` pipeline. Forwards to
|
|
9
|
-
* `next(args)` unchanged; the actual estimate lives in the terminal handler
|
|
10
|
-
* (`../terminal.ts`), wired in at the `runPipeline` call sites in
|
|
11
|
-
* `daemon/conversation-agent-loop.ts`.
|
|
12
|
-
*
|
|
13
|
-
* Defaults register at the OUTERMOST onion position, so deciding here without
|
|
14
|
-
* calling `next` would shadow every later-registered plugin. The passthrough
|
|
15
|
-
* lets user middleware that wraps the default (e.g. a doubler, a
|
|
16
|
-
* provider-native `countTokens` override) participate normally.
|
|
17
|
-
*/
|
|
18
|
-
const passthrough: Middleware<EstimateArgs, EstimateResult> = async (
|
|
19
|
-
args,
|
|
20
|
-
next,
|
|
21
|
-
) => next(args);
|
|
22
|
-
|
|
23
|
-
export default passthrough;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "default-token-estimate",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "First-party default plugin wrapping the assistant's built-in token-estimate pipeline with a passthrough implementation.",
|
|
5
|
-
"private": true,
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"main": "./register.ts",
|
|
9
|
-
"engines": {
|
|
10
|
-
"node": ">=20.12.0"
|
|
11
|
-
},
|
|
12
|
-
"peerDependencies": {
|
|
13
|
-
"@vellumai/plugin-api": "^0.8.0"
|
|
14
|
-
}
|
|
15
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `tokenEstimate` plugin.
|
|
3
|
-
*
|
|
4
|
-
* The plugin's middleware is a passthrough — it calls `next(args)` and returns
|
|
5
|
-
* the result unchanged. The actual estimate lives in the terminal handler in
|
|
6
|
-
* `./terminal.ts`, which is wired in as the pipeline's `terminal` argument by
|
|
7
|
-
* `runPipeline` call sites in `daemon/conversation-agent-loop.ts`. This
|
|
8
|
-
* separation matters: the default plugin is registered before any user plugin
|
|
9
|
-
* (defaults load first in `bootstrapPlugins()`), which puts it at the
|
|
10
|
-
* OUTERMOST position of the onion chain. If the default middleware were to
|
|
11
|
-
* invoke the terminal directly without calling `next`, it would shadow every
|
|
12
|
-
* later-registered plugin. The passthrough lets user middleware that wraps the
|
|
13
|
-
* default (e.g. a doubler, a provider-native `countTokens` override)
|
|
14
|
-
* participate normally.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { type Plugin } from "../../types.js";
|
|
18
|
-
import tokenEstimate from "./middlewares/tokenEstimate.js";
|
|
19
|
-
import pkg from "./package.json" with { type: "json" };
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Default `tokenEstimate` plugin. Registered by
|
|
23
|
-
* {@link bootstrapPlugins} on daemon startup so the pipeline always has a
|
|
24
|
-
* terminal handler even when no other plugin contributes one.
|
|
25
|
-
*/
|
|
26
|
-
export const defaultTokenEstimatePlugin: Plugin = {
|
|
27
|
-
manifest: {
|
|
28
|
-
name: pkg.name,
|
|
29
|
-
version: pkg.version,
|
|
30
|
-
},
|
|
31
|
-
middleware: {
|
|
32
|
-
tokenEstimate,
|
|
33
|
-
},
|
|
34
|
-
};
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `tokenEstimate` behavior: estimates the prompt token count used by
|
|
3
|
-
* the overflow gate.
|
|
4
|
-
*
|
|
5
|
-
* This module is side-effect free: importing it does not register any plugin.
|
|
6
|
-
*
|
|
7
|
-
* Delegates to
|
|
8
|
-
* {@link estimatePromptTokens}, which applies the EWMA calibration correction
|
|
9
|
-
* recorded from past provider responses. Preflight + mid-loop checks must use
|
|
10
|
-
* the calibrated estimate — the calibrated value keeps the overflow gate
|
|
11
|
-
* consistent with the convergence path in the reducer. The pre-send
|
|
12
|
-
* calibration capture in `agent/loop.ts` still uses `estimatePromptTokensRaw`
|
|
13
|
-
* on purpose — the calibrator must learn against the raw estimate so the EWMA
|
|
14
|
-
* converges against provider ground truth rather than chasing its own
|
|
15
|
-
* corrected output. This path produces the user-facing estimate; calibration
|
|
16
|
-
* capture stays separate.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import {
|
|
20
|
-
estimatePromptTokens,
|
|
21
|
-
estimateToolsTokens,
|
|
22
|
-
} from "../../../context/token-estimator.js";
|
|
23
|
-
import type { EstimateArgs, EstimateResult } from "../../types.js";
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Compute the tool token budget from `args.tools` and delegate to
|
|
27
|
-
* {@link estimatePromptTokens} with the canonical provider key, applying the
|
|
28
|
-
* EWMA calibration correction. Exported so the agent loop can call it directly
|
|
29
|
-
* and tests can verify the default behavior.
|
|
30
|
-
*/
|
|
31
|
-
export const defaultTokenEstimateTerminal = async (
|
|
32
|
-
args: EstimateArgs,
|
|
33
|
-
): Promise<EstimateResult> => {
|
|
34
|
-
const toolTokenBudget =
|
|
35
|
-
args.tools.length > 0 ? estimateToolsTokens(args.tools) : 0;
|
|
36
|
-
return estimatePromptTokens(args.history, args.systemPrompt, {
|
|
37
|
-
providerName: args.providerName,
|
|
38
|
-
toolTokenBudget,
|
|
39
|
-
});
|
|
40
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
Middleware,
|
|
3
|
-
ToolErrorArgs,
|
|
4
|
-
ToolErrorDecision,
|
|
5
|
-
} from "../../../types.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Passthrough middleware for the `toolError` pipeline. Forwards to `next(args)`
|
|
9
|
-
* so later-registered user plugins still participate in the onion chain; the
|
|
10
|
-
* actual nudge-decision logic lives in the terminal handler (`../terminal.ts`),
|
|
11
|
-
* wired in at the `runPipeline` call site in `agent/loop.ts`.
|
|
12
|
-
*
|
|
13
|
-
* Named explicitly so the pipeline's structured log record carries
|
|
14
|
-
* `"defaultToolErrorMiddleware"` in `chain` instead of an anonymous entry.
|
|
15
|
-
*/
|
|
16
|
-
const defaultToolErrorMiddleware: Middleware<ToolErrorArgs, ToolErrorDecision> =
|
|
17
|
-
async function defaultToolErrorMiddleware(args, next) {
|
|
18
|
-
return next(args);
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
export default defaultToolErrorMiddleware;
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `toolError` behavior: decides whether to nudge the LLM after a tool
|
|
3
|
-
* call fails.
|
|
4
|
-
*
|
|
5
|
-
* This module is side-effect free: importing it does not register any plugin.
|
|
6
|
-
*
|
|
7
|
-
* The canonical nudge decision: when the current turn produced at least one
|
|
8
|
-
* failed tool result, append a system-notice block to the tool results that
|
|
9
|
-
* coaches the LLM to either retry with corrected parameters (for recoverable
|
|
10
|
-
* errors) or report the failure to the user (for unrecoverable ones). Once
|
|
11
|
-
* the consecutive-error-turn counter exceeds the caller-supplied cap, the
|
|
12
|
-
* nudge is skipped — the error is likely not something the LLM can fix on
|
|
13
|
-
* its own and continuing to nudge only burns tokens.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import type { ToolErrorArgs, ToolErrorDecision } from "../../types.js";
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Canonical nudge text. Kept as a module-level constant so tests and future
|
|
20
|
-
* plugins can match it without duplicating the string.
|
|
21
|
-
*/
|
|
22
|
-
export const DEFAULT_TOOL_ERROR_NUDGE_TEXT =
|
|
23
|
-
"<system_notice>One or more tool calls returned an error. If the error looks recoverable (e.g. missing or invalid parameters), fix the parameters and retry. If the error is clearly unrecoverable (e.g. a service is down, a resource does not exist, or a permission is permanently denied), report it to the user.</system_notice>";
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Nudge iff the current turn had an error AND the consecutive-error counter is
|
|
27
|
-
* within the cap. Once the cap is breached the caller should stop appending
|
|
28
|
-
* the nudge (the error is likely unrecoverable and the LLM already had
|
|
29
|
-
* multiple attempts to correct it).
|
|
30
|
-
*
|
|
31
|
-
* Exported so the agent loop can call it directly and tests can verify the
|
|
32
|
-
* decision logic.
|
|
33
|
-
*/
|
|
34
|
-
export const defaultToolErrorTerminal = async (
|
|
35
|
-
args: ToolErrorArgs,
|
|
36
|
-
): Promise<ToolErrorDecision> => {
|
|
37
|
-
if (
|
|
38
|
-
args.hasToolError &&
|
|
39
|
-
args.consecutiveErrorTurns <= args.maxConsecutiveErrorNudges
|
|
40
|
-
) {
|
|
41
|
-
return {
|
|
42
|
-
action: "nudge",
|
|
43
|
-
nudgeText: DEFAULT_TOOL_ERROR_NUDGE_TEXT,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
return { action: "skip" };
|
|
47
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
Middleware,
|
|
3
|
-
ToolExecuteArgs,
|
|
4
|
-
ToolExecuteResult,
|
|
5
|
-
} from "../../../types.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Passthrough middleware for the `toolExecute` pipeline. Forwards to
|
|
9
|
-
* `next(args)` and returns the downstream result unchanged. The original
|
|
10
|
-
* `ToolExecutor.execute` behavior runs in the terminal bound at the call site,
|
|
11
|
-
* so this default makes the pipeline shape explicit without introducing any
|
|
12
|
-
* behavior of its own: the chain `[defaultMiddleware] → terminal` composes
|
|
13
|
-
* identically to `[] → terminal`.
|
|
14
|
-
*
|
|
15
|
-
* Named so the pipeline runner's `chain` log entry reads `defaultToolExecute`
|
|
16
|
-
* instead of `anonymous`.
|
|
17
|
-
*/
|
|
18
|
-
const defaultToolExecute: Middleware<ToolExecuteArgs, ToolExecuteResult> =
|
|
19
|
-
async function defaultToolExecute(args, next) {
|
|
20
|
-
return next(args);
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export default defaultToolExecute;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "default-tool-execute",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "First-party default plugin wrapping the assistant's built-in tool-execute pipeline with a passthrough implementation.",
|
|
5
|
-
"private": true,
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"main": "./register.ts",
|
|
9
|
-
"engines": {
|
|
10
|
-
"node": ">=20.12.0"
|
|
11
|
-
},
|
|
12
|
-
"peerDependencies": {
|
|
13
|
-
"@vellumai/plugin-api": "^0.8.0"
|
|
14
|
-
}
|
|
15
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default `toolExecute` plugin — a no-argument passthrough that preserves
|
|
3
|
-
* the behavior `ToolExecutor.execute` had before the pipeline wrapper was
|
|
4
|
-
* introduced.
|
|
5
|
-
*
|
|
6
|
-
* Design
|
|
7
|
-
* ------
|
|
8
|
-
* The public {@link ToolExecutor.execute} method invokes
|
|
9
|
-
* {@link runPipeline} with the terminal bound to an internal
|
|
10
|
-
* `executeInternal` method (the original execute body, refactored to avoid
|
|
11
|
-
* recursion). Because the terminal IS the original behavior, the default
|
|
12
|
-
* plugin's `middleware.toolExecute` is a thin passthrough: it forwards to
|
|
13
|
-
* `next(args)` and returns the downstream result unchanged.
|
|
14
|
-
*
|
|
15
|
-
* This matches the convention set by PR 15 (`default-llm-call.ts`) for
|
|
16
|
-
* `llmCall` — the default plugin makes the pipeline shape explicit without
|
|
17
|
-
* introducing any behavior of its own. When no third-party plugins are
|
|
18
|
-
* registered the chain is `[defaultMiddleware] → terminal`, which composes
|
|
19
|
-
* identically to `[] → terminal`, so the shell-integration tests (which
|
|
20
|
-
* never register the default) stay unchanged-green.
|
|
21
|
-
*
|
|
22
|
-
* Why a dedicated plugin at all?
|
|
23
|
-
* ------------------------------
|
|
24
|
-
* - It signals publicly that `toolExecute` is a supported pipeline slot with
|
|
25
|
-
* a concrete contract.
|
|
26
|
-
* - Registration order determines onion order. If a third-party plugin
|
|
27
|
-
* wraps `toolExecute`, the runtime should boot with the default present
|
|
28
|
-
* (as the innermost passthrough) so the chain visibly contains a
|
|
29
|
-
* canonical terminator regardless of which third parties load.
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
import { type Plugin } from "../../types.js";
|
|
33
|
-
import defaultToolExecute from "./middlewares/toolExecute.js";
|
|
34
|
-
import pkg from "./package.json" with { type: "json" };
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* The default `toolExecute` plugin. Exported as a module constant that the
|
|
38
|
-
* defaults aggregator registers centrally; tests may register it explicitly to
|
|
39
|
-
* cover the on-by-default execution path.
|
|
40
|
-
*/
|
|
41
|
-
export const defaultToolExecutePlugin: Plugin = {
|
|
42
|
-
manifest: {
|
|
43
|
-
name: pkg.name,
|
|
44
|
-
version: pkg.version,
|
|
45
|
-
},
|
|
46
|
-
middleware: {
|
|
47
|
-
toolExecute: defaultToolExecute,
|
|
48
|
-
},
|
|
49
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { Middleware } from "../../../types.js";
|
|
2
|
-
import type {
|
|
3
|
-
ToolResultTruncateArgs,
|
|
4
|
-
ToolResultTruncateResult,
|
|
5
|
-
} from "../types.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Passthrough middleware for the `toolResultTruncate` pipeline. Forwards to
|
|
9
|
-
* `next(args)` unchanged; the actual truncation lives in the terminal handler
|
|
10
|
-
* (`../terminal.ts`), wired in at the `runPipeline` call site in
|
|
11
|
-
* `agent/loop.ts`.
|
|
12
|
-
*
|
|
13
|
-
* Defaults register at the OUTERMOST onion position, so deciding here without
|
|
14
|
-
* calling `next` would shadow every later-registered plugin (including
|
|
15
|
-
* hot-reloaded ones). Routing through `next(args)` lets user middleware
|
|
16
|
-
* participate normally.
|
|
17
|
-
*/
|
|
18
|
-
const passthrough: Middleware<
|
|
19
|
-
ToolResultTruncateArgs,
|
|
20
|
-
ToolResultTruncateResult
|
|
21
|
-
> = async (args, next) => next(args);
|
|
22
|
-
|
|
23
|
-
export default passthrough;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Argument and result shapes for the default `toolResultTruncate` behavior.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Input to tool-result truncation: the raw tool-result text and the character
|
|
7
|
-
* budget the caller computed from the context-window share.
|
|
8
|
-
*/
|
|
9
|
-
export type ToolResultTruncateArgs = {
|
|
10
|
-
readonly content: string;
|
|
11
|
-
readonly maxChars: number;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Output of tool-result truncation: the (possibly truncated) content and a
|
|
16
|
-
* boolean indicating whether the input was actually shortened. Callers use
|
|
17
|
-
* `truncated` for telemetry / warnings.
|
|
18
|
-
*/
|
|
19
|
-
export type ToolResultTruncateResult = {
|
|
20
|
-
readonly content: string;
|
|
21
|
-
readonly truncated: boolean;
|
|
22
|
-
};
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skill category inference — ports the Swift `inferCategory` logic from
|
|
3
|
-
* `ConstellationView.swift` to TypeScript for server-side use.
|
|
4
|
-
*
|
|
5
|
-
* Pure function with no side effects or external dependencies.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export type SkillCategory =
|
|
9
|
-
| "communication"
|
|
10
|
-
| "productivity"
|
|
11
|
-
| "development"
|
|
12
|
-
| "media"
|
|
13
|
-
| "automation"
|
|
14
|
-
| "webSocial"
|
|
15
|
-
| "knowledge"
|
|
16
|
-
| "integration";
|
|
17
|
-
|
|
18
|
-
const CATEGORY_KEYWORDS: [SkillCategory, string[]][] = [
|
|
19
|
-
[
|
|
20
|
-
"communication",
|
|
21
|
-
[
|
|
22
|
-
"email",
|
|
23
|
-
"message",
|
|
24
|
-
"messaging",
|
|
25
|
-
"chat",
|
|
26
|
-
"phone",
|
|
27
|
-
"phone call",
|
|
28
|
-
"voice call",
|
|
29
|
-
"video call",
|
|
30
|
-
"contact",
|
|
31
|
-
"notification",
|
|
32
|
-
"followup",
|
|
33
|
-
"slack",
|
|
34
|
-
"telegram",
|
|
35
|
-
],
|
|
36
|
-
],
|
|
37
|
-
[
|
|
38
|
-
"productivity",
|
|
39
|
-
[
|
|
40
|
-
"task",
|
|
41
|
-
"calendar",
|
|
42
|
-
"reminder",
|
|
43
|
-
"schedule",
|
|
44
|
-
"document",
|
|
45
|
-
"playbook",
|
|
46
|
-
"notion",
|
|
47
|
-
],
|
|
48
|
-
],
|
|
49
|
-
[
|
|
50
|
-
"development",
|
|
51
|
-
[
|
|
52
|
-
"code",
|
|
53
|
-
"app builder",
|
|
54
|
-
"github",
|
|
55
|
-
"developer",
|
|
56
|
-
"programming",
|
|
57
|
-
"debug",
|
|
58
|
-
"typescript",
|
|
59
|
-
"frontend",
|
|
60
|
-
"subagent",
|
|
61
|
-
"api mapping",
|
|
62
|
-
"cli discovery",
|
|
63
|
-
],
|
|
64
|
-
],
|
|
65
|
-
["automation", ["browser", "computer use", "macos", "watcher", "automat"]],
|
|
66
|
-
[
|
|
67
|
-
"media",
|
|
68
|
-
["image", "screen", "media", "transcri", "video", "audio", "recording"],
|
|
69
|
-
],
|
|
70
|
-
[
|
|
71
|
-
"webSocial",
|
|
72
|
-
[
|
|
73
|
-
"x.com",
|
|
74
|
-
"twitter",
|
|
75
|
-
"public ingress",
|
|
76
|
-
"influencer",
|
|
77
|
-
"doordash",
|
|
78
|
-
"amazon",
|
|
79
|
-
"restaurant",
|
|
80
|
-
],
|
|
81
|
-
],
|
|
82
|
-
[
|
|
83
|
-
"knowledge",
|
|
84
|
-
[
|
|
85
|
-
"knowledge",
|
|
86
|
-
"weather",
|
|
87
|
-
"start the day",
|
|
88
|
-
"skills catalog",
|
|
89
|
-
"self upgrade",
|
|
90
|
-
"briefing",
|
|
91
|
-
],
|
|
92
|
-
],
|
|
93
|
-
["integration", ["oauth", "setup", "configure", "connect", "webhook"]],
|
|
94
|
-
];
|
|
95
|
-
|
|
96
|
-
export function inferCategory(
|
|
97
|
-
name: string,
|
|
98
|
-
description: string,
|
|
99
|
-
): SkillCategory {
|
|
100
|
-
const combined = `${name} ${description}`.toLowerCase();
|
|
101
|
-
|
|
102
|
-
for (const [category, keywords] of CATEGORY_KEYWORDS) {
|
|
103
|
-
for (const keyword of keywords) {
|
|
104
|
-
if (combined.includes(keyword)) {
|
|
105
|
-
return category;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return "knowledge";
|
|
111
|
-
}
|