@mycadet/assistant 0.12.9 → 0.12.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Dockerfile +0 -8
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
- package/openapi.yaml +62 -910
- package/package.json +3 -7
- package/scripts/build-test-fixtures.ts +1 -1
- package/scripts/generate-openapi.ts +22 -6
- package/scripts/postinstall.ts +4 -10
- package/scripts/run-tests.ts +0 -21
- package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
- package/src/__tests__/agent-loop.test.ts +0 -76
- package/src/__tests__/anthropic-provider.test.ts +6 -6
- package/src/__tests__/assert-not-live-db.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
- package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
- package/src/__tests__/attachments-store.test.ts +1 -1
- package/src/__tests__/audit-log-rotation.test.ts +1 -1
- package/src/__tests__/btw-routes.test.ts +1 -1
- package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
- package/src/__tests__/call-conversation-messages.test.ts +0 -5
- package/src/__tests__/call-recovery.test.ts +2 -7
- package/src/__tests__/call-routes-http.test.ts +0 -12
- package/src/__tests__/call-store.test.ts +2 -7
- package/src/__tests__/catalog-files.test.ts +7 -5
- package/src/__tests__/checker.test.ts +1 -1
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
- package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
- package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
- package/src/__tests__/cloud-profile-guard.test.ts +48 -401
- package/src/__tests__/compaction-events.test.ts +2 -2
- package/src/__tests__/config-loader-backfill.test.ts +74 -163
- package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
- package/src/__tests__/config-loader-corrupt.test.ts +10 -10
- package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
- package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
- package/src/__tests__/config-schema.test.ts +26 -27
- package/src/__tests__/config-set-route.test.ts +2 -6
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
- package/src/__tests__/conversation-agent-loop.test.ts +2 -58
- package/src/__tests__/conversation-clear-safety.test.ts +0 -30
- package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
- package/src/__tests__/conversation-skill-tools.test.ts +4 -444
- package/src/__tests__/conversation-slash-commands.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +1 -84
- package/src/__tests__/conversation-surface-state.test.ts +0 -16
- package/src/__tests__/credential-health-service.test.ts +14 -1
- package/src/__tests__/credential-record-retire.test.ts +1 -1
- package/src/__tests__/credential-record-write-through.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +0 -145
- package/src/__tests__/custom-profile-ensure.test.ts +1 -1
- package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
- package/src/__tests__/dictation-profile-store.test.ts +6 -6
- package/src/__tests__/disk-usage.test.ts +28 -164
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
- package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
- package/src/__tests__/emit-event-signal.test.ts +1 -1
- package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
- package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +0 -13
- package/src/__tests__/helpers/seed-app.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/identity-routes.test.ts +1 -1
- package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
- package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
- package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
- package/src/__tests__/list-all-apps.test.ts +1 -1
- package/src/__tests__/live-workspace-guard.test.ts +2 -2
- package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
- package/src/__tests__/llm-resolver.test.ts +7 -7
- package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
- package/src/__tests__/llm-usage-store.test.ts +0 -495
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
- package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
- package/src/__tests__/memory-config-file-parity.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
- package/src/__tests__/notification-guardian-path.test.ts +0 -7
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +1 -1
- package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
- package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
- package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
- package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
- package/src/__tests__/provider-connections-backfill.test.ts +10 -10
- package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
- package/src/__tests__/resolve-app.test.ts +1 -1
- package/src/__tests__/run-due-schedules.test.ts +1 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
- package/src/__tests__/schedule-routes.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
- package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
- package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -1
- package/src/__tests__/tool-audit.test.ts +5 -235
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
- package/src/__tests__/tools-get-route.test.ts +1 -1
- package/src/__tests__/turn-outcome-read.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/usage-attribution.test.ts +0 -31
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
- package/src/__tests__/visible-app-context.test.ts +1 -1
- package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-greetings.test.ts +1 -1
- package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
- package/src/activation/progress-store.ts +1 -1
- package/src/activation/turn-hooks.ts +1 -1
- package/src/agent/loop.ts +0 -51
- package/src/apps/app-store.ts +1 -1
- package/src/avatar/__tests__/avatar-store.test.ts +2 -172
- package/src/avatar/accent-backfill.ts +1 -1
- package/src/avatar/avatar-manifest.ts +1 -1
- package/src/avatar/avatar-store.ts +10 -69
- package/src/avatar/ensure-raster.ts +1 -1
- package/src/avatar/identity-avatar.ts +1 -1
- package/src/avatar/sync-avatar.ts +1 -1
- package/src/avatar/traits-png-sync.ts +1 -1
- package/src/bundler/compiler-tools.ts +1 -1
- package/src/bundler/package-resolver.ts +1 -1
- package/src/calls/__tests__/call-controller.test.ts +25 -27
- package/src/calls/active-call-lease.ts +1 -1
- package/src/calls/call-controller.ts +3 -3
- package/src/calls/call-domain.ts +4 -8
- package/src/calls/call-store.ts +2 -76
- package/src/calls/resolve-call-tts-provider.ts +3 -3
- package/src/calls/twilio-config.ts +3 -3
- package/src/calls/twilio-rest.ts +2 -2
- package/src/calls/voice-ingress-preflight.ts +2 -2
- package/src/cli/bundled-modules.ts +0 -2
- package/src/cli/commands/__tests__/apps.test.ts +1 -1
- package/src/cli/commands/__tests__/plugins.test.ts +9 -66
- package/src/cli/commands/__tests__/ps.test.ts +67 -0
- package/src/cli/commands/auth.help.ts +2 -2
- package/src/cli/commands/avatar.ts +1 -1
- package/src/cli/commands/changelog.ts +1 -1
- package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
- package/src/cli/commands/cloud/index.help.ts +1 -1
- package/src/cli/commands/cloud/index.ts +2 -2
- package/src/cli/commands/db/refresh.ts +1 -1
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
- package/src/cli/commands/db/repair.ts +1 -1
- package/src/cli/commands/db/status.ts +1 -1
- package/src/cli/commands/inference-profiles.ts +1 -12
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
- package/src/cli/commands/memory/index.help.ts +1 -43
- package/src/cli/commands/memory/memory-v3.ts +0 -64
- package/src/cli/commands/plugins.ts +54 -205
- package/src/cli/commands/ps.ts +5 -2
- package/src/cli/commands/status.ts +1 -1
- package/src/cli/index.help.ts +0 -2
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
- package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
- package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
- package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
- package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
- package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
- package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
- package/src/cli/lib/diff-plugin.ts +1 -1
- package/src/cli/lib/inspect-plugin.ts +13 -97
- package/src/cli/lib/install-from-cloud.ts +1 -1
- package/src/cli/lib/install-from-github.ts +75 -154
- package/src/cli/lib/install-plugin-dependencies.ts +1 -1
- package/src/cli/lib/list-installed-plugins.ts +1 -1
- package/src/cli/lib/open-browser.ts +1 -1
- package/src/cli/lib/plugin-catalog-cache.ts +8 -51
- package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
- package/src/cli/lib/plugin-details.ts +5 -27
- package/src/cli/lib/plugin-marketplace.ts +18 -266
- package/src/cli/lib/search-plugins.ts +23 -43
- package/src/cli/lib/toggle-plugin.ts +1 -1
- package/src/cli/lib/uninstall-plugin.ts +1 -1
- package/src/cli/lib/upgrade-plugin.ts +3 -49
- package/src/cli/program.ts +1 -3
- package/src/cli.ts +1 -1
- package/src/cloud/client.ts +0 -6
- package/src/cloud/consent-cache.test.ts +22 -201
- package/src/cloud/consent-cache.ts +16 -111
- package/src/cloud/sync-identity.ts +1 -1
- package/src/config/__tests__/chat-settings.test.ts +1 -1
- package/src/config/__tests__/cloud-identity.test.ts +15 -2
- package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
- package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
- package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
- package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/profile-materialization.test.ts +2 -4
- package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
- package/src/config/acp-agent-write.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
- package/src/config/call-site-defaults.ts +0 -6
- package/src/config/cloud-identity.ts +12 -5
- package/src/config/composer-preferences.ts +1 -1
- package/src/config/default-profile-catalog.ts +8 -75
- package/src/config/default-profile-names.ts +2 -25
- package/src/config/env-registry.ts +1 -14
- package/src/config/env.ts +8 -6
- package/src/config/llm-resolver.ts +1 -2
- package/src/config/loader.ts +13 -17
- package/src/config/profile-materialization.ts +1 -1
- package/src/config/schema.ts +1 -7
- package/src/config/schemas/call-site-catalog.ts +0 -7
- package/src/config/schemas/llm.ts +22 -27
- package/src/config/seed-inference-profiles.ts +16 -17
- package/src/config/skills.ts +2 -2
- package/src/config/sync-gated-profiles.ts +6 -24
- package/src/credential-health/credential-health-service.ts +10 -3
- package/src/daemon/approval-generators.ts +3 -3
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
- package/src/daemon/conversation-agent-loop.ts +6 -97
- package/src/daemon/conversation-process.ts +1 -1
- package/src/daemon/conversation-skill-tools.ts +4 -72
- package/src/daemon/conversation-store.ts +1 -1
- package/src/daemon/conversation-surface-state.ts +0 -33
- package/src/daemon/conversation-surfaces.ts +1 -86
- package/src/daemon/conversation-tool-setup.test.ts +1 -1
- package/src/daemon/conversation-tool-setup.ts +0 -23
- package/src/daemon/conversation.ts +3 -5
- package/src/daemon/daemon-control.ts +3 -3
- package/src/daemon/dictation-profile-store.ts +3 -3
- package/src/daemon/event-loop-watchdog.test.ts +2 -198
- package/src/daemon/event-loop-watchdog.ts +0 -185
- package/src/daemon/external-plugins-bootstrap.ts +1 -1
- package/src/daemon/first-greeting.ts +1 -1
- package/src/daemon/handlers/skills.ts +1 -1
- package/src/daemon/host-app-control-proxy.ts +1 -1
- package/src/daemon/host-cu-proxy.ts +2 -2
- package/src/daemon/identity-helpers.ts +1 -1
- package/src/daemon/lifecycle.ts +11 -15
- package/src/daemon/main.ts +1 -1
- package/src/daemon/now-scratchpad.ts +1 -1
- package/src/daemon/process-message.ts +4 -4
- package/src/daemon/profiler-run-store.ts +2 -2
- package/src/daemon/providers-setup.ts +2 -2
- package/src/daemon/shutdown-handlers.ts +0 -10
- package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
- package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/desktop/desktop-session-manager.ts +1 -1
- package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/home/feed-writer.ts +1 -1
- package/src/home/home-greeting-cache.ts +1 -1
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/hooks/__tests__/hook-live-reload.test.ts +1 -1
- package/src/hooks/hook-loader.ts +2 -2
- package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
- package/src/inbound/oauth-callback-url.ts +3 -3
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/socket-path.ts +1 -1
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
- package/src/live-voice/live-voice-session.ts +3 -66
- package/src/mcp/__tests__/effective-config.test.ts +1 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
- package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
- package/src/mcp/__tests__/reload-signal.test.ts +1 -1
- package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
- package/src/mcp/reload-signal.ts +1 -1
- package/src/mcp/workspace-mcp-config.ts +1 -23
- package/src/messaging/draft-store.ts +1 -1
- package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
- package/src/monitoring/__tests__/page-cache.test.ts +1 -1
- package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
- package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
- package/src/monitoring/active-conversations.ts +1 -1
- package/src/monitoring/control.ts +1 -1
- package/src/monitoring/daemon-boot-time.ts +1 -1
- package/src/monitoring/daemon-heartbeat.ts +1 -1
- package/src/monitoring/page-cache.ts +1 -1
- package/src/monitoring/plugin-auto-update.ts +1 -7
- package/src/monitoring/plugin-source-watch.ts +1 -1
- package/src/monitoring/recovery/db.ts +1 -1
- package/src/monitoring/recovery/inflight-content.ts +1 -1
- package/src/monitoring/resource-sampler.ts +3 -14
- package/src/monitoring/stall-capture.ts +1 -1
- package/src/monitoring/worker.ts +9 -76
- package/src/monitoring/workspace-git-heartbeat.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +4 -4
- package/src/permissions/checker.ts +1 -1
- package/src/permissions/workspace-policy.ts +1 -1
- package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
- package/src/persistence/__tests__/message-content-file.test.ts +1 -1
- package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
- package/src/persistence/attachments-store.ts +1 -1
- package/src/persistence/conversation-crud.ts +1 -38
- package/src/persistence/conversation-directories.ts +1 -1
- package/src/persistence/conversation-types.ts +0 -8
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-connection.ts +11 -1
- package/src/persistence/db-init.ts +1 -1
- package/src/persistence/db-maintenance.ts +1 -1
- package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
- package/src/persistence/embeddings/embedding-local.ts +4 -4
- package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
- package/src/persistence/embeddings/qdrant-client.ts +1 -1
- package/src/persistence/embeddings/qdrant-manager.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
- package/src/persistence/job-handlers/cleanup.ts +8 -17
- package/src/persistence/llm-usage-store.ts +2 -229
- package/src/persistence/message-content-file.ts +1 -1
- package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
- package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
- package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
- package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
- package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
- package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
- package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
- package/src/persistence/migrations/helpers/relocation.ts +1 -1
- package/src/persistence/migrations/run-migrations.ts +1 -1
- package/src/persistence/migrations/validate-migration-state.ts +1 -1
- package/src/persistence/raw-query.ts +1 -29
- package/src/persistence/slow-sync-log.ts +0 -23
- package/src/persistence/steps.ts +2 -0
- package/src/{telemetry → persistence}/tool-audit.ts +6 -121
- package/src/plugin-api/index.ts +1 -1
- package/src/plugin-api/plugin-name-env.ts +1 -1
- package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
- package/src/plugins/collect-source-versions.ts +1 -1
- package/src/plugins/defaults/channel/package.json +1 -1
- package/src/plugins/defaults/cloud-hosted/package.json +1 -1
- package/src/plugins/defaults/compaction/package.json +1 -1
- package/src/plugins/defaults/documents/package.json +1 -1
- package/src/plugins/defaults/empty-response/package.json +1 -1
- package/src/plugins/defaults/exploration-drift/package.json +1 -1
- package/src/plugins/defaults/image-fallback/package.json +1 -1
- package/src/plugins/defaults/image-recovery/package.json +1 -1
- package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
- package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
- package/src/plugins/defaults/memory/package.json +1 -1
- package/src/plugins/defaults/memory/paths.ts +4 -4
- package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
- package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
- package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
- package/src/plugins/defaults/memory/startup.ts +1 -22
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
- package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
- package/src/plugins/defaults/memory/worker-control.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -2
- package/src/plugins/defaults/session/package.json +1 -1
- package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
- package/src/plugins/defaults/task-progress/package.json +1 -1
- package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
- package/src/plugins/defaults/title-generate/package.json +1 -1
- package/src/plugins/defaults/tool-error/package.json +1 -1
- package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
- package/src/plugins/defaults/turn-context/package.json +1 -1
- package/src/plugins/defaults/workspace/injectors.ts +1 -1
- package/src/plugins/defaults/workspace/package.json +1 -1
- package/src/plugins/disabled-state.ts +1 -1
- package/src/plugins/ensure-plugin-api-shim.ts +1 -1
- package/src/plugins/ensure-shared-dep-links.ts +1 -1
- package/src/plugins/installed-plugin-dirs.ts +1 -1
- package/src/plugins/mcp-servers.ts +7 -9
- package/src/plugins/mtime-cache.ts +2 -2
- package/src/plugins/source-versions.ts +1 -1
- package/src/prompts/bootstrap-cleanup.ts +1 -1
- package/src/prompts/persona-resolver.ts +1 -1
- package/src/prompts/sections.ts +2 -2
- package/src/prompts/system-prompt.ts +10 -42
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
- package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
- package/src/providers/cadet/client.ts +1 -1
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
- package/src/providers/inference/adapter-factory.ts +1 -1
- package/src/providers/inference/backfill.ts +3 -10
- package/src/providers/inference/profile-probe.ts +1 -1
- package/src/providers/retry.ts +0 -2
- package/src/providers/types.ts +0 -7
- package/src/providers/usage-tracking.ts +1 -1
- package/src/routes/__tests__/route-host.test.ts +1 -1
- package/src/routes/control.ts +1 -1
- package/src/routes/route-host-client.ts +1 -1
- package/src/routes/worker.ts +2 -2
- package/src/runtime/agent-wake.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +1 -1
- package/src/runtime/auth/token-service.ts +1 -1
- package/src/runtime/background-job-runner.ts +1 -1
- package/src/runtime/middleware/twilio-validation.ts +2 -2
- package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
- package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +59 -287
- package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
- package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
- package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
- package/src/runtime/routes/app-management-routes.ts +1 -1
- package/src/runtime/routes/attachment-routes.ts +1 -1
- package/src/runtime/routes/audit-routes.ts +1 -1
- package/src/runtime/routes/avatar-routes.ts +3 -10
- package/src/runtime/routes/cloud-routes.ts +3 -3
- package/src/runtime/routes/content-source-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +60 -621
- package/src/runtime/routes/conversation-routes.ts +1 -38
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/deprecated-route-context.ts +5 -61
- package/src/runtime/routes/heartbeat-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +1 -1
- package/src/runtime/routes/index.ts +0 -6
- package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
- package/src/runtime/routes/inference-profiles-routes.ts +48 -21
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
- package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +17 -15
- package/src/runtime/routes/migration-rollback-routes.ts +1 -1
- package/src/runtime/routes/migration-routes.ts +2 -3
- package/src/runtime/routes/monitoring-routes.ts +2 -2
- package/src/runtime/routes/oauth-providers.ts +5 -5
- package/src/runtime/routes/plugins-routes.ts +38 -163
- package/src/runtime/routes/profiler-routes.ts +1 -1
- package/src/runtime/routes/route-host-worker-routes.ts +1 -1
- package/src/runtime/routes/sanity-routes.ts +1 -1
- package/src/runtime/routes/schedule-routes.ts +1 -1
- package/src/runtime/routes/schedule-worker-routes.ts +1 -1
- package/src/runtime/routes/settings-routes.ts +1 -1
- package/src/runtime/routes/sounds-config-routes.ts +1 -1
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
- package/src/runtime/routes/user-route-dispatcher.ts +1 -3
- package/src/runtime/routes/user-route-import.ts +1 -1
- package/src/runtime/routes/user-route-resolution.ts +1 -1
- package/src/runtime/routes/user-routes-cli.ts +1 -1
- package/src/runtime/routes/workspace-commit-routes.ts +1 -1
- package/src/runtime/routes/workspace-greetings.ts +1 -1
- package/src/runtime/routes/workspace-routes.ts +1 -1
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/sync/resource-sync-events.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
- package/src/schedule/plugin-schedule-availability.ts +1 -1
- package/src/schedule/plugin-schedule-declarations.ts +1 -1
- package/src/schedule/run-script.ts +1 -1
- package/src/schedule/scheduler.ts +1 -11
- package/src/schedule/worker-control.ts +1 -1
- package/src/schedule/worker.ts +3 -3
- package/src/security/oauth2.ts +2 -2
- package/src/security/secret-allowlist.ts +1 -1
- package/src/signals/cancel.ts +1 -1
- package/src/signals/conversation-undo.ts +1 -1
- package/src/signals/emit-event.ts +1 -1
- package/src/signals/event-stream.ts +1 -1
- package/src/signals/user-message.ts +1 -1
- package/src/skills/catalog-install.ts +2 -1
- package/src/skills/clawhub.ts +1 -1
- package/src/skills/cloud-store.ts +1 -1
- package/src/skills/path-classifier.ts +1 -1
- package/src/skills/skill-history.ts +1 -1
- package/src/skills/skillssh-registry.ts +1 -1
- package/src/skills/uninstall.ts +1 -1
- package/src/skills/workspace-skill-md-signature.ts +1 -1
- package/src/subagent/manager.ts +1 -1
- package/src/theme/workspace-theme.ts +1 -1
- package/src/tools/browser/auth-cache.ts +1 -1
- package/src/tools/browser/browser-manager.ts +1 -1
- package/src/tools/browser/runtime-check.ts +1 -1
- package/src/tools/executor.ts +4 -4
- package/src/tools/filesystem/write.ts +1 -1
- package/src/tools/permission-checker.ts +2 -51
- package/src/tools/run-standalone.ts +1 -1
- package/src/tools/skills/format-input-schema.ts +1 -1
- package/src/tools/skills/load.ts +1 -1
- package/src/tools/skills/scaffold-cloud.ts +0 -32
- package/src/tools/terminal/safe-env.ts +1 -2
- package/src/tools/terminal/sanitized-bash.ts +1 -1
- package/src/tools/terminal/shell.ts +1 -1
- package/src/tools/tool-approval-handler.ts +4 -1
- package/src/tools/workflows/manage-workflows.ts +2 -2
- package/src/tools/workflows/run-workflow.test.ts +1 -1
- package/src/tools/workspace-tools/loader.ts +1 -1
- package/src/tts/synthesis-stream.ts +2 -2
- package/src/usage/attribution.ts +1 -11
- package/src/util/browser.ts +1 -1
- package/src/util/bun-runtime.ts +2 -1
- package/src/util/device-id.ts +1 -1
- package/src/util/disk-usage.ts +4 -139
- package/src/util/layout.ts +3 -3
- package/src/util/logger.ts +1 -1
- package/src/util/logs-db-path.ts +1 -1
- package/src/util/memory-db-path.ts +1 -1
- package/src/util/{platform.ts → os.ts} +5 -30
- package/src/util/process-tree.ts +19 -0
- package/src/util/sqlite3-runtime.ts +1 -1
- package/src/util/telemetry-db-path.ts +1 -1
- package/src/watcher/__tests__/engine.test.ts +0 -23
- package/src/watcher/engine.ts +0 -7
- package/src/windows-compiled-cli.ts +0 -4
- package/src/windows-compiled-worker-entry.ts +0 -6
- package/src/workflows/leaf-runner.test.ts +1 -1
- package/src/workflows/leaf-runner.ts +1 -1
- package/src/workflows/library.ts +1 -1
- package/src/workspace/adaptive-thinking-repair.ts +5 -24
- package/src/workspace/byok-default-profile-ensure.ts +24 -26
- package/src/workspace/custom-profile-ensure.ts +2 -2
- package/src/workspace/git-service.ts +1 -1
- package/src/workspace/hatched-date.ts +1 -1
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
- package/src/workspace/migrations/registry.ts +0 -4
- package/src/workspace/turn-commit.ts +1 -1
- package/docs/activation-funnel-telemetry.md +0 -324
- package/scripts/bundled-plugin-packages.ts +0 -154
- package/scripts/generate-bundled-plugin-packages.ts +0 -29
- package/src/__tests__/activation-early-marking.test.ts +0 -114
- package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
- package/src/__tests__/config-get-vision-flag.test.ts +0 -139
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
- package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
- package/src/__tests__/telemetry-routes.test.ts +0 -182
- package/src/__tests__/turn-events-store.test.ts +0 -376
- package/src/__tests__/ui-channel-variants.test.ts +0 -53
- package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
- package/src/avatar/avatar-changed-telemetry.ts +0 -128
- package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
- package/src/cli/commands/telemetry.help.ts +0 -27
- package/src/cli/commands/telemetry.ts +0 -83
- package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
- package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
- package/src/cli/lib/bundled-marketplace.json +0 -1575
- package/src/cli/lib/bundled-plugin-packages.json +0 -827
- package/src/cli/lib/bundled-plugin-packages.ts +0 -87
- package/src/cli/lib/plugin-catalog-local.ts +0 -94
- package/src/cli/lib/plugin-pin-history.ts +0 -276
- package/src/cloud/feature-gate.ts +0 -8
- package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
- package/src/config/cloud-rehydration.ts +0 -35
- package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
- package/src/daemon/auto-profile-router.ts +0 -428
- package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
- package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
- package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
- package/src/monitoring/db-integrity-check.ts +0 -163
- package/src/monitoring/db-integrity-sample.ts +0 -176
- package/src/monitoring/oom-kill-reporter.ts +0 -469
- package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
- package/src/onboarding/onboarding-events-store.ts +0 -296
- package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
- package/src/persistence/lifecycle-events-store.test.ts +0 -134
- package/src/persistence/lifecycle-events-store.ts +0 -110
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
- package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
- package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
- package/src/runtime/routes/auto-profile-routes.ts +0 -83
- package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
- package/src/runtime/routes/telemetry-routes.ts +0 -274
- package/src/security/auth-fallback-events-store.ts +0 -57
- package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
- package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
- package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
- package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
- package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
- package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
- package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
- package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
- package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
- package/src/telemetry/activation-funnel.ts +0 -172
- package/src/telemetry/config-setting-events-store.ts +0 -40
- package/src/telemetry/config-setting-snapshot.ts +0 -170
- package/src/telemetry/flush-checkpoints.ts +0 -70
- package/src/telemetry/live-voice-funnel.ts +0 -185
- package/src/telemetry/memory-corpus-size.test.ts +0 -120
- package/src/telemetry/memory-corpus-size.ts +0 -184
- package/src/telemetry/memory-tier-reporter.test.ts +0 -195
- package/src/telemetry/memory-tier-reporter.ts +0 -130
- package/src/telemetry/phone-call-funnel.ts +0 -144
- package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
- package/src/telemetry/skill-loaded-events-store.ts +0 -39
- package/src/telemetry/telemetry-event-sources.test.ts +0 -223
- package/src/telemetry/telemetry-event-sources.ts +0 -597
- package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
- package/src/telemetry/telemetry-events-outbox.ts +0 -237
- package/src/telemetry/telemetry-main-db.ts +0 -48
- package/src/telemetry/telemetry-wire-source.json +0 -4
- package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
- package/src/telemetry/telemetry-wire-validation.ts +0 -162
- package/src/telemetry/telemetry-wire.generated.ts +0 -483
- package/src/telemetry/tool-executed-events-store.test.ts +0 -210
- package/src/telemetry/tool-executed-events-store.ts +0 -102
- package/src/telemetry/trace-collection-policy.test.ts +0 -28
- package/src/telemetry/trace-collection-policy.ts +0 -30
- package/src/telemetry/turn-events-store.ts +0 -216
- package/src/telemetry/turn-trace-store.test.ts +0 -884
- package/src/telemetry/turn-trace-store.ts +0 -399
- package/src/telemetry/types.test.ts +0 -38
- package/src/telemetry/types.ts +0 -780
- package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
- package/src/telemetry/usage-telemetry-reporter.ts +0 -566
- package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
- package/src/telemetry/watchdog-direct-emit.ts +0 -104
- package/src/telemetry/watchdog-events-store.ts +0 -31
- package/src/tools/ui-surface/channel-variants.ts +0 -52
- package/src/watcher/__tests__/telemetry.test.ts +0 -178
- package/src/watcher/telemetry.ts +0 -93
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
- package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
- /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
- /package/src/{telemetry → persistence}/turn-outcome.ts +0 -0
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tests for {@link getPluginDetails}.
|
|
3
3
|
*
|
|
4
|
-
* At the default ref, the catalog entry is resolved from the
|
|
5
|
-
* catalog (the same source search and install-by-name use)
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* at that revision (a git lookup, matching pin history / inspect). GitHub is
|
|
10
|
-
* replaced with an
|
|
4
|
+
* At the default ref, the catalog entry is resolved from the mocked cloud
|
|
5
|
+
* plugin catalog (the same source search and install-by-name use) — real
|
|
6
|
+
* plugin names / pinned SHAs, zero network. An explicit historical `ref`
|
|
7
|
+
* instead reads the GitHub `plugins/marketplace.json` at that revision (a git
|
|
8
|
+
* lookup, matching pin history / inspect). GitHub is replaced with an
|
|
11
9
|
* in-memory Contents API fixture passed via the `fetch` dependency, and the
|
|
12
10
|
* installed-copy path is exercised against a real temp directory passed via
|
|
13
|
-
* `workspacePluginsDir` — no globals are monkey-patched. The fixture answers
|
|
14
|
-
* URL shapes:
|
|
11
|
+
* `workspacePluginsDir` — no globals are monkey-patched. The fixture answers
|
|
12
|
+
* two URL shapes:
|
|
15
13
|
* - directory listings (`/contents/<path>` → entry array or 404),
|
|
16
14
|
* - raw file downloads (a listing entry's `download_url`).
|
|
17
15
|
*
|
|
@@ -27,12 +25,13 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
|
27
25
|
|
|
28
26
|
import type { FetchLike } from "../fetch-like.js";
|
|
29
27
|
import { invalidatePluginCatalogCache } from "../plugin-catalog-cache.js";
|
|
30
|
-
import { readBundledPluginCatalog } from "../plugin-catalog-local.js";
|
|
31
28
|
import {
|
|
32
29
|
getPluginDetails,
|
|
33
30
|
PluginDetailsNotFoundError,
|
|
34
31
|
} from "../plugin-details.js";
|
|
32
|
+
import type { MarketplaceEntry } from "../plugin-marketplace.js";
|
|
35
33
|
import {
|
|
34
|
+
marketplaceMatch,
|
|
36
35
|
PluginCatalogUnavailableError,
|
|
37
36
|
type PluginSearchMatch,
|
|
38
37
|
} from "../search-plugins.js";
|
|
@@ -75,6 +74,24 @@ function makeFetch(config: FixtureConfig): FetchLike {
|
|
|
75
74
|
return new Response(config.raw[url], { status: 200 });
|
|
76
75
|
}
|
|
77
76
|
|
|
77
|
+
if (url.includes("/v1/plugins")) {
|
|
78
|
+
return new Response(
|
|
79
|
+
JSON.stringify({
|
|
80
|
+
plugins: CATALOG_FIXTURES.map((e) => ({
|
|
81
|
+
name: e.name,
|
|
82
|
+
...(e.source.source === "github"
|
|
83
|
+
? { repo: e.source.repo, ref: e.source.ref }
|
|
84
|
+
: {}),
|
|
85
|
+
description: e.description,
|
|
86
|
+
category: e.category,
|
|
87
|
+
homepage: e.homepage,
|
|
88
|
+
license: e.license,
|
|
89
|
+
})),
|
|
90
|
+
}),
|
|
91
|
+
{ status: 200, headers: { "content-type": "application/json" } },
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
78
95
|
if (url.includes("/contents")) {
|
|
79
96
|
const key = listingKey(url);
|
|
80
97
|
const entries = config.listings?.[key];
|
|
@@ -107,16 +124,64 @@ function splitOnce(s: string, sep: string): [string, string] {
|
|
|
107
124
|
return [s.slice(0, i), s.slice(i + sep.length)];
|
|
108
125
|
}
|
|
109
126
|
|
|
110
|
-
/**
|
|
127
|
+
/**
|
|
128
|
+
* Catalog fixture rows served to the mocked cloud catalog — the source under
|
|
129
|
+
* test. Former bundled-catalog entries, now exercised through the platform
|
|
130
|
+
* fetch path.
|
|
131
|
+
*/
|
|
132
|
+
const CATALOG_FIXTURES: MarketplaceEntry[] = [
|
|
133
|
+
{
|
|
134
|
+
name: "caveman",
|
|
135
|
+
source: {
|
|
136
|
+
source: "github",
|
|
137
|
+
repo: "JuliusBrussee/caveman",
|
|
138
|
+
ref: "63a91ecadbf4c4719a4602a5abb00883f9966034",
|
|
139
|
+
},
|
|
140
|
+
description:
|
|
141
|
+
"Ultra-compressed communication mode that strips filler words to cut token usage.",
|
|
142
|
+
category: "productivity",
|
|
143
|
+
homepage: "https://github.com/JuliusBrussee/caveman",
|
|
144
|
+
license: "MIT",
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "simple-memory",
|
|
148
|
+
source: {
|
|
149
|
+
source: "github",
|
|
150
|
+
repo: "vargasjr-dev/simple-memory",
|
|
151
|
+
ref: "ed09a4c01bf18e4ac8859faee94cb65c7cbd1ca3",
|
|
152
|
+
},
|
|
153
|
+
description:
|
|
154
|
+
"Reference memory plugin that exercises the full plugin API with low-cost variants of Cadet's memory defaults.",
|
|
155
|
+
category: "memory",
|
|
156
|
+
homepage: "https://github.com/vargasjr-dev/simple-memory",
|
|
157
|
+
license: "MIT",
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: "dynamic-notch",
|
|
161
|
+
source: {
|
|
162
|
+
source: "github",
|
|
163
|
+
repo: "AnitaKirkovska/dynamic-notch",
|
|
164
|
+
ref: "9729c3685d60d00d1de73a183b03122b9fa1f8f4",
|
|
165
|
+
},
|
|
166
|
+
description:
|
|
167
|
+
"Put your Cadet assistant inside your MacBook's notch: click to chat, hold Ctrl+Option to talk, and get a floating task bulb while it works, with live-streamed replies and per-sentence voice.",
|
|
168
|
+
category: "interface",
|
|
169
|
+
homepage: "https://github.com/AnitaKirkovska/dynamic-notch",
|
|
170
|
+
license: "MIT",
|
|
171
|
+
},
|
|
172
|
+
];
|
|
173
|
+
|
|
174
|
+
/** The catalog fixture entry for {@link name} — the source under test. */
|
|
111
175
|
function bundledMatch(name: string): PluginSearchMatch & {
|
|
112
176
|
source: Extract<PluginSearchMatch["source"], { kind: "github" }>;
|
|
113
177
|
} {
|
|
114
|
-
const
|
|
115
|
-
if (!
|
|
116
|
-
throw new Error(`
|
|
178
|
+
const entry = CATALOG_FIXTURES.find((e) => e.name === name);
|
|
179
|
+
if (!entry) {
|
|
180
|
+
throw new Error(`catalog fixture has no entry for "${name}"`);
|
|
117
181
|
}
|
|
182
|
+
const match = marketplaceMatch(entry);
|
|
118
183
|
if (match.source.kind !== "github") {
|
|
119
|
-
throw new Error(`
|
|
184
|
+
throw new Error(`catalog fixture entry "${name}" is not GitHub-backed`);
|
|
120
185
|
}
|
|
121
186
|
return match as PluginSearchMatch & {
|
|
122
187
|
source: Extract<PluginSearchMatch["source"], { kind: "github" }>;
|
|
@@ -142,34 +207,16 @@ function sha16(buf: Buffer): string {
|
|
|
142
207
|
return createHash("sha256").update(buf).digest("hex").slice(0, 16);
|
|
143
208
|
}
|
|
144
209
|
|
|
145
|
-
const ORIGINAL_ENV = {
|
|
146
|
-
IS_CLOUD: process.env.IS_CLOUD,
|
|
147
|
-
CADET_DISABLE_CLOUD: process.env.CADET_DISABLE_CLOUD,
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
function restoreEnv(): void {
|
|
151
|
-
for (const [key, value] of Object.entries(ORIGINAL_ENV)) {
|
|
152
|
-
if (value === undefined) {
|
|
153
|
-
delete process.env[key];
|
|
154
|
-
} else {
|
|
155
|
-
process.env[key] = value;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
210
|
let workspace: string;
|
|
161
211
|
|
|
162
|
-
describe("getPluginDetails (
|
|
212
|
+
describe("getPluginDetails (mocked cloud catalog)", () => {
|
|
163
213
|
beforeEach(() => {
|
|
164
214
|
workspace = mkdtempSync(join(tmpdir(), "plugin-details-"));
|
|
165
215
|
invalidatePluginCatalogCache();
|
|
166
|
-
process.env.CADET_DISABLE_CLOUD = "true";
|
|
167
|
-
delete process.env.IS_CLOUD;
|
|
168
216
|
});
|
|
169
217
|
|
|
170
218
|
afterEach(() => {
|
|
171
219
|
rmSync(workspace, { recursive: true, force: true });
|
|
172
|
-
restoreEnv();
|
|
173
220
|
});
|
|
174
221
|
|
|
175
222
|
test("resolves an external plugin: catalog metadata + repo README/package.json", async () => {
|
|
@@ -234,6 +281,23 @@ describe("getPluginDetails (bundled catalog, offline)", () => {
|
|
|
234
281
|
if (url === "raw://caveman/readme") {
|
|
235
282
|
return new Response("# Caveman", { status: 200 });
|
|
236
283
|
}
|
|
284
|
+
if (url.includes("/v1/plugins")) {
|
|
285
|
+
return new Response(
|
|
286
|
+
JSON.stringify({
|
|
287
|
+
plugins: CATALOG_FIXTURES.map((e) => ({
|
|
288
|
+
name: e.name,
|
|
289
|
+
...(e.source.source === "github"
|
|
290
|
+
? { repo: e.source.repo, ref: e.source.ref }
|
|
291
|
+
: {}),
|
|
292
|
+
description: e.description,
|
|
293
|
+
category: e.category,
|
|
294
|
+
homepage: e.homepage,
|
|
295
|
+
license: e.license,
|
|
296
|
+
})),
|
|
297
|
+
}),
|
|
298
|
+
{ status: 200, headers: { "content-type": "application/json" } },
|
|
299
|
+
);
|
|
300
|
+
}
|
|
237
301
|
return new Response("unexpected url: " + url, { status: 500 });
|
|
238
302
|
}) as FetchLike;
|
|
239
303
|
|
|
@@ -465,68 +529,24 @@ describe("getPluginDetails (bundled catalog, offline)", () => {
|
|
|
465
529
|
expect(details.source).toEqual(caveman.source);
|
|
466
530
|
});
|
|
467
531
|
|
|
468
|
-
test("
|
|
469
|
-
//
|
|
532
|
+
test("an explicit historical ref no longer resolves — the catalog has no history", async () => {
|
|
533
|
+
// The retired local marketplace manifest could be read at any git ref;
|
|
534
|
+
// the cloud catalog has no revisions, so a historical ref resolves to
|
|
535
|
+
// nothing and a not-installed plugin 404s.
|
|
470
536
|
const historicalRef = "a".repeat(40);
|
|
471
|
-
|
|
472
|
-
const
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
// The marketplace manifest, read at the requested historical ref
|
|
476
|
-
if (url.includes("/contents/plugins/marketplace.json")) {
|
|
477
|
-
marketplaceRefs.push(new URL(url).searchParams.get("ref") ?? "");
|
|
478
|
-
return new Response(
|
|
479
|
-
JSON.stringify({
|
|
480
|
-
name: "cadet",
|
|
481
|
-
plugins: [
|
|
482
|
-
{
|
|
483
|
-
name: "time-traveler",
|
|
484
|
-
source: {
|
|
485
|
-
source: "github",
|
|
486
|
-
repo: historicalRepo,
|
|
487
|
-
ref: "b".repeat(40),
|
|
488
|
-
},
|
|
489
|
-
description: "historical description",
|
|
490
|
-
homepage: "https://historical.example.com",
|
|
491
|
-
license: "MIT",
|
|
492
|
-
},
|
|
493
|
-
],
|
|
494
|
-
}),
|
|
495
|
-
{ status: 200 },
|
|
496
|
-
);
|
|
497
|
-
}
|
|
498
|
-
// The entry's own external repo, read at its pinned source ref
|
|
499
|
-
if (url.includes("/contents") && url.includes(historicalRepo)) {
|
|
500
|
-
return new Response(
|
|
501
|
-
JSON.stringify([fileEntry("README.md", "raw://hist/readme")]),
|
|
502
|
-
{ status: 200, headers: { "content-type": "application/json" } },
|
|
503
|
-
);
|
|
504
|
-
}
|
|
505
|
-
if (url === "raw://hist/readme") {
|
|
506
|
-
return new Response("# Time Traveler (historical)", { status: 200 });
|
|
507
|
-
}
|
|
508
|
-
return new Response("unexpected url: " + url, { status: 500 });
|
|
537
|
+
let fetchCalls = 0;
|
|
538
|
+
const fetch = (async () => {
|
|
539
|
+
fetchCalls += 1;
|
|
540
|
+
return new Response("unexpected request", { status: 500 });
|
|
509
541
|
}) as FetchLike;
|
|
510
542
|
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
expect(marketplaceRefs).toContain(historicalRef);
|
|
519
|
-
// AND source + metadata come from that historical entry, not the gated catalog
|
|
520
|
-
expect(details.source).toEqual({
|
|
521
|
-
kind: "github",
|
|
522
|
-
repo: historicalRepo,
|
|
523
|
-
ref: "b".repeat(40),
|
|
524
|
-
});
|
|
525
|
-
expect(details.description).toBe("historical description");
|
|
526
|
-
expect(details.homepage).toBe("https://historical.example.com");
|
|
527
|
-
expect(details.license).toBe("MIT");
|
|
528
|
-
expect(details.readme).toContain("historical");
|
|
529
|
-
expect(details.ref).toBe(historicalRef);
|
|
543
|
+
await expect(
|
|
544
|
+
getPluginDetails(
|
|
545
|
+
{ name: "time-traveler", ref: historicalRef },
|
|
546
|
+
{ fetch, workspacePluginsDir: workspace },
|
|
547
|
+
),
|
|
548
|
+
).rejects.toBeInstanceOf(PluginDetailsNotFoundError);
|
|
549
|
+
expect(fetchCalls).toBe(0);
|
|
530
550
|
});
|
|
531
551
|
|
|
532
552
|
test("hides a gated integration at an explicit historical ref", async () => {
|
|
@@ -738,14 +758,11 @@ describe("getPluginDetails (catalog unavailable, platform enabled)", () => {
|
|
|
738
758
|
beforeEach(() => {
|
|
739
759
|
workspace = mkdtempSync(join(tmpdir(), "plugin-details-"));
|
|
740
760
|
invalidatePluginCatalogCache();
|
|
741
|
-
delete process.env.IS_CLOUD;
|
|
742
|
-
delete process.env.CADET_DISABLE_CLOUD;
|
|
743
761
|
});
|
|
744
762
|
|
|
745
763
|
afterEach(() => {
|
|
746
764
|
rmSync(workspace, { recursive: true, force: true });
|
|
747
765
|
invalidatePluginCatalogCache();
|
|
748
|
-
restoreEnv();
|
|
749
766
|
});
|
|
750
767
|
|
|
751
768
|
test("an installed copy still renders from disk when the catalog is down", async () => {
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
import { describe, expect, test } from "bun:test";
|
|
10
10
|
|
|
11
|
-
import { buildBundledPluginCatalog } from "../plugin-catalog-local.js";
|
|
12
11
|
import type { MarketplaceEntry } from "../plugin-marketplace.js";
|
|
13
12
|
import {
|
|
14
13
|
assertValidSearchPattern,
|
|
@@ -58,13 +57,7 @@ function entry(
|
|
|
58
57
|
/** Build a resolved {@link PluginCatalog} from raw entries the way the catalog
|
|
59
58
|
* sources do (dedupe by name, project, sort), reusing the real projection. */
|
|
60
59
|
function catalog(entries: MarketplaceEntry[], ref = "main"): PluginCatalog {
|
|
61
|
-
return {
|
|
62
|
-
...buildBundledPluginCatalog({
|
|
63
|
-
name: "mycadet",
|
|
64
|
-
plugins: entries,
|
|
65
|
-
}),
|
|
66
|
-
ref,
|
|
67
|
-
};
|
|
60
|
+
return { ref, matches: projectMarketplaceEntries(entries) };
|
|
68
61
|
}
|
|
69
62
|
|
|
70
63
|
describe("filterPluginCatalog", () => {
|
|
@@ -151,13 +144,13 @@ describe("assertValidSearchPattern", () => {
|
|
|
151
144
|
});
|
|
152
145
|
|
|
153
146
|
describe("marketplaceMatch", () => {
|
|
154
|
-
test("projects
|
|
147
|
+
test("projects an MCP package's integration metadata", () => {
|
|
155
148
|
const match = marketplaceMatch({
|
|
156
149
|
name: "fathom",
|
|
157
150
|
source: {
|
|
158
|
-
source: "
|
|
159
|
-
|
|
160
|
-
|
|
151
|
+
source: "github",
|
|
152
|
+
repo: "acme/fathom",
|
|
153
|
+
ref: SHA_A,
|
|
161
154
|
},
|
|
162
155
|
integration: {
|
|
163
156
|
kind: "mcp",
|
|
@@ -172,12 +165,12 @@ describe("marketplaceMatch", () => {
|
|
|
172
165
|
|
|
173
166
|
expect(match).toMatchObject({
|
|
174
167
|
name: "fathom",
|
|
175
|
-
path:
|
|
168
|
+
path: `github:acme/fathom@${SHA_A}`,
|
|
176
169
|
integration: { kind: "mcp", logo: "fathom.png" },
|
|
177
170
|
source: {
|
|
178
|
-
kind: "
|
|
179
|
-
|
|
180
|
-
|
|
171
|
+
kind: "github",
|
|
172
|
+
repo: "acme/fathom",
|
|
173
|
+
ref: SHA_A,
|
|
181
174
|
},
|
|
182
175
|
});
|
|
183
176
|
});
|
|
@@ -43,7 +43,7 @@ mock.module("../../../mcp/mcp-oauth-provider.js", () => ({
|
|
|
43
43
|
}));
|
|
44
44
|
|
|
45
45
|
import { resetHookCacheForTests } from "../../../hooks/hook-loader.js";
|
|
46
|
-
import { getWorkspacePluginsDir } from "../../../util/
|
|
46
|
+
import { getWorkspacePluginsDir } from "../../../util/layout.js";
|
|
47
47
|
import { InvalidPluginNameError } from "../install-from-github.js";
|
|
48
48
|
const { PluginNotInstalledError, uninstallPlugin } =
|
|
49
49
|
await import("../uninstall-plugin.js");
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
PluginNotFoundError,
|
|
29
29
|
PluginSourceUnavailableError,
|
|
30
30
|
} from "../install-from-github.js";
|
|
31
|
+
import { invalidatePluginCatalogCache } from "../plugin-catalog-cache.js";
|
|
31
32
|
import { computeFingerprint } from "../plugin-fingerprint.js";
|
|
32
33
|
import { PluginNotInstalledError } from "../uninstall-plugin.js";
|
|
33
34
|
import {
|
|
@@ -40,7 +41,7 @@ import {
|
|
|
40
41
|
const SHA_A = "a".repeat(40);
|
|
41
42
|
const SHA_B = "b".repeat(40);
|
|
42
43
|
const CANON_REPO = "vargasjr-dev/mycadet";
|
|
43
|
-
const
|
|
44
|
+
const CATALOG_URL = "https://test-cloud.mycadet.ai/v1/plugins/";
|
|
44
45
|
const CONTENTS = `https://api.github.com/repos/${CANON_REPO}/contents/`;
|
|
45
46
|
|
|
46
47
|
/** A marketplace manifest pinning `name` to `ref`. */
|
|
@@ -60,11 +61,11 @@ function manifestWith(name: string, ref: string): unknown {
|
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
/**
|
|
63
|
-
* Build a `fetch` that serves the
|
|
64
|
-
*
|
|
65
|
-
* clone is treated as a raw external
|
|
66
|
-
* manifest
|
|
67
|
-
* simulate a transient
|
|
64
|
+
* Build a `fetch` that serves the plugin catalog (a manifest flattened into
|
|
65
|
+
* cloud rows) and answers the GitHub Contents API listing (used by the
|
|
66
|
+
* adapter-stub lookup) with a 404, so the clone is treated as a raw external
|
|
67
|
+
* tree. `manifest: undefined` serves an empty catalog; `manifestStatus`
|
|
68
|
+
* overrides the catalog status to simulate a transient failure.
|
|
68
69
|
*/
|
|
69
70
|
function makeFetch(opts: {
|
|
70
71
|
manifest?: unknown;
|
|
@@ -73,16 +74,33 @@ function makeFetch(opts: {
|
|
|
73
74
|
}): FetchLike {
|
|
74
75
|
return (async (input: RequestInfo | URL) => {
|
|
75
76
|
const url = typeof input === "string" ? input : input.toString();
|
|
76
|
-
if (url.startsWith(
|
|
77
|
+
if (url.startsWith(CATALOG_URL)) {
|
|
77
78
|
if (opts.manifestStatus !== undefined && opts.manifestStatus !== 200) {
|
|
78
|
-
return new Response("
|
|
79
|
+
return new Response("catalog unavailable", {
|
|
79
80
|
status: opts.manifestStatus,
|
|
80
81
|
});
|
|
81
82
|
}
|
|
82
83
|
if (opts.manifest === undefined) {
|
|
83
|
-
return new Response(
|
|
84
|
+
return new Response(JSON.stringify({ plugins: [] }), { status: 200 });
|
|
84
85
|
}
|
|
85
|
-
|
|
86
|
+
const manifest = opts.manifest as {
|
|
87
|
+
plugins?: Array<{
|
|
88
|
+
name: string;
|
|
89
|
+
source?: { source: string; repo?: string; ref?: string };
|
|
90
|
+
description?: string;
|
|
91
|
+
category?: string;
|
|
92
|
+
license?: string;
|
|
93
|
+
}>;
|
|
94
|
+
};
|
|
95
|
+
const rows = (manifest.plugins ?? []).map((entry) => ({
|
|
96
|
+
name: entry.name,
|
|
97
|
+
...(entry.source?.repo ? { repo: entry.source.repo } : {}),
|
|
98
|
+
...(entry.source?.ref ? { ref: entry.source.ref } : {}),
|
|
99
|
+
description: entry.description,
|
|
100
|
+
category: entry.category,
|
|
101
|
+
license: entry.license,
|
|
102
|
+
}));
|
|
103
|
+
return new Response(JSON.stringify({ plugins: rows }), { status: 200 });
|
|
86
104
|
}
|
|
87
105
|
// The remote commit date `inspect` resolves to surface the human-readable
|
|
88
106
|
// "to" timestamp; absent it 404s and the timestamp degrades to null.
|
|
@@ -230,6 +248,9 @@ beforeEach(() => {
|
|
|
230
248
|
ws = mkdtempSync(join(tmpdir(), "upgrade-plugin-"));
|
|
231
249
|
pluginsDir = join(ws, "plugins");
|
|
232
250
|
mkdirSync(pluginsDir, { recursive: true });
|
|
251
|
+
invalidatePluginCatalogCache();
|
|
252
|
+
delete process.env.CADET_DISABLE_CLOUD;
|
|
253
|
+
delete process.env.IS_CLOUD;
|
|
233
254
|
});
|
|
234
255
|
|
|
235
256
|
afterEach(() => {
|
|
@@ -285,15 +306,15 @@ describe("upgradePlugin", () => {
|
|
|
285
306
|
expect(result.toTimestamp).toBe("2026-06-05T08:12:24.000Z");
|
|
286
307
|
});
|
|
287
308
|
|
|
288
|
-
test("a dry run
|
|
289
|
-
// GIVEN an installed copy and a marketplace pin
|
|
309
|
+
test("a dry run previews the target pin without a timestamp", async () => {
|
|
310
|
+
// GIVEN an installed copy and a marketplace pin that has advanced — the
|
|
311
|
+
// cloud catalog carries no commit dates, so the target timestamp is null
|
|
290
312
|
installCopy(pluginsDir, "level-up", {
|
|
291
313
|
commit: SHA_A,
|
|
292
314
|
committedAt: "2026-06-01T12:34:56.000Z",
|
|
293
315
|
});
|
|
294
316
|
const fetch = makeFetch({
|
|
295
317
|
manifest: manifestWith("level-up", SHA_B),
|
|
296
|
-
remoteCommitDate: "2026-06-05T08:12:24.000Z",
|
|
297
318
|
});
|
|
298
319
|
|
|
299
320
|
// WHEN a dry-run upgrade is performed (git must never run)
|
|
@@ -302,9 +323,9 @@ describe("upgradePlugin", () => {
|
|
|
302
323
|
{ fetch, runGit: unusedGitRunner, workspacePluginsDir: pluginsDir },
|
|
303
324
|
);
|
|
304
325
|
|
|
305
|
-
// THEN the preview shows the timestamp
|
|
326
|
+
// THEN the preview shows the recorded timestamp and a null target one
|
|
306
327
|
expect(result.fromTimestamp).toBe("2026-06-01T12:34:56.000Z");
|
|
307
|
-
expect(result.toTimestamp).
|
|
328
|
+
expect(result.toTimestamp).toBeNull();
|
|
308
329
|
});
|
|
309
330
|
|
|
310
331
|
test("is a no-op when the installed commit already equals the pin", async () => {
|
|
@@ -498,6 +519,7 @@ describe("upgradePlugin", () => {
|
|
|
498
519
|
},
|
|
499
520
|
);
|
|
500
521
|
expect(dry.outcome).toBe("would-upgrade");
|
|
522
|
+
invalidatePluginCatalogCache();
|
|
501
523
|
|
|
502
524
|
// No-op: the install already sits at the pin.
|
|
503
525
|
const noop = await upgradePlugin(
|
|
@@ -1245,6 +1267,7 @@ describe("upgradePlugin confirmStaged consent gate", () => {
|
|
|
1245
1267
|
},
|
|
1246
1268
|
);
|
|
1247
1269
|
expect(dry.outcome).toBe("would-upgrade");
|
|
1270
|
+
invalidatePluginCatalogCache();
|
|
1248
1271
|
|
|
1249
1272
|
const noop = await upgradePlugin(
|
|
1250
1273
|
{ name: "level-up" },
|
|
@@ -39,7 +39,7 @@ import { join } from "node:path";
|
|
|
39
39
|
import { createTwoFilesPatch } from "diff";
|
|
40
40
|
|
|
41
41
|
import { PRESERVED_ENTRIES } from "../../plugins/plugin-tree-walk.js";
|
|
42
|
-
import { getWorkspacePluginsDir } from "../../util/
|
|
42
|
+
import { getWorkspacePluginsDir } from "../../util/layout.js";
|
|
43
43
|
import type { FetchLike } from "./fetch-like.js";
|
|
44
44
|
import {
|
|
45
45
|
type GitRunner,
|
|
@@ -29,25 +29,18 @@ import {
|
|
|
29
29
|
type InstalledPluginInfo,
|
|
30
30
|
readInstalledPlugin,
|
|
31
31
|
} from "./list-installed-plugins.js";
|
|
32
|
-
import {
|
|
33
|
-
areCloudFeaturesEnabled,
|
|
34
|
-
readBundledLocalPluginCatalog,
|
|
35
|
-
} from "./plugin-catalog-local.js";
|
|
32
|
+
import { getPluginCatalog } from "./plugin-catalog-cache.js";
|
|
36
33
|
import { isPluginCatalogEntryVisible } from "./plugin-catalog-visibility.js";
|
|
37
34
|
import { DEFAULT_PLUGIN_REF } from "./plugin-constants.js";
|
|
38
35
|
import {
|
|
39
36
|
compareFingerprint,
|
|
40
37
|
type FingerprintComparison,
|
|
41
38
|
} from "./plugin-fingerprint.js";
|
|
42
|
-
import {
|
|
43
|
-
fetchMarketplaceEntries,
|
|
44
|
-
type MarketplaceEntry,
|
|
45
|
-
} from "./plugin-marketplace.js";
|
|
46
39
|
import {
|
|
47
40
|
detectPluginSurfaces,
|
|
48
41
|
type PluginSurfaces,
|
|
49
42
|
} from "./plugin-surfaces.js";
|
|
50
|
-
import type {
|
|
43
|
+
import type { PluginSearchMatch } from "./search-plugins.js";
|
|
51
44
|
import { USER_AGENT } from "./user-agent.js";
|
|
52
45
|
|
|
53
46
|
/** Full commit SHA (40 hex SHA-1 or 64 hex SHA-256). */
|
|
@@ -118,8 +111,6 @@ export interface PluginLocalInfo {
|
|
|
118
111
|
|
|
119
112
|
/** The marketplace's current pin and advertised metadata for a plugin. */
|
|
120
113
|
export interface PluginRemoteInfo {
|
|
121
|
-
/** Present for a package embedded in the assistant distribution. */
|
|
122
|
-
readonly kind?: "local";
|
|
123
114
|
/** `owner/repo` of the external plugin repository. */
|
|
124
115
|
readonly repo: string;
|
|
125
116
|
/** Repo-relative directory holding the plugin root; `""` = repo root. */
|
|
@@ -138,8 +129,6 @@ export interface PluginRemoteInfo {
|
|
|
138
129
|
readonly category: string | null;
|
|
139
130
|
/** Ref of the canonical repo the marketplace manifest was read from. */
|
|
140
131
|
readonly marketplaceRef: string;
|
|
141
|
-
/** Bundled package version. Present when {@link kind} is `local`. */
|
|
142
|
-
readonly version?: string;
|
|
143
132
|
}
|
|
144
133
|
|
|
145
134
|
/** Resolved inspection of a single plugin. */
|
|
@@ -186,8 +175,6 @@ export interface InspectPluginDeps {
|
|
|
186
175
|
readonly fetch: FetchLike;
|
|
187
176
|
/** Override the workspace plugins directory. Falls back to the live workspace. */
|
|
188
177
|
readonly workspacePluginsDir?: string;
|
|
189
|
-
/** Override the embedded local-package catalog for focused tests. */
|
|
190
|
-
readonly localCatalog?: PluginCatalog;
|
|
191
178
|
}
|
|
192
179
|
|
|
193
180
|
function readLocal(
|
|
@@ -221,58 +208,20 @@ function readLocal(
|
|
|
221
208
|
};
|
|
222
209
|
}
|
|
223
210
|
|
|
224
|
-
function
|
|
225
|
-
entry: MarketplaceEntry,
|
|
226
|
-
marketplaceRef: string,
|
|
227
|
-
committedAt: string | null,
|
|
228
|
-
): PluginRemoteInfo {
|
|
229
|
-
if (entry.source.source === "local") {
|
|
230
|
-
return {
|
|
231
|
-
kind: "local",
|
|
232
|
-
repo: "",
|
|
233
|
-
path: entry.source.path,
|
|
234
|
-
commit: entry.source.version,
|
|
235
|
-
committedAt: null,
|
|
236
|
-
description: entry.description ?? null,
|
|
237
|
-
homepage: entry.homepage ?? null,
|
|
238
|
-
license: entry.license ?? null,
|
|
239
|
-
category: entry.category ?? null,
|
|
240
|
-
marketplaceRef,
|
|
241
|
-
version: entry.source.version,
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
return {
|
|
245
|
-
repo: entry.source.repo,
|
|
246
|
-
path: entry.source.path ?? "",
|
|
247
|
-
commit: entry.source.ref,
|
|
248
|
-
committedAt,
|
|
249
|
-
description: entry.description ?? null,
|
|
250
|
-
homepage: entry.homepage ?? null,
|
|
251
|
-
license: entry.license ?? null,
|
|
252
|
-
category: entry.category ?? null,
|
|
253
|
-
marketplaceRef,
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
function readLocalPackageRemote(
|
|
211
|
+
function readCatalogRemote(
|
|
258
212
|
match: PluginSearchMatch,
|
|
259
213
|
marketplaceRef: string,
|
|
260
|
-
): PluginRemoteInfo
|
|
261
|
-
if (match.source.kind !== "local") {
|
|
262
|
-
return null;
|
|
263
|
-
}
|
|
214
|
+
): PluginRemoteInfo {
|
|
264
215
|
return {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
commit: match.source.version,
|
|
216
|
+
repo: match.source.repo,
|
|
217
|
+
path: match.source.path ?? "",
|
|
218
|
+
commit: match.source.ref,
|
|
269
219
|
committedAt: null,
|
|
270
220
|
description: match.description ?? null,
|
|
271
221
|
homepage: match.homepage ?? null,
|
|
272
222
|
license: match.license ?? null,
|
|
273
223
|
category: match.category,
|
|
274
224
|
marketplaceRef,
|
|
275
|
-
version: match.source.version,
|
|
276
225
|
};
|
|
277
226
|
}
|
|
278
227
|
|
|
@@ -346,38 +295,13 @@ export async function inspectPlugin(
|
|
|
346
295
|
|
|
347
296
|
let remote: PluginRemoteInfo | null = null;
|
|
348
297
|
let remoteError: string | null = null;
|
|
349
|
-
const installedLocalSource = local?.source?.kind === "local";
|
|
350
|
-
const useBundledLocalCatalog =
|
|
351
|
-
installedLocalSource || (!installed && !areCloudFeaturesEnabled());
|
|
352
298
|
try {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
(!installedLocalSource ||
|
|
360
|
-
candidate.source.path === local.source?.path),
|
|
361
|
-
);
|
|
362
|
-
remote = match ? readLocalPackageRemote(match, catalog.ref) : null;
|
|
363
|
-
}
|
|
364
|
-
if (!remote && !installedLocalSource) {
|
|
365
|
-
const entries = await fetchMarketplaceEntries(
|
|
366
|
-
{ fetch: deps.fetch },
|
|
367
|
-
{ ref: marketplaceRef },
|
|
368
|
-
);
|
|
369
|
-
const match = entries.find((entry) => entry.name === name);
|
|
370
|
-
if (match) {
|
|
371
|
-
const committedAt =
|
|
372
|
-
match.source.source === "github"
|
|
373
|
-
? await fetchCommitDate(
|
|
374
|
-
match.source.repo,
|
|
375
|
-
match.source.ref,
|
|
376
|
-
deps.fetch,
|
|
377
|
-
)
|
|
378
|
-
: null;
|
|
379
|
-
remote = readRemote(match, marketplaceRef, committedAt);
|
|
380
|
-
}
|
|
299
|
+
const catalog = await getPluginCatalog(marketplaceRef, {
|
|
300
|
+
fetch: deps.fetch,
|
|
301
|
+
});
|
|
302
|
+
const match = catalog.matches.find((candidate) => candidate.name === name);
|
|
303
|
+
if (match) {
|
|
304
|
+
remote = readCatalogRemote(match, marketplaceRef);
|
|
381
305
|
}
|
|
382
306
|
} catch (err) {
|
|
383
307
|
remoteError = err instanceof Error ? err.message : String(err);
|
|
@@ -408,14 +332,6 @@ function classify(
|
|
|
408
332
|
if (!remote) {
|
|
409
333
|
return "not-in-marketplace";
|
|
410
334
|
}
|
|
411
|
-
if (remote.kind === "local") {
|
|
412
|
-
if (local?.source?.kind !== "local") {
|
|
413
|
-
return "unknown-provenance";
|
|
414
|
-
}
|
|
415
|
-
return local.source.version === remote.version
|
|
416
|
-
? "up-to-date"
|
|
417
|
-
: "update-available";
|
|
418
|
-
}
|
|
419
335
|
if (!local?.commit) {
|
|
420
336
|
return "unknown-provenance";
|
|
421
337
|
}
|