@unbrained/pm-cli 2026.10.21 → 2026.10.23

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 (186) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +134 -77
  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-DIR3YEFD.js → chunk-2LTGJ5DL.js} +2 -2
  8. package/dist/cli-bundle/chunks/{chunk-EMGMLKRV.js → chunk-2UX2TAN2.js} +15 -15
  9. package/dist/cli-bundle/chunks/{chunk-2B5HAZFK.js → chunk-3S5FLCG7.js} +2 -2
  10. package/dist/cli-bundle/chunks/chunk-5DKCD4KV.js +126 -0
  11. package/dist/cli-bundle/chunks/{chunk-V3XONSVC.js → chunk-5V4HU6GK.js} +48 -48
  12. package/dist/cli-bundle/chunks/{chunk-QPV6UD55.js → chunk-AAX7CNL7.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-TMXWWOPJ.js → chunk-AXGFNNI3.js} +2 -2
  14. package/dist/cli-bundle/chunks/chunk-F76ZUP73.js +113 -0
  15. package/dist/cli-bundle/chunks/chunk-HDKY2YX3.js +3 -0
  16. package/dist/cli-bundle/chunks/{chunk-DR6DUBTU.js → chunk-KY34HTT2.js} +29 -29
  17. package/dist/cli-bundle/chunks/chunk-MMVX5L32.js +20 -0
  18. package/dist/cli-bundle/chunks/{chunk-C6SAXKBO.js → chunk-MTRYEVZR.js} +2 -2
  19. package/dist/cli-bundle/chunks/chunk-QSY55FTA.js +2 -0
  20. package/dist/cli-bundle/chunks/{chunk-GWIGZDRS.js → chunk-R7KWBFM2.js} +2 -2
  21. package/dist/cli-bundle/chunks/{chunk-5PZ7JNMI.js → chunk-REXCO5AG.js} +2 -2
  22. package/dist/cli-bundle/chunks/chunk-ZDVTXLA6.js +9 -0
  23. package/dist/cli-bundle/chunks/{chunk-DJQVNDXO.js → chunk-ZEI3DC5E.js} +6 -6
  24. package/dist/cli-bundle/chunks/{chunk-MOC5BJHW.js → chunk-ZMJF5HQW.js} +2 -2
  25. package/dist/cli-bundle/chunks/chunk-ZNDYAZZ6.js +6 -0
  26. package/dist/cli-bundle/chunks/{indexed-receipt-blobs-65XXSPPR.js → indexed-receipt-blobs-XANVELIV.js} +2 -2
  27. package/dist/cli-bundle/chunks/{mutation-admission-FNWOVJLN.js → mutation-admission-P6LOBNLO.js} +2 -2
  28. package/dist/cli-bundle/chunks/{register-list-query-6PT5Y2EZ.js → register-list-query-JOB65KDN.js} +2 -2
  29. package/dist/cli-bundle/chunks/{register-mutation-TAIQV46L.js → register-mutation-QMNIN3RJ.js} +2 -2
  30. package/dist/cli-bundle/chunks/{register-operations-ONIRO22G.js → register-operations-Z4VET3I7.js} +2 -2
  31. package/dist/cli-bundle/chunks/register-setup-GNKWL3VL.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-FCPVFO3B.js → stage-FW5OXCCR.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-VD64TPXI.js → chunk-4MNUQCGR.js} +2 -2
  35. package/dist/cli-bundle/focused-chunks/chunk-6GTZ24YV.js +3 -0
  36. package/dist/cli-bundle/focused-chunks/{chunk-XE7P7N5X.js → chunk-BM652VCB.js} +6 -6
  37. package/dist/cli-bundle/focused-chunks/{chunk-3LWH2RJC.js → chunk-BUZ2Z4P3.js} +2 -2
  38. package/dist/cli-bundle/focused-chunks/chunk-CGL36F6I.js +2 -0
  39. package/dist/cli-bundle/focused-chunks/{chunk-KVYUQS6Y.js → chunk-DWQMYLFM.js} +2 -2
  40. package/dist/cli-bundle/focused-chunks/{chunk-4HJVAUFX.js → chunk-EDXTOAXP.js} +2 -2
  41. package/dist/cli-bundle/focused-chunks/chunk-FO4U3FIP.js +91 -0
  42. package/dist/cli-bundle/focused-chunks/chunk-GXKP56W7.js +2 -0
  43. package/dist/cli-bundle/focused-chunks/chunk-I2USTQNQ.js +2 -0
  44. package/dist/cli-bundle/focused-chunks/{chunk-44353U27.js → chunk-JDN34LEZ.js} +2 -2
  45. package/dist/cli-bundle/focused-chunks/{chunk-CUWNNU4N.js → chunk-KI5YFKNN.js} +2 -2
  46. package/dist/cli-bundle/focused-chunks/{chunk-7UD7XTOE.js → chunk-LEHGCPZ6.js} +11 -11
  47. package/dist/cli-bundle/focused-chunks/{chunk-HNCMYF2W.js → chunk-MLET6I3I.js} +2 -2
  48. package/dist/cli-bundle/focused-chunks/{chunk-PDOWLRHC.js → chunk-NSMZY6IK.js} +2 -2
  49. package/dist/cli-bundle/focused-chunks/chunk-OMXMYTEX.js +26 -0
  50. package/dist/cli-bundle/focused-chunks/{chunk-JI3RXXRN.js → chunk-P7DPS5M4.js} +2 -2
  51. package/dist/cli-bundle/focused-chunks/chunk-R536272H.js +9 -0
  52. package/dist/cli-bundle/focused-chunks/{chunk-5IMM7GOF.js → chunk-UNTCCJPL.js} +3 -3
  53. package/dist/cli-bundle/focused-chunks/{chunk-32ZKLRWM.js → chunk-XIZYJDYW.js} +2 -2
  54. package/dist/cli-bundle/focused-chunks/chunk-Z5LDTMZ3.js +2 -0
  55. package/dist/cli-bundle/focused-chunks/chunk-ZHMF34DT.js +65 -0
  56. package/dist/cli-bundle/focused-chunks/{chunk-P5D7MHDS.js → chunk-ZR6ZKQUK.js} +15 -15
  57. package/dist/cli-bundle/focused-chunks/{indexed-receipt-blobs-CRP6HAZY.js → indexed-receipt-blobs-FVOA3XMI.js} +2 -2
  58. package/dist/cli-bundle/focused-chunks/{mutation-admission-KM57KDDF.js → mutation-admission-HTFAIHJL.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-UJYGWNZ7.js → stage-X3BUGEJT.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/config/nested-settings.js +1 -1
  73. package/dist/core/extensions/loader.js +1 -1
  74. package/dist/core/extensions/version-diagnostics.d.ts +2 -0
  75. package/dist/core/extensions/version-diagnostics.js +2 -0
  76. package/dist/core/lock/lock.d.ts +40 -6
  77. package/dist/core/lock/lock.js +3 -3
  78. package/dist/core/shared/errors.d.ts +28 -0
  79. package/dist/core/shared/errors.js +1 -1
  80. package/dist/core/store/item-store.js +1 -1
  81. package/dist/mcp/http-server.js +2 -2
  82. package/dist/mcp/server.d.ts +2 -2
  83. package/dist/mcp/server.js +2 -2
  84. package/dist/sdk/agent/command-recovery.d.ts +2 -0
  85. package/dist/sdk/agent/command-recovery.js +1 -1
  86. package/dist/sdk/cli-contracts/agent-output-contracts.js +1 -1
  87. package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +6 -0
  88. package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
  89. package/dist/sdk/cli-contracts/tool-schema.js +1 -1
  90. package/dist/sdk/context-intent-contracts.d.ts +13 -0
  91. package/dist/sdk/context-intent-contracts.js +1 -1
  92. package/dist/sdk/contracts.d.ts +2 -1
  93. package/dist/sdk/contracts.js +1 -1
  94. package/dist/sdk/core.d.ts +2 -2
  95. package/dist/sdk/core.js +1 -1
  96. package/dist/sdk/define.d.ts +15 -16
  97. package/dist/sdk/define.js +1 -1
  98. package/dist/sdk/dependencies.js +1 -1
  99. package/dist/sdk/extension/doctor.js +1 -1
  100. package/dist/sdk/extension/install-receipts.js +1 -1
  101. package/dist/sdk/extension/install-snapshot.d.ts +11 -0
  102. package/dist/sdk/extension/install-snapshot.js +1 -1
  103. package/dist/sdk/extension.d.ts +12 -0
  104. package/dist/sdk/extension.js +1 -1
  105. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  106. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  107. package/dist/sdk/governance/health.d.ts +1 -0
  108. package/dist/sdk/governance/health.js +2 -2
  109. package/dist/sdk/index.d.ts +3 -2
  110. package/dist/sdk/index.js +1 -1
  111. package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
  112. package/dist/sdk/lifecycle/restore.js +1 -1
  113. package/dist/sdk/mcp/executable.d.ts +13 -0
  114. package/dist/sdk/mcp/executable.js +5 -0
  115. package/dist/sdk/merge/install.js +2 -2
  116. package/dist/sdk/public-surface.json +1 -1
  117. package/dist/sdk/query/context.d.ts +5 -0
  118. package/dist/sdk/query/context.js +2 -2
  119. package/dist/sdk/read-output/session-result.d.ts +39 -0
  120. package/dist/sdk/read-output/session-result.js +2 -0
  121. package/dist/sdk/read-output-contracts.d.ts +18 -5
  122. package/dist/sdk/read-output-contracts.js +1 -1
  123. package/dist/sdk/read-output-session.d.ts +2 -0
  124. package/dist/sdk/read-output-session.js +1 -1
  125. package/dist/sdk/relationship-context.js +1 -1
  126. package/dist/sdk/runtime-input.js +1 -1
  127. package/dist/sdk/runtime-primitives.d.ts +7 -1
  128. package/dist/sdk/runtime-primitives.js +1 -1
  129. package/dist/sdk/runtime.d.ts +11 -9
  130. package/dist/sdk/runtime.js +1 -1
  131. package/dist/sdk/workspace-snapshot.d.ts +5 -1
  132. package/dist/sdk/workspace-snapshot.js +3 -3
  133. package/dist/sdk/workspace.d.ts +3 -1
  134. package/dist/sdk/workspace.js +8 -5
  135. package/docs/CONFIGURATION.md +28 -3
  136. package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +30 -0
  137. package/docs/EXTENSION_AUTHOR_CONTRACTS.md +2 -1
  138. package/docs/EXTENSION_LIFECYCLE.md +47 -0
  139. package/docs/MCP_OPTION_CONFORMANCE.md +27 -1
  140. package/docs/MCP_REMOTE_TRANSPORT_SECURITY.md +16 -1
  141. package/docs/MERGE_SAFETY.md +8 -0
  142. package/docs/READ_OUTPUT_CONTRACTS.md +79 -0
  143. package/docs/RELATIONSHIP_GRAPH.md +15 -0
  144. package/docs/RELEASING.md +17 -0
  145. package/docs/SDK.md +76 -12
  146. package/docs/SDK_STORAGE_LIFECYCLE.md +2 -1
  147. package/docs/TESTING.md +16 -7
  148. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +6 -3
  149. package/marketplace.json +1 -1
  150. package/package.json +1 -1
  151. package/packages/pm-beads/package.json +1 -1
  152. package/packages/pm-calendar/package.json +1 -1
  153. package/packages/pm-command-kit/package.json +1 -1
  154. package/packages/pm-digital-twin/package.json +1 -1
  155. package/packages/pm-governance-audit/package.json +1 -1
  156. package/packages/pm-guide-shell/package.json +1 -1
  157. package/packages/pm-kanban/package.json +1 -1
  158. package/packages/pm-lifecycle-hooks/package.json +1 -1
  159. package/packages/pm-linked-test-adapters/package.json +1 -1
  160. package/packages/pm-search-advanced/package.json +1 -1
  161. package/packages/pm-templates/package.json +1 -1
  162. package/packages/pm-todos/package.json +1 -1
  163. package/packages/pm-vcs/package.json +1 -1
  164. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  165. package/plugins/pm-claude/package.json +1 -1
  166. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  167. package/plugins/pm-codex/package.json +1 -1
  168. package/plugins/pm-codex/plugin.json +1 -1
  169. package/runtime-dependencies.json +1 -1
  170. package/dist/cli-bundle/chunks/chunk-4OYU5OXQ.js +0 -6
  171. package/dist/cli-bundle/chunks/chunk-DIKQ2AL5.js +0 -2
  172. package/dist/cli-bundle/chunks/chunk-KBSVPUFD.js +0 -113
  173. package/dist/cli-bundle/chunks/chunk-MZZIAC6S.js +0 -20
  174. package/dist/cli-bundle/chunks/chunk-NNB65OOO.js +0 -3
  175. package/dist/cli-bundle/chunks/chunk-V5GJTXYW.js +0 -126
  176. package/dist/cli-bundle/chunks/chunk-ZNKFMIVA.js +0 -6
  177. package/dist/cli-bundle/chunks/register-setup-OQMUZBJV.js +0 -2
  178. package/dist/cli-bundle/focused-chunks/chunk-6QSZHRM7.js +0 -6
  179. package/dist/cli-bundle/focused-chunks/chunk-E2S42XCT.js +0 -2
  180. package/dist/cli-bundle/focused-chunks/chunk-GRSQGMRR.js +0 -2
  181. package/dist/cli-bundle/focused-chunks/chunk-IAGFXKMZ.js +0 -3
  182. package/dist/cli-bundle/focused-chunks/chunk-JMZPZQHR.js +0 -26
  183. package/dist/cli-bundle/focused-chunks/chunk-O3M6YWVL.js +0 -2
  184. package/dist/cli-bundle/focused-chunks/chunk-T27TLSEU.js +0 -65
  185. package/dist/cli-bundle/focused-chunks/chunk-VE6MTRH5.js +0 -2
  186. package/dist/cli-bundle/focused-chunks/chunk-YIWDX6KO.js +0 -91
@@ -24,8 +24,8 @@
24
24
  * - Definitions can be colocated, exported, reused, and unit-tested apart from
25
25
  * the `activate` call instead of being trapped as inline literals.
26
26
  *
27
- * Object-definition builders use a generic constraint (`<T extends Def>`) so the
28
- * narrow literal type survives the round-trip, mirroring `defineExtension`.
27
+ * Object-definition builders use const type parameters and exact-key constraints
28
+ * so literals survive the round-trip and misspelled metadata fails at author time.
29
29
  * Function-definition builders are intentionally non-generic: a generic
30
30
  * constrained to a whole function type suppresses contextual typing of a bare
31
31
  * arrow's parameter (it would fall back to implicit `any`), whereas the
@@ -35,7 +35,7 @@
35
35
  import type { AfterCommandHook,BeforeCommandHook,BeforeMutationHook,CommandDefinition,CommandOverride,Exporter,ExtensionManifest,FlagDefinition,Importer,OnIndexHook,OnReadHook,OnWriteHook,ParserOverride,PreflightOverride,ScopedPreflightOverrideDefinition,RendererOverride,ScopedRendererOverrideDefinition,SchemaFieldDefinition,SchemaItemTypeDefinition,SchemaMigrationDefinition,SearchProviderDefinition,ServiceOverride,ServiceOverrideDecision,VectorStoreAdapterDefinition } from "../core/extensions/loader.js";
36
36
  import type { ProjectProfileDefinition } from "../core/profile/profile-presets.js";
37
37
  type ExactDefinition<TDefinition,TContract> = TDefinition & Record<Exclude<keyof TDefinition,keyof TContract>,never>;
38
- type FlagAuthoringDefinition = Pick<FlagDefinition,"long" | "short" | "value_name" | "description" | "required" | "enabled" | "visible" | "value_type" | "type" | "list" | "default">;
38
+ type FlagAuthoringDefinition = Pick<FlagDefinition,"long" | "short" | "value_name" | "description" | "required" | "enabled" | "visible" | "value_type" | "type" | "list" | "repeatable" | "default" | "value_validation">;
39
39
  type ItemFieldAuthoringDefinition = Pick<SchemaFieldDefinition,"name" | "type" | "optional" | "default" | "values">;
40
40
  type ItemTypeAuthoringDefinition = Pick<SchemaItemTypeDefinition,"name" | "folder" | "aliases" | "required_create_fields" | "required_create_repeatables" | "command_option_policies" | "options" | "description" | "default_status" | "execution_role">;
41
41
  type MigrationAuthoringDefinition = Pick<SchemaMigrationDefinition,"id" | "description" | "status" | "mandatory" | "run">;
@@ -51,7 +51,7 @@ type VectorStoreAdapterAuthoringDefinition = Pick<VectorStoreAdapterDefinition,"
51
51
  * {@link ./compose.js#deriveExtensionCapabilities | `deriveExtensionCapabilities`}
52
52
  * to keep `capabilities` matched to the surfaces the extension actually registers.
53
53
  */
54
- export declare function defineExtensionManifest<TManifest extends ExtensionManifest>(manifest:TManifest):TManifest;
54
+ export declare function defineExtensionManifest<const TManifest extends ExtensionManifest>(manifest:ExactDefinition<TManifest,ExtensionManifest>):TManifest;
55
55
  /**
56
56
  * Type a project-profile definition for the profile registry.
57
57
  *
@@ -64,7 +64,7 @@ export declare function defineExtensionManifest<TManifest extends ExtensionManif
64
64
  * typed at the definition site, mirroring {@link defineItemType}. It is the
65
65
  * authoring anchor a first-party or third-party profile package builds on.
66
66
  */
67
- export declare function defineProjectProfile<TProfile extends ProjectProfileDefinition>(profile:TProfile):TProfile;
67
+ export declare function defineProjectProfile<const TProfile extends ProjectProfileDefinition>(profile:ExactDefinition<TProfile,ProjectProfileDefinition>):TProfile;
68
68
  /**
69
69
  * Type a command definition for `api.registerCommand(definition)`.
70
70
  *
@@ -73,7 +73,7 @@ export declare function defineProjectProfile<TProfile extends ProjectProfileDefi
73
73
  * types. Pass the result straight to `registerCommand`, or export it so the
74
74
  * command can be invoked in tests via `runRegisteredCommandForTest`.
75
75
  */
76
- export declare function defineCommand<TDefinition extends CommandDefinition>(definition:TDefinition):TDefinition;
76
+ export declare function defineCommand<const TDefinition extends CommandDefinition>(definition:ExactDefinition<TDefinition,CommandDefinition>):TDefinition;
77
77
  /**
78
78
  * Type a single flag definition for a `api.registerFlags(command, flags)` array.
79
79
  *
@@ -82,22 +82,21 @@ export declare function defineCommand<TDefinition extends CommandDefinition>(def
82
82
  * per-flag contract checking — `value_type`, `list`, and `default` included —
83
83
  * instead of validating a loosely-typed literal array all at once.
84
84
  */
85
- export declare function defineFlag<TFlag extends FlagAuthoringDefinition>(flag:ExactDefinition<TFlag,FlagAuthoringDefinition>):TFlag;
85
+ export declare function defineFlag<const TFlag extends FlagAuthoringDefinition>(flag:ExactDefinition<TFlag,FlagAuthoringDefinition>):TFlag;
86
86
  /**
87
87
  * Type a custom item-type definition for `api.registerItemTypes([...])`.
88
88
  *
89
89
  * Preserves the literal `name`/`folder`/`aliases` so a project archetype's
90
90
  * domain types stay strongly typed where the definition is declared and reused.
91
91
  */
92
- export declare function defineItemType<TType extends ItemTypeAuthoringDefinition>(type:ExactDefinition<TType,ItemTypeAuthoringDefinition>):TType;
92
+ export declare function defineItemType<const TType extends ItemTypeAuthoringDefinition>(type:ExactDefinition<TType,ItemTypeAuthoringDefinition>):TType;
93
93
  /**
94
94
  * Type a custom item-metadata field definition for `api.registerItemFields([...])`.
95
95
  *
96
96
  * Checks `name`/`type`/`optional` against {@link SchemaFieldDefinition} while
97
- * keeping the field's extra metadata (the contract carries an index signature)
98
- * intact.
97
+ * preserving literal names and supported default/value metadata.
99
98
  */
100
- export declare function defineItemField<TField extends ItemFieldAuthoringDefinition>(field:ExactDefinition<TField,ItemFieldAuthoringDefinition>):TField;
99
+ export declare function defineItemField<const TField extends ItemFieldAuthoringDefinition>(field:ExactDefinition<TField,ItemFieldAuthoringDefinition>):TField;
101
100
  /**
102
101
  * Type a schema migration definition for `api.registerMigration(definition)`.
103
102
  *
@@ -105,7 +104,7 @@ export declare function defineItemField<TField extends ItemFieldAuthoringDefinit
105
104
  * runner's context, so the same definition can be registered and later exercised
106
105
  * through `runRegisteredMigrationForTest`.
107
106
  */
108
- export declare function defineMigration<TMigration extends MigrationAuthoringDefinition>(migration:ExactDefinition<TMigration,MigrationAuthoringDefinition>):TMigration;
107
+ export declare function defineMigration<const TMigration extends MigrationAuthoringDefinition>(migration:ExactDefinition<TMigration,MigrationAuthoringDefinition>):TMigration;
109
108
  /**
110
109
  * Type a search-provider definition for `api.registerSearchProvider(provider)`.
111
110
  *
@@ -113,7 +112,7 @@ export declare function defineMigration<TMigration extends MigrationAuthoringDef
113
112
  * so a custom retrieval backend is type-checked at the definition site and
114
113
  * reusable in `runRegisteredSearchProviderForTest`.
115
114
  */
116
- export declare function defineSearchProvider<TProvider extends SearchProviderAuthoringDefinition>(provider:ExactDefinition<TProvider,SearchProviderAuthoringDefinition>):TProvider;
115
+ export declare function defineSearchProvider<const TProvider extends SearchProviderAuthoringDefinition>(provider:ExactDefinition<TProvider,SearchProviderAuthoringDefinition>):TProvider;
117
116
  /**
118
117
  * Type a vector-store adapter definition for `api.registerVectorStoreAdapter(adapter)`.
119
118
  *
@@ -121,7 +120,7 @@ export declare function defineSearchProvider<TProvider extends SearchProviderAut
121
120
  * its own semantic index storage gets contract checking before activation and a
122
121
  * definition it can drive through `runRegisteredVectorStoreAdapterForTest`.
123
122
  */
124
- export declare function defineVectorStoreAdapter<TAdapter extends VectorStoreAdapterAuthoringDefinition>(adapter:ExactDefinition<TAdapter,VectorStoreAdapterAuthoringDefinition>):TAdapter;
123
+ export declare function defineVectorStoreAdapter<const TAdapter extends VectorStoreAdapterAuthoringDefinition>(adapter:ExactDefinition<TAdapter,VectorStoreAdapterAuthoringDefinition>):TAdapter;
125
124
  /**
126
125
  * Type a command-override handler for `api.registerCommand(command, override)`.
127
126
  *
@@ -146,7 +145,7 @@ export declare function defineParserOverride(override:ParserOverride):ParserOver
146
145
  */
147
146
  export declare function definePreflightOverride(override:PreflightOverride):PreflightOverride;
148
147
  /** Type a scoped preflight definition while preserving literal command ownership. */
149
- export declare function definePreflightOverride<TDefinition extends ScopedPreflightOverrideDefinition>(override:ExactDefinition<TDefinition,ScopedPreflightOverrideDefinition>):TDefinition;
148
+ export declare function definePreflightOverride<const TDefinition extends ScopedPreflightOverrideDefinition>(override:ExactDefinition<TDefinition,ScopedPreflightOverrideDefinition>):TDefinition;
150
149
  /**
151
150
  * Type a service-override handler for `api.registerService(service, override)`.
152
151
  *
@@ -173,7 +172,7 @@ export declare function defineRendererOverride(renderer:RendererOverride):Render
173
172
  * Type a scoped renderer definition while preserving its command/result
174
173
  * ownership literals for declarative composition and static introspection.
175
174
  */
176
- export declare function defineRendererOverride<TDefinition extends ScopedRendererOverrideDefinition>(renderer:ExactDefinition<TDefinition,ScopedRendererOverrideDefinition>):TDefinition;
175
+ export declare function defineRendererOverride<const TDefinition extends ScopedRendererOverrideDefinition>(renderer:ExactDefinition<TDefinition,ScopedRendererOverrideDefinition>):TDefinition;
177
176
  /**
178
177
  * Type an importer handler for `api.registerImporter(name, importer, options)`.
179
178
  *
@@ -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]="4e72da21-425b-568d-9174-bc5021e1d4f4")}catch{}})();function defineExtensionManifest(manifest){return manifest}function defineProjectProfile(profile){return profile}function defineCommand(definition){return definition}function defineFlag(flag){return flag}function defineItemType(type){return type}function defineItemField(field){return field}function defineMigration(migration){return migration}function defineSearchProvider(provider){return provider}function defineVectorStoreAdapter(adapter){return adapter}function defineCommandOverride(override){return override}function defineParserOverride(override){return override}function definePreflightOverride(override){return override}function defineServiceOverride(override){return override}function handleServiceOverride(result){return{handled:!0,result}}function declineServiceOverride(){return{handled:!1}}function defineRendererOverride(renderer){return renderer}function defineImporter(importer){return importer}function defineExporter(exporter){return exporter}function defineBeforeCommandHook(hook){return hook}function defineBeforeMutationHook(hook){return hook}function defineAfterCommandHook(hook){return hook}function defineOnWriteHook(hook){return hook}function defineOnReadHook(hook){return hook}function defineOnIndexHook(hook){return hook}export{declineServiceOverride,defineAfterCommandHook,defineBeforeCommandHook,defineBeforeMutationHook,defineCommand,defineCommandOverride,defineExporter,defineExtensionManifest,defineFlag,defineImporter,defineItemField,defineItemType,defineMigration,defineOnIndexHook,defineOnReadHook,defineOnWriteHook,defineParserOverride,definePreflightOverride,defineProjectProfile,defineRendererOverride,defineSearchProvider,defineServiceOverride,defineVectorStoreAdapter,handleServiceOverride};
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]="4c9a1aa8-05b6-53da-a8b1-f1a7289d39cf")}catch{}})();function defineExtensionManifest(manifest){return manifest}function defineProjectProfile(profile){return profile}function defineCommand(definition){return definition}function defineFlag(flag){return flag}function defineItemType(type){return type}function defineItemField(field){return field}function defineMigration(migration){return migration}function defineSearchProvider(provider){return provider}function defineVectorStoreAdapter(adapter){return adapter}function defineCommandOverride(override){return override}function defineParserOverride(override){return override}function definePreflightOverride(override){return override}function defineServiceOverride(override){return override}function handleServiceOverride(result){return{handled:!0,result}}function declineServiceOverride(){return{handled:!1}}function defineRendererOverride(renderer){return renderer}function defineImporter(importer){return importer}function defineExporter(exporter){return exporter}function defineBeforeCommandHook(hook){return hook}function defineBeforeMutationHook(hook){return hook}function defineAfterCommandHook(hook){return hook}function defineOnWriteHook(hook){return hook}function defineOnReadHook(hook){return hook}function defineOnIndexHook(hook){return hook}export{declineServiceOverride,defineAfterCommandHook,defineBeforeCommandHook,defineBeforeMutationHook,defineCommand,defineCommandOverride,defineExporter,defineExtensionManifest,defineFlag,defineImporter,defineItemField,defineItemType,defineMigration,defineOnIndexHook,defineOnReadHook,defineOnWriteHook,defineParserOverride,definePreflightOverride,defineProjectProfile,defineRendererOverride,defineSearchProvider,defineServiceOverride,defineVectorStoreAdapter,handleServiceOverride};
2
2
  //# sourceMappingURL=define.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]="aaf07c3b-4c16-5374-bf61-934114075578")}catch{}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import{getActiveCommandContext,getActiveExtensionRegistrations}from"../core/extensions/index.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{isTerminalStatus}from"../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../core/schema/runtime-schema.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{formatBuiltInOutput}from"../core/output/output.js";import{listAllItemMetadataLight,locateItem,readLocatedItem}from"../core/store/item-store.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{estimatePmOutputTokens}from"./cli-contracts/agent-output-contracts.js";import{renderPmCommand}from"./command-line.js";import{createPmCliExpectedError}from"./errors.js";import{isReadOutputBudgetExceeded,normalizeReadOutputIncludeModeOptions,PM_READ_OUTPUT_SURFACE_CONTRACTS}from"./read-output-contracts.js";import{READ_OUTPUT_INVOCATION_PROVENANCE}from"./read-output/provenance.js";import{attachReadOutputContracts}from"./context-intent-contracts.js";import{attachOutputTokenAccounting}from"./output-token-accounting.js";import{assertProjectionModeChoice}from"./output-projection.js";import{assembleWorkspaceRelationshipGraph,collectDanglingDependencyReferences,resolveWorkspaceRelationshipKindRegistry}from"./graph/assembly.js";import{computeWorkspaceGraphFingerprint,workspaceGraphCache}from"./graph/cache.js";import{buildRelationshipContext,DEFAULT_RELATIONSHIP_CONTEXT_TOKEN_BUDGET}from"./relationship-context.js";import{createRelationshipKindRegistry}from"./relationships.js";const DEPS_FORMAT_VALUES=["tree","graph","context"],DEPS_COLLAPSE_VALUES=["none","repeated"],DEPS_DIRECTION_VALUES=["outgoing","incoming","both"],DEFAULT_DEPS_TREE_MAX_DEPTH=32,DEFAULT_DEPS_TREE_NODE_LIMIT=200,DEFAULT_DEPS_TREE_EDGE_LIMIT=400,DEFAULT_DEPS_TREE_TOKEN_BUDGET=16e3;function parseFormat(raw){const candidate=raw?.trim().toLowerCase()??"tree";if(DEPS_FORMAT_VALUES.includes(candidate))return candidate;throw new PmCliError(`Invalid --format value "${raw}". Use "tree", "graph", or "context".`,EXIT_CODE.USAGE)}function parsePositiveInteger(raw,flag){if(raw===void 0)return;const value=typeof raw=="number"?raw:Number(raw.trim());if(!Number.isInteger(value)||value<1)throw new PmCliError(`Invalid --${flag} value "${raw}". Use a positive integer.`,EXIT_CODE.USAGE);return value}function parseMaxDepth(raw){if(raw===void 0)return;const normalized=typeof raw=="number"?raw:Number(raw.trim());if(!Number.isInteger(normalized)||normalized<0)throw new PmCliError(`Invalid --max-depth value "${raw}". Use a non-negative integer.`,EXIT_CODE.USAGE);return normalized}function parseCollapse(raw){const candidate=raw?.trim().toLowerCase()??"none";if(DEPS_COLLAPSE_VALUES.includes(candidate))return candidate;throw new PmCliError(`Invalid --collapse value "${raw}". Use "none" or "repeated".`,EXIT_CODE.USAGE)}function parseDirection(raw){const candidate=raw?.trim().toLowerCase()??"both";if(DEPS_DIRECTION_VALUES.includes(candidate))return candidate;throw new PmCliError(`Invalid --direction value "${raw}". Use "outgoing", "incoming", or "both".`,EXIT_CODE.USAGE)}function parseKinds(raw,registry=createRelationshipKindRegistry()){if(raw===void 0)return;const values=(Array.isArray(raw)?raw:[raw]).flatMap(value=>value.split(",")).map(value=>value.trim()).filter(value=>value.length>0);if(values.length===0)return;const kinds=new Set;for(const value of values){const definition=registry.resolve(value);if(!definition){const known=registry.list().map(entry=>entry.kind).join(", ");throw new PmCliError(`Invalid --kind value "${value}". Registered kinds: ${known}.`,EXIT_CODE.USAGE)}kinds.add(definition.kind)}return[...kinds].sort()}function normalizeDependencies(dependencies){if(!dependencies||dependencies.length===0)return[];const sorted=dependencies.map(({id,kind})=>({id:id.trim(),kind:kind.trim().toLowerCase()})).sort((left,right)=>{const byKind=left.kind.localeCompare(right.kind);return byKind!==0?byKind:left.id.localeCompare(right.id)}),deduped=new Map;for(const dependency of sorted){const key=`${dependency.kind.toLowerCase()}::${dependency.id.toLowerCase()}`;deduped.has(key)||deduped.set(key,{id:dependency.id,kind:dependency.kind})}return[...deduped.values()]}function toIndexedItem(item){return{id:item.id,title:item.title,type:item.type,status:item.status,dependencies:normalizeDependencies(item.dependencies)}}function estimateTreeNodeTokens(node){return estimatePmOutputTokens(new TextEncoder().encode(JSON.stringify({...node,dependencies:void 0})).byteLength)}function appendTreeDependencies(baseNode,item,index,nextLineage,maxDepth,collapse,expanded,budget,depth){for(const dependency of item.dependencies){const edgeTokens=Math.max(1,Math.ceil(JSON.stringify({from:baseNode.id,to:dependency.id,kind:dependency.kind}).length/3));if(budget.nodes>=budget.nodeLimit){baseNode.truncated=!0,budget.reasons.add("node_limit");break}if(budget.edges>=budget.edgeLimit){baseNode.truncated=!0,budget.reasons.add("edge_limit");break}if(budget.estimatedTokens+edgeTokens>=budget.tokenBudget){baseNode.truncated=!0,budget.reasons.add("token_budget");break}budget.edges+=1,budget.estimatedTokens+=edgeTokens,baseNode.dependencies.push(toTreeNode(dependency.id,index,nextLineage,maxDepth,collapse,expanded,budget,depth+1,dependency.kind))}}function shouldStopTreeNodeExpansion(node,item,lookupId,maxDepth,collapse,expanded,budget,depth){return budget.estimatedTokens>=budget.tokenBudget&&item?.dependencies.length?(node.truncated=!0,budget.reasons.add("token_budget"),!0):!item||node.cycle?!0:maxDepth!==void 0&&depth>=maxDepth?(item.dependencies.length>0&&(node.truncated=!0,budget.reasons.add("max_depth")),!0):collapse==="repeated"&&expanded.has(lookupId)?(node.collapsed=!0,!0):!1}function toTreeNode(id,index,lineage,maxDepth,collapse,expanded,budget,depth=0,via){const lookupId=id.trim().toLowerCase(),item=index.get(lookupId),baseNode={id:item?.id??id,title:item?.title,type:item?.type,status:item?.status,via,missing:!item,cycle:lineage.has(lookupId),dependencies:[]};if(budget.nodes+=1,budget.estimatedTokens+=estimateTreeNodeTokens(baseNode),shouldStopTreeNodeExpansion(baseNode,item,lookupId,maxDepth,collapse,expanded,budget,depth))return baseNode;collapse==="repeated"&&expanded.add(lookupId);const nextLineage=new Set(lineage);return nextLineage.add(lookupId),appendTreeDependencies(baseNode,item,index,nextLineage,maxDepth,collapse,expanded,budget,depth),baseNode}function mergeGraphNode(existing,candidate){return!existing||existing.missing&&!candidate.missing?candidate:{...existing,title:existing.title??candidate.title,type:existing.type??candidate.type,status:existing.status??candidate.status}}function toGraph(root){const nodesById=new Map,edgesByKey=new Map,pending=[root];for(;pending.length>0;){const node=pending.pop();nodesById.set(node.id,mergeGraphNode(nodesById.get(node.id),{id:node.id,title:node.title,type:node.type,status:node.status,missing:node.missing}));for(const child of node.dependencies){nodesById.set(child.id,mergeGraphNode(nodesById.get(child.id),{id:child.id,title:child.title,type:child.type,status:child.status,missing:child.missing}));const relationKind=child.via??"related",edgeKey=`${node.id}::${child.id}::${relationKind}`;edgesByKey.has(edgeKey)||edgesByKey.set(edgeKey,{from:node.id,to:child.id,kind:relationKind}),child.cycle||pending.push(child)}}const nodes=[...nodesById.values()].sort((left,right)=>left.id.localeCompare(right.id)),edges=[...edgesByKey.values()].sort((left,right)=>{const byFrom=left.from.localeCompare(right.from);if(byFrom!==0)return byFrom;const byTo=left.to.localeCompare(right.to);return byTo!==0?byTo:left.kind.localeCompare(right.kind)}),missingIds=nodes.filter(node=>node.missing).map(node=>node.id);return{root_id:root.id,nodes,edges,missing_ids:missingIds}}function countDependencyGraph(rootId,index,maxDepth){const nodeIds=new Set,edgeKeys=new Set,missingIds=new Set,expanded=new Set,pending=[{id:rootId,depth:0}];let pendingIndex=0;for(;pendingIndex<pending.length;){const current=pending[pendingIndex++],lookupId=current.id.trim().toLowerCase();nodeIds.add(lookupId);const item=index.get(lookupId);if(!item){missingIds.add(lookupId);continue}if(!(maxDepth!==void 0&&current.depth>=maxDepth)&&!expanded.has(lookupId)){expanded.add(lookupId);for(const dependency of item.dependencies)edgeKeys.add(`${lookupId}::${dependency.id.trim().toLowerCase()}::${dependency.kind}`),pending.push({id:dependency.id,depth:current.depth+1})}}return{node_count:nodeIds.size,edge_count:edgeKeys.size,edge_basis:"deduplicated_directed",missing_count:missingIds.size}}function parseDepsContextOptions(options,registry=createRelationshipKindRegistry()){const maxDepth=parseMaxDepth(options.maxDepth),nodeLimit=parsePositiveInteger(options.nodeLimit,"node-limit"),edgeLimit=parsePositiveInteger(options.edgeLimit,"edge-limit"),tokenBudget=parsePositiveInteger(options.tokenBudget,"token-budget"),kinds=parseKinds(options.kind,registry);return{direction:parseDirection(options.direction),...kinds===void 0?{}:{kinds},...maxDepth===void 0?{}:{maxDepth},...nodeLimit===void 0?{}:{nodeLimit},...edgeLimit===void 0?{}:{edgeLimit},...tokenBudget===void 0?{}:{tokenBudget},...options.cursor?.trim()?{cursor:options.cursor.trim()}:{}}}function buildContextFromAssembly(assembly,rootId,options,rootEvidence){return buildRelationshipContext(assembly.graph,rootId,assembly.details.map(detail=>detail.id===rootId&&rootEvidence.length>0?{...detail,evidence:rootEvidence}:detail),options)}function buildDepsRelationshipContext(rootId,items,options,rootEvidence=[]){const assembly=assembleWorkspaceRelationshipGraph(items);return buildContextFromAssembly(assembly,rootId,parseDepsContextOptions(options,assembly.graph.registry()),rootEvidence)}function appendEvidencePointers(evidence,label,values,limit){for(const value of values.slice(0,limit)){const trimmed=value?.trim();trimmed&&evidence.push(`${label}:${trimmed}`)}}async function collectRootEvidence(pmRoot,id,settings,typeToFolder){const located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeToFolder);if(!located)return[];const{document}=await readLocatedItem(located,{schema:settings.schema}),metadata=document.metadata,files=metadata.files??[],tests=metadata.tests??[],docs=metadata.docs??[],counts=[["files",files.length],["tests",tests.length],["docs",docs.length],["comments",(metadata.comments??[]).length],["notes",(metadata.notes??[]).length],["learnings",(metadata.learnings??[]).length]];if(counts.every(([,count])=>count===0))return[];const evidence=[`linked:${counts.map(([key,count])=>`${key}=${count}`).join(",")}`];return appendEvidencePointers(evidence,"file",files.map(file=>file.path),3),appendEvidencePointers(evidence,"test",tests.map(test=>test.command??test.path),2),appendEvidencePointers(evidence,"doc",docs.map(doc=>doc.path),2),evidence}function createContextDepsResult(params){const{canonicalId,context,missingCount,missingReferences,referenceLimit,summaryOnly}=params;return{id:canonicalId,format:"context",node_count:context.nodes.length+1,edge_count:context.edges.length,edge_basis:"deduplicated_directed",missing_count:missingCount,missing_scope:"traversal",missing_reference_count:missingReferences.length,...summaryOnly?{}:{missing_references:missingReferences.slice(0,referenceLimit),context}}}function includesContextMissingReference(params){const{row,missingReachableSet,packetIds,filteredKinds,registry}=params;if(row.no_active_blocker_sentinel||!missingReachableSet.has(row.target_id.trim().toLowerCase())||!packetIds.has(row.holder_id))return!1;if(filteredKinds===void 0)return!0;const definition=registry.resolve(row.kind);return definition!==void 0&&(filteredKinds.has(definition.kind)||definition.inverse!==void 0&&filteredKinds.has(definition.inverse))}function discloseDepsOutput(result,rendering){const activeCommand=getActiveCommandContext(),commandOptions=rendering.commandOptionsOverride??(activeCommand?.command==="deps"?activeCommand.options:rendering.commandOptions);return attachReadOutputContracts("deps",{...commandOptions,...rendering.global,resolvedOutputFormat:rendering.format},result)}function renderDepsOutput(result,rendering){const disclosed=discloseDepsOutput(result,rendering),render=value=>formatBuiltInOutput(value,rendering.format,rendering.global.lean===!0);return render(rendering.global.tokenAccounting===!0?attachOutputTokenAccounting(disclosed,render):disclosed)}function settleRenderedTokenCount(result,rendering,assign){let embeddedTokens;for(;;){const measuredTokens=estimatePmOutputTokens(new TextEncoder().encode(renderDepsOutput(result,rendering)).byteLength);if(measuredTokens===embeddedTokens)return measuredTokens;assign(measuredTokens),embeddedTokens=measuredTokens}}function isContextBudgetFloorError(error){return error instanceof TypeError&&error.message.startsWith("Relationship context tokenBudget cannot fit ")}function enforceContextRenderedTokenBudget(params){const{assembly,canonicalId,contextOptions,rootEvidence,summaryOnly,rendering,missingCount,missingReferences}=params,referenceLimit=contextOptions.edgeLimit??40;let emittedReferenceLimit=Math.min(referenceLimit,missingReferences.length),internalTokenBudget=contextOptions.tokenBudget,requestedTokenBudget;for(;;){const context=buildContextFromAssembly(assembly,canonicalId,{...contextOptions,...internalTokenBudget===void 0?{}:{tokenBudget:internalTokenBudget}},rootEvidence);requestedTokenBudget??=context.meta.tokenBudget,internalTokenBudget??=requestedTokenBudget;const result=createContextDepsResult({canonicalId,context,missingCount,missingReferences,referenceLimit:emittedReferenceLimit,summaryOnly});if(summaryOnly){if(estimatePmOutputTokens(new TextEncoder().encode(renderDepsOutput(attachDepsProjection(result,!0,rendering.legacyAliasCounts),rendering)).byteLength)>requestedTokenBudget)throw new TypeError("Relationship context tokenBudget cannot fit the rendered summary");return result}if(context.meta.tokenBudget=requestedTokenBudget,context.meta.usedTokens=settleRenderedTokenCount(attachDepsProjection(result,!1,rendering.legacyAliasCounts),rendering,tokens=>{context.meta.usedTokens=tokens}),context.meta.usedTokens<=requestedTokenBudget)return result;if(emittedReferenceLimit>0){emittedReferenceLimit-=1;continue}const currentInternalBudget=internalTokenBudget,scaledInternalBudget=currentInternalBudget*requestedTokenBudget/context.meta.usedTokens;internalTokenBudget=Math.min(currentInternalBudget-1,Math.max(1,Math.floor(scaledInternalBudget*.9)))}}function createContextRetryPlan(params,budget){const options=params.contextOptions,global2={...params.rendering.global,outputFormat:params.rendering.format},args=["--pm-path",params.pmRoot,"item","deps",params.canonicalId,"--format","context","--output-format",params.rendering.format,"--token-budget"],budgetIndex=args.length;args.push(String(budget));const provided=new Set(["--pm-path","--format","--output-format","--token-budget"]),commandOptions={format:"context",tokenBudget:budget,kind:options.kinds},values=[["--max-depth","maxDepth",options.maxDepth],["--node-limit","nodeLimit",options.nodeLimit],["--edge-limit","edgeLimit",options.edgeLimit],["--direction","direction",options.direction],["--cursor","cursor",options.cursor],["--output-include","outputInclude",global2.outputInclude],["--output-limit","outputLimit",global2.outputLimit],["--output-budget","outputBudget",global2.outputBudget],["--output-session","outputSession",global2.outputSession],["--output-cursor","outputCursor",global2.outputCursor]];for(const[flag,key,value]of values)value!==void 0&&(args.push(flag,String(value)),provided.add(flag),commandOptions[key]=value);for(const kind of options.kinds??[])args.push("--kind",kind),provided.add("--kind");const booleans=[["--summary","summary",params.summaryOnly],["--full","full",params.rendering.commandOptions.full],["--json","json",global2.json],["--lean","lean",global2.lean],["--output-row-contract","outputRowContract",global2.outputRowContract],["--token-accounting","tokenAccounting",global2.tokenAccounting],["--no-extensions","noExtensions",global2.noExtensions],["--no-pager","noPager",global2.noPager]];for(const[flag,key,enabled]of booleans)enabled===!0&&(args.push(flag),provided.add(flag),commandOptions[key]=!0);const contract=PM_READ_OUTPUT_SURFACE_CONTRACTS.find(candidate=>candidate.command==="deps");return Reflect.set(commandOptions,READ_OUTPUT_INVOCATION_PROVENANCE,{canonical_include_modes:[],cli_invocation_observed:!0,explicit_legacy_aliases:Object.values(contract.dimensions).flatMap(dimension=>dimension.legacy_aliases.flatMap(alias=>provided.has(alias.flag)?[alias.flag]:[]))}),normalizeReadOutputIncludeModeOptions("deps",commandOptions),assertProjectionModeChoice(commandOptions.summary===!0,commandOptions.full===!0,"--summary"),global2.outputInclude=commandOptions.outputInclude,{args,budgetIndex,summaryOnly:commandOptions.summary===!0,rendering:{...params.rendering,global:global2,commandOptionsOverride:commandOptions}}}function probeContextRetry(params,plan,budget){const rendering={...plan.rendering,commandOptionsOverride:{...plan.rendering.commandOptionsOverride,tokenBudget:budget}};let result;try{result=enforceContextRenderedTokenBudget({...params,contextOptions:{...params.contextOptions,tokenBudget:budget},summaryOnly:plan.summaryOnly,rootEvidence:plan.summaryOnly?[]:params.rootEvidence,rendering})}catch(error){if(!isContextBudgetFloorError(error))throw error;return"native_floor"}const disclosed=discloseDepsOutput(attachDepsProjection(result,plan.summaryOnly,rendering.legacyAliasCounts),rendering);return isReadOutputBudgetExceeded(disclosed)?"output_constraints":"fits"}async function createContextBudgetRefusal(params,cause){const requested=params.contextOptions.tokenBudget??DEFAULT_RELATIONSHIP_CONTEXT_TOKEN_BUDGET,plan=createContextRetryPlan(params,requested),workUnits=(plan.summaryOnly?1:1+Math.min(params.contextOptions.edgeLimit??40,params.missingReferences.length))*(params.assembly.details.reduce((sum,node)=>sum+node.id.length+node.title.length+node.status.length+(node.type?.length??0),params.assembly.graph.edges().length+params.missingReferences.length)+(plan.summaryOnly?[]:params.rootEvidence).reduce((sum,pointer)=>sum+pointer.length,0)),{findContextBudgetRecovery}=await import("./dependencies/context-budget-recovery.js"),bounds=findContextBudgetRecovery({requested,initialBudget:DEFAULT_RELATIONSHIP_CONTEXT_TOKEN_BUDGET,workUnits,probe:budget=>probeContextRetry(params,plan,budget)}),inspectionArgs=["--pm-path",params.pmRoot,"item","deps",params.canonicalId,"--format","tree","--summary"],inspection=renderPmCommand(inspectionArgs),retryArgs=bounds.feasible_tokens===null?inspectionArgs:[...plan.args];bounds.feasible_tokens!==null&&(retryArgs[plan.budgetIndex]=String(bounds.feasible_tokens));const retry=renderPmCommand(retryArgs);return createPmCliExpectedError("Relationship context tokenBudget cannot fit the required rendered packet",{exitCode:EXIT_CODE.USAGE,cause,context:{code:"invalid_argument_value",field:"tokenBudget",value:String(requested),required:bounds.feasible_tokens===null?"Inspect the compact summary and review the output constraints.":"Retry the preserved context query with --token-budget "+bounds.feasible_tokens+".",why:"Budget advice is verified against the current query. A minimum is reported only after every smaller positive budget is checked.",examples:[retry,inspection],nextSteps:[retry],recovery:{recovery_mode:"compact",suggested_flags:["--token-budget"],token_budget:bounds,suggested_retry_args:retryArgs,suggested_retry:retry,next_best_command:inspection,fallback_candidates:[{source:"relationship_summary",command:inspection,reason:"Inspect bounded counts separately from context rows."}]}}})}async function buildContextDepsResult(params){const{pmRoot,assembly,canonicalId,options,rootEvidence,summaryOnly,rendering}=params,contextOptions=parseDepsContextOptions(options,assembly.graph.registry()),reachable=assembly.graph.closure(canonicalId,{direction:contextOptions.direction,...contextOptions.kinds===void 0?{}:{kinds:contextOptions.kinds},maxDepth:contextOptions.maxDepth??3}),missingReachable=reachable.value.filter(nodeId=>assembly.missingIdSet.has(nodeId.toLowerCase())),missingReachableSet=new Set(missingReachable.map(nodeId=>nodeId.toLowerCase())),relationshipRegistry=assembly.graph.registry(),filteredKinds=contextOptions.kinds?new Set(contextOptions.kinds.map(kind=>relationshipRegistry.require(kind).kind)):void 0,packetIds=new Set([canonicalId,...reachable.value]),missingReferences=[...assembly.dangling.active,...assembly.dangling.legacy_terminal].filter(row=>includesContextMissingReference({row,missingReachableSet,packetIds,filteredKinds,registry:relationshipRegistry})),budgetParams={pmRoot,assembly,canonicalId,contextOptions,rootEvidence,summaryOnly,rendering,missingCount:missingReachable.length,missingReferences};try{return enforceContextRenderedTokenBudget(budgetParams)}catch(error){if(error instanceof PmCliError&&error.code==="invalid_query_cursor"){const plan=createContextRetryPlan({...budgetParams,contextOptions:{...contextOptions,cursor:void 0},rendering:{...rendering,global:{...rendering.global,outputCursor:void 0}}},contextOptions.tokenBudget??DEFAULT_RELATIONSHIP_CONTEXT_TOKEN_BUDGET),retry=renderPmCommand(plan.args);throw new PmCliError(error.message,error.exitCode,{...error.context,nextSteps:[...error.context.nextSteps,retry],recovery:{suggested_retry:retry,suggested_retry_args:plan.args}})}throw isContextBudgetFloorError(error)?await createContextBudgetRefusal(budgetParams,error):error}}function trimDeepestDependency(tree){const pending=[tree];let parentToTrim;for(;pending.length>0;){const current=pending.pop();current.dependencies.length>0&&(parentToTrim=current,pending.push(...current.dependencies))}return parentToTrim?(parentToTrim.dependencies.pop(),parentToTrim.truncated=!0,!0):!1}function buildTreeOrGraphDepsResult(id,format,options,index,maxDepth,collapse,rendering){const effectiveMaxDepth=maxDepth??DEFAULT_DEPS_TREE_MAX_DEPTH,nodeLimit=parsePositiveInteger(options.nodeLimit,"node-limit")??DEFAULT_DEPS_TREE_NODE_LIMIT,edgeLimit=parsePositiveInteger(options.edgeLimit,"edge-limit")??DEFAULT_DEPS_TREE_EDGE_LIMIT,tokenBudget=parsePositiveInteger(options.tokenBudget,"token-budget")??DEFAULT_DEPS_TREE_TOKEN_BUDGET,budget={nodeLimit,edgeLimit,tokenBudget,nodes:0,edges:0,estimatedTokens:0,reasons:new Set},tree=toTreeNode(id,index,new Set,effectiveMaxDepth,format==="graph"?"repeated":collapse,new Set,budget),totals=countDependencyGraph(id,index,void 0);let result;for(;;){const graph=toGraph(tree),truncation=budget.reasons.size===0?void 0:{reasons:[...budget.reasons].sort(),limits:{max_depth:effectiveMaxDepth,node_limit:nodeLimit,edge_limit:edgeLimit,token_budget:tokenBudget},estimated_tokens:0,total_node_count:totals.node_count,total_edge_count:totals.edge_count,omitted_node_count:Math.max(0,totals.node_count-graph.nodes.length),omitted_edge_count:Math.max(0,totals.edge_count-graph.edges.length)},baseResult={id,format,node_count:graph.nodes.length,edge_count:graph.edges.length,edge_basis:"deduplicated_directed",missing_count:graph.missing_ids.length,...truncation?{truncation}:{}};if(result=format==="tree"?{...baseResult,tree}:{...baseResult,graph},(result.truncation===void 0?estimatePmOutputTokens(new TextEncoder().encode(renderDepsOutput(attachDepsProjection(result,!1,rendering.legacyAliasCounts),rendering)).byteLength):settleRenderedTokenCount(attachDepsProjection(result,!1,rendering.legacyAliasCounts),rendering,tokens=>{result.truncation.estimated_tokens=tokens}))<=tokenBudget)return result;if(!trimDeepestDependency(tree))return budget.reasons.add("token_budget"),result;budget.reasons.add("token_budget")}}function attachDepsProjection(result,summaryOnly,legacyAliasCounts={}){const group={name:result.format==="tree"?"dependency_tree":result.format==="graph"?"dependency_graph":"relationship_context",restore_with:"--full"};return{...result,legacy_alias_counts:legacyAliasCounts,projection:{mode:summaryOnly?"summary":"full",declared_field_groups:[group],included_field_groups:summaryOnly?[]:[group.name]}}}async function runDeps(id,options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const format=parseFormat(options.format),maxDepth=parseMaxDepth(options.maxDepth),collapse=parseCollapse(options.collapse);assertProjectionModeChoice(options.summary===!0,options.full===!0,"--summary");const summaryOnly=options.summary===!0,settings=await readSettings(pmRoot),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),items=await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema),statusRegistry=resolveRuntimeStatusRegistry(settings.schema),index=new Map(items.map(item=>[item.id.trim().toLowerCase(),toIndexedItem(item)])),dangling=collectDanglingDependencyReferences(items,status=>isTerminalStatus(status,statusRegistry));for(const reference of[...dangling.active,...dangling.legacy_terminal]){const holder=index.get(reference.holder_id.trim().toLowerCase()),referenceKind=reference.kind.trim().toLowerCase();holder&&!holder.dependencies.some(dependency=>dependency.id.trim().toLowerCase()===reference.target_id.trim().toLowerCase()&&dependency.kind===referenceKind)&&holder.dependencies.push({id:reference.target_id,kind:referenceKind})}if(!index.has(id.trim().toLowerCase()))throw new PmCliError(`Item ${id} not found`,EXIT_CODE.NOT_FOUND);const outputFormat=global2.outputFormat??(global2.json===!0||global2.json===void 0&&global2.defaultOutputFormat==="json"?"json":"toon");if(format==="context"){const canonicalId=index.get(id.trim().toLowerCase()).id,rootEvidence=summaryOnly?[]:await collectRootEvidence(pmRoot,canonicalId,settings,typeRegistry.type_to_folder),isTerminal=status=>isTerminalStatus(status,statusRegistry),relationshipRegistry=resolveWorkspaceRelationshipKindRegistry(),lookup=workspaceGraphCache().lookup(pmRoot,computeWorkspaceGraphFingerprint(items,isTerminal,relationshipRegistry),()=>assembleWorkspaceRelationshipGraph(items,isTerminal,relationshipRegistry));return attachDepsProjection(await buildContextDepsResult({pmRoot,assembly:lookup.assembly,canonicalId,options,rootEvidence,summaryOnly,rendering:{format:outputFormat,global:global2,commandOptions:options,legacyAliasCounts:lookup.assembly.legacyAliasCounts}}),summaryOnly,lookup.assembly.legacyAliasCounts)}const legacyAliasCounts=Object.fromEntries(Object.entries(assembleWorkspaceRelationshipGraph(items,status=>isTerminalStatus(status,statusRegistry)).legacyAliasCounts));return summaryOnly?attachDepsProjection({id,format,...countDependencyGraph(id,index,maxDepth)},!0,legacyAliasCounts):attachDepsProjection(buildTreeOrGraphDepsResult(id,format,options,index,maxDepth,collapse,{format:outputFormat,global:global2,commandOptions:options,legacyAliasCounts}),!1,legacyAliasCounts)}export{DEPS_COLLAPSE_VALUES,DEPS_DIRECTION_VALUES,DEPS_FORMAT_VALUES,buildDepsRelationshipContext,parseDirection,parseKinds,parseMaxDepth,parsePositiveInteger,runDeps};
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]="196b7f2d-b09b-5432-b4ef-9cdf82e92731")}catch{}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import{getActiveCommandContext,getActiveExtensionRegistrations}from"../core/extensions/index.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{isTerminalStatus}from"../core/item/status.js";import{resolveRuntimeStatusRegistry}from"../core/schema/runtime-schema.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{formatBuiltInOutput}from"../core/output/output.js";import{listAllItemMetadataLight,locateItem,readLocatedItem}from"../core/store/item-store.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{estimatePmOutputTokens}from"./cli-contracts/agent-output-contracts.js";import{renderPmCommand}from"./command-line.js";import{createPmCliExpectedError}from"./errors.js";import{isReadOutputBudgetExceeded,normalizeReadOutputIncludeModeOptions,PM_READ_OUTPUT_SURFACE_CONTRACTS}from"./read-output-contracts.js";import{READ_OUTPUT_INVOCATION_PROVENANCE}from"./read-output/provenance.js";import{attachReadOutputContracts}from"./context-intent-contracts.js";import{attachOutputTokenAccounting}from"./output-token-accounting.js";import{assertProjectionModeChoice}from"./output-projection.js";import{assembleWorkspaceRelationshipGraph,collectDanglingDependencyReferences,resolveWorkspaceRelationshipKindRegistry}from"./graph/assembly.js";import{computeWorkspaceGraphFingerprint,workspaceGraphCache}from"./graph/cache.js";import{buildRelationshipContext,DEFAULT_RELATIONSHIP_CONTEXT_TOKEN_BUDGET}from"./relationship-context.js";import{createRelationshipKindRegistry}from"./relationships.js";const DEPS_FORMAT_VALUES=["tree","graph","context"],DEPS_COLLAPSE_VALUES=["none","repeated"],DEPS_DIRECTION_VALUES=["outgoing","incoming","both"],DEFAULT_DEPS_TREE_MAX_DEPTH=32,DEFAULT_DEPS_TREE_NODE_LIMIT=200,DEFAULT_DEPS_TREE_EDGE_LIMIT=400,DEFAULT_DEPS_TREE_TOKEN_BUDGET=16e3;function parseFormat(raw){const candidate=raw?.trim().toLowerCase()??"tree";if(DEPS_FORMAT_VALUES.includes(candidate))return candidate;throw new PmCliError(`Invalid --format value "${raw}". Use "tree", "graph", or "context".`,EXIT_CODE.USAGE)}function parsePositiveInteger(raw,flag){if(raw===void 0)return;const value=typeof raw=="number"?raw:Number(raw.trim());if(!Number.isInteger(value)||value<1)throw new PmCliError(`Invalid --${flag} value "${raw}". Use a positive integer.`,EXIT_CODE.USAGE);return value}function parseMaxDepth(raw){if(raw===void 0)return;const normalized=typeof raw=="number"?raw:Number(raw.trim());if(!Number.isInteger(normalized)||normalized<0)throw new PmCliError(`Invalid --max-depth value "${raw}". Use a non-negative integer.`,EXIT_CODE.USAGE);return normalized}function parseCollapse(raw){const candidate=raw?.trim().toLowerCase()??"none";if(DEPS_COLLAPSE_VALUES.includes(candidate))return candidate;throw new PmCliError(`Invalid --collapse value "${raw}". Use "none" or "repeated".`,EXIT_CODE.USAGE)}function parseDirection(raw){const candidate=raw?.trim().toLowerCase()??"both";if(DEPS_DIRECTION_VALUES.includes(candidate))return candidate;throw new PmCliError(`Invalid --direction value "${raw}". Use "outgoing", "incoming", or "both".`,EXIT_CODE.USAGE)}function parseKinds(raw,registry=createRelationshipKindRegistry()){if(raw===void 0)return;const values=(Array.isArray(raw)?raw:[raw]).flatMap(value=>value.split(",")).map(value=>value.trim()).filter(value=>value.length>0);if(values.length===0)return;const kinds=new Set;for(const value of values){const definition=registry.resolve(value);if(!definition){const known=registry.list().map(entry=>entry.kind).join(", ");throw new PmCliError(`Invalid --kind value "${value}". Registered kinds: ${known}.`,EXIT_CODE.USAGE)}kinds.add(definition.kind)}return[...kinds].sort()}function normalizeDependencies(dependencies){if(!dependencies||dependencies.length===0)return[];const sorted=dependencies.map(({id,kind})=>({id:id.trim(),kind:kind.trim().toLowerCase()})).sort((left,right)=>{const byKind=left.kind.localeCompare(right.kind);return byKind!==0?byKind:left.id.localeCompare(right.id)}),deduped=new Map;for(const dependency of sorted){const key=`${dependency.kind.toLowerCase()}::${dependency.id.toLowerCase()}`;deduped.has(key)||deduped.set(key,{id:dependency.id,kind:dependency.kind})}return[...deduped.values()]}function toIndexedItem(item){return{id:item.id,title:item.title,type:item.type,status:item.status,dependencies:normalizeDependencies(item.dependencies)}}function estimateTreeNodeTokens(node){return estimatePmOutputTokens(new TextEncoder().encode(JSON.stringify({...node,dependencies:void 0})).byteLength)}function appendTreeDependencies(baseNode,item,index,nextLineage,maxDepth,collapse,expanded,budget,depth){for(const dependency of item.dependencies){const edgeTokens=Math.max(1,Math.ceil(JSON.stringify({from:baseNode.id,to:dependency.id,kind:dependency.kind}).length/3));if(budget.nodes>=budget.nodeLimit){baseNode.truncated=!0,budget.reasons.add("node_limit");break}if(budget.edges>=budget.edgeLimit){baseNode.truncated=!0,budget.reasons.add("edge_limit");break}if(budget.estimatedTokens+edgeTokens>=budget.tokenBudget){baseNode.truncated=!0,budget.reasons.add("token_budget");break}budget.edges+=1,budget.estimatedTokens+=edgeTokens,baseNode.dependencies.push(toTreeNode(dependency.id,index,nextLineage,maxDepth,collapse,expanded,budget,depth+1,dependency.kind))}}function shouldStopTreeNodeExpansion(node,item,lookupId,maxDepth,collapse,expanded,budget,depth){return budget.estimatedTokens>=budget.tokenBudget&&item?.dependencies.length?(node.truncated=!0,budget.reasons.add("token_budget"),!0):!item||node.cycle?!0:maxDepth!==void 0&&depth>=maxDepth?(item.dependencies.length>0&&(node.truncated=!0,budget.reasons.add("max_depth")),!0):collapse==="repeated"&&expanded.has(lookupId)?(node.collapsed=!0,!0):!1}function toTreeNode(id,index,lineage,maxDepth,collapse,expanded,budget,depth=0,via){const lookupId=id.trim().toLowerCase(),item=index.get(lookupId),baseNode={id:item?.id??id,title:item?.title,type:item?.type,status:item?.status,via,missing:!item,cycle:lineage.has(lookupId),dependencies:[]};if(budget.nodes+=1,budget.estimatedTokens+=estimateTreeNodeTokens(baseNode),shouldStopTreeNodeExpansion(baseNode,item,lookupId,maxDepth,collapse,expanded,budget,depth))return baseNode;collapse==="repeated"&&expanded.add(lookupId);const nextLineage=new Set(lineage);return nextLineage.add(lookupId),appendTreeDependencies(baseNode,item,index,nextLineage,maxDepth,collapse,expanded,budget,depth),baseNode}function mergeGraphNode(existing,candidate){return!existing||existing.missing&&!candidate.missing?candidate:{...existing,title:existing.title??candidate.title,type:existing.type??candidate.type,status:existing.status??candidate.status}}function toGraph(root){const nodesById=new Map,edgesByKey=new Map,pending=[root];for(;pending.length>0;){const node=pending.pop();nodesById.set(node.id,mergeGraphNode(nodesById.get(node.id),{id:node.id,title:node.title,type:node.type,status:node.status,missing:node.missing}));for(const child of node.dependencies){nodesById.set(child.id,mergeGraphNode(nodesById.get(child.id),{id:child.id,title:child.title,type:child.type,status:child.status,missing:child.missing}));const relationKind=child.via??"related",edgeKey=`${node.id}::${child.id}::${relationKind}`;edgesByKey.has(edgeKey)||edgesByKey.set(edgeKey,{from:node.id,to:child.id,kind:relationKind}),child.cycle||pending.push(child)}}const nodes=[...nodesById.values()].sort((left,right)=>left.id.localeCompare(right.id)),edges=[...edgesByKey.values()].sort((left,right)=>{const byFrom=left.from.localeCompare(right.from);if(byFrom!==0)return byFrom;const byTo=left.to.localeCompare(right.to);return byTo!==0?byTo:left.kind.localeCompare(right.kind)}),missingIds=nodes.filter(node=>node.missing).map(node=>node.id);return{root_id:root.id,nodes,edges,missing_ids:missingIds}}function countDependencyGraph(rootId,index,maxDepth){const nodeIds=new Set,edgeKeys=new Set,missingIds=new Set,expanded=new Set,pending=[{id:rootId,depth:0}];let pendingIndex=0;for(;pendingIndex<pending.length;){const current=pending[pendingIndex++],lookupId=current.id.trim().toLowerCase();nodeIds.add(lookupId);const item=index.get(lookupId);if(!item){missingIds.add(lookupId);continue}if(!(maxDepth!==void 0&&current.depth>=maxDepth)&&!expanded.has(lookupId)){expanded.add(lookupId);for(const dependency of item.dependencies)edgeKeys.add(`${lookupId}::${dependency.id.trim().toLowerCase()}::${dependency.kind}`),pending.push({id:dependency.id,depth:current.depth+1})}}return{node_count:nodeIds.size,edge_count:edgeKeys.size,edge_basis:"deduplicated_directed",missing_count:missingIds.size}}function parseDepsContextOptions(options,registry=createRelationshipKindRegistry()){const maxDepth=parseMaxDepth(options.maxDepth),nodeLimit=parsePositiveInteger(options.nodeLimit,"node-limit"),edgeLimit=parsePositiveInteger(options.edgeLimit,"edge-limit"),tokenBudget=parsePositiveInteger(options.tokenBudget,"token-budget"),kinds=parseKinds(options.kind,registry);return{direction:parseDirection(options.direction),...kinds===void 0?{}:{kinds},...maxDepth===void 0?{}:{maxDepth},...nodeLimit===void 0?{}:{nodeLimit},...edgeLimit===void 0?{}:{edgeLimit},...tokenBudget===void 0?{}:{tokenBudget},...options.cursor?.trim()?{cursor:options.cursor.trim()}:{}}}function buildContextFromAssembly(assembly,rootId,options,rootEvidence){return buildRelationshipContext(assembly.graph,rootId,assembly.details.map(detail=>detail.id===rootId&&rootEvidence.length>0?{...detail,evidence:rootEvidence}:detail),options)}function buildDepsRelationshipContext(rootId,items,options,rootEvidence=[]){const assembly=assembleWorkspaceRelationshipGraph(items);return buildContextFromAssembly(assembly,rootId,parseDepsContextOptions(options,assembly.graph.registry()),rootEvidence)}function appendEvidencePointers(evidence,label,values,limit){for(const value of values.slice(0,limit)){const trimmed=value?.trim();trimmed&&evidence.push(`${label}:${trimmed}`)}}async function collectRootEvidence(pmRoot,id,settings,typeToFolder){const located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeToFolder);if(!located)return[];const{document}=await readLocatedItem(located,{schema:settings.schema}),metadata=document.metadata,files=metadata.files??[],tests=metadata.tests??[],docs=metadata.docs??[],counts=[["files",files.length],["tests",tests.length],["docs",docs.length],["comments",(metadata.comments??[]).length],["notes",(metadata.notes??[]).length],["learnings",(metadata.learnings??[]).length]];if(counts.every(([,count])=>count===0))return[];const evidence=[`linked:${counts.map(([key,count])=>`${key}=${count}`).join(",")}`];return appendEvidencePointers(evidence,"file",files.map(file=>file.path),3),appendEvidencePointers(evidence,"test",tests.map(test=>test.command??test.path),2),appendEvidencePointers(evidence,"doc",docs.map(doc=>doc.path),2),evidence}function createContextDepsResult(params){const{canonicalId,context,missingCount,missingReferences,referenceLimit,summaryOnly}=params;return{id:canonicalId,format:"context",node_count:context.nodes.length+1,edge_count:context.edges.length,edge_basis:"deduplicated_directed",missing_count:missingCount,missing_scope:"traversal",missing_reference_count:missingReferences.length,...summaryOnly?{}:{missing_references:missingReferences.slice(0,referenceLimit),context}}}function includesContextMissingReference(params){const{row,missingReachableSet,packetIds,filteredKinds,registry}=params;if(row.no_active_blocker_sentinel||!missingReachableSet.has(row.target_id.trim().toLowerCase())||!packetIds.has(row.holder_id))return!1;if(filteredKinds===void 0)return!0;const definition=registry.resolve(row.kind);return definition!==void 0&&(filteredKinds.has(definition.kind)||definition.inverse!==void 0&&filteredKinds.has(definition.inverse))}function discloseDepsOutput(result,rendering){const activeCommand=getActiveCommandContext(),commandOptions=rendering.commandOptionsOverride??(activeCommand?.command==="deps"?activeCommand.options:rendering.commandOptions);return attachReadOutputContracts("deps",{...commandOptions,...rendering.global,resolvedOutputFormat:rendering.format},result)}function renderDepsOutput(result,rendering){const disclosed=discloseDepsOutput(result,rendering),render=value=>formatBuiltInOutput(value,rendering.format,rendering.global.lean===!0);return render(rendering.global.tokenAccounting===!0?attachOutputTokenAccounting(disclosed,render):disclosed)}function settleRenderedTokenCount(result,rendering,assign){let embeddedTokens;for(;;){const measuredTokens=estimatePmOutputTokens(new TextEncoder().encode(renderDepsOutput(result,rendering)).byteLength);if(measuredTokens===embeddedTokens)return measuredTokens;assign(measuredTokens),embeddedTokens=measuredTokens}}function isContextBudgetFloorError(error){return error instanceof TypeError&&error.message.startsWith("Relationship context tokenBudget cannot fit ")}function enforceContextRenderedTokenBudget(params){const{assembly,canonicalId,contextOptions,rootEvidence,summaryOnly,rendering,missingCount,missingReferences}=params,referenceLimit=contextOptions.edgeLimit??40;let emittedReferenceLimit=Math.min(referenceLimit,missingReferences.length),internalTokenBudget=contextOptions.tokenBudget,requestedTokenBudget;for(;;){const context=buildContextFromAssembly(assembly,canonicalId,{...contextOptions,...internalTokenBudget===void 0?{}:{tokenBudget:internalTokenBudget}},rootEvidence);requestedTokenBudget??=context.meta.tokenBudget,internalTokenBudget??=requestedTokenBudget;const result=createContextDepsResult({canonicalId,context,missingCount,missingReferences,referenceLimit:emittedReferenceLimit,summaryOnly});if(summaryOnly){if(estimatePmOutputTokens(new TextEncoder().encode(renderDepsOutput(attachDepsProjection(result,!0,rendering.legacyAliasCounts),rendering)).byteLength)>requestedTokenBudget)throw new TypeError("Relationship context tokenBudget cannot fit the rendered summary");return result}if(context.meta.tokenBudget=requestedTokenBudget,context.meta.usedTokens=settleRenderedTokenCount(attachDepsProjection(result,!1,rendering.legacyAliasCounts),rendering,tokens=>{context.meta.usedTokens=tokens}),context.meta.usedTokens<=requestedTokenBudget)return result;if(emittedReferenceLimit>0){emittedReferenceLimit-=1;continue}const currentInternalBudget=internalTokenBudget,scaledInternalBudget=currentInternalBudget*requestedTokenBudget/context.meta.usedTokens;internalTokenBudget=Math.min(currentInternalBudget-1,Math.max(1,Math.floor(scaledInternalBudget*.9)))}}function createContextRetryPlan(params,budget){const options=params.contextOptions,global2={...params.rendering.global,outputFormat:params.rendering.format},args=["--pm-path",params.pmRoot,"item","deps",params.canonicalId,"--format","context","--output-format",params.rendering.format,"--token-budget"],budgetIndex=args.length;args.push(String(budget));const provided=new Set(["--pm-path","--format","--output-format","--token-budget"]),commandOptions={format:"context",tokenBudget:budget,kind:options.kinds},values=[["--max-depth","maxDepth",options.maxDepth],["--node-limit","nodeLimit",options.nodeLimit],["--edge-limit","edgeLimit",options.edgeLimit],["--direction","direction",options.direction],["--cursor","cursor",options.cursor],["--output-include","outputInclude",global2.outputInclude],["--output-limit","outputLimit",global2.outputLimit],["--output-budget","outputBudget",global2.outputBudget],["--output-session","outputSession",global2.outputSession],["--output-cursor","outputCursor",global2.outputCursor]];for(const[flag,key,value]of values)value!==void 0&&(args.push(flag,String(value)),provided.add(flag),commandOptions[key]=value);for(const kind of options.kinds??[])args.push("--kind",kind),provided.add("--kind");const booleans=[["--summary","summary",params.summaryOnly],["--full","full",params.rendering.commandOptions.full],["--json","json",global2.json],["--lean","lean",global2.lean],["--output-row-contract","outputRowContract",global2.outputRowContract],["--token-accounting","tokenAccounting",global2.tokenAccounting],["--no-extensions","noExtensions",global2.noExtensions],["--no-pager","noPager",global2.noPager]];for(const[flag,key,enabled]of booleans)enabled===!0&&(args.push(flag),provided.add(flag),commandOptions[key]=!0);const contract=PM_READ_OUTPUT_SURFACE_CONTRACTS.find(candidate=>candidate.command==="deps");return Reflect.set(commandOptions,READ_OUTPUT_INVOCATION_PROVENANCE,{canonical_include_modes:[],cli_invocation_observed:!0,explicit_legacy_aliases:Object.values(contract.dimensions).flatMap(dimension=>dimension.legacy_aliases.flatMap(alias=>provided.has(alias.flag)?[alias.flag]:[]))}),normalizeReadOutputIncludeModeOptions("deps",commandOptions),assertProjectionModeChoice(commandOptions.summary===!0,commandOptions.full===!0,"--summary"),global2.outputInclude=commandOptions.outputInclude,{args,budgetIndex,summaryOnly:commandOptions.summary===!0,rendering:{...params.rendering,global:global2,commandOptionsOverride:commandOptions}}}function probeContextRetry(params,plan,budget){const rendering={...plan.rendering,commandOptionsOverride:{...plan.rendering.commandOptionsOverride,tokenBudget:budget}};let result;try{result=enforceContextRenderedTokenBudget({...params,contextOptions:{...params.contextOptions,tokenBudget:budget},summaryOnly:plan.summaryOnly,rootEvidence:plan.summaryOnly?[]:params.rootEvidence,rendering})}catch(error){if(!isContextBudgetFloorError(error))throw error;return"native_floor"}const disclosed=discloseDepsOutput(attachDepsProjection(result,plan.summaryOnly,rendering.legacyAliasCounts),rendering);return isReadOutputBudgetExceeded(disclosed)?"output_constraints":"fits"}async function createContextBudgetRefusal(params,cause){const requested=params.contextOptions.tokenBudget??DEFAULT_RELATIONSHIP_CONTEXT_TOKEN_BUDGET,plan=createContextRetryPlan(params,requested),workUnits=(plan.summaryOnly?1:1+Math.min(params.contextOptions.edgeLimit??40,params.missingReferences.length))*(params.assembly.details.reduce((sum,node)=>sum+node.id.length+node.title.length+node.status.length+(node.type?.length??0),params.assembly.graph.edges().length+params.missingReferences.length)+(plan.summaryOnly?[]:params.rootEvidence).reduce((sum,pointer)=>sum+pointer.length,0)),{findContextBudgetRecovery}=await import("./dependencies/context-budget-recovery.js"),bounds=findContextBudgetRecovery({requested,initialBudget:DEFAULT_RELATIONSHIP_CONTEXT_TOKEN_BUDGET,workUnits,probe:budget=>probeContextRetry(params,plan,budget)}),inspectionArgs=["--pm-path",params.pmRoot,"item","deps",params.canonicalId,"--format","tree","--summary"],inspection=renderPmCommand(inspectionArgs),retryArgs=bounds.feasible_tokens===null?inspectionArgs:[...plan.args];bounds.feasible_tokens!==null&&(retryArgs[plan.budgetIndex]=String(bounds.feasible_tokens));const retry=renderPmCommand(retryArgs);return createPmCliExpectedError("Relationship context tokenBudget cannot fit the required rendered packet",{exitCode:EXIT_CODE.USAGE,cause,context:{code:"invalid_argument_value",field:"tokenBudget",value:String(requested),required:bounds.feasible_tokens===null?"Inspect the compact summary and review the output constraints.":"Retry the preserved context query with --token-budget "+bounds.feasible_tokens+".",why:"Budget advice is verified against the current query. A minimum is reported only after every smaller positive budget is checked.",examples:[retry,inspection],nextSteps:[retry],recovery:{recovery_mode:"compact",suggested_flags:["--token-budget"],token_budget:bounds,suggested_retry_args:retryArgs,suggested_retry:retry,next_best_command:inspection,fallback_candidates:[{source:"relationship_summary",command:inspection,reason:"Inspect bounded counts separately from context rows."}]}}})}async function buildContextDepsResult(params){const{pmRoot,assembly,canonicalId,options,rootEvidence,summaryOnly,rendering}=params,contextOptions=parseDepsContextOptions(options,assembly.graph.registry()),reachable=assembly.graph.closure(canonicalId,{direction:contextOptions.direction,...contextOptions.kinds===void 0?{}:{kinds:contextOptions.kinds},maxDepth:contextOptions.maxDepth??3}),missingReachable=reachable.value.filter(nodeId=>assembly.missingIdSet.has(nodeId.toLowerCase())),missingReachableSet=new Set(missingReachable.map(nodeId=>nodeId.toLowerCase())),relationshipRegistry=assembly.graph.registry(),filteredKinds=contextOptions.kinds?new Set(contextOptions.kinds.map(kind=>relationshipRegistry.require(kind).kind)):void 0,packetIds=new Set([canonicalId,...reachable.value]),missingReferences=[...assembly.dangling.active,...assembly.dangling.legacy_terminal].filter(row=>includesContextMissingReference({row,missingReachableSet,packetIds,filteredKinds,registry:relationshipRegistry})),budgetParams={pmRoot,assembly,canonicalId,contextOptions,rootEvidence,summaryOnly,rendering,missingCount:missingReachable.length,missingReferences};try{return enforceContextRenderedTokenBudget(budgetParams)}catch(error){if(error instanceof PmCliError&&error.code==="invalid_query_cursor"){const plan=createContextRetryPlan({...budgetParams,contextOptions:{...contextOptions,cursor:void 0},rendering:{...rendering,global:{...rendering.global,outputCursor:void 0}}},contextOptions.tokenBudget??DEFAULT_RELATIONSHIP_CONTEXT_TOKEN_BUDGET),retry=renderPmCommand(plan.args);throw new PmCliError(error.message,error.exitCode,{...error.context,nextSteps:[...error.context.nextSteps,retry],recovery:{suggested_retry:retry,suggested_retry_args:plan.args}})}throw isContextBudgetFloorError(error)?await createContextBudgetRefusal(budgetParams,error):error}}function trimDeepestDependency(tree){const pending=[tree];let parentToTrim;for(;pending.length>0;){const current=pending.pop();current.dependencies.length>0&&(parentToTrim=current,pending.push(...current.dependencies))}return parentToTrim?(parentToTrim.dependencies.pop(),parentToTrim.truncated=!0,!0):!1}function buildTreeOrGraphDepsResult(id,format,options,index,maxDepth,collapse,rendering){const effectiveMaxDepth=maxDepth??DEFAULT_DEPS_TREE_MAX_DEPTH,nodeLimit=parsePositiveInteger(options.nodeLimit,"node-limit")??DEFAULT_DEPS_TREE_NODE_LIMIT,edgeLimit=parsePositiveInteger(options.edgeLimit,"edge-limit")??DEFAULT_DEPS_TREE_EDGE_LIMIT,tokenBudget=parsePositiveInteger(options.tokenBudget,"token-budget")??DEFAULT_DEPS_TREE_TOKEN_BUDGET,budget={nodeLimit,edgeLimit,tokenBudget,nodes:0,edges:0,estimatedTokens:0,reasons:new Set},tree=toTreeNode(id,index,new Set,effectiveMaxDepth,format==="graph"?"repeated":collapse,new Set,budget),totals=countDependencyGraph(id,index,void 0);let result;for(;;){const graph=toGraph(tree),truncation=budget.reasons.size===0?void 0:{reasons:[...budget.reasons].sort(),limits:{max_depth:effectiveMaxDepth,node_limit:nodeLimit,edge_limit:edgeLimit,token_budget:tokenBudget},estimated_tokens:0,total_node_count:totals.node_count,total_edge_count:totals.edge_count,omitted_node_count:Math.max(0,totals.node_count-graph.nodes.length),omitted_edge_count:Math.max(0,totals.edge_count-graph.edges.length)},baseResult={id,format,node_count:graph.nodes.length,edge_count:graph.edges.length,edge_basis:"deduplicated_directed",missing_count:graph.missing_ids.length,...truncation?{truncation}:{}};if(result=format==="tree"?{...baseResult,tree}:{...baseResult,graph},(result.truncation===void 0?estimatePmOutputTokens(new TextEncoder().encode(renderDepsOutput(attachDepsProjection(result,!1,rendering.legacyAliasCounts),rendering)).byteLength):settleRenderedTokenCount(attachDepsProjection(result,!1,rendering.legacyAliasCounts),rendering,tokens=>{result.truncation.estimated_tokens=tokens}))<=tokenBudget)return result;if(!trimDeepestDependency(tree))return budget.reasons.add("token_budget"),result;budget.reasons.add("token_budget")}}function attachDepsProjection(result,summaryOnly,legacyAliasCounts={}){const group={name:result.format==="tree"?"dependency_tree":result.format==="graph"?"dependency_graph":"relationship_context",restore_with:"--full"},boundedGroups=result.context?.meta.truncated?[{name:"relationship_context_bounds",restore_with:"--token-budget <n> --node-limit <n> --edge-limit <n> --max-depth <n>"}]:[];return{...result,legacy_alias_counts:legacyAliasCounts,projection:{mode:summaryOnly?"summary":"full",declared_field_groups:[group,...boundedGroups],included_field_groups:summaryOnly?[]:[group.name]}}}async function runDeps(id,options,global2){const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const format=parseFormat(options.format),maxDepth=parseMaxDepth(options.maxDepth),collapse=parseCollapse(options.collapse);assertProjectionModeChoice(options.summary===!0,options.full===!0,"--summary");const summaryOnly=options.summary===!0,settings=await readSettings(pmRoot),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),items=await listAllItemMetadataLight(pmRoot,settings.item_format,typeRegistry.type_to_folder,void 0,settings.schema),statusRegistry=resolveRuntimeStatusRegistry(settings.schema),index=new Map(items.map(item=>[item.id.trim().toLowerCase(),toIndexedItem(item)])),dangling=collectDanglingDependencyReferences(items,status=>isTerminalStatus(status,statusRegistry));for(const reference of[...dangling.active,...dangling.legacy_terminal]){const holder=index.get(reference.holder_id.trim().toLowerCase()),referenceKind=reference.kind.trim().toLowerCase();holder&&!holder.dependencies.some(dependency=>dependency.id.trim().toLowerCase()===reference.target_id.trim().toLowerCase()&&dependency.kind===referenceKind)&&holder.dependencies.push({id:reference.target_id,kind:referenceKind})}if(!index.has(id.trim().toLowerCase()))throw new PmCliError(`Item ${id} not found`,EXIT_CODE.NOT_FOUND);const outputFormat=global2.outputFormat??(global2.json===!0||global2.json===void 0&&global2.defaultOutputFormat==="json"?"json":"toon");if(format==="context"){const canonicalId=index.get(id.trim().toLowerCase()).id,rootEvidence=summaryOnly?[]:await collectRootEvidence(pmRoot,canonicalId,settings,typeRegistry.type_to_folder),isTerminal=status=>isTerminalStatus(status,statusRegistry),relationshipRegistry=resolveWorkspaceRelationshipKindRegistry(),lookup=workspaceGraphCache().lookup(pmRoot,computeWorkspaceGraphFingerprint(items,isTerminal,relationshipRegistry),()=>assembleWorkspaceRelationshipGraph(items,isTerminal,relationshipRegistry));return attachDepsProjection(await buildContextDepsResult({pmRoot,assembly:lookup.assembly,canonicalId,options,rootEvidence,summaryOnly,rendering:{format:outputFormat,global:global2,commandOptions:options,legacyAliasCounts:lookup.assembly.legacyAliasCounts}}),summaryOnly,lookup.assembly.legacyAliasCounts)}const legacyAliasCounts=Object.fromEntries(Object.entries(assembleWorkspaceRelationshipGraph(items,status=>isTerminalStatus(status,statusRegistry)).legacyAliasCounts));return summaryOnly?attachDepsProjection({id,format,...countDependencyGraph(id,index,maxDepth)},!0,legacyAliasCounts):attachDepsProjection(buildTreeOrGraphDepsResult(id,format,options,index,maxDepth,collapse,{format:outputFormat,global:global2,commandOptions:options,legacyAliasCounts}),!1,legacyAliasCounts)}export{DEPS_COLLAPSE_VALUES,DEPS_DIRECTION_VALUES,DEPS_FORMAT_VALUES,buildDepsRelationshipContext,parseDirection,parseKinds,parseMaxDepth,parsePositiveInteger,runDeps};
2
2
  //# sourceMappingURL=dependencies.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]="1e6087f2-01b5-59c3-a471-433c722316b0")}catch{}})();import{reconcileExtensionCapabilityUsage}from"../../core/extensions/index.js";import{EXTENSION_CAPABILITY_CONTRACT,KNOWN_EXTENSION_CAPABILITIES,parseLegacyExtensionCapabilityAliasWarning,parseUnknownExtensionCapabilityWarning}from"../../core/extensions/loader.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{normalizeExtensionNameForMatch}from"./shared.js";function summarizeExtensionFailures(failures){return failures.map(({layer,name,error})=>({layer,name,error}))}function addRuntimePath(pathsByExtension,extensionName,pathValue){const normalizedName=normalizeExtensionNameForMatch(extensionName),normalizedPath=pathValue.trim();if(normalizedName.length===0||normalizedPath.length===0)return;const existing=pathsByExtension.get(normalizedName)??new Set;existing.add(normalizedPath),pathsByExtension.set(normalizedName,existing)}function collectRuntimeActivationPaths(activationResult){const commandPathsByExtension=new Map,actionPathsByExtension=new Map;for(const registration of activationResult.registrations.commands)addRuntimePath(commandPathsByExtension,registration.name,registration.command),addRuntimePath(actionPathsByExtension,registration.name,registration.action);for(const handler of activationResult.commands.handlers)addRuntimePath(commandPathsByExtension,handler.name,handler.command);for(const override of activationResult.commands.overrides)addRuntimePath(commandPathsByExtension,override.name,override.command);return{commandPathsByExtension,actionPathsByExtension}}function sortedRuntimePaths(values){if(!(!values||values.size===0))return[...values].sort((left,right)=>left.localeCompare(right))}function resolveDoctorActivationStatus(params){const{enabled,normalizedName,loadedNames,loadFailedNames,activationFailedNames}=params;return enabled?loadFailedNames.has(normalizedName)||activationFailedNames.has(normalizedName)?{runtime_active:!1,activation_status:"failed"}:loadedNames.has(normalizedName)?{runtime_active:!0,activation_status:"ok"}:{runtime_active:!1,activation_status:"not_loaded"}:{runtime_active:!1,activation_status:"not_loaded"}}function applyDoctorRuntimeActivationState(extensions,loadResult,activationResult){const loadedNames=new Set(loadResult.loaded.map(entry=>normalizeExtensionNameForMatch(entry.name))),loadFailedNames=new Set(loadResult.failed.map(entry=>normalizeExtensionNameForMatch(entry.name))),activationFailedNames=new Set(activationResult.failed.map(entry=>normalizeExtensionNameForMatch(entry.name))),{commandPathsByExtension,actionPathsByExtension}=collectRuntimeActivationPaths(activationResult);return extensions.map(entry=>{const normalizedName=normalizeExtensionNameForMatch(entry.name),commandPaths=sortedRuntimePaths(commandPathsByExtension.get(normalizedName)),actionPaths=sortedRuntimePaths(actionPathsByExtension.get(normalizedName)),runtimeMetadata={...commandPaths?{command_paths:commandPaths}:{},...actionPaths?{action_paths:actionPaths}:{}},activationStatus=resolveDoctorActivationStatus({enabled:entry.enabled,normalizedName,loadedNames,loadFailedNames,activationFailedNames});return{...entry,...activationStatus,...runtimeMetadata}})}function summarizePolicyWarnings(warnings){let warningCount=0,violationCount=0,blockedCount=0;for(const warning of warnings)if(warning.startsWith("extension_policy_")){if(warningCount+=1,warning.startsWith("extension_policy_violation_")){violationCount+=1;continue}warning.startsWith("extension_policy_blocked_")&&(blockedCount+=1)}return{warning_count:warningCount,violation_count:violationCount,blocked_count:blockedCount}}function lifecycleFlagCommand(options,action){return options.vocabulary==="package"?`pm package --${action}`:`pm extension --${action}`}const REGISTRATION_COLLISION_WARNING_CODES=new Set(["extension_command_handler_collision","extension_command_override_collision","extension_command_override_handler_overlap","extension_parser_override_collision","extension_preflight_override_collision","extension_renderer_collision","extension_service_override_collision"]);function isRegistrationCollisionWarning(warning){return REGISTRATION_COLLISION_WARNING_CODES.has(warningCode(warning))}function isExtensionLayer(value){return value==="project"||value==="global"}function parseRegistrationCollisionWarning(warning){const parts=warning.split(":"),code=parts[0];if(!code||!REGISTRATION_COLLISION_WARNING_CODES.has(code))return null;const winnerLayer=parts.at(-4),winnerName=parts.at(-3)?.trim(),displacedLayer=parts.at(-2),displacedName=parts.at(-1)?.trim();return!isExtensionLayer(winnerLayer)||!isExtensionLayer(displacedLayer)||!winnerName||!displacedName?null:{code,surface:parts.slice(1,-4).join(":")||"global",winner:{layer:winnerLayer,name:winnerName},displaced:{layer:displacedLayer,name:displacedName}}}function collectRegistrationCollisionExtensionNames(warnings){const names=new Set;for(const warning of warnings){const parsed=parseRegistrationCollisionWarning(warning);parsed&&(names.add(parsed.winner.name),names.add(parsed.displaced.name))}return[...names].sort((left,right)=>left.localeCompare(right))}function buildRegistrationCollisionRemediation(warnings,commands){const registrationCollisionWarnings=warnings.filter(isRegistrationCollisionWarning);if(registrationCollisionWarnings.length===0)return null;const collisionNames=collectRegistrationCollisionExtensionNames(registrationCollisionWarnings);return`Extension registration collisions or handler/override overlaps detected.${collisionNames.length>0?` Conflicting extensions: ${collisionNames.join(", ")}.`:""} Single-winner surfaces can hide earlier package behavior. Deactivate one conflicting package with ${commands.deactivate}, or scope registration surfaces in extensions.policy.extension_overrides, then rerun ${commands.doctor}.`}function buildRegistrationCollisionPlan(scope,warnings,extensions,options){const collisions=warnings.map(warning=>parseRegistrationCollisionWarning(warning)).filter(entry=>entry!==null).sort((left,right)=>`${left.code}:${left.surface}:${left.winner.name}:${left.displaced.name}`.localeCompare(`${right.code}:${right.surface}:${right.winner.name}:${right.displaced.name}`));if(collisions.length===0)return;const scopeFlag=scope==="global"?"--global":"--project",deactivatePrefix=lifecycleFlagCommand(options,"deactivate"),doctorCommand=`${lifecycleFlagCommand(options,"doctor")} ${scopeFlag} --detail deep --trace`,extensionByName=new Map(extensions.map(entry=>[normalizeExtensionNameForMatch(entry.name),entry])),affectedByName=new Map;for(const collision of collisions)for(const name of[collision.winner.name,collision.displaced.name]){const normalizedName=normalizeExtensionNameForMatch(name);affectedByName.set(normalizedName,(affectedByName.get(normalizedName)??0)+1)}const remediationCandidates=[...affectedByName.entries()].map(([normalizedName,affectedCollisions])=>{const extension=extensionByName.get(normalizedName),extensionName=extension?.name??normalizedName,commandPaths=extension?.command_paths??[],actionPaths=extension?.action_paths??[];return{action:"deactivate",extension:extensionName,command:`${deactivatePrefix} ${extensionName} ${scopeFlag}`,affected_collisions:affectedCollisions,feature_loss:{command_paths:[...commandPaths].sort((left,right)=>left.localeCompare(right)),action_paths:[...actionPaths].sort((left,right)=>left.localeCompare(right))}}}).sort((left,right)=>{const affectedDelta=right.affected_collisions-left.affected_collisions;if(affectedDelta!==0)return affectedDelta;const leftSurfaceCount=left.feature_loss.command_paths.length+left.feature_loss.action_paths.length,rightSurfaceCount=right.feature_loss.command_paths.length+right.feature_loss.action_paths.length;return leftSurfaceCount!==rightSurfaceCount?leftSurfaceCount-rightSurfaceCount:left.extension.localeCompare(right.extension)});return{status:"conflicts_detected",collision_count:collisions.length,extension_count:affectedByName.size,next_best_command:doctorCommand,collisions,remediation_candidates:remediationCandidates}}function classifyDoctorLoadFailureWarnings(loadFailures){const warnings=[];for(const failure of loadFailures){const normalizedError=failure.error.toLowerCase();(normalizedError.includes("cannot find package '@unbrained/pm-cli'")||normalizedError.includes('cannot find module "@unbrained/pm-cli"')||normalizedError.includes("cannot find module '@unbrained/pm-cli'"))&&warnings.push(`extension_load_failed_sdk_dependency_missing:${failure.name}`),(normalizedError.includes("cannot use import statement outside a module")||normalizedError.includes("to load an es module")||normalizedError.includes("must use import to load es module"))&&warnings.push(`extension_load_failed_module_mode_mismatch:${failure.name}`)}return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}function classifyDoctorActivationFailureWarnings(activationFailures=[]){const failures=Array.isArray(activationFailures)?activationFailures:[],warnings=[];for(const failure of failures){if(!failure||typeof failure.name!="string")continue;const missingCapability=failure.trace?.missing_capability??failure.trace?.capability;typeof missingCapability=="string"&&missingCapability.trim().length>0&&warnings.push(`extension_capability_missing:${failure.name}:${missingCapability.trim().toLowerCase()}`)}return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}function classifyUnusedCapabilityWarnings(loadResult,activationResult){const warnings=[];for(const entry of reconcileExtensionCapabilityUsage(loadResult.loaded,activationResult))for(const capability of entry.unused)warnings.push(`extension_capability_unused:${entry.layer}:${entry.name}:${capability}`);return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}const TRIAGE_REMEDIATION_RULES=[{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_manifest_")),build:ctx=>`Run ${lifecycleFlagCommand(ctx.options,"explore")} ${ctx.scopeFlag} to inspect discovered manifests and directories.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_unknown:")),build:()=>`Unknown extension capabilities detected. Allowed capabilities: ${KNOWN_EXTENSION_CAPABILITIES.join(", ")}. Review extension_capability_unknown warning details for suggested replacements.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_legacy_alias:")),build:()=>"Legacy extension capability aliases were auto-remapped to canonical capabilities. Update manifests to canonical names (migration/validation -> schema)."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_missing:")),build:ctx=>`Extension activation failed because code registered a surface missing from manifest capabilities. Run ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag} --detail deep --trace and add the reported missing_capability to manifest.json before publishing.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_unused:")),build:ctx=>`Extension manifests declare capabilities that are never registered against. Remove each reported unused capability from manifest.json to keep least privilege, or add the matching registration. Run ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag} --detail deep --trace for per-extension registration counts.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_command_definition_legacy_handler_alias:")),build:()=>"Extension command definitions using legacy handler were auto-remapped. Update command definitions to use run: (context) => ... for forward compatibility."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_output_service_override_global:")||warning.startsWith("extension_output_renderer_override_global:")),build:()=>"Global output service/renderer overrides are active. For output_format, return context.payload/null/undefined unless the extension owns the command. For renderers, return null for unrelated payloads so pm falls back to native rendering."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_schema_narrow_activation:")),build:()=>"A package registers custom item types/fields (a GLOBAL schema contribution) but also declares narrow activation.commands, so it never activates for built-in commands like pm create <type> and the custom type silently fails to register. Remove activation.commands from manifest.json so pm activates the package for every command, or \u2014 if the schema is intentionally command-scoped \u2014 knowingly ignore this advisory."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_load_failed_sdk_dependency_missing:")),build:ctx=>`Detected extension load failures caused by missing SDK dependency resolution. Ensure extension package dependencies include "@unbrained/pm-cli" and reinstall dependencies before running ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_load_failed_module_mode_mismatch:")),build:ctx=>`Detected extension module-mode mismatches. For ESM-based extension entries/imports, set package.json "type": "module" or use an explicit .mjs entry and rerun ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_pm_min_version_")||warning.startsWith("extension_pm_max_version_")),build:ctx=>`Extension pm version-bound warnings detected. Align each package manifest's pm_min_version/pm_max_version with the installed pm CLI version (see the warning's required/allowed=...:current=... details), or upgrade/downgrade the pm CLI to satisfy the declared bounds, then rerun ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:(_warnings,ctx)=>ctx.updateCheckFailedTotal>0,build:ctx=>`Run ${lifecycleFlagCommand(ctx.options,"manage")} ${ctx.scopeFlag} after validating network and repository access.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_manager_state_")),build:ctx=>`Review and repair ${ctx.scope} managed extension state file if schema/read warnings persist.`},{matches:(_warnings,ctx)=>ctx.policyWarningCount>0,build:()=>"Extension governance policy warnings detected. Review settings.extensions.policy mode and allow/block lists to confirm intended capabilities and registration surfaces."}];function buildExtensionTriageRemediation(params){const{normalizedWarnings,options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount,unmanagedActionRequiredTotal,notCheckedTotal,skippedNonGithubTotal,updateAvailableTotal}=params,remediation=[],ctx={options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount};if(normalizedWarnings.length>0){const registrationCollisionRemediation=buildRegistrationCollisionRemediation(normalizedWarnings,{deactivate:`${lifecycleFlagCommand(options,"deactivate")} <name> ${scopeFlag}`,doctor:`${lifecycleFlagCommand(options,"doctor")} ${scopeFlag} --detail deep --trace`});registrationCollisionRemediation&&remediation.push(registrationCollisionRemediation);for(const rule of TRIAGE_REMEDIATION_RULES)rule.matches(normalizedWarnings,ctx)&&remediation.push(rule.build(ctx))}return unmanagedActionRequiredTotal>0&&remediation.push(`Update-check coverage is partial because unmanaged extensions need adoption. Adopt existing installs via ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} --fix-managed-state (or ${lifecycleFlagCommand(options,"adopt-all")} ${scopeFlag}, ${lifecycleFlagCommand(options,"adopt")} <name> ${scopeFlag}, or reinstall via ${lifecycleFlagCommand(options,"install")} ${scopeFlag} <source>).`),skippedNonGithubTotal>0&&remediation.push("Update-check coverage is partial: non-GitHub managed sources were not checked. Inspect their registry or source directly; zero detected updates does not mean these packages are current. Runtime activation health is independent."),notCheckedTotal>0&&remediation.push(`Update-check coverage is partial: some sources have no completed check. Run ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} to request update checks.`),updateAvailableTotal>0&&remediation.push(`Update available managed extensions via ${lifecycleFlagCommand(options,"install")} ${scopeFlag} <source>.`),remediation.length===0&&remediation.push(`No immediate action required. Re-run ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} after extension changes.`),remediation}function buildExtensionTriageSummary(scope,warnings,extensions,options={}){const normalizedWarnings=[...new Set(warnings)].sort((left,right)=>left.localeCompare(right)),managedTotal=extensions.filter(entry=>entry.managed).length,enabledTotal=extensions.filter(entry=>entry.enabled).length,activeTotal=extensions.filter(entry=>entry.active).length,updateAvailableTotal=extensions.filter(entry=>entry.update_check_status==="checked"&&entry.update_available===!0).length,unmanagedExtensions=extensions.filter(entry=>entry.managed===!1),unmanagedExpectedExtensions=unmanagedExtensions.filter(entry=>isExpectedUnmanagedExtension(entry)).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),unmanagedActionRequiredExtensions=unmanagedExtensions.filter(entry=>!isExpectedUnmanagedExtension(entry)).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),updateCheckStatusTotals={checked:0,skipped_unmanaged:0,skipped_non_github:0,failed:0,not_checked:0};for(const entry of extensions)updateCheckStatusTotals[entry.update_check_status]+=1;const updateCheckFailedTotal=updateCheckStatusTotals.failed,skippedNonGithubTotal=extensions.filter(entry=>entry.update_check_status==="skipped_non_github"&&entry.source?.kind!=="builtin").length,partialCoverageWarnings=Object.entries({skipped_unmanaged:unmanagedActionRequiredExtensions.length,skipped_non_github:skippedNonGithubTotal,failed:updateCheckFailedTotal,not_checked:updateCheckStatusTotals.not_checked}).filter(([,count])=>count>0).map(([status,count])=>`extension_update_health_partial_coverage:${status}:${count}`),updateHealthPartial=partialCoverageWarnings.length>0,updateHealthCoverage=updateHealthPartial?"partial":"full",effectiveWarnings=[...new Set([...normalizedWarnings,...partialCoverageWarnings])].sort((left,right)=>left.localeCompare(right)),warningCodes=[...new Set(effectiveWarnings.map(value=>warningCode(value)))].sort((left,right)=>left.localeCompare(right)),policyWarnings=summarizePolicyWarnings(effectiveWarnings),scopeFlag=scope==="global"?"--global":"--project",collisionPlan=buildRegistrationCollisionPlan(scope,normalizedWarnings,extensions,options),remediation=buildExtensionTriageRemediation({normalizedWarnings:effectiveWarnings,options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount:policyWarnings.warning_count,unmanagedActionRequiredTotal:unmanagedActionRequiredExtensions.length,notCheckedTotal:updateCheckStatusTotals.not_checked,skippedNonGithubTotal,updateAvailableTotal});return{status:effectiveWarnings.length===0?"ok":"warn",warning_count:effectiveWarnings.length,warning_codes:warningCodes,warnings:effectiveWarnings,policy_warning_count:policyWarnings.warning_count,policy_violation_count:policyWarnings.violation_count,policy_blocked_count:policyWarnings.blocked_count,total_extensions:extensions.length,managed_total:managedTotal,enabled_total:enabledTotal,active_total:activeTotal,update_available_total:updateAvailableTotal,update_health_coverage:updateHealthCoverage,update_health_partial:updateHealthPartial,unmanaged_loaded_extension_count:unmanagedExtensions.length,unmanaged_loaded_extensions:unmanagedExtensions.map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),unmanaged_expected_extension_count:unmanagedExpectedExtensions.length,unmanaged_expected_extensions:unmanagedExpectedExtensions,unmanaged_action_required_extension_count:unmanagedActionRequiredExtensions.length,unmanaged_action_required_extensions:unmanagedActionRequiredExtensions,update_check_status_totals:updateCheckStatusTotals,update_check_failed_total:updateCheckFailedTotal,top_warnings:effectiveWarnings.slice(0,8),remediation,...collisionPlan?{collision_plan:collisionPlan}:{}}}function parseDoctorDetailMode(raw){if(!raw||raw.trim().length===0)return"summary";const normalized=raw.trim().toLowerCase();if(normalized==="summary"||normalized==="deep")return normalized;throw new PmCliError(`Invalid --detail value "${raw}". Expected summary or deep.`,EXIT_CODE.USAGE)}function warningCode(value){const normalized=value.trim(),separator=normalized.indexOf(":");return separator===-1?normalized:normalized.slice(0,separator)}function collectUnknownCapabilityGuidance(warnings){const seen=new Set,guidance=[];for(const warning of warnings){const parsedDetails=(()=>{const unknownWarning=parseUnknownExtensionCapabilityWarning(warning);return unknownWarning?[unknownWarning]:parseLegacyExtensionCapabilityAliasWarning(warning)})();for(const parsed of parsedDetails){const key=`${parsed.layer}:${parsed.name}:${parsed.capability}`;seen.has(key)||(seen.add(key),guidance.push(parsed))}}return guidance}function buildCapabilityContractMetadata(){return{version:EXTENSION_CAPABILITY_CONTRACT.version,capabilities:[...EXTENSION_CAPABILITY_CONTRACT.capabilities],legacy_aliases:{...EXTENSION_CAPABILITY_CONTRACT.legacy_aliases}}}function isExpectedUnmanagedExtension(entry){const normalizedName=normalizeExtensionNameForMatch(entry.name),normalizedDirectory=normalizeExtensionNameForMatch(entry.directory);return normalizedName.startsWith("builtin-")?!0:normalizedDirectory==="beads"||normalizedDirectory==="todos"}function buildDoctorConsistencySummary(scope,installedExtensions,loadedExtensions,failedLoads,disabledByFlag){if(scope!=="project"||disabledByFlag)return{warnings:[],summary:{active_project_count:0,loaded_project_count:0,active_project_names:[],loaded_project_names:[],missing_active_project_names:[]}};const activeProjectNames=[...new Set(installedExtensions.filter(entry=>entry.active).map(entry=>normalizeExtensionNameForMatch(entry.name)))].sort((left,right)=>left.localeCompare(right)),loadedProjectNames=[...new Set(loadedExtensions.filter(entry=>entry.layer==="project").map(entry=>normalizeExtensionNameForMatch(entry.name)))].sort((left,right)=>left.localeCompare(right)),failedLoadNames=new Set(failedLoads.map(entry=>normalizeExtensionNameForMatch(entry.name))),missingActiveProjectNames=activeProjectNames.filter(name=>!loadedProjectNames.includes(name)&&!failedLoadNames.has(name)).sort((left,right)=>left.localeCompare(right));return{warnings:missingActiveProjectNames.length>0?[`extension_doctor_consistency_active_not_loaded:${missingActiveProjectNames.join(",")}`]:[],summary:{active_project_count:activeProjectNames.length,loaded_project_count:loadedProjectNames.length,active_project_names:activeProjectNames,loaded_project_names:loadedProjectNames,missing_active_project_names:missingActiveProjectNames}}}export{applyDoctorRuntimeActivationState,buildCapabilityContractMetadata,buildDoctorConsistencySummary,buildExtensionTriageSummary,buildRegistrationCollisionRemediation,classifyDoctorActivationFailureWarnings,classifyDoctorLoadFailureWarnings,classifyUnusedCapabilityWarnings,collectUnknownCapabilityGuidance,parseDoctorDetailMode,summarizeExtensionFailures};
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]="573b0fd6-f003-55d8-8f49-c2a5e81cbc31")}catch{}})();import{reconcileExtensionCapabilityUsage}from"../../core/extensions/index.js";import{EXTENSION_CAPABILITY_CONTRACT,KNOWN_EXTENSION_CAPABILITIES,parseLegacyExtensionCapabilityAliasWarning,parseUnknownExtensionCapabilityWarning}from"../../core/extensions/loader.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{normalizeExtensionNameForMatch}from"./shared.js";import{extensionVersionRemediation}from"../../core/extensions/version-diagnostics.js";function summarizeExtensionFailures(failures){return failures.map(({layer,name,error})=>({layer,name,error}))}function addRuntimePath(pathsByExtension,extensionName,pathValue){const normalizedName=normalizeExtensionNameForMatch(extensionName),normalizedPath=pathValue.trim();if(normalizedName.length===0||normalizedPath.length===0)return;const existing=pathsByExtension.get(normalizedName)??new Set;existing.add(normalizedPath),pathsByExtension.set(normalizedName,existing)}function collectRuntimeActivationPaths(activationResult){const commandPathsByExtension=new Map,actionPathsByExtension=new Map;for(const registration of activationResult.registrations.commands)addRuntimePath(commandPathsByExtension,registration.name,registration.command),addRuntimePath(actionPathsByExtension,registration.name,registration.action);for(const handler of activationResult.commands.handlers)addRuntimePath(commandPathsByExtension,handler.name,handler.command);for(const override of activationResult.commands.overrides)addRuntimePath(commandPathsByExtension,override.name,override.command);return{commandPathsByExtension,actionPathsByExtension}}function sortedRuntimePaths(values){if(!(!values||values.size===0))return[...values].sort((left,right)=>left.localeCompare(right))}function resolveDoctorActivationStatus(params){const{enabled,normalizedName,loadedNames,loadFailedNames,activationFailedNames}=params;return enabled?loadFailedNames.has(normalizedName)||activationFailedNames.has(normalizedName)?{runtime_active:!1,activation_status:"failed"}:loadedNames.has(normalizedName)?{runtime_active:!0,activation_status:"ok"}:{runtime_active:!1,activation_status:"not_loaded"}:{runtime_active:!1,activation_status:"not_loaded"}}function applyDoctorRuntimeActivationState(extensions,loadResult,activationResult){const loadedNames=new Set(loadResult.loaded.map(entry=>normalizeExtensionNameForMatch(entry.name))),loadFailedNames=new Set(loadResult.failed.map(entry=>normalizeExtensionNameForMatch(entry.name))),activationFailedNames=new Set(activationResult.failed.map(entry=>normalizeExtensionNameForMatch(entry.name))),{commandPathsByExtension,actionPathsByExtension}=collectRuntimeActivationPaths(activationResult);return extensions.map(entry=>{const normalizedName=normalizeExtensionNameForMatch(entry.name),commandPaths=sortedRuntimePaths(commandPathsByExtension.get(normalizedName)),actionPaths=sortedRuntimePaths(actionPathsByExtension.get(normalizedName)),runtimeMetadata={...commandPaths?{command_paths:commandPaths}:{},...actionPaths?{action_paths:actionPaths}:{}},activationStatus=resolveDoctorActivationStatus({enabled:entry.enabled,normalizedName,loadedNames,loadFailedNames,activationFailedNames});return{...entry,...activationStatus,...runtimeMetadata}})}function summarizePolicyWarnings(warnings){let warningCount=0,violationCount=0,blockedCount=0;for(const warning of warnings)if(warning.startsWith("extension_policy_")){if(warningCount+=1,warning.startsWith("extension_policy_violation_")){violationCount+=1;continue}warning.startsWith("extension_policy_blocked_")&&(blockedCount+=1)}return{warning_count:warningCount,violation_count:violationCount,blocked_count:blockedCount}}function lifecycleFlagCommand(options,action){return options.vocabulary==="package"?`pm package --${action}`:`pm extension --${action}`}const REGISTRATION_COLLISION_WARNING_CODES=new Set(["extension_command_handler_collision","extension_command_override_collision","extension_command_override_handler_overlap","extension_parser_override_collision","extension_preflight_override_collision","extension_renderer_collision","extension_service_override_collision"]);function isRegistrationCollisionWarning(warning){return REGISTRATION_COLLISION_WARNING_CODES.has(warningCode(warning))}function isExtensionLayer(value){return value==="project"||value==="global"}function parseRegistrationCollisionWarning(warning){const parts=warning.split(":"),code=parts[0];if(!code||!REGISTRATION_COLLISION_WARNING_CODES.has(code))return null;const winnerLayer=parts.at(-4),winnerName=parts.at(-3)?.trim(),displacedLayer=parts.at(-2),displacedName=parts.at(-1)?.trim();return!isExtensionLayer(winnerLayer)||!isExtensionLayer(displacedLayer)||!winnerName||!displacedName?null:{code,surface:parts.slice(1,-4).join(":")||"global",winner:{layer:winnerLayer,name:winnerName},displaced:{layer:displacedLayer,name:displacedName}}}function collectRegistrationCollisionExtensionNames(warnings){const names=new Set;for(const warning of warnings){const parsed=parseRegistrationCollisionWarning(warning);parsed&&(names.add(parsed.winner.name),names.add(parsed.displaced.name))}return[...names].sort((left,right)=>left.localeCompare(right))}function buildRegistrationCollisionRemediation(warnings,commands){const registrationCollisionWarnings=warnings.filter(isRegistrationCollisionWarning);if(registrationCollisionWarnings.length===0)return null;const collisionNames=collectRegistrationCollisionExtensionNames(registrationCollisionWarnings);return`Extension registration collisions or handler/override overlaps detected.${collisionNames.length>0?` Conflicting extensions: ${collisionNames.join(", ")}.`:""} Single-winner surfaces can hide earlier package behavior. Deactivate one conflicting package with ${commands.deactivate}, or scope registration surfaces in extensions.policy.extension_overrides, then rerun ${commands.doctor}.`}function buildRegistrationCollisionPlan(scope,warnings,extensions,options){const collisions=warnings.map(warning=>parseRegistrationCollisionWarning(warning)).filter(entry=>entry!==null).sort((left,right)=>`${left.code}:${left.surface}:${left.winner.name}:${left.displaced.name}`.localeCompare(`${right.code}:${right.surface}:${right.winner.name}:${right.displaced.name}`));if(collisions.length===0)return;const scopeFlag=scope==="global"?"--global":"--project",deactivatePrefix=lifecycleFlagCommand(options,"deactivate"),doctorCommand=`${lifecycleFlagCommand(options,"doctor")} ${scopeFlag} --detail deep --trace`,extensionByName=new Map(extensions.map(entry=>[normalizeExtensionNameForMatch(entry.name),entry])),affectedByName=new Map;for(const collision of collisions)for(const name of[collision.winner.name,collision.displaced.name]){const normalizedName=normalizeExtensionNameForMatch(name);affectedByName.set(normalizedName,(affectedByName.get(normalizedName)??0)+1)}const remediationCandidates=[...affectedByName.entries()].map(([normalizedName,affectedCollisions])=>{const extension=extensionByName.get(normalizedName),extensionName=extension?.name??normalizedName,commandPaths=extension?.command_paths??[],actionPaths=extension?.action_paths??[];return{action:"deactivate",extension:extensionName,command:`${deactivatePrefix} ${extensionName} ${scopeFlag}`,affected_collisions:affectedCollisions,feature_loss:{command_paths:[...commandPaths].sort((left,right)=>left.localeCompare(right)),action_paths:[...actionPaths].sort((left,right)=>left.localeCompare(right))}}}).sort((left,right)=>{const affectedDelta=right.affected_collisions-left.affected_collisions;if(affectedDelta!==0)return affectedDelta;const leftSurfaceCount=left.feature_loss.command_paths.length+left.feature_loss.action_paths.length,rightSurfaceCount=right.feature_loss.command_paths.length+right.feature_loss.action_paths.length;return leftSurfaceCount!==rightSurfaceCount?leftSurfaceCount-rightSurfaceCount:left.extension.localeCompare(right.extension)});return{status:"conflicts_detected",collision_count:collisions.length,extension_count:affectedByName.size,next_best_command:doctorCommand,collisions,remediation_candidates:remediationCandidates}}function classifyDoctorLoadFailureWarnings(loadFailures){const warnings=[];for(const failure of loadFailures){const normalizedError=failure.error.toLowerCase();(normalizedError.includes("cannot find package '@unbrained/pm-cli'")||normalizedError.includes('cannot find module "@unbrained/pm-cli"')||normalizedError.includes("cannot find module '@unbrained/pm-cli'"))&&warnings.push(`extension_load_failed_sdk_dependency_missing:${failure.name}`),(normalizedError.includes("cannot use import statement outside a module")||normalizedError.includes("to load an es module")||normalizedError.includes("must use import to load es module"))&&warnings.push(`extension_load_failed_module_mode_mismatch:${failure.name}`)}return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}function classifyDoctorActivationFailureWarnings(activationFailures=[]){const failures=Array.isArray(activationFailures)?activationFailures:[],warnings=[];for(const failure of failures){if(!failure||typeof failure.name!="string")continue;const missingCapability=failure.trace?.missing_capability??failure.trace?.capability;typeof missingCapability=="string"&&missingCapability.trim().length>0&&warnings.push(`extension_capability_missing:${failure.name}:${missingCapability.trim().toLowerCase()}`)}return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}function classifyUnusedCapabilityWarnings(loadResult,activationResult){const warnings=[];for(const entry of reconcileExtensionCapabilityUsage(loadResult.loaded,activationResult))for(const capability of entry.unused)warnings.push(`extension_capability_unused:${entry.layer}:${entry.name}:${capability}`);return[...new Set(warnings)].sort((left,right)=>left.localeCompare(right))}const TRIAGE_REMEDIATION_RULES=[{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_manifest_")),build:ctx=>`Run ${lifecycleFlagCommand(ctx.options,"explore")} ${ctx.scopeFlag} to inspect discovered manifests and directories.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_unknown:")),build:()=>`Unknown extension capabilities detected. Allowed capabilities: ${KNOWN_EXTENSION_CAPABILITIES.join(", ")}. Review extension_capability_unknown warning details for suggested replacements.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_legacy_alias:")),build:()=>"Legacy extension capability aliases were auto-remapped to canonical capabilities. Update manifests to canonical names (migration/validation -> schema)."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_missing:")),build:ctx=>`Extension activation failed because code registered a surface missing from manifest capabilities. Run ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag} --detail deep --trace and add the reported missing_capability to manifest.json before publishing.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_capability_unused:")),build:ctx=>`Extension manifests declare capabilities that are never registered against. Remove each reported unused capability from manifest.json to keep least privilege, or add the matching registration. Run ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag} --detail deep --trace for per-extension registration counts.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_command_definition_legacy_handler_alias:")),build:()=>"Extension command definitions using legacy handler were auto-remapped. Update command definitions to use run: (context) => ... for forward compatibility."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_output_service_override_global:")||warning.startsWith("extension_output_renderer_override_global:")),build:()=>"Global output service/renderer overrides are active. For output_format, return context.payload/null/undefined unless the extension owns the command. For renderers, return null for unrelated payloads so pm falls back to native rendering."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_schema_narrow_activation:")),build:()=>"A package registers custom item types/fields (a GLOBAL schema contribution) but also declares narrow activation.commands, so it never activates for built-in commands like pm create <type> and the custom type silently fails to register. Remove activation.commands from manifest.json so pm activates the package for every command, or \u2014 if the schema is intentionally command-scoped \u2014 knowingly ignore this advisory."},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_load_failed_sdk_dependency_missing:")),build:ctx=>`Detected extension load failures caused by missing SDK dependency resolution. Ensure extension package dependencies include "@unbrained/pm-cli" and reinstall dependencies before running ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_load_failed_module_mode_mismatch:")),build:ctx=>`Detected extension module-mode mismatches. For ESM-based extension entries/imports, set package.json "type": "module" or use an explicit .mjs entry and rerun ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_pm_min_version_")||warning.startsWith("extension_pm_max_version_")),build:ctx=>`Extension pm version-bound warnings detected. Align each package manifest's pm_min_version/pm_max_version with the installed pm CLI version (see the warning's required/allowed=...:current=... details), or upgrade/downgrade the pm CLI to satisfy the declared bounds, then rerun ${lifecycleFlagCommand(ctx.options,"doctor")} ${ctx.scopeFlag}.`},{matches:(_warnings,ctx)=>ctx.updateCheckFailedTotal>0,build:ctx=>`Run ${lifecycleFlagCommand(ctx.options,"manage")} ${ctx.scopeFlag} after validating network and repository access.`},{matches:warnings=>warnings.some(warning=>warning.startsWith("extension_manager_state_")),build:ctx=>`Review and repair ${ctx.scope} managed extension state file if schema/read warnings persist.`},{matches:(_warnings,ctx)=>ctx.policyWarningCount>0,build:()=>"Extension governance policy warnings detected. Review settings.extensions.policy mode and allow/block lists to confirm intended capabilities and registration surfaces."}];function buildExtensionTriageRemediation(params){const{normalizedWarnings,options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount,unmanagedActionRequiredTotal,notCheckedTotal,skippedNonGithubTotal,updateAvailableTotal}=params,remediation=normalizedWarnings.map(extensionVersionRemediation).filter(guidance=>guidance!==void 0),ctx={options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount};if(normalizedWarnings.length>0){const registrationCollisionRemediation=buildRegistrationCollisionRemediation(normalizedWarnings,{deactivate:`${lifecycleFlagCommand(options,"deactivate")} <name> ${scopeFlag}`,doctor:`${lifecycleFlagCommand(options,"doctor")} ${scopeFlag} --detail deep --trace`});registrationCollisionRemediation&&remediation.push(registrationCollisionRemediation);for(const rule of TRIAGE_REMEDIATION_RULES)rule.matches(normalizedWarnings,ctx)&&remediation.push(rule.build(ctx))}return unmanagedActionRequiredTotal>0&&remediation.push(`Update-check coverage is partial because unmanaged extensions need adoption. Adopt existing installs via ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} --fix-managed-state (or ${lifecycleFlagCommand(options,"adopt-all")} ${scopeFlag}, ${lifecycleFlagCommand(options,"adopt")} <name> ${scopeFlag}, or reinstall via ${lifecycleFlagCommand(options,"install")} ${scopeFlag} <source>).`),skippedNonGithubTotal>0&&remediation.push("Update-check coverage is partial: non-GitHub managed sources were not checked. Inspect their registry or source directly; zero detected updates does not mean these packages are current. Runtime activation health is independent."),notCheckedTotal>0&&remediation.push(`Update-check coverage is partial: some sources have no completed check. Run ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} to request update checks.`),updateAvailableTotal>0&&remediation.push(`Update available managed extensions via ${lifecycleFlagCommand(options,"install")} ${scopeFlag} <source>.`),remediation.length===0&&remediation.push(`No immediate action required. Re-run ${lifecycleFlagCommand(options,"manage")} ${scopeFlag} after extension changes.`),remediation}function buildExtensionTriageSummary(scope,warnings,extensions,options={}){const normalizedWarnings=[...new Set(warnings)].sort((left,right)=>left.localeCompare(right)),managedTotal=extensions.filter(entry=>entry.managed).length,enabledTotal=extensions.filter(entry=>entry.enabled).length,activeTotal=extensions.filter(entry=>entry.active).length,updateAvailableTotal=extensions.filter(entry=>entry.update_check_status==="checked"&&entry.update_available===!0).length,unmanagedExtensions=extensions.filter(entry=>entry.managed===!1),unmanagedExpectedExtensions=unmanagedExtensions.filter(entry=>isExpectedUnmanagedExtension(entry)).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),unmanagedActionRequiredExtensions=unmanagedExtensions.filter(entry=>!isExpectedUnmanagedExtension(entry)).map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),updateCheckStatusTotals={checked:0,skipped_unmanaged:0,skipped_non_github:0,failed:0,not_checked:0};for(const entry of extensions)updateCheckStatusTotals[entry.update_check_status]+=1;const updateCheckFailedTotal=updateCheckStatusTotals.failed,skippedNonGithubTotal=extensions.filter(entry=>entry.update_check_status==="skipped_non_github"&&entry.source?.kind!=="builtin").length,partialCoverageWarnings=Object.entries({skipped_unmanaged:unmanagedActionRequiredExtensions.length,skipped_non_github:skippedNonGithubTotal,failed:updateCheckFailedTotal,not_checked:updateCheckStatusTotals.not_checked}).filter(([,count])=>count>0).map(([status,count])=>`extension_update_health_partial_coverage:${status}:${count}`),updateHealthPartial=partialCoverageWarnings.length>0,updateHealthCoverage=updateHealthPartial?"partial":"full",effectiveWarnings=[...new Set([...normalizedWarnings,...partialCoverageWarnings])].sort((left,right)=>left.localeCompare(right)),warningCodes=[...new Set(effectiveWarnings.map(value=>warningCode(value)))].sort((left,right)=>left.localeCompare(right)),policyWarnings=summarizePolicyWarnings(effectiveWarnings),scopeFlag=scope==="global"?"--global":"--project",collisionPlan=buildRegistrationCollisionPlan(scope,normalizedWarnings,extensions,options),remediation=buildExtensionTriageRemediation({normalizedWarnings:effectiveWarnings,options,scope,scopeFlag,updateCheckFailedTotal,policyWarningCount:policyWarnings.warning_count,unmanagedActionRequiredTotal:unmanagedActionRequiredExtensions.length,notCheckedTotal:updateCheckStatusTotals.not_checked,skippedNonGithubTotal,updateAvailableTotal});return{status:effectiveWarnings.length===0?"ok":"warn",warning_count:effectiveWarnings.length,warning_codes:warningCodes,warnings:effectiveWarnings,policy_warning_count:policyWarnings.warning_count,policy_violation_count:policyWarnings.violation_count,policy_blocked_count:policyWarnings.blocked_count,total_extensions:extensions.length,managed_total:managedTotal,enabled_total:enabledTotal,active_total:activeTotal,update_available_total:updateAvailableTotal,update_health_coverage:updateHealthCoverage,update_health_partial:updateHealthPartial,unmanaged_loaded_extension_count:unmanagedExtensions.length,unmanaged_loaded_extensions:unmanagedExtensions.map(entry=>entry.name).sort((left,right)=>left.localeCompare(right)),unmanaged_expected_extension_count:unmanagedExpectedExtensions.length,unmanaged_expected_extensions:unmanagedExpectedExtensions,unmanaged_action_required_extension_count:unmanagedActionRequiredExtensions.length,unmanaged_action_required_extensions:unmanagedActionRequiredExtensions,update_check_status_totals:updateCheckStatusTotals,update_check_failed_total:updateCheckFailedTotal,top_warnings:effectiveWarnings.slice(0,8),remediation,...collisionPlan?{collision_plan:collisionPlan}:{}}}function parseDoctorDetailMode(raw){if(!raw||raw.trim().length===0)return"summary";const normalized=raw.trim().toLowerCase();if(normalized==="summary"||normalized==="deep")return normalized;throw new PmCliError(`Invalid --detail value "${raw}". Expected summary or deep.`,EXIT_CODE.USAGE)}function warningCode(value){const normalized=value.trim(),separator=normalized.indexOf(":");return separator===-1?normalized:normalized.slice(0,separator)}function collectUnknownCapabilityGuidance(warnings){const seen=new Set,guidance=[];for(const warning of warnings){const parsedDetails=(()=>{const unknownWarning=parseUnknownExtensionCapabilityWarning(warning);return unknownWarning?[unknownWarning]:parseLegacyExtensionCapabilityAliasWarning(warning)})();for(const parsed of parsedDetails){const key=`${parsed.layer}:${parsed.name}:${parsed.capability}`;seen.has(key)||(seen.add(key),guidance.push(parsed))}}return guidance}function buildCapabilityContractMetadata(){return{version:EXTENSION_CAPABILITY_CONTRACT.version,capabilities:[...EXTENSION_CAPABILITY_CONTRACT.capabilities],legacy_aliases:{...EXTENSION_CAPABILITY_CONTRACT.legacy_aliases}}}function isExpectedUnmanagedExtension(entry){const normalizedName=normalizeExtensionNameForMatch(entry.name),normalizedDirectory=normalizeExtensionNameForMatch(entry.directory);return normalizedName.startsWith("builtin-")?!0:normalizedDirectory==="beads"||normalizedDirectory==="todos"}function buildDoctorConsistencySummary(scope,installedExtensions,loadedExtensions,failedLoads,disabledByFlag){if(scope!=="project"||disabledByFlag)return{warnings:[],summary:{active_project_count:0,loaded_project_count:0,active_project_names:[],loaded_project_names:[],missing_active_project_names:[]}};const activeProjectNames=[...new Set(installedExtensions.filter(entry=>entry.active).map(entry=>normalizeExtensionNameForMatch(entry.name)))].sort((left,right)=>left.localeCompare(right)),loadedProjectNames=[...new Set(loadedExtensions.filter(entry=>entry.layer==="project").map(entry=>normalizeExtensionNameForMatch(entry.name)))].sort((left,right)=>left.localeCompare(right)),failedLoadNames=new Set(failedLoads.map(entry=>normalizeExtensionNameForMatch(entry.name))),missingActiveProjectNames=activeProjectNames.filter(name=>!loadedProjectNames.includes(name)&&!failedLoadNames.has(name)).sort((left,right)=>left.localeCompare(right));return{warnings:missingActiveProjectNames.length>0?[`extension_doctor_consistency_active_not_loaded:${missingActiveProjectNames.join(",")}`]:[],summary:{active_project_count:activeProjectNames.length,loaded_project_count:loadedProjectNames.length,active_project_names:activeProjectNames,loaded_project_names:loadedProjectNames,missing_active_project_names:missingActiveProjectNames}}}export{applyDoctorRuntimeActivationState,buildCapabilityContractMetadata,buildDoctorConsistencySummary,buildExtensionTriageSummary,buildRegistrationCollisionRemediation,classifyDoctorActivationFailureWarnings,classifyDoctorLoadFailureWarnings,classifyUnusedCapabilityWarnings,collectUnknownCapabilityGuidance,parseDoctorDetailMode,summarizeExtensionFailures};
2
2
  //# sourceMappingURL=doctor.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]="fcf7df06-e3b8-5476-a76a-cd391839c13d")}catch{}})();function buildBundledInstallReceipt(packages,dryRun){const succeeded=packages.filter(entry=>entry.result.ok).length;return{installed_all:!dryRun&&succeeded===packages.length,installed_count:dryRun?0:succeeded,...dryRun?{dry_run:!0,planned_count:succeeded}:{},failed_count:packages.length-succeeded,packages:packages.map(({alias,result})=>{const details=result.details;return{alias,ok:result.ok,extension:details.extension,source:details.source,source_resolution:details.source_resolution,install_plan:details.install_plan,dry_run:details.dry_run,destination_path:details.destination_path,activated:details.activated,settings_changed:details.settings_changed,command_paths:details.command_paths,action_paths:details.action_paths,command_discovery:details.command_discovery,verification:details.verification,runtime_activation_status:details.runtime_activation_status,activation_diagnostics:details.activation_diagnostics,warnings:result.warnings}})}}export{buildBundledInstallReceipt};
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]="17cca82e-e9f9-5633-8d91-bc6c2b560d5f")}catch{}})();function buildBundledInstallReceipt(packages,dryRun){const succeeded=packages.filter(entry=>entry.result.ok).length;return{installed_all:!dryRun&&succeeded===packages.length,installed_count:dryRun?0:succeeded,...dryRun?{dry_run:!0,planned_count:succeeded}:{},failed_count:packages.length-succeeded,packages:packages.map(({alias,result})=>{const details=result.details;return{alias,ok:result.ok,extension:details.extension,source:details.source,source_resolution:details.source_resolution,install_plan:details.install_plan,dry_run:details.dry_run,destination_path:details.destination_path,activated:details.activated,settings_changed:details.settings_changed,previous_state_preserved:details.previous_state_preserved,rollback:details.rollback,command_paths:details.command_paths,action_paths:details.action_paths,command_discovery:details.command_discovery,verification:details.verification,runtime_activation_status:details.runtime_activation_status,activation_diagnostics:details.activation_diagnostics,warnings:result.warnings}})}}export{buildBundledInstallReceipt};
2
2
  //# sourceMappingURL=install-receipts.js.map
@@ -21,3 +21,14 @@ export declare const readOptionalMetadataFile:(filePath:string) => Promise<Buffe
21
21
  export declare const captureExtensionInstallSnapshot:(selectedRoot:string,settingsRoot:string,destinationDirectory:string,destinationExists:boolean,backupDirectory:string) => Promise<ExtensionInstallSnapshot>;
22
22
  /** Restore directory and metadata snapshots after a partially persisted install. */
23
23
  export declare const restoreExtensionInstallSnapshot:(snapshot:ExtensionInstallSnapshot) => Promise<void>;
24
+ /** Retain the previous installation until both persistence and runtime verification settle. */
25
+ export declare function withVerifiedExtensionInstall<T extends {
26
+ ok:boolean;
27
+ details:Record<string,unknown>;
28
+ }>(options:{
29
+ selectedRoot:string;
30
+ settingsRoot:string;
31
+ destinationDirectory:string;
32
+ sourceDirectory:string;
33
+ scope:"project" | "global";
34
+ },install:() => Promise<T>):Promise<T>;
@@ -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]="776854e4-6df4-507e-b21b-a4d320946642")}catch{}})();import{withHostEnvironmentBoundary}from"../../core/fs/host-environment-errors.js";import fs from"node:fs/promises";import path from"node:path";import{getSettingsPath}from"../../core/store/paths.js";import{isErrnoCode}from"./install-runtime.js";import{resolveManagedExtensionStatePath}from"./managed-state.js";const readOptionalMetadataFile=async filePath=>fs.readFile(filePath).catch(error=>{if(isErrnoCode(error,"ENOENT"))return null;throw error}),captureExtensionInstallSnapshot=async(selectedRoot,settingsRoot,destinationDirectory,destinationExists,backupDirectory)=>withHostEnvironmentBoundary("extension_install_backup",async()=>{const managedStatePath=resolveManagedExtensionStatePath(selectedRoot),settingsPath=getSettingsPath(settingsRoot),[managedStateContents,settingsContents]=await Promise.all([readOptionalMetadataFile(managedStatePath),readOptionalMetadataFile(settingsPath)]);return destinationExists&&await fs.cp(destinationDirectory,backupDirectory,{recursive:!0,force:!0}),{backupDirectory,destinationDirectory,destinationExists,managedStatePath,managedStateContents,settingsPath,settingsContents}}),restoreExtensionInstallSnapshot=async snapshot=>withHostEnvironmentBoundary("extension_install_rollback",async()=>{await fs.rm(snapshot.destinationDirectory,{recursive:!0,force:!0}),snapshot.destinationExists&&await fs.cp(snapshot.backupDirectory,snapshot.destinationDirectory,{recursive:!0,force:!0});for(const[filePath,contents]of[[snapshot.managedStatePath,snapshot.managedStateContents],[snapshot.settingsPath,snapshot.settingsContents]])contents===null?await fs.rm(filePath,{force:!0}):(await fs.mkdir(path.dirname(filePath),{recursive:!0}),await fs.writeFile(filePath,contents))});export{captureExtensionInstallSnapshot,readOptionalMetadataFile,restoreExtensionInstallSnapshot};
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]="7c06c702-29ea-5552-aadc-52dfc9c238ef")}catch{}})();import{withHostEnvironmentBoundary}from"../../core/fs/host-environment-errors.js";import fs from"node:fs/promises";import path from"node:path";import{getSettingsPath}from"../../core/store/paths.js";import{isErrnoCode}from"./install-runtime.js";import{pathExists}from"../../core/fs/fs-utils.js";import{PmCliError}from"../../core/shared/errors.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{renderPmCommand}from"../command-line.js";import{areDirectoriesEquivalent}from"./install-sources.js";import{writeWorkspaceJsonWithHistory}from"../../core/history/workspace-history.js";import{readSettings}from"../../core/store/settings.js";import{clearSettingsReadCache}from"../../core/store/settings-read-cache.js";import{resolveAuthor}from"../../core/shared/author.js";import{resolveManagedExtensionStatePath}from"./managed-state.js";const readOptionalMetadataFile=async filePath=>fs.readFile(filePath).catch(error=>{if(isErrnoCode(error,"ENOENT"))return null;throw error}),captureExtensionInstallSnapshot=async(selectedRoot,settingsRoot,destinationDirectory,destinationExists,backupDirectory)=>withHostEnvironmentBoundary("extension_install_backup",async()=>{const managedStatePath=resolveManagedExtensionStatePath(selectedRoot),settingsPath=getSettingsPath(settingsRoot),[managedStateContents,settingsContents]=await Promise.all([readOptionalMetadataFile(managedStatePath),readOptionalMetadataFile(settingsPath)]);return destinationExists&&await fs.cp(destinationDirectory,backupDirectory,{recursive:!0,force:!0}),{backupDirectory,destinationDirectory,destinationExists,managedStatePath,managedStateContents,settingsPath,settingsContents}}),restoreExtensionInstallSnapshot=async snapshot=>withHostEnvironmentBoundary("extension_install_rollback",async()=>{await fs.rm(snapshot.destinationDirectory,{recursive:!0,force:!0}),snapshot.destinationExists&&await fs.cp(snapshot.backupDirectory,snapshot.destinationDirectory,{recursive:!0,force:!0});for(const[filePath,contents]of[[snapshot.managedStatePath,snapshot.managedStateContents],[snapshot.settingsPath,snapshot.settingsContents]])if(contents===null)await fs.rm(filePath,{force:!0});else if(filePath===snapshot.settingsPath){const settingsRoot=path.dirname(snapshot.settingsPath),settings=await readSettings(settingsRoot);try{await writeWorkspaceJsonWithHistory({pmRoot:settingsRoot,filePath,raw:contents.toString("utf8"),op:"extension:install:rollback",author:resolveAuthor(void 0,settings.author_default),lockTtlSeconds:settings.locks.ttl_seconds,lockWaitMs:settings.locks.wait_ms})}finally{clearSettingsReadCache(settingsRoot)}}else await fs.mkdir(path.dirname(filePath),{recursive:!0}),await fs.writeFile(filePath,contents)});async function withVerifiedExtensionInstall(options,install){const destinationExists=await pathExists(options.destinationDirectory),inPlace=await areDirectoriesEquivalent(options.sourceDirectory,options.destinationDirectory);await fs.mkdir(options.selectedRoot,{recursive:!0});const backupParent=path.join(path.dirname(options.selectedRoot),"runtime","extension-installs");await fs.mkdir(backupParent,{recursive:!0});const backupRoot=await fs.mkdtemp(path.join(backupParent,".pm-extension-install-backup-")),backupDirectory=path.join(backupRoot,"destination"),recoveryArgs=["package","install",backupDirectory,`--${options.scope}`],recoveryCommand=renderPmCommand(recoveryArgs);let retainBackup=!1;try{const snapshot=await captureExtensionInstallSnapshot(options.selectedRoot,options.settingsRoot,options.destinationDirectory,destinationExists,backupDirectory);let result;try{result=await install()}catch(error){try{await restoreExtensionInstallSnapshot(snapshot)}catch(rollbackError){retainBackup=!0;const wrapped=new PmCliError(`Extension install failed: ${String(error)}; rollback failed: ${String(rollbackError)}`,EXIT_CODE.GENERIC_FAILURE,{code:"extension_install_rollback_failed",original_code:error instanceof PmCliError?error.code:void 0,required:"Restore the previous package before retrying the replacement. Previous state was not preserved.",nextSteps:[destinationExists?recoveryCommand:"Repair the reported metadata write failure, then retry the original install."],...destinationExists?{recovery:{suggested_retry:recoveryCommand,suggested_retry_args:recoveryArgs}}:{}});throw Object.defineProperty(wrapped,"cause",{value:error,configurable:!0,writable:!0}),wrapped}throw error}if(result.ok)return result;if(!destinationExists||inPlace)return{...result,details:{...result.details,previous_state_preserved:!1}};try{await restoreExtensionInstallSnapshot(snapshot)}catch(error){return retainBackup=!0,{...result,details:{...result.details,previous_state_preserved:!1,rollback:{status:"failed",error:String(error),backup_directory:backupDirectory,recovery_command:recoveryCommand,recovery_args:recoveryArgs}}}}return{...result,details:{...result.details,overwritten:!1,settings_changed:!1,previous_state_preserved:!0,rollback:{status:"restored"}}}}finally{retainBackup||await fs.rm(backupRoot,{recursive:!0,force:!0}).catch(()=>{})}}export{captureExtensionInstallSnapshot,readOptionalMetadataFile,restoreExtensionInstallSnapshot,withVerifiedExtensionInstall};
2
2
  //# sourceMappingURL=install-snapshot.js.map
@@ -168,6 +168,18 @@ warnings:string[];
168
168
  /** Value that configures or reports details for this contract. */
169
169
  details:Record<string,unknown> & {
170
170
  install_plan?:ExtensionInstallPlan;
171
+ /** Whether a rejected install restored the installation it replaced. */
172
+ previous_state_preserved?:boolean;
173
+ /** Compensation outcome; failed restoration retains an executable recovery source. */
174
+ rollback?:{
175
+ status:"restored";
176
+ } | {
177
+ status:"failed";
178
+ error:string;
179
+ backup_directory:string;
180
+ recovery_command:string;
181
+ recovery_args:string[];
182
+ };
171
183
  };
172
184
  }
173
185
  /** Documents the extension triage summary payload exchanged by command, SDK, and package integrations. */