@vellumai/assistant 0.8.10 → 0.8.11-staging.1
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/bun.lock +62 -1
- package/docs/workspace-tools.md +196 -0
- package/examples/plugins/echo/README.md +3 -3
- package/knip.json +1 -0
- package/openapi.yaml +460 -128
- package/package.json +2 -1
- package/scripts/build-plugin-api.ts +299 -0
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +7 -0
- package/src/__tests__/agent-loop-compaction-events.test.ts +197 -0
- package/src/__tests__/agent-loop-exit-reason.test.ts +93 -96
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +2 -0
- package/src/__tests__/agent-loop-output-hooks.test.ts +274 -1
- package/src/__tests__/agent-loop-override-profile.test.ts +3 -0
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +4 -0
- package/src/__tests__/agent-loop-thinking.test.ts +4 -0
- package/src/__tests__/agent-loop.test.ts +578 -5
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -1
- package/src/__tests__/approval-cascade.test.ts +1 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
- package/src/__tests__/btw-routes.test.ts +0 -1
- package/src/__tests__/build-persisted-content.test.ts +75 -1
- package/src/__tests__/catalog-install-normalize.test.ts +141 -0
- package/src/__tests__/ces-startup-timeout.test.ts +60 -0
- package/src/__tests__/compaction-events.test.ts +1 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +2 -46
- package/src/__tests__/context-overflow-reducer.test.ts +264 -124
- package/src/__tests__/context-window-manager-overflow-rung.test.ts +351 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +13 -5
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +284 -455
- package/src/__tests__/conversation-agent-loop.test.ts +131 -551
- package/src/__tests__/conversation-app-control-instantiation.test.ts +13 -0
- package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
- package/src/__tests__/conversation-fork-crud.test.ts +259 -0
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-lifecycle.test.ts +257 -1
- package/src/__tests__/conversation-process-callsite.test.ts +1 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +38 -377
- package/src/__tests__/conversation-queue.test.ts +1 -39
- package/src/__tests__/conversation-runtime-assembly.test.ts +119 -8
- package/src/__tests__/conversation-skill-tools.test.ts +491 -5
- package/src/__tests__/conversation-slash-queue.test.ts +1 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -0
- package/src/__tests__/conversation-speed-override.test.ts +1 -0
- package/src/__tests__/conversation-store.test.ts +74 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +4 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +323 -0
- package/src/__tests__/conversation-tool-setup-tools-disabled.test.ts +34 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -0
- package/src/__tests__/corrected-target.test.ts +93 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +3 -5
- package/src/__tests__/credential-execution-tools.test.ts +23 -11
- package/src/__tests__/credential-security-invariants.test.ts +6 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +80 -0
- package/src/__tests__/device-id.test.ts +70 -1
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +6 -40
- package/src/__tests__/empty-response-hook.test.ts +242 -66
- package/src/__tests__/external-plugin-loader.test.ts +0 -31
- package/src/__tests__/get-skill-detail-audit.test.ts +43 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +91 -0
- package/src/__tests__/history-repair-hook.test.ts +228 -3
- package/src/__tests__/host-app-control-proxy.test.ts +45 -0
- package/src/__tests__/host-browser-proxy.test.ts +254 -9
- package/src/__tests__/identity-routes.test.ts +1 -0
- package/src/__tests__/image-recovery-hook.test.ts +387 -0
- package/src/__tests__/injector-chain.test.ts +5 -4
- package/src/__tests__/injector-v3-suppression.test.ts +373 -47
- package/src/__tests__/intent-routing.test.ts +7 -0
- package/src/__tests__/memory-retrieval-hook.test.ts +117 -15
- package/src/__tests__/notification-decision-strategy.test.ts +3 -3
- package/src/__tests__/oauth-store.test.ts +0 -85
- package/src/__tests__/{context-overflow-policy.test.ts → overflow-policy.test.ts} +1 -1
- package/src/__tests__/parallel-tool.benchmark.test.ts +4 -0
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +29 -9
- package/src/__tests__/persist-unsendable-image.test.ts +4 -4
- package/src/__tests__/persistence-secret-redaction.test.ts +78 -0
- package/src/__tests__/plugin-bootstrap.test.ts +82 -73
- package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
- package/src/__tests__/plugin-types.test.ts +0 -8
- package/src/__tests__/provider-catalog-visibility.test.ts +1 -9
- package/src/__tests__/prune-old-conversations-job.test.ts +99 -0
- package/src/__tests__/registry.test.ts +240 -1
- package/src/__tests__/require-fresh-approval.test.ts +3 -0
- package/src/__tests__/schedule-routes.test.ts +116 -1
- package/src/__tests__/schedule-store.test.ts +28 -0
- package/src/__tests__/schedule-tools.test.ts +94 -1
- package/src/__tests__/server-history-render.test.ts +39 -0
- package/src/__tests__/skill-projection-feature-flag.test.ts +13 -0
- package/src/__tests__/skill-projection.benchmark.test.ts +25 -7
- package/src/__tests__/skills.test.ts +202 -0
- package/src/__tests__/slim-skill-category.test.ts +195 -0
- package/src/__tests__/strip-memory-injections.test.ts +33 -39
- package/src/__tests__/test-support/tool-invocation-seed.ts +79 -0
- package/src/__tests__/title-generate-hook.test.ts +9 -7
- package/src/__tests__/tool-audit-listener.test.ts +264 -1
- package/src/__tests__/tool-error-hook.test.ts +4 -3
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +273 -0
- package/src/__tests__/tool-result-truncate-hook.test.ts +1 -0
- package/src/__tests__/tool-start-timestamp.test.ts +218 -0
- package/src/__tests__/tools-get-route.test.ts +202 -0
- package/src/__tests__/workspace-tool-loader.test.ts +319 -0
- package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
- package/src/agent/loop.ts +569 -319
- package/src/api/events/tool-result.ts +9 -0
- package/src/api/events/tool-use-start.ts +7 -0
- package/src/api/index.ts +10 -0
- package/src/api/responses/conversation-message.ts +135 -27
- package/src/api/responses/memory-v3-selection-log.ts +4 -4
- package/src/approvals/guardian-request-resolvers.ts +26 -0
- package/src/browser-session/backends/host-bridge.ts +29 -0
- package/src/browser-session/index.ts +1 -0
- package/src/browser-session/types.ts +5 -1
- package/src/cli/commands/__tests__/schedules.test.ts +62 -4
- package/src/cli/commands/__tests__/skills.test.ts +53 -0
- package/src/cli/commands/channel-verification-sessions.ts +6 -6
- package/src/cli/commands/inference-providers.ts +0 -8
- package/src/cli/commands/plugins.ts +2 -2
- package/src/cli/commands/schedules.ts +27 -4
- package/src/cli/commands/skills.ts +187 -146
- package/src/cli/commands/tools.ts +106 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +256 -328
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +6 -2
- package/src/cli/lib/__tests__/plugin-details.test.ts +10 -16
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +2 -2
- package/src/cli/lib/__tests__/search-plugins.test.ts +145 -240
- package/src/cli/lib/install-from-github.ts +187 -117
- package/src/cli/lib/plugin-catalog-cache.ts +9 -9
- package/src/cli/lib/plugin-details.ts +38 -68
- package/src/cli/lib/plugin-marketplace.ts +42 -14
- package/src/cli/lib/search-plugins.ts +29 -129
- package/src/cli/program.ts +2 -0
- package/src/config/bundled-skills/acp/SKILL.md +1 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +1 -0
- package/src/config/bundled-skills/app-control/SKILL.md +1 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +1 -0
- package/src/config/bundled-skills/contacts/SKILL.md +1 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +1 -0
- package/src/config/bundled-skills/followups/SKILL.md +1 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +1 -0
- package/src/config/bundled-skills/media-processing/SKILL.md +1 -0
- package/src/config/bundled-skills/messaging/SKILL.md +1 -0
- package/src/config/bundled-skills/phone-calls/SKILL.md +1 -0
- package/src/config/bundled-skills/playbooks/SKILL.md +1 -0
- package/src/config/bundled-skills/schedule/SKILL.md +1 -0
- package/src/config/bundled-skills/schedule/TOOLS.json +11 -3
- package/src/config/bundled-skills/sequences/SKILL.md +1 -0
- package/src/config/bundled-skills/settings/SKILL.md +1 -0
- package/src/config/bundled-skills/skill-management/SKILL.md +101 -1
- package/src/config/bundled-skills/subagent/SKILL.md +1 -0
- package/src/config/bundled-skills/transcribe/SKILL.md +1 -0
- package/src/config/env-registry.ts +23 -0
- package/src/config/feature-flag-registry.json +17 -81
- package/src/config/loader.ts +5 -22
- package/src/config/schema.ts +2 -0
- package/src/config/schemas/__tests__/compaction-logs.test.ts +56 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +0 -1
- package/src/config/schemas/__tests__/memory-v3.test.ts +61 -1
- package/src/config/schemas/compaction-logs.ts +79 -0
- package/src/config/schemas/memory-v2.ts +0 -8
- package/src/config/schemas/memory-v3.ts +104 -33
- package/src/config/seed-inference-profiles.ts +1 -1
- package/src/config/skills.ts +117 -47
- package/src/context/compactor.ts +11 -0
- package/src/context/strip-injections.ts +38 -4
- package/src/credential-execution/feature-gates.ts +0 -21
- package/src/credential-execution/startup-timeout.ts +32 -4
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +18 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +140 -91
- package/src/daemon/conversation-agent-loop.ts +123 -658
- package/src/daemon/conversation-error.ts +6 -33
- package/src/daemon/conversation-lifecycle.ts +1 -1
- package/src/daemon/conversation-runtime-assembly.ts +183 -22
- package/src/daemon/conversation-skill-tools.ts +137 -8
- package/src/daemon/conversation-slash.ts +0 -14
- package/src/daemon/conversation-store.ts +2 -19
- package/src/daemon/conversation-tool-setup.ts +87 -1
- package/src/daemon/conversation.ts +119 -50
- package/src/daemon/external-plugins-bootstrap.ts +36 -95
- package/src/daemon/handlers/config-channels.ts +11 -2
- package/src/daemon/handlers/shared.ts +9 -1
- package/src/daemon/handlers/skills.ts +10 -4
- package/src/daemon/host-app-control-proxy.ts +72 -57
- package/src/daemon/host-browser-proxy.ts +117 -22
- package/src/daemon/lifecycle.ts +34 -5
- package/src/daemon/message-protocol.ts +0 -7
- package/src/daemon/message-types/schedules.ts +1 -0
- package/src/daemon/message-types/skills.ts +17 -0
- package/src/daemon/providers-setup.ts +3 -0
- package/src/daemon/server.ts +3 -3
- package/src/daemon/tool-setup-types.ts +9 -3
- package/src/daemon/trust-context.ts +23 -0
- package/src/daemon/workspace-tools-watcher.ts +324 -0
- package/src/events/tool-audit-listener.ts +78 -16
- package/src/events/tool-metrics-listener.ts +2 -5
- package/src/memory/__tests__/compaction-log-writer-clickhouse.test.ts +227 -0
- package/src/memory/__tests__/conversation-queries.test.ts +176 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +20 -32
- package/src/memory/compaction-log-writer-clickhouse.ts +418 -0
- package/src/memory/conversation-crud.ts +134 -3
- package/src/memory/conversation-queries.ts +64 -7
- package/src/memory/db-init.ts +14 -0
- package/src/memory/embedding-backend.test.ts +130 -1
- package/src/memory/embedding-backend.ts +79 -106
- package/src/memory/embedding-gemini.ts +5 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +12 -0
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +19 -0
- package/src/memory/graph/conversation-graph-memory.ts +36 -25
- package/src/memory/graph/tool-handlers.ts +3 -0
- package/src/memory/job-handlers/cleanup.ts +3 -1
- package/src/memory/jobs-store.ts +0 -28
- package/src/memory/jobs-worker.ts +10 -22
- package/src/memory/memory-marker.ts +29 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +1 -1
- package/src/memory/migrations/268-add-memory-v3-selections.ts +6 -0
- package/src/memory/migrations/270-schedule-description.ts +36 -0
- package/src/memory/migrations/275-tool-invocations-add-skill-id.test.ts +81 -0
- package/src/memory/migrations/275-tool-invocations-add-skill-id.ts +20 -0
- package/src/memory/migrations/276-tool-invocations-created-at-id-index.test.ts +68 -0
- package/src/memory/migrations/276-tool-invocations-created-at-id-index.ts +20 -0
- package/src/memory/migrations/277-add-memory-v3-ever-injected.ts +29 -0
- package/src/memory/migrations/278-tool-invocations-telemetry-columns.test.ts +96 -0
- package/src/memory/migrations/278-tool-invocations-telemetry-columns.ts +39 -0
- package/src/memory/migrations/279-create-skill-loaded-events.test.ts +84 -0
- package/src/memory/migrations/279-create-skill-loaded-events.ts +26 -0
- package/src/memory/migrations/280-conversations-surfaced-at.test.ts +88 -0
- package/src/memory/migrations/280-conversations-surfaced-at.ts +24 -0
- package/src/memory/migrations/index.ts +10 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/schema/conversations.ts +16 -0
- package/src/memory/schema/infrastructure.ts +26 -0
- package/src/memory/skill-loaded-events-store.test.ts +160 -0
- package/src/memory/skill-loaded-events-store.ts +95 -0
- package/src/memory/tool-executed-events-store.test.ts +219 -0
- package/src/memory/tool-executed-events-store.ts +102 -0
- package/src/memory/tool-usage-store.ts +15 -3
- package/src/memory/v2/__tests__/consolidation-job.test.ts +117 -12
- package/src/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +189 -0
- package/src/memory/v2/__tests__/injected-block-slugs.test.ts +90 -0
- package/src/memory/v2/__tests__/page-store.test.ts +33 -0
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +88 -15
- package/src/memory/v2/activation-store.ts +50 -1
- package/src/memory/v2/consolidation-job.ts +113 -29
- package/src/memory/v2/injected-block-slugs.ts +79 -0
- package/src/memory/v2/injection.ts +6 -1
- package/src/memory/v2/prompts/consolidation.ts +414 -13
- package/src/memory/v2/router.ts +2 -28
- package/src/memory/v2/static-context.ts +1 -1
- package/src/memory/v2/types.ts +16 -0
- package/src/notifications/__tests__/copy-composer.test.ts +244 -0
- package/src/notifications/access-request-copy.ts +298 -0
- package/src/notifications/adapters/slack.ts +3 -3
- package/src/notifications/adapters/telegram.ts +2 -1
- package/src/notifications/copy-composer.ts +49 -267
- package/src/notifications/decision-engine.ts +16 -35
- package/src/notifications/home-feed-side-effect.ts +1 -6
- package/src/oauth/oauth-store.ts +0 -9
- package/src/permissions/checker.test.ts +83 -1
- package/src/permissions/checker.ts +25 -2
- package/src/permissions/gateway-threshold-reader.test.ts +182 -0
- package/src/permissions/gateway-threshold-reader.ts +80 -0
- package/src/platform/client.ts +1 -3
- package/src/platform/feature-gate.ts +3 -12
- package/src/plugin-api/constants.ts +4 -2
- package/src/plugin-api/index.ts +63 -11
- package/src/plugin-api/types.ts +236 -71
- package/src/plugins/defaults/compaction/compact.ts +66 -2
- package/src/plugins/defaults/compaction/context-overflow-reducer.ts +240 -32
- package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
- package/src/{daemon/context-overflow-policy.ts → plugins/defaults/compaction/overflow-policy.ts} +1 -1
- package/src/plugins/defaults/compaction/window-manager.ts +303 -1
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +173 -0
- package/src/plugins/defaults/empty-response/hooks/stop.ts +11 -115
- package/src/plugins/defaults/empty-response/nudge-state-store.ts +46 -0
- package/src/plugins/defaults/history-repair/hooks/post-model-call.ts +50 -0
- package/src/plugins/defaults/history-repair/hooks/stop.ts +22 -0
- package/src/plugins/defaults/history-repair/repair-state-store.ts +51 -0
- package/src/plugins/defaults/history-repair/terminal.ts +39 -2
- package/src/plugins/defaults/image-recovery/detect.ts +25 -0
- package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +73 -0
- package/src/plugins/defaults/image-recovery/hooks/stop.ts +22 -0
- package/src/plugins/defaults/image-recovery/image-recovery-state-store.ts +48 -0
- package/src/plugins/defaults/image-recovery/package.json +14 -0
- package/src/{daemon/persist-unsendable-image.ts → plugins/defaults/image-recovery/recover.ts} +67 -14
- package/src/plugins/defaults/index.ts +71 -5
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +76 -112
- package/src/plugins/defaults/memory-retrieval/hooks/{user-prompt-submit-temp.ts → user-prompt-submit.ts} +83 -74
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +14 -8
- package/src/plugins/defaults/memory-retrieval/injectors.ts +2 -18
- package/src/plugins/defaults/memory-retrieval/package.json +14 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +1157 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +683 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +161 -140
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +160 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +335 -316
- package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +145 -53
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +38 -1
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +18 -8
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +112 -71
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +192 -51
- package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +4 -16
- package/src/plugins/defaults/memory-v3-shadow/card.test.ts +173 -0
- package/src/plugins/defaults/memory-v3-shadow/card.ts +116 -0
- package/src/plugins/defaults/memory-v3-shadow/core-set.test.ts +104 -0
- package/src/plugins/defaults/memory-v3-shadow/core-set.ts +59 -0
- package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.test.ts +305 -0
- package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.ts +278 -0
- package/src/plugins/defaults/memory-v3-shadow/hot-set.test.ts +138 -0
- package/src/plugins/defaults/memory-v3-shadow/hot-set.ts +85 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +331 -24
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +119 -13
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +169 -114
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +47 -16
- package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +144 -66
- package/src/plugins/defaults/memory-v3-shadow/prune.test.ts +758 -0
- package/src/plugins/defaults/memory-v3-shadow/prune.ts +471 -0
- package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +68 -16
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +19 -12
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +96 -43
- package/src/plugins/defaults/memory-v3-shadow/types.ts +34 -17
- package/src/plugins/defaults/title-generate/hooks/stop.ts +9 -11
- package/src/plugins/pipeline.ts +8 -5
- package/src/plugins/types.ts +5 -51
- package/src/providers/cache-control.ts +26 -0
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -2
- package/src/providers/model-catalog.ts +13 -1
- package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +147 -0
- package/src/providers/openai/chat-completions-provider.ts +46 -0
- package/src/providers/openai/responses-provider.ts +45 -0
- package/src/providers/registry.ts +0 -8
- package/src/runtime/__tests__/agent-wake.test.ts +0 -1
- package/src/runtime/agent-wake.ts +13 -0
- package/src/runtime/routes/__tests__/acp-routes.test.ts +151 -0
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +12 -50
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +322 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +0 -62
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +31 -11
- package/src/runtime/routes/acp-routes.test.ts +106 -0
- package/src/runtime/routes/acp-routes.ts +248 -2
- package/src/runtime/routes/browser-tabs-routes.ts +1 -1
- package/src/runtime/routes/channel-verification-routes.ts +14 -5
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +0 -14
- package/src/runtime/routes/consolidation-routes.ts +6 -82
- package/src/runtime/routes/conversation-list-routes.ts +6 -0
- package/src/runtime/routes/conversation-management-routes.ts +71 -0
- package/src/runtime/routes/identity-routes.ts +8 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -45
- package/src/runtime/routes/plugins-routes.ts +34 -45
- package/src/runtime/routes/schedule-routes.ts +43 -5
- package/src/runtime/routes/settings-routes.ts +140 -15
- package/src/runtime/routes/skills-routes.ts +18 -6
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +140 -0
- package/src/runtime/services/conversation-serializer.ts +38 -1
- package/src/runtime/verification-outbound-actions.ts +147 -2
- package/src/runtime/verification-templates.ts +29 -3
- package/src/schedule/schedule-store.ts +19 -0
- package/src/skills/catalog-install.ts +77 -13
- package/src/tasks/task-scheduler.ts +1 -0
- package/src/telemetry/types.ts +66 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +542 -13
- package/src/telemetry/usage-telemetry-reporter.ts +213 -20
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +49 -2
- package/src/tools/browser/__tests__/browser-status.test.ts +29 -5
- package/src/tools/browser/browser-execution.ts +27 -9
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +380 -4
- package/src/tools/browser/cdp-client/__tests__/host-bridge-cdp-client.test.ts +107 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +6 -1
- package/src/tools/browser/cdp-client/factory.ts +217 -17
- package/src/tools/browser/cdp-client/host-bridge-cdp-client.ts +67 -0
- package/src/tools/browser/cdp-client/types.ts +22 -2
- package/src/tools/credential-execution/make-authenticated-request.ts +2 -1
- package/src/tools/credential-execution/manage-secure-command-tool.ts +169 -164
- package/src/tools/credential-execution/run-authenticated-command.ts +2 -1
- package/src/tools/executor.ts +39 -7
- package/src/tools/registry.ts +387 -5
- package/src/tools/schedule/create.ts +16 -0
- package/src/tools/schedule/list.ts +12 -4
- package/src/tools/schedule/update.ts +12 -0
- package/src/tools/skills/load.ts +11 -6
- package/src/tools/terminal/safe-env.ts +2 -0
- package/src/tools/types.ts +65 -9
- package/src/tools/workspace-tools/loader.ts +673 -0
- package/src/usage/attribution.ts +28 -0
- package/src/util/device-id.ts +17 -3
- package/src/util/platform.ts +16 -0
- package/tsconfig.plugin-api.json +13 -0
- package/src/__tests__/plugin-external-api.test.ts +0 -68
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -355
- package/src/daemon/message-types/browser.ts +0 -10
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +0 -36
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +0 -37
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +0 -106
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +0 -44
- package/src/plugins/defaults/memory-v3-shadow/working-set.ts +0 -91
- package/src/plugins/external-api.ts +0 -114
- package/src/plugins/plugin-skill-contributions.ts +0 -292
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Read the curated plugin marketplace manifest from the canonical repo.
|
|
3
3
|
*
|
|
4
|
-
* The manifest at `
|
|
4
|
+
* The manifest at `plugins/marketplace.json` whitelists external
|
|
5
5
|
* ecosystem plugins so they appear in `assistant plugins search` / the web
|
|
6
6
|
* catalog and become installable by name. Its shape is a subset of the
|
|
7
7
|
* Claude Code marketplace manifest
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
* a `plugins` array where each entry carries a `name` and a `source`. Only
|
|
10
10
|
* `github` sources are resolved today.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* The manifest is fetched from the repo at a git ref (via the GitHub Contents
|
|
13
|
+
* API) rather than bundled into the assistant build — so the whitelist can
|
|
14
|
+
* grow without shipping a new release.
|
|
15
15
|
* Every external source pins an explicit `ref` that MUST be a full commit SHA:
|
|
16
16
|
* the fetched code is locked to an immutable revision. Tags and branches are
|
|
17
17
|
* rejected because they are mutable — an upstream owner could retag/repoint
|
|
@@ -33,7 +33,7 @@ import type { FetchLike } from "./install-from-github.js";
|
|
|
33
33
|
/** Canonical location of the marketplace manifest. */
|
|
34
34
|
const MARKETPLACE_SOURCE_OWNER = "vellum-ai";
|
|
35
35
|
const MARKETPLACE_SOURCE_REPO = "vellum-assistant";
|
|
36
|
-
const MARKETPLACE_FILE_PATH = "
|
|
36
|
+
const MARKETPLACE_FILE_PATH = "plugins/marketplace.json";
|
|
37
37
|
|
|
38
38
|
// ---------------------------------------------------------------------------
|
|
39
39
|
// Manifest schema (subset of the Claude Code marketplace schema)
|
|
@@ -132,23 +132,51 @@ export interface FetchMarketplaceDeps {
|
|
|
132
132
|
/**
|
|
133
133
|
* The manifest could not be read or did not validate. Distinct from "no
|
|
134
134
|
* manifest at this ref" (a missing file is a normal, empty result) — this
|
|
135
|
-
* signals an upstream/parse problem the caller
|
|
136
|
-
*
|
|
135
|
+
* signals an upstream/parse problem the caller must surface.
|
|
136
|
+
*
|
|
137
|
+
* `transient` distinguishes a retryable upstream hiccup (GitHub rate-limited
|
|
138
|
+
* us or returned a 5xx) from a hard failure (a malformed or invalid manifest).
|
|
139
|
+
* The catalog is the source of truth for installable plugins, so a transient
|
|
140
|
+
* fetch failure should map to a retryable 503 and serve a stale cache, while a
|
|
141
|
+
* hard failure surfaces as a real error.
|
|
137
142
|
*/
|
|
138
143
|
export class MarketplaceFetchError extends Error {
|
|
139
|
-
|
|
144
|
+
/** Whether the failure is a retryable upstream hiccup vs a hard error. */
|
|
145
|
+
readonly transient: boolean;
|
|
146
|
+
/** Upstream HTTP status, when the failure originated from a response. */
|
|
147
|
+
readonly status?: number;
|
|
148
|
+
constructor(
|
|
149
|
+
message: string,
|
|
150
|
+
opts?: { transient?: boolean; status?: number },
|
|
151
|
+
) {
|
|
140
152
|
super(message);
|
|
141
153
|
this.name = "MarketplaceFetchError";
|
|
154
|
+
this.transient = opts?.transient ?? false;
|
|
155
|
+
if (opts?.status !== undefined) this.status = opts.status;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Classify an upstream GitHub status as transient (worth retrying) vs hard.
|
|
161
|
+
* A 429 or 5xx is always transient. A 403 is GitHub's unauthenticated
|
|
162
|
+
* rate-limit signal only when the remaining-quota header is exhausted — a 403
|
|
163
|
+
* without it is a genuine authorization failure and stays hard.
|
|
164
|
+
*/
|
|
165
|
+
function isTransientUpstreamStatus(res: Response): boolean {
|
|
166
|
+
if (res.status === 429 || res.status >= 500) return true;
|
|
167
|
+
if (res.status === 403) {
|
|
168
|
+
return res.headers.get("x-ratelimit-remaining") === "0";
|
|
142
169
|
}
|
|
170
|
+
return false;
|
|
143
171
|
}
|
|
144
172
|
|
|
145
173
|
/**
|
|
146
174
|
* Fetch and validate the marketplace manifest, returning its plugin entries.
|
|
147
175
|
*
|
|
148
|
-
* A missing manifest (HTTP 404) is treated as an empty whitelist —
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
176
|
+
* A missing manifest (HTTP 404) is treated as an empty whitelist — an empty
|
|
177
|
+
* catalog is a valid state, not an error. Any other HTTP failure, a non-JSON
|
|
178
|
+
* body, or a schema violation throws {@link MarketplaceFetchError}; a
|
|
179
|
+
* rate-limit or 5xx is flagged `transient` so the caller can retry.
|
|
152
180
|
*/
|
|
153
181
|
export async function fetchMarketplaceEntries(
|
|
154
182
|
deps: FetchMarketplaceDeps,
|
|
@@ -172,6 +200,7 @@ export async function fetchMarketplaceEntries(
|
|
|
172
200
|
if (!res.ok) {
|
|
173
201
|
throw new MarketplaceFetchError(
|
|
174
202
|
`Marketplace manifest fetch failed for ${MARKETPLACE_FILE_PATH} @ ${ref}: HTTP ${res.status}`,
|
|
203
|
+
{ transient: isTransientUpstreamStatus(res), status: res.status },
|
|
175
204
|
);
|
|
176
205
|
}
|
|
177
206
|
|
|
@@ -196,8 +225,7 @@ export async function fetchMarketplaceEntries(
|
|
|
196
225
|
|
|
197
226
|
/**
|
|
198
227
|
* Resolve a plugin name to concrete GitHub coordinates using the supplied
|
|
199
|
-
* marketplace entries. Returns `null` when no entry claims the name
|
|
200
|
-
* caller then falls back to the first-party source convention).
|
|
228
|
+
* marketplace entries. Returns `null` when no entry claims the name.
|
|
201
229
|
*/
|
|
202
230
|
export function resolveMarketplaceSource(
|
|
203
231
|
name: string,
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Search the installable plugin catalog in the canonical GitHub source.
|
|
3
3
|
*
|
|
4
|
-
* The catalog is the
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `vellum-ai/vellum-assistant/experimental/plugins/`.
|
|
8
|
-
* 2. Whitelisted external ecosystem plugins — entries in the curated
|
|
9
|
-
* `experimental/plugins/marketplace.json` manifest (see
|
|
10
|
-
* {@link ./plugin-marketplace}).
|
|
4
|
+
* The catalog is the set of whitelisted external ecosystem plugins listed in
|
|
5
|
+
* the curated `plugins/marketplace.json` manifest, fetched from the repo at
|
|
6
|
+
* the configured git ref (see {@link ./plugin-marketplace}).
|
|
11
7
|
*
|
|
12
8
|
* Entries are filtered by case-insensitive ECMAScript regex against the
|
|
13
9
|
* plugin name. A plain query like `"memory"` matches anywhere in the name;
|
|
@@ -25,25 +21,13 @@ import { DEFAULT_PLUGIN_REF } from "./install-from-github.js";
|
|
|
25
21
|
import {
|
|
26
22
|
fetchMarketplaceEntries,
|
|
27
23
|
type MarketplaceEntry,
|
|
24
|
+
MarketplaceFetchError,
|
|
28
25
|
} from "./plugin-marketplace.js";
|
|
29
26
|
|
|
30
27
|
// Re-export the dep-injection type so callers can grab everything they need
|
|
31
28
|
// from one module rather than reaching into `install-from-github.js`.
|
|
32
29
|
export type { FetchLike } from "./install-from-github.js";
|
|
33
30
|
|
|
34
|
-
const PLUGIN_SOURCE_OWNER = "vellum-ai";
|
|
35
|
-
const PLUGIN_SOURCE_REPO = "vellum-assistant";
|
|
36
|
-
const PLUGIN_SOURCE_PATH_PREFIX = "experimental/plugins";
|
|
37
|
-
|
|
38
|
-
/** Entry shape returned by the GitHub Contents API for a directory listing. */
|
|
39
|
-
interface GitHubContentEntry {
|
|
40
|
-
readonly name: string;
|
|
41
|
-
readonly path: string;
|
|
42
|
-
readonly type: "file" | "dir" | "symlink" | "submodule";
|
|
43
|
-
readonly size: number;
|
|
44
|
-
readonly download_url: string | null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
31
|
/** Options that control the search. */
|
|
48
32
|
export interface SearchPluginsOptions {
|
|
49
33
|
/**
|
|
@@ -62,26 +46,23 @@ export interface SearchPluginsDeps {
|
|
|
62
46
|
}
|
|
63
47
|
|
|
64
48
|
/** Where a catalog match comes from. */
|
|
65
|
-
export type PluginMatchSource =
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
readonly ref: string;
|
|
75
|
-
};
|
|
49
|
+
export type PluginMatchSource = {
|
|
50
|
+
readonly kind: "github";
|
|
51
|
+
/** `owner/repo` of the external plugin repository. */
|
|
52
|
+
readonly repo: string;
|
|
53
|
+
/** Directory within the repo, when the plugin is not at the root. */
|
|
54
|
+
readonly path?: string;
|
|
55
|
+
/** Pinned git ref the plugin is fetched from. */
|
|
56
|
+
readonly ref: string;
|
|
57
|
+
};
|
|
76
58
|
|
|
77
59
|
/** One matching catalog entry. */
|
|
78
60
|
export interface PluginSearchMatch {
|
|
79
61
|
/** Install name — `assistant plugins install <name>` resolves to it. */
|
|
80
62
|
readonly name: string;
|
|
81
63
|
/**
|
|
82
|
-
* Human-readable origin of the entry:
|
|
83
|
-
*
|
|
84
|
-
* `github:owner/repo@ref` locator for external ones.
|
|
64
|
+
* Human-readable origin of the entry: a `github:owner/repo[/path]@ref`
|
|
65
|
+
* locator for the external plugin source.
|
|
85
66
|
*/
|
|
86
67
|
readonly path: string;
|
|
87
68
|
/** Short description, when known (external entries only today). */
|
|
@@ -178,9 +159,8 @@ export interface PluginCatalog {
|
|
|
178
159
|
}
|
|
179
160
|
|
|
180
161
|
/**
|
|
181
|
-
* Build the full catalog at {@link opts.ref}: every
|
|
182
|
-
*
|
|
183
|
-
* external entry in the marketplace manifest.
|
|
162
|
+
* Build the full catalog at {@link opts.ref}: every whitelisted external
|
|
163
|
+
* entry in the marketplace manifest, deduped by name.
|
|
184
164
|
*
|
|
185
165
|
* The result is **query-independent** — `searchPlugins` applies the regex
|
|
186
166
|
* filter in memory afterwards. That separation is what lets a long-lived
|
|
@@ -193,37 +173,16 @@ export async function loadPluginCatalog(
|
|
|
193
173
|
): Promise<PluginCatalog> {
|
|
194
174
|
const ref = opts.ref ?? DEFAULT_PLUGIN_REF;
|
|
195
175
|
|
|
196
|
-
const
|
|
197
|
-
listDir(PLUGIN_SOURCE_PATH_PREFIX, ref, deps.fetch),
|
|
198
|
-
fetchMarketplaceSafe(deps.fetch, ref),
|
|
199
|
-
]);
|
|
176
|
+
const marketplace = await fetchMarketplaceCatalog(deps.fetch, ref);
|
|
200
177
|
|
|
201
178
|
const matches: PluginSearchMatch[] = [];
|
|
202
179
|
const seen = new Set<string>();
|
|
203
|
-
|
|
204
|
-
// Whitelisted external entries own their name. A same-named
|
|
205
|
-
// `experimental/plugins/<name>/` directory is that plugin's curated adapter
|
|
206
|
-
// stub (overlaid onto the clone at install time), not a standalone
|
|
207
|
-
// first-party plugin — so it must surface once, as the external entry.
|
|
208
180
|
for (const entry of marketplace) {
|
|
209
181
|
if (seen.has(entry.name)) continue;
|
|
210
182
|
matches.push(marketplaceMatch(entry));
|
|
211
183
|
seen.add(entry.name);
|
|
212
184
|
}
|
|
213
185
|
|
|
214
|
-
// First-party plugins are the in-repo directories whose name the marketplace
|
|
215
|
-
// does not claim.
|
|
216
|
-
for (const entry of entries) {
|
|
217
|
-
if (entry.type !== "dir") continue;
|
|
218
|
-
if (seen.has(entry.name)) continue;
|
|
219
|
-
matches.push({
|
|
220
|
-
name: entry.name,
|
|
221
|
-
path: entry.path,
|
|
222
|
-
source: { kind: "first-party" },
|
|
223
|
-
});
|
|
224
|
-
seen.add(entry.name);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
186
|
matches.sort((a, b) => a.name.localeCompare(b.name));
|
|
228
187
|
|
|
229
188
|
return { ref, matches };
|
|
@@ -245,19 +204,23 @@ function marketplaceMatch(entry: MarketplaceEntry): PluginSearchMatch {
|
|
|
245
204
|
}
|
|
246
205
|
|
|
247
206
|
/**
|
|
248
|
-
* Fetch the marketplace
|
|
249
|
-
*
|
|
250
|
-
*
|
|
251
|
-
*
|
|
207
|
+
* Fetch the marketplace entries, mapping a transient upstream failure to
|
|
208
|
+
* {@link PluginCatalogUnavailableError} so the cache can serve a stale catalog
|
|
209
|
+
* and the route can surface a retryable 503. A missing manifest is a normal
|
|
210
|
+
* empty catalog; a hard failure (malformed or invalid manifest) propagates
|
|
211
|
+
* as-is, since the catalog is the source of truth for installable plugins.
|
|
252
212
|
*/
|
|
253
|
-
async function
|
|
213
|
+
async function fetchMarketplaceCatalog(
|
|
254
214
|
fetchFn: FetchLike,
|
|
255
215
|
ref: string,
|
|
256
216
|
): Promise<readonly MarketplaceEntry[]> {
|
|
257
217
|
try {
|
|
258
218
|
return await fetchMarketplaceEntries({ fetch: fetchFn }, { ref });
|
|
259
|
-
} catch {
|
|
260
|
-
|
|
219
|
+
} catch (err) {
|
|
220
|
+
if (err instanceof MarketplaceFetchError && err.transient) {
|
|
221
|
+
throw new PluginCatalogUnavailableError(err.message, err.status ?? 503);
|
|
222
|
+
}
|
|
223
|
+
throw err;
|
|
261
224
|
}
|
|
262
225
|
}
|
|
263
226
|
|
|
@@ -270,66 +233,3 @@ function buildMatcher(query: string): (name: string) => boolean {
|
|
|
270
233
|
}
|
|
271
234
|
return (name) => re.test(name);
|
|
272
235
|
}
|
|
273
|
-
|
|
274
|
-
async function listDir(
|
|
275
|
-
apiPath: string,
|
|
276
|
-
ref: string,
|
|
277
|
-
fetchFn: FetchLike,
|
|
278
|
-
): Promise<readonly GitHubContentEntry[]> {
|
|
279
|
-
const url =
|
|
280
|
-
`https://api.github.com/repos/${PLUGIN_SOURCE_OWNER}/${PLUGIN_SOURCE_REPO}` +
|
|
281
|
-
`/contents/${encodeURIComponent(apiPath).replaceAll("%2F", "/")}` +
|
|
282
|
-
`?ref=${encodeURIComponent(ref)}`;
|
|
283
|
-
|
|
284
|
-
const res = await githubFetch(url, fetchFn);
|
|
285
|
-
if (!res.ok) {
|
|
286
|
-
const detail = `GitHub contents listing failed for ${apiPath} @ ${ref}: HTTP ${res.status}`;
|
|
287
|
-
// Rate limiting (403 with the budget exhausted, or 429) and upstream
|
|
288
|
-
// 5xx are transient — surface them as a retryable "temporarily
|
|
289
|
-
// unavailable" so the caller can serve a stale cache and the route can
|
|
290
|
-
// map to 503 instead of a misleading 500. A 404 on the plugins prefix
|
|
291
|
-
// itself means the canonical source path is gone (a real
|
|
292
|
-
// misconfiguration), so it stays a hard error.
|
|
293
|
-
if (isTransientUpstreamStatus(res)) {
|
|
294
|
-
throw new PluginCatalogUnavailableError(detail, res.status);
|
|
295
|
-
}
|
|
296
|
-
throw new Error(detail);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
const body = (await res.json()) as unknown;
|
|
300
|
-
if (!Array.isArray(body)) {
|
|
301
|
-
// A non-array body for a /contents/<dir> path means the path is a
|
|
302
|
-
// file, not a directory — treat the prefix as empty rather than crash.
|
|
303
|
-
return [];
|
|
304
|
-
}
|
|
305
|
-
return body as readonly GitHubContentEntry[];
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Wraps `fetchFn` with the headers we want to send to GitHub for every
|
|
310
|
-
* request. Unauthenticated — the canonical source is a public repo, mirroring
|
|
311
|
-
* `installPlugin` which uses the same envelope.
|
|
312
|
-
*/
|
|
313
|
-
/**
|
|
314
|
-
* Whether a non-OK GitHub response should be treated as a transient
|
|
315
|
-
* "temporarily unavailable" failure rather than a hard error. Covers
|
|
316
|
-
* rate limiting (429, or 403 once the rate-limit budget is exhausted) and
|
|
317
|
-
* upstream server errors (5xx). A bare 403 without the rate-limit signal
|
|
318
|
-
* (e.g. a genuine permissions problem) is not treated as transient.
|
|
319
|
-
*/
|
|
320
|
-
function isTransientUpstreamStatus(res: Response): boolean {
|
|
321
|
-
if (res.status === 429 || res.status >= 500) return true;
|
|
322
|
-
if (res.status === 403) {
|
|
323
|
-
return res.headers.get("x-ratelimit-remaining") === "0";
|
|
324
|
-
}
|
|
325
|
-
return false;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
async function githubFetch(url: string, fetchFn: FetchLike): Promise<Response> {
|
|
329
|
-
return fetchFn(url, {
|
|
330
|
-
headers: {
|
|
331
|
-
Accept: "application/vnd.github+json",
|
|
332
|
-
"User-Agent": "vellum-assistant-cli",
|
|
333
|
-
},
|
|
334
|
-
});
|
|
335
|
-
}
|
package/src/cli/program.ts
CHANGED
|
@@ -49,6 +49,7 @@ import { registerStatusCommand } from "./commands/status.js";
|
|
|
49
49
|
import { registerSttCommand } from "./commands/stt.js";
|
|
50
50
|
import { registerTaskCommand } from "./commands/task.js";
|
|
51
51
|
import { registerTelemetryCommand } from "./commands/telemetry.js";
|
|
52
|
+
import { registerToolsCommand } from "./commands/tools.js";
|
|
52
53
|
import { registerTrustCommand } from "./commands/trust.js";
|
|
53
54
|
import { registerTtsCommand } from "./commands/tts.js";
|
|
54
55
|
import { registerUiCommand } from "./commands/ui.js";
|
|
@@ -147,6 +148,7 @@ Examples:
|
|
|
147
148
|
registerSttCommand(program);
|
|
148
149
|
registerTaskCommand(program);
|
|
149
150
|
registerTelemetryCommand(program);
|
|
151
|
+
registerToolsCommand(program);
|
|
150
152
|
registerTrustCommand(program);
|
|
151
153
|
registerTtsCommand(program);
|
|
152
154
|
registerUiCommand(program);
|
|
@@ -5,6 +5,7 @@ metadata:
|
|
|
5
5
|
emoji: "🛠️"
|
|
6
6
|
vellum:
|
|
7
7
|
display-name: "App Builder"
|
|
8
|
+
category: "development"
|
|
8
9
|
activation-hints:
|
|
9
10
|
- "User asks to build a dashboard, tracker, calculator, data visualization, chart, simple landing page, or slide deck for their own use"
|
|
10
11
|
- "User asks to visualize something, make a chart, or build an artifact — build a real persistent app here, never a ui_show dynamic_page"
|
|
@@ -6,6 +6,7 @@ metadata:
|
|
|
6
6
|
emoji: "🎯"
|
|
7
7
|
vellum:
|
|
8
8
|
display-name: "App Control"
|
|
9
|
+
category: "system"
|
|
9
10
|
feature-flag: "app-control"
|
|
10
11
|
activation-hints:
|
|
11
12
|
- "User explicitly directs the assistant to drive a specific named app via raw input (emulator, game, OpenGL canvas, custom-rendered Electron app)"
|
|
@@ -6,6 +6,7 @@ metadata:
|
|
|
6
6
|
emoji: "🖥️"
|
|
7
7
|
vellum:
|
|
8
8
|
display-name: "Computer Use"
|
|
9
|
+
category: "system"
|
|
9
10
|
activation-hints:
|
|
10
11
|
- "User asks the assistant to click, type, drag, or interact with the macOS GUI directly"
|
|
11
12
|
- "User wants control of a desktop app with no CLI or API alternative (games, design tools, visual workflows)"
|
|
@@ -6,6 +6,7 @@ metadata:
|
|
|
6
6
|
emoji: "👥"
|
|
7
7
|
vellum:
|
|
8
8
|
display-name: "Contacts"
|
|
9
|
+
category: "productivity"
|
|
9
10
|
activation-hints:
|
|
10
11
|
- "Look up contact info before asking the user for email addresses or phone numbers"
|
|
11
12
|
- "User wants to manage who can message the assistant, or create/revoke invite links"
|
|
@@ -6,6 +6,7 @@ metadata:
|
|
|
6
6
|
emoji: "✍️"
|
|
7
7
|
vellum:
|
|
8
8
|
display-name: "Document Writer"
|
|
9
|
+
category: "content"
|
|
9
10
|
activation-hints:
|
|
10
11
|
- "User asks to write, draft, or compose an article, blog post, essay, report, story, or any long-form content — always create it in the document editor, not as a chat reply"
|
|
11
12
|
- "User wants written content they will iterate on, review, or export — use the editor instead of inline markdown"
|
|
@@ -6,6 +6,7 @@ metadata:
|
|
|
6
6
|
emoji: "🎨"
|
|
7
7
|
vellum:
|
|
8
8
|
display-name: "Image Studio"
|
|
9
|
+
category: "content"
|
|
9
10
|
activation-hints:
|
|
10
11
|
- "User asks to generate, draw, or create an image from a text prompt"
|
|
11
12
|
- "User wants to edit an existing image — background removal, in-painting, style change, retouching"
|
|
@@ -6,6 +6,7 @@ metadata:
|
|
|
6
6
|
emoji: "🎬"
|
|
7
7
|
vellum:
|
|
8
8
|
display-name: "Media Processing"
|
|
9
|
+
category: "content"
|
|
9
10
|
activation-hints:
|
|
10
11
|
- "User wants to ingest, process, or analyze a local video, audio, or image file"
|
|
11
12
|
- "User wants to ask natural-language questions about a video's content (e.g. 'what happens at 3:14', 'find all the goals', 'who appears in this footage')"
|
|
@@ -6,6 +6,7 @@ metadata:
|
|
|
6
6
|
emoji: "📅"
|
|
7
7
|
vellum:
|
|
8
8
|
display-name: "Schedule"
|
|
9
|
+
category: "productivity"
|
|
9
10
|
activation-hints:
|
|
10
11
|
- "User wants to set a reminder for a future time (e.g. 'remind me at 9am tomorrow', 'remind me to take meds at 8pm')"
|
|
11
12
|
- "User wants to schedule a recurring task or automation (e.g. 'every weekday at 9am', 'every Monday at noon')"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"tools": [
|
|
4
4
|
{
|
|
5
5
|
"name": "schedule_create",
|
|
6
|
-
"description": "Create a scheduled automation. For recurring: provide expression (cron/RRULE). For one-time: provide fire_at (ISO 8601 timestamp). ONLY use this when the user explicitly wants something to run on a schedule (e.g. \"every day at 9am\", \"remind me tomorrow at 3pm\", \"weekly on Mondays\"). Do NOT use this for \"add to my tasks\" or \"add to my queue\" - use task_list_add for those requests instead.",
|
|
6
|
+
"description": "Create a scheduled automation. Always provide a concise description of what the schedule does and why. For recurring: provide expression (cron/RRULE). For one-time: provide fire_at (ISO 8601 timestamp). ONLY use this when the user explicitly wants something to run on a schedule (e.g. \"every day at 9am\", \"remind me tomorrow at 3pm\", \"weekly on Mondays\"). Do NOT use this for \"add to my tasks\" or \"add to my queue\" - use task_list_add for those requests instead.",
|
|
7
7
|
"category": "schedule",
|
|
8
8
|
"risk": "medium",
|
|
9
9
|
"input_schema": {
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
"type": "string",
|
|
14
14
|
"description": "A human-readable name for the scheduled task"
|
|
15
15
|
},
|
|
16
|
+
"description": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "Required concise authored description of what it does and why. Keep this distinct from the timing/cadence."
|
|
19
|
+
},
|
|
16
20
|
"syntax": {
|
|
17
21
|
"type": "string",
|
|
18
22
|
"enum": ["cron", "rrule"],
|
|
@@ -77,7 +81,7 @@
|
|
|
77
81
|
"description": "For script mode: maximum time in milliseconds the shell command may run before it is killed. Defaults to 60000 (60s). Allowed range: 1000 to 1800000."
|
|
78
82
|
}
|
|
79
83
|
},
|
|
80
|
-
"required": ["name"]
|
|
84
|
+
"required": ["name", "description"]
|
|
81
85
|
},
|
|
82
86
|
"executor": "tools/schedule-create.ts",
|
|
83
87
|
"execution_target": "host"
|
|
@@ -106,7 +110,7 @@
|
|
|
106
110
|
},
|
|
107
111
|
{
|
|
108
112
|
"name": "schedule_update",
|
|
109
|
-
"description": "Update an existing scheduled automation (expression, syntax, message, name, enabled state, mode, or routing)",
|
|
113
|
+
"description": "Update an existing scheduled automation (expression, syntax, message, name, description, enabled state, mode, or routing)",
|
|
110
114
|
"category": "schedule",
|
|
111
115
|
"risk": "medium",
|
|
112
116
|
"input_schema": {
|
|
@@ -120,6 +124,10 @@
|
|
|
120
124
|
"type": "string",
|
|
121
125
|
"description": "New name for the job"
|
|
122
126
|
},
|
|
127
|
+
"description": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"description": "New concise authored description of what the schedule does and why. Keep this distinct from the timing/cadence."
|
|
130
|
+
},
|
|
123
131
|
"syntax": {
|
|
124
132
|
"type": "string",
|
|
125
133
|
"enum": ["cron", "rrule"],
|
|
@@ -6,6 +6,7 @@ metadata:
|
|
|
6
6
|
emoji: "\u2699\uFE0F"
|
|
7
7
|
vellum:
|
|
8
8
|
display-name: "Settings"
|
|
9
|
+
category: "system"
|
|
9
10
|
activation-hints:
|
|
10
11
|
- "User wants to change the assistant's voice, TTS provider, or speech output"
|
|
11
12
|
- "User wants to rebind the push-to-talk key or adjust microphone / conversation timeout"
|