@unbrained/pm-cli 2026.10.22 → 2026.10.24

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.
Files changed (190) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +38 -0
  3. package/dist/cli/error-guidance.d.ts +12 -0
  4. package/dist/cli/error-guidance.js +2 -2
  5. package/dist/cli/register-setup.js +1 -1
  6. package/dist/cli-bundle/bundle-manifest.json +1 -1
  7. package/dist/cli-bundle/chunks/{chunk-2B5HAZFK.js → chunk-3S5FLCG7.js} +2 -2
  8. package/dist/cli-bundle/chunks/{chunk-PCPOTFJP.js → chunk-3VI4XDP2.js} +2 -2
  9. package/dist/cli-bundle/chunks/{chunk-UYYTV2TX.js → chunk-4PNAUT2E.js} +2 -2
  10. package/dist/cli-bundle/chunks/{chunk-E3JC3WQL.js → chunk-CDR5ES7Q.js} +54 -54
  11. package/dist/cli-bundle/chunks/chunk-CNEUJHA4.js +2 -0
  12. package/dist/cli-bundle/chunks/{chunk-AOAQDCXX.js → chunk-CSE47ZAN.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-MV3KYY2A.js → chunk-FASDGYQC.js} +3 -3
  14. package/dist/cli-bundle/chunks/chunk-HZNFNETE.js +127 -0
  15. package/dist/cli-bundle/chunks/{chunk-7OTYULIJ.js → chunk-KGZGXC7T.js} +29 -29
  16. package/dist/cli-bundle/chunks/{chunk-HC2DCGFA.js → chunk-MA7SNKYK.js} +2 -2
  17. package/dist/cli-bundle/chunks/{chunk-GWIGZDRS.js → chunk-R7KWBFM2.js} +2 -2
  18. package/dist/cli-bundle/chunks/chunk-TZYQ4JDZ.js +6 -0
  19. package/dist/cli-bundle/chunks/chunk-URZB3USE.js +113 -0
  20. package/dist/cli-bundle/chunks/chunk-UY5UHI4I.js +2 -0
  21. package/dist/cli-bundle/chunks/{chunk-TNU3XVPC.js → chunk-VPMQEVU6.js} +14 -14
  22. package/dist/cli-bundle/chunks/{chunk-URV4VHQ4.js → chunk-VSSHB6XI.js} +2 -2
  23. package/dist/cli-bundle/chunks/{chunk-LIC5EUQS.js → chunk-YEI4N4A6.js} +48 -48
  24. package/dist/cli-bundle/chunks/chunk-Z62RXNHW.js +3 -0
  25. package/dist/cli-bundle/chunks/chunk-ZDVTXLA6.js +9 -0
  26. package/dist/cli-bundle/chunks/{indexed-receipt-blobs-L3BOTMZN.js → indexed-receipt-blobs-XANVELIV.js} +2 -2
  27. package/dist/cli-bundle/chunks/{mutation-admission-TATOFEXF.js → mutation-admission-NVTBZ7DH.js} +2 -2
  28. package/dist/cli-bundle/chunks/{register-list-query-GULR2IYO.js → register-list-query-2FE6K7FQ.js} +2 -2
  29. package/dist/cli-bundle/chunks/{register-mutation-HLSQ4WVW.js → register-mutation-KZXQUZUH.js} +2 -2
  30. package/dist/cli-bundle/chunks/{register-operations-FE3GGA7O.js → register-operations-BOCBWNKJ.js} +2 -2
  31. package/dist/cli-bundle/chunks/register-setup-P3VLCTDY.js +2 -0
  32. package/dist/cli-bundle/chunks/{settlement-hook-UVFYSBMU.js → settlement-hook-YUVCO65H.js} +2 -2
  33. package/dist/cli-bundle/chunks/{stage-QCPZBZRC.js → stage-WRDTMCCF.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-UQ5JPBY2.js → chunk-3QYTS4OY.js} +4 -4
  35. package/dist/cli-bundle/focused-chunks/{chunk-46HBJC6J.js → chunk-5MKNVJCM.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-QGDKWULS.js → chunk-6HJCSHBG.js} +2 -2
  37. package/dist/cli-bundle/focused-chunks/chunk-7RQOFHMH.js +26 -0
  38. package/dist/cli-bundle/focused-chunks/chunk-AGCEWJ27.js +21 -0
  39. package/dist/cli-bundle/focused-chunks/{chunk-3LWH2RJC.js → chunk-BUZ2Z4P3.js} +2 -2
  40. package/dist/cli-bundle/focused-chunks/{chunk-2GFTVXKZ.js → chunk-CEEOWDB7.js} +3 -3
  41. package/dist/cli-bundle/focused-chunks/{chunk-25NQRZ7J.js → chunk-ES2NGVHZ.js} +2 -2
  42. package/dist/cli-bundle/focused-chunks/chunk-GXAXDPD4.js +2 -0
  43. package/dist/cli-bundle/focused-chunks/{chunk-VYAZND5Q.js → chunk-IUAYTD2S.js} +2 -2
  44. package/dist/cli-bundle/focused-chunks/{chunk-TMN3RAXZ.js → chunk-JYXA4JIP.js} +2 -2
  45. package/dist/cli-bundle/focused-chunks/{chunk-A52W6GLA.js → chunk-NFFPNMTH.js} +2 -2
  46. package/dist/cli-bundle/focused-chunks/{chunk-KM77WU5U.js → chunk-NX7TVNUM.js} +2 -2
  47. package/dist/cli-bundle/focused-chunks/{chunk-CX5FNEFC.js → chunk-POLMFGPQ.js} +3 -3
  48. package/dist/cli-bundle/focused-chunks/chunk-R536272H.js +9 -0
  49. package/dist/cli-bundle/focused-chunks/{chunk-W2CND3BD.js → chunk-RSEGFZTY.js} +54 -54
  50. package/dist/cli-bundle/focused-chunks/{chunk-EHPRSWJE.js → chunk-RVUGTIIU.js} +2 -2
  51. package/dist/cli-bundle/focused-chunks/{chunk-CB7TSZ7P.js → chunk-SBJ2IKTH.js} +2 -2
  52. package/dist/cli-bundle/focused-chunks/{chunk-SXVJRLLP.js → chunk-SHUPX6G2.js} +2 -2
  53. package/dist/cli-bundle/focused-chunks/{chunk-GVKYTDOH.js → chunk-TAHSXKAT.js} +2 -2
  54. package/dist/cli-bundle/focused-chunks/chunk-X5YRJMAY.js +2 -0
  55. package/dist/cli-bundle/focused-chunks/chunk-XTYEASIY.js +2 -0
  56. package/dist/cli-bundle/focused-chunks/chunk-ZMWLV2CE.js +91 -0
  57. package/dist/cli-bundle/focused-chunks/{indexed-receipt-blobs-AAQOKO5B.js → indexed-receipt-blobs-FVOA3XMI.js} +2 -2
  58. package/dist/cli-bundle/focused-chunks/{mutation-admission-TBKR4KRM.js → mutation-admission-PB6YFY7S.js} +2 -2
  59. package/dist/cli-bundle/focused-chunks/{settlement-hook-MNCHFCAX.js → settlement-hook-2VXEB6PP.js} +2 -2
  60. package/dist/cli-bundle/focused-chunks/{stage-RM6MJIMT.js → stage-MQE4PFWT.js} +2 -2
  61. package/dist/cli-bundle/main.js +21 -21
  62. package/dist/cli-bundle/sdk-authoring.js +1 -1
  63. package/dist/cli-bundle/sdk-contracts.js +5 -2
  64. package/dist/cli-bundle/sdk-core.js +33 -33
  65. package/dist/cli-bundle/sdk-governance.js +1 -1
  66. package/dist/cli-bundle/sdk-graph.js +1 -1
  67. package/dist/cli-bundle/sdk-merge.js +58 -58
  68. package/dist/cli-bundle/sdk-query.js +1 -1
  69. package/dist/cli-bundle/sdk-runtime.js +1 -1
  70. package/dist/cli-bundle/sdk-testing.js +1 -1
  71. package/dist/cli-bundle/sdk.js +12 -9
  72. package/dist/core/checkpoint/mutation-checkpoint.d.ts +6 -3
  73. package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
  74. package/dist/core/checkpoint/mutation-context.d.ts +10 -0
  75. package/dist/core/checkpoint/mutation-context.js +2 -0
  76. package/dist/core/config/nested-settings.js +1 -1
  77. package/dist/core/extensions/loader.js +1 -1
  78. package/dist/core/extensions/version-diagnostics.d.ts +2 -0
  79. package/dist/core/extensions/version-diagnostics.js +2 -0
  80. package/dist/core/lock/lock.d.ts +40 -6
  81. package/dist/core/lock/lock.js +3 -3
  82. package/dist/core/shared/errors.d.ts +28 -0
  83. package/dist/core/shared/errors.js +1 -1
  84. package/dist/core/store/item-store.js +1 -1
  85. package/dist/mcp/http-server.js +2 -2
  86. package/dist/mcp/server.js +2 -2
  87. package/dist/sdk/agent/command-recovery.d.ts +1 -0
  88. package/dist/sdk/agent/command-recovery.js +1 -1
  89. package/dist/sdk/agent/linked-resource-recovery.d.ts +13 -0
  90. package/dist/sdk/agent/linked-resource-recovery.js +2 -0
  91. package/dist/sdk/cli-contracts/agent-output-contracts.js +1 -1
  92. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
  93. package/dist/sdk/cli-contracts/typed-action-inputs.d.ts +3 -2
  94. package/dist/sdk/contracts.d.ts +1 -0
  95. package/dist/sdk/contracts.js +1 -1
  96. package/dist/sdk/core.d.ts +1 -1
  97. package/dist/sdk/core.js +1 -1
  98. package/dist/sdk/extension/doctor.js +1 -1
  99. package/dist/sdk/extension/install-receipts.js +1 -1
  100. package/dist/sdk/extension/install-snapshot.d.ts +11 -0
  101. package/dist/sdk/extension/install-snapshot.js +1 -1
  102. package/dist/sdk/extension.d.ts +12 -0
  103. package/dist/sdk/extension.js +1 -1
  104. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  105. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  106. package/dist/sdk/governance/health.d.ts +1 -0
  107. package/dist/sdk/governance/health.js +2 -2
  108. package/dist/sdk/index.d.ts +4 -2
  109. package/dist/sdk/index.js +1 -1
  110. package/dist/sdk/lifecycle/checkpoint-rollback.d.ts +7 -0
  111. package/dist/sdk/lifecycle/checkpoint-rollback.js +2 -0
  112. package/dist/sdk/lifecycle/close-many.d.ts +1 -1
  113. package/dist/sdk/lifecycle/close-many.js +1 -1
  114. package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
  115. package/dist/sdk/lifecycle/restore.js +1 -1
  116. package/dist/sdk/lifecycle/update-many.d.ts +1 -1
  117. package/dist/sdk/lifecycle/update-many.js +1 -1
  118. package/dist/sdk/mcp/executable.d.ts +13 -0
  119. package/dist/sdk/mcp/executable.js +5 -0
  120. package/dist/sdk/public-surface.json +1 -1
  121. package/dist/sdk/query/context.d.ts +2 -1
  122. package/dist/sdk/query/context.js +1 -1
  123. package/dist/sdk/query/get.d.ts +2 -1
  124. package/dist/sdk/query/get.js +1 -1
  125. package/dist/sdk/query/list.d.ts +2 -1
  126. package/dist/sdk/query/list.js +1 -1
  127. package/dist/sdk/query/search/types.d.ts +2 -1
  128. package/dist/sdk/query.d.ts +1 -0
  129. package/dist/sdk/query.js +1 -1
  130. package/dist/sdk/read-output-contracts.d.ts +10 -2
  131. package/dist/sdk/read-output-contracts.js +1 -1
  132. package/dist/sdk/runtime-input.js +1 -1
  133. package/dist/sdk/runtime-primitives.d.ts +2 -1
  134. package/dist/sdk/runtime-primitives.js +1 -1
  135. package/dist/sdk/runtime.d.ts +11 -11
  136. package/dist/sdk/runtime.js +1 -1
  137. package/dist/sdk/test/batch.js +2 -2
  138. package/dist/sdk/test/entry.d.ts +5 -1
  139. package/dist/sdk/test/entry.js +2 -1
  140. package/dist/sdk/test/execution.js +2 -2
  141. package/dist/sdk/workspace-snapshot.d.ts +5 -1
  142. package/dist/sdk/workspace-snapshot.js +3 -3
  143. package/dist/sdk/workspace.js +2 -2
  144. package/docs/COMMANDS.md +21 -2
  145. package/docs/CONFIGURATION.md +19 -3
  146. package/docs/EXTENSION_AUTHOR_CONTRACTS.md +2 -1
  147. package/docs/EXTENSION_LIFECYCLE.md +47 -0
  148. package/docs/MCP_REMOTE_TRANSPORT_SECURITY.md +16 -1
  149. package/docs/READ_OUTPUT_CONTRACTS.md +15 -0
  150. package/docs/RELEASING.md +9 -0
  151. package/docs/SDK.md +84 -5
  152. package/docs/SDK_STORAGE_LIFECYCLE.md +2 -1
  153. package/docs/TESTING.md +39 -7
  154. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +8 -3
  155. package/marketplace.json +1 -1
  156. package/package.json +1 -1
  157. package/packages/pm-beads/package.json +1 -1
  158. package/packages/pm-calendar/package.json +1 -1
  159. package/packages/pm-command-kit/package.json +1 -1
  160. package/packages/pm-digital-twin/package.json +1 -1
  161. package/packages/pm-governance-audit/package.json +1 -1
  162. package/packages/pm-guide-shell/package.json +1 -1
  163. package/packages/pm-kanban/package.json +1 -1
  164. package/packages/pm-lifecycle-hooks/package.json +1 -1
  165. package/packages/pm-linked-test-adapters/package.json +1 -1
  166. package/packages/pm-search-advanced/package.json +1 -1
  167. package/packages/pm-templates/package.json +1 -1
  168. package/packages/pm-todos/package.json +1 -1
  169. package/packages/pm-vcs/package.json +1 -1
  170. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  171. package/plugins/pm-claude/package.json +1 -1
  172. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  173. package/plugins/pm-codex/package.json +1 -1
  174. package/plugins/pm-codex/plugin.json +1 -1
  175. package/runtime-dependencies.json +1 -1
  176. package/dist/cli-bundle/chunks/chunk-35ISFIPC.js +0 -113
  177. package/dist/cli-bundle/chunks/chunk-5LSN7K4N.js +0 -2
  178. package/dist/cli-bundle/chunks/chunk-BAIVTLJM.js +0 -6
  179. package/dist/cli-bundle/chunks/chunk-C37RDYZI.js +0 -3
  180. package/dist/cli-bundle/chunks/chunk-J444ZX23.js +0 -126
  181. package/dist/cli-bundle/chunks/chunk-O67N62DT.js +0 -2
  182. package/dist/cli-bundle/chunks/chunk-VO3KDIU7.js +0 -9
  183. package/dist/cli-bundle/chunks/register-setup-XUIKAIZA.js +0 -2
  184. package/dist/cli-bundle/focused-chunks/chunk-25L3L2PF.js +0 -2
  185. package/dist/cli-bundle/focused-chunks/chunk-DVNUHTVK.js +0 -9
  186. package/dist/cli-bundle/focused-chunks/chunk-GC4VMLXL.js +0 -20
  187. package/dist/cli-bundle/focused-chunks/chunk-QWKCQ5PW.js +0 -91
  188. package/dist/cli-bundle/focused-chunks/chunk-SOVXHW6Z.js +0 -2
  189. package/dist/cli-bundle/focused-chunks/chunk-UUPJ6OZL.js +0 -26
  190. package/dist/cli-bundle/focused-chunks/chunk-XX5JQCLF.js +0 -2
@@ -25,7 +25,7 @@ export interface CheckpointRollbackRow {
25
25
  /** Stable identifier used to reference this record across commands and storage. */
26
26
  id:string;
27
27
  /** Lifecycle state reported for status. */
28
- status:"restored" | "failed";
28
+ status:"restored" | "failed" | "skipped";
29
29
  /** Value that configures or reports changed fields for this contract. */
30
30
  changed_fields?:string[];
31
31
  /** Value that configures or reports warnings for this contract. */
@@ -42,11 +42,14 @@ restored_ids:string[];
42
42
  /** Number of failed entries represented by this result. */
43
43
  failed_count:number;
44
44
  }
45
- /** Restore a single item to its captured pre-mutation timestamp. */
45
+ /** Recover one checkpointed item, or disclose that it has no remaining effect. */
46
46
  export type CheckpointRestoreFn = (id:string,targetUpdatedAt:string) => Promise<{
47
47
  changed_fields?:string[];
48
48
  warnings?:string[];
49
+ skipped?:boolean;
49
50
  }>;
51
+ /** Admit only a concrete checkpoint ID; invalid untyped values must never fall through to forward mutation. */
52
+ export declare function resolveCheckpointRollbackId(value:unknown):string | undefined;
50
53
  /** Implements normalize checkpoint id for the public runtime surface of this module. */
51
54
  export declare function normalizeCheckpointId(raw:string):string;
52
55
  /** Implements create checkpoint id for the public runtime surface of this module. */
@@ -59,5 +62,5 @@ export declare function checkpointFilePath(pmRoot:string,subdir:string,checkpoin
59
62
  export declare function writeMutationCheckpoint(pmRoot:string,subdir:string,checkpointId:string,payload:unknown):Promise<string>;
60
63
  /** Implements load mutation checkpoint for the public runtime surface of this module. */
61
64
  export declare function loadMutationCheckpoint(pmRoot:string,subdir:string,rawCheckpointId:string,schemaVersion:number):Promise<LoadedMutationCheckpoint>;
62
- /** Restore every checkpointed item to its captured pre-mutation timestamp, collecting per-item rows. A single item's failure is recorded and does not abort the remaining restores. */
65
+ /** Collect independent recovery results without allowing one row's refusal to hide other rows. */
63
66
  export declare function restoreCheckpointItems(items:MutationCheckpointItem[],restore:CheckpointRestoreFn):Promise<CheckpointRollbackResult>;
@@ -1,3 +1,3 @@
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]="da661b46-841c-526d-88bc-976e007e8fbe")}catch{}})();import{readFile}from"node:fs/promises";import path from"node:path";import{pathExists,readFileIfExists}from"../fs/fs-utils.js";import{createFileAtomic}from"../fs/atomic-create.js";import{EXIT_CODE}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{toErrorMessage}from"../shared/primitives.js";import{nowIso}from"../shared/time.js";function normalizeCheckpointId(raw){const trimmed=raw.trim();if(!trimmed)throw new PmCliError("--rollback requires a non-empty checkpoint ID",EXIT_CODE.USAGE);if(!/^[a-zA-Z0-9._-]+$/.test(trimmed))throw new PmCliError("--rollback checkpoint ID must match [a-zA-Z0-9._-]+",EXIT_CODE.USAGE);return trimmed}function createCheckpointId(prefix,nowValue){const compactTimestamp=nowValue.replace(/[-:.TZ]/g,"").slice(0,14),randomSuffix=Math.random().toString(36).slice(2,8);return`${prefix}-${compactTimestamp}-${randomSuffix}`}function checkpointDirectoryPath(pmRoot,subdir){return path.join(pmRoot,"checkpoints",subdir)}function checkpointFilePath(pmRoot,subdir,checkpointId){return path.join(checkpointDirectoryPath(pmRoot,subdir),`${checkpointId}.json`)}async function writeMutationCheckpoint(pmRoot,subdir,checkpointId,payload){const filePath=checkpointFilePath(pmRoot,subdir,checkpointId),raw=`${JSON.stringify(payload,null,2)}
2
- `;if(!await createFileAtomic(filePath,raw)&&await readFileIfExists(filePath)!==raw)throw new PmCliError(`Checkpoint ${checkpointId} already exists with different contents; use a new checkpoint ID.`,EXIT_CODE.CONFLICT);return filePath}function parseCheckpointItems(record,checkpointId){if(!Array.isArray(record.items))throw new PmCliError(`Checkpoint ${checkpointId} is missing items`,EXIT_CODE.GENERIC_FAILURE);return record.items.map(entry=>{if(!entry||typeof entry!="object")throw new PmCliError(`Checkpoint ${checkpointId} contains an invalid item entry`,EXIT_CODE.GENERIC_FAILURE);const row=entry;if(typeof row.id!="string"||row.id.trim().length===0)throw new PmCliError(`Checkpoint ${checkpointId} contains an item entry without ID`,EXIT_CODE.GENERIC_FAILURE);if(typeof row.target_updated_at!="string"||row.target_updated_at.trim().length===0)throw new PmCliError(`Checkpoint ${checkpointId} contains an item entry without target_updated_at`,EXIT_CODE.GENERIC_FAILURE);return{id:row.id.trim(),target_updated_at:row.target_updated_at.trim()}})}async function loadMutationCheckpoint(pmRoot,subdir,rawCheckpointId,schemaVersion){const normalizedId=normalizeCheckpointId(rawCheckpointId),filePath=checkpointFilePath(pmRoot,subdir,normalizedId);if(!await pathExists(filePath))throw new PmCliError(`Checkpoint ${normalizedId} not found`,EXIT_CODE.NOT_FOUND);const raw=await readFile(filePath,"utf8");let parsed;try{parsed=JSON.parse(raw)}catch(error){throw new PmCliError(`Checkpoint ${normalizedId} contains invalid JSON: ${toErrorMessage(error)}`,EXIT_CODE.GENERIC_FAILURE)}if(!parsed||typeof parsed!="object")throw new PmCliError(`Checkpoint ${normalizedId} is invalid`,EXIT_CODE.GENERIC_FAILURE);const record=parsed;if(record.schema_version!==schemaVersion)throw new PmCliError(`Checkpoint ${normalizedId} has unsupported schema version`,EXIT_CODE.GENERIC_FAILURE);const items=parseCheckpointItems(record,normalizedId);return{record,items,path:filePath,id:typeof record.id=="string"?record.id:normalizedId,created_at:typeof record.created_at=="string"?record.created_at:nowIso(),author:typeof record.author=="string"?record.author:"unknown"}}async function restoreCheckpointItems(items,restore){const rows=[],restoredIds=[];for(const entry of items)try{const restored=await restore(entry.id,entry.target_updated_at);rows.push({id:entry.id,status:"restored",changed_fields:restored.changed_fields,warnings:restored.warnings}),restoredIds.push(entry.id)}catch(error){rows.push({id:entry.id,status:"failed",error:toErrorMessage(error)})}return{rows,restored_ids:restoredIds,failed_count:rows.filter(row=>row.status==="failed").length}}export{checkpointDirectoryPath,checkpointFilePath,createCheckpointId,loadMutationCheckpoint,normalizeCheckpointId,restoreCheckpointItems,writeMutationCheckpoint};
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]="7cc00705-c03e-5a18-9bec-af2585939ed8")}catch{}})();import{readFile}from"node:fs/promises";import path from"node:path";import{pathExists,readFileIfExists}from"../fs/fs-utils.js";import{createFileAtomic}from"../fs/atomic-create.js";import{EXIT_CODE}from"../shared/constants.js";import{PmCliError}from"../shared/errors.js";import{toErrorMessage}from"../shared/primitives.js";import{nowIso}from"../shared/time.js";function resolveCheckpointRollbackId(value){if(value!==void 0){if(typeof value!="string")throw new PmCliError("--rollback requires a non-empty checkpoint ID string",EXIT_CODE.USAGE);return normalizeCheckpointId(value)}}function normalizeCheckpointId(raw){const trimmed=raw.trim();if(!trimmed)throw new PmCliError("--rollback requires a non-empty checkpoint ID",EXIT_CODE.USAGE);if(!/^[a-zA-Z0-9._-]+$/.test(trimmed))throw new PmCliError("--rollback checkpoint ID must match [a-zA-Z0-9._-]+",EXIT_CODE.USAGE);return trimmed}function createCheckpointId(prefix,nowValue){const compactTimestamp=nowValue.replace(/[-:.TZ]/g,"").slice(0,14),randomSuffix=Math.random().toString(36).slice(2,8);return`${prefix}-${compactTimestamp}-${randomSuffix}`}function checkpointDirectoryPath(pmRoot,subdir){return path.join(pmRoot,"checkpoints",subdir)}function checkpointFilePath(pmRoot,subdir,checkpointId){return path.join(checkpointDirectoryPath(pmRoot,subdir),`${checkpointId}.json`)}async function writeMutationCheckpoint(pmRoot,subdir,checkpointId,payload){const filePath=checkpointFilePath(pmRoot,subdir,checkpointId),raw=`${JSON.stringify(payload,null,2)}
2
+ `;if(!await createFileAtomic(filePath,raw)&&await readFileIfExists(filePath)!==raw)throw new PmCliError(`Checkpoint ${checkpointId} already exists with different contents; use a new checkpoint ID.`,EXIT_CODE.CONFLICT);return filePath}function parseCheckpointItems(record,checkpointId){if(!Array.isArray(record.items))throw new PmCliError(`Checkpoint ${checkpointId} is missing items`,EXIT_CODE.GENERIC_FAILURE);return record.items.map(entry=>{if(!entry||typeof entry!="object")throw new PmCliError(`Checkpoint ${checkpointId} contains an invalid item entry`,EXIT_CODE.GENERIC_FAILURE);const row=entry;if(typeof row.id!="string"||row.id.trim().length===0)throw new PmCliError(`Checkpoint ${checkpointId} contains an item entry without ID`,EXIT_CODE.GENERIC_FAILURE);if(typeof row.target_updated_at!="string"||row.target_updated_at.trim().length===0)throw new PmCliError(`Checkpoint ${checkpointId} contains an item entry without target_updated_at`,EXIT_CODE.GENERIC_FAILURE);return{id:row.id.trim(),target_updated_at:row.target_updated_at.trim()}})}async function loadMutationCheckpoint(pmRoot,subdir,rawCheckpointId,schemaVersion){const normalizedId=normalizeCheckpointId(rawCheckpointId),filePath=checkpointFilePath(pmRoot,subdir,normalizedId);if(!await pathExists(filePath))throw new PmCliError(`Checkpoint ${normalizedId} not found`,EXIT_CODE.NOT_FOUND);const raw=await readFile(filePath,"utf8");let parsed;try{parsed=JSON.parse(raw)}catch(error){throw new PmCliError(`Checkpoint ${normalizedId} contains invalid JSON: ${toErrorMessage(error)}`,EXIT_CODE.GENERIC_FAILURE)}if(!parsed||typeof parsed!="object")throw new PmCliError(`Checkpoint ${normalizedId} is invalid`,EXIT_CODE.GENERIC_FAILURE);const record=parsed;if(record.schema_version!==schemaVersion)throw new PmCliError(`Checkpoint ${normalizedId} has unsupported schema version. Inspect pm history and use an explicit pm restore only after reviewing later edits.`,EXIT_CODE.GENERIC_FAILURE);const items=parseCheckpointItems(record,normalizedId);return{record,items,path:filePath,id:typeof record.id=="string"?record.id:normalizedId,created_at:typeof record.created_at=="string"?record.created_at:nowIso(),author:typeof record.author=="string"?record.author:"unknown"}}async function restoreCheckpointItems(items,restore){const rows=[],restoredIds=[];for(const entry of items)try{const restored=await restore(entry.id,entry.target_updated_at);rows.push({id:entry.id,status:restored.skipped?"skipped":"restored",changed_fields:restored.changed_fields,warnings:restored.warnings}),restored.skipped||restoredIds.push(entry.id)}catch(error){rows.push({id:entry.id,status:"failed",error:toErrorMessage(error)})}return{rows,restored_ids:restoredIds,failed_count:rows.filter(row=>row.status==="failed").length}}export{checkpointDirectoryPath,checkpointFilePath,createCheckpointId,loadMutationCheckpoint,normalizeCheckpointId,resolveCheckpointRollbackId,restoreCheckpointItems,writeMutationCheckpoint};
3
3
  //# sourceMappingURL=mutation-checkpoint.js.map
@@ -0,0 +1,10 @@
1
+ interface CheckpointMutationContext {
2
+ pmRoot:string;
3
+ itemId:string;
4
+ checkpointId:string;
5
+ }
6
+ /** Carry checkpoint identity through nested lifecycle writers in this async operation only. */
7
+ export declare function withCheckpointMutation<T>(context:CheckpointMutationContext,operation:() => Promise<T>):Promise<T>;
8
+ /** Read checkpoint attribution only for the matching tracker and item at commit time. */
9
+ export declare function checkpointMutationHistoryContext(pmRoot:string,itemId:string):Record<string,unknown> | undefined;
10
+ export {};
@@ -0,0 +1,2 @@
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]="c343ed33-0135-5d3a-94a4-67314b295168")}catch{}})();import{AsyncLocalStorage}from"node:async_hooks";import path from"node:path";const checkpointContext=new AsyncLocalStorage;function withCheckpointMutation(context,operation){return checkpointContext.run({...context,pmRoot:path.resolve(context.pmRoot)},operation)}function checkpointMutationHistoryContext(pmRoot,itemId){const context=checkpointContext.getStore();return context?.pmRoot===path.resolve(pmRoot)&&context.itemId===itemId?{bulk_checkpoint:context.checkpointId}:void 0}export{checkpointMutationHistoryContext,withCheckpointMutation};
2
+ //# sourceMappingURL=mutation-context.js.map
@@ -1,2 +1,2 @@
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]="2ae4f6da-17c5-5024-89a2-bb0a4be9a683")}catch{}})();const NESTED_SETTING_DESCRIPTORS=[{key:"search_provider",path:"search.provider",kind:"string",summary:"Search embedding provider name (e.g. openai, ollama, or an extension provider)."},{key:"search_default_mode",path:"search.default_mode",kind:"string",choices:["auto","keyword","semantic","hybrid"],summary:"Mode a bare pm search runs in: auto (hybrid when semantic search is explicitly configured and runnable, else keyword), or a pinned keyword, semantic, or hybrid."},{key:"search_mutation_refresh_policy",path:"search.mutation_refresh_policy",kind:"string",choices:["cache_only","semantic_configured","semantic_auto"],summary:"Mutation-time search refresh policy: cache_only, semantic_configured, or semantic_auto."},{key:"search_query_expansion_enabled",path:"search.query_expansion.enabled",kind:"boolean",summary:"Enable or disable query expansion for semantic/hybrid search."},{key:"search_query_expansion_provider",path:"search.query_expansion.provider",kind:"string",summary:"Query expansion provider name (built-in openai/ollama or extension provider)."},{key:"search_rerank_enabled",path:"search.rerank.enabled",kind:"boolean",summary:"Enable or disable post-retrieval reranking for hybrid search."},{key:"search_rerank_model",path:"search.rerank.model",kind:"string",summary:"Rerank model name override used by built-in providers."},{key:"search_rerank_top_k",path:"search.rerank.top_k",kind:"integer",min:1,summary:"Number of top hybrid candidates to rerank when rerank is enabled."},{key:"search_embedding_model",path:"search.embedding_model",kind:"string",summary:"Default embedding model name (overrides provider-specific model when set)."},{key:"search_embedding_corpus_max_characters",path:"search.embedding_corpus_max_characters",kind:"integer",min:1,summary:"Maximum semantic corpus characters per item before truncation."},{key:"search_embedding_batch_size",path:"search.embedding_batch_size",kind:"integer",min:1,summary:"Number of items embedded per request batch."},{key:"search_embedding_timeout_ms",path:"search.embedding_timeout_ms",kind:"integer",min:1,summary:"Per-request embedding timeout in milliseconds."},{key:"search_score_threshold",path:"search.score_threshold",kind:"number",summary:"Minimum score for a hit to be returned (0 keeps all matches)."},{key:"search_hybrid_semantic_weight",path:"search.hybrid_semantic_weight",kind:"ratio",summary:"Hybrid mode semantic weight in [0, 1] (1-weight goes to keyword)."},{key:"search_max_results",path:"search.max_results",kind:"integer",min:1,summary:"Default upper bound on search hits when --limit is not supplied."},{key:"search_bm25_k1",path:"search.bm25.k1",kind:"number",min:0,summary:"Offline BM25 term-frequency saturation (k1); higher saturates repeated terms slower (default 1.2)."},{key:"search_bm25_b",path:"search.bm25.b",kind:"ratio",summary:"Offline BM25 document-length normalization (b) in [0, 1]; 0 disables, 1 fully normalizes (default 0.75)."},{key:"openai_base_url",path:"providers.openai.base_url",kind:"string",summary:"OpenAI-compatible API base URL (LM Studio/vLLM also use this)."},{key:"openai_api_key",path:"providers.openai.api_key",kind:"string",summary:"OpenAI-compatible API key."},{key:"openai_model",path:"providers.openai.model",kind:"string",summary:"OpenAI-compatible embedding model name."},{key:"ollama_base_url",path:"providers.ollama.base_url",kind:"string",summary:"Ollama API base URL (typically http://localhost:11434)."},{key:"ollama_model",path:"providers.ollama.model",kind:"string",summary:"Ollama embedding model name (e.g. nomic-embed-text)."},{key:"vector_store_adapter",path:"vector_store.adapter",kind:"string",summary:"Vector store adapter name (lancedb, qdrant, or an extension adapter)."},{key:"vector_store_collection_name",path:"vector_store.collection_name",kind:"string",non_empty:!0,summary:"Vector collection/table name shared by Qdrant and LanceDB adapters."},{key:"qdrant_url",path:"vector_store.qdrant.url",kind:"string",summary:"Qdrant HTTP API URL."},{key:"qdrant_api_key",path:"vector_store.qdrant.api_key",kind:"string",summary:"Qdrant API key (empty if running unauthenticated)."},{key:"lancedb_path",path:"vector_store.lancedb.path",kind:"string",summary:"LanceDB storage path (relative to pm root or absolute)."},{key:"id_prefix",path:"id_prefix",kind:"string",non_empty:!0,summary:'Prefix for generated item IDs (e.g. "pm" produces pm-xxxx).'},{key:"author_default",path:"author_default",kind:"string",non_empty:!0,summary:"Default author recorded on mutations when --author is not supplied."},{key:"agent_identity_probes_enabled",path:"agent_identity.probes_enabled",kind:"boolean",summary:"Allow privacy-bounded local harness provenance probes; no network or subprocess access is permitted."},{key:"mutation_guard_require_attributed_author",path:"mutation_guard.require_attributed_author",kind:"boolean",summary:"Reject mutations whose effective author resolves to unknown."},{key:"mutation_guard_secret_guard",path:"mutation_guard.secret_guard",kind:"string",choices:["off","advise","block"],summary:"Detect credential-shaped mutation content: off, advise, or block."},{key:"mutation_guard_stale_in_progress_hours",path:"mutation_guard.stale_in_progress_hours",kind:"integer",min:1,summary:"Age threshold for unclaimed in-progress work surfaced by health."},{key:"governance_duplicate_detection_mode",path:"governance.duplicate_detection_mode",kind:"string",choices:["off","advisory","strict"],summary:"Create/copy duplicate governance: off, advisory, or strict explicit-bypass enforcement."},{key:"governance_duplicate_detection_threshold",path:"governance.duplicate_detection_threshold",kind:"ratio",summary:"Minimum shared similarity score in [0, 1] for create/copy duplicate governance."},{key:"governance_duplicate_detection_limit",path:"governance.duplicate_detection_limit",kind:"integer",min:0,max:20,summary:"Maximum likely duplicates returned by create/copy governance (0-20)."},{key:"output_default_format",path:"output.default_format",kind:"string",choices:["toon","json"],summary:"Default output format for commands that support it: toon or json."},{key:"ux_deprecation_hints",path:"ux.deprecation_hints",kind:"boolean",summary:"Emit one stderr migration hint for deprecated command aliases."},{key:"locks_ttl_seconds",path:"locks.ttl_seconds",kind:"integer",min:1,summary:"Claim/lock time-to-live in seconds before a stale lock can be reclaimed."},{key:"locks_wait_ms",path:"locks.wait_ms",kind:"integer",min:0,summary:"Bounded jittered wait in milliseconds before a contended item mutation fails with lock_conflict; 0 fails fast. PM_LOCK_WAIT_MS overrides per invocation."},{key:"ids_token_length",path:"ids.token_length",kind:"integer",min:4,max:12,summary:"Random base36 token length for newly minted item ids (4-12, default 4). Raise it to shrink cross-branch id collision odds in concurrent multi-agent workflows (pm-pibw)."},{key:"checkpoints_retention_days",path:"checkpoints.retention_days",kind:"integer",min:1,summary:"Age in days above which pm gc --scope checkpoints prunes bulk-mutation rollback checkpoints."},{key:"schema_unknown_field_policy",path:"schema.unknown_field_policy",kind:"string",choices:["allow","warn","reject"],summary:"How item I/O handles metadata keys not in the field registry: allow, warn, or reject."},{key:"history_compact_policy_enabled",path:"history.compact_policy.enabled",kind:"boolean",summary:"Enable the history-compaction advisory: pm health warns on over-threshold streams."},{key:"history_compact_policy_max_entries",path:"history.compact_policy.max_entries",kind:"integer",min:1,summary:"Entry count above which a history stream is flagged (and the default pm history-compact --all-over threshold)."},{key:"history_compact_policy_trigger",path:"history.compact_policy.trigger",kind:"string",choices:["health_warn","auto"],summary:"History-compaction policy intent: health_warn (advisory only) or auto (scheduled sweeps expected)."}],DESCRIPTOR_BY_KEY=new Map(NESTED_SETTING_DESCRIPTORS.flatMap(descriptor=>[[descriptor.key,descriptor],[descriptor.path.toLowerCase().replaceAll("-","_"),descriptor]]));function resolveNestedSettingDescriptor(raw){if(typeof raw!="string")return;const normalized=raw.trim().toLowerCase().replaceAll("-","_");if(normalized.length!==0)return DESCRIPTOR_BY_KEY.get(normalized)}function parseNestedBooleanValue(descriptor,rawValue){const normalized=rawValue.trim().toLowerCase();return normalized==="true"||normalized==="1"||normalized==="yes"||normalized==="on"?{ok:!0,parsed:{descriptor,value:!0}}:normalized==="false"||normalized==="0"||normalized==="no"||normalized==="off"?{ok:!0,parsed:{descriptor,value:!1}}:{ok:!1,error:{message:`Config set ${descriptor.key} requires a boolean value (true|false), got "${rawValue}"`}}}function parseNestedStringValue(descriptor,rawValue,trimmed){return descriptor.non_empty===!0&&trimmed.length===0?{ok:!1,error:{message:`Config set ${descriptor.key} requires a non-empty value`}}:descriptor.choices&&!descriptor.choices.includes(trimmed)?{ok:!1,error:{message:`Config set ${descriptor.key} must be one of ${descriptor.choices.join("|")}, got "${rawValue}"`}}:{ok:!0,parsed:{descriptor,value:trimmed}}}function parseFiniteNestedNumber(descriptor,rawValue,trimmed){if(trimmed.length===0)return{ok:!1,error:{message:`Config set ${descriptor.key} requires a non-empty value`}};const parsed=Number(trimmed);return Number.isFinite(parsed)?{ok:!0,value:parsed}:{ok:!1,error:{message:`Config set ${descriptor.key} requires a finite number, got "${rawValue}"`}}}function parseNestedIntegerValue(descriptor,rawValue,value){return!Number.isInteger(value)||value<0?{ok:!1,error:{message:`Config set ${descriptor.key} requires a non-negative integer, got "${rawValue}"`}}:descriptor.min!==void 0&&value<descriptor.min?{ok:!1,error:{message:`Config set ${descriptor.key} requires an integer >= ${descriptor.min}, got "${rawValue}" (the runtime silently ignores 0 here and falls back to the default)`}}:descriptor.max!==void 0&&value>descriptor.max?{ok:!1,error:{message:`Config set ${descriptor.key} requires an integer <= ${descriptor.max}, got "${rawValue}"`}}:{ok:!0,parsed:{descriptor,value}}}function parseNestedRatioValue(descriptor,rawValue,value){return value<0||value>1?{ok:!1,error:{message:`Config set ${descriptor.key} requires a number in [0, 1], got "${rawValue}"`}}:{ok:!0,parsed:{descriptor,value}}}function parseNestedNumberValue(descriptor,rawValue,value){return descriptor.min!==void 0&&value<descriptor.min?{ok:!1,error:{message:`Config set ${descriptor.key} requires a number >= ${descriptor.min}, got "${rawValue}"`}}:{ok:!0,parsed:{descriptor,value}}}function parseNestedSettingValue(descriptor,rawValue){if(typeof rawValue!="string")return{ok:!1,error:{message:`Config set ${descriptor.key} requires a string value`}};const trimmed=rawValue.trim();if(descriptor.kind==="boolean")return parseNestedBooleanValue(descriptor,rawValue);if(descriptor.kind==="string")return parseNestedStringValue(descriptor,rawValue,trimmed);const parsed=parseFiniteNestedNumber(descriptor,rawValue,trimmed);return parsed.ok?descriptor.kind==="integer"?parseNestedIntegerValue(descriptor,rawValue,parsed.value):descriptor.kind==="ratio"?parseNestedRatioValue(descriptor,rawValue,parsed.value):parseNestedNumberValue(descriptor,rawValue,parsed.value):{ok:!1,error:parsed.error}}function readNestedSettingValue(settings,descriptor){const segments=descriptor.path.split(".");let cursor=settings;for(const segment of segments){if(typeof cursor!="object"||cursor===null)return null;const property=Object.getOwnPropertyDescriptor(cursor,segment);if(!property||!Object.hasOwn(property,"value"))return null;cursor=property.value}return typeof cursor=="string"||typeof cursor=="number"||typeof cursor=="boolean"?cursor:null}function writeNestedSettingValue(settings,descriptor,value){const segments=descriptor.path.split(".");if(segments.some(segment=>segment.length===0||["__proto__","constructor","prototype"].includes(segment)))throw new Error("Unsafe settings path");let cursor=settings;for(let index=0;index<segments.length-1;index+=1){const segment=segments[index],existing=Object.getOwnPropertyDescriptor(cursor,segment)?.value;if(typeof existing!="object"||existing===null||Array.isArray(existing)){const next={};Object.defineProperty(cursor,segment,{value:next,writable:!0,enumerable:!0,configurable:!0}),cursor=next}else cursor=existing}const leafKey=segments[segments.length-1];return Object.getOwnPropertyDescriptor(cursor,leafKey)?.value===value?!1:(Object.defineProperty(cursor,leafKey,{value,writable:!0,enumerable:!0,configurable:!0}),!0)}export{NESTED_SETTING_DESCRIPTORS,parseNestedSettingValue,readNestedSettingValue,resolveNestedSettingDescriptor,writeNestedSettingValue};
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]="d681ddfe-ad15-527b-90de-bfbe341c6a86")}catch{}})();const NESTED_SETTING_DESCRIPTORS=[{key:"search_provider",path:"search.provider",kind:"string",summary:"Search embedding provider name (e.g. openai, ollama, or an extension provider)."},{key:"search_default_mode",path:"search.default_mode",kind:"string",choices:["auto","keyword","semantic","hybrid"],summary:"Mode a bare pm search runs in: auto (hybrid when semantic search is explicitly configured and runnable, else keyword), or a pinned keyword, semantic, or hybrid."},{key:"search_mutation_refresh_policy",path:"search.mutation_refresh_policy",kind:"string",choices:["cache_only","semantic_configured","semantic_auto"],summary:"Mutation-time search refresh policy: cache_only, semantic_configured, or semantic_auto."},{key:"search_query_expansion_enabled",path:"search.query_expansion.enabled",kind:"boolean",summary:"Enable or disable query expansion for semantic/hybrid search."},{key:"search_query_expansion_provider",path:"search.query_expansion.provider",kind:"string",summary:"Query expansion provider name (built-in openai/ollama or extension provider)."},{key:"search_rerank_enabled",path:"search.rerank.enabled",kind:"boolean",summary:"Enable or disable post-retrieval reranking for hybrid search."},{key:"search_rerank_model",path:"search.rerank.model",kind:"string",summary:"Rerank model name override used by built-in providers."},{key:"search_rerank_top_k",path:"search.rerank.top_k",kind:"integer",min:1,summary:"Number of top hybrid candidates to rerank when rerank is enabled."},{key:"search_embedding_model",path:"search.embedding_model",kind:"string",summary:"Default embedding model name (overrides provider-specific model when set)."},{key:"search_embedding_corpus_max_characters",path:"search.embedding_corpus_max_characters",kind:"integer",min:1,summary:"Maximum semantic corpus characters per item before truncation."},{key:"search_embedding_batch_size",path:"search.embedding_batch_size",kind:"integer",min:1,summary:"Number of items embedded per request batch."},{key:"search_embedding_timeout_ms",path:"search.embedding_timeout_ms",kind:"integer",min:1,summary:"Per-request embedding timeout in milliseconds."},{key:"search_score_threshold",path:"search.score_threshold",kind:"number",summary:"Minimum score for a hit to be returned (0 keeps all matches)."},{key:"search_hybrid_semantic_weight",path:"search.hybrid_semantic_weight",kind:"ratio",summary:"Hybrid mode semantic weight in [0, 1] (1-weight goes to keyword)."},{key:"search_max_results",path:"search.max_results",kind:"integer",min:1,summary:"Default upper bound on search hits when --limit is not supplied."},{key:"search_bm25_k1",path:"search.bm25.k1",kind:"number",min:0,summary:"Offline BM25 term-frequency saturation (k1); higher saturates repeated terms slower (default 1.2)."},{key:"search_bm25_b",path:"search.bm25.b",kind:"ratio",summary:"Offline BM25 document-length normalization (b) in [0, 1]; 0 disables, 1 fully normalizes (default 0.75)."},{key:"openai_base_url",path:"providers.openai.base_url",kind:"string",summary:"OpenAI-compatible API base URL (LM Studio/vLLM also use this)."},{key:"openai_api_key",path:"providers.openai.api_key",kind:"string",summary:"OpenAI-compatible API key."},{key:"openai_model",path:"providers.openai.model",kind:"string",summary:"OpenAI-compatible embedding model name."},{key:"ollama_base_url",path:"providers.ollama.base_url",kind:"string",summary:"Ollama API base URL (typically http://localhost:11434)."},{key:"ollama_model",path:"providers.ollama.model",kind:"string",summary:"Ollama embedding model name (e.g. nomic-embed-text)."},{key:"vector_store_adapter",path:"vector_store.adapter",kind:"string",summary:"Vector store adapter name (lancedb, qdrant, or an extension adapter)."},{key:"vector_store_collection_name",path:"vector_store.collection_name",kind:"string",non_empty:!0,summary:"Vector collection/table name shared by Qdrant and LanceDB adapters."},{key:"qdrant_url",path:"vector_store.qdrant.url",kind:"string",summary:"Qdrant HTTP API URL."},{key:"qdrant_api_key",path:"vector_store.qdrant.api_key",kind:"string",summary:"Qdrant API key (empty if running unauthenticated)."},{key:"lancedb_path",path:"vector_store.lancedb.path",kind:"string",summary:"LanceDB storage path (relative to pm root or absolute)."},{key:"id_prefix",path:"id_prefix",kind:"string",non_empty:!0,summary:'Prefix for generated item IDs (e.g. "pm" produces pm-xxxx).'},{key:"author_default",path:"author_default",kind:"string",non_empty:!0,summary:"Default author recorded on mutations when --author is not supplied."},{key:"agent_identity_probes_enabled",path:"agent_identity.probes_enabled",kind:"boolean",summary:"Allow privacy-bounded local harness provenance probes; no network or subprocess access is permitted."},{key:"mutation_guard_require_attributed_author",path:"mutation_guard.require_attributed_author",kind:"boolean",summary:"Reject mutations whose effective author resolves to unknown."},{key:"mutation_guard_secret_guard",path:"mutation_guard.secret_guard",kind:"string",choices:["off","advise","block"],summary:"Detect credential-shaped mutation content: off, advise, or block."},{key:"mutation_guard_stale_in_progress_hours",path:"mutation_guard.stale_in_progress_hours",kind:"integer",min:1,summary:"Age threshold for unclaimed in-progress work surfaced by health."},{key:"governance_duplicate_detection_mode",path:"governance.duplicate_detection_mode",kind:"string",choices:["off","advisory","strict"],summary:"Create/copy duplicate governance: off, advisory, or strict explicit-bypass enforcement."},{key:"governance_duplicate_detection_threshold",path:"governance.duplicate_detection_threshold",kind:"ratio",summary:"Minimum shared similarity score in [0, 1] for create/copy duplicate governance."},{key:"governance_duplicate_detection_limit",path:"governance.duplicate_detection_limit",kind:"integer",min:0,max:20,summary:"Maximum likely duplicates returned by create/copy governance (0-20)."},{key:"output_default_format",path:"output.default_format",kind:"string",choices:["toon","json"],summary:"Default output format for commands that support it: toon or json."},{key:"ux_deprecation_hints",path:"ux.deprecation_hints",kind:"boolean",summary:"Emit one stderr migration hint for deprecated command aliases."},{key:"locks_ttl_seconds",path:"locks.ttl_seconds",kind:"integer",min:1,summary:"Claim/lock time-to-live in seconds before a stale lock can be reclaimed."},{key:"locks_wait_ms",path:"locks.wait_ms",kind:"integer",min:0,summary:"Wait budget in milliseconds before a contended lock fails with lock_conflict; item-store mutations, restore and the hierarchy lock treat it as a no-progress window that each observed owner handoff restarts (120 s total cap), other locks as a fixed total; 0 fails fast. PM_LOCK_WAIT_MS overrides per invocation."},{key:"ids_token_length",path:"ids.token_length",kind:"integer",min:4,max:12,summary:"Random base36 token length for newly minted item ids (4-12, default 4). Raise it to shrink cross-branch id collision odds in concurrent multi-agent workflows (pm-pibw)."},{key:"checkpoints_retention_days",path:"checkpoints.retention_days",kind:"integer",min:1,summary:"Age in days above which pm gc --scope checkpoints prunes bulk-mutation rollback checkpoints."},{key:"schema_unknown_field_policy",path:"schema.unknown_field_policy",kind:"string",choices:["allow","warn","reject"],summary:"How item I/O handles metadata keys not in the field registry: allow, warn, or reject."},{key:"history_compact_policy_enabled",path:"history.compact_policy.enabled",kind:"boolean",summary:"Enable the history-compaction advisory: pm health warns on over-threshold streams."},{key:"history_compact_policy_max_entries",path:"history.compact_policy.max_entries",kind:"integer",min:1,summary:"Entry count above which a history stream is flagged (and the default pm history-compact --all-over threshold)."},{key:"history_compact_policy_trigger",path:"history.compact_policy.trigger",kind:"string",choices:["health_warn","auto"],summary:"History-compaction policy intent: health_warn (advisory only) or auto (scheduled sweeps expected)."}],DESCRIPTOR_BY_KEY=new Map(NESTED_SETTING_DESCRIPTORS.flatMap(descriptor=>[[descriptor.key,descriptor],[descriptor.path.toLowerCase().replaceAll("-","_"),descriptor]]));function resolveNestedSettingDescriptor(raw){if(typeof raw!="string")return;const normalized=raw.trim().toLowerCase().replaceAll("-","_");if(normalized.length!==0)return DESCRIPTOR_BY_KEY.get(normalized)}function parseNestedBooleanValue(descriptor,rawValue){const normalized=rawValue.trim().toLowerCase();return normalized==="true"||normalized==="1"||normalized==="yes"||normalized==="on"?{ok:!0,parsed:{descriptor,value:!0}}:normalized==="false"||normalized==="0"||normalized==="no"||normalized==="off"?{ok:!0,parsed:{descriptor,value:!1}}:{ok:!1,error:{message:`Config set ${descriptor.key} requires a boolean value (true|false), got "${rawValue}"`}}}function parseNestedStringValue(descriptor,rawValue,trimmed){return descriptor.non_empty===!0&&trimmed.length===0?{ok:!1,error:{message:`Config set ${descriptor.key} requires a non-empty value`}}:descriptor.choices&&!descriptor.choices.includes(trimmed)?{ok:!1,error:{message:`Config set ${descriptor.key} must be one of ${descriptor.choices.join("|")}, got "${rawValue}"`}}:{ok:!0,parsed:{descriptor,value:trimmed}}}function parseFiniteNestedNumber(descriptor,rawValue,trimmed){if(trimmed.length===0)return{ok:!1,error:{message:`Config set ${descriptor.key} requires a non-empty value`}};const parsed=Number(trimmed);return Number.isFinite(parsed)?{ok:!0,value:parsed}:{ok:!1,error:{message:`Config set ${descriptor.key} requires a finite number, got "${rawValue}"`}}}function parseNestedIntegerValue(descriptor,rawValue,value){return!Number.isInteger(value)||value<0?{ok:!1,error:{message:`Config set ${descriptor.key} requires a non-negative integer, got "${rawValue}"`}}:descriptor.min!==void 0&&value<descriptor.min?{ok:!1,error:{message:`Config set ${descriptor.key} requires an integer >= ${descriptor.min}, got "${rawValue}" (the runtime silently ignores 0 here and falls back to the default)`}}:descriptor.max!==void 0&&value>descriptor.max?{ok:!1,error:{message:`Config set ${descriptor.key} requires an integer <= ${descriptor.max}, got "${rawValue}"`}}:{ok:!0,parsed:{descriptor,value}}}function parseNestedRatioValue(descriptor,rawValue,value){return value<0||value>1?{ok:!1,error:{message:`Config set ${descriptor.key} requires a number in [0, 1], got "${rawValue}"`}}:{ok:!0,parsed:{descriptor,value}}}function parseNestedNumberValue(descriptor,rawValue,value){return descriptor.min!==void 0&&value<descriptor.min?{ok:!1,error:{message:`Config set ${descriptor.key} requires a number >= ${descriptor.min}, got "${rawValue}"`}}:{ok:!0,parsed:{descriptor,value}}}function parseNestedSettingValue(descriptor,rawValue){if(typeof rawValue!="string")return{ok:!1,error:{message:`Config set ${descriptor.key} requires a string value`}};const trimmed=rawValue.trim();if(descriptor.kind==="boolean")return parseNestedBooleanValue(descriptor,rawValue);if(descriptor.kind==="string")return parseNestedStringValue(descriptor,rawValue,trimmed);const parsed=parseFiniteNestedNumber(descriptor,rawValue,trimmed);return parsed.ok?descriptor.kind==="integer"?parseNestedIntegerValue(descriptor,rawValue,parsed.value):descriptor.kind==="ratio"?parseNestedRatioValue(descriptor,rawValue,parsed.value):parseNestedNumberValue(descriptor,rawValue,parsed.value):{ok:!1,error:parsed.error}}function readNestedSettingValue(settings,descriptor){const segments=descriptor.path.split(".");let cursor=settings;for(const segment of segments){if(typeof cursor!="object"||cursor===null)return null;const property=Object.getOwnPropertyDescriptor(cursor,segment);if(!property||!Object.hasOwn(property,"value"))return null;cursor=property.value}return typeof cursor=="string"||typeof cursor=="number"||typeof cursor=="boolean"?cursor:null}function writeNestedSettingValue(settings,descriptor,value){const segments=descriptor.path.split(".");if(segments.some(segment=>segment.length===0||["__proto__","constructor","prototype"].includes(segment)))throw new Error("Unsafe settings path");let cursor=settings;for(let index=0;index<segments.length-1;index+=1){const segment=segments[index],existing=Object.getOwnPropertyDescriptor(cursor,segment)?.value;if(typeof existing!="object"||existing===null||Array.isArray(existing)){const next={};Object.defineProperty(cursor,segment,{value:next,writable:!0,enumerable:!0,configurable:!0}),cursor=next}else cursor=existing}const leafKey=segments[segments.length-1];return Object.getOwnPropertyDescriptor(cursor,leafKey)?.value===value?!1:(Object.defineProperty(cursor,leafKey,{value,writable:!0,enumerable:!0,configurable:!0}),!0)}export{NESTED_SETTING_DESCRIPTORS,parseNestedSettingValue,readNestedSettingValue,resolveNestedSettingDescriptor,writeNestedSettingValue};
2
2
  //# sourceMappingURL=nested-settings.js.map
@@ -1,2 +1,2 @@
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]="187f03b7-1a62-500c-9ebf-4d5a053afa74")}catch{}})();import fs from"node:fs/promises";import path from"node:path";import{pathToFileURL}from"node:url";import{createRelationshipKindRegistry}from"../../sdk/relationships.js";import{pathExists}from"../fs/fs-utils.js";import{isPathWithinDirectory}from"../fs/path-utils.js";import{isHostOutputSuppressed,suppressHostOutput}from"../output/output-control.js";import{resolvePmPackageRootFromModule}from"../packages/root.js";import{asRecordLoose,resolveActivatablePropertyRecord}from"../shared/primitives.js";import{resolveGlobalPmRoot}from"../store/paths.js";import{captureExtensionActivationRollback}from"./activation-transaction.js";import{assertCommandDefinitionMetadataStrings}from"./command-visibility-tier.js";import{normalizeExtensionReadOutput}from"./read-output-contract.js";import{normalizeExtensionContributionInventory}from"./contribution-inventory.js";import{buildImportExportContext,resolveImportExportArtifactOutput}from"./exporter-output-contract.js";import{buildReadyExtensionCandidate}from"./extension-candidate.js";import{collectUnknownExtensionCapabilities,formatLegacyExtensionCapabilityAliasWarning,formatUnknownExtensionCapabilityWarning,isKnownExtensionCapability,normalizeNames}from"./extension-capability-aliases.js";import{evaluateExtensionPolicyForCapability,evaluateExtensionPolicyForExtension,evaluateExtensionPolicyForRegistration,hydrateExtensionPolicy,normalizeExtensionPolicy,serializeExtensionPolicy}from"./extension-policy.js";import{createEmptyExtensionCommandRegistry,createEmptyExtensionHookRegistry,createEmptyExtensionParserRegistry,createEmptyExtensionPreflightRegistry,createEmptyExtensionRegistrationRegistry,createEmptyExtensionRendererRegistry,createEmptyExtensionServiceRegistry}from"./extension-registries.js";import{normalizeCommandName}from"./extension-runtime-helpers.js";import{KNOWN_EXTENSION_CAPABILITIES,KNOWN_EXTENSION_SERVICE_NAMES,createDefaultExtensionGovernancePolicy}from"./extension-types.js";import{parseExtensionManifestDocument}from"./manifest-parser.js";import{formatExtensionManifestSchemaWarnings}from"./manifest-schema.js";import{snapshotExtensionModuleGraph}from"./module-graph-snapshot.js";import{collectPreflightCollisionWarnings,normalizePreflightOverride}from"./preflight-ownership.js";import{applyProjectProfileDefaults,assertFlagValueTypeAndDefault,normalizeCommandDefinitionArguments,normalizeFlagDefinitions,resolveCommandDefinitionAction,validateFlagDefinitions,validateItemFieldDefinitions,validateItemTypeDefinitions,validateMigrationDefinition,validateProjectProfileDefinition}from"./registration-contracts.js";import{assertOptionalStringField,normalizeOptionalStringArrayField}from"./registration-validation.js";import{assertHookHandler,assertNonEmptyRegistrationString,assertRegistrationFunction,attachRuntimeDefinition,cloneRuntimeRegistrationValue,createRegistrationValidationError,extractRegistrationValidationTrace,isExtensionServiceName,isOutputRendererFormat,normalizeRegistrationName,normalizeRegistrationRecord,normalizeRegistrationRecordList,normalizeRuntimeRegistrationRecord,sanitizeRegistrationValue,toRegistrationCommandPath,validateAssuranceMeasurementProviderDefinition}from"./registration-values.js";import{normalizeServiceOverrideOwnership}from"./service-ownership.js";import{compareComparableVersions,evaluatePmMaxVersionBound,evaluatePmMinVersionBound,parseComparableVersion}from"./version-compat.js";import{parseLegacyExtensionCapabilityAliasWarning,parseUnknownExtensionCapabilityWarning}from"./extension-capability-aliases.js";import{createEmptyExtensionCommandRegistry as createEmptyExtensionCommandRegistry2,createEmptyExtensionHookRegistry as createEmptyExtensionHookRegistry2,createEmptyExtensionParserRegistry as createEmptyExtensionParserRegistry2,createEmptyExtensionPreflightRegistry as createEmptyExtensionPreflightRegistry2,createEmptyExtensionRegistrationRegistry as createEmptyExtensionRegistrationRegistry2,createEmptyExtensionRendererRegistry as createEmptyExtensionRendererRegistry2,createEmptyExtensionServiceRegistry as createEmptyExtensionServiceRegistry2}from"./extension-registries.js";import{runAfterCommandHooks,runBeforeCommandHooks,runBeforeMutationHooks,runCommandHandler,runCommandOverride,runOnIndexHooks,runOnReadHooks,runOnWriteHooks,runParserOverride,runPreflightOverride,runRendererOverride,runServiceOverride,runServiceOverrideSync}from"./extension-hook-runtime.js";export*from"./extension-types.js";import{DEFAULT_EXTENSION_PRIORITY,parseExtensionManifestDocument as parseExtensionManifestDocument2}from"./manifest-parser.js";let currentPmCliVersionPromise=null;const DEFAULT_EXTENSION_POLICY=Object.freeze(createDefaultExtensionGovernancePolicy());let extensionReloadEpoch=0;function nextExtensionReloadToken(seed=Date.now()){return extensionReloadEpoch+=1,`${extensionReloadEpoch}-${seed}`}function shouldEnable(name,enabled,disabled){return disabled.has(name)?!1:enabled.size===0?!0:enabled.has(name)}async function isCanonicalPathWithinDirectory(directory,targetPath){const[resolvedDirectory,resolvedTargetPath]=await Promise.all([fs.realpath(directory),fs.realpath(targetPath)]);return isPathWithinDirectory(resolvedDirectory,resolvedTargetPath)}function resolveExtensionRoots(pmRoot,cwd=process.cwd()){return{global:path.join(resolveGlobalPmRoot(cwd),"extensions"),project:path.join(pmRoot,"extensions")}}async function listExtensionDirectories(extensionsRoot){try{return(await fs.readdir(extensionsRoot,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>entry.name).sort((a,b)=>a.localeCompare(b))}catch{return[]}}function summarizeCandidate(candidate){const summary={layer:candidate.layer,directory:candidate.directory,manifest_path:candidate.manifest_path,name:candidate.manifest.name,version:candidate.manifest.version,entry:candidate.manifest.entry,priority:candidate.manifest.priority,entry_path:candidate.entry_path,manifest_version:candidate.manifest.manifest_version,pm_min_version:candidate.manifest.pm_min_version,pm_max_version:candidate.manifest.pm_max_version,engines:candidate.manifest.engines,trusted:candidate.manifest.trusted,provenance:candidate.manifest.provenance,sandbox_profile:candidate.manifest.sandbox_profile,permissions:candidate.manifest.permissions,capabilities:[...candidate.manifest.capabilities],activation:candidate.manifest.activation?{commands:[...candidate.manifest.activation.commands]}:void 0,contributions:candidate.manifest.contributions??candidate.contributions};return candidate.source_package&&(summary.source_package=candidate.source_package),candidate.source_aliases&&(summary.source_aliases=[...candidate.source_aliases]),summary}function normalizeManagedSourcePackage(value){return typeof value=="string"&&value.trim().length>0?value.trim():void 0}async function readManagedExtensionSourcePackages(extensionsRoot){const packages=new Map;try{const parsed=JSON.parse(await fs.readFile(path.join(extensionsRoot,".managed-extensions.json"),"utf8")),entries=asRecordLoose(parsed)?.entries;if(!Array.isArray(entries))return packages;for(const entry of entries){if(typeof entry!="object"||entry===null)continue;const record=entry,sourcePackage=normalizeManagedSourcePackage(record.source?.package),aliases=[record.source?.input,record.source?.name,sourcePackage].map(value=>normalizeManagedSourcePackage(value)).filter(value=>value!==void 0),contributions=normalizeExtensionContributionInventory(record.contributions),identity={aliases:[...new Set(aliases)],...sourcePackage?{package_name:sourcePackage}:{},...contributions?{contributions}:{}};typeof record.directory=="string"&&record.directory.trim().length>0&&packages.set(`directory:${record.directory.trim()}`,identity),typeof record.name=="string"&&record.name.trim().length>0&&packages.set(`name:${record.name.trim()}`,identity)}}catch{return packages}return packages}function sortCandidates(candidates){return[...candidates].sort((left,right)=>{if(left.manifest.priority!==right.manifest.priority)return left.manifest.priority-right.manifest.priority;const byName=left.manifest.name.localeCompare(right.manifest.name);return byName!==0?byName:left.directory.localeCompare(right.directory)})}function buildEffectiveExtensions(globalCandidates,projectCandidates){const ordered=[...sortCandidates(globalCandidates),...sortCandidates(projectCandidates)],effective=[];for(const candidate of ordered){const existingIndex=effective.findIndex(entry=>entry.manifest.name===candidate.manifest.name);existingIndex>=0&&effective.splice(existingIndex,1),effective.push(candidate)}return effective}async function scanExtensionLayer(layer,extensionsRoot,enabled,disabled,pmMaxVersionExceededMode){const diagnostics=[],warnings=[],candidates=[],directories=await listExtensionDirectories(extensionsRoot),managedSourcePackages=await readManagedExtensionSourcePackages(extensionsRoot);for(const directory of directories){const scanned=await scanExtensionDirectory(layer,extensionsRoot,directory,enabled,disabled,managedSourcePackages,pmMaxVersionExceededMode);diagnostics.push(scanned.diagnostic),warnings.push(...scanned.warnings),scanned.candidate&&candidates.push(scanned.candidate)}return{diagnostics,warnings,candidates}}function emptyExtensionLayerScan(){return{diagnostics:[],warnings:[],candidates:[]}}function buildUnavailableExtensionScan(layer,directory,manifestPath,warning){return{diagnostic:{layer,directory,manifest_path:manifestPath,name:null,version:null,entry:null,priority:null,entry_path:null,enabled:null,status:"warn"},warnings:[warning],candidate:null}}function collectScannedExtensionWarnings(layer,manifest,rawManifest,entryWithinDirectory,entryExists,pmVersionCompatibility,pmMaxVersionCompatibility){const extensionWarnings=formatExtensionManifestSchemaWarnings(layer,manifest,rawManifest);Array.isArray(manifest.legacy_capability_aliases)&&manifest.legacy_capability_aliases.length>0&&extensionWarnings.push(formatLegacyExtensionCapabilityAliasWarning(layer,manifest.name,manifest.legacy_capability_aliases));for(const capability of collectUnknownExtensionCapabilities(manifest.capabilities))extensionWarnings.push(formatUnknownExtensionCapabilityWarning(layer,manifest.name,capability));return entryWithinDirectory?entryExists||extensionWarnings.push(`extension_entry_missing:${layer}:${manifest.name}`):extensionWarnings.push(`extension_entry_outside_extension:${layer}:${manifest.name}`),pmVersionCompatibility.warning&&extensionWarnings.push(pmVersionCompatibility.warning),pmMaxVersionCompatibility.warning&&extensionWarnings.push(pmMaxVersionCompatibility.warning),extensionWarnings}async function scanExtensionDirectory(layer,extensionsRoot,directory,enabled,disabled,managedSourcePackages,pmMaxVersionExceededMode){const extensionDir=path.join(extensionsRoot,directory),manifestPath=path.join(extensionDir,"manifest.json");if(!await pathExists(manifestPath))return buildUnavailableExtensionScan(layer,directory,manifestPath,`extension_manifest_missing:${layer}:${directory}`);let manifest,rawManifest;try{const parsed=JSON.parse(await fs.readFile(manifestPath,"utf8"));rawManifest=asRecordLoose(parsed),manifest=parseExtensionManifestDocument(parsed)}catch{rawManifest=null,manifest=null}if(!manifest||!rawManifest)return buildUnavailableExtensionScan(layer,directory,manifestPath,`extension_manifest_invalid:${layer}:${directory}`);const entryPath=path.resolve(extensionDir,manifest.entry),entryWithinDirectoryByPath=isPathWithinDirectory(extensionDir,entryPath),entryExists=entryWithinDirectoryByPath?await pathExists(entryPath):!1,entryWithinDirectory=entryWithinDirectoryByPath&&entryExists?await isCanonicalPathWithinDirectory(extensionDir,entryPath):entryWithinDirectoryByPath,enabledForLoad=shouldEnable(manifest.name,enabled,disabled),pmVersionCompatibility=await evaluatePmMinVersionCompatibility(layer,manifest),pmMaxVersionCompatibility=await evaluatePmMaxVersionCompatibility(layer,manifest,pmMaxVersionExceededMode),extensionWarnings=collectScannedExtensionWarnings(layer,manifest,rawManifest,entryWithinDirectory,entryExists,pmVersionCompatibility,pmMaxVersionCompatibility),extensionReady=entryWithinDirectory&&entryExists&&pmVersionCompatibility.allowed&&pmMaxVersionCompatibility.allowed,sourceIdentity=managedSourcePackages.get(`directory:${directory}`)??managedSourcePackages.get(`name:${manifest.name}`);return{diagnostic:{layer,directory,manifest_path:manifestPath,name:manifest.name,version:manifest.version,entry:manifest.entry,priority:manifest.priority,entry_path:entryPath,enabled:enabledForLoad,status:extensionReady?"ok":"warn"},warnings:extensionWarnings,candidate:buildReadyExtensionCandidate({layer,directory,manifestPath,entryPath,manifest,sourceIdentity,extensionReady,enabledForLoad})}}async function discoverExtensions(options){const roots=resolveExtensionRoots(options.pmRoot,options.cwd??process.cwd()),configured_enabled=normalizeNames(options.settings.extensions.enabled),configured_disabled=normalizeNames(options.settings.extensions.disabled),policy=normalizeExtensionPolicy(options.settings),serializedPolicy=serializeExtensionPolicy(policy);if(options.noExtensions)return{disabled_by_flag:!0,roots,configured_enabled,configured_disabled,discovered:[],effective:[],warnings:[...policy.warnings],policy:serializedPolicy};const enabled=new Set(configured_enabled),disabled=new Set(configured_disabled),globalScan=options.ignoreGlobalExtensions===!0?emptyExtensionLayerScan():await scanExtensionLayer("global",roots.global,enabled,disabled,policy.pmMaxVersionExceededMode.global),projectScan=await scanExtensionLayer("project",roots.project,enabled,disabled,policy.pmMaxVersionExceededMode.project),policyWarnings=[...policy.warnings],effectiveCandidates=buildEffectiveExtensions(globalScan.candidates,projectScan.candidates),effective=[];for(const candidate of effectiveCandidates){const extensionRef={layer:candidate.layer,name:candidate.manifest.name,trusted:candidate.manifest.trusted===!0,provenanceVerified:candidate.manifest.provenance?.verified===!0,sandboxProfile:candidate.manifest.sandbox_profile,permissions:candidate.manifest.permissions&&typeof candidate.manifest.permissions=="object"?{fs_read:candidate.manifest.permissions.fs_read,fs_write:candidate.manifest.permissions.fs_write,network:candidate.manifest.permissions.network,env_read:candidate.manifest.permissions.env_read,env_write:candidate.manifest.permissions.env_write,process_spawn:candidate.manifest.permissions.process_spawn}:void 0},extensionDecision=evaluateExtensionPolicyForExtension(policy,extensionRef);if(extensionDecision.warning&&policyWarnings.push(extensionDecision.warning),!!extensionDecision.allowed){for(const capability of candidate.manifest.capabilities){const capabilityDecision=evaluateExtensionPolicyForCapability(policy,extensionRef,capability);capabilityDecision.warning&&policyWarnings.push(capabilityDecision.warning)}effective.push(summarizeCandidate(candidate))}}return{disabled_by_flag:!1,roots,configured_enabled,configured_disabled,discovered:[...globalScan.diagnostics,...projectScan.diagnostics],effective,warnings:[...new Set([...globalScan.warnings,...projectScan.warnings,...policyWarnings])],policy:serializedPolicy}}function formatUnknownError(error){return error instanceof Error&&error.message.trim().length>0?error.message:String(error)}async function readCurrentPmCliVersion(){try{const packageRoot=resolvePmPackageRootFromModule(import.meta.url,["../../.."]),raw=await fs.readFile(path.join(packageRoot,"package.json"),"utf8"),parsed=JSON.parse(raw);return typeof parsed.version=="string"&&parsed.version.trim().length>0?parsed.version.trim():null}catch{return null}}function resolveCurrentPmCliVersion(){return currentPmCliVersionPromise??=readCurrentPmCliVersion(),currentPmCliVersionPromise}function formatPmVersionCompatibilityWarning(layer,manifest,evaluation){const current=evaluation.current??"unknown";if(evaluation.kind==="pm_min_version")switch(evaluation.status){case"invalid":return`extension_pm_min_version_invalid:${layer}:${manifest.name}:required=${evaluation.required}`;case"unchecked":return`extension_pm_min_version_unchecked:${layer}:${manifest.name}:required=${evaluation.required}:current=${current}`;case"unmet":return`extension_pm_min_version_unmet:${layer}:${manifest.name}:required=${evaluation.required}:current=${current}`;default:return}switch(evaluation.status){case"invalid":return`extension_pm_max_version_invalid:${layer}:${manifest.name}:allowed=${evaluation.required}`;case"unchecked":return`extension_pm_max_version_unchecked:${layer}:${manifest.name}:allowed=${evaluation.required}:current=${current}`;case"exceeded_warn":return`extension_pm_max_version_exceeded_warn:${layer}:${manifest.name}:allowed=${evaluation.required}:current=${current}`;case"exceeded":return`extension_pm_max_version_exceeded:${layer}:${manifest.name}:allowed=${evaluation.required}:current=${current}`;default:return}}async function evaluatePmMinVersionCompatibility(layer,manifest){if(manifest.pm_min_version===void 0)return{allowed:!0};const evaluation=evaluatePmMinVersionBound(manifest.pm_min_version,await resolveCurrentPmCliVersion()),warning=formatPmVersionCompatibilityWarning(layer,manifest,evaluation);return warning?{allowed:evaluation.allowed,warning}:{allowed:evaluation.allowed}}async function evaluatePmMaxVersionCompatibility(layer,manifest,exceededMode){if(manifest.pm_max_version===void 0)return{allowed:!0};const evaluation=evaluatePmMaxVersionBound(manifest.pm_max_version,await resolveCurrentPmCliVersion(),exceededMode),warning=formatPmVersionCompatibilityWarning(layer,manifest,evaluation);return warning?{allowed:evaluation.allowed,warning}:{allowed:evaluation.allowed}}async function fingerprintPath(pathToInspect){try{const stats=await fs.stat(pathToInspect);return`${Math.trunc(stats.mtimeMs)}-${stats.size}`}catch{return"missing"}}async function resolveExtensionImportHref(extension,options){let importEntryPath=extension.entry_path;options.module_graph_snapshot_root&&(importEntryPath=await snapshotExtensionModuleGraph(options.module_graph_snapshot_root,extension));const baseUrl=new URL(pathToFileURL(importEntryPath).href);if(!(options.cache_bust===!0||typeof options.reload_token=="string"))return baseUrl.href;const[entryFingerprint,manifestFingerprint]=await Promise.all([fingerprintPath(extension.entry_path),fingerprintPath(extension.manifest_path)]),reloadToken=options.reload_token??nextExtensionReloadToken();return baseUrl.searchParams.set("pm_ext_reload",reloadToken),baseUrl.searchParams.set("pm_ext_entry",entryFingerprint),baseUrl.searchParams.set("pm_ext_manifest",manifestFingerprint),baseUrl.href}async function loadExtensions(options){const discovery=await discoverExtensions(options),loaded=[],failed=[],warnings=[...discovery.warnings];if(discovery.disabled_by_flag)return{...discovery,warnings,loaded,failed};const extensionsToLoad=typeof options.extensionFilter=="function"?discovery.effective.filter(options.extensionFilter):discovery.effective;for(const extension of extensionsToLoad)try{const module=await import(await resolveExtensionImportHref(extension,options));loaded.push({...extension,module})}catch(error){warnings.push(`extension_load_failed:${extension.layer}:${extension.name}`),failed.push({layer:extension.layer,name:extension.name,entry_path:extension.entry_path,error:formatUnknownError(error)})}return{...discovery,warnings,loaded,failed}}const DEFAULT_EXTENSION_DEACTIVATE_TIMEOUT_MS=5e3,MAX_EXTENSION_DEACTIVATE_TIMEOUT_MS=2147483647;function toActivatableExtension(source){const activatable={activate:source.activate.bind(source)};if(typeof source.deactivate=="function"){const deactivate=source.deactivate;activatable.deactivate=deactivate.bind(source)}return activatable}function resolveActivatableExtension(module){const activatableRecord=resolveActivatablePropertyRecord(module);return activatableRecord?toActivatableExtension(activatableRecord):null}async function deactivateExtensions(loadResult,activationResult,options={}){const timeoutMs=normalizeExtensionDeactivateTimeout(options?.deactivate_timeout_ms),failedActivationKeys=new Set((activationResult?.failed??[]).map(entry=>`${entry.layer}:${entry.name}`)),targets=[];for(const extension of loadResult.loaded){if(failedActivationKeys.has(`${extension.layer}:${extension.name}`))continue;const activatable=resolveActivatableExtension(extension.module);!activatable||typeof activatable.deactivate!="function"||targets.push({extension,deactivate:activatable.deactivate})}const outcomes=await Promise.all(targets.map(async({extension,deactivate})=>{try{return await runExtensionDeactivateWithTimeout(deactivate,timeoutMs),{ok:!0}}catch(error){return{ok:!1,layer:extension.layer,name:extension.name,error:formatUnknownError(error)}}})),warnings=[],failed=[];let deactivated=0;for(const outcome of outcomes){if(outcome.ok){deactivated+=1;continue}warnings.push(`extension_deactivate_failed:${outcome.layer}:${outcome.name}`),failed.push({layer:outcome.layer,name:outcome.name,error:outcome.error})}return{deactivated,warnings,failed}}function normalizeExtensionDeactivateTimeout(rawTimeout){return typeof rawTimeout!="number"||rawTimeout<0?DEFAULT_EXTENSION_DEACTIVATE_TIMEOUT_MS:rawTimeout===0||rawTimeout===1/0?0:Number.isFinite(rawTimeout)?Math.min(MAX_EXTENSION_DEACTIVATE_TIMEOUT_MS,Math.max(1,Math.floor(rawTimeout))):DEFAULT_EXTENSION_DEACTIVATE_TIMEOUT_MS}async function runExtensionDeactivateWithTimeout(deactivate,timeoutMs){if(timeoutMs===0){await deactivate();return}let timeoutHandle;try{const deactivatePromise=Promise.resolve().then(()=>deactivate());deactivatePromise.catch(()=>{}),await Promise.race([deactivatePromise,new Promise((_,reject)=>{timeoutHandle=setTimeout(()=>{reject(new Error(`extension deactivate timed out after ${timeoutMs}ms`))},timeoutMs),timeoutHandle.unref?.()})])}finally{clearTimeout(timeoutHandle)}}function getDeclaredExtensionCapabilities(extension){if(!Array.isArray(extension.capabilities))return null;const declared=new Set;for(const capability of extension.capabilities){const normalized=capability.trim().toLowerCase();isKnownExtensionCapability(normalized)&&declared.add(normalized)}return declared}function assertExtensionCapability(extension,capability,method){const declared=getDeclaredExtensionCapabilities(extension);if(declared!==null&&!declared.has(capability))throw createRegistrationValidationError(`${method} requires capability '${capability}' in extension manifest capabilities`,{method,registration_index:-1,capability,missing_capability:capability,expected_schema:`"capabilities": [..., "${capability}"]`,received:extension.capabilities,hint:`Add "${capability}" to ${extension.name} manifest capabilities, or remove the ${method} registration call.`})}function buildExtensionSelfIdentity(extension){return Object.freeze({name:extension.name,layer:extension.layer,version:extension.version,capabilities:Object.freeze((extension.capabilities??[]).filter(capability=>KNOWN_EXTENSION_CAPABILITIES.includes(capability))),pm_min_version:extension.pm_min_version,pm_max_version:extension.pm_max_version,source_package:extension.source_package})}function buildPolicyExtensionRef(extension){return{layer:extension.layer,name:extension.name,trusted:extension.trusted===!0,provenanceVerified:extension.provenance?.verified===!0,sandboxProfile:extension.sandbox_profile,permissions:extension.permissions&&typeof extension.permissions=="object"?{fs_read:extension.permissions.fs_read,fs_write:extension.permissions.fs_write,network:extension.permissions.network,env_read:extension.permissions.env_read,env_write:extension.permissions.env_write,process_spawn:extension.permissions.process_spawn}:void 0}}class ExtensionApiRegistrar{extension;hooks;#loadedExtension;#extensionRef;#hookRegistry;#commandRegistry;#parserRegistry;#preflightRegistry;#serviceRegistry;#rendererRegistry;#registrationRegistry;#activationWarnings;#activationFailures;#policy;constructor(extension,hooks,commands,parsers,preflight,services,renderers,registrations,activationWarnings,activationFailures,policy){this.#loadedExtension=extension,this.extension=buildExtensionSelfIdentity(extension),this.#extensionRef=buildPolicyExtensionRef(extension),this.#hookRegistry=hooks,this.#commandRegistry=commands,this.#parserRegistry=parsers,this.#preflightRegistry=preflight,this.#serviceRegistry=services,this.#rendererRegistry=renderers,this.#registrationRegistry=registrations,this.#activationWarnings=activationWarnings,this.#activationFailures=activationFailures,this.#policy=policy,this.registerCommand=this.registerCommand.bind(this),this.registerParser=this.registerParser.bind(this),this.registerPreflight=this.registerPreflight.bind(this),this.registerService=this.registerService.bind(this),this.registerFlags=this.registerFlags.bind(this),this.registerItemFields=this.registerItemFields.bind(this),this.registerItemTypes=this.registerItemTypes.bind(this),this.registerRelationshipKinds=this.registerRelationshipKinds.bind(this),this.registerMigration=this.registerMigration.bind(this),this.registerProfile=this.registerProfile.bind(this),this.registerRenderer=this.registerRenderer.bind(this),this.registerImporter=this.registerImporter.bind(this),this.registerExporter=this.registerExporter.bind(this),this.registerSearchProvider=this.registerSearchProvider.bind(this),this.registerVectorStoreAdapter=this.registerVectorStoreAdapter.bind(this),this.registerAssuranceMeasurementProvider=this.registerAssuranceMeasurementProvider.bind(this),this.hooks={beforeCommand:hook=>this.registerBeforeCommand(hook),beforeMutation:hook=>this.registerBeforeMutation(hook),afterCommand:hook=>this.registerAfterCommand(hook),onWrite:hook=>this.registerOnWrite(hook),onRead:hook=>this.registerOnRead(hook),onIndex:hook=>this.registerOnIndex(hook)}}allowRegistration(surface,method,capability,details){const decision=evaluateExtensionPolicyForRegistration(this.#policy,this.#extensionRef,surface,method,capability,details);return decision.warning&&this.#activationWarnings.push(decision.warning),decision.allowed}registerCommandTrace(mode,command,expectedSchema,received,hint){return{method:"registerCommand",registration_index:mode==="override"?this.#commandRegistry.overrides.length:this.#commandRegistry.handlers.length,command,expected_schema:expectedSchema,received:sanitizeRegistrationValue(received),hint}}registerCommandOverride(command,override){const normalizedCommand=normalizeCommandName(command);if(normalizedCommand.length===0)throw createRegistrationValidationError("registerCommand requires a non-empty command name",this.registerCommandTrace("override",command,'registerCommand("<command>", (context) => unknown)',command,"Provide a non-empty command path as the first argument."));if(typeof override!="function"){const trace=this.registerCommandTrace("override",normalizedCommand,'registerCommand("<command>", (context) => unknown)',override,"Provide a function as the second registerCommand argument.");throw createRegistrationValidationError(`registerCommand requires an override function when command name is provided (command="${normalizedCommand}", registration_index=${trace.registration_index})`,trace)}this.allowRegistration("commands.override","registerCommand","commands",{command:normalizedCommand})&&this.#commandRegistry.overrides.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,command:normalizedCommand,run:override})}resolveCommandDefinitionRunHandler(definition,normalizedCommand){const runHandler=typeof definition.run=="function"?definition.run:void 0,legacyHandler=typeof definition.handler=="function"?definition.handler:void 0;return!runHandler&&legacyHandler&&this.#activationWarnings.push(`extension_command_definition_legacy_handler_alias:${this.#loadedExtension.layer}:${this.#loadedExtension.name}:${normalizedCommand}`),runHandler??legacyHandler}registerCommandDefinition(definition){if(typeof definition!="object"||definition===null)throw createRegistrationValidationError("registerCommand requires a command definition object",this.registerCommandTrace("definition",void 0,"{ name: string; run: (context) => unknown; }",definition,'Use registerCommand({ name: "command path", run: (context) => ... }).'));if(typeof definition.name!="string")throw createRegistrationValidationError("registerCommand requires a command definition name",this.registerCommandTrace("definition",void 0,"{ name: string; run: (context) => unknown; }",definition,"Set command definition.name to a non-empty string command path."));const normalizedCommand=normalizeCommandName(definition.name);if(normalizedCommand.length===0)throw createRegistrationValidationError("registerCommand requires a non-empty command definition name",this.registerCommandTrace("definition",definition.name,"{ name: string; run: (context) => unknown; }",definition,"Ensure command definition.name contains a non-empty command path."));const resolvedHandler=this.resolveCommandDefinitionRunHandler(definition,normalizedCommand);if(typeof resolvedHandler!="function"){const trace=this.registerCommandTrace("definition",normalizedCommand,"{ name: string; run: (context) => unknown; }",resolvedHandler,"Define command definition.run as a function.");throw createRegistrationValidationError(`registerCommand requires a command definition run handler (command="${normalizedCommand}", registration_index=${trace.registration_index})`,trace)}try{assertCommandDefinitionMetadataStrings(definition);const action=resolveCommandDefinitionAction(normalizedCommand,definition.action),readOutput=normalizeExtensionReadOutput(definition.read_output,normalizedCommand,action);if(!this.allowRegistration("commands.handler","registerCommand","commands",{command:normalizedCommand,action}))return;const description=definition.description?.trim(),intent=definition.intent?.trim(),examples=normalizeOptionalStringArrayField("registerCommand definition.examples",definition.examples),failureHints=normalizeOptionalStringArrayField("registerCommand definition.failure_hints",definition.failure_hints),argumentsDefinition=normalizeCommandDefinitionArguments(definition.arguments);definition.flags!==void 0&&(assertExtensionCapability(this.#loadedExtension,"schema","registerCommand flags"),this.allowRegistration("schema.flags","registerCommand flags","schema")&&(validateFlagDefinitions(definition.flags),this.#registrationRegistry.flags.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,target_command:normalizedCommand,flags:normalizeFlagDefinitions("registerCommand definition.flags",definition.flags)})));const registration={read_output:readOutput,layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,source_package:this.#loadedExtension.source_package,command:normalizedCommand,action,examples,failure_hints:failureHints,arguments:argumentsDefinition,tier:definition.tier??"standard",family:definition.family??"extensions"};description&&(registration.description=description),intent&&(registration.intent=intent),this.#registrationRegistry.commands.push(registration)}catch(error){const reason=formatUnknownError(error),trace=this.registerCommandTrace("definition",normalizedCommand,"{ name: string; run: (context) => unknown; action?: string; arguments?: object[]; flags?: object[]; }",definition,reason),validationError=createRegistrationValidationError(`registerCommand definition metadata invalid (command="${normalizedCommand}", registration_index=${trace.registration_index}): ${reason}`,trace);this.#activationWarnings.push(`extension_command_quarantined:${this.#loadedExtension.layer}:${this.#loadedExtension.name}:${normalizedCommand}`),this.#activationFailures.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,entry_path:this.#loadedExtension.entry_path,error:validationError.message,trace});return}this.#commandRegistry.handlers.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,command:normalizedCommand,run:resolvedHandler})}registerCommand(commandOrDefinition,override){if(assertExtensionCapability(this.#loadedExtension,"commands","registerCommand"),typeof commandOrDefinition=="string"){this.registerCommandOverride(commandOrDefinition,override);return}this.registerCommandDefinition(commandOrDefinition)}registerParser(command,override){if(assertExtensionCapability(this.#loadedExtension,"parser","registerParser"),!this.allowRegistration("parser.override","registerParser","parser"))return;const normalizedCommand=normalizeCommandName(assertNonEmptyRegistrationString("registerParser command",command));assertRegistrationFunction("registerParser override",override),this.#parserRegistry.overrides.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,command:normalizedCommand,run:override})}registerPreflight(override){if(assertExtensionCapability(this.#loadedExtension,"preflight","registerPreflight"),!this.allowRegistration("preflight.override","registerPreflight","preflight"))return;const normalized=normalizePreflightOverride(override);this.#preflightRegistry.overrides.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,...normalized})}registerService(service,override,ownership={}){assertExtensionCapability(this.#loadedExtension,"services","registerService");const normalizedService=String(service).trim().toLowerCase();if(!isExtensionServiceName(normalizedService))throw new TypeError(`registerService service must be one of: ${KNOWN_EXTENSION_SERVICE_NAMES.join(", ")}`);this.allowRegistration("services.override","registerService","services",{service:normalizedService})&&(assertRegistrationFunction("registerService override",override),this.#serviceRegistry.overrides.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,service:normalizedService,run:override,...normalizeServiceOverrideOwnership(ownership)?{passThrough:!0}:{}}))}registerRenderer(format,renderer,ownership={}){if(assertExtensionCapability(this.#loadedExtension,"renderers","registerRenderer"),!this.allowRegistration("renderers.override","registerRenderer","renderers"))return;if(typeof renderer!="function")throw new TypeError("registerRenderer requires a renderer function");const normalizedFormat=String(format).trim().toLowerCase();if(!isOutputRendererFormat(normalizedFormat))throw new Error(`registerRenderer format must be toon|json, received: ${String(format)}`);if(ownership.resultDiscriminator!==void 0&&typeof ownership.resultDiscriminator!="function")throw new TypeError("registerRenderer ownership.resultDiscriminator must be a function when provided");const commands=[...new Set((ownership.commands??[]).map(command=>{if(typeof command!="string"||command.trim().length===0)throw new TypeError("registerRenderer ownership.commands must contain non-empty command paths");return normalizeCommandName(command)}))];this.#rendererRegistry.overrides.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,format:normalizedFormat,run:renderer,commands,...ownership.resultDiscriminator?{resultDiscriminator:ownership.resultDiscriminator}:{}})}registerFlags(targetCommand,flags){if(assertExtensionCapability(this.#loadedExtension,"schema","registerFlags"),!this.allowRegistration("schema.flags","registerFlags","schema"))return;const normalizedTargetCommand=normalizeCommandName(assertNonEmptyRegistrationString("registerFlags targetCommand",targetCommand));validateFlagDefinitions(flags);const normalizedFlags=normalizeFlagDefinitions("registerFlags flags",flags);if(normalizedFlags.length===0)throw new TypeError("registerFlags requires at least one flag definition");this.#registrationRegistry.flags.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,target_command:normalizedTargetCommand,flags:normalizedFlags})}registerItemFields(fields){if(assertExtensionCapability(this.#loadedExtension,"schema","registerItemFields"),!this.allowRegistration("schema.itemfields","registerItemFields","schema"))return;validateItemFieldDefinitions(fields);const normalizedFields=normalizeRegistrationRecordList("registerItemFields fields",fields);if(normalizedFields.length===0)throw new TypeError("registerItemFields requires at least one field definition");this.#registrationRegistry.item_fields.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,fields:normalizedFields})}registerItemTypes(types){if(assertExtensionCapability(this.#loadedExtension,"schema","registerItemTypes"),!this.allowRegistration("schema.itemtypes","registerItemTypes","schema"))return;validateItemTypeDefinitions(types);const normalizedTypes=normalizeRegistrationRecordList("registerItemTypes types",types);if(normalizedTypes.length===0)throw new TypeError("registerItemTypes requires at least one type definition");this.#registrationRegistry.item_types.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,types:normalizedTypes})}registerRelationshipKinds(definitions){if(assertExtensionCapability(this.#loadedExtension,"schema","registerRelationshipKinds"),!this.allowRegistration("schema.relationshipkinds","registerRelationshipKinds","schema"))return;if(!Array.isArray(definitions))throw new TypeError("registerRelationshipKinds definitions requires an array of object definitions");if(definitions.length===0)throw new TypeError("registerRelationshipKinds requires at least one definition");const registry=createRelationshipKindRegistry();for(const registration of this.#registrationRegistry.relationship_kinds)for(const definition of registration.definitions)registry.register(definition);const validated=definitions.map(definition=>(registry.register(definition),registry.require(definition.kind)));this.#registrationRegistry.relationship_kinds.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,definitions:validated})}registerMigration(definition){if(assertExtensionCapability(this.#loadedExtension,"schema","registerMigration"),!this.allowRegistration("schema.migrations","registerMigration","schema"))return;validateMigrationDefinition(definition);const runtimeDefinition=normalizeRuntimeRegistrationRecord("registerMigration definition",definition);this.#registrationRegistry.migrations.push(attachRuntimeDefinition({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,definition:normalizeRegistrationRecord("registerMigration definition",definition)},runtimeDefinition))}registerProfile(profile){if(assertExtensionCapability(this.#loadedExtension,"schema","registerProfile"),!this.allowRegistration("schema.profiles","registerProfile","schema"))return;const snapshot=cloneRuntimeRegistrationValue(profile);validateProjectProfileDefinition(snapshot),this.#registrationRegistry.profiles.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,profile:applyProjectProfileDefaults(snapshot)})}registerImportExportCommandFlags(method,commandPath,resolvedOptions){resolvedOptions.flags!==void 0&&(assertExtensionCapability(this.#loadedExtension,"schema",`${method} options.flags`),this.allowRegistration("schema.flags",`${method} options.flags`,"schema")&&(validateFlagDefinitions(resolvedOptions.flags),this.#registrationRegistry.flags.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,target_command:commandPath,flags:normalizeFlagDefinitions(`${method} options.flags`,resolvedOptions.flags)})))}applyImportExportCommandMetadata(method,commandPath,options){if(options!==void 0&&(typeof options!="object"||options===null||Array.isArray(options)))throw new TypeError(`${method} options must be an object when provided`);const defaultDescription=`${method==="registerImporter"?"Import":"Export"} items with the registered extension adapter.`,defaultArguments=[{name:"file",required:!1,description:"Optional input or output file path."}],resolvedOptions={...options,description:options?.description??defaultDescription,arguments:options?.arguments??defaultArguments},output=resolveImportExportArtifactOutput(method,resolvedOptions,options?.description!==void 0);assertOptionalStringField(`${method} options.action`,resolvedOptions.action),assertOptionalStringField(`${method} options.description`,resolvedOptions.description),assertOptionalStringField(`${method} options.intent`,resolvedOptions.intent);const action=resolveCommandDefinitionAction(commandPath,resolvedOptions.action),examples=normalizeOptionalStringArrayField(`${method} options.examples`,resolvedOptions.examples),failureHints=normalizeOptionalStringArrayField(`${method} options.failure_hints`,resolvedOptions.failure_hints),argumentsDefinition=normalizeCommandDefinitionArguments(resolvedOptions.arguments);this.registerImportExportCommandFlags(method,commandPath,resolvedOptions);const registration={layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,source_package:this.#loadedExtension.source_package,command:commandPath,action,examples,failure_hints:failureHints,arguments:argumentsDefinition},description=resolvedOptions.description?.trim();description&&(registration.description=description);const intent=resolvedOptions.intent?.trim();return intent&&(registration.intent=intent),this.#registrationRegistry.commands.push(registration),output}registerImporter(name,importer,options){if(assertExtensionCapability(this.#loadedExtension,"importers","registerImporter"),!this.allowRegistration("importers.importer","registerImporter","importers"))return;const normalizedName=normalizeRegistrationName(assertNonEmptyRegistrationString("registerImporter name",name));assertRegistrationFunction("registerImporter importer",importer);const commandPath=toRegistrationCommandPath(normalizedName,"import");this.applyImportExportCommandMetadata("registerImporter",commandPath,options),this.#registrationRegistry.importers.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,importer:normalizedName}),this.#commandRegistry.handlers.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,command:commandPath,run:async context=>importer(buildImportExportContext(context,normalizedName,"import"))})}registerExporter(name,exporter,options){if(assertExtensionCapability(this.#loadedExtension,"importers","registerExporter"),!this.allowRegistration("importers.exporter","registerExporter","importers"))return;const normalizedName=normalizeRegistrationName(assertNonEmptyRegistrationString("registerExporter name",name));assertRegistrationFunction("registerExporter exporter",exporter);const commandPath=toRegistrationCommandPath(normalizedName,"export"),output=this.applyImportExportCommandMetadata("registerExporter",commandPath,options);this.#registrationRegistry.exporters.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,exporter:normalizedName,...output===void 0?{}:{output}}),this.#commandRegistry.handlers.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,command:commandPath,run:async context=>{const result=await exporter(buildImportExportContext(context,normalizedName,"export"));return output?.receipt==="suppress"&&!isHostOutputSuppressed(result)?suppressHostOutput(result):result}})}registerSearchProvider(provider){if(assertExtensionCapability(this.#loadedExtension,"search","registerSearchProvider"),!this.allowRegistration("search.provider","registerSearchProvider","search"))return;const runtimeDefinition=normalizeRuntimeRegistrationRecord("registerSearchProvider provider",provider);this.#registrationRegistry.search_providers.push(attachRuntimeDefinition({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,definition:normalizeRegistrationRecord("registerSearchProvider provider",provider)},runtimeDefinition))}registerVectorStoreAdapter(adapter){if(assertExtensionCapability(this.#loadedExtension,"search","registerVectorStoreAdapter"),!this.allowRegistration("search.vectorstore","registerVectorStoreAdapter","search"))return;const runtimeDefinition=normalizeRuntimeRegistrationRecord("registerVectorStoreAdapter adapter",adapter);this.#registrationRegistry.vector_store_adapters.push(attachRuntimeDefinition({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,definition:normalizeRegistrationRecord("registerVectorStoreAdapter adapter",adapter)},runtimeDefinition))}registerAssuranceMeasurementProvider(provider){if(assertExtensionCapability(this.#loadedExtension,"services","registerAssuranceMeasurementProvider"),!this.allowRegistration("services.assuranceprovider","registerAssuranceMeasurementProvider","services"))return;if(validateAssuranceMeasurementProviderDefinition(provider),provider.network&&this.#loadedExtension.permissions?.network!==!0)throw new TypeError("registerAssuranceMeasurementProvider network provider requires permissions.network=true");const runtimeDefinition=normalizeRuntimeRegistrationRecord("registerAssuranceMeasurementProvider provider",provider);this.#registrationRegistry.assurance_providers.push(attachRuntimeDefinition({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,network_permission:this.#loadedExtension.permissions?.network===!0,definition:normalizeRegistrationRecord("registerAssuranceMeasurementProvider provider",provider)},runtimeDefinition))}registerBeforeCommand(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.beforeCommand"),this.allowRegistration("hooks.beforecommand","api.hooks.beforeCommand","hooks")&&(assertHookHandler("beforeCommand",hook),this.#hookRegistry.beforeCommand.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}registerBeforeMutation(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.beforeMutation"),this.allowRegistration("hooks.beforemutation","api.hooks.beforeMutation","hooks")&&(assertHookHandler("beforeMutation",hook),this.#hookRegistry.beforeMutation.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}registerAfterCommand(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.afterCommand"),this.allowRegistration("hooks.aftercommand","api.hooks.afterCommand","hooks")&&(assertHookHandler("afterCommand",hook),this.#hookRegistry.afterCommand.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}registerOnWrite(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.onWrite"),this.allowRegistration("hooks.onwrite","api.hooks.onWrite","hooks")&&(assertHookHandler("onWrite",hook),this.#hookRegistry.onWrite.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}registerOnRead(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.onRead"),this.allowRegistration("hooks.onread","api.hooks.onRead","hooks")&&(assertHookHandler("onRead",hook),this.#hookRegistry.onRead.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}registerOnIndex(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.onIndex"),this.allowRegistration("hooks.onindex","api.hooks.onIndex","hooks")&&(assertHookHandler("onIndex",hook),this.#hookRegistry.onIndex.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}}function createExtensionApi(extension,hooks,commands,parsers,preflight,services,renderers,registrations,activationWarnings,activationFailures,policy){return new ExtensionApiRegistrar(extension,hooks,commands,parsers,preflight,services,renderers,registrations,activationWarnings,activationFailures,policy)}function getRegistrationCounts(registrations){const commandCount=registrations.commands.length,flagCount=registrations.flags.reduce((total,entry)=>total+entry.flags.length,0),itemFieldCount=registrations.item_fields.reduce((total,entry)=>total+entry.fields.length,0),itemTypeCount=registrations.item_types.reduce((total,entry)=>total+entry.types.length,0),relationshipKindCount=(registrations.relationship_kinds??[]).reduce((total,entry)=>total+entry.definitions.length,0);return{commands:commandCount,flags:flagCount,item_fields:itemFieldCount,item_types:itemTypeCount,...relationshipKindCount>0?{relationship_kinds:relationshipKindCount}:{},migrations:registrations.migrations.length,profiles:registrations.profiles.length,importers:registrations.importers.length,exporters:registrations.exporters.length,search_providers:registrations.search_providers.length,vector_store_adapters:registrations.vector_store_adapters.length,...(registrations.assurance_providers?.length??0)>0?{assurance_providers:registrations.assurance_providers.length}:{}}}function collectCommandCollisionWarnings(commands){const warnings=[],collectByCommand=(entries,codePrefix)=>{const grouped=new Map;for(const entry of entries){const bucket=grouped.get(entry.command)??[];bucket.push(entry),grouped.set(entry.command,bucket)}for(const command of[...grouped.keys()].sort((left,right)=>left.localeCompare(right))){const bucket=grouped.get(command);if(bucket.length<=1)continue;const winner=bucket[bucket.length-1];for(const displaced of bucket.slice(0,-1))warnings.push(`${codePrefix}:${command}:${winner.layer}:${winner.name}:${displaced.layer}:${displaced.name}`)}};collectByCommand(commands.handlers,"extension_command_handler_collision"),collectByCommand(commands.overrides,"extension_command_override_collision");const handlerCommands=new Set(commands.handlers.map(entry=>entry.command)),overlapCommands=[...new Set(commands.overrides.map(entry=>entry.command))].filter(command=>handlerCommands.has(command));overlapCommands.sort((left,right)=>left.localeCompare(right));for(const command of overlapCommands){const handlers=commands.handlers.filter(entry=>entry.command===command),overrides=commands.overrides.filter(entry=>entry.command===command);for(const override of overrides)for(const handler of handlers)warnings.push(`extension_command_override_handler_overlap:${command}:${override.layer}:${override.name}:${handler.layer}:${handler.name}`)}return warnings}function collectRendererCollisionWarnings(renderers){const grouped=new Map;for(const entry of renderers.overrides){const bucket=grouped.get(entry.format)??[];bucket.push(entry),grouped.set(entry.format,bucket)}const warnings=[];for(const format of[...grouped.keys()].sort((left,right)=>left.localeCompare(right))){const bucket=grouped.get(format);if(bucket.length<=1)continue;const winner=bucket[bucket.length-1];for(const displaced of bucket.slice(0,-1))winner.commands?.length&&displaced.commands?.length&&!displaced.commands.some(command=>winner.commands?.includes(command))||warnings.push(`extension_renderer_collision:${format}:${winner.layer}:${winner.name}:${displaced.layer}:${displaced.name}`)}return warnings}function collectParserCollisionWarnings(parsers){const warnings=[],grouped=new Map;for(const entry of parsers.overrides){const bucket=grouped.get(entry.command)??[];bucket.push(entry),grouped.set(entry.command,bucket)}for(const command of[...grouped.keys()].sort((left,right)=>left.localeCompare(right))){const bucket=grouped.get(command);if(bucket.length<=1)continue;const winner=bucket[bucket.length-1];for(const displaced of bucket.slice(0,-1))warnings.push(`extension_parser_override_collision:${command}:${winner.layer}:${winner.name}:${displaced.layer}:${displaced.name}`)}return warnings}const CHAINED_SERVICE_NAMES=new Set(["output_format"]);function collectServiceCollisionWarnings(services){const warnings=[],grouped=new Map;for(const entry of services.overrides){const bucket=grouped.get(entry.service)??[];bucket.push(entry),grouped.set(entry.service,bucket)}for(const service of[...grouped.keys()].sort((left,right)=>left.localeCompare(right))){const bucket=grouped.get(service);if(bucket.length<=1||CHAINED_SERVICE_NAMES.has(service))continue;const winner=bucket[bucket.length-1];for(const displaced of bucket.slice(0,-1))warnings.push(`extension_service_override_collision:${service}:${winner.layer}:${winner.name}:${displaced.layer}:${displaced.name}`)}return warnings}async function activateExtensions(loadResult){const policy=hydrateExtensionPolicy(loadResult.policy??DEFAULT_EXTENSION_POLICY),hooks=createEmptyExtensionHookRegistry(),commands=createEmptyExtensionCommandRegistry(),parsers=createEmptyExtensionParserRegistry(),preflight=createEmptyExtensionPreflightRegistry(),services=createEmptyExtensionServiceRegistry(),renderers=createEmptyExtensionRendererRegistry(),registrations=createEmptyExtensionRegistrationRegistry(),failed=[],warnings=[];for(const extension of loadResult.loaded){const activatable=resolveActivatableExtension(extension.module);if(!activatable)continue;const failedBeforeActivation=failed.length,rollbackPartialActivation=captureExtensionActivationRollback({hooks,commands,parsers,preflight,services,renderers,registrations});try{await activatable.activate(createExtensionApi(extension,hooks,commands,parsers,preflight,services,renderers,registrations,warnings,failed,policy)),failed.length>failedBeforeActivation&&(rollbackPartialActivation(),warnings.push(`extension_activation_rolled_back:${extension.layer}:${extension.name}`))}catch(error){rollbackPartialActivation(),warnings.push(`extension_activate_failed:${extension.layer}:${extension.name}`);const trace=extractRegistrationValidationTrace(error);failed.push({layer:extension.layer,name:extension.name,entry_path:extension.entry_path,error:formatUnknownError(error),trace})}}const collisionWarnings=[...collectCommandCollisionWarnings(commands),...collectParserCollisionWarnings(parsers),...collectPreflightCollisionWarnings(preflight),...collectServiceCollisionWarnings(services),...collectRendererCollisionWarnings(renderers)],mergedWarnings=[...new Set([...warnings,...collisionWarnings])];return{hooks,commands,parsers,preflight,services,renderers,registrations,failed,warnings:mergedWarnings,hook_counts:{before_command:hooks.beforeCommand.length,before_mutation:hooks.beforeMutation.length,after_command:hooks.afterCommand.length,on_write:hooks.onWrite.length,on_read:hooks.onRead.length,on_index:hooks.onIndex.length},command_override_count:commands.overrides.length,command_handler_count:commands.handlers.length,parser_override_count:parsers.overrides.length,preflight_override_count:preflight.overrides.length,service_override_count:services.overrides.length,renderer_override_count:renderers.overrides.length,registration_counts:getRegistrationCounts(registrations)}}const _testOnlyLoader={assertFlagValueTypeAndDefault,assertOptionalStringField,compareComparableVersions,collectCommandCollisionWarnings,collectParserCollisionWarnings,collectRendererCollisionWarnings,collectServiceCollisionWarnings,createExtensionApi,createRegistrationValidationError,evaluatePmMaxVersionCompatibility,evaluatePmMinVersionCompatibility,extractRegistrationValidationTrace,fingerprintPath,getRegistrationCounts,normalizeCommandDefinitionArguments,normalizeExtensionDeactivateTimeout,normalizeOptionalStringArrayField,normalizeRegistrationRecord,normalizeRegistrationRecordList,normalizeRuntimeRegistrationRecord,parseComparableVersion,parseManifest:parseExtensionManifestDocument,readCurrentPmCliVersion,readManagedExtensionSourcePackages:async extensionsRoot=>new Map([...await readManagedExtensionSourcePackages(extensionsRoot)].filter(entry=>typeof entry[1].package_name=="string").map(([key,identity])=>[key,identity.package_name])),resolveExtensionImportHref,resolveCurrentPmCliVersion,resolveCommandDefinitionAction,sanitizeRegistrationValue,validateItemFieldDefinitions,resetCurrentPmCliVersionCacheForTest:()=>{currentPmCliVersionPromise=null}};export{DEFAULT_EXTENSION_PRIORITY,_testOnlyLoader,activateExtensions,createEmptyExtensionCommandRegistry2 as createEmptyExtensionCommandRegistry,createEmptyExtensionHookRegistry2 as createEmptyExtensionHookRegistry,createEmptyExtensionParserRegistry2 as createEmptyExtensionParserRegistry,createEmptyExtensionPreflightRegistry2 as createEmptyExtensionPreflightRegistry,createEmptyExtensionRegistrationRegistry2 as createEmptyExtensionRegistrationRegistry,createEmptyExtensionRendererRegistry2 as createEmptyExtensionRendererRegistry,createEmptyExtensionServiceRegistry2 as createEmptyExtensionServiceRegistry,deactivateExtensions,discoverExtensions,isCanonicalPathWithinDirectory,loadExtensions,nextExtensionReloadToken,parseExtensionManifestDocument2 as parseExtensionManifestDocument,parseLegacyExtensionCapabilityAliasWarning,parseUnknownExtensionCapabilityWarning,resolveExtensionRoots,runAfterCommandHooks,runBeforeCommandHooks,runBeforeMutationHooks,runCommandHandler,runCommandOverride,runOnIndexHooks,runOnReadHooks,runOnWriteHooks,runParserOverride,runPreflightOverride,runRendererOverride,runServiceOverride,runServiceOverrideSync};
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]="d3066947-0087-5732-8511-74a31056b6e1")}catch{}})();import fs from"node:fs/promises";import path from"node:path";import{pathToFileURL}from"node:url";import{createRelationshipKindRegistry}from"../../sdk/relationships.js";import{pathExists}from"../fs/fs-utils.js";import{isPathWithinDirectory}from"../fs/path-utils.js";import{isHostOutputSuppressed,suppressHostOutput}from"../output/output-control.js";import{resolvePmPackageRootFromModule}from"../packages/root.js";import{asRecordLoose,resolveActivatablePropertyRecord}from"../shared/primitives.js";import{resolveGlobalPmRoot}from"../store/paths.js";import{captureExtensionActivationRollback}from"./activation-transaction.js";import{assertCommandDefinitionMetadataStrings}from"./command-visibility-tier.js";import{normalizeExtensionReadOutput}from"./read-output-contract.js";import{normalizeExtensionContributionInventory}from"./contribution-inventory.js";import{buildImportExportContext,resolveImportExportArtifactOutput}from"./exporter-output-contract.js";import{buildReadyExtensionCandidate}from"./extension-candidate.js";import{collectUnknownExtensionCapabilities,formatLegacyExtensionCapabilityAliasWarning,formatUnknownExtensionCapabilityWarning,isKnownExtensionCapability,normalizeNames}from"./extension-capability-aliases.js";import{evaluateExtensionPolicyForCapability,evaluateExtensionPolicyForExtension,evaluateExtensionPolicyForRegistration,hydrateExtensionPolicy,normalizeExtensionPolicy,serializeExtensionPolicy}from"./extension-policy.js";import{createEmptyExtensionCommandRegistry,createEmptyExtensionHookRegistry,createEmptyExtensionParserRegistry,createEmptyExtensionPreflightRegistry,createEmptyExtensionRegistrationRegistry,createEmptyExtensionRendererRegistry,createEmptyExtensionServiceRegistry}from"./extension-registries.js";import{normalizeCommandName}from"./extension-runtime-helpers.js";import{KNOWN_EXTENSION_CAPABILITIES,KNOWN_EXTENSION_SERVICE_NAMES,createDefaultExtensionGovernancePolicy}from"./extension-types.js";import{parseExtensionManifestDocument}from"./manifest-parser.js";import{formatExtensionManifestSchemaWarnings}from"./manifest-schema.js";import{snapshotExtensionModuleGraph}from"./module-graph-snapshot.js";import{collectPreflightCollisionWarnings,normalizePreflightOverride}from"./preflight-ownership.js";import{applyProjectProfileDefaults,assertFlagValueTypeAndDefault,normalizeCommandDefinitionArguments,normalizeFlagDefinitions,resolveCommandDefinitionAction,validateFlagDefinitions,validateItemFieldDefinitions,validateItemTypeDefinitions,validateMigrationDefinition,validateProjectProfileDefinition}from"./registration-contracts.js";import{assertOptionalStringField,normalizeOptionalStringArrayField}from"./registration-validation.js";import{assertHookHandler,assertNonEmptyRegistrationString,assertRegistrationFunction,attachRuntimeDefinition,cloneRuntimeRegistrationValue,createRegistrationValidationError,extractRegistrationValidationTrace,isExtensionServiceName,isOutputRendererFormat,normalizeRegistrationName,normalizeRegistrationRecord,normalizeRegistrationRecordList,normalizeRuntimeRegistrationRecord,sanitizeRegistrationValue,toRegistrationCommandPath,validateAssuranceMeasurementProviderDefinition}from"./registration-values.js";import{normalizeServiceOverrideOwnership}from"./service-ownership.js";import{compareComparableVersions,evaluatePmMaxVersionBound,evaluatePmMinVersionBound,parseComparableVersion}from"./version-compat.js";import{parseLegacyExtensionCapabilityAliasWarning,parseUnknownExtensionCapabilityWarning}from"./extension-capability-aliases.js";import{createEmptyExtensionCommandRegistry as createEmptyExtensionCommandRegistry2,createEmptyExtensionHookRegistry as createEmptyExtensionHookRegistry2,createEmptyExtensionParserRegistry as createEmptyExtensionParserRegistry2,createEmptyExtensionPreflightRegistry as createEmptyExtensionPreflightRegistry2,createEmptyExtensionRegistrationRegistry as createEmptyExtensionRegistrationRegistry2,createEmptyExtensionRendererRegistry as createEmptyExtensionRendererRegistry2,createEmptyExtensionServiceRegistry as createEmptyExtensionServiceRegistry2}from"./extension-registries.js";import{runAfterCommandHooks,runBeforeCommandHooks,runBeforeMutationHooks,runCommandHandler,runCommandOverride,runOnIndexHooks,runOnReadHooks,runOnWriteHooks,runParserOverride,runPreflightOverride,runRendererOverride,runServiceOverride,runServiceOverrideSync}from"./extension-hook-runtime.js";export*from"./extension-types.js";import{DEFAULT_EXTENSION_PRIORITY,parseExtensionManifestDocument as parseExtensionManifestDocument2}from"./manifest-parser.js";let currentPmCliVersionPromise=null;const DEFAULT_EXTENSION_POLICY=Object.freeze(createDefaultExtensionGovernancePolicy());let extensionReloadEpoch=0;function nextExtensionReloadToken(seed=Date.now()){return extensionReloadEpoch+=1,`${extensionReloadEpoch}-${seed}`}function shouldEnable(name,enabled,disabled){return disabled.has(name)?!1:enabled.size===0?!0:enabled.has(name)}async function isCanonicalPathWithinDirectory(directory,targetPath){const[resolvedDirectory,resolvedTargetPath]=await Promise.all([fs.realpath(directory),fs.realpath(targetPath)]);return isPathWithinDirectory(resolvedDirectory,resolvedTargetPath)}function resolveExtensionRoots(pmRoot,cwd=process.cwd()){return{global:path.join(resolveGlobalPmRoot(cwd),"extensions"),project:path.join(pmRoot,"extensions")}}async function listExtensionDirectories(extensionsRoot){try{return(await fs.readdir(extensionsRoot,{withFileTypes:!0})).filter(entry=>entry.isDirectory()).map(entry=>entry.name).sort((a,b)=>a.localeCompare(b))}catch{return[]}}function summarizeCandidate(candidate){const summary={layer:candidate.layer,directory:candidate.directory,manifest_path:candidate.manifest_path,name:candidate.manifest.name,version:candidate.manifest.version,entry:candidate.manifest.entry,priority:candidate.manifest.priority,entry_path:candidate.entry_path,manifest_version:candidate.manifest.manifest_version,pm_min_version:candidate.manifest.pm_min_version,pm_max_version:candidate.manifest.pm_max_version,engines:candidate.manifest.engines,trusted:candidate.manifest.trusted,provenance:candidate.manifest.provenance,sandbox_profile:candidate.manifest.sandbox_profile,permissions:candidate.manifest.permissions,capabilities:[...candidate.manifest.capabilities],activation:candidate.manifest.activation?{commands:[...candidate.manifest.activation.commands]}:void 0,contributions:candidate.manifest.contributions??candidate.contributions};return candidate.source_package&&(summary.source_package=candidate.source_package),candidate.source_aliases&&(summary.source_aliases=[...candidate.source_aliases]),summary}function normalizeManagedSourcePackage(value){return typeof value=="string"&&value.trim().length>0?value.trim():void 0}async function readManagedExtensionSourcePackages(extensionsRoot){const packages=new Map;try{const parsed=JSON.parse(await fs.readFile(path.join(extensionsRoot,".managed-extensions.json"),"utf8")),entries=asRecordLoose(parsed)?.entries;if(!Array.isArray(entries))return packages;for(const entry of entries){if(typeof entry!="object"||entry===null)continue;const record=entry,sourcePackage=normalizeManagedSourcePackage(record.source?.package),aliases=[record.source?.input,record.source?.name,sourcePackage].map(value=>normalizeManagedSourcePackage(value)).filter(value=>value!==void 0),contributions=normalizeExtensionContributionInventory(record.contributions),identity={aliases:[...new Set(aliases)],...sourcePackage?{package_name:sourcePackage}:{},...contributions?{contributions}:{}};typeof record.directory=="string"&&record.directory.trim().length>0&&packages.set(`directory:${record.directory.trim()}`,identity),typeof record.name=="string"&&record.name.trim().length>0&&packages.set(`name:${record.name.trim()}`,identity)}}catch{return packages}return packages}function sortCandidates(candidates){return[...candidates].sort((left,right)=>{if(left.manifest.priority!==right.manifest.priority)return left.manifest.priority-right.manifest.priority;const byName=left.manifest.name.localeCompare(right.manifest.name);return byName!==0?byName:left.directory.localeCompare(right.directory)})}function buildEffectiveExtensions(globalCandidates,projectCandidates){const ordered=[...sortCandidates(globalCandidates),...sortCandidates(projectCandidates)],effective=[];for(const candidate of ordered){const existingIndex=effective.findIndex(entry=>entry.manifest.name===candidate.manifest.name);existingIndex>=0&&effective.splice(existingIndex,1),effective.push(candidate)}return effective}async function scanExtensionLayer(layer,extensionsRoot,enabled,disabled,pmMaxVersionExceededMode){const diagnostics=[],warnings=[],candidates=[],directories=await listExtensionDirectories(extensionsRoot),managedSourcePackages=await readManagedExtensionSourcePackages(extensionsRoot);for(const directory of directories){const scanned=await scanExtensionDirectory(layer,extensionsRoot,directory,enabled,disabled,managedSourcePackages,pmMaxVersionExceededMode);diagnostics.push(scanned.diagnostic),warnings.push(...scanned.warnings),scanned.candidate&&candidates.push(scanned.candidate)}return{diagnostics,warnings,candidates}}function emptyExtensionLayerScan(){return{diagnostics:[],warnings:[],candidates:[]}}function buildUnavailableExtensionScan(layer,directory,manifestPath,warning){return{diagnostic:{layer,directory,manifest_path:manifestPath,name:null,version:null,entry:null,priority:null,entry_path:null,enabled:null,status:"warn"},warnings:[warning],candidate:null}}function collectScannedExtensionWarnings(layer,manifest,rawManifest,entryWithinDirectory,entryExists,pmVersionCompatibility,pmMaxVersionCompatibility,enabledForLoad){const extensionWarnings=formatExtensionManifestSchemaWarnings(layer,manifest,rawManifest);Array.isArray(manifest.legacy_capability_aliases)&&manifest.legacy_capability_aliases.length>0&&extensionWarnings.push(formatLegacyExtensionCapabilityAliasWarning(layer,manifest.name,manifest.legacy_capability_aliases));for(const capability of collectUnknownExtensionCapabilities(manifest.capabilities))extensionWarnings.push(formatUnknownExtensionCapabilityWarning(layer,manifest.name,capability));return entryWithinDirectory?entryExists||extensionWarnings.push(`extension_entry_missing:${layer}:${manifest.name}`):extensionWarnings.push(`extension_entry_outside_extension:${layer}:${manifest.name}`),pmVersionCompatibility.warning&&extensionWarnings.push(enabledForLoad?pmVersionCompatibility.warning:pmVersionCompatibility.warning.replace("extension_pm_","extension_disabled_pm_")),pmMaxVersionCompatibility.warning&&extensionWarnings.push(enabledForLoad?pmMaxVersionCompatibility.warning:pmMaxVersionCompatibility.warning.replace("extension_pm_","extension_disabled_pm_")),extensionWarnings}async function scanExtensionDirectory(layer,extensionsRoot,directory,enabled,disabled,managedSourcePackages,pmMaxVersionExceededMode){const extensionDir=path.join(extensionsRoot,directory),manifestPath=path.join(extensionDir,"manifest.json");if(!await pathExists(manifestPath))return buildUnavailableExtensionScan(layer,directory,manifestPath,`extension_manifest_missing:${layer}:${directory}`);let manifest,rawManifest;try{const parsed=JSON.parse(await fs.readFile(manifestPath,"utf8"));rawManifest=asRecordLoose(parsed),manifest=parseExtensionManifestDocument(parsed)}catch{rawManifest=null,manifest=null}if(!manifest||!rawManifest)return buildUnavailableExtensionScan(layer,directory,manifestPath,`extension_manifest_invalid:${layer}:${directory}`);const entryPath=path.resolve(extensionDir,manifest.entry),entryWithinDirectoryByPath=isPathWithinDirectory(extensionDir,entryPath),entryExists=entryWithinDirectoryByPath?await pathExists(entryPath):!1,entryWithinDirectory=entryWithinDirectoryByPath&&entryExists?await isCanonicalPathWithinDirectory(extensionDir,entryPath):entryWithinDirectoryByPath,enabledForLoad=shouldEnable(manifest.name,enabled,disabled),pmVersionCompatibility=await evaluatePmMinVersionCompatibility(layer,manifest),pmMaxVersionCompatibility=await evaluatePmMaxVersionCompatibility(layer,manifest,pmMaxVersionExceededMode),extensionWarnings=collectScannedExtensionWarnings(layer,manifest,rawManifest,entryWithinDirectory,entryExists,pmVersionCompatibility,pmMaxVersionCompatibility,enabledForLoad),extensionReady=entryWithinDirectory&&entryExists&&pmVersionCompatibility.allowed&&pmMaxVersionCompatibility.allowed,sourceIdentity=managedSourcePackages.get(`directory:${directory}`)??managedSourcePackages.get(`name:${manifest.name}`);return{diagnostic:{layer,directory,manifest_path:manifestPath,name:manifest.name,version:manifest.version,entry:manifest.entry,priority:manifest.priority,entry_path:entryPath,enabled:enabledForLoad,status:extensionReady?"ok":"warn"},warnings:extensionWarnings,candidate:buildReadyExtensionCandidate({layer,directory,manifestPath,entryPath,manifest,sourceIdentity,extensionReady,enabledForLoad})}}async function discoverExtensions(options){const roots=resolveExtensionRoots(options.pmRoot,options.cwd??process.cwd()),configured_enabled=normalizeNames(options.settings.extensions.enabled),configured_disabled=normalizeNames(options.settings.extensions.disabled),policy=normalizeExtensionPolicy(options.settings),serializedPolicy=serializeExtensionPolicy(policy);if(options.noExtensions)return{disabled_by_flag:!0,roots,configured_enabled,configured_disabled,discovered:[],effective:[],warnings:[...policy.warnings],policy:serializedPolicy};const enabled=new Set(configured_enabled),disabled=new Set(configured_disabled),globalScan=options.ignoreGlobalExtensions===!0?emptyExtensionLayerScan():await scanExtensionLayer("global",roots.global,enabled,disabled,policy.pmMaxVersionExceededMode.global),projectScan=await scanExtensionLayer("project",roots.project,enabled,disabled,policy.pmMaxVersionExceededMode.project),policyWarnings=[...policy.warnings],effectiveCandidates=buildEffectiveExtensions(globalScan.candidates,projectScan.candidates),effective=[];for(const candidate of effectiveCandidates){const extensionRef={layer:candidate.layer,name:candidate.manifest.name,trusted:candidate.manifest.trusted===!0,provenanceVerified:candidate.manifest.provenance?.verified===!0,sandboxProfile:candidate.manifest.sandbox_profile,permissions:candidate.manifest.permissions&&typeof candidate.manifest.permissions=="object"?{fs_read:candidate.manifest.permissions.fs_read,fs_write:candidate.manifest.permissions.fs_write,network:candidate.manifest.permissions.network,env_read:candidate.manifest.permissions.env_read,env_write:candidate.manifest.permissions.env_write,process_spawn:candidate.manifest.permissions.process_spawn}:void 0},extensionDecision=evaluateExtensionPolicyForExtension(policy,extensionRef);if(extensionDecision.warning&&policyWarnings.push(extensionDecision.warning),!!extensionDecision.allowed){for(const capability of candidate.manifest.capabilities){const capabilityDecision=evaluateExtensionPolicyForCapability(policy,extensionRef,capability);capabilityDecision.warning&&policyWarnings.push(capabilityDecision.warning)}effective.push(summarizeCandidate(candidate))}}return{disabled_by_flag:!1,roots,configured_enabled,configured_disabled,discovered:[...globalScan.diagnostics,...projectScan.diagnostics],effective,warnings:[...new Set([...globalScan.warnings,...projectScan.warnings,...policyWarnings])],policy:serializedPolicy}}function formatUnknownError(error){return error instanceof Error&&error.message.trim().length>0?error.message:String(error)}async function readCurrentPmCliVersion(){try{const packageRoot=resolvePmPackageRootFromModule(import.meta.url,["../../.."]),raw=await fs.readFile(path.join(packageRoot,"package.json"),"utf8"),parsed=JSON.parse(raw);return typeof parsed.version=="string"&&parsed.version.trim().length>0?parsed.version.trim():null}catch{return null}}function resolveCurrentPmCliVersion(){return currentPmCliVersionPromise??=readCurrentPmCliVersion(),currentPmCliVersionPromise}function formatPmVersionCompatibilityWarning(layer,manifest,evaluation){const current=evaluation.current??"unknown";if(evaluation.kind==="pm_min_version")switch(evaluation.status){case"invalid":return`extension_pm_min_version_invalid:${layer}:${manifest.name}:required=${evaluation.required}`;case"unchecked":return`extension_pm_min_version_unchecked:${layer}:${manifest.name}:required=${evaluation.required}:current=${current}`;case"unmet":return`extension_pm_min_version_unmet:${layer}:${manifest.name}:required=${evaluation.required}:current=${current}`;default:return}switch(evaluation.status){case"invalid":return`extension_pm_max_version_invalid:${layer}:${manifest.name}:allowed=${evaluation.required}`;case"unchecked":return`extension_pm_max_version_unchecked:${layer}:${manifest.name}:allowed=${evaluation.required}:current=${current}`;case"exceeded_warn":return`extension_pm_max_version_exceeded_warn:${layer}:${manifest.name}:allowed=${evaluation.required}:current=${current}`;case"exceeded":return`extension_pm_max_version_exceeded:${layer}:${manifest.name}:allowed=${evaluation.required}:current=${current}`;default:return}}async function evaluatePmMinVersionCompatibility(layer,manifest){if(manifest.pm_min_version===void 0)return{allowed:!0};const evaluation=evaluatePmMinVersionBound(manifest.pm_min_version,await resolveCurrentPmCliVersion()),warning=formatPmVersionCompatibilityWarning(layer,manifest,evaluation);return warning?{allowed:evaluation.allowed,warning}:{allowed:evaluation.allowed}}async function evaluatePmMaxVersionCompatibility(layer,manifest,exceededMode){if(manifest.pm_max_version===void 0)return{allowed:!0};const evaluation=evaluatePmMaxVersionBound(manifest.pm_max_version,await resolveCurrentPmCliVersion(),exceededMode),warning=formatPmVersionCompatibilityWarning(layer,manifest,evaluation);return warning?{allowed:evaluation.allowed,warning}:{allowed:evaluation.allowed}}async function fingerprintPath(pathToInspect){try{const stats=await fs.stat(pathToInspect);return`${Math.trunc(stats.mtimeMs)}-${stats.size}`}catch{return"missing"}}async function resolveExtensionImportHref(extension,options){let importEntryPath=extension.entry_path;options.module_graph_snapshot_root&&(importEntryPath=await snapshotExtensionModuleGraph(options.module_graph_snapshot_root,extension));const baseUrl=new URL(pathToFileURL(importEntryPath).href);if(!(options.cache_bust===!0||typeof options.reload_token=="string"))return baseUrl.href;const[entryFingerprint,manifestFingerprint]=await Promise.all([fingerprintPath(extension.entry_path),fingerprintPath(extension.manifest_path)]),reloadToken=options.reload_token??nextExtensionReloadToken();return baseUrl.searchParams.set("pm_ext_reload",reloadToken),baseUrl.searchParams.set("pm_ext_entry",entryFingerprint),baseUrl.searchParams.set("pm_ext_manifest",manifestFingerprint),baseUrl.href}async function loadExtensions(options){const discovery=await discoverExtensions(options),loaded=[],failed=[],warnings=[...discovery.warnings];if(discovery.disabled_by_flag)return{...discovery,warnings,loaded,failed};const extensionsToLoad=typeof options.extensionFilter=="function"?discovery.effective.filter(options.extensionFilter):discovery.effective;for(const extension of extensionsToLoad)try{const module=await import(await resolveExtensionImportHref(extension,options));loaded.push({...extension,module})}catch(error){warnings.push(`extension_load_failed:${extension.layer}:${extension.name}`),failed.push({layer:extension.layer,name:extension.name,entry_path:extension.entry_path,error:formatUnknownError(error)})}return{...discovery,warnings,loaded,failed}}const DEFAULT_EXTENSION_DEACTIVATE_TIMEOUT_MS=5e3,MAX_EXTENSION_DEACTIVATE_TIMEOUT_MS=2147483647;function toActivatableExtension(source){const activatable={activate:source.activate.bind(source)};if(typeof source.deactivate=="function"){const deactivate=source.deactivate;activatable.deactivate=deactivate.bind(source)}return activatable}function resolveActivatableExtension(module){const activatableRecord=resolveActivatablePropertyRecord(module);return activatableRecord?toActivatableExtension(activatableRecord):null}async function deactivateExtensions(loadResult,activationResult,options={}){const timeoutMs=normalizeExtensionDeactivateTimeout(options?.deactivate_timeout_ms),failedActivationKeys=new Set((activationResult?.failed??[]).map(entry=>`${entry.layer}:${entry.name}`)),targets=[];for(const extension of loadResult.loaded){if(failedActivationKeys.has(`${extension.layer}:${extension.name}`))continue;const activatable=resolveActivatableExtension(extension.module);!activatable||typeof activatable.deactivate!="function"||targets.push({extension,deactivate:activatable.deactivate})}const outcomes=await Promise.all(targets.map(async({extension,deactivate})=>{try{return await runExtensionDeactivateWithTimeout(deactivate,timeoutMs),{ok:!0}}catch(error){return{ok:!1,layer:extension.layer,name:extension.name,error:formatUnknownError(error)}}})),warnings=[],failed=[];let deactivated=0;for(const outcome of outcomes){if(outcome.ok){deactivated+=1;continue}warnings.push(`extension_deactivate_failed:${outcome.layer}:${outcome.name}`),failed.push({layer:outcome.layer,name:outcome.name,error:outcome.error})}return{deactivated,warnings,failed}}function normalizeExtensionDeactivateTimeout(rawTimeout){return typeof rawTimeout!="number"||rawTimeout<0?DEFAULT_EXTENSION_DEACTIVATE_TIMEOUT_MS:rawTimeout===0||rawTimeout===1/0?0:Number.isFinite(rawTimeout)?Math.min(MAX_EXTENSION_DEACTIVATE_TIMEOUT_MS,Math.max(1,Math.floor(rawTimeout))):DEFAULT_EXTENSION_DEACTIVATE_TIMEOUT_MS}async function runExtensionDeactivateWithTimeout(deactivate,timeoutMs){if(timeoutMs===0){await deactivate();return}let timeoutHandle;try{const deactivatePromise=Promise.resolve().then(()=>deactivate());deactivatePromise.catch(()=>{}),await Promise.race([deactivatePromise,new Promise((_,reject)=>{timeoutHandle=setTimeout(()=>{reject(new Error(`extension deactivate timed out after ${timeoutMs}ms`))},timeoutMs),timeoutHandle.unref?.()})])}finally{clearTimeout(timeoutHandle)}}function getDeclaredExtensionCapabilities(extension){if(!Array.isArray(extension.capabilities))return null;const declared=new Set;for(const capability of extension.capabilities){const normalized=capability.trim().toLowerCase();isKnownExtensionCapability(normalized)&&declared.add(normalized)}return declared}function assertExtensionCapability(extension,capability,method){const declared=getDeclaredExtensionCapabilities(extension);if(declared!==null&&!declared.has(capability))throw createRegistrationValidationError(`${method} requires capability '${capability}' in extension manifest capabilities`,{method,registration_index:-1,capability,missing_capability:capability,expected_schema:`"capabilities": [..., "${capability}"]`,received:extension.capabilities,hint:`Add "${capability}" to ${extension.name} manifest capabilities, or remove the ${method} registration call.`})}function buildExtensionSelfIdentity(extension){return Object.freeze({name:extension.name,layer:extension.layer,version:extension.version,capabilities:Object.freeze((extension.capabilities??[]).filter(capability=>KNOWN_EXTENSION_CAPABILITIES.includes(capability))),pm_min_version:extension.pm_min_version,pm_max_version:extension.pm_max_version,source_package:extension.source_package})}function buildPolicyExtensionRef(extension){return{layer:extension.layer,name:extension.name,trusted:extension.trusted===!0,provenanceVerified:extension.provenance?.verified===!0,sandboxProfile:extension.sandbox_profile,permissions:extension.permissions&&typeof extension.permissions=="object"?{fs_read:extension.permissions.fs_read,fs_write:extension.permissions.fs_write,network:extension.permissions.network,env_read:extension.permissions.env_read,env_write:extension.permissions.env_write,process_spawn:extension.permissions.process_spawn}:void 0}}class ExtensionApiRegistrar{extension;hooks;#loadedExtension;#extensionRef;#hookRegistry;#commandRegistry;#parserRegistry;#preflightRegistry;#serviceRegistry;#rendererRegistry;#registrationRegistry;#activationWarnings;#activationFailures;#policy;constructor(extension,hooks,commands,parsers,preflight,services,renderers,registrations,activationWarnings,activationFailures,policy){this.#loadedExtension=extension,this.extension=buildExtensionSelfIdentity(extension),this.#extensionRef=buildPolicyExtensionRef(extension),this.#hookRegistry=hooks,this.#commandRegistry=commands,this.#parserRegistry=parsers,this.#preflightRegistry=preflight,this.#serviceRegistry=services,this.#rendererRegistry=renderers,this.#registrationRegistry=registrations,this.#activationWarnings=activationWarnings,this.#activationFailures=activationFailures,this.#policy=policy,this.registerCommand=this.registerCommand.bind(this),this.registerParser=this.registerParser.bind(this),this.registerPreflight=this.registerPreflight.bind(this),this.registerService=this.registerService.bind(this),this.registerFlags=this.registerFlags.bind(this),this.registerItemFields=this.registerItemFields.bind(this),this.registerItemTypes=this.registerItemTypes.bind(this),this.registerRelationshipKinds=this.registerRelationshipKinds.bind(this),this.registerMigration=this.registerMigration.bind(this),this.registerProfile=this.registerProfile.bind(this),this.registerRenderer=this.registerRenderer.bind(this),this.registerImporter=this.registerImporter.bind(this),this.registerExporter=this.registerExporter.bind(this),this.registerSearchProvider=this.registerSearchProvider.bind(this),this.registerVectorStoreAdapter=this.registerVectorStoreAdapter.bind(this),this.registerAssuranceMeasurementProvider=this.registerAssuranceMeasurementProvider.bind(this),this.hooks={beforeCommand:hook=>this.registerBeforeCommand(hook),beforeMutation:hook=>this.registerBeforeMutation(hook),afterCommand:hook=>this.registerAfterCommand(hook),onWrite:hook=>this.registerOnWrite(hook),onRead:hook=>this.registerOnRead(hook),onIndex:hook=>this.registerOnIndex(hook)}}allowRegistration(surface,method,capability,details){const decision=evaluateExtensionPolicyForRegistration(this.#policy,this.#extensionRef,surface,method,capability,details);return decision.warning&&this.#activationWarnings.push(decision.warning),decision.allowed}registerCommandTrace(mode,command,expectedSchema,received,hint){return{method:"registerCommand",registration_index:mode==="override"?this.#commandRegistry.overrides.length:this.#commandRegistry.handlers.length,command,expected_schema:expectedSchema,received:sanitizeRegistrationValue(received),hint}}registerCommandOverride(command,override){const normalizedCommand=normalizeCommandName(command);if(normalizedCommand.length===0)throw createRegistrationValidationError("registerCommand requires a non-empty command name",this.registerCommandTrace("override",command,'registerCommand("<command>", (context) => unknown)',command,"Provide a non-empty command path as the first argument."));if(typeof override!="function"){const trace=this.registerCommandTrace("override",normalizedCommand,'registerCommand("<command>", (context) => unknown)',override,"Provide a function as the second registerCommand argument.");throw createRegistrationValidationError(`registerCommand requires an override function when command name is provided (command="${normalizedCommand}", registration_index=${trace.registration_index})`,trace)}this.allowRegistration("commands.override","registerCommand","commands",{command:normalizedCommand})&&this.#commandRegistry.overrides.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,command:normalizedCommand,run:override})}resolveCommandDefinitionRunHandler(definition,normalizedCommand){const runHandler=typeof definition.run=="function"?definition.run:void 0,legacyHandler=typeof definition.handler=="function"?definition.handler:void 0;return!runHandler&&legacyHandler&&this.#activationWarnings.push(`extension_command_definition_legacy_handler_alias:${this.#loadedExtension.layer}:${this.#loadedExtension.name}:${normalizedCommand}`),runHandler??legacyHandler}registerCommandDefinition(definition){if(typeof definition!="object"||definition===null)throw createRegistrationValidationError("registerCommand requires a command definition object",this.registerCommandTrace("definition",void 0,"{ name: string; run: (context) => unknown; }",definition,'Use registerCommand({ name: "command path", run: (context) => ... }).'));if(typeof definition.name!="string")throw createRegistrationValidationError("registerCommand requires a command definition name",this.registerCommandTrace("definition",void 0,"{ name: string; run: (context) => unknown; }",definition,"Set command definition.name to a non-empty string command path."));const normalizedCommand=normalizeCommandName(definition.name);if(normalizedCommand.length===0)throw createRegistrationValidationError("registerCommand requires a non-empty command definition name",this.registerCommandTrace("definition",definition.name,"{ name: string; run: (context) => unknown; }",definition,"Ensure command definition.name contains a non-empty command path."));const resolvedHandler=this.resolveCommandDefinitionRunHandler(definition,normalizedCommand);if(typeof resolvedHandler!="function"){const trace=this.registerCommandTrace("definition",normalizedCommand,"{ name: string; run: (context) => unknown; }",resolvedHandler,"Define command definition.run as a function.");throw createRegistrationValidationError(`registerCommand requires a command definition run handler (command="${normalizedCommand}", registration_index=${trace.registration_index})`,trace)}try{assertCommandDefinitionMetadataStrings(definition);const action=resolveCommandDefinitionAction(normalizedCommand,definition.action),readOutput=normalizeExtensionReadOutput(definition.read_output,normalizedCommand,action);if(!this.allowRegistration("commands.handler","registerCommand","commands",{command:normalizedCommand,action}))return;const description=definition.description?.trim(),intent=definition.intent?.trim(),examples=normalizeOptionalStringArrayField("registerCommand definition.examples",definition.examples),failureHints=normalizeOptionalStringArrayField("registerCommand definition.failure_hints",definition.failure_hints),argumentsDefinition=normalizeCommandDefinitionArguments(definition.arguments);definition.flags!==void 0&&(assertExtensionCapability(this.#loadedExtension,"schema","registerCommand flags"),this.allowRegistration("schema.flags","registerCommand flags","schema")&&(validateFlagDefinitions(definition.flags),this.#registrationRegistry.flags.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,target_command:normalizedCommand,flags:normalizeFlagDefinitions("registerCommand definition.flags",definition.flags)})));const registration={read_output:readOutput,layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,source_package:this.#loadedExtension.source_package,command:normalizedCommand,action,examples,failure_hints:failureHints,arguments:argumentsDefinition,tier:definition.tier??"standard",family:definition.family??"extensions"};description&&(registration.description=description),intent&&(registration.intent=intent),this.#registrationRegistry.commands.push(registration)}catch(error){const reason=formatUnknownError(error),trace=this.registerCommandTrace("definition",normalizedCommand,"{ name: string; run: (context) => unknown; action?: string; arguments?: object[]; flags?: object[]; }",definition,reason),validationError=createRegistrationValidationError(`registerCommand definition metadata invalid (command="${normalizedCommand}", registration_index=${trace.registration_index}): ${reason}`,trace);this.#activationWarnings.push(`extension_command_quarantined:${this.#loadedExtension.layer}:${this.#loadedExtension.name}:${normalizedCommand}`),this.#activationFailures.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,entry_path:this.#loadedExtension.entry_path,error:validationError.message,trace});return}this.#commandRegistry.handlers.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,command:normalizedCommand,run:resolvedHandler})}registerCommand(commandOrDefinition,override){if(assertExtensionCapability(this.#loadedExtension,"commands","registerCommand"),typeof commandOrDefinition=="string"){this.registerCommandOverride(commandOrDefinition,override);return}this.registerCommandDefinition(commandOrDefinition)}registerParser(command,override){if(assertExtensionCapability(this.#loadedExtension,"parser","registerParser"),!this.allowRegistration("parser.override","registerParser","parser"))return;const normalizedCommand=normalizeCommandName(assertNonEmptyRegistrationString("registerParser command",command));assertRegistrationFunction("registerParser override",override),this.#parserRegistry.overrides.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,command:normalizedCommand,run:override})}registerPreflight(override){if(assertExtensionCapability(this.#loadedExtension,"preflight","registerPreflight"),!this.allowRegistration("preflight.override","registerPreflight","preflight"))return;const normalized=normalizePreflightOverride(override);this.#preflightRegistry.overrides.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,...normalized})}registerService(service,override,ownership={}){assertExtensionCapability(this.#loadedExtension,"services","registerService");const normalizedService=String(service).trim().toLowerCase();if(!isExtensionServiceName(normalizedService))throw new TypeError(`registerService service must be one of: ${KNOWN_EXTENSION_SERVICE_NAMES.join(", ")}`);this.allowRegistration("services.override","registerService","services",{service:normalizedService})&&(assertRegistrationFunction("registerService override",override),this.#serviceRegistry.overrides.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,service:normalizedService,run:override,...normalizeServiceOverrideOwnership(ownership)?{passThrough:!0}:{}}))}registerRenderer(format,renderer,ownership={}){if(assertExtensionCapability(this.#loadedExtension,"renderers","registerRenderer"),!this.allowRegistration("renderers.override","registerRenderer","renderers"))return;if(typeof renderer!="function")throw new TypeError("registerRenderer requires a renderer function");const normalizedFormat=String(format).trim().toLowerCase();if(!isOutputRendererFormat(normalizedFormat))throw new Error(`registerRenderer format must be toon|json, received: ${String(format)}`);if(ownership.resultDiscriminator!==void 0&&typeof ownership.resultDiscriminator!="function")throw new TypeError("registerRenderer ownership.resultDiscriminator must be a function when provided");const commands=[...new Set((ownership.commands??[]).map(command=>{if(typeof command!="string"||command.trim().length===0)throw new TypeError("registerRenderer ownership.commands must contain non-empty command paths");return normalizeCommandName(command)}))];this.#rendererRegistry.overrides.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,format:normalizedFormat,run:renderer,commands,...ownership.resultDiscriminator?{resultDiscriminator:ownership.resultDiscriminator}:{}})}registerFlags(targetCommand,flags){if(assertExtensionCapability(this.#loadedExtension,"schema","registerFlags"),!this.allowRegistration("schema.flags","registerFlags","schema"))return;const normalizedTargetCommand=normalizeCommandName(assertNonEmptyRegistrationString("registerFlags targetCommand",targetCommand));validateFlagDefinitions(flags);const normalizedFlags=normalizeFlagDefinitions("registerFlags flags",flags);if(normalizedFlags.length===0)throw new TypeError("registerFlags requires at least one flag definition");this.#registrationRegistry.flags.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,target_command:normalizedTargetCommand,flags:normalizedFlags})}registerItemFields(fields){if(assertExtensionCapability(this.#loadedExtension,"schema","registerItemFields"),!this.allowRegistration("schema.itemfields","registerItemFields","schema"))return;validateItemFieldDefinitions(fields);const normalizedFields=normalizeRegistrationRecordList("registerItemFields fields",fields);if(normalizedFields.length===0)throw new TypeError("registerItemFields requires at least one field definition");this.#registrationRegistry.item_fields.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,fields:normalizedFields})}registerItemTypes(types){if(assertExtensionCapability(this.#loadedExtension,"schema","registerItemTypes"),!this.allowRegistration("schema.itemtypes","registerItemTypes","schema"))return;validateItemTypeDefinitions(types);const normalizedTypes=normalizeRegistrationRecordList("registerItemTypes types",types);if(normalizedTypes.length===0)throw new TypeError("registerItemTypes requires at least one type definition");this.#registrationRegistry.item_types.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,types:normalizedTypes})}registerRelationshipKinds(definitions){if(assertExtensionCapability(this.#loadedExtension,"schema","registerRelationshipKinds"),!this.allowRegistration("schema.relationshipkinds","registerRelationshipKinds","schema"))return;if(!Array.isArray(definitions))throw new TypeError("registerRelationshipKinds definitions requires an array of object definitions");if(definitions.length===0)throw new TypeError("registerRelationshipKinds requires at least one definition");const registry=createRelationshipKindRegistry();for(const registration of this.#registrationRegistry.relationship_kinds)for(const definition of registration.definitions)registry.register(definition);const validated=definitions.map(definition=>(registry.register(definition),registry.require(definition.kind)));this.#registrationRegistry.relationship_kinds.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,definitions:validated})}registerMigration(definition){if(assertExtensionCapability(this.#loadedExtension,"schema","registerMigration"),!this.allowRegistration("schema.migrations","registerMigration","schema"))return;validateMigrationDefinition(definition);const runtimeDefinition=normalizeRuntimeRegistrationRecord("registerMigration definition",definition);this.#registrationRegistry.migrations.push(attachRuntimeDefinition({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,definition:normalizeRegistrationRecord("registerMigration definition",definition)},runtimeDefinition))}registerProfile(profile){if(assertExtensionCapability(this.#loadedExtension,"schema","registerProfile"),!this.allowRegistration("schema.profiles","registerProfile","schema"))return;const snapshot=cloneRuntimeRegistrationValue(profile);validateProjectProfileDefinition(snapshot),this.#registrationRegistry.profiles.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,profile:applyProjectProfileDefaults(snapshot)})}registerImportExportCommandFlags(method,commandPath,resolvedOptions){resolvedOptions.flags!==void 0&&(assertExtensionCapability(this.#loadedExtension,"schema",`${method} options.flags`),this.allowRegistration("schema.flags",`${method} options.flags`,"schema")&&(validateFlagDefinitions(resolvedOptions.flags),this.#registrationRegistry.flags.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,target_command:commandPath,flags:normalizeFlagDefinitions(`${method} options.flags`,resolvedOptions.flags)})))}applyImportExportCommandMetadata(method,commandPath,options){if(options!==void 0&&(typeof options!="object"||options===null||Array.isArray(options)))throw new TypeError(`${method} options must be an object when provided`);const defaultDescription=`${method==="registerImporter"?"Import":"Export"} items with the registered extension adapter.`,defaultArguments=[{name:"file",required:!1,description:"Optional input or output file path."}],resolvedOptions={...options,description:options?.description??defaultDescription,arguments:options?.arguments??defaultArguments},output=resolveImportExportArtifactOutput(method,resolvedOptions,options?.description!==void 0);assertOptionalStringField(`${method} options.action`,resolvedOptions.action),assertOptionalStringField(`${method} options.description`,resolvedOptions.description),assertOptionalStringField(`${method} options.intent`,resolvedOptions.intent);const action=resolveCommandDefinitionAction(commandPath,resolvedOptions.action),examples=normalizeOptionalStringArrayField(`${method} options.examples`,resolvedOptions.examples),failureHints=normalizeOptionalStringArrayField(`${method} options.failure_hints`,resolvedOptions.failure_hints),argumentsDefinition=normalizeCommandDefinitionArguments(resolvedOptions.arguments);this.registerImportExportCommandFlags(method,commandPath,resolvedOptions);const registration={layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,source_package:this.#loadedExtension.source_package,command:commandPath,action,examples,failure_hints:failureHints,arguments:argumentsDefinition},description=resolvedOptions.description?.trim();description&&(registration.description=description);const intent=resolvedOptions.intent?.trim();return intent&&(registration.intent=intent),this.#registrationRegistry.commands.push(registration),output}registerImporter(name,importer,options){if(assertExtensionCapability(this.#loadedExtension,"importers","registerImporter"),!this.allowRegistration("importers.importer","registerImporter","importers"))return;const normalizedName=normalizeRegistrationName(assertNonEmptyRegistrationString("registerImporter name",name));assertRegistrationFunction("registerImporter importer",importer);const commandPath=toRegistrationCommandPath(normalizedName,"import");this.applyImportExportCommandMetadata("registerImporter",commandPath,options),this.#registrationRegistry.importers.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,importer:normalizedName}),this.#commandRegistry.handlers.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,command:commandPath,run:async context=>importer(buildImportExportContext(context,normalizedName,"import"))})}registerExporter(name,exporter,options){if(assertExtensionCapability(this.#loadedExtension,"importers","registerExporter"),!this.allowRegistration("importers.exporter","registerExporter","importers"))return;const normalizedName=normalizeRegistrationName(assertNonEmptyRegistrationString("registerExporter name",name));assertRegistrationFunction("registerExporter exporter",exporter);const commandPath=toRegistrationCommandPath(normalizedName,"export"),output=this.applyImportExportCommandMetadata("registerExporter",commandPath,options);this.#registrationRegistry.exporters.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,exporter:normalizedName,...output===void 0?{}:{output}}),this.#commandRegistry.handlers.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,command:commandPath,run:async context=>{const result=await exporter(buildImportExportContext(context,normalizedName,"export"));return output?.receipt==="suppress"&&!isHostOutputSuppressed(result)?suppressHostOutput(result):result}})}registerSearchProvider(provider){if(assertExtensionCapability(this.#loadedExtension,"search","registerSearchProvider"),!this.allowRegistration("search.provider","registerSearchProvider","search"))return;const runtimeDefinition=normalizeRuntimeRegistrationRecord("registerSearchProvider provider",provider);this.#registrationRegistry.search_providers.push(attachRuntimeDefinition({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,definition:normalizeRegistrationRecord("registerSearchProvider provider",provider)},runtimeDefinition))}registerVectorStoreAdapter(adapter){if(assertExtensionCapability(this.#loadedExtension,"search","registerVectorStoreAdapter"),!this.allowRegistration("search.vectorstore","registerVectorStoreAdapter","search"))return;const runtimeDefinition=normalizeRuntimeRegistrationRecord("registerVectorStoreAdapter adapter",adapter);this.#registrationRegistry.vector_store_adapters.push(attachRuntimeDefinition({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,definition:normalizeRegistrationRecord("registerVectorStoreAdapter adapter",adapter)},runtimeDefinition))}registerAssuranceMeasurementProvider(provider){if(assertExtensionCapability(this.#loadedExtension,"services","registerAssuranceMeasurementProvider"),!this.allowRegistration("services.assuranceprovider","registerAssuranceMeasurementProvider","services"))return;if(validateAssuranceMeasurementProviderDefinition(provider),provider.network&&this.#loadedExtension.permissions?.network!==!0)throw new TypeError("registerAssuranceMeasurementProvider network provider requires permissions.network=true");const runtimeDefinition=normalizeRuntimeRegistrationRecord("registerAssuranceMeasurementProvider provider",provider);this.#registrationRegistry.assurance_providers.push(attachRuntimeDefinition({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,network_permission:this.#loadedExtension.permissions?.network===!0,definition:normalizeRegistrationRecord("registerAssuranceMeasurementProvider provider",provider)},runtimeDefinition))}registerBeforeCommand(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.beforeCommand"),this.allowRegistration("hooks.beforecommand","api.hooks.beforeCommand","hooks")&&(assertHookHandler("beforeCommand",hook),this.#hookRegistry.beforeCommand.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}registerBeforeMutation(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.beforeMutation"),this.allowRegistration("hooks.beforemutation","api.hooks.beforeMutation","hooks")&&(assertHookHandler("beforeMutation",hook),this.#hookRegistry.beforeMutation.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}registerAfterCommand(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.afterCommand"),this.allowRegistration("hooks.aftercommand","api.hooks.afterCommand","hooks")&&(assertHookHandler("afterCommand",hook),this.#hookRegistry.afterCommand.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}registerOnWrite(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.onWrite"),this.allowRegistration("hooks.onwrite","api.hooks.onWrite","hooks")&&(assertHookHandler("onWrite",hook),this.#hookRegistry.onWrite.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}registerOnRead(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.onRead"),this.allowRegistration("hooks.onread","api.hooks.onRead","hooks")&&(assertHookHandler("onRead",hook),this.#hookRegistry.onRead.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}registerOnIndex(hook){assertExtensionCapability(this.#loadedExtension,"hooks","api.hooks.onIndex"),this.allowRegistration("hooks.onindex","api.hooks.onIndex","hooks")&&(assertHookHandler("onIndex",hook),this.#hookRegistry.onIndex.push({layer:this.#loadedExtension.layer,name:this.#loadedExtension.name,run:hook}))}}function createExtensionApi(extension,hooks,commands,parsers,preflight,services,renderers,registrations,activationWarnings,activationFailures,policy){return new ExtensionApiRegistrar(extension,hooks,commands,parsers,preflight,services,renderers,registrations,activationWarnings,activationFailures,policy)}function getRegistrationCounts(registrations){const commandCount=registrations.commands.length,flagCount=registrations.flags.reduce((total,entry)=>total+entry.flags.length,0),itemFieldCount=registrations.item_fields.reduce((total,entry)=>total+entry.fields.length,0),itemTypeCount=registrations.item_types.reduce((total,entry)=>total+entry.types.length,0),relationshipKindCount=(registrations.relationship_kinds??[]).reduce((total,entry)=>total+entry.definitions.length,0);return{commands:commandCount,flags:flagCount,item_fields:itemFieldCount,item_types:itemTypeCount,...relationshipKindCount>0?{relationship_kinds:relationshipKindCount}:{},migrations:registrations.migrations.length,profiles:registrations.profiles.length,importers:registrations.importers.length,exporters:registrations.exporters.length,search_providers:registrations.search_providers.length,vector_store_adapters:registrations.vector_store_adapters.length,...(registrations.assurance_providers?.length??0)>0?{assurance_providers:registrations.assurance_providers.length}:{}}}function collectCommandCollisionWarnings(commands){const warnings=[],collectByCommand=(entries,codePrefix)=>{const grouped=new Map;for(const entry of entries){const bucket=grouped.get(entry.command)??[];bucket.push(entry),grouped.set(entry.command,bucket)}for(const command of[...grouped.keys()].sort((left,right)=>left.localeCompare(right))){const bucket=grouped.get(command);if(bucket.length<=1)continue;const winner=bucket[bucket.length-1];for(const displaced of bucket.slice(0,-1))warnings.push(`${codePrefix}:${command}:${winner.layer}:${winner.name}:${displaced.layer}:${displaced.name}`)}};collectByCommand(commands.handlers,"extension_command_handler_collision"),collectByCommand(commands.overrides,"extension_command_override_collision");const handlerCommands=new Set(commands.handlers.map(entry=>entry.command)),overlapCommands=[...new Set(commands.overrides.map(entry=>entry.command))].filter(command=>handlerCommands.has(command));overlapCommands.sort((left,right)=>left.localeCompare(right));for(const command of overlapCommands){const handlers=commands.handlers.filter(entry=>entry.command===command),overrides=commands.overrides.filter(entry=>entry.command===command);for(const override of overrides)for(const handler of handlers)warnings.push(`extension_command_override_handler_overlap:${command}:${override.layer}:${override.name}:${handler.layer}:${handler.name}`)}return warnings}function collectRendererCollisionWarnings(renderers){const grouped=new Map;for(const entry of renderers.overrides){const bucket=grouped.get(entry.format)??[];bucket.push(entry),grouped.set(entry.format,bucket)}const warnings=[];for(const format of[...grouped.keys()].sort((left,right)=>left.localeCompare(right))){const bucket=grouped.get(format);if(bucket.length<=1)continue;const winner=bucket[bucket.length-1];for(const displaced of bucket.slice(0,-1))winner.commands?.length&&displaced.commands?.length&&!displaced.commands.some(command=>winner.commands?.includes(command))||warnings.push(`extension_renderer_collision:${format}:${winner.layer}:${winner.name}:${displaced.layer}:${displaced.name}`)}return warnings}function collectParserCollisionWarnings(parsers){const warnings=[],grouped=new Map;for(const entry of parsers.overrides){const bucket=grouped.get(entry.command)??[];bucket.push(entry),grouped.set(entry.command,bucket)}for(const command of[...grouped.keys()].sort((left,right)=>left.localeCompare(right))){const bucket=grouped.get(command);if(bucket.length<=1)continue;const winner=bucket[bucket.length-1];for(const displaced of bucket.slice(0,-1))warnings.push(`extension_parser_override_collision:${command}:${winner.layer}:${winner.name}:${displaced.layer}:${displaced.name}`)}return warnings}const CHAINED_SERVICE_NAMES=new Set(["output_format"]);function collectServiceCollisionWarnings(services){const warnings=[],grouped=new Map;for(const entry of services.overrides){const bucket=grouped.get(entry.service)??[];bucket.push(entry),grouped.set(entry.service,bucket)}for(const service of[...grouped.keys()].sort((left,right)=>left.localeCompare(right))){const bucket=grouped.get(service);if(bucket.length<=1||CHAINED_SERVICE_NAMES.has(service))continue;const winner=bucket[bucket.length-1];for(const displaced of bucket.slice(0,-1))warnings.push(`extension_service_override_collision:${service}:${winner.layer}:${winner.name}:${displaced.layer}:${displaced.name}`)}return warnings}async function activateExtensions(loadResult){const policy=hydrateExtensionPolicy(loadResult.policy??DEFAULT_EXTENSION_POLICY),hooks=createEmptyExtensionHookRegistry(),commands=createEmptyExtensionCommandRegistry(),parsers=createEmptyExtensionParserRegistry(),preflight=createEmptyExtensionPreflightRegistry(),services=createEmptyExtensionServiceRegistry(),renderers=createEmptyExtensionRendererRegistry(),registrations=createEmptyExtensionRegistrationRegistry(),failed=[],warnings=[];for(const extension of loadResult.loaded){const activatable=resolveActivatableExtension(extension.module);if(!activatable)continue;const failedBeforeActivation=failed.length,rollbackPartialActivation=captureExtensionActivationRollback({hooks,commands,parsers,preflight,services,renderers,registrations});try{await activatable.activate(createExtensionApi(extension,hooks,commands,parsers,preflight,services,renderers,registrations,warnings,failed,policy)),failed.length>failedBeforeActivation&&(rollbackPartialActivation(),warnings.push(`extension_activation_rolled_back:${extension.layer}:${extension.name}`))}catch(error){rollbackPartialActivation(),warnings.push(`extension_activate_failed:${extension.layer}:${extension.name}`);const trace=extractRegistrationValidationTrace(error);failed.push({layer:extension.layer,name:extension.name,entry_path:extension.entry_path,error:formatUnknownError(error),trace})}}const collisionWarnings=[...collectCommandCollisionWarnings(commands),...collectParserCollisionWarnings(parsers),...collectPreflightCollisionWarnings(preflight),...collectServiceCollisionWarnings(services),...collectRendererCollisionWarnings(renderers)],mergedWarnings=[...new Set([...warnings,...collisionWarnings])];return{hooks,commands,parsers,preflight,services,renderers,registrations,failed,warnings:mergedWarnings,hook_counts:{before_command:hooks.beforeCommand.length,before_mutation:hooks.beforeMutation.length,after_command:hooks.afterCommand.length,on_write:hooks.onWrite.length,on_read:hooks.onRead.length,on_index:hooks.onIndex.length},command_override_count:commands.overrides.length,command_handler_count:commands.handlers.length,parser_override_count:parsers.overrides.length,preflight_override_count:preflight.overrides.length,service_override_count:services.overrides.length,renderer_override_count:renderers.overrides.length,registration_counts:getRegistrationCounts(registrations)}}const _testOnlyLoader={assertFlagValueTypeAndDefault,assertOptionalStringField,compareComparableVersions,collectCommandCollisionWarnings,collectParserCollisionWarnings,collectRendererCollisionWarnings,collectServiceCollisionWarnings,createExtensionApi,createRegistrationValidationError,evaluatePmMaxVersionCompatibility,evaluatePmMinVersionCompatibility,extractRegistrationValidationTrace,fingerprintPath,getRegistrationCounts,normalizeCommandDefinitionArguments,normalizeExtensionDeactivateTimeout,normalizeOptionalStringArrayField,normalizeRegistrationRecord,normalizeRegistrationRecordList,normalizeRuntimeRegistrationRecord,parseComparableVersion,parseManifest:parseExtensionManifestDocument,readCurrentPmCliVersion,readManagedExtensionSourcePackages:async extensionsRoot=>new Map([...await readManagedExtensionSourcePackages(extensionsRoot)].filter(entry=>typeof entry[1].package_name=="string").map(([key,identity])=>[key,identity.package_name])),resolveExtensionImportHref,resolveCurrentPmCliVersion,resolveCommandDefinitionAction,sanitizeRegistrationValue,validateItemFieldDefinitions,resetCurrentPmCliVersionCacheForTest:()=>{currentPmCliVersionPromise=null}};export{DEFAULT_EXTENSION_PRIORITY,_testOnlyLoader,activateExtensions,createEmptyExtensionCommandRegistry2 as createEmptyExtensionCommandRegistry,createEmptyExtensionHookRegistry2 as createEmptyExtensionHookRegistry,createEmptyExtensionParserRegistry2 as createEmptyExtensionParserRegistry,createEmptyExtensionPreflightRegistry2 as createEmptyExtensionPreflightRegistry,createEmptyExtensionRegistrationRegistry2 as createEmptyExtensionRegistrationRegistry,createEmptyExtensionRendererRegistry2 as createEmptyExtensionRendererRegistry,createEmptyExtensionServiceRegistry2 as createEmptyExtensionServiceRegistry,deactivateExtensions,discoverExtensions,isCanonicalPathWithinDirectory,loadExtensions,nextExtensionReloadToken,parseExtensionManifestDocument2 as parseExtensionManifestDocument,parseLegacyExtensionCapabilityAliasWarning,parseUnknownExtensionCapabilityWarning,resolveExtensionRoots,runAfterCommandHooks,runBeforeCommandHooks,runBeforeMutationHooks,runCommandHandler,runCommandOverride,runOnIndexHooks,runOnReadHooks,runOnWriteHooks,runParserOverride,runPreflightOverride,runRendererOverride,runServiceOverride,runServiceOverrideSync};
2
2
  //# sourceMappingURL=loader.js.map
@@ -0,0 +1,2 @@
1
+ /** Explain one version-bound finding without changing package enablement or compatibility policy. */
2
+ export declare function extensionVersionRemediation(warning:string):string | undefined;
@@ -0,0 +1,2 @@
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]="a8289336-e833-5617-9a32-0a21f28f294e")}catch{}})();import{renderPmCommand}from"../../sdk/command-line.js";function extensionVersionRemediation(warning){const match=/^extension_(disabled_)?pm_(min|max)_version_([a-z_]+):(project|global):([^:]+):(.+)$/u.exec(warning);if(!match)return;const[,disabled,bound,status,scope,name,details]=match,constraint=details.split(":")[0].replace(bound==="min"?"required=":"allowed=",""),requirement=status==="invalid"?`a valid pm_${bound}_version instead of ${constraint}`:`pm ${bound==="min"?">=":"<="} ${constraint}`;return disabled?`Package ${name} is disabled and requires ${requirement} before activation. After satisfying the bound, run ${renderPmCommand(["package","activate",name,`--${scope}`])}.`:`Package ${name} requires ${requirement}. Use a compatible host or package version, or keep it disabled with ${renderPmCommand(["package","deactivate",name,`--${scope}`])}.`}export{extensionVersionRemediation};
2
+ //# sourceMappingURL=version-diagnostics.js.map
@@ -36,6 +36,10 @@ export declare function hasUnexpiredLockOwner(pmRoot:string,id:string,ownerPrefi
36
36
  declare function lockOwnerSuffix(info:LockInfo | null):string;
37
37
  /** Resolves the effective bounded wait budget for a contended lock: the PM_LOCK_WAIT_MS environment override wins when it parses as a non-negative integer, then the caller-provided budget (settings `locks.wait_ms`), then 0 (fail-fast, the pre-wait behavior). */
38
38
  declare function resolveLockWaitMs(waitMs:number | undefined):number;
39
+ /** Identity of one lock generation; a change proves another writer made progress. */
40
+ declare function lockGenerationKey(info:LockInfo | null):string;
41
+ /** Wait (bounded) for the per-lock cleanup gate that every takeover must also hold; null when it stays held. */
42
+ export declare function waitForStaleCleanupGate(lockPath:string,id:string):Promise<(() => Promise<void>) | null>;
39
43
  /** Fence lock publication, release and garbage collection under one cleanup owner. */
40
44
  export declare function acquireStaleCleanupGate(lockPath:string,_id:string):Promise<(() => Promise<void>) | null>;
41
45
  /** Retain an immutable local audit of early-recovery intent before removing the observed owner. */
@@ -61,11 +65,37 @@ buildLockPayload:typeof buildLockPayload;
61
65
  isStaleLock:typeof isStaleLock;
62
66
  lockOwnerSuffix:typeof lockOwnerSuffix;
63
67
  resolveLockWaitMs:typeof resolveLockWaitMs;
68
+ lockGenerationKey:typeof lockGenerationKey;
64
69
  parseLinuxProcessStartIdentity:typeof parseLinuxProcessStartIdentity;
65
70
  readProcessStartIdentity:typeof readProcessStartIdentity;
66
71
  acquireStaleCleanupGate:typeof acquireStaleCleanupGate;
67
72
  removeConfirmedStaleLock:typeof removeConfirmedStaleLock;
68
73
  };
74
+ /** A held tracker lock whose commits can be fenced against a lost lease. */
75
+ export interface LockLease {
76
+ /** Release the lock if this writer still owns it; idempotent for peers' locks. */
77
+ release:() => Promise<void>;
78
+ /**
79
+ * Run `commit` only while this lease still owns its lock generation. A lease
80
+ * that expired and was taken over (or released) refuses with `lock_lost` and
81
+ * never runs `commit`. Extension lock overrides own their lifecycle, so their
82
+ * leases run `commit` unfenced.
83
+ */
84
+ fence:<T>(commit:() => Promise<T>) => Promise<T>;
85
+ }
86
+ /** Positional lock policy shared by acquireLock and acquireLockLease. */
87
+ type AcquireLockOptions = {
88
+ /** Allow lock acquisition to initialize missing lock directories. */
89
+ createParentDirectories?:boolean;
90
+ /** Ceiling on the effective retry budget, including PM_LOCK_WAIT_MS. */
91
+ maxWaitMs?:number;
92
+ /**
93
+ * How the wait budget is spent. "total" (default) refuses once the budget
94
+ * elapses. "progress" treats it as a no-progress window that every observed
95
+ * owner handoff restarts, bounded by maxWaitMs or LOCK_PROGRESS_MAX_WAIT_MS.
96
+ */
97
+ waitPolicy?:"total" | "progress";
98
+ };
69
99
  /**
70
100
  * Acquire a token-owned tracker lock with bounded contention waiting and
71
101
  * explicit stale-owner policy. Proven same-host original-process death permits
@@ -76,9 +106,13 @@ removeConfirmedStaleLock:typeof removeConfirmedStaleLock;
76
106
  * environment requests a longer wait. Extension overrides receive that ceiling
77
107
  * and retain responsibility for their own lifecycle.
78
108
  */
79
- export declare function acquireLock(pmRoot:string,id:string,ttlSeconds:number,owner:string,force?:boolean,forceRequiredForStaleLock?:boolean,waitMs?:number,options?:{
80
- /** Allow lock acquisition to initialize missing lock directories. */
81
- createParentDirectories?:boolean;
82
- /** Ceiling on the effective retry budget, including PM_LOCK_WAIT_MS. */
83
- maxWaitMs?:number;
84
- }):Promise<() => Promise<void>>;
109
+ export declare function acquireLock(pmRoot:string,id:string,ttlSeconds:number,owner:string,force?:boolean,forceRequiredForStaleLock?:boolean,waitMs?:number,options?:AcquireLockOptions):Promise<() => Promise<void>>;
110
+ /**
111
+ * Acquire a lock as a fenceable lease. With `waitPolicy: "progress"` the wait
112
+ * budget is a no-progress window: every observed owner handoff restarts it, so a
113
+ * queue of live writers drains instead of failing at a fixed deadline, while a
114
+ * stalled owner still refuses after the configured budget. Without an explicit
115
+ * maxWaitMs such a wait is bounded by LOCK_PROGRESS_MAX_WAIT_MS (or the budget
116
+ * itself when larger). The default "total" policy keeps a fixed total budget.
117
+ */
118
+ export declare function acquireLockLease(pmRoot:string,id:string,ttlSeconds:number,owner:string,force?:boolean,forceRequiredForStaleLock?:boolean,waitMs?:number,options?:AcquireLockOptions):Promise<LockLease>;