@vellumai/assistant 0.11.3 → 0.11.4-dev.202608190019.b94dbf2
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/AGENTS.md +9 -3
- package/ARCHITECTURE.md +32 -10
- package/docs/architecture/memory.md +43 -5
- package/docs/architecture/security.md +96 -152
- package/docs/architecture/turn-actor.md +70 -0
- package/docs/browser-use-architecture-phase2.md +128 -56
- package/docs/flux-turn-detection-spike.md +248 -0
- package/docs/guardian-request-flow.md +35 -0
- package/docs/stt-provider-onboarding.md +3 -1
- package/knip.json +3 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +34 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +166 -1
- package/node_modules/@vellumai/gateway-client/src/index.ts +2 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
- package/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/openapi.yaml +289 -113
- package/package.json +1 -1
- package/scripts/voice-ttft-spike.ts +3 -3
- package/scripts/write-plugin-api-shim.ts +10 -0
- package/src/__tests__/app-compiler.test.ts +38 -3
- package/src/__tests__/app-control-flow.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +2 -2
- package/src/__tests__/assistant-feature-flag-guard.test.ts +25 -3
- package/src/__tests__/attachments-store.test.ts +21 -12
- package/src/__tests__/byok-default-profile-ensure.test.ts +17 -0
- package/src/__tests__/call-setup-flow-name-capture.test.ts +0 -1
- package/src/__tests__/call-site-routing-provider.test.ts +1 -1
- package/src/__tests__/channel-availability-routes.test.ts +14 -1
- package/src/__tests__/channel-capabilities-dedupe.test.ts +214 -0
- package/src/__tests__/channel-delivery-store.test.ts +14 -14
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +4 -4
- package/src/__tests__/channel-setup-panel-ack.test.ts +1 -1
- package/src/__tests__/checker.test.ts +20 -314
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +6 -2
- package/src/__tests__/compaction-events.test.ts +8 -10
- package/src/__tests__/config-loader-backfill.test.ts +3 -3
- package/src/__tests__/config-schema.test.ts +25 -10
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +8 -11
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +8 -11
- package/src/__tests__/conversation-agent-loop.test.ts +32 -21
- package/src/__tests__/conversation-attachments.test.ts +0 -1
- package/src/__tests__/conversation-attention-store.test.ts +63 -0
- package/src/__tests__/conversation-confirmation-signals.test.ts +112 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -4
- package/src/__tests__/conversation-fork-crud.test.ts +69 -0
- package/src/__tests__/conversation-fork-referential.test.ts +67 -0
- package/src/__tests__/conversation-fork-retrospective.test.ts +24 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +209 -0
- package/src/__tests__/conversation-notifiers-provenance.test.ts +59 -0
- package/src/__tests__/conversation-queue.test.ts +154 -4
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +1 -1
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +9 -9
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +1 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +187 -102
- package/src/__tests__/conversation-runtime-workspace.test.ts +14 -10
- package/src/__tests__/conversation-slash-queue.test.ts +3 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-app-open.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-history-restored-completion.test.ts +21 -14
- package/src/__tests__/conversation-surfaces-queued-emit.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-state-update.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-table-action.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +1 -1
- package/src/__tests__/credential-prompt-route.test.ts +7 -10
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/cu-unified-flow.test.ts +1 -0
- package/src/__tests__/custom-profile-ensure.test.ts +5 -1
- package/src/__tests__/default-plugin-names-guard.test.ts +12 -1
- package/src/__tests__/discord-access-request-privacy.test.ts +5 -1
- package/src/__tests__/discord-requester-notice-privacy.test.ts +3 -3
- package/src/__tests__/document-append-idempotency.test.ts +233 -0
- package/src/__tests__/document-sync-tags.test.ts +0 -75
- package/src/__tests__/dynamic-skill-background-guard.test.ts +0 -2
- package/src/__tests__/edit-propagation.test.ts +107 -11
- package/src/__tests__/file-ops-service.test.ts +163 -30
- package/src/__tests__/filesystem-tools.test.ts +23 -24
- package/src/__tests__/gateway-only-guard.test.ts +2 -5
- package/src/__tests__/helpers/gateway-classify-mock.ts +27 -6
- package/src/__tests__/helpers/mock-actor-context.ts +49 -0
- package/src/__tests__/helpers/mock-conversation.ts +13 -1
- package/src/__tests__/host-file-read-tool.test.ts +16 -19
- package/src/__tests__/http-user-message-parity.test.ts +1 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +49 -0
- package/src/__tests__/injector-chain.test.ts +63 -41
- package/src/__tests__/injector-disk-pressure.test.ts +11 -23
- package/src/__tests__/inline-skill-load-permissions.test.ts +47 -36
- package/src/__tests__/llm-context-resolution.test.ts +73 -1
- package/src/__tests__/llm-schema.test.ts +5 -2
- package/src/__tests__/managed-skill-lifecycle.test.ts +7 -0
- package/src/__tests__/mcp-list-plugin-servers.test.ts +250 -0
- package/src/__tests__/media-generate-image.test.ts +131 -21
- package/src/__tests__/memory-retrieval-hook.test.ts +100 -7
- package/src/__tests__/messages-read-boundary-guard.test.ts +134 -0
- package/src/__tests__/mtime-cache.test.ts +3 -1
- package/src/__tests__/non-member-access-request.test.ts +0 -20
- package/src/__tests__/outbound-slack-persistence.test.ts +40 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +0 -4
- package/src/__tests__/plugin-api-store-credential.test.ts +261 -0
- package/src/__tests__/plugin-api-webhook-url.test.ts +10 -7
- package/src/__tests__/plugin-disabled-state.test.ts +2 -0
- package/src/__tests__/plugin-effective-enabled-set.test.ts +55 -3
- package/src/__tests__/plugin-execution-context.test.ts +73 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +5 -1
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +7 -4
- package/src/__tests__/plugin-secret-pattern-contribution.test.ts +1 -1
- package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +14 -7
- package/src/__tests__/provider-commit-message-generator.test.ts +20 -0
- package/src/__tests__/proxy-approval-callback.test.ts +1 -0
- package/src/__tests__/qdrant-manager.test.ts +14 -1
- package/src/__tests__/reaction-persistence.test.ts +200 -7
- package/src/__tests__/require-fresh-approval.test.ts +0 -4
- package/src/__tests__/risk-classification-boundary-guard.test.ts +115 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +460 -105
- package/src/__tests__/run-due-schedules.test.ts +21 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +187 -18
- package/src/__tests__/schedule-routes.test.ts +23 -0
- package/src/__tests__/schedule-store.test.ts +17 -0
- package/src/__tests__/scoped-approval-grants.test.ts +11 -6
- package/src/__tests__/secret-ingress-channel.test.ts +0 -1
- package/src/__tests__/secret-ingress-http.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +3 -3
- package/src/__tests__/skills.test.ts +32 -0
- package/src/__tests__/slack-edit-ordering-characterization.test.ts +0 -1
- package/src/__tests__/starter-task-flow.test.ts +5 -4
- package/src/__tests__/subagent-call-site-routing.test.ts +31 -19
- package/src/__tests__/subagent-fork-prompt-role.test.ts +1 -1
- package/src/__tests__/subagent-spawn-and-await.test.ts +18 -17
- package/src/__tests__/subagent-tool-gate-mode.test.ts +1 -1
- package/src/__tests__/subagent-tools.test.ts +81 -101
- package/src/__tests__/surface-completion-in-flight-snapshot.test.ts +1 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +132 -5
- package/src/__tests__/tool-executor.test.ts +68 -39
- package/src/__tests__/turn-events-store.test.ts +43 -0
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +1 -1
- package/src/__tests__/ui-shape-teaching.test.ts +33 -0
- package/src/__tests__/ui-visual-surface.test.ts +1 -1
- package/src/__tests__/ui-voice-picker-surface.test.ts +128 -0
- package/src/__tests__/ui-work-result-surface.test.ts +1 -1
- package/src/__tests__/user-plugin-loader.test.ts +3 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
- package/src/__tests__/visible-app-context.test.ts +16 -9
- package/src/__tests__/voice-config-update.test.ts +40 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +5 -3
- package/src/__tests__/voice-session-bridge.test.ts +85 -29
- package/src/__tests__/worker-entrypoint-guards.test.ts +54 -0
- package/src/__tests__/worker-plugin-surface.test.ts +77 -0
- package/src/__tests__/workspace-migration-142-consolidate-voice-front-door.test.ts +158 -0
- package/src/__tests__/workspace-migration-143-repair-deprecated-codex-model-id.test.ts +133 -0
- package/src/__tests__/workspace-migration-144-convert-stranded-subscription-openai-profiles.test.ts +316 -0
- package/src/__tests__/workspace-migration-145-collapse-profile-bindings-to-entries.test.ts +325 -0
- package/src/__tests__/workspace-migration-146-repair-retired-fireworks-deepseek-flash-model-id.test.ts +235 -0
- package/src/acp/__tests__/acp-claude-oauth.test.ts +10 -2
- package/src/acp/__tests__/auth-required.test.ts +161 -0
- package/src/acp/acp-claude-oauth.ts +19 -2
- package/src/acp/agent-process.test.ts +100 -0
- package/src/acp/agent-process.ts +29 -26
- package/src/acp/auth-required.ts +102 -0
- package/src/acp/session-manager.test.ts +119 -0
- package/src/acp/session-manager.ts +76 -3
- package/src/api/events/acp-auth-required.ts +55 -0
- package/src/api/events/host-file.ts +2 -2
- package/src/api/index.ts +7 -0
- package/src/api/surfaces.ts +12 -3
- package/src/apps/app-store.ts +3 -0
- package/src/bundler/package-resolver.ts +2 -30
- package/src/calls/__tests__/voice-session-bridge.test.ts +194 -11
- package/src/calls/__tests__/voice-triage-escalate.test.ts +102 -0
- package/src/calls/call-controller.ts +19 -3
- package/src/calls/call-setup-flow.ts +0 -1
- package/src/calls/media-stream-stt-session.ts +15 -0
- package/src/calls/voice-session-bridge.ts +115 -41
- package/src/calls/voice-triage-escalate.ts +105 -2
- package/src/channels/__tests__/plugin-channel-declarations.test.ts +161 -0
- package/src/channels/config.ts +13 -0
- package/src/channels/plugin-channel-declarations.ts +108 -0
- package/src/channels/types.ts +30 -0
- package/src/cli/AGENTS.md +5 -2
- package/src/cli/bundled-modules.ts +29 -0
- package/src/cli/commands/credentials.help.ts +2 -2
- package/src/cli/commands/db/repair.ts +4 -8
- package/src/cli/commands/domain.ts +6 -3
- package/src/cli/commands/email.ts +6 -3
- package/src/cli/commands/inference-providers.ts +1 -1
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.help.ts +13 -4
- package/src/cli/commands/mcp.ts +9 -0
- package/src/cli/commands/memory/__tests__/memory-v2.test.ts +57 -7
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +128 -5
- package/src/cli/commands/memory/index.help.ts +84 -28
- package/src/cli/commands/memory/index.ts +2 -0
- package/src/cli/commands/memory/memory-v2.ts +58 -54
- package/src/cli/commands/memory/memory-v3.ts +64 -0
- package/src/cli/commands/memory/memory-validate.ts +18 -0
- package/src/cli/commands/plugins.ts +85 -36
- package/src/cli/commands/schedules.ts +35 -1
- package/src/cli/commands/stt.help.ts +27 -2
- package/src/cli/commands/trust.ts +3 -14
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +39 -0
- package/src/cli/lib/bundled-marketplace.json +14 -1
- package/src/cli/lib/upgrade-plugin.ts +42 -0
- package/src/config/__tests__/balanced-model-experiment.test.ts +278 -0
- package/src/config/__tests__/default-profile-catalog.test.ts +34 -2
- package/src/config/__tests__/default-provider.test.ts +6 -1
- package/src/config/__tests__/profile-materialization.test.ts +75 -19
- package/src/config/assistant-feature-flags.ts +36 -15
- package/src/config/balanced-model-experiment.ts +35 -0
- package/src/config/bundled-skills/acp/SKILL.md +6 -7
- package/src/config/bundled-skills/document-editor/SKILL.md +2 -2
- package/src/config/bundled-skills/document-editor/TOOLS.json +2 -2
- package/src/config/bundled-skills/image-studio/SKILL.md +5 -4
- package/src/config/bundled-skills/image-studio/TOOLS.json +1 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +101 -0
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +14 -4
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.test.ts +65 -0
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +7 -1
- package/src/config/bundled-skills/settings/tools/shared.ts +16 -0
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +19 -1
- package/src/config/bundled-skills/skill-management/TOOLS.json +9 -3
- package/src/config/bundled-skills/subagent/SKILL.md +17 -12
- package/src/config/bundled-skills/subagent/TOOLS.json +4 -4
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +22 -1
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +9 -2
- package/src/config/call-site-defaults.ts +11 -5
- package/src/config/default-profile-catalog.ts +179 -16
- package/src/config/default-profile-names.ts +4 -1
- package/src/config/default-provider-resolution.ts +4 -0
- package/src/config/feature-flag-registry.json +12 -12
- package/src/config/llm-context-resolution.ts +11 -3
- package/src/config/llm-resolver.ts +28 -1
- package/src/config/profile-materialization.ts +70 -22
- package/src/config/schemas/__tests__/live-voice.test.ts +107 -4
- package/src/config/schemas/call-site-catalog.ts +4 -4
- package/src/config/schemas/live-voice.ts +57 -23
- package/src/config/schemas/llm.ts +59 -32
- package/src/config/schemas/mcp.ts +23 -0
- package/src/config/schemas/plugin-updates.ts +6 -2
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/skills.ts +9 -2
- package/src/context/outbound-sanitize.ts +96 -1
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
- package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +82 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +15 -10
- package/src/daemon/conversation-agent-loop.ts +31 -19
- package/src/daemon/conversation-messaging.ts +5 -1
- package/src/daemon/conversation-notifiers.ts +20 -10
- package/src/daemon/conversation-process.ts +20 -6
- package/src/daemon/conversation-runtime-assembly.ts +12 -6
- package/src/daemon/conversation-store.ts +14 -4
- package/src/daemon/conversation-surfaces.ts +75 -26
- package/src/daemon/conversation-tool-setup.ts +3 -6
- package/src/daemon/conversation.ts +154 -51
- package/src/daemon/doordash-steps.ts +2 -2
- package/src/daemon/lifecycle.ts +14 -1
- package/src/daemon/mcp-reload-service.ts +36 -6
- package/src/daemon/process-message.ts +13 -26
- package/src/daemon/providers-setup.ts +6 -3
- package/src/daemon/trust-context-types.ts +29 -0
- package/src/daemon/trust-context.ts +12 -7
- package/src/daemon/wake-conversation-ops.ts +3 -2
- package/src/daemon/windows-compiled-entry.ts +4 -0
- package/src/documents/document-store.ts +143 -240
- package/src/hooks/hook-loader.ts +3 -3
- package/src/hooks/registry.ts +103 -45
- package/src/hooks/types.ts +5 -0
- package/src/inbound/__tests__/oauth-callback-url.test.ts +83 -0
- package/src/inbound/oauth-callback-url.ts +61 -0
- package/src/ipc/gateway-client.test.ts +1 -1
- package/src/ipc/gateway-client.ts +14 -21
- package/src/ipc/gateway-flag-listener.ts +17 -3
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +1 -104
- package/src/live-voice/__tests__/live-voice-events.test.ts +7 -8
- package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +1050 -0
- package/src/live-voice/__tests__/live-voice-metrics.test.ts +115 -8
- package/src/live-voice/__tests__/live-voice-photo.test.ts +100 -0
- package/src/live-voice/__tests__/live-voice-progress.test.ts +60 -194
- package/src/live-voice/__tests__/live-voice-stt.test.ts +14 -0
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +29 -0
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +0 -483
- package/src/live-voice/__tests__/live-voice-vad.test.ts +0 -16
- package/src/live-voice/__tests__/progress-narration.test.ts +214 -0
- package/src/live-voice/live-voice-archive.ts +2 -0
- package/src/live-voice/live-voice-manager.ts +16 -3
- package/src/live-voice/live-voice-metrics.ts +57 -32
- package/src/live-voice/live-voice-photo.ts +1 -2
- package/src/live-voice/live-voice-session.ts +598 -323
- package/src/live-voice/progress-narration.ts +277 -0
- package/src/live-voice/protocol.ts +21 -1
- package/src/live-voice/windows-compiled-live-voice.ts +4 -0
- package/src/mcp/__tests__/effective-config.test.ts +238 -0
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +200 -0
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +9 -9
- package/src/mcp/__tests__/plugin-server-credential-isolation.test.ts +95 -0
- package/src/mcp/client.ts +16 -11
- package/src/mcp/effective-config.ts +113 -0
- package/src/mcp/manager.ts +11 -6
- package/src/mcp/mcp-auth-orchestrator.ts +13 -22
- package/src/mcp/mcp-oauth-provider.ts +205 -240
- package/src/monitoring/__tests__/plugin-auto-update.test.ts +166 -3
- package/src/monitoring/control.ts +1 -0
- package/src/monitoring/db-integrity-sample.ts +4 -5
- package/src/monitoring/plugin-auto-update.ts +128 -24
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/approval-card-data.ts +33 -0
- package/src/notifications/signal.ts +1 -0
- package/src/permissions/AGENTS.md +16 -0
- package/src/permissions/checker.test.ts +75 -122
- package/src/permissions/checker.ts +44 -560
- package/src/permissions/confirmation-guardian-request.test.ts +15 -11
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/prompter.ts +1 -5
- package/src/permissions/question-guardian-request.test.ts +14 -6
- package/src/permissions/question-guardian-request.ts +1 -2
- package/src/persistence/attachments-store.ts +8 -1
- package/src/persistence/bookmark-crud.ts +3 -7
- package/src/persistence/conversation-attention-store.ts +16 -45
- package/src/persistence/conversation-crud.ts +33 -4
- package/src/persistence/conversation-lineage.ts +9 -0
- package/src/persistence/conversation-queries.ts +182 -52
- package/src/persistence/delivery-crud.ts +150 -36
- package/src/persistence/embeddings/qdrant-manager.ts +84 -49
- package/src/persistence/external-conversation-store.ts +32 -4
- package/src/persistence/llm-request-log-store.ts +4 -10
- package/src/persistence/llm-usage-store.ts +8 -3
- package/src/persistence/message-reads.test.ts +197 -0
- package/src/persistence/message-reads.ts +211 -0
- package/src/persistence/migrations/360-add-document-workspace-path.ts +5 -14
- package/src/persistence/migrations/366-chatgpt-subscription-row-identity.test.ts +120 -0
- package/src/persistence/migrations/366-chatgpt-subscription-row-identity.ts +62 -0
- package/src/persistence/real-user-turn-filter.ts +27 -3
- package/src/persistence/schema/documents.ts +4 -4
- package/src/persistence/steps.ts +9 -0
- package/src/plugin-api/__tests__/oauth-callback-url-export.test.ts +29 -0
- package/src/plugin-api/constants.ts +8 -0
- package/src/plugin-api/conversation-turn.ts +195 -5
- package/src/plugin-api/index.ts +38 -6
- package/src/plugin-api/resolve-credential.ts +3 -2
- package/src/plugin-api/store-credential.ts +146 -0
- package/src/plugin-api/vision-support.test.ts +1 -1
- package/src/plugin-api/webhook-url.ts +13 -11
- package/src/plugins/__tests__/mcp-servers.test.ts +371 -0
- package/src/plugins/defaults/main.ts +21 -7
- package/src/plugins/defaults/memory/AGENTS.md +15 -3
- package/src/plugins/defaults/memory/__tests__/buffer-format.test.ts +204 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +72 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +4 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +4 -1
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -1
- package/src/plugins/defaults/memory/buffer-format.ts +165 -0
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +6 -0
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +77 -0
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +24 -6
- package/src/plugins/defaults/memory/graph/image-ref-utils.ts +3 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +1 -30
- package/src/plugins/defaults/memory/graph-topology/pending-buffer.test.ts +34 -0
- package/src/plugins/defaults/memory/graph-topology/pending-buffer.ts +17 -24
- package/src/plugins/defaults/memory/hooks/post-compact.ts +1 -4
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +53 -5
- package/src/plugins/defaults/memory/indexer.ts +3 -1
- package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +19 -7
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +4 -4
- package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +281 -0
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +12 -10
- package/src/plugins/defaults/memory/src/memory-v3-routes.ts +207 -0
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +147 -0
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-prompt-flag-gating-guard.test.ts +8 -0
- package/src/plugins/defaults/memory/substrate/__tests__/edge-index.test.ts +0 -30
- package/src/plugins/defaults/memory/substrate/__tests__/ingest.test.ts +73 -1
- package/src/plugins/defaults/memory/substrate/__tests__/page-index.test.ts +37 -0
- package/src/plugins/defaults/memory/substrate/__tests__/page-links.test.ts +208 -0
- package/src/plugins/defaults/memory/substrate/__tests__/prompts-consolidation.test.ts +158 -1
- package/src/plugins/defaults/memory/substrate/__tests__/static-context.test.ts +195 -58
- package/src/plugins/defaults/memory/substrate/consolidation-job.ts +93 -24
- package/src/plugins/defaults/memory/substrate/edge-index.ts +0 -31
- package/src/plugins/defaults/memory/substrate/ingest.ts +59 -0
- package/src/plugins/defaults/memory/substrate/page-index.ts +35 -8
- package/src/plugins/defaults/memory/substrate/page-links.ts +133 -0
- package/src/plugins/defaults/memory/substrate/page-store.ts +10 -0
- package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +124 -34
- package/src/plugins/defaults/memory/substrate/skill-content.ts +8 -1
- package/src/plugins/defaults/memory/substrate/static-context.ts +160 -33
- package/src/plugins/defaults/memory/substrate/sweep-job.ts +2 -4
- package/src/plugins/defaults/memory/v1/graph/extraction.ts +3 -1
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +18 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +66 -1
- package/src/plugins/defaults/memory/v3/card.ts +9 -9
- package/src/plugins/defaults/memory/v3/core-set.test.ts +7 -0
- package/src/plugins/defaults/memory/v3/core-set.ts +5 -1
- package/src/plugins/defaults/memory/v3/edge.ts +13 -57
- package/src/plugins/defaults/memory/v3/injector.ts +8 -0
- package/src/plugins/defaults/memory/v3/prune.ts +2 -0
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +2 -0
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +23 -9
- package/src/plugins/defaults/memory/worker-control.ts +1 -0
- package/src/plugins/defaults/memory/worker.ts +6 -3
- package/src/plugins/defaults/worker-entrypoints.ts +3 -0
- package/src/plugins/external-plugin-loader.ts +47 -0
- package/src/plugins/mcp-servers.ts +361 -0
- package/src/plugins/mtime-cache.ts +37 -46
- package/src/plugins/pipeline.ts +14 -7
- package/src/plugins/plugin-execution-context.ts +35 -11
- package/src/plugins/worker-plugin-surface.ts +33 -0
- package/src/prompts/templates/system-sections.ts +0 -7
- package/src/providers/__tests__/connection-model-compat.test.ts +1 -1
- package/src/providers/__tests__/context-overflow-error.test.ts +24 -0
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +214 -2
- package/src/providers/__tests__/preflight-resolved-config.test.ts +57 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -2
- package/src/providers/anthropic/__tests__/pause-turn-continuation.test.ts +170 -0
- package/src/providers/anthropic/client.ts +332 -241
- package/src/providers/call-site-routing.ts +30 -3
- package/src/providers/connection-resolution.ts +194 -11
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +4 -0
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/inference/auth.ts +6 -0
- package/src/providers/inference/connection-availability.ts +24 -2
- package/src/providers/inference/connections.ts +2 -0
- package/src/providers/model-catalog.ts +3 -3
- package/src/providers/model-intents.ts +28 -8
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +163 -40
- package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +125 -2
- package/src/providers/openai/chat-completions-provider.ts +133 -36
- package/src/providers/openai/codex-models.ts +2 -1
- package/src/providers/provider-send-message.ts +32 -3
- package/src/providers/speech-to-text/__tests__/deepgram-flux-frames.test.ts +433 -0
- package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +625 -0
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +34 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +285 -6
- package/src/providers/speech-to-text/deepgram-flux-frames.ts +395 -0
- package/src/providers/speech-to-text/deepgram-flux-realtime.ts +679 -0
- package/src/providers/speech-to-text/provider-catalog.ts +99 -8
- package/src/providers/speech-to-text/resolve.ts +25 -2
- package/src/routes/control.ts +1 -0
- package/src/routes/route-host-client.ts +1 -0
- package/src/routes/route-host-protocol.ts +7 -0
- package/src/routes/worker.ts +48 -15
- package/src/runtime/AGENTS.md +16 -17
- package/src/runtime/access-request-helper.ts +9 -12
- package/src/runtime/agent-wake.ts +18 -15
- package/src/runtime/effective-capabilities.test.ts +43 -0
- package/src/runtime/effective-capabilities.ts +27 -0
- package/src/runtime/guardian-reply-router.ts +6 -2
- package/src/runtime/pre-first-message-gate.ts +4 -0
- package/src/runtime/routes/__tests__/acp-claude-auth-routes.test.ts +12 -4
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +522 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +52 -0
- package/src/runtime/routes/__tests__/default-provider-routes.test.ts +61 -0
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +44 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +102 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +132 -35
- package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +215 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +25 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +55 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +52 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +133 -1
- package/src/runtime/routes/channel-availability-routes.ts +32 -14
- package/src/runtime/routes/channel-route-shared.ts +0 -6
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +6 -6
- package/src/runtime/routes/conversation-list-routes.ts +181 -23
- package/src/runtime/routes/conversation-management-routes.ts +17 -12
- package/src/runtime/routes/conversation-query-routes.ts +40 -27
- package/src/runtime/routes/conversation-routes.ts +43 -29
- package/src/runtime/routes/credential-prompt-routes.ts +4 -7
- package/src/runtime/routes/credential-routes.ts +26 -82
- package/src/runtime/routes/default-provider-routes.ts +15 -0
- package/src/runtime/routes/documents-routes.ts +3 -222
- package/src/runtime/routes/inbound-message-handler.ts +21 -45
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +0 -1
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -9
- package/src/runtime/routes/inbound-stages/admission-policy.ts +1 -17
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.test.ts +0 -1
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +2 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +101 -79
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +0 -1
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +12 -7
- package/src/runtime/routes/inbound-stages/reaction-intercept.test.ts +91 -8
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +72 -79
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +2 -3
- package/src/runtime/routes/inference-profiles-routes.ts +20 -11
- package/src/runtime/routes/inference-provider-connection-routes.ts +77 -15
- package/src/runtime/routes/log-export-routes.ts +3 -0
- package/src/runtime/routes/mcp-auth-routes.ts +148 -57
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +2 -0
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +3 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -2
- package/src/runtime/routes/playground/reset-circuit.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +38 -8
- package/src/runtime/routes/schedule-routes.ts +94 -7
- package/src/runtime/routes/settings-routes.ts +6 -6
- package/src/runtime/routes/stt-routes.ts +31 -25
- package/src/runtime/routes/surface-action-routes.ts +20 -19
- package/src/runtime/routes/surface-conversation-resolver.ts +3 -0
- package/src/runtime/routes/user-route-dispatcher.ts +69 -15
- package/src/runtime/routes/user-route-import.ts +108 -0
- package/src/runtime/routes/user-route-resolution.ts +18 -1
- package/src/runtime/routes/workspace-routes.ts +0 -9
- package/src/runtime/routes/workspace-utils.ts +3 -13
- package/src/runtime/services/conversation-serializer.ts +7 -2
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +68 -5
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +81 -0
- package/src/schedule/plugin-schedule-availability.ts +58 -0
- package/src/schedule/plugin-schedule-declarations.ts +23 -27
- package/src/schedule/plugin-schedule-reconciler.ts +12 -3
- package/src/schedule/schedule-store.ts +5 -1
- package/src/schedule/scheduler.ts +9 -4
- package/src/schedule/worker-control.ts +1 -0
- package/src/schedule/worker.ts +6 -0
- package/src/security/oauth2.ts +6 -22
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +22 -0
- package/src/stt/__tests__/types.test.ts +94 -0
- package/src/stt/daemon-batch-transcriber.ts +10 -0
- package/src/stt/stt-stream-session.ts +8 -4
- package/src/stt/types.ts +103 -0
- package/src/subagent/__tests__/consult-prompt.test.ts +26 -15
- package/src/subagent/consult-context.ts +11 -11
- package/src/subagent/consult-prompt.ts +26 -35
- package/src/subagent/manager.ts +21 -40
- package/src/subagent/notify.ts +7 -1
- package/src/subagent/types.ts +15 -12
- package/src/tools/__tests__/tool-input-schemas.test.ts +7 -7
- package/src/tools/acp/spawn.test.ts +97 -0
- package/src/tools/acp/spawn.ts +38 -4
- package/src/tools/credentials/ref-parse.ts +35 -0
- package/src/tools/credentials/resolve.ts +4 -10
- package/src/tools/credentials/store.ts +168 -0
- package/src/tools/document/document-tool.ts +12 -3
- package/src/tools/executor.ts +53 -15
- package/src/tools/filesystem/read.ts +27 -10
- package/src/tools/host-filesystem/read.ts +27 -15
- package/src/tools/network/url-safety.ts +9 -16
- package/src/tools/permission-checker.ts +43 -52
- package/src/tools/registry.ts +2 -1
- package/src/tools/shared/filesystem/file-ops-service.ts +63 -35
- package/src/tools/shared/filesystem/legacy-read-args.ts +22 -0
- package/src/tools/shared/filesystem/types.ts +5 -5
- package/src/tools/skills/scaffold-managed.ts +25 -7
- package/src/tools/subagent/spawn.ts +28 -88
- package/src/tools/tool-types.ts +26 -13
- package/src/tools/types.ts +6 -6
- package/src/tools/ui-surface/surface-shape-docs.ts +12 -1
- package/src/tools/workflows/run-workflow.ts +1 -2
- package/src/tts/__tests__/reasoning-tag-filter.test.ts +78 -0
- package/src/tts/reasoning-tag-filter.ts +89 -0
- package/src/util/__tests__/worker-process-command.test.ts +37 -0
- package/src/util/logger.ts +16 -0
- package/src/util/think-tag-stream.ts +95 -0
- package/src/util/worker-process.ts +37 -4
- package/src/windows-compiled-cli.ts +32 -0
- package/src/windows-compiled-entry.ts +4 -0
- package/src/windows-compiled-logger.ts +6 -0
- package/src/windows-compiled-worker-entry.ts +29 -0
- package/src/workspace/byok-default-profile-ensure.ts +76 -24
- package/src/workspace/custom-profile-ensure.ts +4 -24
- package/src/workspace/migrations/142-consolidate-voice-front-door.ts +70 -0
- package/src/workspace/migrations/143-repair-deprecated-codex-model-id.ts +134 -0
- package/src/workspace/migrations/144-convert-stranded-subscription-openai-profiles.ts +265 -0
- package/src/workspace/migrations/145-collapse-profile-bindings-to-entries.ts +328 -0
- package/src/workspace/migrations/146-repair-retired-fireworks-deepseek-flash-model-id.ts +195 -0
- package/src/workspace/migrations/__tests__/141-stt-english-default-to-multilingual.test.ts +0 -10
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/workspace/provider-commit-message-generator.ts +7 -5
- package/src/__tests__/document-workspace-file.test.ts +0 -467
- package/src/live-voice/__tests__/front-decision.test.ts +0 -645
- package/src/live-voice/front-decision.ts +0 -476
- package/src/permissions/ipc-risk-types.ts +0 -143
- package/src/permissions/risk-types.ts +0 -76
- package/src/subagent/__tests__/consult-transcript.test.ts +0 -184
- package/src/subagent/consult-transcript.ts +0 -90
|
@@ -25,6 +25,7 @@ import type {
|
|
|
25
25
|
MemoryEvalTallyResult,
|
|
26
26
|
} from "../../../plugins/defaults/memory/src/memory-eval-routes.js";
|
|
27
27
|
import type {
|
|
28
|
+
GateStatsResponse,
|
|
28
29
|
MemoryV3BackfillSectionsResult,
|
|
29
30
|
MemoryV3RebuildIndexResult,
|
|
30
31
|
} from "../../../plugins/defaults/memory/src/memory-v3-routes.js";
|
|
@@ -52,6 +53,36 @@ function collectRepeatable(value: string, acc: string[]): string[] {
|
|
|
52
53
|
return [...acc, value];
|
|
53
54
|
}
|
|
54
55
|
|
|
56
|
+
/** Render gate-stats as a human-readable table. */
|
|
57
|
+
function formatGateStats(r: GateStatsResponse): string {
|
|
58
|
+
const lines: string[] = [
|
|
59
|
+
`Gate-stats (last ${r.lookbackDays} day${r.lookbackDays === 1 ? "" : "s"}, ${r.totalRuns} run${r.totalRuns === 1 ? "" : "s"})`,
|
|
60
|
+
"",
|
|
61
|
+
`Bucket Total Scored Passed ScoredPassRate Top reasons`,
|
|
62
|
+
];
|
|
63
|
+
for (const b of r.buckets) {
|
|
64
|
+
const rate =
|
|
65
|
+
b.scoredPassRate !== null
|
|
66
|
+
? `${(b.scoredPassRate * 100).toFixed(1)}%`
|
|
67
|
+
: "n/a";
|
|
68
|
+
const topReasons = Object.entries(b.reasons)
|
|
69
|
+
.sort(([, a], [, bv]) => (bv as number) - (a as number))
|
|
70
|
+
.slice(0, 3)
|
|
71
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
72
|
+
.join(", ");
|
|
73
|
+
lines.push(
|
|
74
|
+
`${b.pageCountRange.padEnd(10)} ${String(b.total).padStart(5)} ${String(b.scored).padStart(6)} ${String(b.passed).padStart(6)} ${rate.padStart(14)} ${topReasons}`,
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
if (r.unknownPageCount.total > 0) {
|
|
78
|
+
lines.push("");
|
|
79
|
+
lines.push(
|
|
80
|
+
`Unknown page count: ${r.unknownPageCount.total} total, ${r.unknownPageCount.passed} passed`,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
return lines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
|
|
55
86
|
/**
|
|
56
87
|
* Read the `turn` ids from a prior run's `key.json` or `packets.json` (both are
|
|
57
88
|
* arrays of objects carrying a `turn` field). Used to pin `--turns-file` so a
|
|
@@ -271,4 +302,37 @@ export function registerMemoryV3Command(memory: Command): void {
|
|
|
271
302
|
log.info(formatTally(payload));
|
|
272
303
|
},
|
|
273
304
|
);
|
|
305
|
+
|
|
306
|
+
// ── gate-stats ────────────────────────────────────────────────────────
|
|
307
|
+
// Reads the telemetry DB directly — no daemon required.
|
|
308
|
+
|
|
309
|
+
subcommand(v3, "gate-stats").action(
|
|
310
|
+
async (opts: { lookbackDays: string; json?: boolean }) => {
|
|
311
|
+
const lookbackDays = Number(opts.lookbackDays);
|
|
312
|
+
const [{ handleMemoryV3GateStats }, { getTelemetrySqlite }] =
|
|
313
|
+
await Promise.all([
|
|
314
|
+
import("../../../plugins/defaults/memory/src/memory-v3-routes.js"),
|
|
315
|
+
import("../../../persistence/db-connection.js"),
|
|
316
|
+
]);
|
|
317
|
+
let payload;
|
|
318
|
+
try {
|
|
319
|
+
payload = handleMemoryV3GateStats(
|
|
320
|
+
Number.isFinite(lookbackDays) ? lookbackDays : 30,
|
|
321
|
+
getTelemetrySqlite(),
|
|
322
|
+
);
|
|
323
|
+
} catch (err) {
|
|
324
|
+
log.error(
|
|
325
|
+
"Failed to read gate stats: %s",
|
|
326
|
+
err instanceof Error ? err.message : String(err),
|
|
327
|
+
);
|
|
328
|
+
process.exitCode = 1;
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
if (opts.json === true) {
|
|
332
|
+
log.info(JSON.stringify(payload, null, 2));
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
log.info(formatGateStats(payload));
|
|
336
|
+
},
|
|
337
|
+
);
|
|
274
338
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `assistant memory validate`: the read-only concept-page diagnostic.
|
|
3
|
+
*
|
|
4
|
+
* The report covers the concept-page substrate, which is the same store
|
|
5
|
+
* under memory v2 and v3, so the command is tier-agnostic. The report
|
|
6
|
+
* function lives in `memory-v2.ts` (the host file already allowed to read
|
|
7
|
+
* the memory plugin's route types) and is also registered there as
|
|
8
|
+
* `assistant memory v2 validate` for as long as that namespace exists.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { Command } from "commander";
|
|
12
|
+
|
|
13
|
+
import { subcommand } from "../../lib/cli-command-help.js";
|
|
14
|
+
import { runMemoryValidate } from "./memory-v2.js";
|
|
15
|
+
|
|
16
|
+
export function registerMemoryValidateCommand(memory: Command): void {
|
|
17
|
+
subcommand(memory, "validate").action(runMemoryValidate);
|
|
18
|
+
}
|
|
@@ -15,6 +15,7 @@ import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
|
15
15
|
import { stripAnsiAndControlChars } from "../../util/ansi.js";
|
|
16
16
|
import { getWorkspacePluginsDir } from "../../util/platform.js";
|
|
17
17
|
import { truncate } from "../../util/truncate.js";
|
|
18
|
+
import { resolveBundledCliModule } from "../bundled-modules.js";
|
|
18
19
|
import { yellow } from "../lib/cli-colors.js";
|
|
19
20
|
import { applyCommandHelp, subcommand } from "../lib/cli-command-help.js";
|
|
20
21
|
import { confirmPrompt } from "../lib/confirm-prompt.js";
|
|
@@ -61,64 +62,112 @@ const loadModule = createRequire(import.meta.url);
|
|
|
61
62
|
/** Lazy accessors: each getter loads its implementation module on first use. */
|
|
62
63
|
const libs = {
|
|
63
64
|
get catalogCache() {
|
|
64
|
-
return
|
|
65
|
-
"
|
|
66
|
-
|
|
65
|
+
return resolveBundledCliModule(
|
|
66
|
+
"pluginCatalogCache",
|
|
67
|
+
() =>
|
|
68
|
+
loadModule(
|
|
69
|
+
"../lib/plugin-catalog-cache.js",
|
|
70
|
+
) as typeof import("../lib/plugin-catalog-cache.js"),
|
|
71
|
+
);
|
|
67
72
|
},
|
|
68
73
|
get catalogLocal() {
|
|
69
|
-
return
|
|
70
|
-
"
|
|
71
|
-
|
|
74
|
+
return resolveBundledCliModule(
|
|
75
|
+
"pluginCatalogLocal",
|
|
76
|
+
() =>
|
|
77
|
+
loadModule(
|
|
78
|
+
"../lib/plugin-catalog-local.js",
|
|
79
|
+
) as typeof import("../lib/plugin-catalog-local.js"),
|
|
80
|
+
);
|
|
72
81
|
},
|
|
73
82
|
get diff() {
|
|
74
|
-
return
|
|
75
|
-
"
|
|
76
|
-
|
|
83
|
+
return resolveBundledCliModule(
|
|
84
|
+
"pluginDiff",
|
|
85
|
+
() =>
|
|
86
|
+
loadModule(
|
|
87
|
+
"../lib/diff-plugin.js",
|
|
88
|
+
) as typeof import("../lib/diff-plugin.js"),
|
|
89
|
+
);
|
|
77
90
|
},
|
|
78
91
|
get inspect() {
|
|
79
|
-
return
|
|
80
|
-
"
|
|
81
|
-
|
|
92
|
+
return resolveBundledCliModule(
|
|
93
|
+
"pluginInspect",
|
|
94
|
+
() =>
|
|
95
|
+
loadModule(
|
|
96
|
+
"../lib/inspect-plugin.js",
|
|
97
|
+
) as typeof import("../lib/inspect-plugin.js"),
|
|
98
|
+
);
|
|
82
99
|
},
|
|
83
100
|
get installGitHub() {
|
|
84
|
-
return
|
|
85
|
-
"
|
|
86
|
-
|
|
101
|
+
return resolveBundledCliModule(
|
|
102
|
+
"pluginInstallGitHub",
|
|
103
|
+
() =>
|
|
104
|
+
loadModule(
|
|
105
|
+
"../lib/install-from-github.js",
|
|
106
|
+
) as typeof import("../lib/install-from-github.js"),
|
|
107
|
+
);
|
|
87
108
|
},
|
|
88
109
|
get installPlatform() {
|
|
89
|
-
return
|
|
90
|
-
"
|
|
91
|
-
|
|
110
|
+
return resolveBundledCliModule(
|
|
111
|
+
"pluginInstallPlatform",
|
|
112
|
+
() =>
|
|
113
|
+
loadModule(
|
|
114
|
+
"../lib/install-from-platform.js",
|
|
115
|
+
) as typeof import("../lib/install-from-platform.js"),
|
|
116
|
+
);
|
|
92
117
|
},
|
|
93
118
|
get installed() {
|
|
94
|
-
return
|
|
95
|
-
"
|
|
96
|
-
|
|
119
|
+
return resolveBundledCliModule(
|
|
120
|
+
"pluginInstalled",
|
|
121
|
+
() =>
|
|
122
|
+
loadModule(
|
|
123
|
+
"../lib/list-installed-plugins.js",
|
|
124
|
+
) as typeof import("../lib/list-installed-plugins.js"),
|
|
125
|
+
);
|
|
97
126
|
},
|
|
98
127
|
get pinHistory() {
|
|
99
|
-
return
|
|
100
|
-
"
|
|
101
|
-
|
|
128
|
+
return resolveBundledCliModule(
|
|
129
|
+
"pluginPinHistory",
|
|
130
|
+
() =>
|
|
131
|
+
loadModule(
|
|
132
|
+
"../lib/plugin-pin-history.js",
|
|
133
|
+
) as typeof import("../lib/plugin-pin-history.js"),
|
|
134
|
+
);
|
|
102
135
|
},
|
|
103
136
|
get search() {
|
|
104
|
-
return
|
|
105
|
-
"
|
|
106
|
-
|
|
137
|
+
return resolveBundledCliModule(
|
|
138
|
+
"pluginSearch",
|
|
139
|
+
() =>
|
|
140
|
+
loadModule(
|
|
141
|
+
"../lib/search-plugins.js",
|
|
142
|
+
) as typeof import("../lib/search-plugins.js"),
|
|
143
|
+
);
|
|
107
144
|
},
|
|
108
145
|
get surfaces() {
|
|
109
|
-
return
|
|
110
|
-
"
|
|
111
|
-
|
|
146
|
+
return resolveBundledCliModule(
|
|
147
|
+
"pluginSurfaces",
|
|
148
|
+
() =>
|
|
149
|
+
loadModule(
|
|
150
|
+
"../lib/plugin-surfaces.js",
|
|
151
|
+
) as typeof import("../lib/plugin-surfaces.js"),
|
|
152
|
+
);
|
|
112
153
|
},
|
|
113
154
|
get uninstall() {
|
|
114
|
-
return
|
|
115
|
-
"
|
|
116
|
-
|
|
155
|
+
return resolveBundledCliModule(
|
|
156
|
+
"pluginUninstall",
|
|
157
|
+
() =>
|
|
158
|
+
loadModule(
|
|
159
|
+
"../lib/uninstall-plugin.js",
|
|
160
|
+
) as typeof import("../lib/uninstall-plugin.js"),
|
|
161
|
+
);
|
|
117
162
|
},
|
|
118
163
|
get upgrade() {
|
|
119
|
-
return
|
|
120
|
-
"
|
|
121
|
-
|
|
164
|
+
return resolveBundledCliModule(
|
|
165
|
+
"pluginUpgrade",
|
|
166
|
+
() =>
|
|
167
|
+
loadModule(
|
|
168
|
+
"../lib/upgrade-plugin.js",
|
|
169
|
+
) as typeof import("../lib/upgrade-plugin.js"),
|
|
170
|
+
);
|
|
122
171
|
},
|
|
123
172
|
};
|
|
124
173
|
|
|
@@ -39,9 +39,39 @@ interface ScheduleRecord {
|
|
|
39
39
|
wakeConversationId: string | null;
|
|
40
40
|
sourceKey: string | null;
|
|
41
41
|
userEnabled: boolean | null;
|
|
42
|
+
disarmReason: string | null;
|
|
42
43
|
isOneShot: boolean;
|
|
43
44
|
}
|
|
44
45
|
|
|
46
|
+
/** Plain-language copy for each `disarmReason` the daemon sends. */
|
|
47
|
+
const DISARM_REASON_TEXT: Record<string, string> = {
|
|
48
|
+
user_disabled: "turned off by you",
|
|
49
|
+
plugin_removed: "plugin removed",
|
|
50
|
+
plugin_disabled: "plugin disabled",
|
|
51
|
+
declaration_removed: "removed from plugin",
|
|
52
|
+
declaration_disabled: "paused by plugin",
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Why a schedule is off, when the daemon knows. An off row with no reason (an
|
|
57
|
+
* imperative schedule, or a plugin row from a daemon that predates the field)
|
|
58
|
+
* reads as plain "disabled".
|
|
59
|
+
*/
|
|
60
|
+
function describeDisarmReason(schedule: ScheduleRecord): string | null {
|
|
61
|
+
if (schedule.enabled || !schedule.disarmReason) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return DISARM_REASON_TEXT[schedule.disarmReason] ?? null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function formatEnabledCell(schedule: ScheduleRecord): string {
|
|
68
|
+
if (schedule.enabled) {
|
|
69
|
+
return "enabled";
|
|
70
|
+
}
|
|
71
|
+
const reason = describeDisarmReason(schedule);
|
|
72
|
+
return reason ? `off (${reason})` : "disabled";
|
|
73
|
+
}
|
|
74
|
+
|
|
45
75
|
interface ListSchedulesResponse {
|
|
46
76
|
schedules: ScheduleRecord[];
|
|
47
77
|
}
|
|
@@ -116,7 +146,7 @@ export function registerSchedulesCommand(program: Command): void {
|
|
|
116
146
|
const rows = entries.map((schedule) => ({
|
|
117
147
|
id: schedule.id,
|
|
118
148
|
name: schedule.name,
|
|
119
|
-
enabled: schedule
|
|
149
|
+
enabled: formatEnabledCell(schedule),
|
|
120
150
|
mode: schedule.mode,
|
|
121
151
|
source: describeScheduleSource(schedule.sourceKey) ?? "",
|
|
122
152
|
schedule: describeSchedule(schedule),
|
|
@@ -247,6 +277,10 @@ export function registerSchedulesCommand(program: Command): void {
|
|
|
247
277
|
["Source conversation", schedule.createdFromConversationId ?? "—"],
|
|
248
278
|
["Plugin", describeScheduleSource(schedule.sourceKey) ?? "-"],
|
|
249
279
|
];
|
|
280
|
+
const disarmReason = describeDisarmReason(schedule);
|
|
281
|
+
if (disarmReason) {
|
|
282
|
+
fields.push(["Paused", disarmReason]);
|
|
283
|
+
}
|
|
250
284
|
const labelWidth = Math.max(...fields.map(([label]) => label.length));
|
|
251
285
|
for (const [label, value] of fields) {
|
|
252
286
|
log.info(`${`${label}:`.padEnd(labelWidth + 2)}${value}`);
|
|
@@ -1,7 +1,31 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Declarative help for the `assistant stt` command.
|
|
3
|
+
*
|
|
4
|
+
* The advertised provider list is derived from the STT provider catalog, the
|
|
5
|
+
* single source of truth for which providers exist and which boundaries they
|
|
6
|
+
* serve, so the help cannot drift from what the daemon actually accepts.
|
|
7
|
+
*/
|
|
2
8
|
|
|
9
|
+
// provider-catalog is an execution-free data leaf (a literal map behind
|
|
10
|
+
// type-only imports, no adapter or credential graph), consumed synchronously
|
|
11
|
+
// to derive this module's constant. Pure data from pure data, so a lazy
|
|
12
|
+
// `import()` has nothing to defer.
|
|
13
|
+
// eslint-disable-next-line cli/no-daemon-internals
|
|
14
|
+
import {
|
|
15
|
+
listProviderIds,
|
|
16
|
+
supportsBoundary,
|
|
17
|
+
} from "../../providers/speech-to-text/provider-catalog.js";
|
|
3
18
|
import type { CliCommandHelp } from "../lib/cli-command-help.js";
|
|
4
19
|
|
|
20
|
+
/**
|
|
21
|
+
* `stt transcribe` runs the `daemon-batch` boundary, so streaming-only
|
|
22
|
+
* providers are omitted: naming one would advertise a configuration that
|
|
23
|
+
* fails on every file.
|
|
24
|
+
*/
|
|
25
|
+
const batchProviders = listProviderIds()
|
|
26
|
+
.filter((id) => supportsBoundary(id, "daemon-batch"))
|
|
27
|
+
.join(", ");
|
|
28
|
+
|
|
5
29
|
export const sttHelp: CliCommandHelp = {
|
|
6
30
|
name: "stt",
|
|
7
31
|
description: "Speech-to-text operations",
|
|
@@ -11,7 +35,8 @@ audio and video files. The provider is set via:
|
|
|
11
35
|
|
|
12
36
|
$ assistant config set services.stt.provider <provider>
|
|
13
37
|
|
|
14
|
-
Supported providers:
|
|
38
|
+
Supported providers: ${batchProviders}.
|
|
39
|
+
Streaming-only providers serve live speech and cannot transcribe files.
|
|
15
40
|
|
|
16
41
|
Examples:
|
|
17
42
|
$ assistant stt transcribe --file /path/to/meeting.wav
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* IPC route (`trust_rules_list`).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import type { TrustRulesListIpcResponse } from "@vellumai/gateway-client";
|
|
8
9
|
import type { Command } from "commander";
|
|
9
10
|
|
|
10
11
|
import { cliIpcCall } from "../../ipc/cli-client.js";
|
|
@@ -13,18 +14,6 @@ import { registerCommand } from "../lib/register-command.js";
|
|
|
13
14
|
import { log } from "../logger.js";
|
|
14
15
|
import { trustHelp } from "./trust.help.js";
|
|
15
16
|
|
|
16
|
-
// -- Types --------------------------------------------------------------------
|
|
17
|
-
|
|
18
|
-
interface TrustRule {
|
|
19
|
-
id: string;
|
|
20
|
-
tool: string;
|
|
21
|
-
pattern: string;
|
|
22
|
-
risk: string;
|
|
23
|
-
origin: string;
|
|
24
|
-
userModified: boolean;
|
|
25
|
-
updatedAt: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
17
|
// -- Registration -------------------------------------------------------------
|
|
29
18
|
|
|
30
19
|
export function registerTrustCommand(program: Command): void {
|
|
@@ -44,7 +33,7 @@ export function registerTrustCommand(program: Command): void {
|
|
|
44
33
|
...(opts.tool ? { tool: opts.tool } : {}),
|
|
45
34
|
};
|
|
46
35
|
|
|
47
|
-
const result = await cliIpcCall<
|
|
36
|
+
const result = await cliIpcCall<TrustRulesListIpcResponse>(
|
|
48
37
|
"trust_rules_list",
|
|
49
38
|
{ body: params },
|
|
50
39
|
);
|
|
@@ -86,7 +75,7 @@ export function registerTrustCommand(program: Command): void {
|
|
|
86
75
|
"MODIFIED",
|
|
87
76
|
];
|
|
88
77
|
|
|
89
|
-
const rows: string[][] = rules.map((r
|
|
78
|
+
const rows: string[][] = rules.map((r) => [
|
|
90
79
|
r.id.slice(0, 16),
|
|
91
80
|
r.tool,
|
|
92
81
|
r.pattern,
|
|
@@ -32,6 +32,7 @@ import { computeFingerprint } from "../plugin-fingerprint.js";
|
|
|
32
32
|
import { PluginNotInstalledError } from "../uninstall-plugin.js";
|
|
33
33
|
import {
|
|
34
34
|
PluginMergeBaselineError,
|
|
35
|
+
PluginNotCuratedError,
|
|
35
36
|
PluginNotUpgradableError,
|
|
36
37
|
upgradePlugin,
|
|
37
38
|
} from "../upgrade-plugin.js";
|
|
@@ -574,6 +575,44 @@ describe("upgradePlugin — direct GitHub-URL installs", () => {
|
|
|
574
575
|
expect(calls[0]?.[0]).toBe("ls-remote");
|
|
575
576
|
});
|
|
576
577
|
|
|
578
|
+
test("marketplaceOnly refuses the direct path instead of following the ref", async () => {
|
|
579
|
+
// GIVEN a direct install tracking `main` at SHA_A, absent from the
|
|
580
|
+
// marketplace, whose branch has advanced to SHA_B
|
|
581
|
+
installCopy(pluginsDir, "level-up", { commit: SHA_A, ref: "main" });
|
|
582
|
+
const fetch = makeFetch({ manifest: undefined });
|
|
583
|
+
const calls: string[][] = [];
|
|
584
|
+
const runGit = directGitRunner({ main: SHA_B }, SHA_B, { calls });
|
|
585
|
+
|
|
586
|
+
// WHEN a caller that only accepts a curated pin asks for the upgrade
|
|
587
|
+
const upgrade = upgradePlugin(
|
|
588
|
+
{ name: "level-up", marketplaceOnly: true },
|
|
589
|
+
{ fetch, runGit, workspacePluginsDir: pluginsDir },
|
|
590
|
+
);
|
|
591
|
+
|
|
592
|
+
// THEN it is refused, and the mutable ref is never even resolved
|
|
593
|
+
await expect(upgrade).rejects.toThrow(PluginNotCuratedError);
|
|
594
|
+
expect(calls).toEqual([]);
|
|
595
|
+
// AND the install stays exactly where it was
|
|
596
|
+
expect(sidecarCommit(pluginsDir, "level-up")).toBe(SHA_A);
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
test("marketplaceOnly still upgrades a plugin the catalog claims", async () => {
|
|
600
|
+
// GIVEN an install the marketplace pins at SHA_B
|
|
601
|
+
installCopy(pluginsDir, "level-up", { commit: SHA_A });
|
|
602
|
+
const fetch = makeFetch({ manifest: manifestWith("level-up", SHA_B) });
|
|
603
|
+
const runGit = fakeGitRunner(SHA_B);
|
|
604
|
+
|
|
605
|
+
// WHEN the same curated-only caller asks for the upgrade
|
|
606
|
+
const result = await upgradePlugin(
|
|
607
|
+
{ name: "level-up", marketplaceOnly: true },
|
|
608
|
+
{ fetch, runGit, workspacePluginsDir: pluginsDir },
|
|
609
|
+
);
|
|
610
|
+
|
|
611
|
+
// THEN the flag is inert: the curated pin is taken as usual
|
|
612
|
+
expect(result.outcome).toBe("upgraded");
|
|
613
|
+
expect(result.toCommit).toBe(SHA_B);
|
|
614
|
+
});
|
|
615
|
+
|
|
577
616
|
test("is a no-op when the recorded branch still points at the installed commit", async () => {
|
|
578
617
|
// GIVEN a direct install tracking `main` at SHA_A
|
|
579
618
|
installCopy(pluginsDir, "level-up", { commit: SHA_A, ref: "main" });
|
|
@@ -232,7 +232,7 @@
|
|
|
232
232
|
"source": {
|
|
233
233
|
"source": "github",
|
|
234
234
|
"repo": "vellum-ai/level-up",
|
|
235
|
-
"ref": "
|
|
235
|
+
"ref": "4357028acc339c6d6f718d5d6ab279ebf198673b"
|
|
236
236
|
},
|
|
237
237
|
"description": "Surfaces a first-class \"Level Up\" diff card whenever the assistant edits its own skills or plugins, so you can see how it improved itself after the fact.",
|
|
238
238
|
"category": "developer",
|
|
@@ -422,6 +422,19 @@
|
|
|
422
422
|
"license": "MIT",
|
|
423
423
|
"icon": "✈️"
|
|
424
424
|
},
|
|
425
|
+
{
|
|
426
|
+
"name": "unabyss",
|
|
427
|
+
"source": {
|
|
428
|
+
"source": "github",
|
|
429
|
+
"repo": "Unabyss/unabyss-vellum",
|
|
430
|
+
"ref": "9f0bb0753dad09dace8578e242961bc2da912af3"
|
|
431
|
+
},
|
|
432
|
+
"description": "Personal and company context from Unabyss, available to your agent through the Unabyss MCP server.",
|
|
433
|
+
"category": "memory",
|
|
434
|
+
"homepage": "https://unabyss.com",
|
|
435
|
+
"license": "MIT",
|
|
436
|
+
"icon": "🌊"
|
|
437
|
+
},
|
|
425
438
|
{
|
|
426
439
|
"name": "vellum-client-qa",
|
|
427
440
|
"source": {
|
|
@@ -17,6 +17,11 @@
|
|
|
17
17
|
* verbatim, with no curated adapter overlay, exactly as the original untrusted
|
|
18
18
|
* install was (see {@link directUpgrade}).
|
|
19
19
|
*
|
|
20
|
+
* Because that target is a mutable ref, taking it means running whatever
|
|
21
|
+
* upstream pushed since, which is a choice only a human should make. A caller
|
|
22
|
+
* with nobody in the loop passes `marketplaceOnly` to rule it out: the direct
|
|
23
|
+
* path then throws {@link PluginNotCuratedError} instead of advancing.
|
|
24
|
+
*
|
|
20
25
|
* This is deliberately a distinct operation from install: `install` is
|
|
21
26
|
* first-time materialization (and errors on an existing install unless
|
|
22
27
|
* `--force` is passed), whereas `upgrade` moves an existing install forward.
|
|
@@ -114,6 +119,20 @@ export interface UpgradePluginOptions {
|
|
|
114
119
|
* {@link DEFAULT_PLUGIN_UPGRADE_STRATEGY}.
|
|
115
120
|
*/
|
|
116
121
|
readonly strategy?: PluginUpgradeStrategy;
|
|
122
|
+
/**
|
|
123
|
+
* Refuse to advance an install the marketplace does not claim, instead of
|
|
124
|
+
* falling back to {@link directUpgrade}.
|
|
125
|
+
*
|
|
126
|
+
* A direct install's upgrade target is a mutable upstream ref, so taking it
|
|
127
|
+
* means fetching and executing whatever was pushed since. Callers with
|
|
128
|
+
* nobody in the loop (the unattended auto-update sweep) set this so that
|
|
129
|
+
* outcome is impossible for them, and it is enforced here rather than by the
|
|
130
|
+
* caller's own pre-check: the catalog is fetched again inside this call, so
|
|
131
|
+
* an entry that disappears in between would otherwise silently reroute a
|
|
132
|
+
* curated upgrade into a direct one. Defaults to false, which is what an
|
|
133
|
+
* interactive `assistant plugins upgrade` wants.
|
|
134
|
+
*/
|
|
135
|
+
readonly marketplaceOnly?: boolean;
|
|
117
136
|
}
|
|
118
137
|
|
|
119
138
|
/** Dependencies injected by the caller. */
|
|
@@ -208,6 +227,23 @@ export class PluginNotUpgradableError extends Error {
|
|
|
208
227
|
}
|
|
209
228
|
}
|
|
210
229
|
|
|
230
|
+
/**
|
|
231
|
+
* A `marketplaceOnly` upgrade was requested for an install the marketplace does
|
|
232
|
+
* not claim, so the only revision available is a mutable upstream ref the
|
|
233
|
+
* caller refuses to take.
|
|
234
|
+
*
|
|
235
|
+
* Distinct from {@link PluginNotUpgradableError}: the install *can* be
|
|
236
|
+
* upgraded, just not without a human choosing to accept unreviewed code.
|
|
237
|
+
*/
|
|
238
|
+
export class PluginNotCuratedError extends Error {
|
|
239
|
+
constructor(readonly pluginName: string) {
|
|
240
|
+
super(
|
|
241
|
+
`Plugin "${pluginName}" cannot be upgraded automatically: it has no marketplace entry, so its only upgrade target is a mutable upstream ref. Run 'assistant plugins upgrade ${pluginName}' to move it deliberately.`,
|
|
242
|
+
);
|
|
243
|
+
this.name = "PluginNotCuratedError";
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
211
247
|
/**
|
|
212
248
|
* A merge strategy (`ours`/`theirs`) was requested but the install-time
|
|
213
249
|
* baseline needed for a three-way merge cannot be reconstructed.
|
|
@@ -244,6 +280,8 @@ function pluginTarget(name: string, deps: UpgradePluginDeps): string {
|
|
|
244
280
|
* Throws {@link PluginNotInstalledError} when no copy is installed,
|
|
245
281
|
* {@link PluginNotUpgradableError} when the install is neither in the
|
|
246
282
|
* marketplace nor carries a recorded GitHub source to advance,
|
|
283
|
+
* {@link PluginNotCuratedError} when `marketplaceOnly` was requested for an
|
|
284
|
+
* install the marketplace does not claim,
|
|
247
285
|
* {@link PluginMergeBaselineError} when a merge strategy is requested but the
|
|
248
286
|
* install-time baseline cannot be reconstructed,
|
|
249
287
|
* {@link PluginSourceUnavailableError} when the marketplace catalog or the
|
|
@@ -302,6 +340,10 @@ export async function upgradePlugin(
|
|
|
302
340
|
"it has no marketplace entry and no installed copy to upgrade",
|
|
303
341
|
);
|
|
304
342
|
}
|
|
343
|
+
if (opts.marketplaceOnly) {
|
|
344
|
+
// The caller only accepts a curated pin, and this install has none.
|
|
345
|
+
throw new PluginNotCuratedError(name);
|
|
346
|
+
}
|
|
305
347
|
return directUpgrade({ name, local, dryRun, strategy }, deps);
|
|
306
348
|
}
|
|
307
349
|
case "remote-unavailable":
|