@unbrained/pm-cli 2026.10.4 → 2026.10.6
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/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +37 -1
- package/dist/cli/after-command-context-usage.js +1 -1
- package/dist/cli/argv-utils.js +1 -1
- package/dist/cli/bootstrap-args.js +1 -1
- package/dist/cli/bundle-integrity.js +2 -2
- package/dist/cli/command-namespaces.js +1 -1
- package/dist/cli/commander-usage.d.ts +1 -1
- package/dist/cli/commander-usage.js +7 -4
- package/dist/cli/commands/annotations/comments.js +1 -1
- package/dist/cli/commands/annotations/docs.js +1 -1
- package/dist/cli/commands/annotations/files.js +1 -1
- package/dist/cli/commands/annotations/learnings.js +1 -1
- package/dist/cli/commands/annotations/notes.js +1 -1
- package/dist/cli/commands/extension/describe.js +1 -1
- package/dist/cli/commands/extension/extension.js +1 -1
- package/dist/cli/commands/extension/scaffold.js +1 -1
- package/dist/cli/commands/extension/shared.js +1 -1
- package/dist/cli/commands/governance/gc.js +1 -1
- package/dist/cli/commands/governance/health.js +1 -1
- package/dist/cli/commands/governance/telemetry.js +1 -1
- package/dist/cli/commands/governance/validate.js +1 -1
- package/dist/cli/commands/history/activity.js +1 -1
- package/dist/cli/commands/history/history-compact.js +1 -1
- package/dist/cli/commands/history/history-redact.js +1 -1
- package/dist/cli/commands/history/history-repair.js +1 -1
- package/dist/cli/commands/history/history.js +1 -1
- package/dist/cli/commands/history/restore.js +1 -1
- package/dist/cli/commands/lifecycle/append.js +1 -1
- package/dist/cli/commands/lifecycle/claim.js +1 -1
- package/dist/cli/commands/lifecycle/close-many.js +1 -1
- package/dist/cli/commands/lifecycle/close.js +1 -1
- package/dist/cli/commands/lifecycle/copy.js +1 -1
- package/dist/cli/commands/lifecycle/create.js +1 -1
- package/dist/cli/commands/lifecycle/delete.js +1 -1
- package/dist/cli/commands/lifecycle/focus.js +1 -1
- package/dist/cli/commands/lifecycle/plan.js +1 -1
- package/dist/cli/commands/lifecycle/update-many.js +1 -1
- package/dist/cli/commands/lifecycle/update.js +1 -1
- package/dist/cli/commands/query/aggregate.js +1 -1
- package/dist/cli/commands/query/context.js +1 -1
- package/dist/cli/commands/query/deps.js +1 -1
- package/dist/cli/commands/query/duplicates.js +1 -1
- package/dist/cli/commands/query/eval.js +1 -1
- package/dist/cli/commands/query/get.js +1 -1
- package/dist/cli/commands/query/graph.js +1 -1
- package/dist/cli/commands/query/list.js +1 -1
- package/dist/cli/commands/query/next.js +1 -1
- package/dist/cli/commands/query/search.js +1 -1
- package/dist/cli/commands/query/stats.js +1 -1
- package/dist/cli/commands/test/test-all.js +1 -1
- package/dist/cli/commands/test/test-runs.js +1 -1
- package/dist/cli/commands/test/test.js +1 -1
- package/dist/cli/commands/workspace/config.js +1 -1
- package/dist/cli/commands/workspace/contracts.js +1 -1
- package/dist/cli/commands/workspace/init.js +1 -1
- package/dist/cli/commands/workspace/merge.js +1 -1
- package/dist/cli/commands/workspace/profile.js +1 -1
- package/dist/cli/commands/workspace/schema.js +1 -1
- package/dist/cli/commands/workspace/upgrade.js +1 -1
- package/dist/cli/context-intent-invocation.js +1 -1
- package/dist/cli/description-stdin.js +1 -1
- package/dist/cli/error-guidance.js +3 -1
- package/dist/cli/extension-command-help.js +5 -3
- package/dist/cli/extension-command-options.js +1 -1
- package/dist/cli/extension-recovery.js +1 -1
- package/dist/cli/help-content.js +5 -2
- package/dist/cli/help-json-payload.js +6 -3
- package/dist/cli/invocation-profile.js +2 -2
- package/dist/cli/main.js +5 -5
- package/dist/cli/migration-gates.js +1 -1
- package/dist/cli/option-values.js +1 -1
- package/dist/cli/public.js +1 -1
- package/dist/cli/register-annotations.js +1 -1
- package/dist/cli/register-assurance.js +1 -1
- package/dist/cli/register-files-lookup.js +1 -1
- package/dist/cli/register-history-activity.js +1 -1
- package/dist/cli/register-history-author.js +1 -1
- package/dist/cli/register-history-maintenance.js +2 -2
- package/dist/cli/register-list-query.js +10 -10
- package/dist/cli/register-mutation-options.js +1 -1
- package/dist/cli/register-mutation.js +2 -2
- package/dist/cli/register-operations.js +1 -1
- package/dist/cli/register-setup.js +1 -1
- package/dist/cli/register-structured-mutation.js +1 -1
- package/dist/cli/registration-helpers.js +1 -1
- package/dist/cli/runtime/activation.js +1 -1
- package/dist/cli/runtime/invocation-options.js +1 -1
- package/dist/cli/runtime/projection-retry.js +1 -1
- package/dist/cli/runtime/selection.js +1 -1
- package/dist/cli/runtime/telemetry-outcome.js +1 -1
- package/dist/cli/runtime-compatibility-boundary.js +4 -4
- package/dist/cli/schema/registration.js +2 -2
- package/dist/cli/schema-registration-helpers.js +1 -1
- package/dist/cli/search-refresh.js +1 -1
- package/dist/cli/stats-analytics-json.js +1 -1
- package/dist/cli/telemetry-flush.js +1 -1
- package/dist/cli-bundle/bundle-manifest.json +163 -163
- package/dist/cli-bundle/chunks/{chunk-SMKHR6BM.js → chunk-25EW53VO.js} +89 -88
- package/dist/cli-bundle/chunks/chunk-3CCVTV6Q.js +8 -0
- package/dist/cli-bundle/chunks/chunk-3REXBTST.js +3 -0
- package/dist/cli-bundle/chunks/chunk-4WB55TBC.js +80 -0
- package/dist/cli-bundle/chunks/{chunk-7CE2DJMA.js → chunk-6STTPXOC.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-ATB4ZZBQ.js +20 -0
- package/dist/cli-bundle/chunks/chunk-D4G43LBV.js +238 -0
- package/dist/cli-bundle/chunks/chunk-K6D6DMRT.js +31 -0
- package/dist/cli-bundle/chunks/chunk-KIRHWPZB.js +2 -0
- package/dist/cli-bundle/chunks/chunk-O67BH435.js +6 -0
- package/dist/cli-bundle/chunks/chunk-R7CG2DB7.js +2 -0
- package/dist/cli-bundle/chunks/chunk-RJHLD64E.js +3 -0
- package/dist/cli-bundle/chunks/chunk-TUKO5NF7.js +2 -0
- package/dist/cli-bundle/chunks/chunk-UZ7BIUCI.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-GZMWISWW.js → chunk-XJD47LUH.js} +3 -3
- package/dist/cli-bundle/chunks/{register-list-query-QBGXO5JJ.js → register-list-query-53WYLNZT.js} +11 -11
- package/dist/cli-bundle/chunks/register-mutation-34XXUBVI.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-WANO6EIM.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-WT37UPBQ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-6KFKQD2D.js +165 -0
- package/dist/cli-bundle/focused-chunks/chunk-FOHRPFIT.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-GRQXL5G5.js +8 -0
- package/dist/cli-bundle/focused-chunks/{chunk-467EW5RL.js → chunk-JZ4WGUVH.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-NM3PM6O6.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-OT7HK7SG.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-Q6DJ5DFQ.js → chunk-PCLU34KB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-HFAW3FJQ.js → chunk-PSXFFQFT.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QQIE4L42.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-RPUNVKXK.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-RXSVJPZ7.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-SPN5QTZ3.js +30 -0
- package/dist/cli-bundle/focused-chunks/chunk-SUZJNPGB.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-W4BG5HHS.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-Y5HXFDTZ.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-ZK5SOOPC.js +75 -0
- package/dist/cli-bundle/focused-chunks/chunk-ZQK2XUSS.js +12 -0
- package/dist/cli-bundle/main.js +25 -25
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +25 -24
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +55 -55
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +10 -10
- package/dist/cli.js +1 -1
- package/dist/core/checkpoint/checkpoint-gc.js +1 -1
- package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
- package/dist/core/config/nested-settings.js +1 -1
- package/dist/core/config/positional-value.js +1 -1
- package/dist/core/diagnostics/remediation.js +1 -1
- package/dist/core/extensions/activation-summary-markdown.js +2 -1
- package/dist/core/extensions/activation-summary.js +1 -1
- package/dist/core/extensions/activation-transaction.js +1 -1
- package/dist/core/extensions/capability-usage.js +1 -1
- package/dist/core/extensions/command-hook-context.js +1 -1
- package/dist/core/extensions/command-metadata-contract.js +1 -1
- package/dist/core/extensions/command-visibility-tier.js +1 -1
- package/dist/core/extensions/contribution-inventory.js +1 -1
- package/dist/core/extensions/exporter-output-contract.js +1 -1
- package/dist/core/extensions/extension-candidate.js +1 -1
- package/dist/core/extensions/extension-capability-aliases.js +1 -1
- package/dist/core/extensions/extension-hook-runtime.js +1 -1
- package/dist/core/extensions/extension-policy.js +1 -1
- package/dist/core/extensions/extension-registries.js +1 -1
- package/dist/core/extensions/extension-runtime-helpers.js +1 -1
- package/dist/core/extensions/extension-types.d.ts +2 -0
- package/dist/core/extensions/extension-types.js +1 -1
- package/dist/core/extensions/flag-definition-validation.js +1 -1
- package/dist/core/extensions/flag-value-types.js +1 -1
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/item-field-types.js +1 -1
- package/dist/core/extensions/item-fields.js +1 -1
- package/dist/core/extensions/loader.js +1 -1
- package/dist/core/extensions/manifest-parser.js +1 -1
- package/dist/core/extensions/manifest-schema.js +1 -1
- package/dist/core/extensions/module-graph-snapshot.js +1 -1
- package/dist/core/extensions/preflight-ownership.js +1 -1
- package/dist/core/extensions/registration-contracts.js +1 -1
- package/dist/core/extensions/registration-validation.js +1 -1
- package/dist/core/extensions/registration-values.js +1 -1
- package/dist/core/extensions/reserved-host-flags.js +1 -1
- package/dist/core/extensions/runtime-registrations.js +1 -1
- package/dist/core/extensions/service-ownership.js +1 -1
- package/dist/core/extensions/version-compat.js +1 -1
- package/dist/core/fs/atomic-create.js +1 -1
- package/dist/core/fs/fs-utils.js +2 -2
- package/dist/core/fs/host-environment-errors.js +1 -1
- package/dist/core/fs/index.js +1 -1
- package/dist/core/fs/path-utils.js +1 -1
- package/dist/core/governance/content-fields.js +1 -1
- package/dist/core/governance/issue-codes.js +1 -1
- package/dist/core/governance/metadata-coverage.js +1 -1
- package/dist/core/history/digest.js +1 -1
- package/dist/core/history/drift-cache.js +3 -3
- package/dist/core/history/drift-scan.d.ts +4 -0
- package/dist/core/history/drift-scan.js +1 -1
- package/dist/core/history/event-classification.js +1 -1
- package/dist/core/history/event-index.js +8 -7
- package/dist/core/history/history-compact-bulk.js +1 -1
- package/dist/core/history/history-diff.js +1 -1
- package/dist/core/history/history-rewrite.js +1 -1
- package/dist/core/history/history-storage-stats.js +1 -1
- package/dist/core/history/history-stream-policy.js +1 -1
- package/dist/core/history/history.js +2 -2
- package/dist/core/history/identity.js +1 -1
- package/dist/core/history/index.js +1 -1
- package/dist/core/history/operation-contract.js +1 -1
- package/dist/core/history/projection.js +1 -1
- package/dist/core/history/read.js +1 -1
- package/dist/core/history/replay.js +2 -1
- package/dist/core/history/tombstone.js +1 -1
- package/dist/core/history/version-address.js +1 -1
- package/dist/core/history/workspace-history.js +2 -2
- package/dist/core/io/body-file.js +1 -1
- package/dist/core/io/bulk-ids-input.js +2 -1
- package/dist/core/item/actionability.js +1 -1
- package/dist/core/item/dependency-reference.js +1 -1
- package/dist/core/item/id.js +1 -1
- package/dist/core/item/index.js +1 -1
- package/dist/core/item/item-format-version.js +1 -1
- package/dist/core/item/item-format.js +6 -4
- package/dist/core/item/item-record.js +1 -1
- package/dist/core/item/item-type-definition.js +1 -1
- package/dist/core/item/parent-reference-policy.js +1 -1
- package/dist/core/item/parse.js +8 -2
- package/dist/core/item/plan-lifecycle.js +1 -1
- package/dist/core/item/priority.js +1 -1
- package/dist/core/item/sprint-release-format.js +1 -1
- package/dist/core/item/status-filter.js +1 -1
- package/dist/core/item/status.js +1 -1
- package/dist/core/item/toon-decode.js +1 -1
- package/dist/core/item/type-registry.js +1 -1
- package/dist/core/item/type-synonyms.js +1 -1
- package/dist/core/lock/index.js +1 -1
- package/dist/core/lock/lock-gc.js +1 -1
- package/dist/core/lock/lock.js +3 -3
- package/dist/core/output/mutation-projection.js +1 -1
- package/dist/core/output/output-control.js +1 -1
- package/dist/core/output/output.js +22 -10
- package/dist/core/output/query-summary.js +1 -1
- package/dist/core/output/tabular.js +3 -1
- package/dist/core/packages/manifest.js +1 -1
- package/dist/core/packages/root.js +1 -1
- package/dist/core/policy/workflow-policy-schema.js +1 -1
- package/dist/core/policy/workflow-policy-store.js +1 -1
- package/dist/core/policy/workflow-policy.js +1 -1
- package/dist/core/profile/profile-describe.js +1 -1
- package/dist/core/profile/profile-lint.js +1 -1
- package/dist/core/profile/profile-plan.js +1 -1
- package/dist/core/profile/profile-presets.js +25 -1
- package/dist/core/reproducibility/context.js +1 -1
- package/dist/core/schema/fields-file.js +2 -2
- package/dist/core/schema/item-types-file.js +2 -2
- package/dist/core/schema/runtime-field-filters.js +1 -1
- package/dist/core/schema/runtime-field-values.js +1 -1
- package/dist/core/schema/runtime-schema.js +2 -2
- package/dist/core/schema/status-defs-file.js +2 -2
- package/dist/core/schema/status-token.js +1 -1
- package/dist/core/schema/type-inference.js +1 -1
- package/dist/core/schema/type-presets.js +1 -1
- package/dist/core/schema/type-workflows.js +1 -1
- package/dist/core/search/background-refresh.js +2 -2
- package/dist/core/search/bm25.js +1 -1
- package/dist/core/search/cache.js +2 -2
- package/dist/core/search/corpus.js +1 -1
- package/dist/core/search/embedding-batches.js +1 -1
- package/dist/core/search/eval-thresholds.js +1 -1
- package/dist/core/search/eval.js +1 -1
- package/dist/core/search/http-client.js +1 -1
- package/dist/core/search/providers.js +1 -1
- package/dist/core/search/relevance.js +1 -1
- package/dist/core/search/semantic-defaults.js +1 -1
- package/dist/core/search/staleness.js +1 -1
- package/dist/core/search/vector-stores.js +2 -2
- package/dist/core/search/vectorization-metadata.js +1 -1
- package/dist/core/sentry/helpers.js +1 -1
- package/dist/core/sentry/instrument.js +1 -1
- package/dist/core/session/session-state.js +1 -1
- package/dist/core/shared/agent-session-context.js +1 -1
- package/dist/core/shared/author.js +5 -1
- package/dist/core/shared/command-line.js +1 -1
- package/dist/core/shared/command-types.js +1 -1
- package/dist/core/shared/conflict-markers.js +1 -1
- package/dist/core/shared/constants.js +1 -1
- package/dist/core/shared/errors.js +1 -1
- package/dist/core/shared/html-entity-decode.js +1 -1
- package/dist/core/shared/index.js +1 -1
- package/dist/core/shared/item-metadata-contract.js +1 -1
- package/dist/core/shared/lazy-module.js +1 -1
- package/dist/core/shared/levenshtein.js +1 -1
- package/dist/core/shared/memo.js +1 -1
- package/dist/core/shared/numeric-parsers.js +1 -1
- package/dist/core/shared/option-alias-visibility.js +1 -1
- package/dist/core/shared/primitives.js +1 -1
- package/dist/core/shared/secret-rules.js +1 -1
- package/dist/core/shared/serial-queue.js +1 -1
- package/dist/core/shared/serialization.js +1 -1
- package/dist/core/shared/split-comma-list.js +1 -1
- package/dist/core/shared/text-normalization.js +1 -1
- package/dist/core/shared/time.js +2 -1
- package/dist/core/store/index.js +1 -1
- package/dist/core/store/item-format-migration.js +1 -1
- package/dist/core/store/item-metadata-cache.js +1 -1
- package/dist/core/store/item-metadata-query-index.js +7 -7
- package/dist/core/store/item-metadata-read-work.js +1 -1
- package/dist/core/store/item-store.js +1 -1
- package/dist/core/store/paths.js +1 -1
- package/dist/core/store/settings-concurrency.js +1 -1
- package/dist/core/store/settings-read-cache.js +1 -1
- package/dist/core/store/settings-validator.js +1 -1
- package/dist/core/store/settings.js +3 -3
- package/dist/core/store/tracker-preflight.js +1 -1
- package/dist/core/telemetry/consent.js +2 -2
- package/dist/core/telemetry/observability.js +1 -1
- package/dist/core/telemetry/policy.js +1 -1
- package/dist/core/telemetry/read-sampling.js +2 -2
- package/dist/core/telemetry/runtime.js +9 -5
- package/dist/core/test/background-runs.js +3 -3
- package/dist/core/test/item-test-run-tracking.js +1 -1
- package/dist/core/test/run-selectors.js +1 -1
- package/dist/core/validate/estimate-defaults.js +1 -1
- package/dist/core/validate/fix-planning.js +1 -1
- package/dist/core/validate/linked-artifact-reference.js +1 -1
- package/dist/core/validate/missing-by-type.js +1 -1
- package/dist/core/validate/missing-link-owners.js +1 -1
- package/dist/core/validate/stale-file-classification.js +1 -1
- package/dist/mcp/http-server.js +6 -4
- package/dist/mcp/legacy-adapter.js +1 -1
- package/dist/mcp/runtime-capabilities.js +1 -1
- package/dist/mcp/server.js +4 -4
- package/dist/mcp/tool-definitions.js +1 -1
- package/dist/sdk/actionability.js +1 -1
- package/dist/sdk/agent/closed-domain-contracts.js +1 -1
- package/dist/sdk/agent/command-recovery.js +1 -1
- package/dist/sdk/agent/command-suggestions.js +1 -1
- package/dist/sdk/agent/create-option-policy.js +1 -1
- package/dist/sdk/agent/identity-config.js +1 -1
- package/dist/sdk/agent/item-addressing.js +1 -1
- package/dist/sdk/agent/refusal-closure-census.js +2 -1
- package/dist/sdk/agent/refusal-closure.js +1 -1
- package/dist/sdk/agent/refusal-corpus-contracts.js +1 -1
- package/dist/sdk/agent/refusal-reachability.js +3 -1
- package/dist/sdk/agent/subcommand-recovery.js +1 -1
- package/dist/sdk/agent/task-transcript-contracts.js +1 -1
- package/dist/sdk/agent/tracker-preflight-contracts.js +1 -1
- package/dist/sdk/agent-capability-contracts.js +3 -1
- package/dist/sdk/agent-session-context.js +1 -1
- package/dist/sdk/annotations.js +1 -1
- package/dist/sdk/author-attribution.js +1 -1
- package/dist/sdk/authoring.js +1 -1
- package/dist/sdk/cli-bootstrap.d.ts +5 -1
- package/dist/sdk/cli-bootstrap.js +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.js +5 -3
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -1
- package/dist/sdk/cli-contracts/command-aliases.js +1 -1
- package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -1
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1
- package/dist/sdk/cli-contracts/commander-types.js +1 -1
- package/dist/sdk/cli-contracts/completeness.js +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +2 -1
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
- package/dist/sdk/cli-contracts/registration-helpers.js +7 -7
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
- package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -1
- package/dist/sdk/cli-contracts/string-lists.js +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
- package/dist/sdk/cli-contracts/tool-schema.d.ts +2 -2
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1
- package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -1
- package/dist/sdk/cli-contracts.js +1 -1
- package/dist/sdk/cli-program.js +1 -1
- package/dist/sdk/command-line.js +1 -1
- package/dist/sdk/comments.js +1 -1
- package/dist/sdk/compile-cache.js +1 -1
- package/dist/sdk/completion/bash.js +2 -1
- package/dist/sdk/completion/fish.js +13 -7
- package/dist/sdk/completion/shared.js +1 -1
- package/dist/sdk/completion/zsh.js +14 -8
- package/dist/sdk/completion.js +1 -1
- package/dist/sdk/compose.js +1 -1
- package/dist/sdk/config.js +1 -1
- package/dist/sdk/context/recency.js +1 -1
- package/dist/sdk/context/semantic-session-attribution.js +1 -1
- package/dist/sdk/context/usage-egress.js +1 -1
- package/dist/sdk/context/usage-ledger.js +6 -3
- package/dist/sdk/context-intent-contracts.js +1 -1
- package/dist/sdk/context-intent-runtime.js +1 -1
- package/dist/sdk/context-packing.js +1 -1
- package/dist/sdk/context-relevance.js +1 -1
- package/dist/sdk/context-signal-store.js +2 -2
- package/dist/sdk/context-usage.js +1 -1
- package/dist/sdk/contracts.js +1 -1
- package/dist/sdk/core-governance.js +1 -1
- package/dist/sdk/core.js +1 -1
- package/dist/sdk/corpus-shape.js +1 -1
- package/dist/sdk/define.js +1 -1
- package/dist/sdk/dependencies.js +1 -1
- package/dist/sdk/dependency-flag-validation.js +1 -1
- package/dist/sdk/dependency-provenance.js +1 -1
- package/dist/sdk/docs.js +1 -1
- package/dist/sdk/duplicates.js +1 -1
- package/dist/sdk/environment/agent-environment.js +1 -1
- package/dist/sdk/environment/host-environment-errors.js +1 -1
- package/dist/sdk/environment/project-runtime-compatibility.js +2 -1
- package/dist/sdk/environment/source-context.js +1 -1
- package/dist/sdk/environment/tracker-preflight.js +1 -1
- package/dist/sdk/error-code-catalog.js +1 -1
- package/dist/sdk/error-runtime.js +1 -1
- package/dist/sdk/errors.js +1 -1
- package/dist/sdk/eval.js +1 -1
- package/dist/sdk/extension/author-manifest.js +1 -1
- package/dist/sdk/extension/bundled-catalog.js +1 -1
- package/dist/sdk/extension/concurrency.js +1 -1
- package/dist/sdk/extension/copy-scope.js +1 -1
- package/dist/sdk/extension/custom-field-collisions.js +1 -1
- package/dist/sdk/extension/describe.js +4 -2
- package/dist/sdk/extension/doctor.js +1 -1
- package/dist/sdk/extension/install-plan.js +1 -1
- package/dist/sdk/extension/install-receipts.js +1 -1
- package/dist/sdk/extension/install-runtime.js +3 -3
- package/dist/sdk/extension/install-snapshot.js +1 -1
- package/dist/sdk/extension/install-sources.js +5 -5
- package/dist/sdk/extension/managed-state.d.ts +2 -0
- package/dist/sdk/extension/managed-state.js +2 -2
- package/dist/sdk/extension/managed-update-status.d.ts +3 -0
- package/dist/sdk/extension/managed-update-status.js +2 -0
- package/dist/sdk/extension/migrations.js +2 -2
- package/dist/sdk/extension/output-ownership.js +1 -1
- package/dist/sdk/extension/runtime-summary.js +1 -1
- package/dist/sdk/extension/scaffold.js +11 -4
- package/dist/sdk/extension/shared.js +1 -1
- package/dist/sdk/extension/source-resolution.d.ts +2 -6
- package/dist/sdk/extension/source-resolution.js +1 -1
- package/dist/sdk/extension/static-inventory.js +1 -1
- package/dist/sdk/extension/update-check.d.ts +10 -0
- package/dist/sdk/extension/update-check.js +1 -1
- package/dist/sdk/extension-command-context.js +2 -1
- package/dist/sdk/extension-contracts.js +1 -1
- package/dist/sdk/extension.d.ts +4 -0
- package/dist/sdk/extension.js +1 -1
- package/dist/sdk/files.js +1 -1
- package/dist/sdk/flag-invocation-contracts.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
- package/dist/sdk/generated-error-code-catalog.js +1 -1
- package/dist/sdk/governance/assurance-action-contracts.js +1 -1
- package/dist/sdk/governance/assurance-action.js +1 -1
- package/dist/sdk/governance/assurance-limits.js +1 -1
- package/dist/sdk/governance/assurance-mutation-error.js +1 -1
- package/dist/sdk/governance/assurance-presets.js +1 -1
- package/dist/sdk/governance/assurance-runtime.js +1 -1
- package/dist/sdk/governance/assurance.js +4 -4
- package/dist/sdk/governance/boundary-fixtures.js +1 -1
- package/dist/sdk/governance/closure-timestamps.js +1 -1
- package/dist/sdk/governance/coverage-assurance.js +1 -1
- package/dist/sdk/governance/defect-recurrence-coverage.js +1 -1
- package/dist/sdk/governance/defect-recurrence-graph.js +1 -1
- package/dist/sdk/governance/defect-recurrence-signals.js +1 -1
- package/dist/sdk/governance/defect-recurrence.js +1 -1
- package/dist/sdk/governance/extension-host-version.js +1 -1
- package/dist/sdk/governance/gc.js +1 -1
- package/dist/sdk/governance/health-merge-evidence.js +1 -1
- package/dist/sdk/governance/health.js +2 -1
- package/dist/sdk/governance/hierarchy-validation.js +1 -1
- package/dist/sdk/governance/linked-file-report.js +1 -1
- package/dist/sdk/governance/merge-receipt-history.js +1 -1
- package/dist/sdk/governance/provenance-health.js +4 -1
- package/dist/sdk/governance/reindex.js +5 -4
- package/dist/sdk/governance/stale-work.js +1 -1
- package/dist/sdk/governance/status-role-diagnostics.js +1 -1
- package/dist/sdk/governance/storage-integrity.js +1 -1
- package/dist/sdk/governance/tracked-runtime-cache.js +1 -1
- package/dist/sdk/governance/upgrade.js +2 -2
- package/dist/sdk/governance/validate-history-drift.js +1 -1
- package/dist/sdk/governance/validate-item-reader.js +1 -1
- package/dist/sdk/governance/validate-normalization.js +1 -1
- package/dist/sdk/governance/validate.js +1 -1
- package/dist/sdk/governance/workflow-completeness.js +1 -1
- package/dist/sdk/governance/workflow-policy.js +3 -3
- package/dist/sdk/governance/workspace-position.js +2 -1
- package/dist/sdk/governance.js +1 -1
- package/dist/sdk/graph/adapter.js +1 -1
- package/dist/sdk/graph/analytics.js +1 -1
- package/dist/sdk/graph/assembly.js +1 -1
- package/dist/sdk/graph/cache.js +1 -1
- package/dist/sdk/graph/centrality.js +1 -1
- package/dist/sdk/graph/conformance.js +1 -1
- package/dist/sdk/graph/deadline-scheduling.js +1 -1
- package/dist/sdk/graph/durable-cache.js +1 -1
- package/dist/sdk/graph/governance-contracts.js +1 -1
- package/dist/sdk/graph/governance.js +1 -1
- package/dist/sdk/graph/hierarchy-integrity.js +1 -1
- package/dist/sdk/graph/index.js +1 -1
- package/dist/sdk/graph/lifecycle-coverage.js +1 -1
- package/dist/sdk/graph/mutation-advisory.js +1 -1
- package/dist/sdk/graph/query-contracts.js +1 -1
- package/dist/sdk/graph/remediation.js +1 -1
- package/dist/sdk/graph/run.js +1 -1
- package/dist/sdk/graph/scheduling.js +1 -1
- package/dist/sdk/graph/traversal.js +1 -1
- package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -1
- package/dist/sdk/graph.js +1 -1
- package/dist/sdk/guide-topics.js +1 -1
- package/dist/sdk/guide.js +8 -1
- package/dist/sdk/history/attestation-command.js +1 -1
- package/dist/sdk/history/attestation-contract.js +1 -1
- package/dist/sdk/history/attestation-scan.js +1 -1
- package/dist/sdk/history/attestation.js +1 -1
- package/dist/sdk/history/maintenance.js +1 -1
- package/dist/sdk/history/salvage.js +3 -2
- package/dist/sdk/history/subject.js +1 -1
- package/dist/sdk/history-analytics.js +1 -1
- package/dist/sdk/history-compact.js +1 -1
- package/dist/sdk/history-mcp.js +1 -1
- package/dist/sdk/history-provenance.js +1 -1
- package/dist/sdk/history-read.js +1 -1
- package/dist/sdk/history-redact.js +1 -1
- package/dist/sdk/history-repair.js +1 -1
- package/dist/sdk/improvement-ledger-validation.js +1 -1
- package/dist/sdk/improvement-ledger.js +2 -2
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/init-agent-guidance.js +16 -2
- package/dist/sdk/init.js +16 -2
- package/dist/sdk/invocation-author.js +1 -1
- package/dist/sdk/item-children.js +1 -1
- package/dist/sdk/item-metadata-index.js +1 -1
- package/dist/sdk/item-schedule.js +1 -1
- package/dist/sdk/item-transaction.js +1 -1
- package/dist/sdk/learnings.js +1 -1
- package/dist/sdk/lifecycle/append.js +4 -2
- package/dist/sdk/lifecycle/claim.js +1 -1
- package/dist/sdk/lifecycle/close-many.js +1 -1
- package/dist/sdk/lifecycle/close.js +1 -1
- package/dist/sdk/lifecycle/copy.js +1 -1
- package/dist/sdk/lifecycle/create.js +1 -1
- package/dist/sdk/lifecycle/delete.js +1 -1
- package/dist/sdk/lifecycle/event-validation-messages.js +1 -1
- package/dist/sdk/lifecycle/focus.js +1 -1
- package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
- package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -1
- package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -1
- package/dist/sdk/lifecycle/mcp-actions.js +1 -1
- package/dist/sdk/lifecycle/metadata-normalizers.js +1 -1
- package/dist/sdk/lifecycle/mutation-command-options.js +1 -1
- package/dist/sdk/lifecycle/plan-mutation-receipt.js +1 -1
- package/dist/sdk/lifecycle/plan.js +1 -1
- package/dist/sdk/lifecycle/recurrence-parsers.js +1 -1
- package/dist/sdk/lifecycle/reopen.js +1 -1
- package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +2 -1
- package/dist/sdk/lifecycle/restore.js +1 -1
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
- package/dist/sdk/lifecycle/task-composition.js +1 -1
- package/dist/sdk/lifecycle/update-many.js +1 -1
- package/dist/sdk/lifecycle/update.js +2 -1
- package/dist/sdk/lifecycle-completion.js +1 -1
- package/dist/sdk/lifecycle-policy.js +1 -1
- package/dist/sdk/linked-artifacts.js +2 -1
- package/dist/sdk/mcp/apps.js +1 -1
- package/dist/sdk/mcp/authorization.js +1 -1
- package/dist/sdk/mcp/discovery.js +1 -1
- package/dist/sdk/mcp/interactions.js +1 -1
- package/dist/sdk/mcp/protocol.js +1 -1
- package/dist/sdk/mcp/skills.js +3 -1
- package/dist/sdk/mcp/subscriptions.js +1 -1
- package/dist/sdk/mcp/tasks.js +2 -2
- package/dist/sdk/mcp/transport.js +1 -1
- package/dist/sdk/merge/abandoned-receipts.js +1 -1
- package/dist/sdk/merge/driver.js +1 -1
- package/dist/sdk/merge/index.js +1 -1
- package/dist/sdk/merge/install.js +4 -2
- package/dist/sdk/merge/receipt-file-boundary.js +1 -1
- package/dist/sdk/merge/receipt-operation.js +1 -1
- package/dist/sdk/merge/receipt-schema.js +1 -1
- package/dist/sdk/merge/receipts.js +4 -4
- package/dist/sdk/merge/reconcile.js +1 -1
- package/dist/sdk/merge/three-way.js +3 -2
- package/dist/sdk/merge/worktree-config.js +1 -1
- package/dist/sdk/merge.js +1 -1
- package/dist/sdk/mutation-events.js +1 -1
- package/dist/sdk/mutation-guard.js +1 -1
- package/dist/sdk/notes.js +1 -1
- package/dist/sdk/output-contracts.js +1 -1
- package/dist/sdk/output-projection.js +1 -1
- package/dist/sdk/output-token-accounting.js +1 -1
- package/dist/sdk/output.js +2 -1
- package/dist/sdk/ownership-source.js +1 -1
- package/dist/sdk/package-import-adapters.js +1 -1
- package/dist/sdk/package-migrations.js +1 -1
- package/dist/sdk/package-runtime-options.js +1 -1
- package/dist/sdk/pagination.js +1 -1
- package/dist/sdk/profile.js +5 -1
- package/dist/sdk/provenance.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/activity.js +1 -1
- package/dist/sdk/query/aggregate.js +1 -1
- package/dist/sdk/query/calendar.js +4 -1
- package/dist/sdk/query/complete-list.js +1 -1
- package/dist/sdk/query/context.js +2 -1
- package/dist/sdk/query/duplicate-candidates.js +1 -1
- package/dist/sdk/query/get.d.ts +14 -2
- package/dist/sdk/query/get.js +1 -1
- package/dist/sdk/query/history.js +1 -1
- package/dist/sdk/query/item-filter-options.js +1 -1
- package/dist/sdk/query/light-metadata.js +1 -1
- package/dist/sdk/query/list-filter-shared.js +1 -1
- package/dist/sdk/query/list.js +1 -1
- package/dist/sdk/query/multi-value-filters.js +1 -1
- package/dist/sdk/query/next-ready-budget.js +1 -1
- package/dist/sdk/query/next.js +2 -1
- package/dist/sdk/query/parsers.js +1 -1
- package/dist/sdk/query/projection-contracts.js +1 -1
- package/dist/sdk/query/search/corpus.js +2 -1
- package/dist/sdk/query/search/filters.js +1 -1
- package/dist/sdk/query/search/input.js +1 -1
- package/dist/sdk/query/search/lexical.js +1 -1
- package/dist/sdk/query/search/response.js +1 -1
- package/dist/sdk/query/search/semantic.js +3 -2
- package/dist/sdk/query/search/types.js +1 -1
- package/dist/sdk/query/search-contracts.js +1 -1
- package/dist/sdk/query/search-pagination.js +1 -1
- package/dist/sdk/query/search-rendering.js +1 -1
- package/dist/sdk/query/search.js +1 -1
- package/dist/sdk/query/workspace-contracts.js +1 -1
- package/dist/sdk/query.js +1 -1
- package/dist/sdk/read-output/continuation.js +1 -1
- package/dist/sdk/read-output/options.js +1 -1
- package/dist/sdk/read-output/provenance.js +1 -1
- package/dist/sdk/read-output-budget.js +1 -1
- package/dist/sdk/read-output-contracts.js +1 -1
- package/dist/sdk/read-output-rows.js +1 -1
- package/dist/sdk/read-output-session.js +1 -1
- package/dist/sdk/relationship-analytics.js +1 -1
- package/dist/sdk/relationship-context.js +1 -1
- package/dist/sdk/relationship-history.js +7 -4
- package/dist/sdk/relationship-kinds/contract.js +1 -1
- package/dist/sdk/relationship-migration.js +1 -1
- package/dist/sdk/relationships.js +1 -1
- package/dist/sdk/reproducibility/process.js +1 -1
- package/dist/sdk/runtime/actions.js +1 -1
- package/dist/sdk/runtime/context.js +1 -1
- package/dist/sdk/runtime/schema-preview.js +1 -1
- package/dist/sdk/runtime/schema.js +1 -1
- package/dist/sdk/runtime-action-aliases.js +1 -1
- package/dist/sdk/runtime-extended-actions.js +1 -1
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime-primitives.js +1 -1
- package/dist/sdk/runtime-public-contracts.js +1 -1
- package/dist/sdk/runtime-stats-options.js +1 -1
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/scheduling-shortcuts.js +1 -1
- package/dist/sdk/schema-migration.js +4 -3
- package/dist/sdk/schema.js +7 -1
- package/dist/sdk/search-refresh-worker.js +1 -1
- package/dist/sdk/similarity-scoring.js +1 -1
- package/dist/sdk/similarity.js +1 -1
- package/dist/sdk/start-task-status.js +1 -1
- package/dist/sdk/stats.js +1 -1
- package/dist/sdk/structured-mutations.js +1 -1
- package/dist/sdk/telemetry-flush.js +1 -1
- package/dist/sdk/telemetry.js +4 -3
- package/dist/sdk/templates.js +26 -2
- package/dist/sdk/test/batch.js +2 -2
- package/dist/sdk/test/entry.js +1 -1
- package/dist/sdk/test/execution.d.ts +2 -1
- package/dist/sdk/test/execution.js +6 -5
- package/dist/sdk/test/json-path.js +1 -1
- package/dist/sdk/test/linked-command-detection.js +1 -1
- package/dist/sdk/test/measurements.js +1 -1
- package/dist/sdk/test/parsers.js +1 -1
- package/dist/sdk/test/runs.js +1 -1
- package/dist/sdk/test/trust.js +2 -2
- package/dist/sdk/test/workspace-snapshot.js +1 -1
- package/dist/sdk/testing.js +7 -4
- package/dist/sdk/traceability/runtime-files-lookup.js +1 -1
- package/dist/sdk/traceability/source-traceability.js +2 -1
- package/dist/sdk/tracker-root-discovery.js +1 -1
- package/dist/sdk/workspace-contracts-cache.js +1 -1
- package/dist/sdk/workspace-contracts.js +1 -1
- package/dist/sdk/workspace-memory.js +2 -2
- package/dist/sdk/workspace-recipe.js +1 -1
- package/dist/sdk/workspace-snapshot.js +5 -4
- package/dist/sdk/workspace-transaction-gc.js +1 -1
- package/dist/sdk/workspace-transaction.js +2 -2
- package/dist/sdk/workspace.js +3 -2
- package/dist/types/index.js +1 -1
- package/dist/types.js +1 -1
- package/docs/AGENT_EVIDENCE_CONSISTENCY.md +88 -0
- package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +36 -0
- package/docs/GET_READ_EVIDENCE.md +84 -0
- package/docs/OUTPUT_PROJECTION_CONTRACTS.md +23 -0
- package/docs/PR_REVIEW_LOOP.md +21 -4
- package/docs/README.md +3 -0
- package/docs/RELEASING.md +18 -0
- package/docs/SDK_CONFIGURATION_SAFETY.md +123 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +3 -3
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +4 -3
- package/marketplace.json +2 -2
- package/package.json +3 -3
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/extensions/vcs/index.ts +4 -2
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/package.json +2 -2
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +2 -2
- package/plugins/pm-codex/plugin.json +1 -1
- package/scripts/finalize-build.mjs +3 -2
- package/dist/cli-bundle/chunks/chunk-7UVXKI7K.js +0 -2
- package/dist/cli-bundle/chunks/chunk-D7Z2ZMJL.js +0 -3
- package/dist/cli-bundle/chunks/chunk-DEZPZOQ7.js +0 -2
- package/dist/cli-bundle/chunks/chunk-J52QIRRZ.js +0 -80
- package/dist/cli-bundle/chunks/chunk-JDKD3WGG.js +0 -6
- package/dist/cli-bundle/chunks/chunk-JQ7DW663.js +0 -2
- package/dist/cli-bundle/chunks/chunk-QXIDOOWT.js +0 -20
- package/dist/cli-bundle/chunks/chunk-SGFQQXFD.js +0 -2
- package/dist/cli-bundle/chunks/chunk-V3U77H3V.js +0 -31
- package/dist/cli-bundle/chunks/chunk-XZDWAYJC.js +0 -3
- package/dist/cli-bundle/chunks/chunk-Y6VRBTP3.js +0 -238
- package/dist/cli-bundle/chunks/chunk-YAAFYFS4.js +0 -8
- package/dist/cli-bundle/chunks/register-mutation-53ZLT4RX.js +0 -20
- package/dist/cli-bundle/chunks/register-operations-OBK2FXUU.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-HM3OCBH2.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-2JFYR56O.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-32EVUSS4.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-5GUSO2P4.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-6XBRADQQ.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-7O4NUJVO.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-CURTIIQT.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-IJUWEEEB.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-JCVMOSWQ.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-JMJK2L4Z.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-KG3H4UZZ.js +0 -30
- package/dist/cli-bundle/focused-chunks/chunk-MHQ2XICU.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-RJV6QVJE.js +0 -75
- package/dist/cli-bundle/focused-chunks/chunk-ZE2JZ7R6.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-ZLEN4HZD.js +0 -165
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module sdk/extension/source-resolution
|
|
3
|
-
*
|
|
4
|
-
* Resolves install-source identity without executing package code.
|
|
5
|
-
*/
|
|
6
1
|
import { type InstallSource } from "./install-sources.js";
|
|
2
|
+
import type { ManagedExtensionRecord } from "./managed-state.js";
|
|
7
3
|
/** Selected install-source identity. */
|
|
8
4
|
export interface ExtensionInstallSourceSelection {
|
|
9
5
|
/** Selected source family. */
|
|
@@ -47,4 +43,4 @@ export interface ResolvedExtensionInstallSource {
|
|
|
47
43
|
sourceResolution: ExtensionInstallSourceResolution;
|
|
48
44
|
}
|
|
49
45
|
/** Resolve bundled-alias provenance and competing installed npm identity. */
|
|
50
|
-
export declare function resolveExtensionInstallSourceIdentity(explicitSourceInput: string, githubOption: string | undefined, ref: string | undefined): Promise<ResolvedExtensionInstallSource>;
|
|
46
|
+
export declare function resolveExtensionInstallSourceIdentity(explicitSourceInput: string, githubOption: string | undefined, ref: string | undefined, managedEntries?: readonly ManagedExtensionRecord[]): Promise<ResolvedExtensionInstallSource>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2bef4424-f5b8-511b-91f7-0b39cf11f515")}catch{}})();import fs from"node:fs/promises";import npa from"npm-package-arg";import{findInstalledNpmPackageCandidate,parseExtensionInstallSource}from"./install-sources.js";import{resolveBundledExtensionAliasSource,resolveBundledPackageNpmName}from"./bundled-catalog.js";import{isFileMissingError}from"../../core/fs/fs-utils.js";async function resolveManagedNpmReinstall(source,entries){if(source.kind!=="local"||source.input.startsWith(".")||source.input.includes("\\")||source.input.includes("/")&&!/^@[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$/u.test(source.input))return source;try{return await fs.lstat(source.absolute_path),source}catch(error){if(!isFileMissingError(error))throw error}const input=source.input.trim(),npmEntries=entries.filter(entry=>entry.source.kind==="npm"),packageName=(npmEntries.find(entry=>entry.name===input)??npmEntries.find(entry=>entry.directory===input)??npmEntries.find(entry=>entry.source.package===input))?.source.package;if(packageName===void 0)return source;try{const identity=npa(packageName);if(!identity.registry||identity.name!==packageName)return source}catch{return source}return parseExtensionInstallSource(`npm:${packageName}`,{})}async function resolveExtensionInstallSourceIdentity(explicitSourceInput,githubOption,ref,managedEntries=[]){const bundledAliasSource=typeof githubOption=="string"?null:await resolveBundledExtensionAliasSource(explicitSourceInput),bundledAliasName=bundledAliasSource===null?null:explicitSourceInput.trim().toLowerCase(),bundledPackageName=bundledAliasName===null?null:await resolveBundledPackageNpmName(bundledAliasName),installSource=await resolveManagedNpmReinstall(parseExtensionInstallSource(bundledAliasSource??explicitSourceInput,{forceGithub:typeof githubOption=="string",ref}),managedEntries),installedNpmCandidate=bundledAliasName===null?null:await findInstalledNpmPackageCandidate(explicitSourceInput);return{bundledAliasName,bundledPackageName,installSource,sourceResolution:{requested:explicitSourceInput,selected:{kind:bundledAliasName===null?installSource.kind:"builtin",input:bundledAliasName??installSource.input,...bundledPackageName===null?{}:{package:bundledPackageName}},ambiguous:installedNpmCandidate!==null,precedence:"bundled_alias_before_installed_npm",candidates:[...bundledAliasName===null?[]:[{kind:"builtin",input:bundledAliasName,...bundledPackageName===null?{}:{package:bundledPackageName},command:`pm install ${bundledAliasName}`}],...installedNpmCandidate===null?[]:[{kind:"npm",input:`npm:${installedNpmCandidate.package}`,package:installedNpmCandidate.package,...installedNpmCandidate.version===void 0?{}:{version:installedNpmCandidate.version},directory:installedNpmCandidate.directory,command:`pm install npm:${installedNpmCandidate.package}`}]]}}}export{resolveExtensionInstallSourceIdentity};
|
|
2
2
|
//# sourceMappingURL=source-resolution.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="846100a9-4314-5f7c-b892-fa16e09bee5b")}catch{}})();import fs from"node:fs/promises";import path from"node:path";import{resolveGlobalPmRoot}from"../../core/store/paths.js";import{normalizeManagedState}from"./managed-state.js";import{normalizeExtensionNameForMatch,normalizeStringList,parseExtensionManifest}from"./shared.js";function isMissing(error){return typeof error=="object"&&error!==null&&"code"in error&&error.code==="ENOENT"}function isTrustedSourceStatus(status){return status!=="invalid"&&status!=="unreadable"}function parseEnablement(raw){const parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new SyntaxError("Invalid settings object");const configured=parsed.extensions;if(configured===void 0)return{enabled:[],disabled:[]};if(typeof configured!="object"||configured===null||Array.isArray(configured))throw new SyntaxError("Invalid extensions settings");const value=configured;if(value.enabled!==void 0&&(!Array.isArray(value.enabled)||!value.enabled.every(entry=>typeof entry=="string"))||value.disabled!==void 0&&(!Array.isArray(value.disabled)||!value.disabled.every(entry=>typeof entry=="string")))throw new SyntaxError("Invalid extension enablement lists");return{enabled:value.enabled??[],disabled:value.disabled??[]}}async function readEnablement(settingsPath){let raw;try{raw=await fs.readFile(settingsPath,"utf8")}catch(error){return isMissing(error)?{status:"absent",enabled:[],disabled:[]}:{status:"unreadable",enabled:[],disabled:[],error:{code:"settings_unreadable",path:settingsPath}}}try{return{status:"ok",...parseEnablement(raw)}}catch{return{status:"invalid",enabled:[],disabled:[],error:{code:"settings_invalid",path:settingsPath}}}}async function readManagedRecords(managedPath){let raw;try{raw=await fs.readFile(managedPath,"utf8")}catch(error){if(isMissing(error))try{if((await fs.stat(path.dirname(managedPath))).isDirectory())return{status:"absent",entries:[]}}catch(parentError){if(isMissing(parentError))return{status:"absent",entries:[]}}return{status:"unreadable",entries:[],error:{code:"managed_state_unreadable",path:managedPath}}}try{const parsed=JSON.parse(raw),normalized=normalizeManagedState(parsed);if(!normalized||typeof parsed!="object"||parsed===null||!Array.isArray(parsed.entries)||normalized.entries.length!==parsed.entries.length)throw new SyntaxError("Invalid managed extension state");return{status:"ok",entries:normalized.entries}}catch{return{status:"invalid",entries:[],error:{code:"managed_state_invalid",path:managedPath}}}}async function readExtensionDirectories(extensionsRoot){try{return{directories:(await fs.readdir(extensionsRoot,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right))}}catch(error){return isMissing(error)?{directories:[]}:{directories:[],error:{code:"extensions_unreadable",path:extensionsRoot}}}}async function readManifest(manifestPath){let raw;try{raw=await fs.readFile(manifestPath,"utf8")}catch(error){return isMissing(error)?{manifest:null,error:{code:"manifest_invalid",path:manifestPath}}:{manifest:null,error:{code:"manifest_unreadable",path:manifestPath}}}try{const manifest=parseExtensionManifest(JSON.parse(raw));return manifest?{manifest}:{manifest:null,error:{code:"manifest_invalid",path:manifestPath}}}catch{return{manifest:null,error:{code:"manifest_invalid",path:manifestPath}}}}function projectConfiguredEntry(input){const name=input.manifest?.name??input.directory,enabled=new Set(normalizeStringList(input.settings.enabled)),disabled=new Set(normalizeStringList(input.settings.disabled)),configuredEnabled=!isTrustedSourceStatus(input.settings.status)||!input.manifest?null:!disabled.has(name)&&(enabled.size===0||enabled.has(name)),managed=isTrustedSourceStatus(input.managed.status)?input.managed.entries.some(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(name)||normalizeExtensionNameForMatch(entry.directory)===normalizeExtensionNameForMatch(input.directory)):null;return{name,directory:input.directory,scope:input.scope,installed:!0,status:input.manifest?configuredEnabled===!1?"inactive":"installed":"malformed_manifest",configured_enabled:configuredEnabled,managed,runtime_active:null,...input.manifest?{version:input.manifest.version}:{}}}async function inspectStaticExtensionInventory(options){const scope=options.scope??"project",selectedRoot=scope==="global"?resolveGlobalPmRoot(options.cwd??process.cwd()):options.pmRoot,extensionsRoot=path.join(selectedRoot,"extensions"),settings=await readEnablement(path.join(selectedRoot,"settings.json")),managed=await readManagedRecords(path.join(extensionsRoot,".managed-extensions.json")),listed=await readExtensionDirectories(extensionsRoot),errors=[];for(const source of[settings,managed,listed])source.error&&errors.push(source.error);const requested=options.name?.trim(),extensions=[];for(const directory of listed.directories){const manifestPath=path.join(extensionsRoot,directory,"manifest.json"),inspected=await readManifest(manifestPath);inspected.error&&errors.push(inspected.error);const entry=projectConfiguredEntry({directory,scope,manifest:inspected.manifest,settings,managed});requested&&![entry.name,directory].some(value=>normalizeExtensionNameForMatch(value)===normalizeExtensionNameForMatch(requested))||extensions.push(entry)}return requested&&extensions.length===0&&errors.every(error=>error.code!=="extensions_unreadable")&&extensions.push({name:requested,directory:null,scope,installed:!1,status:"absent",configured_enabled:isTrustedSourceStatus(settings.status)?!1:null,managed:isTrustedSourceStatus(managed.status)?!1:null,runtime_active:null}),{scope,complete:errors.length===0,settings_status:settings.status,managed_state_status:managed.status,extensions,errors}}export{inspectStaticExtensionInventory};
|
|
2
2
|
//# sourceMappingURL=static-inventory.js.map
|
|
@@ -11,5 +11,15 @@ export interface GithubUpdateStatus {
|
|
|
11
11
|
/** Stable failure reason when the comparison is incomplete. */
|
|
12
12
|
error?: string;
|
|
13
13
|
}
|
|
14
|
+
/** Result of comparing the installed npm identity with its registry latest dist-tag. */
|
|
15
|
+
export interface NpmUpdateStatus extends Omit<GithubUpdateStatus, "remote_commit"> {
|
|
16
|
+
/** Registry version selected by the latest dist-tag, when valid. */
|
|
17
|
+
remote_version?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Query npm's configured registry with bounded execution and no lifecycle scripts. */
|
|
20
|
+
declare function runNpmUpdateQuery(args: string[], timeout: number): Promise<string>;
|
|
21
|
+
/** Compare recorded npm provenance without persisting diagnostic results or guessing missing versions. */
|
|
22
|
+
export declare function checkNpmUpdate(source: ManagedExtensionSource, npmRunner?: typeof runNpmUpdateQuery): Promise<NpmUpdateStatus>;
|
|
14
23
|
/** Compare one managed GitHub extension against its remote revision. */
|
|
15
24
|
export declare const checkGithubUpdate: (source: ManagedExtensionSource, gitCommandRunner?: typeof runGitCommand) => Promise<GithubUpdateStatus>;
|
|
25
|
+
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b67e46f9-51ff-501b-98da-74353b4c66d9")}catch{}})();import{nowIso}from"../../core/shared/time.js";import{execFile}from"node:child_process";import{promisify}from"node:util";import npa from"npm-package-arg";import{resolveNpmCommandName,runGitCommand,shouldRunNpmCommandInShell}from"./install-sources.js";const execFileAsync=promisify(execFile),GITHUB_UPDATE_CHECK_TIMEOUT_MS=1e4;function resolveExactNpmVersion(packageName,version,errorCode){if(typeof version=="string")try{const parsed=npa.resolve(packageName,version);if(parsed.type==="version")return parsed.fetchSpec}catch{}throw new Error(errorCode)}async function runNpmUpdateQuery(args,timeout){try{return(await execFileAsync(resolveNpmCommandName(),args,{encoding:"utf8",timeout,maxBuffer:65536,shell:shouldRunNpmCommandInShell(),env:{...process.env,npm_config_ignore_scripts:"true"}})).stdout.trim()}catch{throw new Error("npm_registry_lookup_failed")}}async function checkNpmUpdate(source,npmRunner=runNpmUpdateQuery){const checkedAt=nowIso();try{if(source.kind!=="npm"||!source.package||!/^(?:@[a-zA-Z0-9._-]+\/)?[a-zA-Z0-9._-]+$/u.test(source.package))throw new Error("missing_or_invalid_npm_package_identity");const installedVersion=resolveExactNpmVersion(source.package,source.version,"missing_or_invalid_installed_npm_version"),registryOutput=await npmRunner(["view",source.package,"dist-tags.latest","--json","--ignore-scripts"],GITHUB_UPDATE_CHECK_TIMEOUT_MS);let output;try{output=JSON.parse(registryOutput)}catch{throw new Error("invalid_npm_registry_metadata")}const version=Array.isArray(output)&&output.length===1?output[0]:output,latestVersion=resolveExactNpmVersion(source.package,version,"invalid_npm_registry_version");return{checked_at:checkedAt,available:latestVersion!==installedVersion,remote_version:latestVersion}}catch(error){return{checked_at:checkedAt,available:null,error:error instanceof Error?error.message:String(error)}}}const resolveGithubUpdateOutput=(output,installedCommitInput,checkedAt)=>{const references=output.split(/\r?\n/).map(line=>line.trim()).filter(Boolean).map(line=>{const[commit,ref=""]=line.split(/\s+/);return{commit,ref}}),remoteReference=references.find(reference=>reference.ref.endsWith("^{}"))??references[0];if(!remoteReference)return{checked_at:checkedAt,available:null,error:"no_remote_reference_found"};const installedCommit=installedCommitInput?.trim();return installedCommit?{checked_at:checkedAt,remote_commit:remoteReference.commit,available:remoteReference.commit!==installedCommit}:{checked_at:checkedAt,remote_commit:remoteReference.commit,available:null,error:"missing_installed_commit"}},checkGithubUpdate=async(source,gitCommandRunner=runGitCommand)=>{const checkedAt=nowIso();if(source.kind!=="github"||!source.repository)return{checked_at:checkedAt,available:null,error:"not_a_github_managed_source"};try{const ref=[source.ref?.trim(),"HEAD"].find(Boolean),output=await gitCommandRunner(["ls-remote",source.repository,ref,`${ref}^{}`],void 0,GITHUB_UPDATE_CHECK_TIMEOUT_MS);return resolveGithubUpdateOutput(output,source.commit,checkedAt)}catch(error){return{checked_at:checkedAt,available:null,error:error instanceof Error?error.message:String(error)}}};export{checkGithubUpdate,checkNpmUpdate};
|
|
2
2
|
//# sourceMappingURL=update-check.js.map
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="93e1b043-89b2-546e-b238-1b9f4a1df742")}catch{}})();import{createHash}from"node:crypto";import{runActiveOnWriteHooks}from"../core/extensions/index.js";import{mutateWorkspaceJsonWithHistory}from"../core/history/workspace-history.js";import{resolveAuthor}from"../core/shared/author.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{asRecordOrNull}from"../core/shared/primitives.js";import{stableValueEquals}from"../core/shared/serialization.js";import{getSettingsPath}from"../core/store/paths.js";import{mergeSettings,readSettings,runWithConfigurationOnlySettings,serializeSettings}from"../core/store/settings.js";import{clearSettingsReadCache}from"../core/store/settings-read-cache.js";import{validateSettings}from"../core/store/settings-validator.js";import{isPmCliExpectedError}from"./errors.js";import{getItemAt}from"./history-read.js";import{RelationshipEventLog,RelationshipEventStore}from"./relationship-history.js";import{analyzeGraphImpact}from"./relationship-analytics.js";import{RelationshipGraph,createRelationshipKindRegistry}from"./relationships.js";import{commitWorkspaceTransaction}from"./workspace-transaction.js";function buildRelationshipKindRegistry(definitions){const registry=createRelationshipKindRegistry();for(const definition of definitions)registry.register(definition);return registry}function replaceOwnedSettingsSubtrees(raw,next,paths=[]){if(paths.length===0)return raw;const persisted=JSON.parse(raw),canonical=JSON.parse(serializeSettings(next));for(const ownedPath of paths){const segments=ownedPath.split(".");let source=canonical;for(const segment of segments){const sourceObject=asRecordOrNull(source);if(!/^[a-zA-Z][a-zA-Z0-9_]*$/u.test(segment)||["constructor","prototype","__proto__"].includes(segment)||sourceObject===null||!Object.hasOwn(sourceObject,segment))throw new PmCliError(`Invalid owned settings subtree: ${ownedPath}. Select a declared inline object path.`,EXIT_CODE.USAGE);source=sourceObject[segment]}if(asRecordOrNull(source)===null)throw new PmCliError(`Invalid owned settings subtree: ${ownedPath}. Select a declared inline object path.`,EXIT_CODE.USAGE);let destination=persisted,canonicalParent=canonical;for(const segment of segments.slice(0,-1)){const value=destination[segment];canonicalParent=canonicalParent[segment],value===void 0&&Object.defineProperty(destination,segment,{value:structuredClone(canonicalParent),enumerable:!0,writable:!0,configurable:!0}),destination=destination[segment]}Object.defineProperty(destination,segments.at(-1),{value:source,enumerable:!0,writable:!0,configurable:!0})}return stableValueEquals(persisted,JSON.parse(raw))?raw:`${JSON.stringify(persisted,null,2)}
|
|
2
|
+
`}function createExtensionCommandSdk(pmRoot,client,invocationAuthor,invocationCommand){return{client,isItemNotFoundError:error=>isPmCliExpectedError(error)&&error.exitCode===EXIT_CODE.NOT_FOUND,getItemAt:(id,target)=>getItemAt(id,target,{pmRoot}),openRelationshipEventStore:options=>RelationshipEventStore.open({pmRoot,nodes:options.nodes,registry:buildRelationshipKindRegistry(options.definitions),...options.relativePath===void 0?{}:{relativePath:options.relativePath}}),createRelationshipGraph:options=>new RelationshipGraph(options.nodes,options.edges,buildRelationshipKindRegistry(options.definitions)),analyzeRelationshipImpact:(graph,root,options)=>analyzeGraphImpact(graph,root,options),validateRelationshipEvents:options=>{const log=new RelationshipEventLog(options.nodes,{registry:buildRelationshipKindRegistry(options.definitions)});return options.events.map(event=>log.append({...event,expectedVersion:log.version}))},commitWorkspaceTransaction:options=>commitWorkspaceTransaction({...options,pmRoot}),mutateWorkspaceSettings:async options=>{if(!/^[a-zA-Z0-9._-]{1,128}$/u.test(options.operationId))throw new PmCliError("Workspace settings operationId must be 1-128 letters, digits, dots, underscores, or hyphens.",EXIT_CODE.USAGE);const settings=options.dryRun===!0?await runWithConfigurationOnlySettings(pmRoot,()=>readSettings(pmRoot)):await readSettings(pmRoot);try{const mutation=await mutateWorkspaceJsonWithHistory({pmRoot,filePath:getSettingsPath(pmRoot),op:"extension:pm:settings",idempotencyKey:invocationCommand===void 0?options.operationId:`${createHash("sha256").update(invocationCommand).digest("hex").slice(0,16)}:${options.operationId}`,author:invocationAuthor??resolveAuthor(void 0,settings.author_default),lockTtlSeconds:settings.locks.ttl_seconds,lockWaitMs:settings.locks.wait_ms,recordCreation:!1,dryRun:options.dryRun===!0,mutate:async beforeRaw=>{const current=beforeRaw===null?null:JSON.parse(beforeRaw),validatedCurrent=validateSettings(current);if(!validatedCurrent.success)throw new PmCliError("Workspace settings mutation requires a valid initialized settings.json.",EXIT_CODE.USAGE);const currentSettings=mergeSettings(validatedCurrent.data),next=await options.mutate(structuredClone(currentSettings));if(!validateSettings(next).success)throw new PmCliError("Workspace settings mutation returned invalid settings.json.",EXIT_CODE.USAGE);let raw=stableValueEquals(currentSettings,next)?beforeRaw:serializeSettings(next,{source:{raw:current,validated:validatedCurrent.data}});raw=replaceOwnedSettingsSubtrees(raw,next,options.replaceSubtrees);const validatedResult=validateSettings(JSON.parse(raw));if(!validatedResult.success)throw new PmCliError("Workspace settings mutation serialized invalid settings.json.",EXIT_CODE.USAGE);return{raw,result:options.includePreview===!0?mergeSettings(validatedResult.data):void 0}}});return mutation.changed&&options.dryRun!==!0&&await runActiveOnWriteHooks({path:getSettingsPath(pmRoot),scope:"project",op:"extension:pm:settings"}),{changed:mutation.changed,dry_run:options.dryRun===!0,replayed:mutation.replayed===!0,...mutation.result===void 0?{}:{preview:mutation.result}}}finally{clearSettingsReadCache(pmRoot)}}}}export{createExtensionCommandSdk};
|
|
2
3
|
//# sourceMappingURL=extension-command-context.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3ec1f825-59d1-5ce2-ac76-c628264bd8be")}catch{}})();import{EXTENSION_CAPABILITY_CONTRACT,EXTENSION_CAPABILITY_CONTRACT_VERSION,EXTENSION_CAPABILITY_LEGACY_ALIASES,KNOWN_EXTENSION_CAPABILITIES,KNOWN_EXTENSION_POLICY_MODES,KNOWN_EXTENSION_POLICY_SURFACES,KNOWN_EXTENSION_SANDBOX_PROFILES,KNOWN_EXTENSION_TRUST_MODES}from"../core/extensions/loader.js";import{LIST_COMMANDER_STRING_OPTION_CONTRACTS,SEARCH_COMMANDER_STRING_OPTION_CONTRACTS}from"./cli-contracts/commander-types.js";import{compactFlagAliasContracts,LIST_FILTER_FLAG_CONTRACTS,SEARCH_FLAG_CONTRACTS}from"./cli-contracts/flag-contracts.js";const EXTENSION_CAPABILITIES=KNOWN_EXTENSION_CAPABILITIES,EXTENSION_POLICY_MODES=KNOWN_EXTENSION_POLICY_MODES,EXTENSION_POLICY_SURFACES=KNOWN_EXTENSION_POLICY_SURFACES,EXTENSION_TRUST_MODES=KNOWN_EXTENSION_TRUST_MODES,EXTENSION_SANDBOX_PROFILES=KNOWN_EXTENSION_SANDBOX_PROFILES;function toExtensionFlagDefinition(contract,long,stringOptionKeys,short){const normalizedKey=contract.flag.slice(2).replace(/[-_]([a-z])/gu,(_match,letter)=>letter.toUpperCase()),stringValued=stringOptionKeys.has(normalizedKey);return{long,...short?{short}:{},description:contract.description??`Standard pm ${contract.flag} option.`,...contract.required===!0?{required:!0}:{},...contract.list===!0?{list:!0}:{},...contract.repeatable===!0?{repeatable:!0}:{},value_type:stringValued?"string":"boolean",...stringValued?{value_name:contract.value_name??"value"}:{}}}function toExtensionFlagDefinitions(contracts,stringOptions=[]){const stringOptionKeys=new Set(stringOptions.flatMap(contract=>contract.keys)),definitions=[];for(const contract of compactFlagAliasContracts(contracts.map(entry=>({...entry})))){definitions.push(toExtensionFlagDefinition(contract,contract.flag,stringOptionKeys,contract.short));for(const alias of contract.aliases??[])definitions.push(toExtensionFlagDefinition(contract,alias,stringOptionKeys))}return definitions}const LIST_FILTER_EXTENSION_FLAG_DEFINITIONS=toExtensionFlagDefinitions(LIST_FILTER_FLAG_CONTRACTS,LIST_COMMANDER_STRING_OPTION_CONTRACTS),SEARCH_EXTENSION_FLAG_DEFINITIONS=toExtensionFlagDefinitions(SEARCH_FLAG_CONTRACTS,SEARCH_COMMANDER_STRING_OPTION_CONTRACTS);export{EXTENSION_CAPABILITIES,EXTENSION_CAPABILITY_CONTRACT,EXTENSION_CAPABILITY_CONTRACT_VERSION,EXTENSION_CAPABILITY_LEGACY_ALIASES,EXTENSION_POLICY_MODES,EXTENSION_POLICY_SURFACES,EXTENSION_SANDBOX_PROFILES,EXTENSION_TRUST_MODES,LIST_FILTER_EXTENSION_FLAG_DEFINITIONS,SEARCH_EXTENSION_FLAG_DEFINITIONS,toExtensionFlagDefinitions};
|
|
2
2
|
//# sourceMappingURL=extension-contracts.js.map
|
package/dist/sdk/extension.d.ts
CHANGED
|
@@ -82,6 +82,8 @@ export interface ExtensionCommandOptions {
|
|
|
82
82
|
watch?: boolean;
|
|
83
83
|
/** Value that configures or reports runtime probe for this contract. */
|
|
84
84
|
runtimeProbe?: boolean;
|
|
85
|
+
/** Skip remote freshness checks during manage and report unknown availability. */
|
|
86
|
+
offline?: boolean;
|
|
85
87
|
/** Value that configures or reports fix managed state for this contract. */
|
|
86
88
|
fixManagedState?: boolean;
|
|
87
89
|
/** Value that configures or reports isolated for this contract. */
|
|
@@ -137,6 +139,8 @@ export interface ManagedExtensionSummary {
|
|
|
137
139
|
last_update_check_at?: string;
|
|
138
140
|
/** Value that configures or reports last update remote commit for this contract. */
|
|
139
141
|
last_update_remote_commit?: string;
|
|
142
|
+
/** Latest npm registry version observed by this invocation. */
|
|
143
|
+
last_update_remote_version?: string;
|
|
140
144
|
/** Value that configures or reports update error for this contract. */
|
|
141
145
|
update_error?: string;
|
|
142
146
|
/** Outcome of the registry update check for this extension. */
|
package/dist/sdk/extension.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4f8fc1a7-748d-559d-9de8-835d0428c6a7")}catch(e2){}})();import fs from"node:fs/promises";import path from"node:path";import{activateExtensions,createSerialQueue,loadExtensions,nextExtensionReloadToken}from"../core/extensions/index.js";import{describeExtensionActivation}from"../core/extensions/activation-summary.js";import{createExtensionContributionInventory}from"../core/extensions/contribution-inventory.js";import{resolveExtensionRoots}from"../core/extensions/loader.js";import{pathExists}from"../core/fs/fs-utils.js";import{resolvePmPackageRootFromModule}from"../core/packages/root.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{levenshteinDistanceWithinLimit}from"../core/shared/levenshtein.js";import{nowIso}from"../core/shared/time.js";import{resolveGlobalPmRoot,resolvePmRoot}from"../core/store/paths.js";import{readSettings,writeSettings}from"../core/store/settings.js";import{quoteCommandArg,renderPmCommand}from"./command-line.js";import{createUnknownSubcommandError}from"./agent/subcommand-recovery.js";import{ensureTypeFolderScaffold}from"./schema.js";import{normalizeStringList,normalizeExtensionNameForMatch,normalizeManagedDirectoryName,parseExtensionManifest,validateExtensionDirectory}from"./extension/shared.js";import{sortManagedEntries,managedExtensionSourcesEquivalent,readManagedExtensionState,writeManagedExtensionState,upsertManagedEntry,persistManagedContributionInventory,resolveManagedExtensionStatePath}from"./extension/managed-state.js";import{parseExtensionInstallSource,resolveInstallSource,areDirectoriesEquivalent}from"./extension/install-sources.js";import{resolveBundledExtensionAliasSource,isBundledPackageInstallAllTarget,listBundledPackageAliases,resolveBundledAliasManifestName,buildBundledPackageCatalog}from"./extension/bundled-catalog.js";import{scaffoldExtensionProject}from"./extension/scaffold.js";import{buildExtensionDescribeResult}from"./extension/describe.js";import{applyDoctorRuntimeActivationState,classifyDoctorLoadFailureWarnings,classifyDoctorActivationFailureWarnings,classifyUnusedCapabilityWarnings,buildExtensionTriageSummary,parseDoctorDetailMode,collectUnknownCapabilityGuidance,buildCapabilityContractMetadata,buildDoctorConsistencySummary,summarizeExtensionFailures}from"./extension/doctor.js";import{copyExtensionDirectoryForInstall,copyExtensionDirectoryWithoutSelfNesting,ensureExtensionModuleTypeMarker,ensureInstalledExtensionSdkLink,isErrnoCode,isRetriableExtensionInstallCopyError,resolveCanonicalExtensionInstallDestination,withExtensionInstallLock}from"./extension/install-runtime.js";import{mapWithFixedConcurrency}from"./extension/concurrency.js";import{summarizeRuntimeCommandPathsForExtension}from"./extension/runtime-summary.js";import{collectGlobalOutputOverrideDoctorWarnings}from"./extension/output-ownership.js";import{collectMcpCustomFieldCollisionDoctorWarnings}from"./extension/custom-field-collisions.js";import{checkGithubUpdate}from"./extension/update-check.js";import{runExtensionMigrateAction}from"./extension/migrations.js";import{buildBundledInstallReceipt}from"./extension/install-receipts.js";import{buildExtensionInstallPlan}from"./extension/install-plan.js";import{inspectExtensionAuthorManifestAtPmRoot}from"./extension/author-manifest.js";import{resolveExtensionInstallSourceIdentity}from"./extension/source-resolution.js";import{captureExtensionInstallSnapshot,readOptionalMetadataFile,restoreExtensionInstallSnapshot}from"./extension/install-snapshot.js";const GITHUB_UPDATE_CHECK_CONCURRENCY=4;const LIFECYCLE_ACTION_TARGETS=[["install","install","--install"],["uninstall","uninstall","--uninstall"],["explore","explore","--explore"],["list","explore","--explore"],["manage","manage","--manage"],["describe","describe","--describe"],["reload","reload","--reload"],["doctor","doctor","--doctor"],["catalog","catalog","--catalog"],["init","init","--init"],["scaffold","init","--scaffold"],["adopt","adopt","--adopt"],["adopt-all","adopt-all","--adopt-all"],["activate","activate","--activate"],["deactivate","deactivate","--deactivate"],["migrate","migrate","--migrate"]];const LIFECYCLE_ACTION_FLAG_HINT=LIFECYCLE_ACTION_TARGETS.map(([,,flag])=>flag).filter((flag,index,flags)=>flags.indexOf(flag)===index).join(", ");const LIFECYCLE_ACTION_FLAGS={install:"--install",uninstall:"--uninstall",explore:"--explore",manage:"--manage",describe:"--describe",reload:"--reload",doctor:"--doctor",catalog:"--catalog",adopt:"--adopt","adopt-all":"--adopt-all",activate:"--activate",deactivate:"--deactivate",migrate:"--migrate",init:"--init"};const NATIVE_OUTPUT_MARKER="__pm_native_output";const EXTENSION_POLICY_ROOT_LIST_FIELDS=["trusted_extensions","allowed_extensions","blocked_extensions","allowed_capabilities","blocked_capabilities","allowed_surfaces","blocked_surfaces","allowed_commands","blocked_commands","allowed_actions","blocked_actions","allowed_services","blocked_services"];const EXTENSION_POLICY_OVERRIDE_LIST_FIELDS=["allowed_capabilities","blocked_capabilities","allowed_surfaces","blocked_surfaces","allowed_commands","blocked_commands","allowed_actions","blocked_actions","allowed_services","blocked_services"];const EXTENSION_POLICY_OVERRIDE_BOOLEAN_FIELDS=["disabled","require_trusted","require_provenance"];const DEFAULT_EXTENSION_POLICY_DETAILS={mode:"off",trust_mode:"off",require_provenance:false,trusted_extensions:[],default_sandbox_profile:"none",allowed_extensions:[],blocked_extensions:[],allowed_capabilities:[],blocked_capabilities:[],allowed_surfaces:[],blocked_surfaces:[],allowed_commands:[],blocked_commands:[],allowed_actions:[],blocked_actions:[],allowed_services:[],blocked_services:[],extension_overrides:[]};const normalizePolicyRootLists=policy=>{const safePolicy=policy??DEFAULT_EXTENSION_POLICY_DETAILS;const lists={};for(const field of EXTENSION_POLICY_ROOT_LIST_FIELDS){lists[field]=normalizeStringList(safePolicy[field]??[])}return lists};const appendNonEmptyPolicyLists=(target,lists)=>{for(const field of EXTENSION_POLICY_OVERRIDE_LIST_FIELDS){if(lists[field].length>0){target[field]=lists[field]}}return target};const appendEnabledPolicyScalars=(target,override)=>{for(const field of EXTENSION_POLICY_OVERRIDE_BOOLEAN_FIELDS){if(override[field]===true){target[field]=true}}if(override.sandbox_profile){target.sandbox_profile=override.sandbox_profile}return target};const normalizePolicyOverrideLists=override=>{const lists={};for(const field of EXTENSION_POLICY_OVERRIDE_LIST_FIELDS){lists[field]=normalizeStringList(override[field]??[])}return lists};const buildExtensionPolicyOverrideDetails=override=>{const name=typeof override.name==="string"?override.name.trim():"";if(name.length===0){return null}return appendNonEmptyPolicyLists(appendEnabledPolicyScalars({name},override),normalizePolicyOverrideLists(override))};const normalizeExtensionPolicyOverrides=overrides=>(overrides??[]).map(override=>buildExtensionPolicyOverrideDetails(override)).filter(override=>override!==null).sort((left,right)=>left.name.localeCompare(right.name));const buildExtensionPolicyDetails=policy=>{const safePolicy=Object.assign({},DEFAULT_EXTENSION_POLICY_DETAILS,policy??{});const rootLists=normalizePolicyRootLists(policy);const overrides=normalizeExtensionPolicyOverrides(safePolicy.extension_overrides);return{mode:safePolicy.mode,trust_mode:safePolicy.trust_mode,require_provenance:safePolicy.require_provenance===true,trusted_extensions:rootLists.trusted_extensions,default_sandbox_profile:safePolicy.default_sandbox_profile,allowed_extensions:rootLists.allowed_extensions,blocked_extensions:rootLists.blocked_extensions,allowed_capabilities:rootLists.allowed_capabilities,blocked_capabilities:rootLists.blocked_capabilities,allowed_surfaces:rootLists.allowed_surfaces,blocked_surfaces:rootLists.blocked_surfaces,allowed_commands:rootLists.allowed_commands,blocked_commands:rootLists.blocked_commands,allowed_actions:rootLists.allowed_actions,blocked_actions:rootLists.blocked_actions,allowed_services:rootLists.allowed_services,blocked_services:rootLists.blocked_services,extension_overrides:overrides}};const resolveInstalledExtensionCandidate=async(installed,extensionTarget)=>{const lookupValues=[extensionTarget];const bundledAliasManifestName=await resolveBundledAliasManifestName(extensionTarget);if(bundledAliasManifestName){lookupValues.push(bundledAliasManifestName)}const normalizedLookups=[...new Set(lookupValues.map(value=>normalizeExtensionNameForMatch(value)).filter(value=>value.length>0))];for(const lookup of normalizedLookups){const byName=installed.find(entry=>normalizeExtensionNameForMatch(entry.name)===lookup);if(byName){return byName}const byDirectory=installed.find(entry=>normalizeExtensionNameForMatch(entry.directory)===lookup);if(byDirectory){return byDirectory}}return void 0};const isExtensionEnabled=(settings,name)=>{const normalizedName=name.trim();const enabled=new Set(normalizeStringList(settings.extensions.enabled));const disabled=new Set(normalizeStringList(settings.extensions.disabled));if(disabled.has(normalizedName)){return false}if(enabled.size===0){return true}return enabled.has(normalizedName)};const ensureActivated=(settings,name)=>{const normalizedName=name.trim();const enabled=new Set(normalizeStringList(settings.extensions.enabled));const disabled=new Set(normalizeStringList(settings.extensions.disabled));const previousEnabled=[...enabled];const previousDisabled=[...disabled];disabled.delete(normalizedName);if(enabled.size>0){enabled.add(normalizedName)}settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right));settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right));return settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")};const ensureDeactivated=(settings,name)=>{const normalizedName=name.trim();const enabled=new Set(normalizeStringList(settings.extensions.enabled));const disabled=new Set(normalizeStringList(settings.extensions.disabled));const previousEnabled=[...enabled];const previousDisabled=[...disabled];enabled.delete(normalizedName);disabled.add(normalizedName);settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right));settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right));return settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")};const clearExtensionState=(settings,name)=>{const normalizedName=name.trim();const enabled=new Set(normalizeStringList(settings.extensions.enabled));const disabled=new Set(normalizeStringList(settings.extensions.disabled));const previousEnabled=[...enabled];const previousDisabled=[...disabled];enabled.delete(normalizedName);disabled.delete(normalizedName);settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right));settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right));return settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")};const suggestLifecycleActionTarget=target=>{const normalizedTarget=target.trim().toLowerCase();const maxDistance=Math.min(2,Math.max(1,Math.ceil(normalizedTarget.length/4)));const nearest=LIFECYCLE_ACTION_TARGETS.map(([candidate,action,flag])=>({action,flag,distance:levenshteinDistanceWithinLimit(normalizedTarget,candidate,maxDistance)})).filter(entry=>entry.distance!==null).sort((left,right)=>left.distance-right.distance)[0];return nearest?{action:nearest.action,flag:nearest.flag}:null};const buildUnknownLifecycleActionError=(target,options)=>{const noun=options.vocabulary==="package"?"package":"extension";const suggestion=suggestLifecycleActionTarget(target);if(!suggestion){return new PmCliError(`One action flag is required. Use one of: ${LIFECYCLE_ACTION_FLAG_HINT}. Bare \`pm package\` and \`pm extension\` default to --explore.`,EXIT_CODE.USAGE)}const command=`pm ${noun} ${suggestion.flag}`;return createUnknownSubcommandError({command_path:noun,display_name:`${noun} lifecycle`,token_kind:"action",token:target,allowed:Object.keys(IMPLICIT_EXTENSION_ACTIONS),retry_command:command,message_suffix:`. Did you mean "${suggestion.flag}"?`,fallback_candidates:[{source:"lifecycle_action",command,reason:`nearest lifecycle action for "${target}"`}]})};const EXTENSION_ACTION_FLAG_SELECTORS=[["install","install"],["uninstall","uninstall"],["explore","explore"],["manage","manage"],["describe","describe"],["reload","reload"],["doctor","doctor"],["catalog","catalog"],["init","init"],["scaffold","init"],["adopt","adopt"],["adoptAll","adopt-all"],["activate","activate"],["deactivate","deactivate"],["migrate","migrate"]];const IMPLICIT_EXTENSION_ACTIONS={doctor:"doctor",reload:"reload",catalog:"catalog",init:"init",scaffold:"init",explore:"explore",manage:"manage",migrate:"migrate",list:"explore","":"explore"};const resolveImplicitActionFromTarget=normalizedTarget=>IMPLICIT_EXTENSION_ACTIONS[normalizedTarget]??null;const resolveAction=(target,options)=>{const selected=[...new Set(EXTENSION_ACTION_FLAG_SELECTORS.filter(([flag])=>options[flag]===true).map(([,mappedAction])=>mappedAction))];if(selected.length===0){if(target===void 0){return"explore"}const implicitAction=resolveImplicitActionFromTarget(target.trim().toLowerCase());if(implicitAction){return implicitAction}throw buildUnknownLifecycleActionError(target,options)}if(selected.length>1){throw new PmCliError("Extension action flags are mutually exclusive.",EXIT_CODE.USAGE)}return selected[0]};const resolveScope=options=>{const projectLike=options.project===true||options.local===true;const global2=options.global===true;if(projectLike&&global2){throw new PmCliError('Options "--project/--local" and "--global" are mutually exclusive.',EXIT_CODE.USAGE)}return global2?"global":"project"};const EXTENSION_UPDATE_CHECK_RESOLVERS=[managedEntry=>managedEntry?null:{status:"skipped_unmanaged",reason:"extension_not_managed"},managedEntry=>managedEntry&&managedEntry.source.kind!=="github"?{status:"skipped_non_github",reason:`managed_source_kind_${managedEntry.source.kind}`}:null,managedEntry=>{const updateError=typeof managedEntry?.update_error==="string"?managedEntry.update_error.trim():"";return updateError.length>0?{status:"failed",reason:updateError}:null},managedEntry=>{const entry=managedEntry;const checkedAt=typeof entry.last_update_check_at==="string"?entry.last_update_check_at.trim():"";if(checkedAt.length===0){return null}const reason={true:"update_available",false:"up_to_date"}[String(entry.update_available)]??"checked_without_commit_baseline";return{status:"checked",reason}}];const resolveUpdateCheckResolution=managedEntry=>{for(const resolve of EXTENSION_UPDATE_CHECK_RESOLVERS){const resolution=resolve(managedEntry);if(resolution){return resolution}}return{status:"not_checked",reason:"no_update_check_recorded"}};const buildInstalledExtensionSummary=(identity,scope,managedEntry,updateCheck)=>{const managed=managedEntry??{};return{name:identity.name,directory:identity.directory,version:identity.version,entry:identity.entry,scope,active:identity.enabled,enabled:identity.enabled,runtime_active:null,activation_status:"unknown",contributions:managed.contributions,managed:Boolean(managedEntry),source:managed.source,update_available:managed.update_available,last_update_check_at:managed.last_update_check_at,last_update_remote_commit:managed.last_update_remote_commit,update_error:managed.update_error,update_check_status:updateCheck.status,update_check_reason:updateCheck.reason}};const buildMissingManifestInspection=(directoryName,scope,settings,managedEntry)=>{const managed=Object.assign({name:directoryName,manifest_version:"unknown",manifest_entry:"unknown"},managedEntry);const enabled=managedEntry?isExtensionEnabled(settings,managedEntry.name):false;return{warning:`extension_manifest_missing:${scope}:${directoryName}`,summary:buildInstalledExtensionSummary({name:managed.name,directory:directoryName,version:managed.manifest_version,entry:managed.manifest_entry,enabled},scope,managedEntry,resolveUpdateCheckResolution(managedEntry))}};const inspectInstalledExtensionDirectory=async(extensionsRoot,directoryName,scope,settings,managedByName,managedByDirectory)=>{const extensionDirectory=path.join(extensionsRoot,directoryName);const manifestPath=path.join(extensionDirectory,"manifest.json");const managedDirectoryEntry=managedByDirectory.get(normalizeExtensionNameForMatch(directoryName));if(!await pathExists(manifestPath)){return buildMissingManifestInspection(directoryName,scope,settings,managedDirectoryEntry)}const invalidJson=Symbol("invalid-extension-manifest-json");const rawManifest=await fs.readFile(manifestPath,"utf8").then(contents=>JSON.parse(contents)).catch(()=>invalidJson);if(rawManifest===invalidJson){return{warning:`extension_manifest_invalid_json:${scope}:${directoryName}`}}const manifest=parseExtensionManifest(rawManifest);if(!manifest){return{warning:`extension_manifest_invalid:${scope}:${directoryName}`}}const managedEntry=managedByName.get(normalizeExtensionNameForMatch(manifest.name))??managedByDirectory.get(normalizeExtensionNameForMatch(directoryName));return{summary:buildInstalledExtensionSummary({name:manifest.name,directory:directoryName,version:manifest.version,entry:manifest.entry,enabled:isExtensionEnabled(settings,manifest.name)},scope,managedEntry,resolveUpdateCheckResolution(managedEntry))}};const listInstalledExtensions=async(extensionsRoot,scope,settings,state)=>{if(!await pathExists(extensionsRoot)){return{extensions:[],warnings:[]}}const entries=await fs.readdir(extensionsRoot,{withFileTypes:true});const directories=entries.filter(entry=>entry.isDirectory()).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right));const managedByName=new Map(state.entries.map(managedEntry=>[normalizeExtensionNameForMatch(managedEntry.name),managedEntry]));const managedByDirectory=new Map(state.entries.map(managedEntry=>[normalizeExtensionNameForMatch(managedEntry.directory),managedEntry]));const warnings=[];const summaries=[];for(const directoryName of directories){const inspected=await inspectInstalledExtensionDirectory(extensionsRoot,directoryName,scope,settings,managedByName,managedByDirectory);if(inspected.warning){warnings.push(inspected.warning)}if(inspected.summary){summaries.push(inspected.summary)}}return{extensions:summaries.sort((left,right)=>left.name.localeCompare(right.name)),warnings:warnings.sort((left,right)=>left.localeCompare(right))}};const extensionRuntimeProbeQueue=createSerialQueue();const resolveCommandDiscoveryPackageName=(extensionName,source)=>[source.package,source.kind==="builtin"?source.name:void 0].find(candidate=>candidate?.trim())?.trim()??extensionName;const buildInstallCommandDiscovery=(extensionName,source,commandSummary,activationFailure)=>{const helpCommands=commandSummary.command_paths.map(commandPath=>`pm ${commandPath} --help`);const sdkDependencyMissing=activationFailure?.error.toLowerCase().includes("@unbrained/pm-cli")===true;const nextSteps=commandSummary.command_paths.length>0?[...helpCommands]:["Run pm package doctor --project --detail deep if expected package commands are missing."];if(sdkDependencyMissing){nextSteps.unshift("Install @unbrained/pm-cli in the target workspace so declarative package runtime imports resolve, then reinstall the package.")}return{package_name:resolveCommandDiscoveryPackageName(extensionName,source),extension_name:extensionName,command_paths:commandSummary.command_paths,action_paths:commandSummary.action_paths,help_commands:helpCommands,next_steps:nextSteps,...sdkDependencyMissing?{sdk_dependency_status:"missing"}:{}}};const summarizeActivationFailureForDiagnostics=failure=>{const trace=failure.trace;const summary={layer:failure.layer,name:failure.name,entry_path:failure.entry_path,error:failure.error};if(!trace)return summary;summary.trace=Object.fromEntries(Object.entries(trace).filter(([,value])=>value!==void 0));if(trace.missing_capability){summary.missing_capability=trace.missing_capability}if(trace.hint)summary.hint=trace.hint;return summary};const collectActivationFailureDiagnostics=failures=>{return failures.map(failure=>summarizeActivationFailureForDiagnostics(failure)).sort((left,right)=>`${left.layer}:${left.name}`.localeCompare(`${right.layer}:${right.name}`))};const findActivationFailureByName=(extensionName,failures,layer)=>{const normalizedName=normalizeExtensionNameForMatch(extensionName);return failures.find(failure=>(layer===void 0||failure.layer===layer)&&normalizeExtensionNameForMatch(failure.name)===normalizedName)};const resolveInstallRuntimeActivationStatus=(extensionName,scope,runtimeInstalled,installActivationFailure)=>{const runtimeInstalledExtension=runtimeInstalled.find(entry=>entry.scope===scope&&normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(extensionName));return runtimeInstalledExtension?.activation_status??(installActivationFailure?"failed":"unknown")};const probeRuntimeCommandPathsForInstall=(pmRoot,parent,settings,refreshedInstalled,global2)=>{return extensionRuntimeProbeQueue.enqueue(async()=>{const originalPackageRoot=process.env.PM_CLI_PACKAGE_ROOT;const snapshotRoot=await fs.mkdtemp(path.join(parent,".pm-module-graph-"));process.env.PM_CLI_PACKAGE_ROOT=resolvePmPackageRootFromModule(import.meta.url,["../.."]);try{const loadResult=await loadExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===true,reload_token:nextExtensionReloadToken(),cache_bust:true,module_graph_snapshot_root:snapshotRoot});const activationResult=await activateExtensions({...loadResult});const runtimeFailures=[...loadResult.failed.map(failure=>({layer:failure.layer,name:failure.name,entry_path:failure.entry_path,error:failure.error})),...collectActivationFailureDiagnostics(activationResult.failed)];const contributionInventories=Object.fromEntries(loadResult.loaded.map(extension=>[normalizeExtensionNameForMatch(extension.name),createExtensionContributionInventory(describeExtensionActivation(activationResult,{extensionName:extension.name}))]));return{installed:applyDoctorRuntimeActivationState(refreshedInstalled,loadResult,activationResult),warnings:[...loadResult.warnings,...activationResult.warnings],activation_failures:runtimeFailures,extensions_disabled:loadResult.disabled_by_flag,item_type_registrations:activationResult.registrations.item_types,contribution_inventories:contributionInventories}}finally{await fs.rm(snapshotRoot,{recursive:true,force:true});if(originalPackageRoot===void 0){delete process.env.PM_CLI_PACKAGE_ROOT}else{process.env.PM_CLI_PACKAGE_ROOT=originalPackageRoot}}})};const adoptUnmanagedExtensions=async(extensionsRoot,scope,installedExtensions,state)=>{const unmanagedCandidates=installedExtensions.filter(entry=>!entry.managed);const sortedCandidates=[...unmanagedCandidates].sort((left,right)=>{const byName=left.name.localeCompare(right.name);if(byName!==0){return byName}return left.directory.localeCompare(right.directory)});let nextState=state;const adoptedEntries=[];for(const candidate of sortedCandidates){const extensionDirectory=path.join(extensionsRoot,candidate.directory);const validated=await validateExtensionDirectory(extensionDirectory);const now=nowIso();const sourceRecord={kind:"local",input:candidate.name,location:extensionDirectory};nextState=upsertManagedEntry(nextState,{name:validated.manifest.name,directory:candidate.directory,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,installed_at:now,updated_at:now,source:sourceRecord});adoptedEntries.push({name:validated.manifest.name,directory:candidate.directory,version:validated.manifest.version,entry:validated.manifest.entry,source:sourceRecord})}if(adoptedEntries.length>0){await writeManagedExtensionState(extensionsRoot,nextState)}return{state:nextState,adopted_entries:adoptedEntries,unmanaged_candidates:sortedCandidates,already_managed_count:installedExtensions.length-unmanagedCandidates.length}};const resolveExtensionRootsForScope=(scope,global2)=>{const pmRoot=resolvePmRoot(process.cwd(),global2.path);const roots=resolveExtensionRoots(pmRoot,process.cwd());const settingsRoot=scope==="global"?resolveGlobalPmRoot(process.cwd()):pmRoot;const selectedRoot=scope==="global"?roots.global:roots.project;return{pm_root:pmRoot,scope,settings_root:settingsRoot,selected_root:selectedRoot,roots}};const resolveGithubOption=options=>{const values=[options.gh,options.github].filter(value=>typeof value==="string").map(value=>value.trim()).filter(Boolean);const uniqueValues=[...new Set(values)];if(uniqueValues.length>1){throw new PmCliError('Options "--gh" and "--github" must match when both are provided.',EXIT_CODE.USAGE)}return uniqueValues[0]};const getLifecycleActionFlag=action=>{return LIFECYCLE_ACTION_FLAGS[action]};const throwMissingLifecycleTarget=(action,options)=>{const noun=options.vocabulary==="package"?"package":"extension";const targetName=action==="install"?"source":"name";const targetLabel=`${noun} ${targetName}`;const actionFlag=getLifecycleActionFlag(action);const commandTarget=`<${targetName}>`;const command=`pm ${noun} ${actionFlag} ${commandTarget}`;throw new PmCliError(`Action "${action}" requires ${targetLabel} input.`,EXIT_CODE.USAGE,{code:"missing_lifecycle_target",required:`Provide a ${targetName} target for ${action}.`,examples:[`pm ${noun} ${action} ${commandTarget}`,command,`pm ${noun} --help`],recovery:{attempted_command:`pm ${noun} ${action}`,suggested_retry:command,fallback_candidates:[{source:"lifecycle_action",command,reason:`flag-form ${action} command with required ${targetName} target`}]}})};const requireTarget=(target,action,options={})=>{const normalized=target?.trim();if(normalized)return normalized;if(action==="init"){throw new PmCliError('Action "init" requires a scaffold target path (for example: pm package init ./my-package or pm extension init ./my-extension).',EXIT_CODE.USAGE)}return throwMissingLifecycleTarget(action,options)};const collectSchemaNarrowActivationDoctorWarnings=(loadResult,activationResult)=>{const schemaContributors=new Set([...activationResult.registrations.item_types.map(entry=>({entry,count:entry.types.length})),...activationResult.registrations.item_fields.map(entry=>({entry,count:entry.fields.length}))].filter(({count})=>count>0).map(({entry})=>`${entry.layer}:${normalizeExtensionNameForMatch(entry.name)}`));return loadResult.loaded.filter(extension=>(extension.activation?.commands??[]).length>0).filter(extension=>schemaContributors.has(`${extension.layer}:${normalizeExtensionNameForMatch(extension.name)}`)).map(extension=>`extension_schema_narrow_activation:${extension.layer}:${extension.name}`).filter((warning,index,warnings)=>warnings.indexOf(warning)===index).sort((left,right)=>left.localeCompare(right))};const assertExtensionActionOptionScope=(action,options)=>{const guards=[{triggered:options.strictExit===true||options.failOnWarn===true,allowed:action==="doctor",message:"--strict-exit and --fail-on-warn are only valid with --doctor."},{triggered:options.trace===true,allowed:action==="doctor",message:"--trace is only valid with --doctor."},{triggered:options.watch===true,allowed:action==="reload",message:"--watch is only valid with --reload."},{triggered:options.runtimeProbe===true,allowed:action==="manage",message:"--runtime-probe is only valid with --manage."},{triggered:options.fixManagedState===true,allowed:action==="manage"||action==="doctor",message:"--fix-managed-state is only valid with --manage or --doctor."},{triggered:options.isolated===true||options.ignoreGlobal===true,allowed:action==="doctor",message:"--isolated and --ignore-global are only valid with --doctor."},{triggered:options.capability!==void 0,allowed:action==="init",message:"--capability is only valid with --init/--scaffold."},{triggered:options.declarative===true,allowed:action==="init",message:"--declarative is only valid with --init/--scaffold."},{triggered:options.dryRun===true,allowed:action==="migrate"||action==="install",message:"--dry-run is only valid with --migrate or --install."}];const invalidGuard=guards.find(guard=>guard.triggered&&!guard.allowed);if(invalidGuard){throw new PmCliError(invalidGuard.message,EXIT_CODE.USAGE)}};const resolveNormalizedExtensionTarget=(target,action,options)=>{const normalizedInput=String(target??"").trim().toLowerCase();const explicitInitAction=[options.init,options.scaffold].includes(true);const aliases={doctor:["doctor"],reload:["reload"],catalog:["catalog"],init:explicitInitAction?[]:["init","scaffold"]};return(aliases[action]??[]).includes(normalizedInput)?void 0:target};const resolveExtensionResultRoots=ctx=>{const projectedCatalog=[ctx.action==="catalog",typeof ctx.options.fields==="string",String(ctx.options.fields).trim().length>0].every(Boolean);return projectedCatalog?{project:"project",global:"global",selected:ctx.scope,settings_root:"project"}:{project:ctx.resolvedRoots.roots.project,global:ctx.resolvedRoots.roots.global,selected:ctx.resolvedRoots.selected_root,settings_root:ctx.resolvedRoots.settings_root}};const buildExtensionActionResult=(ctx,details,ok)=>{const result={ok,action:ctx.action,scope:ctx.scope,roots:resolveExtensionResultRoots(ctx),warnings:[...new Set(ctx.warnings)].sort((left,right)=>left.localeCompare(right)),details};if(ctx.action==="doctor"){Object.defineProperty(result,NATIVE_OUTPUT_MARKER,{value:true,enumerable:false,configurable:false})}return result};const runExtension=async(target,options,global2)=>{const action=resolveAction(target,options);assertExtensionActionOptionScope(action,options);const normalizedTarget=resolveNormalizedExtensionTarget(target,action,options);const scope=resolveScope(options);const resolvedRoots=resolveExtensionRootsForScope(scope,global2);const warnings=[];const actionContext={action,normalizedTarget,scope,resolvedRoots,warnings,options,global:global2};const withResult=(details,ok=true)=>buildExtensionActionResult(actionContext,details,ok);const ctx={...actionContext,withResult};return await dispatchExtensionAction(ctx)};const buildExtensionScaffoldNextSteps=(scaffold,options)=>{const vocabulary=options.vocabulary??"extension";const shellTargetPath=scaffold.target_path.replace(/\\/g,"/");const quotedShellTargetPath=quoteCommandArg(shellTargetPath);const dependencySteps={package:`Install dependencies: cd ${quotedShellTargetPath}, then run "npm install"`,extension:`Install type-check dependencies: cd ${quotedShellTargetPath}, then run "npm install -D typescript @types/node @unbrained/pm-cli"`};const validationSteps={package:`Validate the package: cd ${quotedShellTargetPath}, then run "npm run typecheck" and "npm test"`,extension:`Type-check the source (optional): cd ${quotedShellTargetPath}, then run "npx tsc --noEmit"`};const declarativeGuidance=[];if([vocabulary==="package",options.declarative===true].every(Boolean)){declarativeGuidance.push("Ensure the target workspace can resolve @unbrained/pm-cli before installing this declarative package.")}return[dependencySteps[vocabulary],...declarativeGuidance,`Install the scaffold: ${renderPmCommand(vocabulary==="package"?["install","--project",shellTargetPath]:["extension","--install","--project",shellTargetPath])}`,`Smoke-test command path: pm ${scaffold.command_name}`,validationSteps[vocabulary],`Run diagnostics: ${vocabulary==="package"?"pm package doctor":"pm extension --doctor"} --project --detail summary`]};const runExtensionInitAction=async ctx=>{const{action,normalizedTarget,options,withResult}=ctx;const githubOption=resolveGithubOption(options);const disallowedSourceOptions=[githubOption,options.ref].filter(value=>typeof value==="string").map(value=>value.trim()).filter(Boolean);if(disallowedSourceOptions.length>0){throw new PmCliError('Action "init" does not accept --gh/--github/--ref options.',EXIT_CODE.USAGE)}const scaffoldTarget=requireTarget(normalizedTarget,action,options);const scaffold=await scaffoldExtensionProject(scaffoldTarget,options.vocabulary??"extension",options.capability,options.declarative===true);return withResult({scaffolded:scaffold.created_directory||scaffold.files.some(entry=>entry.status==="created"),extension:{name:scaffold.extension_name,command:scaffold.command_name},capability:scaffold.capability,style:scaffold.style,target_path:scaffold.target_path,created_directory:scaffold.created_directory,files:scaffold.files,next_steps:buildExtensionScaffoldNextSteps(scaffold,options)})};const runExtensionReloadAction=async ctx=>{const{normalizedTarget,resolvedRoots,warnings,options,global:global2,withResult}=ctx;if(normalizedTarget!==void 0){throw new PmCliError('Action "reload" does not accept a target argument.',EXIT_CODE.USAGE)}const settings=await readSettings(resolvedRoots.settings_root);const reloadToken=nextExtensionReloadToken();const reloaded=await loadExtensions({pmRoot:resolvedRoots.settings_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions,reload_token:reloadToken,cache_bust:true});warnings.push(...reloaded.warnings);const activation=await activateExtensions(reloaded);warnings.push(...activation.warnings);const details={reload:{token:reloadToken,cache_bust:true,watch:options.watch===true},loaded_count:reloaded.loaded.length,failed_count:reloaded.failed.length,activated_count:Math.max(0,reloaded.loaded.length-activation.failed.length),activation_failed_count:activation.failed.length,loaded_extensions:reloaded.loaded.map(entry=>({name:entry.name,layer:entry.layer,version:entry.version})),failed_extensions:reloaded.failed.map(entry=>({name:entry.name,layer:entry.layer,error:entry.error})),activation_failures:activation.failed.map(entry=>({name:entry.name,layer:entry.layer,error:entry.error}))};if(options.watch===true){warnings.push("extension_reload_watch_hint:watch_mode_requested_non_interactive_single_pass_only")}return withResult(details)};const runExtensionCatalogAction=async ctx=>{const{normalizedTarget,scope,options,global:global2,withResult}=ctx;if(typeof normalizedTarget==="string"&&normalizedTarget.length>0&&normalizedTarget!=="catalog"){throw new PmCliError('Action "catalog" does not accept a package target.',EXIT_CODE.USAGE)}return withResult(await buildBundledPackageCatalog(scope,global2,options))};const buildBundledInstallManagedSource=(alias,packageName)=>({kind:"builtin",input:alias,location:alias,name:alias,...packageName===null?{}:{package:packageName}});const buildLocalInstallManagedSource=source=>({kind:"local",input:source.input,location:source.absolute_path});const buildNpmInstallManagedSource=(source,resolved)=>({kind:"npm",input:source.input,location:resolved.resolved_subpath??".",package:resolved.npm_package,version:resolved.npm_version});const buildGithubInstallManagedSource=(source,resolved)=>({kind:"github",input:source.input,location:resolved.resolved_subpath??source.subpath??".",repository:source.repository,owner:source.owner,repo:source.repo,ref:source.ref,subpath:resolved.resolved_subpath??source.subpath,commit:resolved.commit});const buildInstallManagedSource=(bundledAliasName,bundledPackageName,installSource,resolvedSource)=>{if(bundledAliasName){return buildBundledInstallManagedSource(bundledAliasName,bundledPackageName)}if(installSource.kind==="local"){return buildLocalInstallManagedSource(installSource)}if(installSource.kind==="npm"){return buildNpmInstallManagedSource(installSource,resolvedSource)}return buildGithubInstallManagedSource(installSource,resolvedSource)};const resolveManagedInstallTimestamps=(existing,manifestVersion,source,now)=>{if(!existing)return{installed_at:now,updated_at:now};if(existing.manifest_version!==manifestVersion){return{installed_at:existing.installed_at,updated_at:now}}if(!managedExtensionSourcesEquivalent(existing.source,source)){return{installed_at:existing.installed_at,updated_at:now}}return{installed_at:existing.installed_at,updated_at:existing.updated_at}};const persistExtensionInstall=async(ctx,input)=>{const{scope,resolvedRoots,warnings}=ctx;const{validated,destinationDirectoryName}=input;const settings=await readSettings(resolvedRoots.settings_root);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const destinationDirectory=path.join(resolvedRoots.selected_root,destinationDirectoryName);const destinationExists=await pathExists(destinationDirectory);const installInPlace=await areDirectoriesEquivalent(validated.directory,destinationDirectory);await fs.mkdir(resolvedRoots.selected_root,{recursive:true});const backupRoot=await fs.mkdtemp(path.join(resolvedRoots.selected_root,".pm-extension-install-backup-"));const backupDirectory=path.join(backupRoot,"destination");try{const snapshot=await captureExtensionInstallSnapshot(resolvedRoots.selected_root,resolvedRoots.settings_root,destinationDirectory,destinationExists,backupDirectory);const sourceRecord=buildInstallManagedSource(input.bundledAliasName,input.bundledPackageName,input.installSource,input.resolvedSource);const existingManagedEntry=managedStateRead.state.entries.find(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(validated.manifest.name));const timestamps=resolveManagedInstallTimestamps(existingManagedEntry,validated.manifest.version,sourceRecord,nowIso());const managedState=upsertManagedEntry(managedStateRead.state,{name:validated.manifest.name,directory:destinationDirectoryName,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,...timestamps,source:sourceRecord});const activationChanged=ensureActivated(settings,validated.manifest.name);try{if(!installInPlace){await copyExtensionDirectoryForInstall(validated.directory,destinationDirectory)}await ensureExtensionModuleTypeMarker(destinationDirectory);await ensureInstalledExtensionSdkLink(destinationDirectory);await writeManagedExtensionState(resolvedRoots.selected_root,managedState);if(activationChanged){await writeSettings(resolvedRoots.settings_root,settings,"settings:write")}}catch(error){try{await restoreExtensionInstallSnapshot(snapshot)}catch(rollbackError){throw new AggregateError([error,rollbackError],`Extension install failed: ${String(error)}; rollback failed: ${String(rollbackError)}`,{cause:rollbackError})}throw error}return{settings,managedState,sourceRecord,destinationDirectory,destinationExists,installInPlace,activationChanged}}finally{await fs.rm(backupRoot,{recursive:true,force:true}).catch(()=>void 0)}};const scaffoldInstalledExtensionItemTypes=async(ctx,extensionName,registrations)=>{const definitions=registrations.filter(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(extensionName)).flatMap(entry=>entry.types.map(type=>({name:type.name,folder:type.folder})));if(ctx.scope==="project"&&definitions.length>0){await ensureTypeFolderScaffold(ctx.resolvedRoots.pm_root,definitions,ctx.warnings,"install:type-folder")}return definitions};const buildInstalledExtensionActivation=(ctx,extensionName,runtimeProbe,commandSummary,installedItemTypes)=>{const failure=findActivationFailureByName(extensionName,runtimeProbe.activation_failures,ctx.scope);const status=resolveInstallRuntimeActivationStatus(extensionName,ctx.scope,runtimeProbe.installed,failure);const activated=[!runtimeProbe.extensions_disabled,status==="ok"].every(Boolean);if(!activated){ctx.warnings.push(`extension_install_activation_failed:${ctx.scope}:${extensionName}:${status}`)}const healthByActivation={true:{status:"ok",blocking_failure_count:0},false:{status:"degraded",blocking_failure_count:1}};return{activated,status,failure,verification:{status:healthByActivation[String(activated)].status,target_pm_root:ctx.resolvedRoots.pm_root,activation_status:status,activated,registered_commands:commandSummary.command_paths,registered_actions:commandSummary.action_paths,registered_item_types:installedItemTypes,module_graph_verification:"fresh_in_topology_snapshot",health:healthByActivation[String(activated)]}}};const performExtensionInstallUnderLock=async(ctx,input)=>{const{scope,resolvedRoots,warnings,global:global2,withResult}=ctx;const{validated,destinationDirectoryName}=input;const persisted=await persistExtensionInstall(ctx,input);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,persisted.settings,persisted.managedState);warnings.push(...refreshedInstalled.warnings);const runtimeProbe=await probeRuntimeCommandPathsForInstall(resolvedRoots.pm_root,path.dirname(resolvedRoots.selected_root),persisted.settings,refreshedInstalled.extensions,global2);warnings.push(...runtimeProbe.warnings);const installedItemTypeDefinitions=await scaffoldInstalledExtensionItemTypes(ctx,validated.manifest.name,runtimeProbe.item_type_registrations);const commandSummary=summarizeRuntimeCommandPathsForExtension(validated.manifest.name,runtimeProbe.installed);const activation=buildInstalledExtensionActivation(ctx,validated.manifest.name,runtimeProbe,commandSummary,installedItemTypeDefinitions);const contributionInventory=runtimeProbe.contribution_inventories[normalizeExtensionNameForMatch(validated.manifest.name)];if(contributionInventory){persisted.managedState=await persistManagedContributionInventory(resolvedRoots.selected_root,persisted.managedState,validated.manifest.name,contributionInventory)}return withResult({extension:{name:validated.manifest.name,version:validated.manifest.version,entry:validated.manifest.entry,capabilities:validated.manifest.capabilities,directory:destinationDirectoryName},source:persisted.sourceRecord,source_resolution:input.sourceResolution,...input.installPlan?{install_plan:input.installPlan}:{},destination_path:persisted.destinationDirectory,overwritten:[persisted.destinationExists,!persisted.installInPlace].every(Boolean),installed_in_place:persisted.installInPlace,activated:activation.activated,settings_changed:persisted.activationChanged,runtime_activation_status:activation.status,command_paths:commandSummary.command_paths,action_paths:commandSummary.action_paths,contributions:contributionInventory,command_discovery:buildInstallCommandDiscovery(validated.manifest.name,persisted.sourceRecord,commandSummary,activation.failure),verification:activation.verification,activation_diagnostics:{failed_count:runtimeProbe.activation_failures.length,failed:runtimeProbe.activation_failures,installed_extension_failed:activation.failure??null}},activation.activated)};const runBundledExtensionInstallAll=async ctx=>{const{options,global:global2,warnings,withResult}=ctx;if(typeof options.ref==="string"&&options.ref.trim().length>0){throw new PmCliError('Action "install all" does not accept --ref.',EXIT_CODE.USAGE)}const packages=[];const installedSources=new Map;for(const alias of await listBundledPackageAliases()){const source=await resolveBundledExtensionAliasSource(alias);const sourceKey=path.resolve(source);let result=installedSources.get(sourceKey);if(result===void 0){result=await runExtension(alias,{...options,install:true},global2);installedSources.set(sourceKey,result)}packages.push({alias,result})}warnings.push(...packages.flatMap(entry=>entry.result.warnings));return withResult(buildBundledInstallReceipt(packages,options.dryRun===true),packages.every(entry=>entry.result.ok))};const runSingleExtensionInstall=async(ctx,explicitSourceInput,githubOption)=>{const{resolvedRoots}=ctx;const{bundledAliasName,bundledPackageName,installSource,sourceResolution}=await resolveExtensionInstallSourceIdentity(explicitSourceInput,githubOption,ctx.options.ref);if(sourceResolution.ambiguous){const npmCandidate=sourceResolution.candidates.find(candidate=>candidate.kind==="npm");ctx.warnings.push(`extension_install_source_ambiguous:${explicitSourceInput}:builtin:${bundledAliasName}:npm:${npmCandidate.package}`)}const resolvedSource=await resolveInstallSource(installSource);try{const validated=await validateExtensionDirectory(resolvedSource.directory,{source_kind:installSource.kind,source_input:installSource.input,source_root:resolvedSource.source_root});const destinationDirectoryName=normalizeManagedDirectoryName(validated.manifest.name);const installPlan=ctx.options.dryRun===true||installSource.kind==="local"&&bundledAliasName===null?await buildExtensionInstallPlan(resolvedSource,path.join(resolvedRoots.selected_root,destinationDirectoryName),ctx.scope,ctx.options.copyPlan):void 0;if(ctx.options.dryRun===true){return ctx.withResult({dry_run:true,installed:false,activated:false,extension:{name:validated.manifest.name,version:validated.manifest.version},source_resolution:sourceResolution,install_plan:installPlan})}return await withExtensionInstallLock(resolvedRoots.settings_root,destinationDirectoryName,()=>performExtensionInstallUnderLock(ctx,{validated,destinationDirectoryName,bundledAliasName,bundledPackageName,sourceResolution,installSource,resolvedSource,installPlan}))}finally{if(resolvedSource.cleanup){await resolvedSource.cleanup()}}};const runExtensionInstallAction=async ctx=>{const githubOption=resolveGithubOption(ctx.options);const explicitSourceInput=githubOption??requireTarget(ctx.normalizedTarget,ctx.action,ctx.options);if([githubOption===void 0,isBundledPackageInstallAllTarget(explicitSourceInput)].every(Boolean)){return runBundledExtensionInstallAll(ctx)}return runSingleExtensionInstall(ctx,explicitSourceInput,githubOption)};const runExtensionAdoptAllAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,withResult}=ctx;if(normalizedTarget!==void 0){throw new PmCliError('Action "adopt-all" does not accept a target argument.',EXIT_CODE.USAGE)}const githubOption=resolveGithubOption(options);if(githubOption!==void 0||typeof options.ref==="string"&&options.ref.trim().length>0){throw new PmCliError('Action "adopt-all" does not accept --gh/--github/--ref options.',EXIT_CODE.USAGE)}const settings=await readSettings(resolvedRoots.settings_root);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const adoption=await adoptUnmanagedExtensions(resolvedRoots.selected_root,scope,installed.extensions,managedStateRead.state);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,adoption.state);warnings.push(...refreshedInstalled.warnings);const triage=buildExtensionTriageSummary(scope,warnings,refreshedInstalled.extensions,options);warnings.push(...triage.warnings);const refreshedByIdentity=new Map(refreshedInstalled.extensions.map(entry=>[`${normalizeExtensionNameForMatch(entry.name)}:${normalizeExtensionNameForMatch(entry.directory)}`,entry]));const refreshedByDirectory=new Map(refreshedInstalled.extensions.map(entry=>[normalizeExtensionNameForMatch(entry.directory),entry]));const adoptedDetails=adoption.adopted_entries.map(entry=>{const normalizedDirectory=normalizeExtensionNameForMatch(entry.directory);const refreshedEntry=refreshedByIdentity.get(`${normalizeExtensionNameForMatch(entry.name)}:${normalizedDirectory}`)??refreshedByDirectory.get(normalizedDirectory);return{...entry,...projectExtensionUpdateCheck(refreshedEntry)}});return withResult({adopted_all:adoptedDetails.length>0,adopted_count:adoptedDetails.length,already_managed_count:adoption.already_managed_count,extensions:adoptedDetails,triage,warning_codes:triage.warning_codes,update_health_partial:triage.update_health_partial,update_health_coverage:triage.update_health_coverage})};const projectExtensionUpdateCheck=entry=>{return{update_check_status:entry?.update_check_status??null,update_check_reason:entry?.update_check_reason??null}};const buildAdoptedExtensionSource=(githubOption,extensionTarget,extensionDirectory,ref)=>{if(githubOption===void 0){return{kind:"local",input:extensionTarget,location:extensionDirectory}}const parsed=parseExtensionInstallSource(githubOption,{forceGithub:true,ref});if(parsed.kind!=="github"){throw new PmCliError(`Invalid GitHub shorthand "${githubOption}".`,EXIT_CODE.USAGE)}return{kind:"github",input:parsed.input,location:parsed.subpath??".",repository:parsed.repository,owner:parsed.owner,repo:parsed.repo,ref:parsed.ref,subpath:parsed.subpath}};const runExtensionAdoptAction=async ctx=>{const{action,normalizedTarget,scope,resolvedRoots,warnings,options,withResult}=ctx;const extensionTarget=requireTarget(normalizedTarget,action,options);const githubOption=resolveGithubOption(options);const settings=await readSettings(resolvedRoots.settings_root);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const candidate=await resolveInstalledExtensionCandidate(installed.extensions,extensionTarget);if(!candidate){throw new PmCliError(`Installed extension "${extensionTarget}" was not found in ${scope} scope.`,EXIT_CODE.NOT_FOUND)}if(candidate.managed){return withResult({adopted:false,already_managed:true,extension:{name:candidate.name,directory:candidate.directory}})}const extensionDirectory=path.join(resolvedRoots.selected_root,candidate.directory);const validated=await validateExtensionDirectory(extensionDirectory);const now=nowIso();const sourceRecord=buildAdoptedExtensionSource(githubOption,extensionTarget,extensionDirectory,options.ref);const managedState=upsertManagedEntry(managedStateRead.state,{name:validated.manifest.name,directory:candidate.directory,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,installed_at:now,updated_at:now,source:sourceRecord});await writeManagedExtensionState(resolvedRoots.selected_root,managedState);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);warnings.push(...refreshedInstalled.warnings);const refreshedEntry=refreshedInstalled.extensions.find(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(validated.manifest.name))??refreshedInstalled.extensions.find(entry=>normalizeExtensionNameForMatch(entry.directory)===normalizeExtensionNameForMatch(candidate.directory));return withResult({adopted:true,extension:{name:validated.manifest.name,directory:candidate.directory,version:validated.manifest.version,entry:validated.manifest.entry},source:sourceRecord,...projectExtensionUpdateCheck(refreshedEntry)})};const resolveRequiredInstalledExtension=async ctx=>{const{action,normalizedTarget,scope,resolvedRoots,warnings,options}=ctx;const extensionTarget=requireTarget(normalizedTarget,action,options);const settings=await readSettings(resolvedRoots.settings_root);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const candidate=await resolveInstalledExtensionCandidate(installed.extensions,extensionTarget);if(!candidate){throw new PmCliError(`Installed extension "${extensionTarget}" was not found in ${scope} scope.`,EXIT_CODE.NOT_FOUND)}return{settings,managedStateRead,candidate}};const runExtensionUninstallAction=async ctx=>{const{resolvedRoots,withResult}=ctx;const{settings,managedStateRead,candidate}=await resolveRequiredInstalledExtension(ctx);const destinationDirectory=path.join(resolvedRoots.selected_root,candidate.directory);await fs.rm(destinationDirectory,{recursive:true,force:true});const updatedState={...managedStateRead.state,updated_at:nowIso(),entries:managedStateRead.state.entries.filter(entry=>normalizeExtensionNameForMatch(entry.name)!==normalizeExtensionNameForMatch(candidate.name)&&normalizeExtensionNameForMatch(entry.directory)!==normalizeExtensionNameForMatch(candidate.directory))};await writeManagedExtensionState(resolvedRoots.selected_root,updatedState);const stateChanged=clearExtensionState(settings,candidate.name);if(stateChanged){await writeSettings(resolvedRoots.settings_root,settings,"settings:write")}return withResult({removed:true,extension:{name:candidate.name,directory:candidate.directory},destination_path:destinationDirectory,settings_changed:stateChanged})};const runExtensionActivateDeactivateAction=async ctx=>{const{action,resolvedRoots,warnings,global:global2,withResult}=ctx;const{settings,candidate}=await resolveRequiredInstalledExtension(ctx);const settingsChanged=action==="activate"?ensureActivated(settings,candidate.name):ensureDeactivated(settings,candidate.name);if(settingsChanged){await writeSettings(resolvedRoots.settings_root,settings,"settings:write")}const activationFailure=action==="activate"?await probeRuntimeCommandPathsForInstall(resolvedRoots.pm_root,path.dirname(resolvedRoots.selected_root),settings,[candidate],global2).then(probe=>{warnings.push(...probe.warnings);return findActivationFailureByName(candidate.name,probe.activation_failures,ctx.scope)}):void 0;if(activationFailure)warnings.push(`extension_activate_failed:${ctx.scope}:${candidate.name}`);return withResult({extension:{name:candidate.name,directory:candidate.directory},active:action==="activate"&&activationFailure===void 0,runtime_active:action==="activate"&&activationFailure===void 0,activation_failure:activationFailure??null,settings_changed:settingsChanged,settings:{enabled:[...settings.extensions.enabled],disabled:[...settings.extensions.disabled]}},activationFailure===void 0)};const buildDoctorRemediation=(baseRemediation,loadFailureCount,activationFailureCount,vocabulary,managedStateFix,isolationHint)=>{const noun=vocabulary==="package"?"package":"extension";const doctorAction={package:"doctor",extension:"--doctor"}[noun];const adoptedCount=managedStateFix?.adopted_entries.length??0;const conditionalEntries=[[isolationHint!==null,isolationHint??""],[loadFailureCount>0,`Run pm ${noun} explore --project and pm ${noun} explore --global to inspect load failures.`],[activationFailureCount>0,`Review activation failures in pm ${noun} ${doctorAction} --detail deep output.`],[adoptedCount>0,`Managed-state fix adopted ${adoptedCount} extension(s).`]];return[...new Set([...baseRemediation,...conditionalEntries.filter(([include])=>include).map(([,entry])=>entry)].map(entry=>entry.trim()).filter(entry=>entry.length>0))]};const hasGlobalLayerDiagnostics=loadResult=>{return loadResult.loaded.some(entry=>entry.layer==="global")||loadResult.failed.some(entry=>entry.layer==="global")||loadResult.warnings.some(warning=>warning.includes(":global:"))};const buildDoctorIsolationHint=(scope,isolated,vocabulary,loadResult)=>{if(scope!=="project"||isolated||!hasGlobalLayerDiagnostics(loadResult)){return null}const noun=vocabulary==="package"?"package":"extension";return`Global ${noun} registrations are included in project diagnostics. For hermetic ${noun} smoke tests, rerun pm ${noun} doctor --project --isolated --detail deep --trace, or set PM_GLOBAL_PATH to a temporary directory for the whole test process.`};const resolveDoctorInvocationOptions=(target,scope,options)=>{if(String(target??"").trim().length>0){throw new PmCliError('Action "doctor" does not accept a target argument.',EXIT_CODE.USAGE)}const isolated=[options.isolated,options.ignoreGlobal].includes(true);if([isolated,scope==="global"].every(Boolean)){throw new PmCliError("--isolated and --ignore-global are only valid with project-scope doctor diagnostics.",EXIT_CODE.USAGE)}const detailMode=parseDoctorDetailMode(options.detail);const includeTrace=options.trace===true;if([includeTrace,detailMode!=="deep"].every(Boolean)){throw new PmCliError("--trace requires --detail deep with --doctor.",EXIT_CODE.USAGE)}return{isolated,detailMode,includeTrace}};const applyDoctorManagedStateFix=async(ctx,installed,state)=>{if(ctx.options.fixManagedState!==true)return{state,fix:null};const fix=await adoptUnmanagedExtensions(ctx.resolvedRoots.selected_root,ctx.scope,installed,state);return{state:fix.state,fix}};const buildDoctorIsolationMetadata=(scope,isolated,vocabulary,loadResult)=>{const noun=vocabulary==="package"?"package":"extension";if(scope!=="project"){return{isolated,global_extensions_included:false,global_diagnostics_present:hasGlobalLayerDiagnostics(loadResult),rerun_command:null,pm_global_path_recipe:null}}const isolatedCommand=`pm ${noun} doctor --project --isolated --detail deep --trace`;return{isolated,global_extensions_included:!isolated,global_diagnostics_present:hasGlobalLayerDiagnostics(loadResult),rerun_command:isolated?null:isolatedCommand,pm_global_path_recipe:`PM_GLOBAL_PATH=$(mktemp -d) pm ${noun} doctor --project --detail deep --trace`}};const runExtensionDoctorAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,global:global2,withResult}=ctx;const{isolated,detailMode,includeTrace}=resolveDoctorInvocationOptions(normalizedTarget,scope,options);const settings=await readSettings(resolvedRoots.settings_root);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const{state:managedState,fix:managedStateFix}=await applyDoctorManagedStateFix(ctx,installed.extensions,managedStateRead.state);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);warnings.push(...refreshedInstalled.warnings);const loadResult=await loadExtensions({pmRoot:resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===true,ignoreGlobalExtensions:isolated});const activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded});const authorManifest=await inspectExtensionAuthorManifestAtPmRoot(resolvedRoots.pm_root);warnings.push(...authorManifest.warnings,...loadResult.warnings);warnings.push(...classifyDoctorLoadFailureWarnings(loadResult.failed));warnings.push(...activationResult.warnings);warnings.push(...classifyDoctorActivationFailureWarnings(activationResult.failed));warnings.push(...classifyUnusedCapabilityWarnings(loadResult,activationResult));warnings.push(...collectGlobalOutputOverrideDoctorWarnings(activationResult,loadResult));warnings.push(...collectSchemaNarrowActivationDoctorWarnings(loadResult,activationResult));warnings.push(...collectMcpCustomFieldCollisionDoctorWarnings(activationResult));const runtimeInstalledExtensions=applyDoctorRuntimeActivationState(refreshedInstalled.extensions,loadResult,activationResult);const doctorConsistency=buildDoctorConsistencySummary(scope,runtimeInstalledExtensions,loadResult.loaded.map(entry=>({layer:entry.layer,name:entry.name})),loadResult.failed.map(entry=>({name:entry.name})),loadResult.disabled_by_flag);warnings.push(...doctorConsistency.warnings);const updateCheckWarnings=runtimeInstalledExtensions.filter(entry=>entry.update_check_status==="failed").map(entry=>`extension_update_check_failed:${entry.name}`);warnings.push(...updateCheckWarnings);const triage=buildExtensionTriageSummary(scope,warnings,runtimeInstalledExtensions,options);warnings.push(...triage.warnings);const normalizedWarnings=[...triage.warnings];const policySummary={mode:loadResult.policy.mode,trust_mode:loadResult.policy.trust_mode,require_provenance:loadResult.policy.require_provenance,default_sandbox_profile:loadResult.policy.default_sandbox_profile,sandbox_enforcement:"advisory: sandbox_profile/permissions are declaration-based load gates, not runtime isolation (ADR pm-6ef3)",trusted_extensions_count:loadResult.policy.trusted_extensions.length,allowed_extensions_count:loadResult.policy.allowed_extensions.length,blocked_extensions_count:loadResult.policy.blocked_extensions.length,allowed_capabilities_count:loadResult.policy.allowed_capabilities.length,blocked_capabilities_count:loadResult.policy.blocked_capabilities.length,allowed_surfaces_count:loadResult.policy.allowed_surfaces.length,blocked_surfaces_count:loadResult.policy.blocked_surfaces.length,allowed_commands_count:loadResult.policy.allowed_commands.length,blocked_commands_count:loadResult.policy.blocked_commands.length,allowed_actions_count:loadResult.policy.allowed_actions.length,blocked_actions_count:loadResult.policy.blocked_actions.length,allowed_services_count:loadResult.policy.allowed_services.length,blocked_services_count:loadResult.policy.blocked_services.length,extension_override_count:loadResult.policy.extension_overrides.length};const capabilityGuidance=collectUnknownCapabilityGuidance(normalizedWarnings);const capabilityContract=buildCapabilityContractMetadata();const warningCodes=triage.warning_codes;const isolationHint=buildDoctorIsolationHint(scope,isolated,options.vocabulary,loadResult);const remediation=buildDoctorRemediation(triage.remediation,loadResult.failed.length,activationResult.failed.length,options.vocabulary,managedStateFix,isolationHint);const isolation=buildDoctorIsolationMetadata(scope,isolated,options.vocabulary,loadResult);const summary={status:triage.status,scope,warning_count:triage.warning_count,warning_codes:warningCodes,total_extensions:runtimeInstalledExtensions.length,managed_total:runtimeInstalledExtensions.filter(entry=>entry.managed).length,enabled_total:runtimeInstalledExtensions.filter(entry=>entry.enabled).length,active_total:runtimeInstalledExtensions.filter(entry=>entry.active).length,unmanaged_loaded_extension_count:triage.unmanaged_loaded_extension_count,unmanaged_action_required_extension_count:triage.unmanaged_action_required_extension_count,unmanaged_expected_extension_count:triage.unmanaged_expected_extension_count,runtime_active_total:runtimeInstalledExtensions.filter(entry=>entry.runtime_active===true).length,activation_status_totals:{ok:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="ok").length,failed:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="failed").length,not_loaded:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="not_loaded").length,unknown:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="unknown").length},unknown_capability_count:capabilityGuidance.length,capability_contract_version:capabilityContract.version,update_available_total:triage.update_available_total,update_check_status_totals:triage.update_check_status_totals,update_health_coverage:triage.update_health_coverage,update_health_partial:triage.update_health_partial,update_check_failed_total:runtimeInstalledExtensions.filter(entry=>entry.update_check_status==="failed").length,load_failure_count:loadResult.failed.length,activation_failure_count:activationResult.failed.length,load_failures:summarizeExtensionFailures(loadResult.failed),activation_failures:summarizeExtensionFailures(activationResult.failed),blocking_failure_count:loadResult.failed.length+activationResult.failed.length,has_blocking_failures:loadResult.failed.length+activationResult.failed.length>0,consistency_warning_count:doctorConsistency.warnings.length,trace_enabled:includeTrace,isolation,policy:policySummary,remediation};const managedStateFixSummary=managedStateFix?{requested:true,applied:managedStateFix.adopted_entries.length>0,adopted_count:managedStateFix.adopted_entries.length,already_managed_count:managedStateFix.already_managed_count,adopted_extensions:managedStateFix.adopted_entries.map(entry=>entry.name)}:{requested:false,applied:false,adopted_count:0,already_managed_count:refreshedInstalled.extensions.filter(entry=>entry.managed).length,adopted_extensions:[]};const details={mode:detailMode,summary,triage,trace_enabled:includeTrace,capability_contract:capabilityContract,capability_guidance:capabilityGuidance,managed_state_fix:managedStateFixSummary,author_manifest:authorManifest,isolation,policy:loadResult.policy};if(detailMode==="deep"){const activationFailedDetails=includeTrace?activationResult.failed:activationResult.failed.map(entry=>{const{trace:_trace,...rest}=entry;return rest});details.deep={warnings:normalizedWarnings,warning_codes:warningCodes,capability_contract:capabilityContract,capability_guidance:capabilityGuidance,trace_enabled:includeTrace,managed_state:{path:managedStateRead.path,count:managedState.entries.length,entries:managedState.entries},installed_extensions:runtimeInstalledExtensions,load:{roots:loadResult.roots,policy:loadResult.policy,warnings:loadResult.warnings,failed:loadResult.failed,loaded:loadResult.loaded.map(entry=>({layer:entry.layer,directory:entry.directory,name:entry.name,version:entry.version,entry:entry.entry,priority:entry.priority}))},activation:{failed:activationFailedDetails,warnings:activationResult.warnings,hook_counts:activationResult.hook_counts,registration_counts:activationResult.registration_counts,parser_override_count:activationResult.parser_override_count,preflight_override_count:activationResult.preflight_override_count,service_override_count:activationResult.service_override_count,renderer_override_count:activationResult.renderer_override_count},consistency:doctorConsistency.summary};if(includeTrace){details.deep.trace={activation_failures:activationResult.failed.filter(entry=>entry.trace!==void 0).map(entry=>({layer:entry.layer,name:entry.name,entry_path:entry.entry_path,error:entry.error,method:entry.trace.method,command:entry.trace.command,capability:entry.trace.capability,missing_capability:entry.trace.missing_capability,registration_index:entry.trace.registration_index,expected_schema:entry.trace.expected_schema,hint:entry.trace.hint,received:entry.trace.received}))}}}return withResult(details)};const runExtensionDescribeAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,global:global2,withResult}=ctx;const settings=await readSettings(resolvedRoots.settings_root);const loadResult=await loadExtensions({pmRoot:resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===true});const activationResult=await activateExtensions(loadResult);warnings.push(...loadResult.warnings);warnings.push(...activationResult.warnings);const describeResult=buildExtensionDescribeResult(normalizedTarget,loadResult,activationResult);if(normalizedTarget!==void 0&&describeResult.extensions.length===0){const noun=options.vocabulary==="package"?"package":"extension";const loadedNames=[...new Set(loadResult.loaded.map(entry=>options.vocabulary==="package"&&typeof entry.source_package==="string"&&entry.source_package.trim().length>0?entry.source_package.trim():entry.name))].sort((left,right)=>left.localeCompare(right));const loadedHint=loadedNames.length>0?` Loaded ${noun} names: ${loadedNames.join(", ")}.`:"";throw new PmCliError(`No loaded ${noun} named "${normalizedTarget}" was found in ${scope} scope.${loadedHint} Run pm ${noun} explore to list discovered ${noun}s.`,EXIT_CODE.NOT_FOUND)}return withResult({target:describeResult.target,total:describeResult.total,extensions:describeResult.extensions,union:describeResult.union,command_ownership:describeResult.command_ownership})};const prepareExploreManageState=async(ctx,installed,initialState)=>{let state=initialState;let fix=null;if([ctx.action==="manage",ctx.options.fixManagedState===true].every(Boolean)){fix=await adoptUnmanagedExtensions(ctx.resolvedRoots.selected_root,ctx.scope,installed,initialState);state=fix.state}if(ctx.action==="manage"){const entries=await mapWithFixedConcurrency(state.entries,GITHUB_UPDATE_CHECK_CONCURRENCY,async entry=>{if(entry.source.kind!=="github")return entry;const updateStatus=await checkGithubUpdate(entry.source);return{...entry,last_update_check_at:updateStatus.checked_at,last_update_remote_commit:updateStatus.remote_commit,update_available:updateStatus.available,update_error:updateStatus.error}});state={...state,updated_at:nowIso(),entries:sortManagedEntries(entries)};await writeManagedExtensionState(ctx.resolvedRoots.selected_root,state)}return{state,fix}};const probeExploreManageRuntime=async(ctx,settings,installed)=>{const loadResult=await loadExtensions({pmRoot:ctx.resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:ctx.global.noExtensions===true});const activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded});ctx.warnings.push(...loadResult.warnings,...activationResult.warnings);return{installed:applyDoctorRuntimeActivationState(installed,loadResult,activationResult),failures:collectActivationFailureDiagnostics(activationResult.failed),summary:{requested:true,executed:true,reason:ctx.action==="explore"?"explore_defaults_to_runtime_probe":ctx.options.runtimeProbe===true?"runtime_probe_requested":"manage_defaults_to_runtime_probe",load_failure_count:loadResult.failed.length,activation_failure_count:activationResult.failed.length,warning_count:[...new Set([...loadResult.warnings,...activationResult.warnings])].length,policy:loadResult.policy}}};const projectExploreManageFix=(fix,installed)=>fix?{requested:true,applied:fix.adopted_entries.length>0,adopted_count:fix.adopted_entries.length,adopted_extensions:fix.adopted_entries.map(entry=>entry.name),already_managed_count:fix.already_managed_count}:{requested:false,applied:false,adopted_count:0,adopted_extensions:[],already_managed_count:installed.filter(entry=>entry.managed).length};const runExtensionExploreManageAction=async ctx=>{const{action,scope,resolvedRoots,warnings,options,withResult}=ctx;const settings=await readSettings(resolvedRoots.settings_root);const configuredPolicy=buildExtensionPolicyDetails(settings.extensions.policy);const managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const{state:managedState,fix:managedStateFix}=await prepareExploreManageState(ctx,installed.extensions,managedStateRead.state);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);warnings.push(...refreshedInstalled.warnings);if(action==="manage"){const updateWarnings=refreshedInstalled.extensions.filter(entry=>entry.update_check_status==="failed").map(entry=>`extension_update_check_failed:${entry.name}`);warnings.push(...updateWarnings)}const runtimeProbe=await probeExploreManageRuntime(ctx,settings,refreshedInstalled.extensions);const runtimeInstalledExtensions=runtimeProbe.installed;const triage=buildExtensionTriageSummary(scope,warnings,runtimeInstalledExtensions,options);warnings.push(...triage.warnings);const details={total:runtimeInstalledExtensions.length,managed_total:runtimeInstalledExtensions.filter(entry=>entry.managed).length,enabled_total:runtimeInstalledExtensions.filter(entry=>entry.enabled).length,active_total:runtimeInstalledExtensions.filter(entry=>entry.active).length,extensions:runtimeInstalledExtensions,triage,policy:configuredPolicy};if(runtimeProbe.failures!==void 0){details.activation_diagnostics={failed_count:runtimeProbe.failures.length,failed:runtimeProbe.failures}}if(action==="explore"){details.runtime_probe=runtimeProbe.summary}if(action==="manage"){details.runtime_probe=runtimeProbe.summary;details.managed_state_fix=projectExploreManageFix(managedStateFix,runtimeInstalledExtensions)}return withResult(details)};const EXTENSION_ACTION_HANDLERS={init:runExtensionInitAction,install:runExtensionInstallAction,uninstall:runExtensionUninstallAction,explore:runExtensionExploreManageAction,manage:runExtensionExploreManageAction,describe:runExtensionDescribeAction,reload:runExtensionReloadAction,doctor:runExtensionDoctorAction,catalog:runExtensionCatalogAction,adopt:runExtensionAdoptAction,"adopt-all":runExtensionAdoptAllAction,activate:runExtensionActivateDeactivateAction,deactivate:runExtensionActivateDeactivateAction,migrate:runExtensionMigrateAction};const requiresExtensionStateLock=ctx=>[ctx.action==="uninstall",ctx.action==="manage",ctx.action==="adopt",ctx.action==="adopt-all",ctx.action==="activate",ctx.action==="deactivate",ctx.action==="migrate",[ctx.action==="doctor",ctx.options.fixManagedState===true].every(Boolean)].some(Boolean);const dispatchExtensionAction=ctx=>requiresExtensionStateLock(ctx)?withExtensionInstallLock(ctx.resolvedRoots.settings_root,`${ctx.action}-state`,()=>EXTENSION_ACTION_HANDLERS[ctx.action](ctx)):EXTENSION_ACTION_HANDLERS[ctx.action](ctx);const _testOnly={adoptUnmanagedExtensions,buildAdoptedExtensionSource,buildExtensionPolicyDetails,buildInstallCommandDiscovery,checkGithubUpdate,clearExtensionState,collectActivationFailureDiagnostics,findActivationFailureByName,resolveInstallRuntimeActivationStatus,collectGlobalOutputOverrideDoctorWarnings,collectMcpCustomFieldCollisionDoctorWarnings,collectSchemaNarrowActivationDoctorWarnings,copyExtensionDirectoryWithoutSelfNesting,isErrnoCode,isRetriableExtensionInstallCopyError,listInstalledExtensions,mapWithFixedConcurrency,projectExtensionUpdateCheck,readOptionalMetadataFile,requireTarget,resolveAction,resolveCommandDiscoveryPackageName,resolveGithubOption,resolveInstalledExtensionCandidate,resolveManagedInstallTimestamps,resolveScope,resolveUpdateCheckResolution,withExtensionInstallLock};export{_testOnly,copyExtensionDirectoryForInstall,parseExtensionInstallSource,parseExtensionManifest,readManagedExtensionState,resolveCanonicalExtensionInstallDestination,resolveManagedExtensionStatePath,runExtension,validateExtensionDirectory,writeManagedExtensionState};
|
|
1
|
+
(function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="549164da-d760-52bc-9950-25dacf286775")}catch{}})();import fs from"node:fs/promises";import path from"node:path";import{activateExtensions,createSerialQueue,loadExtensions,nextExtensionReloadToken}from"../core/extensions/index.js";import{describeExtensionActivation}from"../core/extensions/activation-summary.js";import{createExtensionContributionInventory}from"../core/extensions/contribution-inventory.js";import{resolveExtensionRoots}from"../core/extensions/loader.js";import{pathExists}from"../core/fs/fs-utils.js";import{resolvePmPackageRootFromModule}from"../core/packages/root.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{levenshteinDistanceWithinLimit}from"../core/shared/levenshtein.js";import{nowIso}from"../core/shared/time.js";import{resolveGlobalPmRoot,resolvePmRoot}from"../core/store/paths.js";import{readSettings,writeSettings}from"../core/store/settings.js";import{quoteCommandArg,renderPmCommand}from"./command-line.js";import{createUnknownSubcommandError}from"./agent/subcommand-recovery.js";import{ensureTypeFolderScaffold}from"./schema.js";import{normalizeStringList,normalizeExtensionNameForMatch,normalizeManagedDirectoryName,parseExtensionManifest,validateExtensionDirectory}from"./extension/shared.js";import{managedExtensionSourcesEquivalent,readManagedExtensionState,writeManagedExtensionState,upsertManagedEntry,persistManagedContributionInventory,resolveManagedExtensionStatePath}from"./extension/managed-state.js";import{parseExtensionInstallSource,resolveInstallSource,areDirectoriesEquivalent}from"./extension/install-sources.js";import{resolveBundledExtensionAliasSource,isBundledPackageInstallAllTarget,listBundledPackageAliases,resolveBundledAliasManifestName,buildBundledPackageCatalog}from"./extension/bundled-catalog.js";import{scaffoldExtensionProject}from"./extension/scaffold.js";import{buildExtensionDescribeResult}from"./extension/describe.js";import{applyDoctorRuntimeActivationState,classifyDoctorLoadFailureWarnings,classifyDoctorActivationFailureWarnings,classifyUnusedCapabilityWarnings,buildExtensionTriageSummary,parseDoctorDetailMode,collectUnknownCapabilityGuidance,buildCapabilityContractMetadata,buildDoctorConsistencySummary,summarizeExtensionFailures}from"./extension/doctor.js";import{copyExtensionDirectoryForInstall,copyExtensionDirectoryWithoutSelfNesting,ensureExtensionModuleTypeMarker,ensureInstalledExtensionSdkLink,isErrnoCode,isRetriableExtensionInstallCopyError,resolveCanonicalExtensionInstallDestination,withExtensionInstallLock}from"./extension/install-runtime.js";import{mapWithFixedConcurrency}from"./extension/concurrency.js";import{summarizeRuntimeCommandPathsForExtension}from"./extension/runtime-summary.js";import{collectGlobalOutputOverrideDoctorWarnings}from"./extension/output-ownership.js";import{collectMcpCustomFieldCollisionDoctorWarnings}from"./extension/custom-field-collisions.js";import{checkGithubUpdate}from"./extension/update-check.js";import{refreshManagedExtensionUpdates}from"./extension/managed-update-status.js";import{runExtensionMigrateAction}from"./extension/migrations.js";import{buildBundledInstallReceipt}from"./extension/install-receipts.js";import{buildExtensionInstallPlan}from"./extension/install-plan.js";import{inspectExtensionAuthorManifestAtPmRoot}from"./extension/author-manifest.js";import{resolveExtensionInstallSourceIdentity}from"./extension/source-resolution.js";import{captureExtensionInstallSnapshot,readOptionalMetadataFile,restoreExtensionInstallSnapshot}from"./extension/install-snapshot.js";const LIFECYCLE_ACTION_TARGETS=[["install","install","--install"],["uninstall","uninstall","--uninstall"],["explore","explore","--explore"],["list","explore","--explore"],["manage","manage","--manage"],["describe","describe","--describe"],["reload","reload","--reload"],["doctor","doctor","--doctor"],["catalog","catalog","--catalog"],["init","init","--init"],["scaffold","init","--scaffold"],["adopt","adopt","--adopt"],["adopt-all","adopt-all","--adopt-all"],["activate","activate","--activate"],["deactivate","deactivate","--deactivate"],["migrate","migrate","--migrate"]],LIFECYCLE_ACTION_FLAG_HINT=LIFECYCLE_ACTION_TARGETS.map(([,,flag])=>flag).filter((flag,index,flags)=>flags.indexOf(flag)===index).join(", "),LIFECYCLE_ACTION_FLAGS={install:"--install",uninstall:"--uninstall",explore:"--explore",manage:"--manage",describe:"--describe",reload:"--reload",doctor:"--doctor",catalog:"--catalog",adopt:"--adopt","adopt-all":"--adopt-all",activate:"--activate",deactivate:"--deactivate",migrate:"--migrate",init:"--init"},NATIVE_OUTPUT_MARKER="__pm_native_output",EXTENSION_POLICY_ROOT_LIST_FIELDS=["trusted_extensions","allowed_extensions","blocked_extensions","allowed_capabilities","blocked_capabilities","allowed_surfaces","blocked_surfaces","allowed_commands","blocked_commands","allowed_actions","blocked_actions","allowed_services","blocked_services"],EXTENSION_POLICY_OVERRIDE_LIST_FIELDS=["allowed_capabilities","blocked_capabilities","allowed_surfaces","blocked_surfaces","allowed_commands","blocked_commands","allowed_actions","blocked_actions","allowed_services","blocked_services"],EXTENSION_POLICY_OVERRIDE_BOOLEAN_FIELDS=["disabled","require_trusted","require_provenance"],DEFAULT_EXTENSION_POLICY_DETAILS={mode:"off",trust_mode:"off",require_provenance:!1,trusted_extensions:[],default_sandbox_profile:"none",allowed_extensions:[],blocked_extensions:[],allowed_capabilities:[],blocked_capabilities:[],allowed_surfaces:[],blocked_surfaces:[],allowed_commands:[],blocked_commands:[],allowed_actions:[],blocked_actions:[],allowed_services:[],blocked_services:[],extension_overrides:[]},normalizePolicyRootLists=policy=>{const safePolicy=policy??DEFAULT_EXTENSION_POLICY_DETAILS,lists={};for(const field of EXTENSION_POLICY_ROOT_LIST_FIELDS)lists[field]=normalizeStringList(safePolicy[field]??[]);return lists},appendNonEmptyPolicyLists=(target,lists)=>{for(const field of EXTENSION_POLICY_OVERRIDE_LIST_FIELDS)lists[field].length>0&&(target[field]=lists[field]);return target},appendEnabledPolicyScalars=(target,override)=>{for(const field of EXTENSION_POLICY_OVERRIDE_BOOLEAN_FIELDS)override[field]===!0&&(target[field]=!0);return override.sandbox_profile&&(target.sandbox_profile=override.sandbox_profile),target},normalizePolicyOverrideLists=override=>{const lists={};for(const field of EXTENSION_POLICY_OVERRIDE_LIST_FIELDS)lists[field]=normalizeStringList(override[field]??[]);return lists},buildExtensionPolicyOverrideDetails=override=>{const name=typeof override.name=="string"?override.name.trim():"";return name.length===0?null:appendNonEmptyPolicyLists(appendEnabledPolicyScalars({name},override),normalizePolicyOverrideLists(override))},normalizeExtensionPolicyOverrides=overrides=>(overrides??[]).map(override=>buildExtensionPolicyOverrideDetails(override)).filter(override=>override!==null).sort((left,right)=>left.name.localeCompare(right.name)),buildExtensionPolicyDetails=policy=>{const safePolicy=Object.assign({},DEFAULT_EXTENSION_POLICY_DETAILS,policy??{}),rootLists=normalizePolicyRootLists(policy),overrides=normalizeExtensionPolicyOverrides(safePolicy.extension_overrides);return{mode:safePolicy.mode,trust_mode:safePolicy.trust_mode,require_provenance:safePolicy.require_provenance===!0,trusted_extensions:rootLists.trusted_extensions,default_sandbox_profile:safePolicy.default_sandbox_profile,allowed_extensions:rootLists.allowed_extensions,blocked_extensions:rootLists.blocked_extensions,allowed_capabilities:rootLists.allowed_capabilities,blocked_capabilities:rootLists.blocked_capabilities,allowed_surfaces:rootLists.allowed_surfaces,blocked_surfaces:rootLists.blocked_surfaces,allowed_commands:rootLists.allowed_commands,blocked_commands:rootLists.blocked_commands,allowed_actions:rootLists.allowed_actions,blocked_actions:rootLists.blocked_actions,allowed_services:rootLists.allowed_services,blocked_services:rootLists.blocked_services,extension_overrides:overrides}},resolveInstalledExtensionCandidate=async(installed,extensionTarget)=>{const lookupValues=[extensionTarget],bundledAliasManifestName=await resolveBundledAliasManifestName(extensionTarget);bundledAliasManifestName&&lookupValues.push(bundledAliasManifestName);const normalizedLookups=[...new Set(lookupValues.map(value=>normalizeExtensionNameForMatch(value)).filter(value=>value.length>0))];for(const lookup of normalizedLookups){const byName=installed.find(entry=>normalizeExtensionNameForMatch(entry.name)===lookup);if(byName)return byName;const byDirectory=installed.find(entry=>normalizeExtensionNameForMatch(entry.directory)===lookup);if(byDirectory)return byDirectory}},isExtensionEnabled=(settings,name)=>{const normalizedName=name.trim(),enabled=new Set(normalizeStringList(settings.extensions.enabled));return new Set(normalizeStringList(settings.extensions.disabled)).has(normalizedName)?!1:enabled.size===0?!0:enabled.has(normalizedName)},ensureActivated=(settings,name)=>{const normalizedName=name.trim(),enabled=new Set(normalizeStringList(settings.extensions.enabled)),disabled=new Set(normalizeStringList(settings.extensions.disabled)),previousEnabled=[...enabled],previousDisabled=[...disabled];return disabled.delete(normalizedName),enabled.size>0&&enabled.add(normalizedName),settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")},ensureDeactivated=(settings,name)=>{const normalizedName=name.trim(),enabled=new Set(normalizeStringList(settings.extensions.enabled)),disabled=new Set(normalizeStringList(settings.extensions.disabled)),previousEnabled=[...enabled],previousDisabled=[...disabled];return enabled.delete(normalizedName),disabled.add(normalizedName),settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")},clearExtensionState=(settings,name)=>{const normalizedName=name.trim(),enabled=new Set(normalizeStringList(settings.extensions.enabled)),disabled=new Set(normalizeStringList(settings.extensions.disabled)),previousEnabled=[...enabled],previousDisabled=[...disabled];return enabled.delete(normalizedName),disabled.delete(normalizedName),settings.extensions.enabled=[...enabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.disabled=[...disabled].sort((left,right)=>left.localeCompare(right)),settings.extensions.enabled.join("\0")!==previousEnabled.join("\0")||settings.extensions.disabled.join("\0")!==previousDisabled.join("\0")},suggestLifecycleActionTarget=target=>{const normalizedTarget=target.trim().toLowerCase(),maxDistance=Math.min(2,Math.max(1,Math.ceil(normalizedTarget.length/4))),nearest=LIFECYCLE_ACTION_TARGETS.map(([candidate,action,flag])=>({action,flag,distance:levenshteinDistanceWithinLimit(normalizedTarget,candidate,maxDistance)})).filter(entry=>entry.distance!==null).sort((left,right)=>left.distance-right.distance)[0];return nearest?{action:nearest.action,flag:nearest.flag}:null},buildUnknownLifecycleActionError=(target,options)=>{const noun=options.vocabulary==="package"?"package":"extension",suggestion=suggestLifecycleActionTarget(target);if(!suggestion)return new PmCliError(`One action flag is required. Use one of: ${LIFECYCLE_ACTION_FLAG_HINT}. Bare \`pm package\` and \`pm extension\` default to --explore.`,EXIT_CODE.USAGE);const command=`pm ${noun} ${suggestion.flag}`;return createUnknownSubcommandError({command_path:noun,display_name:`${noun} lifecycle`,token_kind:"action",token:target,allowed:Object.keys(IMPLICIT_EXTENSION_ACTIONS),retry_command:command,message_suffix:`. Did you mean "${suggestion.flag}"?`,fallback_candidates:[{source:"lifecycle_action",command,reason:`nearest lifecycle action for "${target}"`}]})},EXTENSION_ACTION_FLAG_SELECTORS=[["install","install"],["uninstall","uninstall"],["explore","explore"],["manage","manage"],["describe","describe"],["reload","reload"],["doctor","doctor"],["catalog","catalog"],["init","init"],["scaffold","init"],["adopt","adopt"],["adoptAll","adopt-all"],["activate","activate"],["deactivate","deactivate"],["migrate","migrate"]],IMPLICIT_EXTENSION_ACTIONS={doctor:"doctor",reload:"reload",catalog:"catalog",init:"init",scaffold:"init",explore:"explore",manage:"manage",migrate:"migrate",list:"explore","":"explore"},resolveImplicitActionFromTarget=normalizedTarget=>IMPLICIT_EXTENSION_ACTIONS[normalizedTarget]??null,resolveAction=(target,options)=>{const selected=[...new Set(EXTENSION_ACTION_FLAG_SELECTORS.filter(([flag])=>options[flag]===!0).map(([,mappedAction])=>mappedAction))];if(selected.length===0){if(target===void 0)return"explore";const implicitAction=resolveImplicitActionFromTarget(target.trim().toLowerCase());if(implicitAction)return implicitAction;throw buildUnknownLifecycleActionError(target,options)}if(selected.length>1)throw new PmCliError("Extension action flags are mutually exclusive.",EXIT_CODE.USAGE);return selected[0]},resolveScope=options=>{const projectLike=options.project===!0||options.local===!0,global2=options.global===!0;if(projectLike&&global2)throw new PmCliError('Options "--project/--local" and "--global" are mutually exclusive.',EXIT_CODE.USAGE);return global2?"global":"project"},EXTENSION_UPDATE_CHECK_RESOLVERS=[managedEntry=>managedEntry?null:{status:"skipped_unmanaged",reason:"extension_not_managed"},managedEntry=>managedEntry&&!["github","npm"].includes(managedEntry.source.kind)?{status:"skipped_non_github",reason:`managed_source_kind_${managedEntry.source.kind}`}:null,managedEntry=>{const updateError=typeof managedEntry?.update_error=="string"?managedEntry.update_error.trim():"";return updateError.length>0?{status:"failed",reason:updateError}:null},managedEntry=>{const entry=managedEntry;return(typeof entry.last_update_check_at=="string"?entry.last_update_check_at.trim():"").length===0?null:{status:"checked",reason:{true:"update_available",false:"up_to_date"}[String(entry.update_available)]??"checked_without_commit_baseline"}}],resolveUpdateCheckResolution=managedEntry=>{for(const resolve of EXTENSION_UPDATE_CHECK_RESOLVERS){const resolution=resolve(managedEntry);if(resolution)return resolution}return{status:"not_checked",reason:"no_update_check_recorded"}},buildInstalledExtensionSummary=(identity,scope,managedEntry,updateCheck)=>{const managed=managedEntry??{};return{name:identity.name,directory:identity.directory,version:identity.version,entry:identity.entry,scope,active:identity.enabled,enabled:identity.enabled,runtime_active:null,activation_status:"unknown",contributions:managed.contributions,managed:!!managedEntry,source:managed.source,update_available:managed.update_available,last_update_check_at:managed.last_update_check_at,last_update_remote_commit:managed.last_update_remote_commit,last_update_remote_version:managed.last_update_remote_version,update_error:managed.update_error,update_check_status:updateCheck.status,update_check_reason:updateCheck.reason}},buildMissingManifestInspection=(directoryName,scope,settings,managedEntry)=>{const managed=Object.assign({name:directoryName,manifest_version:"unknown",manifest_entry:"unknown"},managedEntry),enabled=managedEntry?isExtensionEnabled(settings,managedEntry.name):!1;return{warning:`extension_manifest_missing:${scope}:${directoryName}`,summary:buildInstalledExtensionSummary({name:managed.name,directory:directoryName,version:managed.manifest_version,entry:managed.manifest_entry,enabled},scope,managedEntry,resolveUpdateCheckResolution(managedEntry))}},inspectInstalledExtensionDirectory=async(extensionsRoot,directoryName,scope,settings,managedByName,managedByDirectory)=>{const extensionDirectory=path.join(extensionsRoot,directoryName),manifestPath=path.join(extensionDirectory,"manifest.json"),managedDirectoryEntry=managedByDirectory.get(normalizeExtensionNameForMatch(directoryName));if(!await pathExists(manifestPath))return buildMissingManifestInspection(directoryName,scope,settings,managedDirectoryEntry);const invalidJson=Symbol("invalid-extension-manifest-json"),rawManifest=await fs.readFile(manifestPath,"utf8").then(contents=>JSON.parse(contents)).catch(()=>invalidJson);if(rawManifest===invalidJson)return{warning:`extension_manifest_invalid_json:${scope}:${directoryName}`};const manifest=parseExtensionManifest(rawManifest);if(!manifest)return{warning:`extension_manifest_invalid:${scope}:${directoryName}`};const managedEntry=managedByName.get(normalizeExtensionNameForMatch(manifest.name))??managedByDirectory.get(normalizeExtensionNameForMatch(directoryName));return{summary:buildInstalledExtensionSummary({name:manifest.name,directory:directoryName,version:manifest.version,entry:manifest.entry,enabled:isExtensionEnabled(settings,manifest.name)},scope,managedEntry,resolveUpdateCheckResolution(managedEntry))}},listInstalledExtensions=async(extensionsRoot,scope,settings,state)=>{if(!await pathExists(extensionsRoot))return{extensions:[],warnings:[]};const directories=(await fs.readdir(extensionsRoot,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),managedByName=new Map(state.entries.map(managedEntry=>[normalizeExtensionNameForMatch(managedEntry.name),managedEntry])),managedByDirectory=new Map(state.entries.map(managedEntry=>[normalizeExtensionNameForMatch(managedEntry.directory),managedEntry])),warnings=[],summaries=[];for(const directoryName of directories){const inspected=await inspectInstalledExtensionDirectory(extensionsRoot,directoryName,scope,settings,managedByName,managedByDirectory);inspected.warning&&warnings.push(inspected.warning),inspected.summary&&summaries.push(inspected.summary)}return{extensions:summaries.sort((left,right)=>left.name.localeCompare(right.name)),warnings:warnings.sort((left,right)=>left.localeCompare(right))}},extensionRuntimeProbeQueue=createSerialQueue(),resolveCommandDiscoveryPackageName=(extensionName,source)=>[source.package,source.kind==="builtin"?source.name:void 0].find(candidate=>candidate?.trim())?.trim()??extensionName,buildInstallCommandDiscovery=(extensionName,source,commandSummary,activationFailure)=>{const helpCommands=commandSummary.command_paths.map(commandPath=>`pm ${commandPath} --help`),sdkDependencyMissing=activationFailure?.error.toLowerCase().includes("@unbrained/pm-cli")===!0,nextSteps=commandSummary.command_paths.length>0?[...helpCommands]:["Run pm package doctor --project --detail deep if expected package commands are missing."];return sdkDependencyMissing&&nextSteps.unshift("Install @unbrained/pm-cli in the target workspace so declarative package runtime imports resolve, then reinstall the package."),{package_name:resolveCommandDiscoveryPackageName(extensionName,source),extension_name:extensionName,command_paths:commandSummary.command_paths,action_paths:commandSummary.action_paths,help_commands:helpCommands,next_steps:nextSteps,...sdkDependencyMissing?{sdk_dependency_status:"missing"}:{}}},summarizeActivationFailureForDiagnostics=failure=>{const trace=failure.trace,summary={layer:failure.layer,name:failure.name,entry_path:failure.entry_path,error:failure.error};return trace&&(summary.trace=Object.fromEntries(Object.entries(trace).filter(([,value])=>value!==void 0)),trace.missing_capability&&(summary.missing_capability=trace.missing_capability),trace.hint&&(summary.hint=trace.hint)),summary},collectActivationFailureDiagnostics=failures=>failures.map(failure=>summarizeActivationFailureForDiagnostics(failure)).sort((left,right)=>`${left.layer}:${left.name}`.localeCompare(`${right.layer}:${right.name}`)),findActivationFailureByName=(extensionName,failures,layer)=>{const normalizedName=normalizeExtensionNameForMatch(extensionName);return failures.find(failure=>(layer===void 0||failure.layer===layer)&&normalizeExtensionNameForMatch(failure.name)===normalizedName)},resolveInstallRuntimeActivationStatus=(extensionName,scope,runtimeInstalled,installActivationFailure)=>runtimeInstalled.find(entry=>entry.scope===scope&&normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(extensionName))?.activation_status??(installActivationFailure?"failed":"unknown"),probeRuntimeCommandPathsForInstall=(pmRoot,parent,settings,refreshedInstalled,global2)=>extensionRuntimeProbeQueue.enqueue(async()=>{const originalPackageRoot=process.env.PM_CLI_PACKAGE_ROOT,snapshotRoot=await fs.mkdtemp(path.join(parent,".pm-module-graph-"));process.env.PM_CLI_PACKAGE_ROOT=resolvePmPackageRootFromModule(import.meta.url,["../.."]);try{const loadResult=await loadExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===!0,reload_token:nextExtensionReloadToken(),cache_bust:!0,module_graph_snapshot_root:snapshotRoot}),activationResult=await activateExtensions({...loadResult}),runtimeFailures=[...loadResult.failed.map(failure=>({layer:failure.layer,name:failure.name,entry_path:failure.entry_path,error:failure.error})),...collectActivationFailureDiagnostics(activationResult.failed)],contributionInventories=Object.fromEntries(loadResult.loaded.map(extension=>[normalizeExtensionNameForMatch(extension.name),createExtensionContributionInventory(describeExtensionActivation(activationResult,{extensionName:extension.name}))]));return{installed:applyDoctorRuntimeActivationState(refreshedInstalled,loadResult,activationResult),warnings:[...loadResult.warnings,...activationResult.warnings],activation_failures:runtimeFailures,extensions_disabled:loadResult.disabled_by_flag,item_type_registrations:activationResult.registrations.item_types,contribution_inventories:contributionInventories}}finally{await fs.rm(snapshotRoot,{recursive:!0,force:!0}),originalPackageRoot===void 0?delete process.env.PM_CLI_PACKAGE_ROOT:process.env.PM_CLI_PACKAGE_ROOT=originalPackageRoot}}),adoptUnmanagedExtensions=async(extensionsRoot,scope,installedExtensions,state)=>{const unmanagedCandidates=installedExtensions.filter(entry=>!entry.managed),sortedCandidates=[...unmanagedCandidates].sort((left,right)=>{const byName=left.name.localeCompare(right.name);return byName!==0?byName:left.directory.localeCompare(right.directory)});let nextState=state;const adoptedEntries=[];for(const candidate of sortedCandidates){const extensionDirectory=path.join(extensionsRoot,candidate.directory),validated=await validateExtensionDirectory(extensionDirectory),now=nowIso(),sourceRecord={kind:"local",input:candidate.name,location:extensionDirectory};nextState=upsertManagedEntry(nextState,{name:validated.manifest.name,directory:candidate.directory,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,installed_at:now,updated_at:now,source:sourceRecord}),adoptedEntries.push({name:validated.manifest.name,directory:candidate.directory,version:validated.manifest.version,entry:validated.manifest.entry,source:sourceRecord})}return adoptedEntries.length>0&&await writeManagedExtensionState(extensionsRoot,nextState),{state:nextState,adopted_entries:adoptedEntries,unmanaged_candidates:sortedCandidates,already_managed_count:installedExtensions.length-unmanagedCandidates.length}},resolveExtensionRootsForScope=(scope,global2)=>{const pmRoot=resolvePmRoot(process.cwd(),global2.path),roots=resolveExtensionRoots(pmRoot,process.cwd()),settingsRoot=scope==="global"?resolveGlobalPmRoot(process.cwd()):pmRoot,selectedRoot=scope==="global"?roots.global:roots.project;return{pm_root:pmRoot,scope,settings_root:settingsRoot,selected_root:selectedRoot,roots}},resolveGithubOption=options=>{const values=[options.gh,options.github].filter(value=>typeof value=="string").map(value=>value.trim()).filter(Boolean),uniqueValues=[...new Set(values)];if(uniqueValues.length>1)throw new PmCliError('Options "--gh" and "--github" must match when both are provided.',EXIT_CODE.USAGE);return uniqueValues[0]},getLifecycleActionFlag=action=>LIFECYCLE_ACTION_FLAGS[action],throwMissingLifecycleTarget=(action,options)=>{const noun=options.vocabulary==="package"?"package":"extension",targetName=action==="install"?"source":"name",targetLabel=`${noun} ${targetName}`,actionFlag=getLifecycleActionFlag(action),commandTarget=`<${targetName}>`,command=`pm ${noun} ${actionFlag} ${commandTarget}`;throw new PmCliError(`Action "${action}" requires ${targetLabel} input.`,EXIT_CODE.USAGE,{code:"missing_lifecycle_target",required:`Provide a ${targetName} target for ${action}.`,examples:[`pm ${noun} ${action} ${commandTarget}`,command,`pm ${noun} --help`],recovery:{attempted_command:`pm ${noun} ${action}`,suggested_retry:command,fallback_candidates:[{source:"lifecycle_action",command,reason:`flag-form ${action} command with required ${targetName} target`}]}})},requireTarget=(target,action,options={})=>{const normalized=target?.trim();if(normalized)return normalized;if(action==="init")throw new PmCliError('Action "init" requires a scaffold target path (for example: pm package init ./my-package or pm extension init ./my-extension).',EXIT_CODE.USAGE);return throwMissingLifecycleTarget(action,options)},collectSchemaNarrowActivationDoctorWarnings=(loadResult,activationResult)=>{const schemaContributors=new Set([...activationResult.registrations.item_types.map(entry=>({entry,count:entry.types.length})),...activationResult.registrations.item_fields.map(entry=>({entry,count:entry.fields.length}))].filter(({count})=>count>0).map(({entry})=>`${entry.layer}:${normalizeExtensionNameForMatch(entry.name)}`));return loadResult.loaded.filter(extension=>(extension.activation?.commands??[]).length>0).filter(extension=>schemaContributors.has(`${extension.layer}:${normalizeExtensionNameForMatch(extension.name)}`)).map(extension=>`extension_schema_narrow_activation:${extension.layer}:${extension.name}`).filter((warning,index,warnings)=>warnings.indexOf(warning)===index).sort((left,right)=>left.localeCompare(right))},assertExtensionActionOptionScope=(action,options)=>{const invalidGuard=[{triggered:options.strictExit===!0||options.failOnWarn===!0,allowed:action==="doctor",message:"--strict-exit and --fail-on-warn are only valid with --doctor."},{triggered:options.trace===!0,allowed:action==="doctor",message:"--trace is only valid with --doctor."},{triggered:options.watch===!0,allowed:action==="reload",message:"--watch is only valid with --reload."},{triggered:options.runtimeProbe===!0,allowed:action==="manage",message:"--runtime-probe is only valid with --manage."},{triggered:options.fixManagedState===!0,allowed:action==="manage"||action==="doctor",message:"--fix-managed-state is only valid with --manage or --doctor."},{triggered:options.isolated===!0||options.ignoreGlobal===!0,allowed:action==="doctor",message:"--isolated and --ignore-global are only valid with --doctor."},{triggered:options.capability!==void 0,allowed:action==="init",message:"--capability is only valid with --init/--scaffold."},{triggered:options.declarative===!0,allowed:action==="init",message:"--declarative is only valid with --init/--scaffold."},{triggered:options.dryRun===!0,allowed:action==="migrate"||action==="install",message:"--dry-run is only valid with --migrate or --install."}].find(guard=>guard.triggered&&!guard.allowed);if(invalidGuard)throw new PmCliError(invalidGuard.message,EXIT_CODE.USAGE)},resolveNormalizedExtensionTarget=(target,action,options)=>{const normalizedInput=String(target??"").trim().toLowerCase(),explicitInitAction=[options.init,options.scaffold].includes(!0);return({doctor:["doctor"],reload:["reload"],catalog:["catalog"],init:explicitInitAction?[]:["init","scaffold"]}[action]??[]).includes(normalizedInput)?void 0:target},resolveExtensionResultRoots=ctx=>[ctx.action==="catalog",typeof ctx.options.fields=="string",String(ctx.options.fields).trim().length>0].every(Boolean)?{project:"project",global:"global",selected:ctx.scope,settings_root:"project"}:{project:ctx.resolvedRoots.roots.project,global:ctx.resolvedRoots.roots.global,selected:ctx.resolvedRoots.selected_root,settings_root:ctx.resolvedRoots.settings_root},buildExtensionActionResult=(ctx,details,ok)=>{const result={ok,action:ctx.action,scope:ctx.scope,roots:resolveExtensionResultRoots(ctx),warnings:[...new Set(ctx.warnings)].sort((left,right)=>left.localeCompare(right)),details};return ctx.action==="doctor"&&Object.defineProperty(result,NATIVE_OUTPUT_MARKER,{value:!0,enumerable:!1,configurable:!1}),result},runExtension=async(target,options,global2)=>{const action=resolveAction(target,options);assertExtensionActionOptionScope(action,options);const normalizedTarget=resolveNormalizedExtensionTarget(target,action,options),scope=resolveScope(options),resolvedRoots=resolveExtensionRootsForScope(scope,global2),actionContext={action,normalizedTarget,scope,resolvedRoots,warnings:[],options,global:global2},ctx={...actionContext,withResult:(details,ok=!0)=>buildExtensionActionResult(actionContext,details,ok)};return await dispatchExtensionAction(ctx)},buildExtensionScaffoldNextSteps=(scaffold,options)=>{const vocabulary=options.vocabulary??"extension",shellTargetPath=scaffold.target_path.replace(/\\/g,"/"),quotedShellTargetPath=quoteCommandArg(shellTargetPath),dependencySteps={package:`Install dependencies: cd ${quotedShellTargetPath}, then run "npm install"`,extension:`Install type-check dependencies: cd ${quotedShellTargetPath}, then run "npm install -D typescript @types/node @unbrained/pm-cli"`},validationSteps={package:`Validate the package: cd ${quotedShellTargetPath}, then run "npm run typecheck" and "npm test"`,extension:`Type-check the source (optional): cd ${quotedShellTargetPath}, then run "npx tsc --noEmit"`},declarativeGuidance=[];return[vocabulary==="package",options.declarative===!0].every(Boolean)&&declarativeGuidance.push("Ensure the target workspace can resolve @unbrained/pm-cli before installing this declarative package."),[dependencySteps[vocabulary],...declarativeGuidance,`Install the scaffold: ${renderPmCommand(vocabulary==="package"?["install","--project",shellTargetPath]:["extension","--install","--project",shellTargetPath])}`,`Smoke-test command path: pm ${scaffold.command_name}`,validationSteps[vocabulary],`Run diagnostics: ${vocabulary==="package"?"pm package doctor":"pm extension --doctor"} --project --detail summary`]},runExtensionInitAction=async ctx=>{const{action,normalizedTarget,options,withResult}=ctx;if([resolveGithubOption(options),options.ref].filter(value=>typeof value=="string").map(value=>value.trim()).filter(Boolean).length>0)throw new PmCliError('Action "init" does not accept --gh/--github/--ref options.',EXIT_CODE.USAGE);const scaffoldTarget=requireTarget(normalizedTarget,action,options),scaffold=await scaffoldExtensionProject(scaffoldTarget,options.vocabulary??"extension",options.capability,options.declarative===!0);return withResult({scaffolded:scaffold.created_directory||scaffold.files.some(entry=>entry.status==="created"),extension:{name:scaffold.extension_name,command:scaffold.command_name},capability:scaffold.capability,style:scaffold.style,target_path:scaffold.target_path,created_directory:scaffold.created_directory,files:scaffold.files,next_steps:buildExtensionScaffoldNextSteps(scaffold,options)})},runExtensionReloadAction=async ctx=>{const{normalizedTarget,resolvedRoots,warnings,options,global:global2,withResult}=ctx;if(normalizedTarget!==void 0)throw new PmCliError('Action "reload" does not accept a target argument.',EXIT_CODE.USAGE);const settings=await readSettings(resolvedRoots.settings_root),reloadToken=nextExtensionReloadToken(),reloaded=await loadExtensions({pmRoot:resolvedRoots.settings_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions,reload_token:reloadToken,cache_bust:!0});warnings.push(...reloaded.warnings);const activation=await activateExtensions(reloaded);warnings.push(...activation.warnings);const details={reload:{token:reloadToken,cache_bust:!0,watch:options.watch===!0},loaded_count:reloaded.loaded.length,failed_count:reloaded.failed.length,activated_count:Math.max(0,reloaded.loaded.length-activation.failed.length),activation_failed_count:activation.failed.length,loaded_extensions:reloaded.loaded.map(entry=>({name:entry.name,layer:entry.layer,version:entry.version})),failed_extensions:reloaded.failed.map(entry=>({name:entry.name,layer:entry.layer,error:entry.error})),activation_failures:activation.failed.map(entry=>({name:entry.name,layer:entry.layer,error:entry.error}))};return options.watch===!0&&warnings.push("extension_reload_watch_hint:watch_mode_requested_non_interactive_single_pass_only"),withResult(details)},runExtensionCatalogAction=async ctx=>{const{normalizedTarget,scope,options,global:global2,withResult}=ctx;if(typeof normalizedTarget=="string"&&normalizedTarget.length>0&&normalizedTarget!=="catalog")throw new PmCliError('Action "catalog" does not accept a package target.',EXIT_CODE.USAGE);return withResult(await buildBundledPackageCatalog(scope,global2,options))},buildBundledInstallManagedSource=(alias,packageName)=>({kind:"builtin",input:alias,location:alias,name:alias,...packageName===null?{}:{package:packageName}}),buildLocalInstallManagedSource=source=>({kind:"local",input:source.input,location:source.absolute_path}),buildNpmInstallManagedSource=(source,resolved)=>({kind:"npm",input:source.input,location:resolved.resolved_subpath??".",package:resolved.npm_package,version:resolved.npm_version}),buildGithubInstallManagedSource=(source,resolved)=>({kind:"github",input:source.input,location:resolved.resolved_subpath??source.subpath??".",repository:source.repository,owner:source.owner,repo:source.repo,ref:source.ref,subpath:resolved.resolved_subpath??source.subpath,commit:resolved.commit}),buildInstallManagedSource=(bundledAliasName,bundledPackageName,installSource,resolvedSource)=>bundledAliasName?buildBundledInstallManagedSource(bundledAliasName,bundledPackageName):installSource.kind==="local"?buildLocalInstallManagedSource(installSource):installSource.kind==="npm"?buildNpmInstallManagedSource(installSource,resolvedSource):buildGithubInstallManagedSource(installSource,resolvedSource),resolveManagedInstallTimestamps=(existing,manifestVersion,source,now)=>existing?existing.manifest_version!==manifestVersion?{installed_at:existing.installed_at,updated_at:now}:managedExtensionSourcesEquivalent(existing.source,source)?{installed_at:existing.installed_at,updated_at:existing.updated_at}:{installed_at:existing.installed_at,updated_at:now}:{installed_at:now,updated_at:now},persistExtensionInstall=async(ctx,input)=>{const{scope,resolvedRoots,warnings}=ctx,{validated,destinationDirectoryName}=input,settings=await readSettings(resolvedRoots.settings_root),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const destinationDirectory=path.join(resolvedRoots.selected_root,destinationDirectoryName),destinationExists=await pathExists(destinationDirectory),installInPlace=await areDirectoriesEquivalent(validated.directory,destinationDirectory);await fs.mkdir(resolvedRoots.selected_root,{recursive:!0});const backupRoot=await fs.mkdtemp(path.join(resolvedRoots.selected_root,".pm-extension-install-backup-")),backupDirectory=path.join(backupRoot,"destination");try{const snapshot=await captureExtensionInstallSnapshot(resolvedRoots.selected_root,resolvedRoots.settings_root,destinationDirectory,destinationExists,backupDirectory),sourceRecord=buildInstallManagedSource(input.bundledAliasName,input.bundledPackageName,input.installSource,input.resolvedSource),existingManagedEntry=managedStateRead.state.entries.find(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(validated.manifest.name)),timestamps=resolveManagedInstallTimestamps(existingManagedEntry,validated.manifest.version,sourceRecord,nowIso()),managedState=upsertManagedEntry(managedStateRead.state,{name:validated.manifest.name,directory:destinationDirectoryName,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,...timestamps,source:sourceRecord}),activationChanged=ensureActivated(settings,validated.manifest.name);try{installInPlace||await copyExtensionDirectoryForInstall(validated.directory,destinationDirectory),await ensureExtensionModuleTypeMarker(destinationDirectory),await ensureInstalledExtensionSdkLink(destinationDirectory),await writeManagedExtensionState(resolvedRoots.selected_root,managedState),activationChanged&&await writeSettings(resolvedRoots.settings_root,settings,"settings:write")}catch(error){try{await restoreExtensionInstallSnapshot(snapshot)}catch(rollbackError){throw new AggregateError([error,rollbackError],`Extension install failed: ${String(error)}; rollback failed: ${String(rollbackError)}`,{cause:rollbackError})}throw error}return{settings,managedState,sourceRecord,destinationDirectory,destinationExists,installInPlace,activationChanged}}finally{await fs.rm(backupRoot,{recursive:!0,force:!0}).catch(()=>{})}},scaffoldInstalledExtensionItemTypes=async(ctx,extensionName,registrations)=>{const definitions=registrations.filter(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(extensionName)).flatMap(entry=>entry.types.map(type=>({name:type.name,folder:type.folder})));return ctx.scope==="project"&&definitions.length>0&&await ensureTypeFolderScaffold(ctx.resolvedRoots.pm_root,definitions,ctx.warnings,"install:type-folder"),definitions},buildInstalledExtensionActivation=(ctx,extensionName,runtimeProbe,commandSummary,installedItemTypes)=>{const failure=findActivationFailureByName(extensionName,runtimeProbe.activation_failures,ctx.scope),status=resolveInstallRuntimeActivationStatus(extensionName,ctx.scope,runtimeProbe.installed,failure),activated=[!runtimeProbe.extensions_disabled,status==="ok"].every(Boolean);activated||ctx.warnings.push(`extension_install_activation_failed:${ctx.scope}:${extensionName}:${status}`);const healthByActivation={true:{status:"ok",blocking_failure_count:0},false:{status:"degraded",blocking_failure_count:1}};return{activated,status,failure,verification:{status:healthByActivation[String(activated)].status,target_pm_root:ctx.resolvedRoots.pm_root,activation_status:status,activated,registered_commands:commandSummary.command_paths,registered_actions:commandSummary.action_paths,registered_item_types:installedItemTypes,module_graph_verification:"fresh_in_topology_snapshot",health:healthByActivation[String(activated)]}}},performExtensionInstallUnderLock=async(ctx,input)=>{const{scope,resolvedRoots,warnings,global:global2,withResult}=ctx,{validated,destinationDirectoryName}=input,persisted=await persistExtensionInstall(ctx,input),refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,persisted.settings,persisted.managedState);warnings.push(...refreshedInstalled.warnings);const runtimeProbe=await probeRuntimeCommandPathsForInstall(resolvedRoots.pm_root,path.dirname(resolvedRoots.selected_root),persisted.settings,refreshedInstalled.extensions,global2);warnings.push(...runtimeProbe.warnings);const installedItemTypeDefinitions=await scaffoldInstalledExtensionItemTypes(ctx,validated.manifest.name,runtimeProbe.item_type_registrations),commandSummary=summarizeRuntimeCommandPathsForExtension(validated.manifest.name,runtimeProbe.installed),activation=buildInstalledExtensionActivation(ctx,validated.manifest.name,runtimeProbe,commandSummary,installedItemTypeDefinitions),contributionInventory=runtimeProbe.contribution_inventories[normalizeExtensionNameForMatch(validated.manifest.name)];return contributionInventory&&(persisted.managedState=await persistManagedContributionInventory(resolvedRoots.selected_root,persisted.managedState,validated.manifest.name,contributionInventory)),withResult({extension:{name:validated.manifest.name,version:validated.manifest.version,entry:validated.manifest.entry,capabilities:validated.manifest.capabilities,directory:destinationDirectoryName},source:persisted.sourceRecord,source_resolution:input.sourceResolution,...input.installPlan?{install_plan:input.installPlan}:{},destination_path:persisted.destinationDirectory,overwritten:[persisted.destinationExists,!persisted.installInPlace].every(Boolean),installed_in_place:persisted.installInPlace,activated:activation.activated,settings_changed:persisted.activationChanged,runtime_activation_status:activation.status,command_paths:commandSummary.command_paths,action_paths:commandSummary.action_paths,contributions:contributionInventory,command_discovery:buildInstallCommandDiscovery(validated.manifest.name,persisted.sourceRecord,commandSummary,activation.failure),verification:activation.verification,activation_diagnostics:{failed_count:runtimeProbe.activation_failures.length,failed:runtimeProbe.activation_failures,installed_extension_failed:activation.failure??null}},activation.activated)},runBundledExtensionInstallAll=async ctx=>{const{options,global:global2,warnings,withResult}=ctx;if(typeof options.ref=="string"&&options.ref.trim().length>0)throw new PmCliError('Action "install all" does not accept --ref.',EXIT_CODE.USAGE);const packages=[],installedSources=new Map;for(const alias of await listBundledPackageAliases()){const source=await resolveBundledExtensionAliasSource(alias),sourceKey=path.resolve(source);let result=installedSources.get(sourceKey);result===void 0&&(result=await runExtension(alias,{...options,install:!0},global2),installedSources.set(sourceKey,result)),packages.push({alias,result})}return warnings.push(...packages.flatMap(entry=>entry.result.warnings)),withResult(buildBundledInstallReceipt(packages,options.dryRun===!0),packages.every(entry=>entry.result.ok))},runSingleExtensionInstall=async(ctx,explicitSourceInput,githubOption)=>{const{resolvedRoots}=ctx,{bundledAliasName,bundledPackageName,installSource,sourceResolution}=await resolveExtensionInstallSourceIdentity(explicitSourceInput,githubOption,ctx.options.ref,(await readManagedExtensionState(resolvedRoots.selected_root)).state.entries);if(sourceResolution.ambiguous){const npmCandidate=sourceResolution.candidates.find(candidate=>candidate.kind==="npm");ctx.warnings.push(`extension_install_source_ambiguous:${explicitSourceInput}:builtin:${bundledAliasName}:npm:${npmCandidate.package}`)}const resolvedSource=await resolveInstallSource(installSource);try{const validated=await validateExtensionDirectory(resolvedSource.directory,{source_kind:installSource.kind,source_input:installSource.input,source_root:resolvedSource.source_root}),destinationDirectoryName=normalizeManagedDirectoryName(validated.manifest.name),installPlan=ctx.options.dryRun===!0||installSource.kind==="local"&&bundledAliasName===null?await buildExtensionInstallPlan(resolvedSource,path.join(resolvedRoots.selected_root,destinationDirectoryName),ctx.scope,ctx.options.copyPlan):void 0;return ctx.options.dryRun===!0?ctx.withResult({dry_run:!0,installed:!1,activated:!1,extension:{name:validated.manifest.name,version:validated.manifest.version},source_resolution:sourceResolution,install_plan:installPlan}):await withExtensionInstallLock(resolvedRoots.settings_root,destinationDirectoryName,()=>performExtensionInstallUnderLock(ctx,{validated,destinationDirectoryName,bundledAliasName,bundledPackageName,sourceResolution,installSource,resolvedSource,installPlan}))}finally{resolvedSource.cleanup&&await resolvedSource.cleanup()}},runExtensionInstallAction=async ctx=>{const githubOption=resolveGithubOption(ctx.options),explicitSourceInput=githubOption??requireTarget(ctx.normalizedTarget,ctx.action,ctx.options);return[githubOption===void 0,isBundledPackageInstallAllTarget(explicitSourceInput)].every(Boolean)?runBundledExtensionInstallAll(ctx):runSingleExtensionInstall(ctx,explicitSourceInput,githubOption)},runExtensionAdoptAllAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,withResult}=ctx;if(normalizedTarget!==void 0)throw new PmCliError('Action "adopt-all" does not accept a target argument.',EXIT_CODE.USAGE);if(resolveGithubOption(options)!==void 0||typeof options.ref=="string"&&options.ref.trim().length>0)throw new PmCliError('Action "adopt-all" does not accept --gh/--github/--ref options.',EXIT_CODE.USAGE);const settings=await readSettings(resolvedRoots.settings_root),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const adoption=await adoptUnmanagedExtensions(resolvedRoots.selected_root,scope,installed.extensions,managedStateRead.state),refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,adoption.state);warnings.push(...refreshedInstalled.warnings);const triage=buildExtensionTriageSummary(scope,warnings,refreshedInstalled.extensions,options);warnings.push(...triage.warnings);const refreshedByIdentity=new Map(refreshedInstalled.extensions.map(entry=>[`${normalizeExtensionNameForMatch(entry.name)}:${normalizeExtensionNameForMatch(entry.directory)}`,entry])),refreshedByDirectory=new Map(refreshedInstalled.extensions.map(entry=>[normalizeExtensionNameForMatch(entry.directory),entry])),adoptedDetails=adoption.adopted_entries.map(entry=>{const normalizedDirectory=normalizeExtensionNameForMatch(entry.directory),refreshedEntry=refreshedByIdentity.get(`${normalizeExtensionNameForMatch(entry.name)}:${normalizedDirectory}`)??refreshedByDirectory.get(normalizedDirectory);return{...entry,...projectExtensionUpdateCheck(refreshedEntry)}});return withResult({adopted_all:adoptedDetails.length>0,adopted_count:adoptedDetails.length,already_managed_count:adoption.already_managed_count,extensions:adoptedDetails,triage,warning_codes:triage.warning_codes,update_health_partial:triage.update_health_partial,update_health_coverage:triage.update_health_coverage})},projectExtensionUpdateCheck=entry=>({update_check_status:entry?.update_check_status??null,update_check_reason:entry?.update_check_reason??null}),buildAdoptedExtensionSource=(githubOption,extensionTarget,extensionDirectory,ref)=>{if(githubOption===void 0)return{kind:"local",input:extensionTarget,location:extensionDirectory};const parsed=parseExtensionInstallSource(githubOption,{forceGithub:!0,ref});if(parsed.kind!=="github")throw new PmCliError(`Invalid GitHub shorthand "${githubOption}".`,EXIT_CODE.USAGE);return{kind:"github",input:parsed.input,location:parsed.subpath??".",repository:parsed.repository,owner:parsed.owner,repo:parsed.repo,ref:parsed.ref,subpath:parsed.subpath}},runExtensionAdoptAction=async ctx=>{const{action,normalizedTarget,scope,resolvedRoots,warnings,options,withResult}=ctx,extensionTarget=requireTarget(normalizedTarget,action,options),githubOption=resolveGithubOption(options),settings=await readSettings(resolvedRoots.settings_root),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const candidate=await resolveInstalledExtensionCandidate(installed.extensions,extensionTarget);if(!candidate)throw new PmCliError(`Installed extension "${extensionTarget}" was not found in ${scope} scope.`,EXIT_CODE.NOT_FOUND);if(candidate.managed)return withResult({adopted:!1,already_managed:!0,extension:{name:candidate.name,directory:candidate.directory}});const extensionDirectory=path.join(resolvedRoots.selected_root,candidate.directory),validated=await validateExtensionDirectory(extensionDirectory),now=nowIso(),sourceRecord=buildAdoptedExtensionSource(githubOption,extensionTarget,extensionDirectory,options.ref),managedState=upsertManagedEntry(managedStateRead.state,{name:validated.manifest.name,directory:candidate.directory,scope,manifest_version:validated.manifest.version,manifest_entry:validated.manifest.entry,capabilities:[...validated.manifest.capabilities],contributions:validated.manifest.contributions,installed_at:now,updated_at:now,source:sourceRecord});await writeManagedExtensionState(resolvedRoots.selected_root,managedState);const refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);warnings.push(...refreshedInstalled.warnings);const refreshedEntry=refreshedInstalled.extensions.find(entry=>normalizeExtensionNameForMatch(entry.name)===normalizeExtensionNameForMatch(validated.manifest.name))??refreshedInstalled.extensions.find(entry=>normalizeExtensionNameForMatch(entry.directory)===normalizeExtensionNameForMatch(candidate.directory));return withResult({adopted:!0,extension:{name:validated.manifest.name,directory:candidate.directory,version:validated.manifest.version,entry:validated.manifest.entry},source:sourceRecord,...projectExtensionUpdateCheck(refreshedEntry)})},resolveRequiredInstalledExtension=async ctx=>{const{action,normalizedTarget,scope,resolvedRoots,warnings,options}=ctx,extensionTarget=requireTarget(normalizedTarget,action,options),settings=await readSettings(resolvedRoots.settings_root),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const candidate=await resolveInstalledExtensionCandidate(installed.extensions,extensionTarget);if(!candidate)throw new PmCliError(`Installed extension "${extensionTarget}" was not found in ${scope} scope.`,EXIT_CODE.NOT_FOUND);return{settings,managedStateRead,candidate}},runExtensionUninstallAction=async ctx=>{const{resolvedRoots,withResult}=ctx,{settings,managedStateRead,candidate}=await resolveRequiredInstalledExtension(ctx),destinationDirectory=path.join(resolvedRoots.selected_root,candidate.directory);await fs.rm(destinationDirectory,{recursive:!0,force:!0});const updatedState={...managedStateRead.state,updated_at:nowIso(),entries:managedStateRead.state.entries.filter(entry=>normalizeExtensionNameForMatch(entry.name)!==normalizeExtensionNameForMatch(candidate.name)&&normalizeExtensionNameForMatch(entry.directory)!==normalizeExtensionNameForMatch(candidate.directory))};await writeManagedExtensionState(resolvedRoots.selected_root,updatedState);const stateChanged=clearExtensionState(settings,candidate.name);return stateChanged&&await writeSettings(resolvedRoots.settings_root,settings,"settings:write"),withResult({removed:!0,extension:{name:candidate.name,directory:candidate.directory},destination_path:destinationDirectory,settings_changed:stateChanged})},runExtensionActivateDeactivateAction=async ctx=>{const{action,resolvedRoots,warnings,global:global2,withResult}=ctx,{settings,candidate}=await resolveRequiredInstalledExtension(ctx),settingsChanged=action==="activate"?ensureActivated(settings,candidate.name):ensureDeactivated(settings,candidate.name);settingsChanged&&await writeSettings(resolvedRoots.settings_root,settings,"settings:write");const activationFailure=action==="activate"?await probeRuntimeCommandPathsForInstall(resolvedRoots.pm_root,path.dirname(resolvedRoots.selected_root),settings,[candidate],global2).then(probe=>(warnings.push(...probe.warnings),findActivationFailureByName(candidate.name,probe.activation_failures,ctx.scope))):void 0;return activationFailure&&warnings.push(`extension_activate_failed:${ctx.scope}:${candidate.name}`),withResult({extension:{name:candidate.name,directory:candidate.directory},active:action==="activate"&&activationFailure===void 0,runtime_active:action==="activate"&&activationFailure===void 0,activation_failure:activationFailure??null,settings_changed:settingsChanged,settings:{enabled:[...settings.extensions.enabled],disabled:[...settings.extensions.disabled]}},activationFailure===void 0)},buildDoctorRemediation=(baseRemediation,loadFailureCount,activationFailureCount,vocabulary,managedStateFix,isolationHint)=>{const noun=vocabulary==="package"?"package":"extension",doctorAction={package:"doctor",extension:"--doctor"}[noun],adoptedCount=managedStateFix?.adopted_entries.length??0,conditionalEntries=[[isolationHint!==null,isolationHint??""],[loadFailureCount>0,`Run pm ${noun} explore --project and pm ${noun} explore --global to inspect load failures.`],[activationFailureCount>0,`Review activation failures in pm ${noun} ${doctorAction} --detail deep output.`],[adoptedCount>0,`Managed-state fix adopted ${adoptedCount} extension(s).`]];return[...new Set([...baseRemediation,...conditionalEntries.filter(([include])=>include).map(([,entry])=>entry)].map(entry=>entry.trim()).filter(entry=>entry.length>0))]},hasGlobalLayerDiagnostics=loadResult=>loadResult.loaded.some(entry=>entry.layer==="global")||loadResult.failed.some(entry=>entry.layer==="global")||loadResult.warnings.some(warning=>warning.includes(":global:")),buildDoctorIsolationHint=(scope,isolated,vocabulary,loadResult)=>{if(scope!=="project"||isolated||!hasGlobalLayerDiagnostics(loadResult))return null;const noun=vocabulary==="package"?"package":"extension";return`Global ${noun} registrations are included in project diagnostics. For hermetic ${noun} smoke tests, rerun pm ${noun} doctor --project --isolated --detail deep --trace, or set PM_GLOBAL_PATH to a temporary directory for the whole test process.`},resolveDoctorInvocationOptions=(target,scope,options)=>{if(String(target??"").trim().length>0)throw new PmCliError('Action "doctor" does not accept a target argument.',EXIT_CODE.USAGE);const isolated=[options.isolated,options.ignoreGlobal].includes(!0);if([isolated,scope==="global"].every(Boolean))throw new PmCliError("--isolated and --ignore-global are only valid with project-scope doctor diagnostics.",EXIT_CODE.USAGE);const detailMode=parseDoctorDetailMode(options.detail),includeTrace=options.trace===!0;if([includeTrace,detailMode!=="deep"].every(Boolean))throw new PmCliError("--trace requires --detail deep with --doctor.",EXIT_CODE.USAGE);return{isolated,detailMode,includeTrace}},applyDoctorManagedStateFix=async(ctx,installed,state)=>{if(ctx.options.fixManagedState!==!0)return{state,fix:null};const fix=await adoptUnmanagedExtensions(ctx.resolvedRoots.selected_root,ctx.scope,installed,state);return{state:fix.state,fix}},buildDoctorIsolationMetadata=(scope,isolated,vocabulary,loadResult)=>{const noun=vocabulary==="package"?"package":"extension";if(scope!=="project")return{isolated,global_extensions_included:!1,global_diagnostics_present:hasGlobalLayerDiagnostics(loadResult),rerun_command:null,pm_global_path_recipe:null};const isolatedCommand=`pm ${noun} doctor --project --isolated --detail deep --trace`;return{isolated,global_extensions_included:!isolated,global_diagnostics_present:hasGlobalLayerDiagnostics(loadResult),rerun_command:isolated?null:isolatedCommand,pm_global_path_recipe:`PM_GLOBAL_PATH=$(mktemp -d) pm ${noun} doctor --project --detail deep --trace`}},runExtensionDoctorAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,global:global2,withResult}=ctx,{isolated,detailMode,includeTrace}=resolveDoctorInvocationOptions(normalizedTarget,scope,options),settings=await readSettings(resolvedRoots.settings_root),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const{state:managedState,fix:managedStateFix}=await applyDoctorManagedStateFix(ctx,installed.extensions,managedStateRead.state),refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);warnings.push(...refreshedInstalled.warnings);const loadResult=await loadExtensions({pmRoot:resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===!0,ignoreGlobalExtensions:isolated}),activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded}),authorManifest=await inspectExtensionAuthorManifestAtPmRoot(resolvedRoots.pm_root);warnings.push(...authorManifest.warnings,...loadResult.warnings),warnings.push(...classifyDoctorLoadFailureWarnings(loadResult.failed)),warnings.push(...activationResult.warnings),warnings.push(...classifyDoctorActivationFailureWarnings(activationResult.failed)),warnings.push(...classifyUnusedCapabilityWarnings(loadResult,activationResult)),warnings.push(...collectGlobalOutputOverrideDoctorWarnings(activationResult,loadResult)),warnings.push(...collectSchemaNarrowActivationDoctorWarnings(loadResult,activationResult)),warnings.push(...collectMcpCustomFieldCollisionDoctorWarnings(activationResult));const runtimeInstalledExtensions=applyDoctorRuntimeActivationState(refreshedInstalled.extensions,loadResult,activationResult),doctorConsistency=buildDoctorConsistencySummary(scope,runtimeInstalledExtensions,loadResult.loaded.map(entry=>({layer:entry.layer,name:entry.name})),loadResult.failed.map(entry=>({name:entry.name})),loadResult.disabled_by_flag);warnings.push(...doctorConsistency.warnings);const updateCheckWarnings=runtimeInstalledExtensions.filter(entry=>entry.update_check_status==="failed").map(entry=>`extension_update_check_failed:${entry.name}`);warnings.push(...updateCheckWarnings);const triage=buildExtensionTriageSummary(scope,warnings,runtimeInstalledExtensions,options);warnings.push(...triage.warnings);const normalizedWarnings=[...triage.warnings],policySummary={mode:loadResult.policy.mode,trust_mode:loadResult.policy.trust_mode,require_provenance:loadResult.policy.require_provenance,default_sandbox_profile:loadResult.policy.default_sandbox_profile,sandbox_enforcement:"advisory: sandbox_profile/permissions are declaration-based load gates, not runtime isolation (ADR pm-6ef3)",trusted_extensions_count:loadResult.policy.trusted_extensions.length,allowed_extensions_count:loadResult.policy.allowed_extensions.length,blocked_extensions_count:loadResult.policy.blocked_extensions.length,allowed_capabilities_count:loadResult.policy.allowed_capabilities.length,blocked_capabilities_count:loadResult.policy.blocked_capabilities.length,allowed_surfaces_count:loadResult.policy.allowed_surfaces.length,blocked_surfaces_count:loadResult.policy.blocked_surfaces.length,allowed_commands_count:loadResult.policy.allowed_commands.length,blocked_commands_count:loadResult.policy.blocked_commands.length,allowed_actions_count:loadResult.policy.allowed_actions.length,blocked_actions_count:loadResult.policy.blocked_actions.length,allowed_services_count:loadResult.policy.allowed_services.length,blocked_services_count:loadResult.policy.blocked_services.length,extension_override_count:loadResult.policy.extension_overrides.length},capabilityGuidance=collectUnknownCapabilityGuidance(normalizedWarnings),capabilityContract=buildCapabilityContractMetadata(),warningCodes=triage.warning_codes,isolationHint=buildDoctorIsolationHint(scope,isolated,options.vocabulary,loadResult),remediation=buildDoctorRemediation(triage.remediation,loadResult.failed.length,activationResult.failed.length,options.vocabulary,managedStateFix,isolationHint),isolation=buildDoctorIsolationMetadata(scope,isolated,options.vocabulary,loadResult),summary={status:triage.status,scope,warning_count:triage.warning_count,warning_codes:warningCodes,total_extensions:runtimeInstalledExtensions.length,managed_total:runtimeInstalledExtensions.filter(entry=>entry.managed).length,enabled_total:runtimeInstalledExtensions.filter(entry=>entry.enabled).length,active_total:runtimeInstalledExtensions.filter(entry=>entry.active).length,unmanaged_loaded_extension_count:triage.unmanaged_loaded_extension_count,unmanaged_action_required_extension_count:triage.unmanaged_action_required_extension_count,unmanaged_expected_extension_count:triage.unmanaged_expected_extension_count,runtime_active_total:runtimeInstalledExtensions.filter(entry=>entry.runtime_active===!0).length,activation_status_totals:{ok:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="ok").length,failed:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="failed").length,not_loaded:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="not_loaded").length,unknown:runtimeInstalledExtensions.filter(entry=>entry.activation_status==="unknown").length},unknown_capability_count:capabilityGuidance.length,capability_contract_version:capabilityContract.version,update_available_total:triage.update_available_total,update_check_status_totals:triage.update_check_status_totals,update_health_coverage:triage.update_health_coverage,update_health_partial:triage.update_health_partial,update_check_failed_total:runtimeInstalledExtensions.filter(entry=>entry.update_check_status==="failed").length,load_failure_count:loadResult.failed.length,activation_failure_count:activationResult.failed.length,load_failures:summarizeExtensionFailures(loadResult.failed),activation_failures:summarizeExtensionFailures(activationResult.failed),blocking_failure_count:loadResult.failed.length+activationResult.failed.length,has_blocking_failures:loadResult.failed.length+activationResult.failed.length>0,consistency_warning_count:doctorConsistency.warnings.length,trace_enabled:includeTrace,isolation,policy:policySummary,remediation},managedStateFixSummary=managedStateFix?{requested:!0,applied:managedStateFix.adopted_entries.length>0,adopted_count:managedStateFix.adopted_entries.length,already_managed_count:managedStateFix.already_managed_count,adopted_extensions:managedStateFix.adopted_entries.map(entry=>entry.name)}:{requested:!1,applied:!1,adopted_count:0,already_managed_count:refreshedInstalled.extensions.filter(entry=>entry.managed).length,adopted_extensions:[]},details={mode:detailMode,summary,triage,trace_enabled:includeTrace,capability_contract:capabilityContract,capability_guidance:capabilityGuidance,managed_state_fix:managedStateFixSummary,author_manifest:authorManifest,isolation,policy:loadResult.policy};if(detailMode==="deep"){const activationFailedDetails=includeTrace?activationResult.failed:activationResult.failed.map(entry=>{const{trace:_trace,...rest}=entry;return rest});details.deep={warnings:normalizedWarnings,warning_codes:warningCodes,capability_contract:capabilityContract,capability_guidance:capabilityGuidance,trace_enabled:includeTrace,managed_state:{path:managedStateRead.path,count:managedState.entries.length,entries:managedState.entries},installed_extensions:runtimeInstalledExtensions,load:{roots:loadResult.roots,policy:loadResult.policy,warnings:loadResult.warnings,failed:loadResult.failed,loaded:loadResult.loaded.map(entry=>({layer:entry.layer,directory:entry.directory,name:entry.name,version:entry.version,entry:entry.entry,priority:entry.priority}))},activation:{failed:activationFailedDetails,warnings:activationResult.warnings,hook_counts:activationResult.hook_counts,registration_counts:activationResult.registration_counts,parser_override_count:activationResult.parser_override_count,preflight_override_count:activationResult.preflight_override_count,service_override_count:activationResult.service_override_count,renderer_override_count:activationResult.renderer_override_count},consistency:doctorConsistency.summary},includeTrace&&(details.deep.trace={activation_failures:activationResult.failed.filter(entry=>entry.trace!==void 0).map(entry=>({layer:entry.layer,name:entry.name,entry_path:entry.entry_path,error:entry.error,method:entry.trace.method,command:entry.trace.command,capability:entry.trace.capability,missing_capability:entry.trace.missing_capability,registration_index:entry.trace.registration_index,expected_schema:entry.trace.expected_schema,hint:entry.trace.hint,received:entry.trace.received}))})}return withResult(details)},runExtensionDescribeAction=async ctx=>{const{normalizedTarget,scope,resolvedRoots,warnings,options,global:global2,withResult}=ctx,settings=await readSettings(resolvedRoots.settings_root),loadResult=await loadExtensions({pmRoot:resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:global2.noExtensions===!0}),activationResult=await activateExtensions(loadResult);warnings.push(...loadResult.warnings),warnings.push(...activationResult.warnings);const describeResult=buildExtensionDescribeResult(normalizedTarget,loadResult,activationResult);if(normalizedTarget!==void 0&&describeResult.extensions.length===0){const noun=options.vocabulary==="package"?"package":"extension",loadedNames=[...new Set(loadResult.loaded.map(entry=>options.vocabulary==="package"&&typeof entry.source_package=="string"&&entry.source_package.trim().length>0?entry.source_package.trim():entry.name))].sort((left,right)=>left.localeCompare(right)),loadedHint=loadedNames.length>0?` Loaded ${noun} names: ${loadedNames.join(", ")}.`:"";throw new PmCliError(`No loaded ${noun} named "${normalizedTarget}" was found in ${scope} scope.${loadedHint} Run pm ${noun} explore to list discovered ${noun}s.`,EXIT_CODE.NOT_FOUND)}return withResult({target:describeResult.target,total:describeResult.total,extensions:describeResult.extensions,union:describeResult.union,command_ownership:describeResult.command_ownership})},prepareExploreManageState=async(ctx,installed,initialState)=>{let state=initialState,fix=null;return[ctx.action==="manage",ctx.options.fixManagedState===!0].every(Boolean)&&(fix=await adoptUnmanagedExtensions(ctx.resolvedRoots.selected_root,ctx.scope,installed,initialState),state=fix.state),ctx.action==="manage"&&(state=await refreshManagedExtensionUpdates(state,ctx.options.offline)),{state,fix}},probeExploreManageRuntime=async(ctx,settings,installed)=>{const loadResult=await loadExtensions({pmRoot:ctx.resolvedRoots.pm_root,settings,cwd:process.cwd(),noExtensions:ctx.global.noExtensions===!0}),activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded});return ctx.warnings.push(...loadResult.warnings,...activationResult.warnings),{installed:applyDoctorRuntimeActivationState(installed,loadResult,activationResult),failures:collectActivationFailureDiagnostics(activationResult.failed),summary:{requested:!0,executed:!0,reason:ctx.action==="explore"?"explore_defaults_to_runtime_probe":ctx.options.runtimeProbe===!0?"runtime_probe_requested":"manage_defaults_to_runtime_probe",load_failure_count:loadResult.failed.length,activation_failure_count:activationResult.failed.length,warning_count:[...new Set([...loadResult.warnings,...activationResult.warnings])].length,policy:loadResult.policy}}},projectExploreManageFix=(fix,installed)=>fix?{requested:!0,applied:fix.adopted_entries.length>0,adopted_count:fix.adopted_entries.length,adopted_extensions:fix.adopted_entries.map(entry=>entry.name),already_managed_count:fix.already_managed_count}:{requested:!1,applied:!1,adopted_count:0,adopted_extensions:[],already_managed_count:installed.filter(entry=>entry.managed).length},runExtensionExploreManageAction=async ctx=>{const{action,scope,resolvedRoots,warnings,options,withResult}=ctx,settings=await readSettings(resolvedRoots.settings_root),configuredPolicy=buildExtensionPolicyDetails(settings.extensions.policy),managedStateRead=await readManagedExtensionState(resolvedRoots.selected_root);warnings.push(...managedStateRead.warnings);const installed=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedStateRead.state);warnings.push(...installed.warnings);const{state:managedState,fix:managedStateFix}=await prepareExploreManageState(ctx,installed.extensions,managedStateRead.state),refreshedInstalled=await listInstalledExtensions(resolvedRoots.selected_root,scope,settings,managedState);if(warnings.push(...refreshedInstalled.warnings),action==="manage"&&options.offline===!0)for(const extension of refreshedInstalled.extensions)extension.managed&&["npm","github"].includes(extension.source.kind)&&(extension.update_check_reason="offline_requested");if(action==="manage"){const updateWarnings=refreshedInstalled.extensions.filter(entry=>entry.update_check_status==="failed").map(entry=>`extension_update_check_failed:${entry.name}`);warnings.push(...updateWarnings)}const runtimeProbe=await probeExploreManageRuntime(ctx,settings,refreshedInstalled.extensions),runtimeInstalledExtensions=runtimeProbe.installed,triage=buildExtensionTriageSummary(scope,warnings,runtimeInstalledExtensions,options);warnings.push(...triage.warnings);const details={total:runtimeInstalledExtensions.length,managed_total:runtimeInstalledExtensions.filter(entry=>entry.managed).length,enabled_total:runtimeInstalledExtensions.filter(entry=>entry.enabled).length,active_total:runtimeInstalledExtensions.filter(entry=>entry.active).length,extensions:runtimeInstalledExtensions,triage,policy:configuredPolicy};return runtimeProbe.failures!==void 0&&(details.activation_diagnostics={failed_count:runtimeProbe.failures.length,failed:runtimeProbe.failures}),action==="explore"&&(details.runtime_probe=runtimeProbe.summary),action==="manage"&&(details.runtime_probe=runtimeProbe.summary,details.managed_state_fix=projectExploreManageFix(managedStateFix,runtimeInstalledExtensions)),withResult(details)},EXTENSION_ACTION_HANDLERS={init:runExtensionInitAction,install:runExtensionInstallAction,uninstall:runExtensionUninstallAction,explore:runExtensionExploreManageAction,manage:runExtensionExploreManageAction,describe:runExtensionDescribeAction,reload:runExtensionReloadAction,doctor:runExtensionDoctorAction,catalog:runExtensionCatalogAction,adopt:runExtensionAdoptAction,"adopt-all":runExtensionAdoptAllAction,activate:runExtensionActivateDeactivateAction,deactivate:runExtensionActivateDeactivateAction,migrate:runExtensionMigrateAction},requiresExtensionStateLock=ctx=>[ctx.action==="uninstall",ctx.action==="adopt",ctx.action==="adopt-all",ctx.action==="activate",ctx.action==="deactivate",ctx.action==="migrate",[["doctor","manage"].includes(ctx.action),ctx.options.fixManagedState===!0].every(Boolean)].some(Boolean),dispatchExtensionAction=ctx=>requiresExtensionStateLock(ctx)?withExtensionInstallLock(ctx.resolvedRoots.settings_root,`${ctx.action}-state`,()=>EXTENSION_ACTION_HANDLERS[ctx.action](ctx)):EXTENSION_ACTION_HANDLERS[ctx.action](ctx),_testOnly={adoptUnmanagedExtensions,buildAdoptedExtensionSource,buildExtensionPolicyDetails,buildInstallCommandDiscovery,checkGithubUpdate,clearExtensionState,collectActivationFailureDiagnostics,findActivationFailureByName,resolveInstallRuntimeActivationStatus,collectGlobalOutputOverrideDoctorWarnings,collectMcpCustomFieldCollisionDoctorWarnings,collectSchemaNarrowActivationDoctorWarnings,copyExtensionDirectoryWithoutSelfNesting,isErrnoCode,isRetriableExtensionInstallCopyError,listInstalledExtensions,mapWithFixedConcurrency,projectExtensionUpdateCheck,readOptionalMetadataFile,requireTarget,resolveAction,resolveCommandDiscoveryPackageName,resolveGithubOption,resolveInstalledExtensionCandidate,resolveManagedInstallTimestamps,resolveScope,resolveUpdateCheckResolution,withExtensionInstallLock};export{_testOnly,copyExtensionDirectoryForInstall,parseExtensionInstallSource,parseExtensionManifest,readManagedExtensionState,resolveCanonicalExtensionInstallDestination,resolveManagedExtensionStatePath,runExtension,validateExtensionDirectory,writeManagedExtensionState};
|
|
2
2
|
//# sourceMappingURL=extension.js.map
|