@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,292 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-memory registry of plugin-contributed skills.
|
|
3
|
-
*
|
|
4
|
-
* Plugins with `manifest.skills` (or {@link Plugin.skills}) declared in their
|
|
5
|
-
* {@link PluginSkillRegistration} list get their entries indexed here during
|
|
6
|
-
* bootstrap (PR 14 -> PR 33). {@link loadSkillCatalog} in
|
|
7
|
-
* `config/skills.ts` merges these entries into the regular catalog so the
|
|
8
|
-
* model's `skill_load` / `skill_execute` flow can resolve them under
|
|
9
|
-
* `source: "plugin"`.
|
|
10
|
-
*
|
|
11
|
-
* ## Ref-counted lifecycle
|
|
12
|
-
*
|
|
13
|
-
* Registration is per-plugin — a plugin declares zero or more skills and the
|
|
14
|
-
* registry stores them keyed by plugin name. Several tests and hot-reload
|
|
15
|
-
* flows may call {@link registerPluginSkills} more than once for the same
|
|
16
|
-
* plugin (same skills, same body). Each call bumps a reference counter;
|
|
17
|
-
* {@link unregisterPluginSkills} decrements it and only tears the entry down
|
|
18
|
-
* when the counter reaches zero. This mirrors the ref-counted teardown
|
|
19
|
-
* semantics of `registerSkillTools` / `unregisterSkillTools` in the tool
|
|
20
|
-
* registry, so the plugin layer's lifecycle matches the skill layer's.
|
|
21
|
-
*
|
|
22
|
-
* Collision rules:
|
|
23
|
-
*
|
|
24
|
-
* - A plugin cannot register two skills with the same id in a single call —
|
|
25
|
-
* the duplicate is rejected at registration time.
|
|
26
|
-
* - Two different plugins cannot contribute skills with the same id. The
|
|
27
|
-
* second registration throws so the operator notices, rather than silently
|
|
28
|
-
* shadowing the first plugin's contribution.
|
|
29
|
-
* - The catalog merge logic in {@link loadSkillCatalog} decides how plugin
|
|
30
|
-
* skills interact with filesystem skills (bundled/managed/workspace) —
|
|
31
|
-
* this module just owns the in-memory set.
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
import type {
|
|
35
|
-
SkillDefinition,
|
|
36
|
-
SkillSummary,
|
|
37
|
-
SkillToolManifestMeta,
|
|
38
|
-
} from "../config/skills.js";
|
|
39
|
-
import { getLogger } from "../util/logger.js";
|
|
40
|
-
import { PluginExecutionError, type PluginSkillRegistration } from "./types.js";
|
|
41
|
-
|
|
42
|
-
// This module imports ONLY types from `config/skills.js`. `config/skills.ts`
|
|
43
|
-
// in turn imports values from here to merge plugin-contributed skills into
|
|
44
|
-
// the catalog output. TypeScript / ESM handles the type-only edge of the
|
|
45
|
-
// cycle cleanly; converting any of the imports above to value imports would
|
|
46
|
-
// introduce a runtime cycle and a load-order hazard with `loadSkillCatalog`.
|
|
47
|
-
|
|
48
|
-
const log = getLogger("plugin-skills");
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Virtual directory path prefix for plugin-contributed skills. `SkillSummary`
|
|
52
|
-
* requires a `directoryPath` — plugin skills aren't on disk, so we synthesize
|
|
53
|
-
* a stable, recognizable path that encodes the plugin name. Downstream code
|
|
54
|
-
* that reads from disk (inline-command rendering, reference-file listing,
|
|
55
|
-
* icon caching) gates on `source` so these paths are never stat'd.
|
|
56
|
-
*/
|
|
57
|
-
const PLUGIN_VIRTUAL_PATH_PREFIX = "<plugin>/";
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* One stored plugin skill. Keeps the original registration for re-exposure
|
|
61
|
-
* and a pre-built {@link SkillDefinition} so the catalog / loader paths can
|
|
62
|
-
* return summary/definition objects without re-synthesizing them on every
|
|
63
|
-
* lookup.
|
|
64
|
-
*/
|
|
65
|
-
interface StoredPluginSkill {
|
|
66
|
-
/** Name of the plugin that contributed the skill. */
|
|
67
|
-
pluginName: string;
|
|
68
|
-
/** Pre-built definition (includes the body) returned to `skill_load`. */
|
|
69
|
-
definition: SkillDefinition;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/** All skills contributed by plugins, keyed by skill id. */
|
|
73
|
-
const pluginSkillsById = new Map<string, StoredPluginSkill>();
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Ref-count of active registrations per plugin name. Bumped on
|
|
77
|
-
* {@link registerPluginSkills}, decremented on {@link unregisterPluginSkills}.
|
|
78
|
-
* Only when the counter hits zero do we actually remove the plugin's
|
|
79
|
-
* contributed skills from {@link pluginSkillsById}.
|
|
80
|
-
*/
|
|
81
|
-
const pluginRefCount = new Map<string, number>();
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Skill-id -> owning plugin name. Maintained alongside
|
|
85
|
-
* {@link pluginSkillsById} so {@link unregisterPluginSkills} can drop exactly
|
|
86
|
-
* the entries the plugin owns without scanning the full id map.
|
|
87
|
-
*/
|
|
88
|
-
const pluginSkillIdsByPlugin = new Map<string, Set<string>>();
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Build the {@link SkillDefinition} object that {@link loadSkillCatalog} and
|
|
92
|
-
* {@link loadSkillBySelector} hand back to consumers. Kept in one place so
|
|
93
|
-
* summary and definition stay in lockstep — any field added to
|
|
94
|
-
* {@link PluginSkillRegistration} shows up in both.
|
|
95
|
-
*/
|
|
96
|
-
function buildDefinition(
|
|
97
|
-
pluginName: string,
|
|
98
|
-
reg: PluginSkillRegistration,
|
|
99
|
-
): SkillDefinition {
|
|
100
|
-
// Synthetic directory path. Using a non-filesystem prefix keeps the path
|
|
101
|
-
// recognizable in logs while preventing accidental `fs.existsSync` loops
|
|
102
|
-
// elsewhere in the catalog (all such loops live behind source !== "plugin"
|
|
103
|
-
// guards).
|
|
104
|
-
const directoryPath = `${PLUGIN_VIRTUAL_PATH_PREFIX}${pluginName}/${reg.id}`;
|
|
105
|
-
const skillFilePath = `${directoryPath}/SKILL.md`;
|
|
106
|
-
|
|
107
|
-
// toolManifest stays undefined for plugin skills — plugin tool contributions
|
|
108
|
-
// flow through `Plugin.tools` (PR 31), not through a synthetic TOOLS.json.
|
|
109
|
-
const toolManifest: SkillToolManifestMeta | undefined = undefined;
|
|
110
|
-
|
|
111
|
-
return {
|
|
112
|
-
id: reg.id,
|
|
113
|
-
name: reg.name,
|
|
114
|
-
displayName: reg.displayName ?? reg.name,
|
|
115
|
-
description: reg.description,
|
|
116
|
-
directoryPath,
|
|
117
|
-
skillFilePath,
|
|
118
|
-
body: reg.body,
|
|
119
|
-
emoji: reg.emoji,
|
|
120
|
-
source: "plugin",
|
|
121
|
-
toolManifest,
|
|
122
|
-
includes: reg.includes,
|
|
123
|
-
featureFlag: reg.featureFlag,
|
|
124
|
-
activationHints: reg.activationHints,
|
|
125
|
-
avoidWhen: reg.avoidWhen,
|
|
126
|
-
// Plugin skills do not support inline command expansion in this PR.
|
|
127
|
-
inlineCommandExpansions: undefined,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Register every skill declared by a plugin's `Plugin.skills` list.
|
|
133
|
-
*
|
|
134
|
-
* Must be called after the plugin's `init()` completes successfully (see
|
|
135
|
-
* `external-plugins-bootstrap.ts`). Throws {@link PluginExecutionError} if a
|
|
136
|
-
* skill id collides with another plugin's skill or with an id already
|
|
137
|
-
* registered in an earlier successful registration from the same plugin
|
|
138
|
-
* that hasn't been torn down.
|
|
139
|
-
*
|
|
140
|
-
* Ref-count semantics: each call bumps the plugin-level ref counter.
|
|
141
|
-
* Duplicate registrations of the *same* plugin's skills are accepted and
|
|
142
|
-
* treated as a no-op past the first call — the second invocation increments
|
|
143
|
-
* the counter without re-inserting entries.
|
|
144
|
-
*/
|
|
145
|
-
export function registerPluginSkills(
|
|
146
|
-
pluginName: string,
|
|
147
|
-
skills: readonly PluginSkillRegistration[],
|
|
148
|
-
): void {
|
|
149
|
-
const currentCount = pluginRefCount.get(pluginName) ?? 0;
|
|
150
|
-
|
|
151
|
-
if (currentCount > 0) {
|
|
152
|
-
// The plugin already has skills registered — bump the counter without
|
|
153
|
-
// re-adding. Duplicate register calls for the same plugin are legitimate
|
|
154
|
-
// (hot-reload, re-bootstrap) so we accept them rather than throw.
|
|
155
|
-
pluginRefCount.set(pluginName, currentCount + 1);
|
|
156
|
-
log.debug(
|
|
157
|
-
{ pluginName, refCount: currentCount + 1 },
|
|
158
|
-
"Bumped plugin-skills ref count (skills kept)",
|
|
159
|
-
);
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// First-time registration for this plugin — validate and insert.
|
|
164
|
-
//
|
|
165
|
-
// We validate intra-batch uniqueness first so a plugin that accidentally
|
|
166
|
-
// declares the same skill twice gets a clear error at registration,
|
|
167
|
-
// rather than the second declaration silently overwriting the first
|
|
168
|
-
// inside the map.
|
|
169
|
-
const seenInBatch = new Set<string>();
|
|
170
|
-
for (const reg of skills) {
|
|
171
|
-
if (seenInBatch.has(reg.id)) {
|
|
172
|
-
throw new PluginExecutionError(
|
|
173
|
-
`plugin ${pluginName} declared skill "${reg.id}" more than once`,
|
|
174
|
-
pluginName,
|
|
175
|
-
);
|
|
176
|
-
}
|
|
177
|
-
seenInBatch.add(reg.id);
|
|
178
|
-
|
|
179
|
-
const existing = pluginSkillsById.get(reg.id);
|
|
180
|
-
if (existing) {
|
|
181
|
-
throw new PluginExecutionError(
|
|
182
|
-
`plugin ${pluginName} cannot contribute skill "${reg.id}" — ` +
|
|
183
|
-
`already registered by plugin "${existing.pluginName}"`,
|
|
184
|
-
pluginName,
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const ownedIds = new Set<string>();
|
|
190
|
-
for (const reg of skills) {
|
|
191
|
-
pluginSkillsById.set(reg.id, {
|
|
192
|
-
pluginName,
|
|
193
|
-
definition: buildDefinition(pluginName, reg),
|
|
194
|
-
});
|
|
195
|
-
ownedIds.add(reg.id);
|
|
196
|
-
log.info({ pluginName, skillId: reg.id }, "Plugin skill registered");
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
pluginSkillIdsByPlugin.set(pluginName, ownedIds);
|
|
200
|
-
pluginRefCount.set(pluginName, 1);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Decrement the ref count for a plugin's skills. When the count hits zero
|
|
205
|
-
* the plugin's contributed skills are removed from the in-memory catalog.
|
|
206
|
-
*
|
|
207
|
-
* Idempotent — calling on a plugin that was never registered is a no-op
|
|
208
|
-
* (logged at debug level).
|
|
209
|
-
*/
|
|
210
|
-
export function unregisterPluginSkills(pluginName: string): void {
|
|
211
|
-
const current = pluginRefCount.get(pluginName) ?? 0;
|
|
212
|
-
if (current === 0) {
|
|
213
|
-
log.debug(
|
|
214
|
-
{ pluginName },
|
|
215
|
-
"unregisterPluginSkills called on unregistered plugin (no-op)",
|
|
216
|
-
);
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
if (current > 1) {
|
|
221
|
-
pluginRefCount.set(pluginName, current - 1);
|
|
222
|
-
log.info(
|
|
223
|
-
{ pluginName, remaining: current - 1 },
|
|
224
|
-
"Decremented plugin-skills ref count, skills kept",
|
|
225
|
-
);
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Last reference — actually remove the skills.
|
|
230
|
-
pluginRefCount.delete(pluginName);
|
|
231
|
-
const ownedIds = pluginSkillIdsByPlugin.get(pluginName);
|
|
232
|
-
if (ownedIds) {
|
|
233
|
-
for (const id of ownedIds) {
|
|
234
|
-
pluginSkillsById.delete(id);
|
|
235
|
-
log.info({ pluginName, skillId: id }, "Plugin skill unregistered");
|
|
236
|
-
}
|
|
237
|
-
pluginSkillIdsByPlugin.delete(pluginName);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Return a shallow-copied list of {@link SkillSummary} entries for every
|
|
243
|
-
* plugin-contributed skill. Consumers (the catalog loader) treat the return
|
|
244
|
-
* value as a read-only snapshot — mutating it does not mutate the registry.
|
|
245
|
-
*/
|
|
246
|
-
export function getPluginContributedSkillSummaries(): SkillSummary[] {
|
|
247
|
-
const out: SkillSummary[] = [];
|
|
248
|
-
for (const stored of pluginSkillsById.values()) {
|
|
249
|
-
// Strip `body` so we hand out a SkillSummary, not a SkillDefinition —
|
|
250
|
-
// the catalog merge function in config/skills.ts pushes summaries.
|
|
251
|
-
const { body: _body, ...summary } = stored.definition;
|
|
252
|
-
out.push(summary);
|
|
253
|
-
}
|
|
254
|
-
return out;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Look up the full {@link SkillDefinition} for a plugin-contributed skill by
|
|
259
|
-
* id. Used by the catalog loader to satisfy `skill_load` without a disk
|
|
260
|
-
* read.
|
|
261
|
-
*/
|
|
262
|
-
export function getPluginContributedSkillDefinition(
|
|
263
|
-
skillId: string,
|
|
264
|
-
): SkillDefinition | undefined {
|
|
265
|
-
return pluginSkillsById.get(skillId)?.definition;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Return the current ref count for a plugin's skills. Exposed for tests.
|
|
270
|
-
*/
|
|
271
|
-
export function getPluginSkillRefCount(pluginName: string): number {
|
|
272
|
-
return pluginRefCount.get(pluginName) ?? 0;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Clear every registered plugin skill. Test-only — throws when invoked
|
|
277
|
-
* outside a test environment. Guard mirrors
|
|
278
|
-
* {@link resetPluginRegistryForTests}.
|
|
279
|
-
*/
|
|
280
|
-
export function resetPluginSkillContributionsForTests(): void {
|
|
281
|
-
const isTest =
|
|
282
|
-
process.env.BUN_TEST === "1" || process.env.NODE_ENV === "test";
|
|
283
|
-
if (!isTest) {
|
|
284
|
-
throw new PluginExecutionError(
|
|
285
|
-
"resetPluginSkillContributionsForTests may only be called in test environments",
|
|
286
|
-
undefined,
|
|
287
|
-
);
|
|
288
|
-
}
|
|
289
|
-
pluginSkillsById.clear();
|
|
290
|
-
pluginRefCount.clear();
|
|
291
|
-
pluginSkillIdsByPlugin.clear();
|
|
292
|
-
}
|