@unbrained/pm-cli 2026.6.8 → 2026.6.9

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 (374) hide show
  1. package/CHANGELOG.md +31 -11
  2. package/dist/cli/extension-command-options.js +40 -17
  3. package/dist/cli/extension-command-options.js.map +1 -1
  4. package/dist/cli-bundle/chunks/activity-HF3VJYKH.js +16 -0
  5. package/dist/cli-bundle/chunks/{activity-Q7XMIZIH.js → activity-RUJATACW.js} +11 -11
  6. package/dist/cli-bundle/chunks/{aggregate-GBSHSXOB.js → aggregate-IQ27NFBI.js} +10 -11
  7. package/dist/cli-bundle/chunks/{aggregate-GBSHSXOB.js.map → aggregate-IQ27NFBI.js.map} +1 -1
  8. package/dist/cli-bundle/chunks/{aggregate-HKQJZUBG.js → aggregate-TT7OCHHT.js} +12 -13
  9. package/dist/cli-bundle/chunks/{aggregate-HKQJZUBG.js.map → aggregate-TT7OCHHT.js.map} +1 -1
  10. package/dist/cli-bundle/chunks/{append-3RFOU7P5.js → append-CWQZBUWV.js} +8 -8
  11. package/dist/cli-bundle/chunks/{append-OM74OJVT.js → append-E7AJ5RTR.js} +8 -8
  12. package/dist/cli-bundle/chunks/{chunk-NLVCMVC7.js → chunk-23WNCJBA.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-KVXIQDJG.js → chunk-3RHE76G6.js} +12 -12
  14. package/dist/cli-bundle/chunks/{chunk-Z2HXAFFH.js → chunk-42IULX44.js} +2 -2
  15. package/dist/cli-bundle/chunks/{chunk-FO2TYSQZ.js → chunk-44JP4PYY.js} +2 -2
  16. package/dist/cli-bundle/chunks/{chunk-DV27WDA7.js → chunk-4LRVXVJK.js} +2 -2
  17. package/dist/cli-bundle/chunks/{chunk-CBJXWXI5.js → chunk-4TJWRPIH.js} +2 -2
  18. package/dist/cli-bundle/chunks/{chunk-XEKZCBCS.js → chunk-5ATRWEZO.js} +3 -3
  19. package/dist/cli-bundle/chunks/{chunk-YJAKN2N2.js → chunk-5JF76OJF.js} +203 -10
  20. package/dist/cli-bundle/chunks/chunk-5JF76OJF.js.map +1 -0
  21. package/dist/cli-bundle/chunks/{chunk-AEMKH5WQ.js → chunk-5MMLINZB.js} +3 -3
  22. package/dist/cli-bundle/chunks/{chunk-NGEEXR2R.js → chunk-6IGTNFE3.js} +2 -2
  23. package/dist/cli-bundle/chunks/{chunk-4TI3532H.js → chunk-7CR4GAYN.js} +2 -2
  24. package/dist/cli-bundle/chunks/{chunk-D7WK2PKB.js → chunk-7YTWXGE3.js} +5 -5
  25. package/dist/cli-bundle/chunks/{chunk-QQPZYP73.js → chunk-A5342JVL.js} +12 -12
  26. package/dist/cli-bundle/chunks/{chunk-KN4WSESY.js → chunk-AM2AXVFS.js} +5 -5
  27. package/dist/cli-bundle/chunks/{chunk-F33VC5EX.js → chunk-ANKG2JKL.js} +2 -2
  28. package/dist/cli-bundle/chunks/{chunk-ODN53S6H.js → chunk-AVGOVJGV.js} +10 -13
  29. package/dist/cli-bundle/chunks/chunk-AVGOVJGV.js.map +1 -0
  30. package/dist/cli-bundle/chunks/{chunk-PQDH3S54.js → chunk-BACSNVWE.js} +5 -5
  31. package/dist/cli-bundle/chunks/{chunk-L3LYL3ID.js → chunk-BIRVSIM2.js} +12 -12
  32. package/dist/cli-bundle/chunks/{chunk-3TXWDGPU.js → chunk-C72IQIBT.js} +224 -10
  33. package/dist/cli-bundle/chunks/chunk-C72IQIBT.js.map +7 -0
  34. package/dist/cli-bundle/chunks/{chunk-5WO2VKFA.js → chunk-CAXUGAAF.js} +8 -8
  35. package/dist/cli-bundle/chunks/{chunk-7NQIY7Z6.js → chunk-D5D7VKIC.js} +3 -3
  36. package/dist/cli-bundle/chunks/{chunk-KP4KIUQT.js → chunk-E7LOIIFP.js} +3 -3
  37. package/dist/cli-bundle/chunks/{chunk-SM3RMWGO.js → chunk-EFRHTZO4.js} +8 -8
  38. package/dist/cli-bundle/chunks/{chunk-OTY2YEH5.js → chunk-ENCVPOID.js} +12 -12
  39. package/dist/cli-bundle/chunks/{chunk-2YPVCD7T.js → chunk-EQ6N6IDR.js} +8 -8
  40. package/dist/cli-bundle/chunks/{chunk-BKQMJXWY.js → chunk-F2REA7VW.js} +4 -6
  41. package/dist/cli-bundle/chunks/{chunk-BKQMJXWY.js.map → chunk-F2REA7VW.js.map} +1 -1
  42. package/dist/cli-bundle/chunks/{chunk-SDLEYY6A.js → chunk-FHUI7AXS.js} +6 -8
  43. package/dist/cli-bundle/chunks/{chunk-SDLEYY6A.js.map → chunk-FHUI7AXS.js.map} +1 -1
  44. package/dist/cli-bundle/chunks/{chunk-OVSSE2JP.js → chunk-FJNJEWU4.js} +8 -8
  45. package/dist/cli-bundle/chunks/{chunk-QF4OPBAG.js → chunk-FKH7K6YP.js} +9 -9
  46. package/dist/cli-bundle/chunks/{chunk-KCGMABHM.js → chunk-GPOSGWCN.js} +2 -2
  47. package/dist/cli-bundle/chunks/{chunk-MSH23UWO.js → chunk-H37YPWLM.js} +4 -4
  48. package/dist/cli-bundle/chunks/{chunk-F33AQIB4.js → chunk-I26E6XA7.js} +17 -7
  49. package/dist/cli-bundle/chunks/chunk-I26E6XA7.js.map +1 -0
  50. package/dist/cli-bundle/chunks/{chunk-URJEZOLB.js → chunk-I3UILOUU.js} +2 -2
  51. package/dist/cli-bundle/chunks/{chunk-KS2U7BZ3.js → chunk-I4FGL3K2.js} +4 -4
  52. package/dist/cli-bundle/chunks/{chunk-HP35AVFS.js → chunk-JEGFLKSI.js} +2 -2
  53. package/dist/cli-bundle/chunks/{chunk-AXBUHLW7.js → chunk-JN3BT7UY.js} +9 -9
  54. package/dist/cli-bundle/chunks/{chunk-ALSRBNYB.js → chunk-JVMAOD54.js} +5 -5
  55. package/dist/cli-bundle/chunks/{chunk-4WYBLB6J.js → chunk-KDX6VC3P.js} +3 -3
  56. package/dist/cli-bundle/chunks/{chunk-UEXNNF3K.js → chunk-KTVXLI54.js} +7 -7
  57. package/dist/cli-bundle/chunks/{chunk-2HMD3JM2.js → chunk-LF2VNLEZ.js} +9 -12
  58. package/dist/cli-bundle/chunks/chunk-LF2VNLEZ.js.map +7 -0
  59. package/dist/cli-bundle/chunks/{chunk-XNGMIVQY.js → chunk-LU2HE272.js} +3 -3
  60. package/dist/cli-bundle/chunks/{chunk-3E3MDBTB.js → chunk-LU54Z4QI.js} +5 -5
  61. package/dist/cli-bundle/chunks/{chunk-TBLBEOEX.js → chunk-MNXJ6YDO.js} +9 -9
  62. package/dist/cli-bundle/chunks/{chunk-M7UBTVFT.js → chunk-NHRZSYAA.js} +3 -3
  63. package/dist/cli-bundle/chunks/{chunk-HOA3GMB6.js → chunk-NJRZIJ4N.js} +4 -4
  64. package/dist/cli-bundle/chunks/{chunk-XLSQ3QLT.js → chunk-NUGAWYEN.js} +2 -2
  65. package/dist/cli-bundle/chunks/{chunk-NUKHZZNM.js → chunk-O4L7Z6LB.js} +3 -3
  66. package/dist/cli-bundle/chunks/{chunk-5NVJA7IW.js → chunk-OPYA2HIU.js} +7 -7
  67. package/dist/cli-bundle/chunks/{chunk-7WXGR44E.js → chunk-OT6XAMO5.js} +16 -6
  68. package/dist/cli-bundle/chunks/chunk-OT6XAMO5.js.map +7 -0
  69. package/dist/cli-bundle/chunks/{chunk-NDSMKB2I.js → chunk-P2NVFE4L.js} +3 -3
  70. package/dist/cli-bundle/chunks/{chunk-BFJPMUF5.js → chunk-PUSOAQCR.js} +5 -5
  71. package/dist/cli-bundle/chunks/{chunk-XZS4MV37.js → chunk-PW7C262O.js} +2 -2
  72. package/dist/cli-bundle/chunks/{chunk-J4DKAGTM.js → chunk-RE2JQJZJ.js} +3 -3
  73. package/dist/cli-bundle/chunks/{chunk-YEFOCDIK.js → chunk-RKCJ2JMA.js} +7 -7
  74. package/dist/cli-bundle/chunks/{chunk-QWNUDGFQ.js → chunk-RLVI7KDW.js} +8 -8
  75. package/dist/cli-bundle/chunks/{chunk-KBKJVXUS.js → chunk-RMTI5R76.js} +5 -5
  76. package/dist/cli-bundle/chunks/{chunk-QFVASU44.js → chunk-SAUXUI6U.js} +2 -2
  77. package/dist/cli-bundle/chunks/{chunk-RISLL7XH.js → chunk-SD6H3RLA.js} +4 -4
  78. package/dist/cli-bundle/chunks/{chunk-VXBUXLVD.js → chunk-T7B5VAKD.js} +5 -5
  79. package/dist/cli-bundle/chunks/{chunk-JS47EKLP.js → chunk-T7NWFVOA.js} +7 -7
  80. package/dist/cli-bundle/chunks/{chunk-TXKENAQP.js → chunk-TLD3UYGY.js} +3 -3
  81. package/dist/cli-bundle/chunks/{chunk-2BYKYPWY.js → chunk-U3Z4OCZC.js} +2 -2
  82. package/dist/cli-bundle/chunks/{chunk-FGRJZVXD.js → chunk-VDVVOLR6.js} +3 -3
  83. package/dist/cli-bundle/chunks/{chunk-K62SNVVE.js → chunk-WCWIDJII.js} +2 -2
  84. package/dist/cli-bundle/chunks/{chunk-EPWT7BEA.js → chunk-WQZCEEQN.js} +8 -8
  85. package/dist/cli-bundle/chunks/{chunk-UMMJAJB2.js → chunk-XEOO6K5J.js} +9 -9
  86. package/dist/cli-bundle/chunks/{chunk-R4XIE7NQ.js → chunk-YI6W2DBN.js} +6 -6
  87. package/dist/cli-bundle/chunks/{chunk-N4SQZ7L3.js → chunk-YSANBZAE.js} +2 -2
  88. package/dist/cli-bundle/chunks/{chunk-ETZZU5QF.js → chunk-YX5LAKFJ.js} +2 -2
  89. package/dist/cli-bundle/chunks/{chunk-Z55JACL2.js → chunk-ZPXDD6RQ.js} +6 -6
  90. package/dist/cli-bundle/chunks/{claim-RNEBQCOO.js → claim-RV6WYUF7.js} +10 -10
  91. package/dist/cli-bundle/chunks/{claim-NHBIIBOW.js → claim-UXFGCF3P.js} +10 -10
  92. package/dist/cli-bundle/chunks/close-JTTGW7TS.js +13 -0
  93. package/dist/cli-bundle/chunks/{close-ZMXL2WDS.js → close-O4JK2JKD.js} +8 -8
  94. package/dist/cli-bundle/chunks/{close-many-CDPQGQUB.js → close-many-EQO4TPIE.js} +17 -18
  95. package/dist/cli-bundle/chunks/{close-many-CDPQGQUB.js.map → close-many-EQO4TPIE.js.map} +1 -1
  96. package/dist/cli-bundle/chunks/{close-many-IQV5C2SI.js → close-many-SRDBV3SI.js} +15 -16
  97. package/dist/cli-bundle/chunks/{close-many-IQV5C2SI.js.map → close-many-SRDBV3SI.js.map} +1 -1
  98. package/dist/cli-bundle/chunks/{comments-J5Q4IJPH.js → comments-OMB7YE27.js} +10 -10
  99. package/dist/cli-bundle/chunks/{comments-EFVBHWPT.js → comments-TTZUIB2O.js} +10 -10
  100. package/dist/cli-bundle/chunks/{config-72253M2O.js → config-5VPR42A6.js} +8 -8
  101. package/dist/cli-bundle/chunks/{config-VFYA6BMI.js → config-NNLXVGVC.js} +8 -8
  102. package/dist/cli-bundle/chunks/{context-WMSI2D65.js → context-4N7GYTVQ.js} +16 -18
  103. package/dist/cli-bundle/chunks/{context-WMSI2D65.js.map → context-4N7GYTVQ.js.map} +1 -1
  104. package/dist/cli-bundle/chunks/{context-AVLO4IFH.js → context-4QK6GRXO.js} +14 -16
  105. package/dist/cli-bundle/chunks/{context-AVLO4IFH.js.map → context-4QK6GRXO.js.map} +1 -1
  106. package/dist/cli-bundle/chunks/{contracts-D4BN3VSQ.js → contracts-AOBNEBVT.js} +4 -4
  107. package/dist/cli-bundle/chunks/{contracts-RGPOBLPL.js → contracts-DXCWXOSP.js} +4 -4
  108. package/dist/cli-bundle/chunks/{copy-WXE3OOLZ.js → copy-5NM3SVJA.js} +7 -7
  109. package/dist/cli-bundle/chunks/{copy-H6TXHK7S.js → copy-XSYEQTLA.js} +7 -7
  110. package/dist/cli-bundle/chunks/{create-PUAIJEZ7.js → create-FCCAATQV.js} +13 -13
  111. package/dist/cli-bundle/chunks/create-JAPLFDGJ.js +27 -0
  112. package/dist/cli-bundle/chunks/{delete-WBME6WG5.js → delete-5JFP6OG7.js} +7 -7
  113. package/dist/cli-bundle/chunks/{delete-PKR2JHLH.js → delete-PQXJQXQ7.js} +7 -7
  114. package/dist/cli-bundle/chunks/{deps-KWHQRO75.js → deps-S5322EOQ.js} +7 -7
  115. package/dist/cli-bundle/chunks/{deps-4BQEDV4L.js → deps-XXKBOQUA.js} +7 -7
  116. package/dist/cli-bundle/chunks/{docs-364GT3ZR.js → docs-C7CCVWAJ.js} +9 -9
  117. package/dist/cli-bundle/chunks/{docs-SCNBUGSV.js → docs-DZRPAW5S.js} +9 -9
  118. package/dist/cli-bundle/chunks/{extension-KK2UPXJD.js → extension-CSHP6FZX.js} +5 -5
  119. package/dist/cli-bundle/chunks/{extension-CRE7JM47.js → extension-XNNVUVAY.js} +5 -5
  120. package/dist/cli-bundle/chunks/{files-66EHM5ZR.js → files-OBWYYPKM.js} +9 -9
  121. package/dist/cli-bundle/chunks/{files-3GESQAWL.js → files-UPCNKEIZ.js} +9 -9
  122. package/dist/cli-bundle/chunks/{gc-D5IWOKQH.js → gc-FA2ONELT.js} +3 -3
  123. package/dist/cli-bundle/chunks/{gc-MOQDND5J.js → gc-KXK6KBRN.js} +3 -3
  124. package/dist/cli-bundle/chunks/{get-WXSLXV3K.js → get-FLHYTOBA.js} +11 -11
  125. package/dist/cli-bundle/chunks/{get-7J2ZCBV5.js → get-PNTSONGB.js} +11 -11
  126. package/dist/cli-bundle/chunks/{health-B6AEM7BV.js → health-CS5RNTJX.js} +13 -13
  127. package/dist/cli-bundle/chunks/{health-YMZGOMVX.js → health-KCRVYIYY.js} +13 -13
  128. package/dist/cli-bundle/chunks/history-6624XISO.js +20 -0
  129. package/dist/cli-bundle/chunks/{history-TJTO5GCR.js → history-COQTPBEU.js} +10 -10
  130. package/dist/cli-bundle/chunks/{history-compact-CKNN6UKW.js → history-compact-66PSRYL3.js} +11 -11
  131. package/dist/cli-bundle/chunks/{history-compact-N2Q7IR3T.js → history-compact-PVS2A3FS.js} +11 -11
  132. package/dist/cli-bundle/chunks/{history-redact-JUXUOH54.js → history-redact-DCXAWGTF.js} +11 -11
  133. package/dist/cli-bundle/chunks/history-redact-ZRQTI7NB.js +19 -0
  134. package/dist/cli-bundle/chunks/{history-repair-CCCPBNTF.js → history-repair-SEQDFTGW.js} +11 -11
  135. package/dist/cli-bundle/chunks/{history-repair-TDBBSRVK.js → history-repair-TA3NRIFO.js} +11 -11
  136. package/dist/cli-bundle/chunks/{init-6ZPKD3YN.js → init-IQJE3EKJ.js} +9 -9
  137. package/dist/cli-bundle/chunks/init-ZVE2HMKK.js +17 -0
  138. package/dist/cli-bundle/chunks/{learnings-U7U2FNIO.js → learnings-RJPGH2ME.js} +10 -10
  139. package/dist/cli-bundle/chunks/{learnings-WYNTYQ5T.js → learnings-XC6EMW5E.js} +10 -10
  140. package/dist/cli-bundle/chunks/{list-JGP7ODML.js → list-NJV6WBT4.js} +10 -11
  141. package/dist/cli-bundle/chunks/list-OO5P472O.js +19 -0
  142. package/dist/cli-bundle/chunks/{notes-P25YVTEG.js → notes-2KWHADK3.js} +10 -10
  143. package/dist/cli-bundle/chunks/{notes-QIF6A7XS.js → notes-FNCDMZW2.js} +10 -10
  144. package/dist/cli-bundle/chunks/{plan-SSBJFWXA.js → plan-CYK2P5PD.js} +13 -13
  145. package/dist/cli-bundle/chunks/{plan-RACB5PI6.js → plan-MQO5JTSV.js} +13 -13
  146. package/dist/cli-bundle/chunks/{register-list-query-5IXDPUZ6.js → register-list-query-6RA24SIZ.js} +18 -18
  147. package/dist/cli-bundle/chunks/{register-list-query-GQAEIG4K.js → register-list-query-IO3RR5K6.js} +18 -18
  148. package/dist/cli-bundle/chunks/{register-mutation-YZCUILGO.js → register-mutation-KVFUXCAZ.js} +32 -32
  149. package/dist/cli-bundle/chunks/{register-mutation-FAS4YG63.js → register-mutation-VV2SC2KL.js} +32 -32
  150. package/dist/cli-bundle/chunks/{register-operations-S2BOLUPF.js → register-operations-DFNVRSJ5.js} +30 -30
  151. package/dist/cli-bundle/chunks/{register-operations-IBYWNJN5.js → register-operations-TAUUTRJ4.js} +30 -30
  152. package/dist/cli-bundle/chunks/{register-setup-JRZ4UMWZ.js → register-setup-GAQZZRUA.js} +15 -15
  153. package/dist/cli-bundle/chunks/{register-setup-ABA2JPWO.js → register-setup-X2R5CFDV.js} +15 -15
  154. package/dist/cli-bundle/chunks/{restore-K72ZNPEP.js → restore-E3GZKRRK.js} +11 -11
  155. package/dist/cli-bundle/chunks/restore-F4ALFV4D.js +17 -0
  156. package/dist/cli-bundle/chunks/{schema-UL4B2JX5.js → schema-3CPFLDAY.js} +8 -8
  157. package/dist/cli-bundle/chunks/{schema-3VKRDBLC.js → schema-7EHBPNXM.js} +8 -8
  158. package/dist/cli-bundle/chunks/{search-EQDHSE4G.js → search-2T3NCCUR.js} +12 -13
  159. package/dist/cli-bundle/chunks/{search-EQDHSE4G.js.map → search-2T3NCCUR.js.map} +1 -1
  160. package/dist/cli-bundle/chunks/{search-632WJ7GO.js → search-OBZVYJJ2.js} +10 -11
  161. package/dist/cli-bundle/chunks/{search-632WJ7GO.js.map → search-OBZVYJJ2.js.map} +1 -1
  162. package/dist/cli-bundle/chunks/{stats-O4UTMJMC.js → stats-6LVK4JER.js} +7 -7
  163. package/dist/cli-bundle/chunks/{stats-WLJ3XBF5.js → stats-ULGQACF7.js} +7 -7
  164. package/dist/cli-bundle/chunks/{telemetry-EUVHFSQU.js → telemetry-6G27FLCP.js} +4 -4
  165. package/dist/cli-bundle/chunks/{telemetry-NRVWX25E.js → telemetry-HHKRTMZA.js} +4 -4
  166. package/dist/cli-bundle/chunks/{test-GXUBQNUC.js → test-2PP4YBV6.js} +14 -14
  167. package/dist/cli-bundle/chunks/test-PPOLRIBA.js +32 -0
  168. package/dist/cli-bundle/chunks/{test-all-XM6OKI3L.js → test-all-6Z272JRI.js} +14 -14
  169. package/dist/cli-bundle/chunks/{test-all-UTFXC7S2.js → test-all-NETGVNM6.js} +14 -14
  170. package/dist/cli-bundle/chunks/{test-runs-IK6E2HNX.js → test-runs-CRPQVMMG.js} +5 -5
  171. package/dist/cli-bundle/chunks/{test-runs-7FHCPEA3.js → test-runs-M24WA6TI.js} +5 -5
  172. package/dist/cli-bundle/chunks/update-MCPCPMHV.js +25 -0
  173. package/dist/cli-bundle/chunks/update-O7TBOUVQ.js +21 -0
  174. package/dist/cli-bundle/chunks/{update-many-5KD33MKY.js → update-many-JSRF5EH5.js} +22 -23
  175. package/dist/cli-bundle/chunks/{update-many-5KD33MKY.js.map → update-many-JSRF5EH5.js.map} +1 -1
  176. package/dist/cli-bundle/chunks/{update-many-N3YTM7K4.js → update-many-Y3HOL7WA.js} +24 -25
  177. package/dist/cli-bundle/chunks/{update-many-N3YTM7K4.js.map → update-many-Y3HOL7WA.js.map} +1 -1
  178. package/dist/cli-bundle/chunks/{upgrade-5SRFLUNW.js → upgrade-5RTQVKKE.js} +5 -5
  179. package/dist/cli-bundle/chunks/{upgrade-FFXGO43H.js → upgrade-ECB6GH3M.js} +5 -5
  180. package/dist/cli-bundle/chunks/{validate-T3LPWSZG.js → validate-J6Q444SD.js} +16 -16
  181. package/dist/cli-bundle/chunks/{validate-CRWXZILW.js → validate-MCNMAXVA.js} +16 -16
  182. package/dist/cli-bundle/main.js +43 -36
  183. package/dist/cli-bundle/main.js.map +2 -2
  184. package/dist/core/extensions/extension-types.d.ts +59 -1
  185. package/dist/core/extensions/extension-types.js +2 -2
  186. package/dist/core/extensions/extension-types.js.map +1 -1
  187. package/dist/core/extensions/flag-value-types.d.ts +29 -0
  188. package/dist/core/extensions/flag-value-types.js +78 -0
  189. package/dist/core/extensions/flag-value-types.js.map +1 -0
  190. package/dist/core/extensions/item-field-types.d.ts +22 -0
  191. package/dist/core/extensions/item-field-types.js +43 -0
  192. package/dist/core/extensions/item-field-types.js.map +1 -0
  193. package/dist/core/extensions/item-fields.js +4 -11
  194. package/dist/core/extensions/item-fields.js.map +1 -1
  195. package/dist/core/extensions/loader.d.ts +14 -1
  196. package/dist/core/extensions/loader.js +141 -10
  197. package/dist/core/extensions/loader.js.map +1 -1
  198. package/dist/core/packages/manifest.d.ts +1 -1
  199. package/dist/core/packages/manifest.js +12 -2
  200. package/dist/core/packages/manifest.js.map +1 -1
  201. package/dist/mcp/server.js +57 -31
  202. package/dist/mcp/server.js.map +1 -1
  203. package/dist/sdk/index.d.ts +7 -2
  204. package/dist/sdk/index.js +3 -3
  205. package/dist/sdk/index.js.map +1 -1
  206. package/dist/sdk/testing.d.ts +55 -1
  207. package/dist/sdk/testing.js +92 -2
  208. package/dist/sdk/testing.js.map +1 -1
  209. package/docs/EXTENSIONS.md +7 -3
  210. package/docs/SDK.md +98 -0
  211. package/package.json +1 -1
  212. package/dist/cli-bundle/chunks/activity-A3QKFSSF.js +0 -16
  213. package/dist/cli-bundle/chunks/chunk-2HMD3JM2.js.map +0 -7
  214. package/dist/cli-bundle/chunks/chunk-3TXWDGPU.js.map +0 -7
  215. package/dist/cli-bundle/chunks/chunk-7WXGR44E.js.map +0 -7
  216. package/dist/cli-bundle/chunks/chunk-EAOG77HM.js +0 -56
  217. package/dist/cli-bundle/chunks/chunk-EAOG77HM.js.map +0 -7
  218. package/dist/cli-bundle/chunks/chunk-F33AQIB4.js.map +0 -1
  219. package/dist/cli-bundle/chunks/chunk-ODN53S6H.js.map +0 -1
  220. package/dist/cli-bundle/chunks/chunk-XSLQSXAH.js +0 -53
  221. package/dist/cli-bundle/chunks/chunk-XSLQSXAH.js.map +0 -1
  222. package/dist/cli-bundle/chunks/chunk-YJAKN2N2.js.map +0 -1
  223. package/dist/cli-bundle/chunks/close-UNTFXVM3.js +0 -13
  224. package/dist/cli-bundle/chunks/create-EZWAMUKR.js +0 -27
  225. package/dist/cli-bundle/chunks/history-ZERISU2L.js +0 -20
  226. package/dist/cli-bundle/chunks/history-redact-GODBYT5A.js +0 -19
  227. package/dist/cli-bundle/chunks/init-CBZHXBR3.js +0 -17
  228. package/dist/cli-bundle/chunks/list-7MTPPZHC.js +0 -20
  229. package/dist/cli-bundle/chunks/restore-3JRX27QW.js +0 -17
  230. package/dist/cli-bundle/chunks/test-XN7RJL5Z.js +0 -32
  231. package/dist/cli-bundle/chunks/update-LFBSEW3N.js +0 -21
  232. package/dist/cli-bundle/chunks/update-U4B4OMHZ.js +0 -25
  233. /package/dist/cli-bundle/chunks/{activity-A3QKFSSF.js.map → activity-HF3VJYKH.js.map} +0 -0
  234. /package/dist/cli-bundle/chunks/{activity-Q7XMIZIH.js.map → activity-RUJATACW.js.map} +0 -0
  235. /package/dist/cli-bundle/chunks/{append-3RFOU7P5.js.map → append-CWQZBUWV.js.map} +0 -0
  236. /package/dist/cli-bundle/chunks/{append-OM74OJVT.js.map → append-E7AJ5RTR.js.map} +0 -0
  237. /package/dist/cli-bundle/chunks/{chunk-NLVCMVC7.js.map → chunk-23WNCJBA.js.map} +0 -0
  238. /package/dist/cli-bundle/chunks/{chunk-KVXIQDJG.js.map → chunk-3RHE76G6.js.map} +0 -0
  239. /package/dist/cli-bundle/chunks/{chunk-Z2HXAFFH.js.map → chunk-42IULX44.js.map} +0 -0
  240. /package/dist/cli-bundle/chunks/{chunk-FO2TYSQZ.js.map → chunk-44JP4PYY.js.map} +0 -0
  241. /package/dist/cli-bundle/chunks/{chunk-DV27WDA7.js.map → chunk-4LRVXVJK.js.map} +0 -0
  242. /package/dist/cli-bundle/chunks/{chunk-CBJXWXI5.js.map → chunk-4TJWRPIH.js.map} +0 -0
  243. /package/dist/cli-bundle/chunks/{chunk-XEKZCBCS.js.map → chunk-5ATRWEZO.js.map} +0 -0
  244. /package/dist/cli-bundle/chunks/{chunk-AEMKH5WQ.js.map → chunk-5MMLINZB.js.map} +0 -0
  245. /package/dist/cli-bundle/chunks/{chunk-NGEEXR2R.js.map → chunk-6IGTNFE3.js.map} +0 -0
  246. /package/dist/cli-bundle/chunks/{chunk-4TI3532H.js.map → chunk-7CR4GAYN.js.map} +0 -0
  247. /package/dist/cli-bundle/chunks/{chunk-D7WK2PKB.js.map → chunk-7YTWXGE3.js.map} +0 -0
  248. /package/dist/cli-bundle/chunks/{chunk-QQPZYP73.js.map → chunk-A5342JVL.js.map} +0 -0
  249. /package/dist/cli-bundle/chunks/{chunk-KN4WSESY.js.map → chunk-AM2AXVFS.js.map} +0 -0
  250. /package/dist/cli-bundle/chunks/{chunk-F33VC5EX.js.map → chunk-ANKG2JKL.js.map} +0 -0
  251. /package/dist/cli-bundle/chunks/{chunk-PQDH3S54.js.map → chunk-BACSNVWE.js.map} +0 -0
  252. /package/dist/cli-bundle/chunks/{chunk-L3LYL3ID.js.map → chunk-BIRVSIM2.js.map} +0 -0
  253. /package/dist/cli-bundle/chunks/{chunk-5WO2VKFA.js.map → chunk-CAXUGAAF.js.map} +0 -0
  254. /package/dist/cli-bundle/chunks/{chunk-7NQIY7Z6.js.map → chunk-D5D7VKIC.js.map} +0 -0
  255. /package/dist/cli-bundle/chunks/{chunk-KP4KIUQT.js.map → chunk-E7LOIIFP.js.map} +0 -0
  256. /package/dist/cli-bundle/chunks/{chunk-SM3RMWGO.js.map → chunk-EFRHTZO4.js.map} +0 -0
  257. /package/dist/cli-bundle/chunks/{chunk-OTY2YEH5.js.map → chunk-ENCVPOID.js.map} +0 -0
  258. /package/dist/cli-bundle/chunks/{chunk-2YPVCD7T.js.map → chunk-EQ6N6IDR.js.map} +0 -0
  259. /package/dist/cli-bundle/chunks/{chunk-OVSSE2JP.js.map → chunk-FJNJEWU4.js.map} +0 -0
  260. /package/dist/cli-bundle/chunks/{chunk-QF4OPBAG.js.map → chunk-FKH7K6YP.js.map} +0 -0
  261. /package/dist/cli-bundle/chunks/{chunk-KCGMABHM.js.map → chunk-GPOSGWCN.js.map} +0 -0
  262. /package/dist/cli-bundle/chunks/{chunk-MSH23UWO.js.map → chunk-H37YPWLM.js.map} +0 -0
  263. /package/dist/cli-bundle/chunks/{chunk-URJEZOLB.js.map → chunk-I3UILOUU.js.map} +0 -0
  264. /package/dist/cli-bundle/chunks/{chunk-KS2U7BZ3.js.map → chunk-I4FGL3K2.js.map} +0 -0
  265. /package/dist/cli-bundle/chunks/{chunk-HP35AVFS.js.map → chunk-JEGFLKSI.js.map} +0 -0
  266. /package/dist/cli-bundle/chunks/{chunk-AXBUHLW7.js.map → chunk-JN3BT7UY.js.map} +0 -0
  267. /package/dist/cli-bundle/chunks/{chunk-ALSRBNYB.js.map → chunk-JVMAOD54.js.map} +0 -0
  268. /package/dist/cli-bundle/chunks/{chunk-4WYBLB6J.js.map → chunk-KDX6VC3P.js.map} +0 -0
  269. /package/dist/cli-bundle/chunks/{chunk-UEXNNF3K.js.map → chunk-KTVXLI54.js.map} +0 -0
  270. /package/dist/cli-bundle/chunks/{chunk-XNGMIVQY.js.map → chunk-LU2HE272.js.map} +0 -0
  271. /package/dist/cli-bundle/chunks/{chunk-3E3MDBTB.js.map → chunk-LU54Z4QI.js.map} +0 -0
  272. /package/dist/cli-bundle/chunks/{chunk-TBLBEOEX.js.map → chunk-MNXJ6YDO.js.map} +0 -0
  273. /package/dist/cli-bundle/chunks/{chunk-M7UBTVFT.js.map → chunk-NHRZSYAA.js.map} +0 -0
  274. /package/dist/cli-bundle/chunks/{chunk-HOA3GMB6.js.map → chunk-NJRZIJ4N.js.map} +0 -0
  275. /package/dist/cli-bundle/chunks/{chunk-XLSQ3QLT.js.map → chunk-NUGAWYEN.js.map} +0 -0
  276. /package/dist/cli-bundle/chunks/{chunk-NUKHZZNM.js.map → chunk-O4L7Z6LB.js.map} +0 -0
  277. /package/dist/cli-bundle/chunks/{chunk-5NVJA7IW.js.map → chunk-OPYA2HIU.js.map} +0 -0
  278. /package/dist/cli-bundle/chunks/{chunk-NDSMKB2I.js.map → chunk-P2NVFE4L.js.map} +0 -0
  279. /package/dist/cli-bundle/chunks/{chunk-BFJPMUF5.js.map → chunk-PUSOAQCR.js.map} +0 -0
  280. /package/dist/cli-bundle/chunks/{chunk-XZS4MV37.js.map → chunk-PW7C262O.js.map} +0 -0
  281. /package/dist/cli-bundle/chunks/{chunk-J4DKAGTM.js.map → chunk-RE2JQJZJ.js.map} +0 -0
  282. /package/dist/cli-bundle/chunks/{chunk-YEFOCDIK.js.map → chunk-RKCJ2JMA.js.map} +0 -0
  283. /package/dist/cli-bundle/chunks/{chunk-QWNUDGFQ.js.map → chunk-RLVI7KDW.js.map} +0 -0
  284. /package/dist/cli-bundle/chunks/{chunk-KBKJVXUS.js.map → chunk-RMTI5R76.js.map} +0 -0
  285. /package/dist/cli-bundle/chunks/{chunk-QFVASU44.js.map → chunk-SAUXUI6U.js.map} +0 -0
  286. /package/dist/cli-bundle/chunks/{chunk-RISLL7XH.js.map → chunk-SD6H3RLA.js.map} +0 -0
  287. /package/dist/cli-bundle/chunks/{chunk-VXBUXLVD.js.map → chunk-T7B5VAKD.js.map} +0 -0
  288. /package/dist/cli-bundle/chunks/{chunk-JS47EKLP.js.map → chunk-T7NWFVOA.js.map} +0 -0
  289. /package/dist/cli-bundle/chunks/{chunk-TXKENAQP.js.map → chunk-TLD3UYGY.js.map} +0 -0
  290. /package/dist/cli-bundle/chunks/{chunk-2BYKYPWY.js.map → chunk-U3Z4OCZC.js.map} +0 -0
  291. /package/dist/cli-bundle/chunks/{chunk-FGRJZVXD.js.map → chunk-VDVVOLR6.js.map} +0 -0
  292. /package/dist/cli-bundle/chunks/{chunk-K62SNVVE.js.map → chunk-WCWIDJII.js.map} +0 -0
  293. /package/dist/cli-bundle/chunks/{chunk-EPWT7BEA.js.map → chunk-WQZCEEQN.js.map} +0 -0
  294. /package/dist/cli-bundle/chunks/{chunk-UMMJAJB2.js.map → chunk-XEOO6K5J.js.map} +0 -0
  295. /package/dist/cli-bundle/chunks/{chunk-R4XIE7NQ.js.map → chunk-YI6W2DBN.js.map} +0 -0
  296. /package/dist/cli-bundle/chunks/{chunk-N4SQZ7L3.js.map → chunk-YSANBZAE.js.map} +0 -0
  297. /package/dist/cli-bundle/chunks/{chunk-ETZZU5QF.js.map → chunk-YX5LAKFJ.js.map} +0 -0
  298. /package/dist/cli-bundle/chunks/{chunk-Z55JACL2.js.map → chunk-ZPXDD6RQ.js.map} +0 -0
  299. /package/dist/cli-bundle/chunks/{claim-RNEBQCOO.js.map → claim-RV6WYUF7.js.map} +0 -0
  300. /package/dist/cli-bundle/chunks/{claim-NHBIIBOW.js.map → claim-UXFGCF3P.js.map} +0 -0
  301. /package/dist/cli-bundle/chunks/{close-UNTFXVM3.js.map → close-JTTGW7TS.js.map} +0 -0
  302. /package/dist/cli-bundle/chunks/{close-ZMXL2WDS.js.map → close-O4JK2JKD.js.map} +0 -0
  303. /package/dist/cli-bundle/chunks/{comments-J5Q4IJPH.js.map → comments-OMB7YE27.js.map} +0 -0
  304. /package/dist/cli-bundle/chunks/{comments-EFVBHWPT.js.map → comments-TTZUIB2O.js.map} +0 -0
  305. /package/dist/cli-bundle/chunks/{config-72253M2O.js.map → config-5VPR42A6.js.map} +0 -0
  306. /package/dist/cli-bundle/chunks/{config-VFYA6BMI.js.map → config-NNLXVGVC.js.map} +0 -0
  307. /package/dist/cli-bundle/chunks/{contracts-D4BN3VSQ.js.map → contracts-AOBNEBVT.js.map} +0 -0
  308. /package/dist/cli-bundle/chunks/{contracts-RGPOBLPL.js.map → contracts-DXCWXOSP.js.map} +0 -0
  309. /package/dist/cli-bundle/chunks/{copy-WXE3OOLZ.js.map → copy-5NM3SVJA.js.map} +0 -0
  310. /package/dist/cli-bundle/chunks/{copy-H6TXHK7S.js.map → copy-XSYEQTLA.js.map} +0 -0
  311. /package/dist/cli-bundle/chunks/{create-PUAIJEZ7.js.map → create-FCCAATQV.js.map} +0 -0
  312. /package/dist/cli-bundle/chunks/{create-EZWAMUKR.js.map → create-JAPLFDGJ.js.map} +0 -0
  313. /package/dist/cli-bundle/chunks/{delete-WBME6WG5.js.map → delete-5JFP6OG7.js.map} +0 -0
  314. /package/dist/cli-bundle/chunks/{delete-PKR2JHLH.js.map → delete-PQXJQXQ7.js.map} +0 -0
  315. /package/dist/cli-bundle/chunks/{deps-KWHQRO75.js.map → deps-S5322EOQ.js.map} +0 -0
  316. /package/dist/cli-bundle/chunks/{deps-4BQEDV4L.js.map → deps-XXKBOQUA.js.map} +0 -0
  317. /package/dist/cli-bundle/chunks/{docs-364GT3ZR.js.map → docs-C7CCVWAJ.js.map} +0 -0
  318. /package/dist/cli-bundle/chunks/{docs-SCNBUGSV.js.map → docs-DZRPAW5S.js.map} +0 -0
  319. /package/dist/cli-bundle/chunks/{extension-KK2UPXJD.js.map → extension-CSHP6FZX.js.map} +0 -0
  320. /package/dist/cli-bundle/chunks/{extension-CRE7JM47.js.map → extension-XNNVUVAY.js.map} +0 -0
  321. /package/dist/cli-bundle/chunks/{files-66EHM5ZR.js.map → files-OBWYYPKM.js.map} +0 -0
  322. /package/dist/cli-bundle/chunks/{files-3GESQAWL.js.map → files-UPCNKEIZ.js.map} +0 -0
  323. /package/dist/cli-bundle/chunks/{gc-D5IWOKQH.js.map → gc-FA2ONELT.js.map} +0 -0
  324. /package/dist/cli-bundle/chunks/{gc-MOQDND5J.js.map → gc-KXK6KBRN.js.map} +0 -0
  325. /package/dist/cli-bundle/chunks/{get-WXSLXV3K.js.map → get-FLHYTOBA.js.map} +0 -0
  326. /package/dist/cli-bundle/chunks/{get-7J2ZCBV5.js.map → get-PNTSONGB.js.map} +0 -0
  327. /package/dist/cli-bundle/chunks/{health-B6AEM7BV.js.map → health-CS5RNTJX.js.map} +0 -0
  328. /package/dist/cli-bundle/chunks/{health-YMZGOMVX.js.map → health-KCRVYIYY.js.map} +0 -0
  329. /package/dist/cli-bundle/chunks/{history-ZERISU2L.js.map → history-6624XISO.js.map} +0 -0
  330. /package/dist/cli-bundle/chunks/{history-TJTO5GCR.js.map → history-COQTPBEU.js.map} +0 -0
  331. /package/dist/cli-bundle/chunks/{history-compact-CKNN6UKW.js.map → history-compact-66PSRYL3.js.map} +0 -0
  332. /package/dist/cli-bundle/chunks/{history-compact-N2Q7IR3T.js.map → history-compact-PVS2A3FS.js.map} +0 -0
  333. /package/dist/cli-bundle/chunks/{history-redact-JUXUOH54.js.map → history-redact-DCXAWGTF.js.map} +0 -0
  334. /package/dist/cli-bundle/chunks/{history-redact-GODBYT5A.js.map → history-redact-ZRQTI7NB.js.map} +0 -0
  335. /package/dist/cli-bundle/chunks/{history-repair-CCCPBNTF.js.map → history-repair-SEQDFTGW.js.map} +0 -0
  336. /package/dist/cli-bundle/chunks/{history-repair-TDBBSRVK.js.map → history-repair-TA3NRIFO.js.map} +0 -0
  337. /package/dist/cli-bundle/chunks/{init-6ZPKD3YN.js.map → init-IQJE3EKJ.js.map} +0 -0
  338. /package/dist/cli-bundle/chunks/{init-CBZHXBR3.js.map → init-ZVE2HMKK.js.map} +0 -0
  339. /package/dist/cli-bundle/chunks/{learnings-U7U2FNIO.js.map → learnings-RJPGH2ME.js.map} +0 -0
  340. /package/dist/cli-bundle/chunks/{learnings-WYNTYQ5T.js.map → learnings-XC6EMW5E.js.map} +0 -0
  341. /package/dist/cli-bundle/chunks/{list-JGP7ODML.js.map → list-NJV6WBT4.js.map} +0 -0
  342. /package/dist/cli-bundle/chunks/{list-7MTPPZHC.js.map → list-OO5P472O.js.map} +0 -0
  343. /package/dist/cli-bundle/chunks/{notes-P25YVTEG.js.map → notes-2KWHADK3.js.map} +0 -0
  344. /package/dist/cli-bundle/chunks/{notes-QIF6A7XS.js.map → notes-FNCDMZW2.js.map} +0 -0
  345. /package/dist/cli-bundle/chunks/{plan-SSBJFWXA.js.map → plan-CYK2P5PD.js.map} +0 -0
  346. /package/dist/cli-bundle/chunks/{plan-RACB5PI6.js.map → plan-MQO5JTSV.js.map} +0 -0
  347. /package/dist/cli-bundle/chunks/{register-list-query-5IXDPUZ6.js.map → register-list-query-6RA24SIZ.js.map} +0 -0
  348. /package/dist/cli-bundle/chunks/{register-list-query-GQAEIG4K.js.map → register-list-query-IO3RR5K6.js.map} +0 -0
  349. /package/dist/cli-bundle/chunks/{register-mutation-YZCUILGO.js.map → register-mutation-KVFUXCAZ.js.map} +0 -0
  350. /package/dist/cli-bundle/chunks/{register-mutation-FAS4YG63.js.map → register-mutation-VV2SC2KL.js.map} +0 -0
  351. /package/dist/cli-bundle/chunks/{register-operations-S2BOLUPF.js.map → register-operations-DFNVRSJ5.js.map} +0 -0
  352. /package/dist/cli-bundle/chunks/{register-operations-IBYWNJN5.js.map → register-operations-TAUUTRJ4.js.map} +0 -0
  353. /package/dist/cli-bundle/chunks/{register-setup-JRZ4UMWZ.js.map → register-setup-GAQZZRUA.js.map} +0 -0
  354. /package/dist/cli-bundle/chunks/{register-setup-ABA2JPWO.js.map → register-setup-X2R5CFDV.js.map} +0 -0
  355. /package/dist/cli-bundle/chunks/{restore-K72ZNPEP.js.map → restore-E3GZKRRK.js.map} +0 -0
  356. /package/dist/cli-bundle/chunks/{restore-3JRX27QW.js.map → restore-F4ALFV4D.js.map} +0 -0
  357. /package/dist/cli-bundle/chunks/{schema-UL4B2JX5.js.map → schema-3CPFLDAY.js.map} +0 -0
  358. /package/dist/cli-bundle/chunks/{schema-3VKRDBLC.js.map → schema-7EHBPNXM.js.map} +0 -0
  359. /package/dist/cli-bundle/chunks/{stats-O4UTMJMC.js.map → stats-6LVK4JER.js.map} +0 -0
  360. /package/dist/cli-bundle/chunks/{stats-WLJ3XBF5.js.map → stats-ULGQACF7.js.map} +0 -0
  361. /package/dist/cli-bundle/chunks/{telemetry-EUVHFSQU.js.map → telemetry-6G27FLCP.js.map} +0 -0
  362. /package/dist/cli-bundle/chunks/{telemetry-NRVWX25E.js.map → telemetry-HHKRTMZA.js.map} +0 -0
  363. /package/dist/cli-bundle/chunks/{test-GXUBQNUC.js.map → test-2PP4YBV6.js.map} +0 -0
  364. /package/dist/cli-bundle/chunks/{test-XN7RJL5Z.js.map → test-PPOLRIBA.js.map} +0 -0
  365. /package/dist/cli-bundle/chunks/{test-all-XM6OKI3L.js.map → test-all-6Z272JRI.js.map} +0 -0
  366. /package/dist/cli-bundle/chunks/{test-all-UTFXC7S2.js.map → test-all-NETGVNM6.js.map} +0 -0
  367. /package/dist/cli-bundle/chunks/{test-runs-IK6E2HNX.js.map → test-runs-CRPQVMMG.js.map} +0 -0
  368. /package/dist/cli-bundle/chunks/{test-runs-7FHCPEA3.js.map → test-runs-M24WA6TI.js.map} +0 -0
  369. /package/dist/cli-bundle/chunks/{update-U4B4OMHZ.js.map → update-MCPCPMHV.js.map} +0 -0
  370. /package/dist/cli-bundle/chunks/{update-LFBSEW3N.js.map → update-O7TBOUVQ.js.map} +0 -0
  371. /package/dist/cli-bundle/chunks/{upgrade-5SRFLUNW.js.map → upgrade-5RTQVKKE.js.map} +0 -0
  372. /package/dist/cli-bundle/chunks/{upgrade-FFXGO43H.js.map → upgrade-ECB6GH3M.js.map} +0 -0
  373. /package/dist/cli-bundle/chunks/{validate-T3LPWSZG.js.map → validate-J6Q444SD.js.map} +0 -0
  374. /package/dist/cli-bundle/chunks/{validate-CRWXZILW.js.map → validate-MCNMAXVA.js.map} +0 -0
@@ -295,8 +295,30 @@ export interface FlagDefinition {
295
295
  required?: boolean;
296
296
  enabled?: boolean;
297
297
  visible?: boolean;
298
- type?: FlagValueType;
298
+ /**
299
+ * Canonical flag value type. Prefer this field; it is the one runtime
300
+ * contracts and help output read first.
301
+ */
299
302
  value_type?: FlagValueType;
303
+ /**
304
+ * @deprecated Use `value_type`. Retained for backward compatibility: when
305
+ * both are present `value_type` wins, and `type` resolves only when
306
+ * `value_type` is absent (`value_type ?? type`).
307
+ */
308
+ type?: FlagValueType;
309
+ /**
310
+ * When true, a repeated comma-list flag accumulates values across repeats
311
+ * — parity with core list flags such as `--tags` — instead of the last
312
+ * value winning. Mirrors the core `CliFlagContract.list` field so
313
+ * extension-registered list flags coalesce through the same bootstrap path.
314
+ */
315
+ list?: boolean;
316
+ /**
317
+ * Default value applied when the flag is omitted. Surfaced to runtime
318
+ * contracts and help output. A `list` flag may default to an array of scalars
319
+ * (e.g. `["a", "b"]`); the array is flattened/coerced like any list value.
320
+ */
321
+ default?: string | number | boolean | Array<string | number | boolean>;
300
322
  [key: string]: unknown;
301
323
  }
302
324
  export interface SchemaFieldDefinition {
@@ -594,7 +616,24 @@ export interface ExtensionRegistrationCounts {
594
616
  search_providers: number;
595
617
  vector_store_adapters: number;
596
618
  }
619
+ /**
620
+ * Read-only identity an extension's `activate(api)` receives about itself, so
621
+ * authors can emit self-identifying logs, gate on their own version, and build
622
+ * better error messages without re-reading the on-disk manifest or duplicating
623
+ * metadata in-module. Exposed as `api.extension`.
624
+ */
625
+ export interface ExtensionSelfIdentity {
626
+ readonly name: string;
627
+ readonly layer: ExtensionLayer;
628
+ readonly version: string;
629
+ readonly capabilities: readonly ExtensionCapability[];
630
+ readonly pm_min_version?: string;
631
+ readonly pm_max_version?: string;
632
+ readonly source_package?: string;
633
+ }
597
634
  export interface ExtensionApi {
635
+ /** Read-only identity of the extension this `api` was created for. */
636
+ readonly extension: ExtensionSelfIdentity;
598
637
  registerCommand(command: string, override: CommandOverride): void;
599
638
  registerCommand(definition: CommandDefinition): void;
600
639
  registerParser(command: string, override: ParserOverride): void;
@@ -692,6 +731,25 @@ export interface DiscoverExtensionsOptions {
692
731
  }
693
732
  export interface ActivatableExtension {
694
733
  activate: (api: ExtensionApi) => void | Promise<void>;
734
+ /**
735
+ * Optional teardown lifecycle hook, analogous to VS Code's `deactivate`
736
+ * export. Invoked when the host tears the extension down — on long-running
737
+ * MCP-server reload between requests, or via the `deactivateExtensions`
738
+ * primitive — so an extension can close connections, clear timers, and
739
+ * release buffers it opened during `activate`.
740
+ */
741
+ deactivate?: () => void | Promise<void>;
742
+ }
743
+ export interface ExtensionDeactivationFailure {
744
+ layer: ExtensionLayer;
745
+ name: string;
746
+ error: string;
747
+ }
748
+ export interface ExtensionDeactivationResult {
749
+ /** Count of loaded extensions whose `deactivate` hook ran without throwing. */
750
+ deactivated: number;
751
+ warnings: string[];
752
+ failed: ExtensionDeactivationFailure[];
695
753
  }
696
754
  export interface ServiceOverrideResult {
697
755
  handled: boolean;
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="93175dd3-3dce-5323-91cf-446f2ea6e7d8")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="46e39061-1b71-5927-a798-045c766d91c5")}catch(e){}}();
3
3
  export const KNOWN_EXTENSION_CAPABILITIES = [
4
4
  "commands",
5
5
  "renderers",
@@ -78,4 +78,4 @@ export function createDefaultExtensionGovernancePolicy() {
78
78
  };
79
79
  }
80
80
  //# sourceMappingURL=extension-types.js.map
81
- //# debugId=93175dd3-3dce-5323-91cf-446f2ea6e7d8
81
+ //# debugId=46e39061-1b71-5927-a798-045c766d91c5
@@ -1 +1 @@
1
- {"version":3,"file":"extension-types.js","sources":["core/extensions/extension-types.ts"],"sourceRoot":"/","sourcesContent":["import type {\n ExtensionPolicyOverrideSettings,\n ExtensionPolicySettings,\n ItemDocument,\n ItemFrontMatter,\n ItemStatus,\n PmSettings,\n} from \"../../types/index.js\";\nimport type { GlobalOptions } from \"../shared/command-types.js\";\n\nexport const KNOWN_EXTENSION_CAPABILITIES = [\n \"commands\",\n \"renderers\",\n \"hooks\",\n \"schema\",\n \"importers\",\n \"search\",\n \"parser\",\n \"preflight\",\n \"services\",\n] as const;\nexport type ExtensionCapability = (typeof KNOWN_EXTENSION_CAPABILITIES)[number];\nexport const EXTENSION_CAPABILITY_CONTRACT_VERSION = 2;\nexport const EXTENSION_CAPABILITY_LEGACY_ALIASES: Readonly<Record<string, ExtensionCapability>> = Object.freeze({\n migration: \"schema\",\n validation: \"schema\",\n});\nexport const EXTENSION_CAPABILITY_CONTRACT = Object.freeze({\n version: EXTENSION_CAPABILITY_CONTRACT_VERSION,\n capabilities: [...KNOWN_EXTENSION_CAPABILITIES],\n legacy_aliases: { ...EXTENSION_CAPABILITY_LEGACY_ALIASES },\n});\n\nexport const KNOWN_EXTENSION_POLICY_MODES = [\"off\", \"warn\", \"enforce\"] as const;\nexport type ExtensionPolicyMode = (typeof KNOWN_EXTENSION_POLICY_MODES)[number];\nexport const KNOWN_EXTENSION_TRUST_MODES = [\"off\", \"warn\", \"enforce\"] as const;\nexport type ExtensionTrustMode = (typeof KNOWN_EXTENSION_TRUST_MODES)[number];\nexport const KNOWN_EXTENSION_SANDBOX_PROFILES = [\"none\", \"restricted\", \"strict\"] as const;\nexport type ExtensionSandboxProfile = (typeof KNOWN_EXTENSION_SANDBOX_PROFILES)[number];\n\nexport const KNOWN_EXTENSION_POLICY_SURFACES = [\n \"commands.override\",\n \"commands.handler\",\n \"hooks.beforecommand\",\n \"hooks.aftercommand\",\n \"hooks.onwrite\",\n \"hooks.onread\",\n \"hooks.onindex\",\n \"schema.flags\",\n \"schema.itemfields\",\n \"schema.itemtypes\",\n \"schema.migrations\",\n \"parser.override\",\n \"preflight.override\",\n \"services.override\",\n \"renderers.override\",\n \"importers.importer\",\n \"importers.exporter\",\n \"search.provider\",\n \"search.vectorstore\",\n] as const;\nexport type ExtensionPolicySurface = (typeof KNOWN_EXTENSION_POLICY_SURFACES)[number];\n\nexport const KNOWN_EXTENSION_SERVICE_NAMES = [\n \"output_format\",\n \"error_format\",\n \"help_format\",\n \"lock_acquire\",\n \"lock_release\",\n \"history_append\",\n \"item_store_write\",\n \"item_store_delete\",\n] as const;\nexport type ExtensionServiceName = (typeof KNOWN_EXTENSION_SERVICE_NAMES)[number];\n\nexport interface ExtensionProvenanceMetadata {\n source?: string;\n signature?: string;\n attestation?: string;\n verified?: boolean;\n}\n\nexport interface ExtensionRuntimePermissionDeclaration {\n fs_read?: boolean;\n fs_write?: boolean;\n network?: boolean;\n env_read?: boolean;\n env_write?: boolean;\n process_spawn?: boolean;\n}\n\nexport interface ExtensionActivationMetadata {\n commands?: string[];\n}\n\nexport type ExtensionPolicyOverride = ExtensionPolicyOverrideSettings;\nexport type ExtensionGovernancePolicy = ExtensionPolicySettings;\n\nexport interface ExtensionManifestEngines {\n pm?: string;\n node?: string;\n [engine: string]: string | undefined;\n}\n\nexport function createDefaultExtensionGovernancePolicy(): ExtensionGovernancePolicy {\n return {\n mode: \"off\",\n trust_mode: \"off\",\n require_provenance: false,\n trusted_extensions: [],\n default_sandbox_profile: \"none\",\n allowed_extensions: [],\n blocked_extensions: [],\n allowed_capabilities: [],\n blocked_capabilities: [],\n allowed_surfaces: [],\n blocked_surfaces: [],\n allowed_commands: [],\n blocked_commands: [],\n allowed_actions: [],\n blocked_actions: [],\n allowed_services: [],\n blocked_services: [],\n extension_overrides: [],\n };\n}\n\nexport type ExtensionLayer = \"global\" | \"project\";\nexport type ExtensionStatus = \"ok\" | \"warn\";\n\nexport interface ExtensionManifest {\n name: string;\n version: string;\n entry: string;\n priority: number;\n capabilities: string[];\n manifest_version?: number;\n pm_min_version?: string;\n pm_max_version?: string;\n engines?: ExtensionManifestEngines;\n trusted?: boolean;\n provenance?: ExtensionProvenanceMetadata;\n sandbox_profile?: ExtensionSandboxProfile;\n permissions?: ExtensionRuntimePermissionDeclaration;\n activation?: ExtensionActivationMetadata;\n legacy_capability_aliases?: LegacyExtensionCapabilityAliasMapping[];\n}\n\nexport interface ExtensionDiagnostic {\n layer: ExtensionLayer;\n directory: string;\n manifest_path: string;\n name: string | null;\n version: string | null;\n entry: string | null;\n priority: number | null;\n entry_path: string | null;\n enabled: boolean | null;\n status: ExtensionStatus;\n}\n\nexport interface EffectiveExtension {\n layer: ExtensionLayer;\n directory: string;\n manifest_path: string;\n name: string;\n source_package?: string;\n version: string;\n entry: string;\n priority: number;\n entry_path: string;\n manifest_version?: number;\n pm_min_version?: string;\n pm_max_version?: string;\n engines?: ExtensionManifestEngines;\n trusted?: boolean;\n provenance?: ExtensionProvenanceMetadata;\n sandbox_profile?: ExtensionSandboxProfile;\n permissions?: ExtensionRuntimePermissionDeclaration;\n capabilities?: string[];\n activation?: ExtensionActivationMetadata;\n}\n\nexport interface ExtensionDiscoveryResult {\n disabled_by_flag: boolean;\n roots: {\n global: string;\n project: string;\n };\n configured_enabled: string[];\n configured_disabled: string[];\n discovered: ExtensionDiagnostic[];\n effective: EffectiveExtension[];\n warnings: string[];\n policy: ExtensionGovernancePolicy;\n}\n\nexport interface LoadedExtension extends EffectiveExtension {\n module: unknown;\n}\n\nexport interface FailedExtensionLoad {\n layer: ExtensionLayer;\n name: string;\n entry_path: string;\n error: string;\n}\n\nexport interface ExtensionLoadResult extends ExtensionDiscoveryResult {\n loaded: LoadedExtension[];\n failed: FailedExtensionLoad[];\n}\n\nexport interface BeforeCommandHookContext {\n command: string;\n args: string[];\n options?: Record<string, unknown>;\n global?: GlobalOptions;\n pm_root: string;\n}\n\nexport interface AfterCommandHookContext extends BeforeCommandHookContext {\n ok: boolean;\n error?: string;\n result?: unknown;\n affected?: AfterCommandAffectedItem[];\n}\n\nexport interface AfterCommandAffectedItem {\n id: string;\n op?: string;\n item_type?: string;\n previous_status?: ItemStatus;\n status?: ItemStatus;\n previous?: Partial<ItemFrontMatter>;\n current?: Partial<ItemFrontMatter>;\n changed_fields?: string[];\n}\n\nexport interface OnWriteHookContext {\n path: string;\n scope: \"project\" | \"global\";\n op: string;\n item_id?: string;\n item_type?: string;\n before?: ItemDocument;\n after?: ItemDocument;\n changed_fields?: string[];\n}\n\nexport interface OnReadHookContext {\n path: string;\n scope: \"project\" | \"global\";\n}\n\nexport interface OnIndexHookContext {\n mode: string;\n total_items?: number;\n}\n\nexport type BeforeCommandHook = (context: BeforeCommandHookContext) => Promise<void> | void;\nexport type AfterCommandHook = (context: AfterCommandHookContext) => Promise<void> | void;\nexport type OnWriteHook = (context: OnWriteHookContext) => Promise<void> | void;\nexport type OnReadHook = (context: OnReadHookContext) => Promise<void> | void;\nexport type OnIndexHook = (context: OnIndexHookContext) => Promise<void> | void;\nexport type OutputRendererFormat = \"toon\" | \"json\";\nexport type CommandOverride = (context: CommandOverrideContext) => unknown;\nexport type RendererOverride = (context: RendererOverrideContext) => string | null | undefined;\nexport type CommandHandler = (context: CommandHandlerContext) => unknown;\nexport type ParserOverride = (context: ParserOverrideContext) => ParserOverrideDelta | Promise<ParserOverrideDelta>;\nexport type PreflightOverride = (context: PreflightOverrideContext) => PreflightOverrideDelta | Promise<PreflightOverrideDelta>;\nexport type ServiceOverride = (context: ServiceOverrideContext) => unknown;\n\nexport interface RegisteredExtensionHook<THook> {\n layer: ExtensionLayer;\n name: string;\n run: THook;\n}\n\nexport interface ExtensionHookRegistry {\n beforeCommand: Array<RegisteredExtensionHook<BeforeCommandHook>>;\n afterCommand: Array<RegisteredExtensionHook<AfterCommandHook>>;\n onWrite: Array<RegisteredExtensionHook<OnWriteHook>>;\n onRead: Array<RegisteredExtensionHook<OnReadHook>>;\n onIndex: Array<RegisteredExtensionHook<OnIndexHook>>;\n}\n\nexport interface CommandOverrideContext {\n command: string;\n args: string[];\n options?: Record<string, unknown>;\n global?: GlobalOptions;\n pm_root: string;\n result: unknown;\n}\n\nexport interface RendererOverrideContext {\n format: OutputRendererFormat;\n command?: string;\n args?: string[];\n options?: Record<string, unknown>;\n global?: GlobalOptions;\n pm_root?: string;\n result: unknown;\n}\n\nexport interface CommandHandlerContext {\n command: string;\n args: string[];\n options: Record<string, unknown>;\n global: GlobalOptions;\n pm_root: string;\n}\n\nexport interface ParserOverrideContext extends CommandHandlerContext {}\n\nexport interface ParserOverrideDelta {\n args?: string[];\n options?: Record<string, unknown>;\n global?: GlobalOptions;\n}\n\nexport interface PreflightOverrideContext extends CommandHandlerContext {\n decision: PreflightRuntimeDecision;\n}\n\nexport interface PreflightRuntimeDecision {\n enforce_item_format_gate: boolean;\n run_preflight_item_format_sync: boolean;\n run_extension_migrations: boolean;\n enforce_mandatory_migration_gate: boolean;\n}\n\nexport interface PreflightOverrideDelta extends ParserOverrideDelta {\n enforce_item_format_gate?: boolean;\n run_preflight_item_format_sync?: boolean;\n run_extension_migrations?: boolean;\n enforce_mandatory_migration_gate?: boolean;\n}\n\nexport interface ServiceOverrideContext {\n service: ExtensionServiceName;\n command?: string;\n args?: string[];\n options?: Record<string, unknown>;\n global?: GlobalOptions;\n pm_root?: string;\n payload: unknown;\n}\n\nexport interface ExtensionCommandArgumentDefinition {\n name: string;\n required?: boolean;\n variadic?: boolean;\n description?: string;\n}\n\nexport interface CommandDefinition {\n name: string;\n run?: CommandHandler;\n /**\n * @deprecated Use `run` instead. This alias remains for backward compatibility.\n */\n handler?: CommandHandler;\n action?: string;\n description?: string;\n intent?: string;\n examples?: string[];\n failure_hints?: string[];\n arguments?: ExtensionCommandArgumentDefinition[];\n flags?: FlagDefinition[];\n}\n\n/**\n * Optional command-definition metadata for first-class importer/exporter\n * registration.\n *\n * `registerImporter`/`registerExporter` always create a `<name> import` /\n * `<name> export` command path. By default that path only has a handler. When\n * these options are supplied, the auto-created command also gains a full command\n * definition (description, flags, intent, examples, failure hints, positional\n * arguments) — surfaced in help and runtime contracts exactly like\n * `registerCommand`. The registration `name` and `run` handler are implicit, so\n * they are not part of this options object.\n */\nexport interface ImportExportRegistrationOptions {\n action?: string;\n description?: string;\n intent?: string;\n examples?: string[];\n failure_hints?: string[];\n arguments?: ExtensionCommandArgumentDefinition[];\n flags?: FlagDefinition[];\n}\n\nexport type FlagValueType = \"string\" | \"number\" | \"boolean\";\n\nexport interface FlagDefinition {\n long?: string;\n short?: string;\n value_name?: string;\n description?: string;\n required?: boolean;\n enabled?: boolean;\n visible?: boolean;\n type?: FlagValueType;\n value_type?: FlagValueType;\n [key: string]: unknown;\n}\n\nexport interface SchemaFieldDefinition {\n name: string;\n type: string;\n optional?: boolean;\n [key: string]: unknown;\n}\n\nexport interface SchemaItemTypeCommandOptionPolicyDefinition {\n command: string;\n option: string;\n enabled?: boolean;\n required?: boolean;\n visible?: boolean;\n [key: string]: unknown;\n}\n\nexport interface SchemaItemTypeOptionDefinition {\n key: string;\n values?: string[];\n required?: boolean;\n aliases?: string[];\n [key: string]: unknown;\n}\n\nexport interface SchemaItemTypeDefinition {\n name: string;\n folder?: string;\n aliases?: string[];\n required_create_fields?: string[];\n required_create_repeatables?: string[];\n command_option_policies?: SchemaItemTypeCommandOptionPolicyDefinition[];\n options?: SchemaItemTypeOptionDefinition[];\n [key: string]: unknown;\n}\n\nexport interface SchemaMigrationRunContext {\n id: string;\n command: \"migration\";\n layer: ExtensionLayer;\n extension: string;\n pm_root: string;\n status: string;\n}\n\nexport type SchemaMigrationRunner = (context: SchemaMigrationRunContext) => unknown | Promise<unknown>;\n\nexport interface SchemaMigrationDefinition {\n id?: string;\n description?: string;\n status?: string;\n mandatory?: boolean;\n run?: SchemaMigrationRunner;\n [key: string]: unknown;\n}\n\nexport interface ImportExportContext {\n registration: string;\n action: \"import\" | \"export\";\n command: string;\n args: string[];\n options: Record<string, unknown>;\n global: GlobalOptions;\n pm_root: string;\n}\n\nexport type Importer = (context: ImportExportContext) => unknown | Promise<unknown>;\nexport type Exporter = (context: ImportExportContext) => unknown | Promise<unknown>;\n\nexport type ExtensionSearchMode = \"keyword\" | \"semantic\" | \"hybrid\";\n\nexport interface SearchProviderQueryContext {\n query: string;\n mode: ExtensionSearchMode;\n tokens: string[];\n options: Record<string, unknown>;\n settings: PmSettings;\n documents: ItemDocument[];\n [key: string]: unknown;\n}\n\nexport interface SearchProviderHit {\n id: string;\n score: number;\n matched_fields?: string[];\n [key: string]: unknown;\n}\n\nexport type SearchProviderQueryResult = SearchProviderHit[] | { hits?: SearchProviderHit[] };\n\nexport interface SearchProviderQueryExpansionContext {\n query: string;\n mode: Exclude<ExtensionSearchMode, \"keyword\">;\n settings: PmSettings;\n [key: string]: unknown;\n}\n\nexport type SearchProviderQueryExpansionResult = string[] | { queries?: string[] };\n\nexport interface SearchProviderRerankCandidate {\n id: string;\n text: string;\n score: number;\n}\n\nexport interface SearchProviderRerankHit {\n id: string;\n score: number;\n}\n\nexport type SearchProviderRerankResult = SearchProviderRerankHit[] | { hits?: SearchProviderRerankHit[] };\n\nexport interface SearchProviderRerankContext {\n query: string;\n mode: \"hybrid\";\n model: string;\n top_k: number;\n settings: PmSettings;\n candidates: SearchProviderRerankCandidate[];\n [key: string]: unknown;\n}\n\nexport interface SearchProviderEmbedBatchContext {\n inputs: string[];\n settings: PmSettings;\n model: string;\n [key: string]: unknown;\n}\n\nexport interface SearchProviderEmbedContext {\n input: string;\n settings: PmSettings;\n model: string;\n [key: string]: unknown;\n}\n\nexport interface SearchProviderDefinition {\n name: string;\n query?: (context: SearchProviderQueryContext) => SearchProviderQueryResult | Promise<SearchProviderQueryResult>;\n queryExpansion?: (\n context: SearchProviderQueryExpansionContext,\n ) => SearchProviderQueryExpansionResult | Promise<SearchProviderQueryExpansionResult>;\n query_expansion?: (\n context: SearchProviderQueryExpansionContext,\n ) => SearchProviderQueryExpansionResult | Promise<SearchProviderQueryExpansionResult>;\n rerank?: (context: SearchProviderRerankContext) => SearchProviderRerankResult | Promise<SearchProviderRerankResult>;\n embedBatch?: (context: SearchProviderEmbedBatchContext) => number[][] | Promise<number[][]>;\n embed_batch?: (context: SearchProviderEmbedBatchContext) => number[][] | Promise<number[][]>;\n embed?: (context: SearchProviderEmbedContext) => number[] | Promise<number[]>;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreQueryHit {\n id: string;\n score: number;\n payload?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreQueryContext {\n vector: number[];\n limit: number;\n settings: PmSettings;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreUpsertPoint {\n id: string;\n vector: number[];\n payload?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreUpsertContext {\n points: VectorStoreUpsertPoint[];\n settings: PmSettings;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreDeleteContext {\n ids: string[];\n settings: PmSettings;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreAdapterDefinition {\n name: string;\n query?: (context: VectorStoreQueryContext) => VectorStoreQueryHit[] | Promise<VectorStoreQueryHit[]>;\n upsert?: (context: VectorStoreUpsertContext) => unknown | Promise<unknown>;\n delete?: (context: VectorStoreDeleteContext) => unknown | Promise<unknown>;\n [key: string]: unknown;\n}\n\nexport interface RegisteredExtensionCommandOverride {\n layer: ExtensionLayer;\n name: string;\n command: string;\n run: CommandOverride;\n}\n\nexport interface RegisteredExtensionCommandHandler {\n layer: ExtensionLayer;\n name: string;\n command: string;\n run: CommandHandler;\n}\n\nexport interface RegisteredExtensionParserOverride {\n layer: ExtensionLayer;\n name: string;\n command: string;\n run: ParserOverride;\n}\n\nexport interface RegisteredExtensionPreflightOverride {\n layer: ExtensionLayer;\n name: string;\n run: PreflightOverride;\n}\n\nexport interface RegisteredExtensionServiceOverride {\n layer: ExtensionLayer;\n name: string;\n service: ExtensionServiceName;\n run: ServiceOverride;\n}\n\nexport interface RegisteredExtensionRendererOverride {\n layer: ExtensionLayer;\n name: string;\n format: OutputRendererFormat;\n run: RendererOverride;\n}\n\nexport interface ExtensionCommandRegistry {\n overrides: RegisteredExtensionCommandOverride[];\n handlers: RegisteredExtensionCommandHandler[];\n}\n\nexport interface ExtensionParserRegistry {\n overrides: RegisteredExtensionParserOverride[];\n}\n\nexport interface ExtensionPreflightRegistry {\n overrides: RegisteredExtensionPreflightOverride[];\n}\n\nexport interface ExtensionServiceRegistry {\n overrides: RegisteredExtensionServiceOverride[];\n}\n\nexport interface ExtensionRendererRegistry {\n overrides: RegisteredExtensionRendererOverride[];\n}\n\nexport interface RegisteredExtensionFlagDefinitions {\n layer: ExtensionLayer;\n name: string;\n target_command: string;\n flags: FlagDefinition[];\n}\n\nexport interface RegisteredExtensionCommandDefinition {\n layer: ExtensionLayer;\n name: string;\n source_package?: string;\n command: string;\n action: string;\n description?: string;\n intent?: string;\n examples: string[];\n failure_hints: string[];\n arguments: ExtensionCommandArgumentDefinition[];\n}\n\nexport interface RegisteredExtensionSchemaFieldDefinitions {\n layer: ExtensionLayer;\n name: string;\n fields: SchemaFieldDefinition[];\n}\n\nexport interface RegisteredExtensionSchemaItemTypeDefinitions {\n layer: ExtensionLayer;\n name: string;\n types: SchemaItemTypeDefinition[];\n}\n\nexport interface RegisteredExtensionSchemaMigrationDefinition {\n layer: ExtensionLayer;\n name: string;\n definition: SchemaMigrationDefinition;\n runtime_definition: SchemaMigrationDefinition;\n}\n\nexport interface RegisteredExtensionImporter {\n layer: ExtensionLayer;\n name: string;\n importer: string;\n}\n\nexport interface RegisteredExtensionExporter {\n layer: ExtensionLayer;\n name: string;\n exporter: string;\n}\n\nexport interface RegisteredExtensionSearchProvider {\n layer: ExtensionLayer;\n name: string;\n definition: SearchProviderDefinition;\n runtime_definition: SearchProviderDefinition;\n}\n\nexport interface RegisteredExtensionVectorStoreAdapter {\n layer: ExtensionLayer;\n name: string;\n definition: VectorStoreAdapterDefinition;\n runtime_definition: VectorStoreAdapterDefinition;\n}\n\nexport interface ExtensionRegistrationRegistry {\n commands: RegisteredExtensionCommandDefinition[];\n flags: RegisteredExtensionFlagDefinitions[];\n item_fields: RegisteredExtensionSchemaFieldDefinitions[];\n item_types: RegisteredExtensionSchemaItemTypeDefinitions[];\n migrations: RegisteredExtensionSchemaMigrationDefinition[];\n importers: RegisteredExtensionImporter[];\n exporters: RegisteredExtensionExporter[];\n search_providers: RegisteredExtensionSearchProvider[];\n vector_store_adapters: RegisteredExtensionVectorStoreAdapter[];\n}\n\nexport interface ExtensionRegistrationCounts {\n commands: number;\n flags: number;\n item_fields: number;\n item_types: number;\n migrations: number;\n importers: number;\n exporters: number;\n search_providers: number;\n vector_store_adapters: number;\n}\n\nexport interface ExtensionApi {\n registerCommand(command: string, override: CommandOverride): void;\n registerCommand(definition: CommandDefinition): void;\n registerParser(command: string, override: ParserOverride): void;\n registerPreflight(override: PreflightOverride): void;\n registerService(service: ExtensionServiceName, override: ServiceOverride): void;\n registerFlags(targetCommand: string, flags: FlagDefinition[]): void;\n registerItemFields(fields: SchemaFieldDefinition[]): void;\n registerItemTypes(types: SchemaItemTypeDefinition[]): void;\n registerMigration(definition: SchemaMigrationDefinition): void;\n registerRenderer(format: OutputRendererFormat, renderer: RendererOverride): void;\n registerImporter(name: string, importer: Importer, options?: ImportExportRegistrationOptions): void;\n registerExporter(name: string, exporter: Exporter, options?: ImportExportRegistrationOptions): void;\n registerSearchProvider(provider: SearchProviderDefinition): void;\n registerVectorStoreAdapter(adapter: VectorStoreAdapterDefinition): void;\n hooks: {\n beforeCommand(hook: BeforeCommandHook): void;\n afterCommand(hook: AfterCommandHook): void;\n onWrite(hook: OnWriteHook): void;\n onRead(hook: OnReadHook): void;\n onIndex(hook: OnIndexHook): void;\n };\n}\n\nexport interface FailedExtensionActivation {\n layer: ExtensionLayer;\n name: string;\n entry_path: string;\n error: string;\n trace?: ExtensionActivationFailureTrace;\n}\n\nexport interface ExtensionActivationFailureTrace {\n method: string;\n /** `-1` means the failure happened before a numbered registration was accepted. */\n registration_index: number;\n command?: string;\n capability?: ExtensionCapability;\n missing_capability?: ExtensionCapability;\n expected_schema: string;\n received?: unknown;\n hint?: string;\n}\n\nexport interface ExtensionActivationResult {\n hooks: ExtensionHookRegistry;\n commands: ExtensionCommandRegistry;\n parsers: ExtensionParserRegistry;\n preflight: ExtensionPreflightRegistry;\n services: ExtensionServiceRegistry;\n renderers: ExtensionRendererRegistry;\n registrations: ExtensionRegistrationRegistry;\n failed: FailedExtensionActivation[];\n warnings: string[];\n hook_counts: {\n before_command: number;\n after_command: number;\n on_write: number;\n on_read: number;\n on_index: number;\n };\n command_override_count: number;\n command_handler_count: number;\n parser_override_count: number;\n preflight_override_count: number;\n service_override_count: number;\n renderer_override_count: number;\n registration_counts: ExtensionRegistrationCounts;\n}\n\nexport interface ExtensionCandidate {\n layer: ExtensionLayer;\n directory: string;\n manifest_path: string;\n entry_path: string;\n manifest: ExtensionManifest;\n source_package?: string;\n}\n\nexport interface ExtensionLayerScanResult {\n diagnostics: ExtensionDiagnostic[];\n warnings: string[];\n candidates: ExtensionCandidate[];\n}\n\nexport interface ScannedExtensionDirectory {\n diagnostic: ExtensionDiagnostic;\n warnings: string[];\n candidate: ExtensionCandidate | null;\n}\n\nexport interface LegacyExtensionCapabilityAliasMapping {\n alias: string;\n target: ExtensionCapability;\n}\n\nexport interface DiscoverExtensionsOptions {\n pmRoot: string;\n settings: PmSettings;\n cwd?: string;\n noExtensions?: boolean;\n reload_token?: string;\n cache_bust?: boolean;\n}\n\nexport interface ActivatableExtension {\n activate: (api: ExtensionApi) => void | Promise<void>;\n}\n\nexport interface ServiceOverrideResult {\n handled: boolean;\n result: unknown;\n warnings: string[];\n}\n\nexport interface CommandOverrideResult {\n overridden: boolean;\n result: unknown;\n warnings: string[];\n}\n\nexport interface CommandHandlerResult {\n handled: boolean;\n result: unknown;\n warnings: string[];\n /**\n * Human-readable, single-line, length-bounded message describing why an\n * extension command handler failed. Surfaced to the user/CI so the real cause\n * (e.g. \"Changelog is out of date: CHANGELOG.md\") is visible instead of only\n * the opaque `extension_command_handler_failed` warning code.\n */\n errorMessage?: string;\n}\n\nexport interface ParserOverrideResult {\n overridden: boolean;\n context: CommandHandlerContext;\n warnings: string[];\n}\n\nexport interface PreflightOverrideResult {\n overridden: boolean;\n context: CommandHandlerContext;\n decision: PreflightRuntimeDecision;\n warnings: string[];\n}\n\nexport interface RendererOverrideResult {\n overridden: boolean;\n rendered: string | null;\n warnings: string[];\n}\n\nexport interface UnknownExtensionCapabilityWarningDetails {\n layer: ExtensionLayer;\n name: string;\n capability: string;\n allowed_capabilities: string[];\n capability_contract_version: number;\n suggested_capability?: string;\n suggestion_source?: \"legacy_alias\" | \"nearest_match\";\n legacy_alias_target?: string;\n}\n"],"names":[],"mappings":";;AAUA,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,UAAU;IACV,WAAW;IACX,OAAO;IACP,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,UAAU;CACF,CAAC;AAEX,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,mCAAmC,GAAkD,MAAM,CAAC,MAAM,CAAC;IAC9G,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,QAAQ;CACrB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC,MAAM,CAAC;IACzD,OAAO,EAAE,qCAAqC;IAC9C,YAAY,EAAE,CAAC,GAAG,4BAA4B,CAAC;IAC/C,cAAc,EAAE,EAAE,GAAG,mCAAmC,EAAE;CAC3D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAEhF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAE/E,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAU,CAAC;AAG1F,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,mBAAmB;IACnB,kBAAkB;IAClB,qBAAqB;IACrB,oBAAoB;IACpB,eAAe;IACf,cAAc;IACd,eAAe;IACf,cAAc;IACd,mBAAmB;IACnB,kBAAkB;IAClB,mBAAmB;IACnB,iBAAiB;IACjB,oBAAoB;IACpB,mBAAmB;IACnB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,iBAAiB;IACjB,oBAAoB;CACZ,CAAC;AAGX,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,eAAe;IACf,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,mBAAmB;CACX,CAAC;AAgCX,MAAM,UAAU,sCAAsC;IACpD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,KAAK;QACjB,kBAAkB,EAAE,KAAK;QACzB,kBAAkB,EAAE,EAAE;QACtB,uBAAuB,EAAE,MAAM;QAC/B,kBAAkB,EAAE,EAAE;QACtB,kBAAkB,EAAE,EAAE;QACtB,oBAAoB,EAAE,EAAE;QACxB,oBAAoB,EAAE,EAAE;QACxB,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,EAAE;QACpB,eAAe,EAAE,EAAE;QACnB,eAAe,EAAE,EAAE;QACnB,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,EAAE;QACpB,mBAAmB,EAAE,EAAE;KACxB,CAAC;AACJ,CAAC","debugId":"93175dd3-3dce-5323-91cf-446f2ea6e7d8"}
1
+ {"version":3,"file":"extension-types.js","sources":["core/extensions/extension-types.ts"],"sourceRoot":"/","sourcesContent":["import type {\n ExtensionPolicyOverrideSettings,\n ExtensionPolicySettings,\n ItemDocument,\n ItemFrontMatter,\n ItemStatus,\n PmSettings,\n} from \"../../types/index.js\";\nimport type { GlobalOptions } from \"../shared/command-types.js\";\n\nexport const KNOWN_EXTENSION_CAPABILITIES = [\n \"commands\",\n \"renderers\",\n \"hooks\",\n \"schema\",\n \"importers\",\n \"search\",\n \"parser\",\n \"preflight\",\n \"services\",\n] as const;\nexport type ExtensionCapability = (typeof KNOWN_EXTENSION_CAPABILITIES)[number];\nexport const EXTENSION_CAPABILITY_CONTRACT_VERSION = 2;\nexport const EXTENSION_CAPABILITY_LEGACY_ALIASES: Readonly<Record<string, ExtensionCapability>> = Object.freeze({\n migration: \"schema\",\n validation: \"schema\",\n});\nexport const EXTENSION_CAPABILITY_CONTRACT = Object.freeze({\n version: EXTENSION_CAPABILITY_CONTRACT_VERSION,\n capabilities: [...KNOWN_EXTENSION_CAPABILITIES],\n legacy_aliases: { ...EXTENSION_CAPABILITY_LEGACY_ALIASES },\n});\n\nexport const KNOWN_EXTENSION_POLICY_MODES = [\"off\", \"warn\", \"enforce\"] as const;\nexport type ExtensionPolicyMode = (typeof KNOWN_EXTENSION_POLICY_MODES)[number];\nexport const KNOWN_EXTENSION_TRUST_MODES = [\"off\", \"warn\", \"enforce\"] as const;\nexport type ExtensionTrustMode = (typeof KNOWN_EXTENSION_TRUST_MODES)[number];\nexport const KNOWN_EXTENSION_SANDBOX_PROFILES = [\"none\", \"restricted\", \"strict\"] as const;\nexport type ExtensionSandboxProfile = (typeof KNOWN_EXTENSION_SANDBOX_PROFILES)[number];\n\nexport const KNOWN_EXTENSION_POLICY_SURFACES = [\n \"commands.override\",\n \"commands.handler\",\n \"hooks.beforecommand\",\n \"hooks.aftercommand\",\n \"hooks.onwrite\",\n \"hooks.onread\",\n \"hooks.onindex\",\n \"schema.flags\",\n \"schema.itemfields\",\n \"schema.itemtypes\",\n \"schema.migrations\",\n \"parser.override\",\n \"preflight.override\",\n \"services.override\",\n \"renderers.override\",\n \"importers.importer\",\n \"importers.exporter\",\n \"search.provider\",\n \"search.vectorstore\",\n] as const;\nexport type ExtensionPolicySurface = (typeof KNOWN_EXTENSION_POLICY_SURFACES)[number];\n\nexport const KNOWN_EXTENSION_SERVICE_NAMES = [\n \"output_format\",\n \"error_format\",\n \"help_format\",\n \"lock_acquire\",\n \"lock_release\",\n \"history_append\",\n \"item_store_write\",\n \"item_store_delete\",\n] as const;\nexport type ExtensionServiceName = (typeof KNOWN_EXTENSION_SERVICE_NAMES)[number];\n\nexport interface ExtensionProvenanceMetadata {\n source?: string;\n signature?: string;\n attestation?: string;\n verified?: boolean;\n}\n\nexport interface ExtensionRuntimePermissionDeclaration {\n fs_read?: boolean;\n fs_write?: boolean;\n network?: boolean;\n env_read?: boolean;\n env_write?: boolean;\n process_spawn?: boolean;\n}\n\nexport interface ExtensionActivationMetadata {\n commands?: string[];\n}\n\nexport type ExtensionPolicyOverride = ExtensionPolicyOverrideSettings;\nexport type ExtensionGovernancePolicy = ExtensionPolicySettings;\n\nexport interface ExtensionManifestEngines {\n pm?: string;\n node?: string;\n [engine: string]: string | undefined;\n}\n\nexport function createDefaultExtensionGovernancePolicy(): ExtensionGovernancePolicy {\n return {\n mode: \"off\",\n trust_mode: \"off\",\n require_provenance: false,\n trusted_extensions: [],\n default_sandbox_profile: \"none\",\n allowed_extensions: [],\n blocked_extensions: [],\n allowed_capabilities: [],\n blocked_capabilities: [],\n allowed_surfaces: [],\n blocked_surfaces: [],\n allowed_commands: [],\n blocked_commands: [],\n allowed_actions: [],\n blocked_actions: [],\n allowed_services: [],\n blocked_services: [],\n extension_overrides: [],\n };\n}\n\nexport type ExtensionLayer = \"global\" | \"project\";\nexport type ExtensionStatus = \"ok\" | \"warn\";\n\nexport interface ExtensionManifest {\n name: string;\n version: string;\n entry: string;\n priority: number;\n capabilities: string[];\n manifest_version?: number;\n pm_min_version?: string;\n pm_max_version?: string;\n engines?: ExtensionManifestEngines;\n trusted?: boolean;\n provenance?: ExtensionProvenanceMetadata;\n sandbox_profile?: ExtensionSandboxProfile;\n permissions?: ExtensionRuntimePermissionDeclaration;\n activation?: ExtensionActivationMetadata;\n legacy_capability_aliases?: LegacyExtensionCapabilityAliasMapping[];\n}\n\nexport interface ExtensionDiagnostic {\n layer: ExtensionLayer;\n directory: string;\n manifest_path: string;\n name: string | null;\n version: string | null;\n entry: string | null;\n priority: number | null;\n entry_path: string | null;\n enabled: boolean | null;\n status: ExtensionStatus;\n}\n\nexport interface EffectiveExtension {\n layer: ExtensionLayer;\n directory: string;\n manifest_path: string;\n name: string;\n source_package?: string;\n version: string;\n entry: string;\n priority: number;\n entry_path: string;\n manifest_version?: number;\n pm_min_version?: string;\n pm_max_version?: string;\n engines?: ExtensionManifestEngines;\n trusted?: boolean;\n provenance?: ExtensionProvenanceMetadata;\n sandbox_profile?: ExtensionSandboxProfile;\n permissions?: ExtensionRuntimePermissionDeclaration;\n capabilities?: string[];\n activation?: ExtensionActivationMetadata;\n}\n\nexport interface ExtensionDiscoveryResult {\n disabled_by_flag: boolean;\n roots: {\n global: string;\n project: string;\n };\n configured_enabled: string[];\n configured_disabled: string[];\n discovered: ExtensionDiagnostic[];\n effective: EffectiveExtension[];\n warnings: string[];\n policy: ExtensionGovernancePolicy;\n}\n\nexport interface LoadedExtension extends EffectiveExtension {\n module: unknown;\n}\n\nexport interface FailedExtensionLoad {\n layer: ExtensionLayer;\n name: string;\n entry_path: string;\n error: string;\n}\n\nexport interface ExtensionLoadResult extends ExtensionDiscoveryResult {\n loaded: LoadedExtension[];\n failed: FailedExtensionLoad[];\n}\n\nexport interface BeforeCommandHookContext {\n command: string;\n args: string[];\n options?: Record<string, unknown>;\n global?: GlobalOptions;\n pm_root: string;\n}\n\nexport interface AfterCommandHookContext extends BeforeCommandHookContext {\n ok: boolean;\n error?: string;\n result?: unknown;\n affected?: AfterCommandAffectedItem[];\n}\n\nexport interface AfterCommandAffectedItem {\n id: string;\n op?: string;\n item_type?: string;\n previous_status?: ItemStatus;\n status?: ItemStatus;\n previous?: Partial<ItemFrontMatter>;\n current?: Partial<ItemFrontMatter>;\n changed_fields?: string[];\n}\n\nexport interface OnWriteHookContext {\n path: string;\n scope: \"project\" | \"global\";\n op: string;\n item_id?: string;\n item_type?: string;\n before?: ItemDocument;\n after?: ItemDocument;\n changed_fields?: string[];\n}\n\nexport interface OnReadHookContext {\n path: string;\n scope: \"project\" | \"global\";\n}\n\nexport interface OnIndexHookContext {\n mode: string;\n total_items?: number;\n}\n\nexport type BeforeCommandHook = (context: BeforeCommandHookContext) => Promise<void> | void;\nexport type AfterCommandHook = (context: AfterCommandHookContext) => Promise<void> | void;\nexport type OnWriteHook = (context: OnWriteHookContext) => Promise<void> | void;\nexport type OnReadHook = (context: OnReadHookContext) => Promise<void> | void;\nexport type OnIndexHook = (context: OnIndexHookContext) => Promise<void> | void;\nexport type OutputRendererFormat = \"toon\" | \"json\";\nexport type CommandOverride = (context: CommandOverrideContext) => unknown;\nexport type RendererOverride = (context: RendererOverrideContext) => string | null | undefined;\nexport type CommandHandler = (context: CommandHandlerContext) => unknown;\nexport type ParserOverride = (context: ParserOverrideContext) => ParserOverrideDelta | Promise<ParserOverrideDelta>;\nexport type PreflightOverride = (context: PreflightOverrideContext) => PreflightOverrideDelta | Promise<PreflightOverrideDelta>;\nexport type ServiceOverride = (context: ServiceOverrideContext) => unknown;\n\nexport interface RegisteredExtensionHook<THook> {\n layer: ExtensionLayer;\n name: string;\n run: THook;\n}\n\nexport interface ExtensionHookRegistry {\n beforeCommand: Array<RegisteredExtensionHook<BeforeCommandHook>>;\n afterCommand: Array<RegisteredExtensionHook<AfterCommandHook>>;\n onWrite: Array<RegisteredExtensionHook<OnWriteHook>>;\n onRead: Array<RegisteredExtensionHook<OnReadHook>>;\n onIndex: Array<RegisteredExtensionHook<OnIndexHook>>;\n}\n\nexport interface CommandOverrideContext {\n command: string;\n args: string[];\n options?: Record<string, unknown>;\n global?: GlobalOptions;\n pm_root: string;\n result: unknown;\n}\n\nexport interface RendererOverrideContext {\n format: OutputRendererFormat;\n command?: string;\n args?: string[];\n options?: Record<string, unknown>;\n global?: GlobalOptions;\n pm_root?: string;\n result: unknown;\n}\n\nexport interface CommandHandlerContext {\n command: string;\n args: string[];\n options: Record<string, unknown>;\n global: GlobalOptions;\n pm_root: string;\n}\n\nexport interface ParserOverrideContext extends CommandHandlerContext {}\n\nexport interface ParserOverrideDelta {\n args?: string[];\n options?: Record<string, unknown>;\n global?: GlobalOptions;\n}\n\nexport interface PreflightOverrideContext extends CommandHandlerContext {\n decision: PreflightRuntimeDecision;\n}\n\nexport interface PreflightRuntimeDecision {\n enforce_item_format_gate: boolean;\n run_preflight_item_format_sync: boolean;\n run_extension_migrations: boolean;\n enforce_mandatory_migration_gate: boolean;\n}\n\nexport interface PreflightOverrideDelta extends ParserOverrideDelta {\n enforce_item_format_gate?: boolean;\n run_preflight_item_format_sync?: boolean;\n run_extension_migrations?: boolean;\n enforce_mandatory_migration_gate?: boolean;\n}\n\nexport interface ServiceOverrideContext {\n service: ExtensionServiceName;\n command?: string;\n args?: string[];\n options?: Record<string, unknown>;\n global?: GlobalOptions;\n pm_root?: string;\n payload: unknown;\n}\n\nexport interface ExtensionCommandArgumentDefinition {\n name: string;\n required?: boolean;\n variadic?: boolean;\n description?: string;\n}\n\nexport interface CommandDefinition {\n name: string;\n run?: CommandHandler;\n /**\n * @deprecated Use `run` instead. This alias remains for backward compatibility.\n */\n handler?: CommandHandler;\n action?: string;\n description?: string;\n intent?: string;\n examples?: string[];\n failure_hints?: string[];\n arguments?: ExtensionCommandArgumentDefinition[];\n flags?: FlagDefinition[];\n}\n\n/**\n * Optional command-definition metadata for first-class importer/exporter\n * registration.\n *\n * `registerImporter`/`registerExporter` always create a `<name> import` /\n * `<name> export` command path. By default that path only has a handler. When\n * these options are supplied, the auto-created command also gains a full command\n * definition (description, flags, intent, examples, failure hints, positional\n * arguments) — surfaced in help and runtime contracts exactly like\n * `registerCommand`. The registration `name` and `run` handler are implicit, so\n * they are not part of this options object.\n */\nexport interface ImportExportRegistrationOptions {\n action?: string;\n description?: string;\n intent?: string;\n examples?: string[];\n failure_hints?: string[];\n arguments?: ExtensionCommandArgumentDefinition[];\n flags?: FlagDefinition[];\n}\n\nexport type FlagValueType = \"string\" | \"number\" | \"boolean\";\n\nexport interface FlagDefinition {\n long?: string;\n short?: string;\n value_name?: string;\n description?: string;\n required?: boolean;\n enabled?: boolean;\n visible?: boolean;\n /**\n * Canonical flag value type. Prefer this field; it is the one runtime\n * contracts and help output read first.\n */\n value_type?: FlagValueType;\n /**\n * @deprecated Use `value_type`. Retained for backward compatibility: when\n * both are present `value_type` wins, and `type` resolves only when\n * `value_type` is absent (`value_type ?? type`).\n */\n type?: FlagValueType;\n /**\n * When true, a repeated comma-list flag accumulates values across repeats\n * — parity with core list flags such as `--tags` — instead of the last\n * value winning. Mirrors the core `CliFlagContract.list` field so\n * extension-registered list flags coalesce through the same bootstrap path.\n */\n list?: boolean;\n /**\n * Default value applied when the flag is omitted. Surfaced to runtime\n * contracts and help output. A `list` flag may default to an array of scalars\n * (e.g. `[\"a\", \"b\"]`); the array is flattened/coerced like any list value.\n */\n default?: string | number | boolean | Array<string | number | boolean>;\n [key: string]: unknown;\n}\n\nexport interface SchemaFieldDefinition {\n name: string;\n type: string;\n optional?: boolean;\n [key: string]: unknown;\n}\n\nexport interface SchemaItemTypeCommandOptionPolicyDefinition {\n command: string;\n option: string;\n enabled?: boolean;\n required?: boolean;\n visible?: boolean;\n [key: string]: unknown;\n}\n\nexport interface SchemaItemTypeOptionDefinition {\n key: string;\n values?: string[];\n required?: boolean;\n aliases?: string[];\n [key: string]: unknown;\n}\n\nexport interface SchemaItemTypeDefinition {\n name: string;\n folder?: string;\n aliases?: string[];\n required_create_fields?: string[];\n required_create_repeatables?: string[];\n command_option_policies?: SchemaItemTypeCommandOptionPolicyDefinition[];\n options?: SchemaItemTypeOptionDefinition[];\n [key: string]: unknown;\n}\n\nexport interface SchemaMigrationRunContext {\n id: string;\n command: \"migration\";\n layer: ExtensionLayer;\n extension: string;\n pm_root: string;\n status: string;\n}\n\nexport type SchemaMigrationRunner = (context: SchemaMigrationRunContext) => unknown | Promise<unknown>;\n\nexport interface SchemaMigrationDefinition {\n id?: string;\n description?: string;\n status?: string;\n mandatory?: boolean;\n run?: SchemaMigrationRunner;\n [key: string]: unknown;\n}\n\nexport interface ImportExportContext {\n registration: string;\n action: \"import\" | \"export\";\n command: string;\n args: string[];\n options: Record<string, unknown>;\n global: GlobalOptions;\n pm_root: string;\n}\n\nexport type Importer = (context: ImportExportContext) => unknown | Promise<unknown>;\nexport type Exporter = (context: ImportExportContext) => unknown | Promise<unknown>;\n\nexport type ExtensionSearchMode = \"keyword\" | \"semantic\" | \"hybrid\";\n\nexport interface SearchProviderQueryContext {\n query: string;\n mode: ExtensionSearchMode;\n tokens: string[];\n options: Record<string, unknown>;\n settings: PmSettings;\n documents: ItemDocument[];\n [key: string]: unknown;\n}\n\nexport interface SearchProviderHit {\n id: string;\n score: number;\n matched_fields?: string[];\n [key: string]: unknown;\n}\n\nexport type SearchProviderQueryResult = SearchProviderHit[] | { hits?: SearchProviderHit[] };\n\nexport interface SearchProviderQueryExpansionContext {\n query: string;\n mode: Exclude<ExtensionSearchMode, \"keyword\">;\n settings: PmSettings;\n [key: string]: unknown;\n}\n\nexport type SearchProviderQueryExpansionResult = string[] | { queries?: string[] };\n\nexport interface SearchProviderRerankCandidate {\n id: string;\n text: string;\n score: number;\n}\n\nexport interface SearchProviderRerankHit {\n id: string;\n score: number;\n}\n\nexport type SearchProviderRerankResult = SearchProviderRerankHit[] | { hits?: SearchProviderRerankHit[] };\n\nexport interface SearchProviderRerankContext {\n query: string;\n mode: \"hybrid\";\n model: string;\n top_k: number;\n settings: PmSettings;\n candidates: SearchProviderRerankCandidate[];\n [key: string]: unknown;\n}\n\nexport interface SearchProviderEmbedBatchContext {\n inputs: string[];\n settings: PmSettings;\n model: string;\n [key: string]: unknown;\n}\n\nexport interface SearchProviderEmbedContext {\n input: string;\n settings: PmSettings;\n model: string;\n [key: string]: unknown;\n}\n\nexport interface SearchProviderDefinition {\n name: string;\n query?: (context: SearchProviderQueryContext) => SearchProviderQueryResult | Promise<SearchProviderQueryResult>;\n queryExpansion?: (\n context: SearchProviderQueryExpansionContext,\n ) => SearchProviderQueryExpansionResult | Promise<SearchProviderQueryExpansionResult>;\n query_expansion?: (\n context: SearchProviderQueryExpansionContext,\n ) => SearchProviderQueryExpansionResult | Promise<SearchProviderQueryExpansionResult>;\n rerank?: (context: SearchProviderRerankContext) => SearchProviderRerankResult | Promise<SearchProviderRerankResult>;\n embedBatch?: (context: SearchProviderEmbedBatchContext) => number[][] | Promise<number[][]>;\n embed_batch?: (context: SearchProviderEmbedBatchContext) => number[][] | Promise<number[][]>;\n embed?: (context: SearchProviderEmbedContext) => number[] | Promise<number[]>;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreQueryHit {\n id: string;\n score: number;\n payload?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreQueryContext {\n vector: number[];\n limit: number;\n settings: PmSettings;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreUpsertPoint {\n id: string;\n vector: number[];\n payload?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreUpsertContext {\n points: VectorStoreUpsertPoint[];\n settings: PmSettings;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreDeleteContext {\n ids: string[];\n settings: PmSettings;\n [key: string]: unknown;\n}\n\nexport interface VectorStoreAdapterDefinition {\n name: string;\n query?: (context: VectorStoreQueryContext) => VectorStoreQueryHit[] | Promise<VectorStoreQueryHit[]>;\n upsert?: (context: VectorStoreUpsertContext) => unknown | Promise<unknown>;\n delete?: (context: VectorStoreDeleteContext) => unknown | Promise<unknown>;\n [key: string]: unknown;\n}\n\nexport interface RegisteredExtensionCommandOverride {\n layer: ExtensionLayer;\n name: string;\n command: string;\n run: CommandOverride;\n}\n\nexport interface RegisteredExtensionCommandHandler {\n layer: ExtensionLayer;\n name: string;\n command: string;\n run: CommandHandler;\n}\n\nexport interface RegisteredExtensionParserOverride {\n layer: ExtensionLayer;\n name: string;\n command: string;\n run: ParserOverride;\n}\n\nexport interface RegisteredExtensionPreflightOverride {\n layer: ExtensionLayer;\n name: string;\n run: PreflightOverride;\n}\n\nexport interface RegisteredExtensionServiceOverride {\n layer: ExtensionLayer;\n name: string;\n service: ExtensionServiceName;\n run: ServiceOverride;\n}\n\nexport interface RegisteredExtensionRendererOverride {\n layer: ExtensionLayer;\n name: string;\n format: OutputRendererFormat;\n run: RendererOverride;\n}\n\nexport interface ExtensionCommandRegistry {\n overrides: RegisteredExtensionCommandOverride[];\n handlers: RegisteredExtensionCommandHandler[];\n}\n\nexport interface ExtensionParserRegistry {\n overrides: RegisteredExtensionParserOverride[];\n}\n\nexport interface ExtensionPreflightRegistry {\n overrides: RegisteredExtensionPreflightOverride[];\n}\n\nexport interface ExtensionServiceRegistry {\n overrides: RegisteredExtensionServiceOverride[];\n}\n\nexport interface ExtensionRendererRegistry {\n overrides: RegisteredExtensionRendererOverride[];\n}\n\nexport interface RegisteredExtensionFlagDefinitions {\n layer: ExtensionLayer;\n name: string;\n target_command: string;\n flags: FlagDefinition[];\n}\n\nexport interface RegisteredExtensionCommandDefinition {\n layer: ExtensionLayer;\n name: string;\n source_package?: string;\n command: string;\n action: string;\n description?: string;\n intent?: string;\n examples: string[];\n failure_hints: string[];\n arguments: ExtensionCommandArgumentDefinition[];\n}\n\nexport interface RegisteredExtensionSchemaFieldDefinitions {\n layer: ExtensionLayer;\n name: string;\n fields: SchemaFieldDefinition[];\n}\n\nexport interface RegisteredExtensionSchemaItemTypeDefinitions {\n layer: ExtensionLayer;\n name: string;\n types: SchemaItemTypeDefinition[];\n}\n\nexport interface RegisteredExtensionSchemaMigrationDefinition {\n layer: ExtensionLayer;\n name: string;\n definition: SchemaMigrationDefinition;\n runtime_definition: SchemaMigrationDefinition;\n}\n\nexport interface RegisteredExtensionImporter {\n layer: ExtensionLayer;\n name: string;\n importer: string;\n}\n\nexport interface RegisteredExtensionExporter {\n layer: ExtensionLayer;\n name: string;\n exporter: string;\n}\n\nexport interface RegisteredExtensionSearchProvider {\n layer: ExtensionLayer;\n name: string;\n definition: SearchProviderDefinition;\n runtime_definition: SearchProviderDefinition;\n}\n\nexport interface RegisteredExtensionVectorStoreAdapter {\n layer: ExtensionLayer;\n name: string;\n definition: VectorStoreAdapterDefinition;\n runtime_definition: VectorStoreAdapterDefinition;\n}\n\nexport interface ExtensionRegistrationRegistry {\n commands: RegisteredExtensionCommandDefinition[];\n flags: RegisteredExtensionFlagDefinitions[];\n item_fields: RegisteredExtensionSchemaFieldDefinitions[];\n item_types: RegisteredExtensionSchemaItemTypeDefinitions[];\n migrations: RegisteredExtensionSchemaMigrationDefinition[];\n importers: RegisteredExtensionImporter[];\n exporters: RegisteredExtensionExporter[];\n search_providers: RegisteredExtensionSearchProvider[];\n vector_store_adapters: RegisteredExtensionVectorStoreAdapter[];\n}\n\nexport interface ExtensionRegistrationCounts {\n commands: number;\n flags: number;\n item_fields: number;\n item_types: number;\n migrations: number;\n importers: number;\n exporters: number;\n search_providers: number;\n vector_store_adapters: number;\n}\n\n/**\n * Read-only identity an extension's `activate(api)` receives about itself, so\n * authors can emit self-identifying logs, gate on their own version, and build\n * better error messages without re-reading the on-disk manifest or duplicating\n * metadata in-module. Exposed as `api.extension`.\n */\nexport interface ExtensionSelfIdentity {\n readonly name: string;\n readonly layer: ExtensionLayer;\n readonly version: string;\n readonly capabilities: readonly ExtensionCapability[];\n readonly pm_min_version?: string;\n readonly pm_max_version?: string;\n readonly source_package?: string;\n}\n\nexport interface ExtensionApi {\n /** Read-only identity of the extension this `api` was created for. */\n readonly extension: ExtensionSelfIdentity;\n registerCommand(command: string, override: CommandOverride): void;\n registerCommand(definition: CommandDefinition): void;\n registerParser(command: string, override: ParserOverride): void;\n registerPreflight(override: PreflightOverride): void;\n registerService(service: ExtensionServiceName, override: ServiceOverride): void;\n registerFlags(targetCommand: string, flags: FlagDefinition[]): void;\n registerItemFields(fields: SchemaFieldDefinition[]): void;\n registerItemTypes(types: SchemaItemTypeDefinition[]): void;\n registerMigration(definition: SchemaMigrationDefinition): void;\n registerRenderer(format: OutputRendererFormat, renderer: RendererOverride): void;\n registerImporter(name: string, importer: Importer, options?: ImportExportRegistrationOptions): void;\n registerExporter(name: string, exporter: Exporter, options?: ImportExportRegistrationOptions): void;\n registerSearchProvider(provider: SearchProviderDefinition): void;\n registerVectorStoreAdapter(adapter: VectorStoreAdapterDefinition): void;\n hooks: {\n beforeCommand(hook: BeforeCommandHook): void;\n afterCommand(hook: AfterCommandHook): void;\n onWrite(hook: OnWriteHook): void;\n onRead(hook: OnReadHook): void;\n onIndex(hook: OnIndexHook): void;\n };\n}\n\nexport interface FailedExtensionActivation {\n layer: ExtensionLayer;\n name: string;\n entry_path: string;\n error: string;\n trace?: ExtensionActivationFailureTrace;\n}\n\nexport interface ExtensionActivationFailureTrace {\n method: string;\n /** `-1` means the failure happened before a numbered registration was accepted. */\n registration_index: number;\n command?: string;\n capability?: ExtensionCapability;\n missing_capability?: ExtensionCapability;\n expected_schema: string;\n received?: unknown;\n hint?: string;\n}\n\nexport interface ExtensionActivationResult {\n hooks: ExtensionHookRegistry;\n commands: ExtensionCommandRegistry;\n parsers: ExtensionParserRegistry;\n preflight: ExtensionPreflightRegistry;\n services: ExtensionServiceRegistry;\n renderers: ExtensionRendererRegistry;\n registrations: ExtensionRegistrationRegistry;\n failed: FailedExtensionActivation[];\n warnings: string[];\n hook_counts: {\n before_command: number;\n after_command: number;\n on_write: number;\n on_read: number;\n on_index: number;\n };\n command_override_count: number;\n command_handler_count: number;\n parser_override_count: number;\n preflight_override_count: number;\n service_override_count: number;\n renderer_override_count: number;\n registration_counts: ExtensionRegistrationCounts;\n}\n\nexport interface ExtensionCandidate {\n layer: ExtensionLayer;\n directory: string;\n manifest_path: string;\n entry_path: string;\n manifest: ExtensionManifest;\n source_package?: string;\n}\n\nexport interface ExtensionLayerScanResult {\n diagnostics: ExtensionDiagnostic[];\n warnings: string[];\n candidates: ExtensionCandidate[];\n}\n\nexport interface ScannedExtensionDirectory {\n diagnostic: ExtensionDiagnostic;\n warnings: string[];\n candidate: ExtensionCandidate | null;\n}\n\nexport interface LegacyExtensionCapabilityAliasMapping {\n alias: string;\n target: ExtensionCapability;\n}\n\nexport interface DiscoverExtensionsOptions {\n pmRoot: string;\n settings: PmSettings;\n cwd?: string;\n noExtensions?: boolean;\n reload_token?: string;\n cache_bust?: boolean;\n}\n\nexport interface ActivatableExtension {\n activate: (api: ExtensionApi) => void | Promise<void>;\n /**\n * Optional teardown lifecycle hook, analogous to VS Code's `deactivate`\n * export. Invoked when the host tears the extension down — on long-running\n * MCP-server reload between requests, or via the `deactivateExtensions`\n * primitive — so an extension can close connections, clear timers, and\n * release buffers it opened during `activate`.\n */\n deactivate?: () => void | Promise<void>;\n}\n\nexport interface ExtensionDeactivationFailure {\n layer: ExtensionLayer;\n name: string;\n error: string;\n}\n\nexport interface ExtensionDeactivationResult {\n /** Count of loaded extensions whose `deactivate` hook ran without throwing. */\n deactivated: number;\n warnings: string[];\n failed: ExtensionDeactivationFailure[];\n}\n\nexport interface ServiceOverrideResult {\n handled: boolean;\n result: unknown;\n warnings: string[];\n}\n\nexport interface CommandOverrideResult {\n overridden: boolean;\n result: unknown;\n warnings: string[];\n}\n\nexport interface CommandHandlerResult {\n handled: boolean;\n result: unknown;\n warnings: string[];\n /**\n * Human-readable, single-line, length-bounded message describing why an\n * extension command handler failed. Surfaced to the user/CI so the real cause\n * (e.g. \"Changelog is out of date: CHANGELOG.md\") is visible instead of only\n * the opaque `extension_command_handler_failed` warning code.\n */\n errorMessage?: string;\n}\n\nexport interface ParserOverrideResult {\n overridden: boolean;\n context: CommandHandlerContext;\n warnings: string[];\n}\n\nexport interface PreflightOverrideResult {\n overridden: boolean;\n context: CommandHandlerContext;\n decision: PreflightRuntimeDecision;\n warnings: string[];\n}\n\nexport interface RendererOverrideResult {\n overridden: boolean;\n rendered: string | null;\n warnings: string[];\n}\n\nexport interface UnknownExtensionCapabilityWarningDetails {\n layer: ExtensionLayer;\n name: string;\n capability: string;\n allowed_capabilities: string[];\n capability_contract_version: number;\n suggested_capability?: string;\n suggestion_source?: \"legacy_alias\" | \"nearest_match\";\n legacy_alias_target?: string;\n}\n"],"names":[],"mappings":";;AAUA,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,UAAU;IACV,WAAW;IACX,OAAO;IACP,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,UAAU;CACF,CAAC;AAEX,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,mCAAmC,GAAkD,MAAM,CAAC,MAAM,CAAC;IAC9G,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,QAAQ;CACrB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC,MAAM,CAAC;IACzD,OAAO,EAAE,qCAAqC;IAC9C,YAAY,EAAE,CAAC,GAAG,4BAA4B,CAAC;IAC/C,cAAc,EAAE,EAAE,GAAG,mCAAmC,EAAE;CAC3D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAEhF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAE/E,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAU,CAAC;AAG1F,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,mBAAmB;IACnB,kBAAkB;IAClB,qBAAqB;IACrB,oBAAoB;IACpB,eAAe;IACf,cAAc;IACd,eAAe;IACf,cAAc;IACd,mBAAmB;IACnB,kBAAkB;IAClB,mBAAmB;IACnB,iBAAiB;IACjB,oBAAoB;IACpB,mBAAmB;IACnB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,iBAAiB;IACjB,oBAAoB;CACZ,CAAC;AAGX,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,eAAe;IACf,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,mBAAmB;CACX,CAAC;AAgCX,MAAM,UAAU,sCAAsC;IACpD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,KAAK;QACjB,kBAAkB,EAAE,KAAK;QACzB,kBAAkB,EAAE,EAAE;QACtB,uBAAuB,EAAE,MAAM;QAC/B,kBAAkB,EAAE,EAAE;QACtB,kBAAkB,EAAE,EAAE;QACtB,oBAAoB,EAAE,EAAE;QACxB,oBAAoB,EAAE,EAAE;QACxB,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,EAAE;QACpB,eAAe,EAAE,EAAE;QACnB,eAAe,EAAE,EAAE;QACnB,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,EAAE;QACpB,mBAAmB,EAAE,EAAE;KACxB,CAAC;AACJ,CAAC","debugId":"46e39061-1b71-5927-a798-045c766d91c5"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Canonical coercion kinds an extension flag can declare via `value_type`
3
+ * (or the deprecated `type` alias). The runtime also accepts a few common
4
+ * aliases (`int`/`integer`/`float` -> number, `bool` -> boolean) so author
5
+ * intent is honored without surprises.
6
+ */
7
+ export type FlagValueKind = "string" | "number" | "boolean";
8
+ /**
9
+ * Resolve a declared flag value type (string) to its canonical kind, or `null`
10
+ * when it is not a recognized type/alias. Matching is trim- and
11
+ * case-insensitive.
12
+ */
13
+ export declare function resolveFlagValueKind(raw: unknown): FlagValueKind | null;
14
+ /**
15
+ * Flatten a `list` flag value (or default) into its individual entries the same
16
+ * way the runtime does: nested arrays are flattened and comma-joined strings are
17
+ * split, with surrounding whitespace trimmed and empty segments dropped. No
18
+ * type coercion is applied. Shared by the CLI coercion path and the
19
+ * registration-time default validator so the two never disagree.
20
+ */
21
+ export declare function flattenFlagListValue(value: unknown): unknown[];
22
+ /**
23
+ * Whether a scalar flag default would cleanly coerce under the declared kind,
24
+ * mirroring the runtime coercion rules in `coerceLooseCommandOptionsWithFlagDefinitions`.
25
+ * Used to reject contradictory definitions (e.g. `value_type: "number"` with
26
+ * `default: "abc"`) at registration instead of letting an untyped value pass
27
+ * through to activation.
28
+ */
29
+ export declare function isFlagDefaultValueCoercible(value: string | number | boolean, kind: FlagValueKind): boolean;
@@ -0,0 +1,78 @@
1
+
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="63f541d2-f7f5-50d9-afbe-4ce8659063f8")}catch(e){}}();
3
+ const FLAG_VALUE_KIND_BY_ALIAS = Object.freeze({
4
+ string: "string",
5
+ number: "number",
6
+ int: "number",
7
+ integer: "number",
8
+ float: "number",
9
+ boolean: "boolean",
10
+ bool: "boolean",
11
+ });
12
+ /**
13
+ * Resolve a declared flag value type (string) to its canonical kind, or `null`
14
+ * when it is not a recognized type/alias. Matching is trim- and
15
+ * case-insensitive.
16
+ */
17
+ export function resolveFlagValueKind(raw) {
18
+ if (typeof raw !== "string") {
19
+ return null;
20
+ }
21
+ return FLAG_VALUE_KIND_BY_ALIAS[raw.trim().toLowerCase()] ?? null;
22
+ }
23
+ /**
24
+ * Flatten a `list` flag value (or default) into its individual entries the same
25
+ * way the runtime does: nested arrays are flattened and comma-joined strings are
26
+ * split, with surrounding whitespace trimmed and empty segments dropped. No
27
+ * type coercion is applied. Shared by the CLI coercion path and the
28
+ * registration-time default validator so the two never disagree.
29
+ */
30
+ export function flattenFlagListValue(value) {
31
+ const entries = [];
32
+ const collect = (input) => {
33
+ if (Array.isArray(input)) {
34
+ for (const item of input) {
35
+ collect(item);
36
+ }
37
+ return;
38
+ }
39
+ if (typeof input === "string") {
40
+ for (const part of input.split(",")) {
41
+ const trimmed = part.trim();
42
+ if (trimmed.length > 0) {
43
+ entries.push(trimmed);
44
+ }
45
+ }
46
+ return;
47
+ }
48
+ if (input !== undefined && input !== null) {
49
+ entries.push(input);
50
+ }
51
+ };
52
+ collect(value);
53
+ return entries;
54
+ }
55
+ /**
56
+ * Whether a scalar flag default would cleanly coerce under the declared kind,
57
+ * mirroring the runtime coercion rules in `coerceLooseCommandOptionsWithFlagDefinitions`.
58
+ * Used to reject contradictory definitions (e.g. `value_type: "number"` with
59
+ * `default: "abc"`) at registration instead of letting an untyped value pass
60
+ * through to activation.
61
+ */
62
+ export function isFlagDefaultValueCoercible(value, kind) {
63
+ if (kind === "string") {
64
+ return true;
65
+ }
66
+ if (kind === "number") {
67
+ if (typeof value === "number") {
68
+ return Number.isFinite(value);
69
+ }
70
+ return typeof value === "string" && value.trim().length > 0 && Number.isFinite(Number(value));
71
+ }
72
+ if (typeof value === "boolean") {
73
+ return true;
74
+ }
75
+ return typeof value === "string" && ["true", "false", "1", "0"].includes(value.trim().toLowerCase());
76
+ }
77
+ //# sourceMappingURL=flag-value-types.js.map
78
+ //# debugId=63f541d2-f7f5-50d9-afbe-4ce8659063f8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flag-value-types.js","sources":["core/extensions/flag-value-types.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Canonical coercion kinds an extension flag can declare via `value_type`\n * (or the deprecated `type` alias). The runtime also accepts a few common\n * aliases (`int`/`integer`/`float` -> number, `bool` -> boolean) so author\n * intent is honored without surprises.\n */\nexport type FlagValueKind = \"string\" | \"number\" | \"boolean\";\n\nconst FLAG_VALUE_KIND_BY_ALIAS: Readonly<Record<string, FlagValueKind>> = Object.freeze({\n string: \"string\",\n number: \"number\",\n int: \"number\",\n integer: \"number\",\n float: \"number\",\n boolean: \"boolean\",\n bool: \"boolean\",\n});\n\n/**\n * Resolve a declared flag value type (string) to its canonical kind, or `null`\n * when it is not a recognized type/alias. Matching is trim- and\n * case-insensitive.\n */\nexport function resolveFlagValueKind(raw: unknown): FlagValueKind | null {\n if (typeof raw !== \"string\") {\n return null;\n }\n return FLAG_VALUE_KIND_BY_ALIAS[raw.trim().toLowerCase()] ?? null;\n}\n\n/**\n * Flatten a `list` flag value (or default) into its individual entries the same\n * way the runtime does: nested arrays are flattened and comma-joined strings are\n * split, with surrounding whitespace trimmed and empty segments dropped. No\n * type coercion is applied. Shared by the CLI coercion path and the\n * registration-time default validator so the two never disagree.\n */\nexport function flattenFlagListValue(value: unknown): unknown[] {\n const entries: unknown[] = [];\n const collect = (input: unknown): void => {\n if (Array.isArray(input)) {\n for (const item of input) {\n collect(item);\n }\n return;\n }\n if (typeof input === \"string\") {\n for (const part of input.split(\",\")) {\n const trimmed = part.trim();\n if (trimmed.length > 0) {\n entries.push(trimmed);\n }\n }\n return;\n }\n if (input !== undefined && input !== null) {\n entries.push(input);\n }\n };\n collect(value);\n return entries;\n}\n\n/**\n * Whether a scalar flag default would cleanly coerce under the declared kind,\n * mirroring the runtime coercion rules in `coerceLooseCommandOptionsWithFlagDefinitions`.\n * Used to reject contradictory definitions (e.g. `value_type: \"number\"` with\n * `default: \"abc\"`) at registration instead of letting an untyped value pass\n * through to activation.\n */\nexport function isFlagDefaultValueCoercible(value: string | number | boolean, kind: FlagValueKind): boolean {\n if (kind === \"string\") {\n return true;\n }\n if (kind === \"number\") {\n if (typeof value === \"number\") {\n return Number.isFinite(value);\n }\n return typeof value === \"string\" && value.trim().length > 0 && Number.isFinite(Number(value));\n }\n if (typeof value === \"boolean\") {\n return true;\n }\n return typeof value === \"string\" && [\"true\", \"false\", \"1\", \"0\"].includes(value.trim().toLowerCase());\n}\n"],"names":[],"mappings":";;AAQA,MAAM,wBAAwB,GAA4C,MAAM,CAAC,MAAM,CAAC;IACtF,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,QAAQ;IACb,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;CAChB,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,wBAAwB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,CAAC,KAAc,EAAQ,EAAE;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,CAAC;IACf,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAgC,EAAE,IAAmB;IAC/F,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACvG,CAAC","debugId":"63f541d2-f7f5-50d9-afbe-4ce8659063f8"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Canonical coercion kinds accepted for extension-registered custom item fields.
3
+ *
4
+ * A `registerItemFields` definition declares one of these as its `type`; the
5
+ * value is later coerced by that kind (see `coerceRegisteredFieldValue`). Keep
6
+ * this list in lock-step with the coercion switch in `item-fields.ts`.
7
+ */
8
+ export declare const KNOWN_ITEM_FIELD_TYPES: readonly ["string", "number", "boolean", "array", "object"];
9
+ export type KnownItemFieldType = (typeof KNOWN_ITEM_FIELD_TYPES)[number];
10
+ /**
11
+ * Normalize a declared field type to its canonical kind, or `null` when the
12
+ * value is not a known type. Matching is trim- and case-insensitive.
13
+ */
14
+ export declare function normalizeItemFieldType(value: string): KnownItemFieldType | null;
15
+ /**
16
+ * Suggest a known field type for a typo'd declaration (e.g. `"strnig"` ->
17
+ * `"string"`), using the shared OSA Damerau–Levenshtein helper so adjacent
18
+ * transpositions count as a single edit. Returns the first canonical type within
19
+ * the proportional edit budget (in declaration order — the kinds are distinct
20
+ * enough that at most one matches), or `null` when nothing is close enough.
21
+ */
22
+ export declare function suggestKnownItemFieldType(value: string): KnownItemFieldType | null;
@@ -0,0 +1,43 @@
1
+
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="557146c8-cf60-5bbf-a59a-606928c536de")}catch(e){}}();
3
+ import { levenshteinDistanceWithinLimit } from "../shared/levenshtein.js";
4
+ /**
5
+ * Canonical coercion kinds accepted for extension-registered custom item fields.
6
+ *
7
+ * A `registerItemFields` definition declares one of these as its `type`; the
8
+ * value is later coerced by that kind (see `coerceRegisteredFieldValue`). Keep
9
+ * this list in lock-step with the coercion switch in `item-fields.ts`.
10
+ */
11
+ export const KNOWN_ITEM_FIELD_TYPES = ["string", "number", "boolean", "array", "object"];
12
+ /**
13
+ * Normalize a declared field type to its canonical kind, or `null` when the
14
+ * value is not a known type. Matching is trim- and case-insensitive.
15
+ */
16
+ export function normalizeItemFieldType(value) {
17
+ const normalized = value.trim().toLowerCase();
18
+ return KNOWN_ITEM_FIELD_TYPES.includes(normalized)
19
+ ? normalized
20
+ : null;
21
+ }
22
+ /**
23
+ * Suggest a known field type for a typo'd declaration (e.g. `"strnig"` ->
24
+ * `"string"`), using the shared OSA Damerau–Levenshtein helper so adjacent
25
+ * transpositions count as a single edit. Returns the first canonical type within
26
+ * the proportional edit budget (in declaration order — the kinds are distinct
27
+ * enough that at most one matches), or `null` when nothing is close enough.
28
+ */
29
+ export function suggestKnownItemFieldType(value) {
30
+ const normalized = value.trim().toLowerCase();
31
+ if (normalized.length === 0) {
32
+ return null;
33
+ }
34
+ const limit = Math.max(1, Math.floor(normalized.length * 0.34));
35
+ for (const candidate of KNOWN_ITEM_FIELD_TYPES) {
36
+ if (levenshteinDistanceWithinLimit(normalized, candidate, limit) !== null) {
37
+ return candidate;
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ //# sourceMappingURL=item-field-types.js.map
43
+ //# debugId=557146c8-cf60-5bbf-a59a-606928c536de
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-field-types.js","sources":["core/extensions/item-field-types.ts"],"sourceRoot":"/","sourcesContent":["import { levenshteinDistanceWithinLimit } from \"../shared/levenshtein.js\";\n\n/**\n * Canonical coercion kinds accepted for extension-registered custom item fields.\n *\n * A `registerItemFields` definition declares one of these as its `type`; the\n * value is later coerced by that kind (see `coerceRegisteredFieldValue`). Keep\n * this list in lock-step with the coercion switch in `item-fields.ts`.\n */\nexport const KNOWN_ITEM_FIELD_TYPES = [\"string\", \"number\", \"boolean\", \"array\", \"object\"] as const;\nexport type KnownItemFieldType = (typeof KNOWN_ITEM_FIELD_TYPES)[number];\n\n/**\n * Normalize a declared field type to its canonical kind, or `null` when the\n * value is not a known type. Matching is trim- and case-insensitive.\n */\nexport function normalizeItemFieldType(value: string): KnownItemFieldType | null {\n const normalized = value.trim().toLowerCase();\n return (KNOWN_ITEM_FIELD_TYPES as readonly string[]).includes(normalized)\n ? (normalized as KnownItemFieldType)\n : null;\n}\n\n/**\n * Suggest a known field type for a typo'd declaration (e.g. `\"strnig\"` ->\n * `\"string\"`), using the shared OSA Damerau–Levenshtein helper so adjacent\n * transpositions count as a single edit. Returns the first canonical type within\n * the proportional edit budget (in declaration order — the kinds are distinct\n * enough that at most one matches), or `null` when nothing is close enough.\n */\nexport function suggestKnownItemFieldType(value: string): KnownItemFieldType | null {\n const normalized = value.trim().toLowerCase();\n if (normalized.length === 0) {\n return null;\n }\n const limit = Math.max(1, Math.floor(normalized.length * 0.34));\n for (const candidate of KNOWN_ITEM_FIELD_TYPES) {\n if (levenshteinDistanceWithinLimit(normalized, candidate, limit) !== null) {\n return candidate;\n }\n }\n return null;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAGlG;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,OAAQ,sBAA4C,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvE,CAAC,CAAE,UAAiC;QACpC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAChE,KAAK,MAAM,SAAS,IAAI,sBAAsB,EAAE,CAAC;QAC/C,IAAI,8BAA8B,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAC1E,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC","debugId":"557146c8-cf60-5bbf-a59a-606928c536de"}
@@ -1,5 +1,6 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="60ed024d-4341-5166-bd9e-abed9b240b11")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="1d92831e-54a7-5c1f-af04-7441908e8e5a")}catch(e){}}();
3
+ import { normalizeItemFieldType } from "./item-field-types.js";
3
4
  import { EXIT_CODE, FRONT_MATTER_KEY_ORDER } from "../shared/constants.js";
4
5
  import { PmCliError } from "../shared/errors.js";
5
6
  const RESERVED_ITEM_FIELD_NAMES = new Set(FRONT_MATTER_KEY_ORDER);
@@ -14,15 +15,7 @@ function normalizeFieldType(value) {
14
15
  if (typeof value !== "string") {
15
16
  return null;
16
17
  }
17
- const normalized = value.trim().toLowerCase();
18
- if (normalized === "string" ||
19
- normalized === "number" ||
20
- normalized === "boolean" ||
21
- normalized === "array" ||
22
- normalized === "object") {
23
- return normalized;
24
- }
25
- return null;
18
+ return normalizeItemFieldType(value);
26
19
  }
27
20
  function cloneFieldValue(value) {
28
21
  try {
@@ -201,4 +194,4 @@ export function applyRegisteredItemFieldDefaultsAndValidation(frontMatter, regis
201
194
  }
202
195
  }
203
196
  //# sourceMappingURL=item-fields.js.map
204
- //# debugId=60ed024d-4341-5166-bd9e-abed9b240b11
197
+ //# debugId=1d92831e-54a7-5c1f-af04-7441908e8e5a
@@ -1 +1 @@
1
- {"version":3,"file":"item-fields.js","sources":["core/extensions/item-fields.ts"],"sourceRoot":"/","sourcesContent":["import type { ExtensionRegistrationRegistry } from \"./loader.js\";\nimport { EXIT_CODE, FRONT_MATTER_KEY_ORDER } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\n\nconst RESERVED_ITEM_FIELD_NAMES = new Set(FRONT_MATTER_KEY_ORDER);\n\nfunction normalizeFieldName(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeFieldType(value: unknown): \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\" | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n if (\n normalized === \"string\" ||\n normalized === \"number\" ||\n normalized === \"boolean\" ||\n normalized === \"array\" ||\n normalized === \"object\"\n ) {\n return normalized;\n }\n return null;\n}\n\nfunction cloneFieldValue<T>(value: T): T {\n try {\n return structuredClone(value);\n } catch {\n return value;\n }\n}\n\nfunction parseFieldAssignment(raw: string): { key: string; value: string } {\n const trimmed = raw.trim();\n const separatorIndex = trimmed.indexOf(\"=\");\n if (separatorIndex <= 0) {\n throw new PmCliError(`--field entries must use name=value syntax, received: ${raw}`, EXIT_CODE.USAGE);\n }\n const key = trimmed.slice(0, separatorIndex).trim();\n const value = trimmed.slice(separatorIndex + 1);\n if (key.length === 0) {\n throw new PmCliError(\"--field entries require a non-empty field name\", EXIT_CODE.USAGE);\n }\n return { key, value };\n}\n\nfunction parseJsonFieldValue(raw: string, fieldName: string, expectedType: \"array\" | \"object\"): unknown {\n try {\n const parsed = JSON.parse(raw);\n if (expectedType === \"array\" && Array.isArray(parsed)) {\n return parsed;\n }\n if (expectedType === \"object\" && typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Fall through to the typed usage error below.\n }\n throw new PmCliError(`--field ${fieldName}=... must be valid JSON ${expectedType}`, EXIT_CODE.USAGE);\n}\n\nfunction coerceRegisteredFieldValue(fieldName: string, fieldType: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\", raw: string): unknown {\n if (fieldType === \"string\") {\n return raw;\n }\n if (fieldType === \"number\") {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new PmCliError(`--field ${fieldName}=... must be a number`, EXIT_CODE.USAGE);\n }\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed)) {\n throw new PmCliError(`--field ${fieldName}=... must be a number`, EXIT_CODE.USAGE);\n }\n return parsed;\n }\n if (fieldType === \"boolean\") {\n const normalized = raw.trim().toLowerCase();\n if (normalized === \"true\" || normalized === \"1\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"false\" || normalized === \"0\" || normalized === \"no\") {\n return false;\n }\n throw new PmCliError(`--field ${fieldName}=... must be one of true|false|1|0|yes|no`, EXIT_CODE.USAGE);\n }\n return parseJsonFieldValue(raw, fieldName, fieldType);\n}\n\nfunction collectRegisteredFieldDefinitions(\n registrations: ExtensionRegistrationRegistry | null,\n): Map<string, { name: string; type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\" }> {\n const definitions = new Map<string, { name: string; type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\" }>();\n if (!registrations) {\n return definitions;\n }\n for (const registration of registrations.item_fields) {\n for (const definition of registration.fields) {\n const fieldName = normalizeFieldName(definition.name);\n const fieldType = normalizeFieldType(definition.type);\n if (!fieldName || !fieldType) {\n continue;\n }\n const existing = definitions.get(fieldName);\n if (existing && existing.type !== fieldType) {\n throw new PmCliError(\n `Extension item field \"${fieldName}\" is declared with conflicting types: ${existing.type}, ${fieldType}`,\n EXIT_CODE.USAGE,\n {\n code: \"extension_item_field_type_conflict\",\n nextSteps: [\"Make every active extension declaration for this field use the same type.\"],\n },\n );\n }\n definitions.set(fieldName, { name: fieldName, type: fieldType });\n }\n }\n return definitions;\n}\n\nfunction assertNotReservedItemFieldName(fieldName: string): void {\n if (!RESERVED_ITEM_FIELD_NAMES.has(fieldName)) {\n return;\n }\n throw new PmCliError(`Extension item field \"${fieldName}\" collides with reserved item metadata`, EXIT_CODE.USAGE, {\n code: \"extension_item_field_reserved\",\n nextSteps: [\"Rename the extension item field, preferably with an extension-specific prefix.\"],\n });\n}\n\nexport function collectRegisteredItemFieldNames(registrations: ExtensionRegistrationRegistry | null): string[] {\n return [...collectRegisteredFieldDefinitions(registrations).keys()].sort((left, right) => left.localeCompare(right));\n}\n\nexport function parseRegisteredItemFieldAssignments(\n rawFields: string[] | undefined,\n registrations: ExtensionRegistrationRegistry | null,\n): Record<string, unknown> {\n if (!rawFields || rawFields.length === 0) {\n return {};\n }\n const definitions = collectRegisteredFieldDefinitions(registrations);\n const values: Record<string, unknown> = {};\n for (const raw of rawFields) {\n const { key, value } = parseFieldAssignment(raw);\n const definition = definitions.get(key);\n if (!definition) {\n const known = [...definitions.keys()].sort((left, right) => left.localeCompare(right));\n throw new PmCliError(`--field ${key} is not declared by an active extension item-field registration`, EXIT_CODE.USAGE, {\n code: \"extension_item_field_unknown\",\n recovery: { provided_fields: known },\n nextSteps: known.length > 0\n ? [`Use one of the declared fields: ${known.join(\", \")}`]\n : [\"Activate an extension that calls registerItemFields before setting extension fields.\"],\n });\n }\n assertNotReservedItemFieldName(definition.name);\n values[definition.name] = coerceRegisteredFieldValue(definition.name, definition.type, value);\n }\n return values;\n}\n\nfunction isValidFieldType(value: unknown, expectedType: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\"): boolean {\n if (expectedType === \"string\") {\n return typeof value === \"string\";\n }\n if (expectedType === \"number\") {\n return typeof value === \"number\" && Number.isFinite(value);\n }\n if (expectedType === \"boolean\") {\n return typeof value === \"boolean\";\n }\n if (expectedType === \"array\") {\n return Array.isArray(value);\n }\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAllowedFieldValue(value: unknown, allowed: unknown[] | undefined): boolean {\n if (!allowed || allowed.length === 0) {\n return true;\n }\n return allowed.some((candidate) => Object.is(candidate, value));\n}\n\nexport function applyRegisteredItemFieldDefaultsAndValidation(\n frontMatter: Record<string, unknown>,\n registrations: ExtensionRegistrationRegistry | null,\n options: { skipDefaultFields?: ReadonlySet<string> } = {},\n): void {\n if (!registrations) {\n return;\n }\n collectRegisteredFieldDefinitions(registrations);\n for (const registration of registrations.item_fields) {\n for (const definition of registration.fields) {\n const fieldName = normalizeFieldName(definition.name);\n if (!fieldName) {\n continue;\n }\n assertNotReservedItemFieldName(fieldName);\n if (\n !(fieldName in frontMatter) &&\n !options.skipDefaultFields?.has(fieldName) &&\n Object.prototype.hasOwnProperty.call(definition, \"default\")\n ) {\n frontMatter[fieldName] = cloneFieldValue(definition.default);\n }\n\n const currentValue = frontMatter[fieldName];\n if (currentValue === undefined) {\n continue;\n }\n const expectedType = normalizeFieldType(definition.type);\n if (expectedType && !isValidFieldType(currentValue, expectedType)) {\n throw new TypeError(`Item field \"${fieldName}\" must be of type ${expectedType}`);\n }\n\n const allowedValues = Array.isArray(definition.values) ? definition.values : undefined;\n if (!isAllowedFieldValue(currentValue, allowedValues)) {\n throw new TypeError(`Item field \"${fieldName}\" must match one of the configured allowed values`);\n }\n }\n }\n}\n"],"names":[],"mappings":"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","debugId":"60ed024d-4341-5166-bd9e-abed9b240b11"}
1
+ {"version":3,"file":"item-fields.js","sources":["core/extensions/item-fields.ts"],"sourceRoot":"/","sourcesContent":["import type { ExtensionRegistrationRegistry } from \"./loader.js\";\nimport { normalizeItemFieldType, type KnownItemFieldType } from \"./item-field-types.js\";\nimport { EXIT_CODE, FRONT_MATTER_KEY_ORDER } from \"../shared/constants.js\";\nimport { PmCliError } from \"../shared/errors.js\";\n\nconst RESERVED_ITEM_FIELD_NAMES = new Set(FRONT_MATTER_KEY_ORDER);\n\nfunction normalizeFieldName(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeFieldType(value: unknown): KnownItemFieldType | null {\n if (typeof value !== \"string\") {\n return null;\n }\n return normalizeItemFieldType(value);\n}\n\nfunction cloneFieldValue<T>(value: T): T {\n try {\n return structuredClone(value);\n } catch {\n return value;\n }\n}\n\nfunction parseFieldAssignment(raw: string): { key: string; value: string } {\n const trimmed = raw.trim();\n const separatorIndex = trimmed.indexOf(\"=\");\n if (separatorIndex <= 0) {\n throw new PmCliError(`--field entries must use name=value syntax, received: ${raw}`, EXIT_CODE.USAGE);\n }\n const key = trimmed.slice(0, separatorIndex).trim();\n const value = trimmed.slice(separatorIndex + 1);\n if (key.length === 0) {\n throw new PmCliError(\"--field entries require a non-empty field name\", EXIT_CODE.USAGE);\n }\n return { key, value };\n}\n\nfunction parseJsonFieldValue(raw: string, fieldName: string, expectedType: \"array\" | \"object\"): unknown {\n try {\n const parsed = JSON.parse(raw);\n if (expectedType === \"array\" && Array.isArray(parsed)) {\n return parsed;\n }\n if (expectedType === \"object\" && typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Fall through to the typed usage error below.\n }\n throw new PmCliError(`--field ${fieldName}=... must be valid JSON ${expectedType}`, EXIT_CODE.USAGE);\n}\n\nfunction coerceRegisteredFieldValue(fieldName: string, fieldType: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\", raw: string): unknown {\n if (fieldType === \"string\") {\n return raw;\n }\n if (fieldType === \"number\") {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new PmCliError(`--field ${fieldName}=... must be a number`, EXIT_CODE.USAGE);\n }\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed)) {\n throw new PmCliError(`--field ${fieldName}=... must be a number`, EXIT_CODE.USAGE);\n }\n return parsed;\n }\n if (fieldType === \"boolean\") {\n const normalized = raw.trim().toLowerCase();\n if (normalized === \"true\" || normalized === \"1\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"false\" || normalized === \"0\" || normalized === \"no\") {\n return false;\n }\n throw new PmCliError(`--field ${fieldName}=... must be one of true|false|1|0|yes|no`, EXIT_CODE.USAGE);\n }\n return parseJsonFieldValue(raw, fieldName, fieldType);\n}\n\nfunction collectRegisteredFieldDefinitions(\n registrations: ExtensionRegistrationRegistry | null,\n): Map<string, { name: string; type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\" }> {\n const definitions = new Map<string, { name: string; type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\" }>();\n if (!registrations) {\n return definitions;\n }\n for (const registration of registrations.item_fields) {\n for (const definition of registration.fields) {\n const fieldName = normalizeFieldName(definition.name);\n const fieldType = normalizeFieldType(definition.type);\n if (!fieldName || !fieldType) {\n continue;\n }\n const existing = definitions.get(fieldName);\n if (existing && existing.type !== fieldType) {\n throw new PmCliError(\n `Extension item field \"${fieldName}\" is declared with conflicting types: ${existing.type}, ${fieldType}`,\n EXIT_CODE.USAGE,\n {\n code: \"extension_item_field_type_conflict\",\n nextSteps: [\"Make every active extension declaration for this field use the same type.\"],\n },\n );\n }\n definitions.set(fieldName, { name: fieldName, type: fieldType });\n }\n }\n return definitions;\n}\n\nfunction assertNotReservedItemFieldName(fieldName: string): void {\n if (!RESERVED_ITEM_FIELD_NAMES.has(fieldName)) {\n return;\n }\n throw new PmCliError(`Extension item field \"${fieldName}\" collides with reserved item metadata`, EXIT_CODE.USAGE, {\n code: \"extension_item_field_reserved\",\n nextSteps: [\"Rename the extension item field, preferably with an extension-specific prefix.\"],\n });\n}\n\nexport function collectRegisteredItemFieldNames(registrations: ExtensionRegistrationRegistry | null): string[] {\n return [...collectRegisteredFieldDefinitions(registrations).keys()].sort((left, right) => left.localeCompare(right));\n}\n\nexport function parseRegisteredItemFieldAssignments(\n rawFields: string[] | undefined,\n registrations: ExtensionRegistrationRegistry | null,\n): Record<string, unknown> {\n if (!rawFields || rawFields.length === 0) {\n return {};\n }\n const definitions = collectRegisteredFieldDefinitions(registrations);\n const values: Record<string, unknown> = {};\n for (const raw of rawFields) {\n const { key, value } = parseFieldAssignment(raw);\n const definition = definitions.get(key);\n if (!definition) {\n const known = [...definitions.keys()].sort((left, right) => left.localeCompare(right));\n throw new PmCliError(`--field ${key} is not declared by an active extension item-field registration`, EXIT_CODE.USAGE, {\n code: \"extension_item_field_unknown\",\n recovery: { provided_fields: known },\n nextSteps: known.length > 0\n ? [`Use one of the declared fields: ${known.join(\", \")}`]\n : [\"Activate an extension that calls registerItemFields before setting extension fields.\"],\n });\n }\n assertNotReservedItemFieldName(definition.name);\n values[definition.name] = coerceRegisteredFieldValue(definition.name, definition.type, value);\n }\n return values;\n}\n\nfunction isValidFieldType(value: unknown, expectedType: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\"): boolean {\n if (expectedType === \"string\") {\n return typeof value === \"string\";\n }\n if (expectedType === \"number\") {\n return typeof value === \"number\" && Number.isFinite(value);\n }\n if (expectedType === \"boolean\") {\n return typeof value === \"boolean\";\n }\n if (expectedType === \"array\") {\n return Array.isArray(value);\n }\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isAllowedFieldValue(value: unknown, allowed: unknown[] | undefined): boolean {\n if (!allowed || allowed.length === 0) {\n return true;\n }\n return allowed.some((candidate) => Object.is(candidate, value));\n}\n\nexport function applyRegisteredItemFieldDefaultsAndValidation(\n frontMatter: Record<string, unknown>,\n registrations: ExtensionRegistrationRegistry | null,\n options: { skipDefaultFields?: ReadonlySet<string> } = {},\n): void {\n if (!registrations) {\n return;\n }\n collectRegisteredFieldDefinitions(registrations);\n for (const registration of registrations.item_fields) {\n for (const definition of registration.fields) {\n const fieldName = normalizeFieldName(definition.name);\n if (!fieldName) {\n continue;\n }\n assertNotReservedItemFieldName(fieldName);\n if (\n !(fieldName in frontMatter) &&\n !options.skipDefaultFields?.has(fieldName) &&\n Object.prototype.hasOwnProperty.call(definition, \"default\")\n ) {\n frontMatter[fieldName] = cloneFieldValue(definition.default);\n }\n\n const currentValue = frontMatter[fieldName];\n if (currentValue === undefined) {\n continue;\n }\n const expectedType = normalizeFieldType(definition.type);\n if (expectedType && !isValidFieldType(currentValue, expectedType)) {\n throw new TypeError(`Item field \"${fieldName}\" must be of type ${expectedType}`);\n }\n\n const allowedValues = Array.isArray(definition.values) ? definition.values : undefined;\n if (!isAllowedFieldValue(currentValue, allowedValues)) {\n throw new TypeError(`Item field \"${fieldName}\" must match one of the configured allowed values`);\n }\n }\n }\n}\n"],"names":[],"mappings":"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","debugId":"1d92831e-54a7-5c1f-af04-7441908e8e5a"}
@@ -1,7 +1,7 @@
1
1
  export { parseUnknownExtensionCapabilityWarning, parseLegacyExtensionCapabilityAliasWarning, } from "./extension-capability-aliases.js";
2
2
  export { createEmptyExtensionHookRegistry, createEmptyExtensionCommandRegistry, createEmptyExtensionParserRegistry, createEmptyExtensionPreflightRegistry, createEmptyExtensionServiceRegistry, createEmptyExtensionRendererRegistry, createEmptyExtensionRegistrationRegistry, } from "./extension-registries.js";
3
3
  export { runBeforeCommandHooks, runAfterCommandHooks, runOnWriteHooks, runOnReadHooks, runOnIndexHooks, runCommandHandler, runParserOverride, runPreflightOverride, runServiceOverrideSync, runServiceOverride, runCommandOverride, runRendererOverride, } from "./extension-hook-runtime.js";
4
- import { type ExtensionDiscoveryResult, type ExtensionLoadResult, type ExtensionActivationResult, type DiscoverExtensionsOptions } from "./extension-types.js";
4
+ import { type ExtensionDeactivationResult, type ExtensionDiscoveryResult, type ExtensionLoadResult, type ExtensionActivationResult, type DiscoverExtensionsOptions } from "./extension-types.js";
5
5
  export * from "./extension-types.js";
6
6
  export declare function nextExtensionReloadToken(seed?: number): string;
7
7
  export declare function resolveExtensionRoots(pmRoot: string, cwd?: string): {
@@ -10,4 +10,17 @@ export declare function resolveExtensionRoots(pmRoot: string, cwd?: string): {
10
10
  };
11
11
  export declare function discoverExtensions(options: DiscoverExtensionsOptions): Promise<ExtensionDiscoveryResult>;
12
12
  export declare function loadExtensions(options: DiscoverExtensionsOptions): Promise<ExtensionLoadResult>;
13
+ /**
14
+ * Run the optional `deactivate` teardown hook for every loaded extension that
15
+ * exports one. Best-effort: a throwing teardown is captured as a warning and a
16
+ * failure entry rather than propagated, so one extension cannot block another's
17
+ * cleanup. Hosts call this on shutdown/reload (e.g. the MCP server between
18
+ * native-action requests) to release resources opened during `activate`.
19
+ *
20
+ * Pass the `activationResult` to skip extensions whose `activate` failed — they
21
+ * never fully initialized, so (VS Code-style) their `deactivate` must not run.
22
+ * Teardowns run concurrently so one slow hook cannot serialize the rest; the
23
+ * returned warnings/failures preserve loaded order.
24
+ */
25
+ export declare function deactivateExtensions(loadResult: ExtensionLoadResult, activationResult?: Pick<ExtensionActivationResult, "failed">): Promise<ExtensionDeactivationResult>;
13
26
  export declare function activateExtensions(loadResult: ExtensionLoadResult): Promise<ExtensionActivationResult>;