@mycadet/assistant 0.12.9 → 0.12.11
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/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
- package/node_modules/@mycadet/ces-client/src/http-credentials.ts +18 -1
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
- package/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/service-contracts/src/ingress.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 +87 -404
- 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 +25 -32
- 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 +72 -298
- 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 +49 -706
- 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,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Materialize reviewed local marketplace packages from the generated bundle.
|
|
3
|
-
* Package keys come from plugins/marketplace.json and never resolve against a
|
|
4
|
-
* caller-controlled filesystem root.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { mkdirSync, writeFileSync } from "node:fs";
|
|
8
|
-
import { dirname, join } from "node:path";
|
|
9
|
-
|
|
10
|
-
import bundledPackages from "./bundled-plugin-packages.json" with { type: "json" };
|
|
11
|
-
|
|
12
|
-
interface BundledPackageFile {
|
|
13
|
-
readonly path: string;
|
|
14
|
-
readonly contentBase64: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface BundledPackage {
|
|
18
|
-
readonly version: string;
|
|
19
|
-
readonly files: readonly BundledPackageFile[];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const packages = bundledPackages.packages as Record<string, BundledPackage>;
|
|
23
|
-
|
|
24
|
-
export class BundledPluginPackageError extends Error {
|
|
25
|
-
constructor(message: string) {
|
|
26
|
-
super(message);
|
|
27
|
-
this.name = "BundledPluginPackageError";
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** Return the embedded package when its path and version match the catalog. */
|
|
32
|
-
export function getBundledPluginPackage(
|
|
33
|
-
path: string,
|
|
34
|
-
version: string,
|
|
35
|
-
): BundledPackage | null {
|
|
36
|
-
const pluginPackage = packages[path];
|
|
37
|
-
return pluginPackage?.version === version ? pluginPackage : null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Read one UTF-8 file from an exact embedded package. */
|
|
41
|
-
export function readBundledPluginFile(
|
|
42
|
-
path: string,
|
|
43
|
-
version: string,
|
|
44
|
-
filePath: string,
|
|
45
|
-
): string | null {
|
|
46
|
-
const file = getBundledPluginPackage(path, version)?.files.find(
|
|
47
|
-
(candidate) => candidate.path === filePath,
|
|
48
|
-
);
|
|
49
|
-
return file
|
|
50
|
-
? Buffer.from(file.contentBase64, "base64").toString("utf8")
|
|
51
|
-
: null;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/** Copy one exact embedded package into an existing staging directory. */
|
|
55
|
-
export function materializeBundledPluginPackage(
|
|
56
|
-
path: string,
|
|
57
|
-
version: string,
|
|
58
|
-
destination: string,
|
|
59
|
-
): number {
|
|
60
|
-
const pluginPackage = getBundledPluginPackage(path, version);
|
|
61
|
-
if (!pluginPackage) {
|
|
62
|
-
throw new BundledPluginPackageError(
|
|
63
|
-
`Bundled plugin package ${path} @ ${version} is unavailable`,
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
for (const file of pluginPackage.files) {
|
|
68
|
-
if (
|
|
69
|
-
file.path.length === 0 ||
|
|
70
|
-
file.path.startsWith("/") ||
|
|
71
|
-
file.path.includes("\\") ||
|
|
72
|
-
file.path
|
|
73
|
-
.split("/")
|
|
74
|
-
.some(
|
|
75
|
-
(segment) => segment === "." || segment === ".." || segment === "",
|
|
76
|
-
)
|
|
77
|
-
) {
|
|
78
|
-
throw new BundledPluginPackageError(
|
|
79
|
-
`Bundled plugin package ${path} contains an unsafe file path`,
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
const target = join(destination, ...file.path.split("/"));
|
|
83
|
-
mkdirSync(dirname(target), { recursive: true });
|
|
84
|
-
writeFileSync(target, Buffer.from(file.contentBase64, "base64"));
|
|
85
|
-
}
|
|
86
|
-
return pluginPackage.files.length;
|
|
87
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Offline plugin catalog reader backed by the manifest bundled into the
|
|
3
|
-
* package at build time. `bundled-marketplace.json` is a generated artifact
|
|
4
|
-
* (git-ignored) that meta/sync-bundled-copies.ts copies from the canonical
|
|
5
|
-
* plugins/marketplace.json before every build, test, and install — the same
|
|
6
|
-
* treatment as the feature-flag registry.
|
|
7
|
-
*
|
|
8
|
-
* `getPluginCatalog` selects this reader only when platform features are
|
|
9
|
-
* disabled (air-gapped / self-hosted, `CADET_DISABLE_CLOUD=true`). Importing
|
|
10
|
-
* the JSON directly (resolveJsonModule) inlines it into the bundle, so there is
|
|
11
|
-
* no filesystem path resolution and the manifest is always present at runtime —
|
|
12
|
-
* it works identically in dev, Docker, and an npm-packed macOS install.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import bundledManifest from "./bundled-marketplace.json" with { type: "json" };
|
|
16
|
-
import {
|
|
17
|
-
isPluginCatalogEntryVisible,
|
|
18
|
-
type PluginCatalogFeatureFlagResolver,
|
|
19
|
-
} from "./plugin-catalog-visibility.js";
|
|
20
|
-
import {
|
|
21
|
-
type MarketplaceEntry,
|
|
22
|
-
marketplaceManifestSchema,
|
|
23
|
-
type ResolvedPluginSource,
|
|
24
|
-
resolveMarketplaceSource,
|
|
25
|
-
} from "./plugin-marketplace.js";
|
|
26
|
-
import {
|
|
27
|
-
type PluginCatalog,
|
|
28
|
-
projectMarketplaceEntries,
|
|
29
|
-
} from "./search-plugins.js";
|
|
30
|
-
|
|
31
|
-
// Re-exported so `local`-tagged CLI commands can gate on platform features
|
|
32
|
-
// without importing `platform/` directly (cli/no-daemon-internals allows lib).
|
|
33
|
-
export { areCloudFeaturesEnabled } from "../../cloud/feature-gate.js";
|
|
34
|
-
export { isPluginCatalogEntryVisible };
|
|
35
|
-
|
|
36
|
-
let memoizedEntries: readonly MarketplaceEntry[] | undefined;
|
|
37
|
-
|
|
38
|
-
/** Validated bundled manifest entries, parsed once and reused. */
|
|
39
|
-
function bundledEntries(): readonly MarketplaceEntry[] {
|
|
40
|
-
memoizedEntries ??= marketplaceManifestSchema.parse(bundledManifest).plugins;
|
|
41
|
-
return memoizedEntries;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Validate and project a marketplace manifest into a {@link PluginCatalog}:
|
|
46
|
-
* every entry deduped by name, projected, and sorted alphabetically. A
|
|
47
|
-
* malformed bundled manifest is a build defect, so parsing throws rather than
|
|
48
|
-
* silently degrading. Defaults to the bundled manifest (parsed once); tests
|
|
49
|
-
* pass an override to assert it throws on invalid input.
|
|
50
|
-
*/
|
|
51
|
-
export function buildBundledPluginCatalog(
|
|
52
|
-
rawManifest: unknown = bundledManifest,
|
|
53
|
-
): PluginCatalog {
|
|
54
|
-
const plugins =
|
|
55
|
-
rawManifest === bundledManifest
|
|
56
|
-
? bundledEntries()
|
|
57
|
-
: marketplaceManifestSchema.parse(rawManifest).plugins;
|
|
58
|
-
return { ref: "bundled", matches: projectMarketplaceEntries(plugins) };
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
let memoized: PluginCatalog | undefined;
|
|
62
|
-
|
|
63
|
-
/** Memoized {@link buildBundledPluginCatalog}, so the mapping runs once. */
|
|
64
|
-
export function readBundledPluginCatalog(): PluginCatalog {
|
|
65
|
-
memoized ??= buildBundledPluginCatalog();
|
|
66
|
-
return memoized;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/** Local packages the current assistant release can materialize itself. */
|
|
70
|
-
export function readBundledLocalPluginCatalog(): PluginCatalog {
|
|
71
|
-
return {
|
|
72
|
-
ref: "bundled",
|
|
73
|
-
matches: projectMarketplaceEntries(
|
|
74
|
-
bundledEntries().filter((entry) => entry.source.source === "local"),
|
|
75
|
-
),
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Resolve an install name to its exact source from the bundled manifest, or
|
|
81
|
-
* `null` when no bundled entry claims the name. The offline analogue of
|
|
82
|
-
* resolving against the remote-fetched marketplace, used when platform
|
|
83
|
-
* features are disabled and `assistant plugins install <name>` must resolve the
|
|
84
|
-
* pin without any network call.
|
|
85
|
-
*/
|
|
86
|
-
export function resolveBundledPluginSource(
|
|
87
|
-
name: string,
|
|
88
|
-
isFeatureFlagEnabled?: PluginCatalogFeatureFlagResolver,
|
|
89
|
-
): ResolvedPluginSource | null {
|
|
90
|
-
if (!isPluginCatalogEntryVisible(name, isFeatureFlagEnabled)) {
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
|
-
return resolveMarketplaceSource(name, bundledEntries());
|
|
94
|
-
}
|
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reconstruct the history of marketplace pins for a single plugin.
|
|
3
|
-
*
|
|
4
|
-
* The curated `plugins/marketplace.json` manifest (see {@link ./plugin-marketplace})
|
|
5
|
-
* records only the *current* pin for each plugin — there is no stored version
|
|
6
|
-
* list. But the manifest is a file in a Git repo, and every time a curator bumps
|
|
7
|
-
* a plugin's pin, that is a commit to the manifest. So the history of reviewed
|
|
8
|
-
* pins already exists as the commit history of that one file: this module walks
|
|
9
|
-
* it (newest → oldest) via the GitHub API and reports the distinct pins a plugin
|
|
10
|
-
* has been promoted to over time, each tagged with the marketplace commit an
|
|
11
|
-
* install can reproduce it from.
|
|
12
|
-
*
|
|
13
|
-
* Why this is the safe source for "install an older version": every commit on
|
|
14
|
-
* the default branch was reviewed and merged, so a pin drawn from this history
|
|
15
|
-
* is a reviewed, known-good revision — unlike an arbitrary caller-supplied ref,
|
|
16
|
-
* which the install route deliberately refuses. Resolving an older pin to the
|
|
17
|
-
* marketplace commit that introduced it (rather than the plugin SHA directly)
|
|
18
|
-
* also means the install reads that era's manifest, so the curated adapter stub
|
|
19
|
-
* matches the pin and the historical version reproduces coherently.
|
|
20
|
-
*
|
|
21
|
-
* Designed for direct programmatic use with an injected `fetch`, mirroring the
|
|
22
|
-
* sibling plugin libraries.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
import type { FetchLike } from "./fetch-like.js";
|
|
26
|
-
import { sanitizePluginName } from "./install-from-github.js";
|
|
27
|
-
import { DEFAULT_PIN_HISTORY_LIMIT } from "./plugin-constants.js";
|
|
28
|
-
import {
|
|
29
|
-
fetchMarketplaceEntries,
|
|
30
|
-
MARKETPLACE_MANIFEST_LOCATION,
|
|
31
|
-
} from "./plugin-marketplace.js";
|
|
32
|
-
import { USER_AGENT } from "./user-agent.js";
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Cap on how many manifest-touching commits are inspected in one walk. Bounds
|
|
36
|
-
* the GitHub API cost: a plugin whose pin changes rarely could otherwise force
|
|
37
|
-
* a fetch of the manifest at every commit that touched it for *any* plugin.
|
|
38
|
-
* Well above {@link DEFAULT_PIN_HISTORY_LIMIT} so the default listing is
|
|
39
|
-
* complete in all but pathological histories.
|
|
40
|
-
*/
|
|
41
|
-
const MAX_MARKETPLACE_COMMITS_SCANNED = 100;
|
|
42
|
-
|
|
43
|
-
/** A single point in a plugin's marketplace-pin history. */
|
|
44
|
-
export interface PluginPinHistoryEntry {
|
|
45
|
-
/** Plugin commit SHA pinned at this point in history. */
|
|
46
|
-
readonly pin: string;
|
|
47
|
-
/**
|
|
48
|
-
* Marketplace-manifest commit to install this pin from — the newest commit
|
|
49
|
-
* that carries it. Installing with this as the marketplace ref reproduces the
|
|
50
|
-
* pin together with the curated adapter stub of the same era.
|
|
51
|
-
*/
|
|
52
|
-
readonly marketplaceCommit: string;
|
|
53
|
-
/**
|
|
54
|
-
* ISO-8601 committer date (UTC) of {@link PluginPinHistoryEntry.marketplaceCommit},
|
|
55
|
-
* i.e. when this pin was promoted; `null` when the date could not be read.
|
|
56
|
-
*/
|
|
57
|
-
readonly promotedAt: string | null;
|
|
58
|
-
/** True for the pin currently active on the default branch. */
|
|
59
|
-
readonly current: boolean;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/** Options controlling the pin-history walk. */
|
|
63
|
-
export interface ListPinHistoryOptions {
|
|
64
|
-
/** Max distinct pins to return (newest first). Defaults to {@link DEFAULT_PIN_HISTORY_LIMIT}. */
|
|
65
|
-
readonly limit?: number;
|
|
66
|
-
/** Marketplace branch to read history from. Defaults to `main`. */
|
|
67
|
-
readonly ref?: string;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** Dependencies injected by the caller. */
|
|
71
|
-
export interface ListPinHistoryDeps {
|
|
72
|
-
/** HTTP client. Production callers pass `globalThis.fetch.bind(globalThis)`. */
|
|
73
|
-
readonly fetch: FetchLike;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** Shape of a commit entry from the GitHub commits API. */
|
|
77
|
-
interface GitHubCommitListEntry {
|
|
78
|
-
readonly sha: string;
|
|
79
|
-
readonly commit: {
|
|
80
|
-
readonly committer?: { readonly date?: string } | null;
|
|
81
|
-
} | null;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/** A manifest-touching commit and its committer date. */
|
|
85
|
-
interface ManifestCommit {
|
|
86
|
-
readonly sha: string;
|
|
87
|
-
readonly date: string | null;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** The pin-history walk could not read the marketplace commit list. */
|
|
91
|
-
export class PluginPinHistoryError extends Error {
|
|
92
|
-
constructor(message: string) {
|
|
93
|
-
super(message);
|
|
94
|
-
this.name = "PluginPinHistoryError";
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* List the commits that touched the marketplace manifest on `ref`, newest
|
|
100
|
-
* first, capped at {@link MAX_MARKETPLACE_COMMITS_SCANNED}. A 404 (the file
|
|
101
|
-
* never existed at this ref) yields an empty list.
|
|
102
|
-
*/
|
|
103
|
-
async function listManifestCommits(
|
|
104
|
-
ref: string,
|
|
105
|
-
fetchFn: FetchLike,
|
|
106
|
-
): Promise<ManifestCommit[]> {
|
|
107
|
-
const { owner, repo, path } = MARKETPLACE_MANIFEST_LOCATION;
|
|
108
|
-
const url =
|
|
109
|
-
`https://api.github.com/repos/${owner}/${repo}/commits` +
|
|
110
|
-
`?path=${encodeURIComponent(path)}` +
|
|
111
|
-
`&sha=${encodeURIComponent(ref)}` +
|
|
112
|
-
`&per_page=${MAX_MARKETPLACE_COMMITS_SCANNED}`;
|
|
113
|
-
|
|
114
|
-
const res = await fetchFn(url, {
|
|
115
|
-
headers: {
|
|
116
|
-
Accept: "application/vnd.github+json",
|
|
117
|
-
"User-Agent": USER_AGENT,
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
if (res.status === 404) {
|
|
121
|
-
return [];
|
|
122
|
-
}
|
|
123
|
-
if (!res.ok) {
|
|
124
|
-
throw new PluginPinHistoryError(
|
|
125
|
-
`Marketplace commit history fetch failed for ${path} @ ${ref}: HTTP ${res.status}`,
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
let body: unknown;
|
|
130
|
-
try {
|
|
131
|
-
body = JSON.parse(await res.text());
|
|
132
|
-
} catch (err) {
|
|
133
|
-
throw new PluginPinHistoryError(
|
|
134
|
-
`Marketplace commit history is not valid JSON: ${
|
|
135
|
-
err instanceof Error ? err.message : String(err)
|
|
136
|
-
}`,
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
if (!Array.isArray(body)) {
|
|
140
|
-
throw new PluginPinHistoryError(
|
|
141
|
-
"Marketplace commit history response was not an array",
|
|
142
|
-
);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const commits: ManifestCommit[] = [];
|
|
146
|
-
for (const item of body as GitHubCommitListEntry[]) {
|
|
147
|
-
if (typeof item?.sha !== "string") {
|
|
148
|
-
continue;
|
|
149
|
-
}
|
|
150
|
-
const rawDate = item.commit?.committer?.date;
|
|
151
|
-
commits.push({
|
|
152
|
-
sha: item.sha,
|
|
153
|
-
date: typeof rawDate === "string" ? rawDate : null,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
return commits;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Resolve the plugin's pinned SHA in the manifest at a specific marketplace
|
|
161
|
-
* commit, or `null` when no entry claims the name at that revision.
|
|
162
|
-
*/
|
|
163
|
-
async function pinAtCommit(
|
|
164
|
-
name: string,
|
|
165
|
-
marketplaceCommit: string,
|
|
166
|
-
fetchFn: FetchLike,
|
|
167
|
-
): Promise<string | null> {
|
|
168
|
-
const entries = await fetchMarketplaceEntries(
|
|
169
|
-
{ fetch: fetchFn },
|
|
170
|
-
{ ref: marketplaceCommit },
|
|
171
|
-
);
|
|
172
|
-
const source = entries.find((entry) => entry.name === name)?.source;
|
|
173
|
-
return source?.source === "github" ? source.ref : null;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Walk a plugin's distinct marketplace pins, newest first. Each pin is yielded
|
|
178
|
-
* once, tagged with the newest marketplace commit carrying it. Revisions where
|
|
179
|
-
* the plugin is absent from the manifest are skipped (a gap, not a pin). The
|
|
180
|
-
* `current` flag is set against the pin live on `ref` today.
|
|
181
|
-
*
|
|
182
|
-
* Bounded by {@link MAX_MARKETPLACE_COMMITS_SCANNED} commits scanned.
|
|
183
|
-
*/
|
|
184
|
-
async function* iteratePinHistory(
|
|
185
|
-
name: string,
|
|
186
|
-
ref: string,
|
|
187
|
-
fetchFn: FetchLike,
|
|
188
|
-
): AsyncGenerator<PluginPinHistoryEntry> {
|
|
189
|
-
const commits = await listManifestCommits(ref, fetchFn);
|
|
190
|
-
if (commits.length === 0) {
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// The pin live on the branch today, used to flag the current entry. Reading
|
|
195
|
-
// it explicitly (rather than assuming the newest commit carries it) stays
|
|
196
|
-
// correct even if the plugin was just removed from the manifest at the tip.
|
|
197
|
-
const currentPin = await pinAtCommit(name, ref, fetchFn);
|
|
198
|
-
|
|
199
|
-
let lastPin: string | null = null;
|
|
200
|
-
for (const commit of commits) {
|
|
201
|
-
const pin = await pinAtCommit(name, commit.sha, fetchFn);
|
|
202
|
-
if (pin === null) {
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
205
|
-
if (pin === lastPin) {
|
|
206
|
-
continue;
|
|
207
|
-
}
|
|
208
|
-
lastPin = pin;
|
|
209
|
-
yield {
|
|
210
|
-
pin,
|
|
211
|
-
marketplaceCommit: commit.sha,
|
|
212
|
-
promotedAt: commit.date,
|
|
213
|
-
current: currentPin !== null && pin === currentPin,
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* List a plugin's distinct marketplace pins, newest first, capped at
|
|
220
|
-
* `limit` (default {@link DEFAULT_PIN_HISTORY_LIMIT}). The first entry is the
|
|
221
|
-
* current pin. An empty list means the plugin has no resolvable history at this
|
|
222
|
-
* ref (never in the manifest, or the manifest does not exist).
|
|
223
|
-
*
|
|
224
|
-
* Throws {@link PluginPinHistoryError} when the commit list cannot be read, and
|
|
225
|
-
* propagates a `MarketplaceFetchError` if a manifest revision fails to parse.
|
|
226
|
-
*/
|
|
227
|
-
export async function listPinHistory(
|
|
228
|
-
name: string,
|
|
229
|
-
deps: ListPinHistoryDeps,
|
|
230
|
-
opts: ListPinHistoryOptions = {},
|
|
231
|
-
): Promise<PluginPinHistoryEntry[]> {
|
|
232
|
-
const sanitized = sanitizePluginName(name);
|
|
233
|
-
const ref = opts.ref ?? "main";
|
|
234
|
-
const limit = opts.limit ?? DEFAULT_PIN_HISTORY_LIMIT;
|
|
235
|
-
|
|
236
|
-
const out: PluginPinHistoryEntry[] = [];
|
|
237
|
-
for await (const entry of iteratePinHistory(sanitized, ref, deps.fetch)) {
|
|
238
|
-
out.push(entry);
|
|
239
|
-
if (out.length >= limit) {
|
|
240
|
-
break;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
return out;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Resolve a plugin pin (a full commit SHA) to the marketplace commit it should
|
|
248
|
-
* be installed from, by searching the plugin's pin history. Returns `null` when
|
|
249
|
-
* the pin is not found in the scanned history — i.e. it is not a reviewed pin
|
|
250
|
-
* this plugin was ever promoted to (or it predates the scan window).
|
|
251
|
-
*
|
|
252
|
-
* Case-insensitive on the SHA, matching the rest of the install pipeline. The
|
|
253
|
-
* search walks the full scan window, not just the `limit` shown by
|
|
254
|
-
* {@link listPinHistory}, so a pin older than the default listing still
|
|
255
|
-
* resolves.
|
|
256
|
-
*/
|
|
257
|
-
export async function resolvePinToMarketplaceCommit(
|
|
258
|
-
name: string,
|
|
259
|
-
pin: string,
|
|
260
|
-
deps: ListPinHistoryDeps,
|
|
261
|
-
opts: { readonly ref?: string } = {},
|
|
262
|
-
): Promise<PluginPinHistoryEntry | null> {
|
|
263
|
-
const sanitized = sanitizePluginName(name);
|
|
264
|
-
const ref = opts.ref ?? "main";
|
|
265
|
-
const target = pin.trim().toLowerCase();
|
|
266
|
-
if (target.length === 0) {
|
|
267
|
-
return null;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
for await (const entry of iteratePinHistory(sanitized, ref, deps.fetch)) {
|
|
271
|
-
if (entry.pin.toLowerCase() === target) {
|
|
272
|
-
return entry;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
return null;
|
|
276
|
-
}
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
|
-
|
|
3
|
-
import { credentialKey } from "../../security/credential-key.js";
|
|
4
|
-
|
|
5
|
-
let mockSecureKeys: Record<string, string> = {};
|
|
6
|
-
let throwForKey: string | undefined;
|
|
7
|
-
|
|
8
|
-
mock.module("../../security/secure-keys.js", () => ({
|
|
9
|
-
getSecureKeyAsync: async (key: string) => {
|
|
10
|
-
if (throwForKey && key === throwForKey) {
|
|
11
|
-
throw new Error("credential store unreachable");
|
|
12
|
-
}
|
|
13
|
-
return mockSecureKeys[key] ?? undefined;
|
|
14
|
-
},
|
|
15
|
-
// Peer tests in a combined run import this name from the same module; stub
|
|
16
|
-
// it so their ESM named-import validation is satisfied when this mock wins.
|
|
17
|
-
deleteSecureKeyAsync: async () => ({ deleted: false }),
|
|
18
|
-
}));
|
|
19
|
-
|
|
20
|
-
const {
|
|
21
|
-
getCloudAssistantId,
|
|
22
|
-
getCloudOrganizationId,
|
|
23
|
-
getCloudUserId,
|
|
24
|
-
setCloudAssistantId,
|
|
25
|
-
setCloudOrganizationId,
|
|
26
|
-
setCloudUserId,
|
|
27
|
-
} = await import("../env.js");
|
|
28
|
-
const { _resetCloudIdentityEnsureForTests } =
|
|
29
|
-
await import("../cloud-identity.js");
|
|
30
|
-
const { rehydrateCloudCredentials } = await import("../cloud-rehydration.js");
|
|
31
|
-
|
|
32
|
-
const PROD_URL = "https://cloud.mycadet.ai";
|
|
33
|
-
const ASSISTANT_ID = "11111111-2222-4333-8444-555555555555";
|
|
34
|
-
const ORG_ID = "22222222-3333-4444-8555-666666666666";
|
|
35
|
-
const USER_ID = "33333333-4444-4555-8666-777777777777";
|
|
36
|
-
|
|
37
|
-
describe("rehydrateCloudCredentials", () => {
|
|
38
|
-
const originalCloudUrlEnv = process.env.CADET_CLOUD_URL;
|
|
39
|
-
const originalOrgEnv = process.env.CLOUD_ORGANIZATION_ID;
|
|
40
|
-
const originalUserEnv = process.env.CLOUD_USER_ID;
|
|
41
|
-
const originalAssistantApiKeyEnv = process.env.ASSISTANT_API_KEY;
|
|
42
|
-
const originalFetch = globalThis.fetch;
|
|
43
|
-
const fetchCalls: Array<{ url: string; init?: RequestInit }> = [];
|
|
44
|
-
let fetchImpl: (
|
|
45
|
-
input: RequestInfo | URL,
|
|
46
|
-
init?: RequestInit,
|
|
47
|
-
) => Promise<Response> = async () =>
|
|
48
|
-
new Response("not found", { status: 404 });
|
|
49
|
-
|
|
50
|
-
beforeEach(() => {
|
|
51
|
-
mockSecureKeys = {};
|
|
52
|
-
throwForKey = undefined;
|
|
53
|
-
fetchCalls.length = 0;
|
|
54
|
-
fetchImpl = async () => new Response("not found", { status: 404 });
|
|
55
|
-
globalThis.fetch = (async (
|
|
56
|
-
input: RequestInfo | URL,
|
|
57
|
-
init?: RequestInit,
|
|
58
|
-
) => {
|
|
59
|
-
const url = typeof input === "string" ? input : input.toString();
|
|
60
|
-
fetchCalls.push({ url, init });
|
|
61
|
-
return fetchImpl(input, init);
|
|
62
|
-
}) as unknown as typeof fetch;
|
|
63
|
-
// Env vars take precedence over the rehydrated overrides for some fields;
|
|
64
|
-
// clear them so the credential-store values are what we observe.
|
|
65
|
-
delete process.env.CADET_CLOUD_URL;
|
|
66
|
-
delete process.env.CLOUD_ORGANIZATION_ID;
|
|
67
|
-
delete process.env.CLOUD_USER_ID;
|
|
68
|
-
delete process.env.ASSISTANT_API_KEY;
|
|
69
|
-
// Reset in-memory overrides between tests.
|
|
70
|
-
setCloudAssistantId(undefined);
|
|
71
|
-
setCloudOrganizationId(undefined);
|
|
72
|
-
setCloudUserId(undefined);
|
|
73
|
-
_resetCloudIdentityEnsureForTests();
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
afterEach(() => {
|
|
77
|
-
globalThis.fetch = originalFetch;
|
|
78
|
-
if (originalCloudUrlEnv === undefined) {
|
|
79
|
-
delete process.env.CADET_CLOUD_URL;
|
|
80
|
-
} else {
|
|
81
|
-
process.env.CADET_CLOUD_URL = originalCloudUrlEnv;
|
|
82
|
-
}
|
|
83
|
-
if (originalOrgEnv === undefined) {
|
|
84
|
-
delete process.env.PLATFORM_ORGANIZATION_ID;
|
|
85
|
-
} else {
|
|
86
|
-
process.env.CLOUD_ORGANIZATION_ID = originalOrgEnv;
|
|
87
|
-
}
|
|
88
|
-
if (originalUserEnv === undefined) {
|
|
89
|
-
delete process.env.PLATFORM_USER_ID;
|
|
90
|
-
} else {
|
|
91
|
-
process.env.CLOUD_USER_ID = originalUserEnv;
|
|
92
|
-
}
|
|
93
|
-
if (originalAssistantApiKeyEnv === undefined) {
|
|
94
|
-
delete process.env.ASSISTANT_API_KEY;
|
|
95
|
-
} else {
|
|
96
|
-
process.env.ASSISTANT_API_KEY = originalAssistantApiKeyEnv;
|
|
97
|
-
}
|
|
98
|
-
setCloudAssistantId(undefined);
|
|
99
|
-
setCloudOrganizationId(undefined);
|
|
100
|
-
setCloudUserId(undefined);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test("leaves overrides untouched when nothing is stored", async () => {
|
|
104
|
-
await rehydrateCloudCredentials();
|
|
105
|
-
|
|
106
|
-
expect(getCloudAssistantId()).toBe("");
|
|
107
|
-
expect(getCloudOrganizationId()).toBe("");
|
|
108
|
-
expect(getCloudUserId()).toBe("");
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
test("a credential-store read failure does not throw", async () => {
|
|
112
|
-
throwForKey = credentialKey("cadet", "assistant_api_key");
|
|
113
|
-
|
|
114
|
-
await expect(rehydrateCloudCredentials()).resolves.toBeUndefined();
|
|
115
|
-
expect(getCloudAssistantId()).toBe("");
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
test("trades the assistant API key for ids via cloud validate", async () => {
|
|
119
|
-
process.env.CADET_CLOUD_URL = PROD_URL;
|
|
120
|
-
mockSecureKeys[credentialKey("cadet", "assistant_api_key")] =
|
|
121
|
-
"assistant-key";
|
|
122
|
-
fetchImpl = async () =>
|
|
123
|
-
new Response(
|
|
124
|
-
JSON.stringify({
|
|
125
|
-
assistant_id: ASSISTANT_ID,
|
|
126
|
-
organization_id: ORG_ID,
|
|
127
|
-
user_id: USER_ID,
|
|
128
|
-
}),
|
|
129
|
-
{ status: 200 },
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
await rehydrateCloudCredentials();
|
|
133
|
-
|
|
134
|
-
expect(fetchCalls).toHaveLength(1);
|
|
135
|
-
expect(fetchCalls[0]?.url).toBe(
|
|
136
|
-
`${PROD_URL}/v1/internal/assistants/validate/`,
|
|
137
|
-
);
|
|
138
|
-
const headers = new Headers(fetchCalls[0]?.init?.headers);
|
|
139
|
-
expect(headers.get("Authorization")).toBe("Api-Key assistant-key");
|
|
140
|
-
expect(getCloudAssistantId()).toBe(ASSISTANT_ID);
|
|
141
|
-
expect(getCloudOrganizationId()).toBe(ORG_ID);
|
|
142
|
-
expect(getCloudUserId()).toBe(USER_ID);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
test("validate ids are used when the vault also has a copy", async () => {
|
|
146
|
-
mockSecureKeys[credentialKey("cadet", "assistant_api_key")] =
|
|
147
|
-
"assistant-key";
|
|
148
|
-
mockSecureKeys[credentialKey("cadet", "platform_assistant_id")] =
|
|
149
|
-
"asst-from-vault";
|
|
150
|
-
fetchImpl = async () =>
|
|
151
|
-
new Response(
|
|
152
|
-
JSON.stringify({
|
|
153
|
-
assistant_id: ASSISTANT_ID,
|
|
154
|
-
organization_id: ORG_ID,
|
|
155
|
-
user_id: USER_ID,
|
|
156
|
-
}),
|
|
157
|
-
{ status: 200 },
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
await rehydrateCloudCredentials();
|
|
161
|
-
|
|
162
|
-
expect(getCloudAssistantId()).toBe(ASSISTANT_ID);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
test("does not populate ids from the vault when validate is unreachable", async () => {
|
|
166
|
-
mockSecureKeys[credentialKey("cadet", "assistant_api_key")] =
|
|
167
|
-
"assistant-key";
|
|
168
|
-
mockSecureKeys[credentialKey("cadet", "platform_assistant_id")] =
|
|
169
|
-
ASSISTANT_ID;
|
|
170
|
-
fetchImpl = async () => {
|
|
171
|
-
throw new Error("network down");
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
await rehydrateCloudCredentials();
|
|
175
|
-
|
|
176
|
-
expect(getCloudAssistantId()).toBe("");
|
|
177
|
-
expect(getCloudOrganizationId()).toBe("");
|
|
178
|
-
expect(getCloudUserId()).toBe("");
|
|
179
|
-
});
|
|
180
|
-
});
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rehydrate the in-memory cloud identity overrides at process startup.
|
|
3
|
-
*
|
|
4
|
-
* The identity overrides (the ID setters in `config/env.ts`) are normally
|
|
5
|
-
* only populated at runtime when the cloud pushes values. Any standalone
|
|
6
|
-
* process that talks to the cloud — the daemon and the schedule worker —
|
|
7
|
-
* must rehydrate them before its first request.
|
|
8
|
-
*
|
|
9
|
-
* Bound ids come from `POST /v1/internal/assistants/validate/`, which trades
|
|
10
|
-
* the assistant API key for assistant/organization/user ids. The base URL is
|
|
11
|
-
* intentionally NOT rehydrated here: it resolves from `config.cloud.baseUrl`
|
|
12
|
-
* or the `CADET_CLOUD_URL` environment variable, never the credential
|
|
13
|
-
* store.
|
|
14
|
-
*
|
|
15
|
-
* Safe to call more than once.
|
|
16
|
-
*/
|
|
17
|
-
import { getLogger } from "../util/logger.js";
|
|
18
|
-
import { ensureCloudIdentityIds } from "./cloud-identity.js";
|
|
19
|
-
|
|
20
|
-
const log = getLogger("cloud-rehydration");
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Rehydrate the cloud identity ids (assistant, organization, user). Safe to
|
|
24
|
-
* call more than once.
|
|
25
|
-
*/
|
|
26
|
-
export async function rehydrateCloudCredentials(): Promise<void> {
|
|
27
|
-
try {
|
|
28
|
-
await ensureCloudIdentityIds();
|
|
29
|
-
} catch (err) {
|
|
30
|
-
log.warn(
|
|
31
|
-
{ error: err instanceof Error ? err.message : String(err) },
|
|
32
|
-
"Failed to rehydrate cloud identity ids (non-fatal)",
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
}
|