@unbrained/pm-cli 2026.7.21 → 2026.7.22

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 (506) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +25 -0
  3. package/dist/cli/bundle-integrity.js +3 -3
  4. package/dist/cli/bundle-integrity.js.map +1 -1
  5. package/dist/cli/commands/contracts.d.ts +5 -0
  6. package/dist/cli/commands/contracts.js +8 -6
  7. package/dist/cli/commands/contracts.js.map +1 -1
  8. package/dist/cli/commands/copy.js +36 -20
  9. package/dist/cli/commands/copy.js.map +1 -1
  10. package/dist/cli/commands/create.js +48 -24
  11. package/dist/cli/commands/create.js.map +1 -1
  12. package/dist/cli/commands/merge.d.ts +1 -1
  13. package/dist/cli/commands/merge.js +3 -3
  14. package/dist/cli/commands/merge.js.map +1 -1
  15. package/dist/cli/commands/restore.js +40 -22
  16. package/dist/cli/commands/restore.js.map +1 -1
  17. package/dist/cli/commands/update.js +12 -9
  18. package/dist/cli/commands/update.js.map +1 -1
  19. package/dist/cli/extension-command-help.js +3 -4
  20. package/dist/cli/extension-command-help.js.map +1 -1
  21. package/dist/cli/main.d.ts +3 -2
  22. package/dist/cli/main.js +6 -6
  23. package/dist/cli/main.js.map +1 -1
  24. package/dist/cli/register-list-query.js +33 -21
  25. package/dist/cli/register-list-query.js.map +1 -1
  26. package/dist/cli/register-mutation.js +63 -37
  27. package/dist/cli/register-mutation.js.map +1 -1
  28. package/dist/cli/registration-helpers.d.ts +2 -0
  29. package/dist/cli/registration-helpers.js +3 -2
  30. package/dist/cli/registration-helpers.js.map +1 -1
  31. package/dist/cli-bundle/bundle-manifest.json +349 -341
  32. package/dist/cli-bundle/chunks/{append-7OVFYR3C.js → append-CYMA7RJT.js} +5 -5
  33. package/dist/cli-bundle/chunks/append-H53CAPMP.js +11 -0
  34. package/dist/cli-bundle/chunks/{chunk-PFNHX655.js → chunk-2P7OK4WG.js} +3 -3
  35. package/dist/cli-bundle/chunks/{chunk-EJDGV4GR.js → chunk-3EBGHNNQ.js} +3 -3
  36. package/dist/cli-bundle/chunks/{chunk-DZRV2OPA.js → chunk-3EDFN3VV.js} +2 -2
  37. package/dist/cli-bundle/chunks/{chunk-ZOY5K4D3.js → chunk-3PWJWLLQ.js} +2 -2
  38. package/dist/cli-bundle/chunks/{chunk-VXOOB6YX.js → chunk-3SJAR3CY.js} +4 -4
  39. package/dist/cli-bundle/chunks/{chunk-GTLCVJOE.js → chunk-3WVKMF2A.js} +3 -3
  40. package/dist/cli-bundle/chunks/{chunk-LAV26CQG.js → chunk-42SYYKA4.js} +4 -4
  41. package/dist/cli-bundle/chunks/{chunk-NLR32VFS.js → chunk-4IXLNV7W.js} +2 -2
  42. package/dist/cli-bundle/chunks/{chunk-BKIAH72N.js → chunk-4LTPHDKA.js} +39 -23
  43. package/dist/cli-bundle/chunks/chunk-4LTPHDKA.js.map +1 -0
  44. package/dist/cli-bundle/chunks/{chunk-ABWCF646.js → chunk-4YTQVO3V.js} +5 -5
  45. package/dist/cli-bundle/chunks/{chunk-E5XMKOSB.js → chunk-5EBRMHI6.js} +4 -4
  46. package/dist/cli-bundle/chunks/{chunk-IY6VZ3IW.js → chunk-5FAG2JUC.js} +320 -62
  47. package/dist/cli-bundle/chunks/chunk-5FAG2JUC.js.map +7 -0
  48. package/dist/cli-bundle/chunks/{chunk-GKX4NJ7U.js → chunk-5K5LHZZX.js} +6 -6
  49. package/dist/cli-bundle/chunks/{chunk-T6PPNM7V.js → chunk-5K7BOAB6.js} +4 -4
  50. package/dist/cli-bundle/chunks/{chunk-4QOB7L7I.js → chunk-5MUZ54G2.js} +5 -5
  51. package/dist/cli-bundle/chunks/{chunk-SF3DT5HJ.js → chunk-5QME4KX2.js} +3 -3
  52. package/dist/cli-bundle/chunks/{chunk-RMF7LMBS.js → chunk-6PDGFY3P.js} +27 -17
  53. package/dist/cli-bundle/chunks/{chunk-RMF7LMBS.js.map → chunk-6PDGFY3P.js.map} +2 -2
  54. package/dist/cli-bundle/chunks/{chunk-TRSHFPRZ.js → chunk-6PM6CPPP.js} +5 -5
  55. package/dist/cli-bundle/chunks/{chunk-O4BCOJTZ.js → chunk-7AHRY3ZB.js} +21 -16
  56. package/dist/cli-bundle/chunks/chunk-7AHRY3ZB.js.map +7 -0
  57. package/dist/cli-bundle/chunks/{chunk-OR42SO64.js → chunk-7B36A3VT.js} +4 -4
  58. package/dist/cli-bundle/chunks/{chunk-QWRVBJ4D.js → chunk-7OR2YKKD.js} +2 -2
  59. package/dist/cli-bundle/chunks/{chunk-FPBMLYPI.js → chunk-7QUV54XX.js} +4 -4
  60. package/dist/cli-bundle/chunks/{chunk-WWNL6WMH.js → chunk-7WXW6JHG.js} +2 -2
  61. package/dist/cli-bundle/chunks/{chunk-BXNDKOR2.js → chunk-A2VL5SVG.js} +4 -4
  62. package/dist/cli-bundle/chunks/chunk-AXGDUXJW.js +5 -0
  63. package/dist/cli-bundle/chunks/{chunk-IAQE32BI.js → chunk-B2AVNGG3.js} +4 -4
  64. package/dist/cli-bundle/chunks/{chunk-K36WV5J6.js → chunk-B7O44UBR.js} +71 -8
  65. package/dist/cli-bundle/chunks/chunk-B7O44UBR.js.map +1 -0
  66. package/dist/cli-bundle/chunks/{chunk-HCEBZNC3.js → chunk-BRMPF2RM.js} +4 -4
  67. package/dist/cli-bundle/chunks/{chunk-Z7VWXXJM.js → chunk-BTNKMF2A.js} +4 -4
  68. package/dist/cli-bundle/chunks/{chunk-KH44WBAT.js → chunk-CD4643VW.js} +4 -4
  69. package/dist/cli-bundle/chunks/{chunk-OWXOPDHD.js → chunk-CJEEC5O4.js} +4 -4
  70. package/dist/cli-bundle/chunks/{chunk-PZC2FUOQ.js → chunk-CTPKCZCF.js} +2 -2
  71. package/dist/cli-bundle/chunks/{chunk-7W2UAXXT.js → chunk-D4OBQVL3.js} +10 -10
  72. package/dist/cli-bundle/chunks/{chunk-EWJWSNRU.js → chunk-DM4TYC2A.js} +4 -4
  73. package/dist/cli-bundle/chunks/{chunk-VJQG4BIM.js → chunk-DSFTAQ7T.js} +3 -3
  74. package/dist/cli-bundle/chunks/{chunk-AELMUANP.js → chunk-DVB6SQU7.js} +2 -2
  75. package/dist/cli-bundle/chunks/{chunk-KBLZ3AA5.js → chunk-E3ZWOFSO.js} +4 -4
  76. package/dist/cli-bundle/chunks/chunk-EP25DV6P.js +9 -0
  77. package/dist/cli-bundle/chunks/{chunk-GTK4DTEW.js → chunk-F4VCB4WY.js} +10 -10
  78. package/dist/cli-bundle/chunks/{chunk-V22ZPOKN.js → chunk-F4XAQUQA.js} +6 -6
  79. package/dist/cli-bundle/chunks/{chunk-QOOTOD3W.js → chunk-FGR6IBAF.js} +6 -6
  80. package/dist/cli-bundle/chunks/{chunk-JSLT7WVE.js → chunk-FKBMT2Q6.js} +2 -2
  81. package/dist/cli-bundle/chunks/{chunk-QIH77CAG.js → chunk-G5RLSSIX.js} +2 -2
  82. package/dist/cli-bundle/chunks/{chunk-P7MTHPJQ.js → chunk-GEKRVH3G.js} +2 -2
  83. package/dist/cli-bundle/chunks/{chunk-2L6ZP22J.js → chunk-GSP6IZFU.js} +3 -3
  84. package/dist/cli-bundle/chunks/{chunk-ATBCUC7Y.js → chunk-H3MDK2VU.js} +48 -30
  85. package/dist/cli-bundle/chunks/chunk-H3MDK2VU.js.map +1 -0
  86. package/dist/cli-bundle/chunks/{chunk-ZVZGXPQ5.js → chunk-HYZZM3Q2.js} +2 -2
  87. package/dist/cli-bundle/chunks/{chunk-XJTABV3X.js → chunk-IBWG3OSH.js} +22 -17
  88. package/dist/cli-bundle/chunks/chunk-IBWG3OSH.js.map +1 -0
  89. package/dist/cli-bundle/chunks/{chunk-4XGJLADW.js → chunk-IHY5SX7O.js} +3 -3
  90. package/dist/cli-bundle/chunks/{chunk-UCBDQI5E.js → chunk-IMU7JLUI.js} +7 -7
  91. package/dist/cli-bundle/chunks/{chunk-Z75ONV25.js → chunk-IPAQAJWB.js} +77 -7
  92. package/dist/cli-bundle/chunks/chunk-IPAQAJWB.js.map +7 -0
  93. package/dist/cli-bundle/chunks/{chunk-7RW4JCU2.js → chunk-IQCD6OO3.js} +25 -13
  94. package/dist/cli-bundle/chunks/chunk-IQCD6OO3.js.map +7 -0
  95. package/dist/cli-bundle/chunks/{chunk-YQWCZ5AC.js → chunk-J3ZKFEDM.js} +38 -22
  96. package/dist/cli-bundle/chunks/chunk-J3ZKFEDM.js.map +7 -0
  97. package/dist/cli-bundle/chunks/{chunk-PEQGTJ5Q.js → chunk-JCLXCGIL.js} +3 -3
  98. package/dist/cli-bundle/chunks/{chunk-GROYI4RB.js → chunk-JLTHOYR7.js} +3 -3
  99. package/dist/cli-bundle/chunks/{chunk-JHJSFOAM.js → chunk-JMPVHM44.js} +4 -4
  100. package/dist/cli-bundle/chunks/{chunk-MATHDCGG.js → chunk-JWYG36RV.js} +8 -8
  101. package/dist/cli-bundle/chunks/{chunk-ZTVA4KLN.js → chunk-KEGVMZNA.js} +28 -16
  102. package/dist/cli-bundle/chunks/chunk-KEGVMZNA.js.map +7 -0
  103. package/dist/cli-bundle/chunks/{chunk-VLRGDBLY.js → chunk-KEHOPUHH.js} +4 -4
  104. package/dist/cli-bundle/chunks/{chunk-K55VMLSS.js → chunk-KJ4ZF35M.js} +63 -13
  105. package/dist/cli-bundle/chunks/chunk-KJ4ZF35M.js.map +7 -0
  106. package/dist/cli-bundle/chunks/{chunk-CPX275C6.js → chunk-KPCZL2YK.js} +6 -6
  107. package/dist/cli-bundle/chunks/{chunk-POG76WWZ.js → chunk-L7DZV6EZ.js} +319 -61
  108. package/dist/cli-bundle/chunks/chunk-L7DZV6EZ.js.map +1 -0
  109. package/dist/cli-bundle/chunks/{chunk-FO6OSVEN.js → chunk-LANV45W2.js} +8 -8
  110. package/dist/cli-bundle/chunks/{chunk-LVC72YRD.js → chunk-LC5ZUXWE.js} +7 -7
  111. package/dist/cli-bundle/chunks/{chunk-SY4SFZSD.js → chunk-LE522OXA.js} +55 -30
  112. package/dist/cli-bundle/chunks/chunk-LE522OXA.js.map +7 -0
  113. package/dist/cli-bundle/chunks/{chunk-TVYYO5A7.js → chunk-MBHYQYCS.js} +2 -2
  114. package/dist/cli-bundle/chunks/{chunk-FJIFFBJX.js → chunk-MROP2RNT.js} +66 -74
  115. package/dist/cli-bundle/chunks/chunk-MROP2RNT.js.map +1 -0
  116. package/dist/cli-bundle/chunks/{chunk-7656MAUL.js → chunk-MUAJHL2R.js} +2 -2
  117. package/dist/cli-bundle/chunks/{chunk-R3P6FZJW.js → chunk-N6QCY2AX.js} +43 -25
  118. package/dist/cli-bundle/chunks/chunk-N6QCY2AX.js.map +1 -0
  119. package/dist/cli-bundle/chunks/{chunk-7WCE6Y64.js → chunk-NUQCSV4P.js} +2 -2
  120. package/dist/cli-bundle/chunks/{chunk-SZVB53Y3.js → chunk-O3GFE2PX.js} +3 -3
  121. package/dist/cli-bundle/chunks/{chunk-OY7DMU5P.js → chunk-O43LEUSD.js} +2 -2
  122. package/dist/cli-bundle/chunks/{chunk-AMJPSANK.js → chunk-O7RH6BWP.js} +103 -44
  123. package/dist/cli-bundle/chunks/chunk-O7RH6BWP.js.map +7 -0
  124. package/dist/cli-bundle/chunks/{chunk-NUF7ROFH.js → chunk-OODR5KYF.js} +26 -27
  125. package/dist/cli-bundle/chunks/chunk-OODR5KYF.js.map +1 -0
  126. package/dist/cli-bundle/chunks/{chunk-LZYP423P.js → chunk-OZ25YD4Q.js} +3 -3
  127. package/dist/cli-bundle/chunks/{chunk-VZIZB6QH.js → chunk-PKYKQCTJ.js} +4 -4
  128. package/dist/cli-bundle/chunks/{chunk-UZLJOEAC.js → chunk-PMRED6QZ.js} +3 -3
  129. package/dist/cli-bundle/chunks/{chunk-ADBTSVGK.js → chunk-PPATPPI6.js} +65 -73
  130. package/dist/cli-bundle/chunks/chunk-PPATPPI6.js.map +7 -0
  131. package/dist/cli-bundle/chunks/{chunk-K4CI6Y45.js → chunk-PWGJCP2V.js} +2 -2
  132. package/dist/cli-bundle/chunks/{chunk-UVN66B3M.js → chunk-Q3Z2Y5WJ.js} +2 -2
  133. package/dist/cli-bundle/chunks/{chunk-RNPZYNHS.js → chunk-Q6YZ3VCI.js} +104 -45
  134. package/dist/cli-bundle/chunks/chunk-Q6YZ3VCI.js.map +1 -0
  135. package/dist/cli-bundle/chunks/{chunk-7DOJC3HS.js → chunk-QE5EUHKN.js} +28 -18
  136. package/dist/cli-bundle/chunks/chunk-QE5EUHKN.js.map +1 -0
  137. package/dist/cli-bundle/chunks/{chunk-AS4SAZ5R.js → chunk-QKMMWESK.js} +25 -26
  138. package/dist/cli-bundle/chunks/chunk-QKMMWESK.js.map +7 -0
  139. package/dist/cli-bundle/chunks/{chunk-R7QV7ICM.js → chunk-QSXN2FAN.js} +4 -4
  140. package/dist/cli-bundle/chunks/{chunk-5NTE36LD.js → chunk-RBECHH5K.js} +4 -4
  141. package/dist/cli-bundle/chunks/{chunk-JXCW2TI2.js → chunk-RPNC7M63.js} +8 -8
  142. package/dist/cli-bundle/chunks/{chunk-ICDAQ4TD.js → chunk-S2QQNTA6.js} +26 -14
  143. package/dist/cli-bundle/chunks/chunk-S2QQNTA6.js.map +1 -0
  144. package/dist/cli-bundle/chunks/{chunk-JFD5LPMI.js → chunk-SP3BAXFF.js} +29 -17
  145. package/dist/cli-bundle/chunks/chunk-SP3BAXFF.js.map +1 -0
  146. package/dist/cli-bundle/chunks/{chunk-F2LBF7XJ.js → chunk-SUSFH6F7.js} +5 -5
  147. package/dist/cli-bundle/chunks/{chunk-VHXHVTUU.js → chunk-TDOPC7UY.js} +2 -2
  148. package/dist/cli-bundle/chunks/{chunk-HYW67VJ5.js → chunk-TLF52ZDP.js} +30 -25
  149. package/dist/cli-bundle/chunks/chunk-TLF52ZDP.js.map +1 -0
  150. package/dist/cli-bundle/chunks/{chunk-FSE2IKJQ.js → chunk-TWHG646K.js} +2 -2
  151. package/dist/cli-bundle/chunks/{chunk-OCUBRA6D.js → chunk-U7U7WGEC.js} +4 -4
  152. package/dist/cli-bundle/chunks/{chunk-PONKZPCJ.js → chunk-UFRVIIJ2.js} +4 -4
  153. package/dist/cli-bundle/chunks/{chunk-VNTCM3VW.js → chunk-VKX2VZZH.js} +8 -8
  154. package/dist/cli-bundle/chunks/{chunk-7AVEY74G.js → chunk-VTOCZ343.js} +29 -24
  155. package/dist/cli-bundle/chunks/chunk-VTOCZ343.js.map +7 -0
  156. package/dist/cli-bundle/chunks/{chunk-6JUTHVQS.js → chunk-W2JDNTN3.js} +2 -2
  157. package/dist/cli-bundle/chunks/{chunk-PQSEQD6E.js → chunk-W35PHE44.js} +62 -12
  158. package/dist/cli-bundle/chunks/chunk-W35PHE44.js.map +1 -0
  159. package/dist/cli-bundle/chunks/{chunk-4QSQ6XDK.js → chunk-WT4KXBUD.js} +68 -31
  160. package/dist/cli-bundle/chunks/chunk-WT4KXBUD.js.map +1 -0
  161. package/dist/cli-bundle/chunks/{chunk-RPESLSO5.js → chunk-XC5RVKHH.js} +69 -32
  162. package/dist/cli-bundle/chunks/chunk-XC5RVKHH.js.map +7 -0
  163. package/dist/cli-bundle/chunks/{chunk-QG4GFLQ6.js → chunk-XD6UF2NB.js} +42 -24
  164. package/dist/cli-bundle/chunks/chunk-XD6UF2NB.js.map +7 -0
  165. package/dist/cli-bundle/chunks/{chunk-AF2CCM5U.js → chunk-XKRVX4B3.js} +4 -4
  166. package/dist/cli-bundle/chunks/{chunk-JGUKMMRS.js → chunk-XN4NQZJK.js} +3 -3
  167. package/dist/cli-bundle/chunks/{chunk-3P7UJQOX.js → chunk-YKFMLQNK.js} +2 -2
  168. package/dist/cli-bundle/chunks/{chunk-YCIUJJOD.js → chunk-YKWKMGL7.js} +2 -2
  169. package/dist/cli-bundle/chunks/{chunk-TOBGV45Y.js → chunk-YUKIFPWK.js} +2 -2
  170. package/dist/cli-bundle/chunks/{chunk-72LQ4TKV.js → chunk-YYEZEP3E.js} +3 -3
  171. package/dist/cli-bundle/chunks/{chunk-X3W65QK3.js → chunk-ZEY3XSZQ.js} +5 -5
  172. package/dist/cli-bundle/chunks/{chunk-MWQ2HC2A.js → chunk-ZKOQHLJP.js} +59 -34
  173. package/dist/cli-bundle/chunks/chunk-ZKOQHLJP.js.map +1 -0
  174. package/dist/cli-bundle/chunks/{chunk-QJIKE24M.js → chunk-ZQ3UMKWE.js} +2 -2
  175. package/dist/cli-bundle/chunks/{chunk-4PUUNQDV.js → chunk-ZVVEWHWK.js} +58 -33
  176. package/dist/cli-bundle/chunks/chunk-ZVVEWHWK.js.map +7 -0
  177. package/dist/cli-bundle/chunks/{chunk-OG5DVFMA.js → chunk-ZXE6SNKO.js} +5 -5
  178. package/dist/cli-bundle/chunks/close-GAUIGOQC.js +12 -0
  179. package/dist/cli-bundle/chunks/{close-QEMOYZN3.js → close-SJIEKNY4.js} +5 -5
  180. package/dist/cli-bundle/chunks/{close-many-RZVTUGBG.js → close-many-B6AIC5OQ.js} +15 -14
  181. package/dist/cli-bundle/chunks/close-many-QCINT6I2.js +24 -0
  182. package/dist/cli-bundle/chunks/comments-4SK5EUEJ.js +13 -0
  183. package/dist/cli-bundle/chunks/{comments-TPU7QRBL.js → comments-DM5KV2RS.js} +7 -7
  184. package/dist/cli-bundle/chunks/copy-4KCCLTYQ.js +10 -0
  185. package/dist/cli-bundle/chunks/{copy-DKTSSCK7.js → copy-HEP5SZHB.js} +5 -4
  186. package/dist/cli-bundle/chunks/create-BDKQFPRE.js +30 -0
  187. package/dist/cli-bundle/chunks/{create-EIFBIVNQ.js → create-VCGBCYL2.js} +11 -10
  188. package/dist/cli-bundle/chunks/delete-JWDXPR3H.js +10 -0
  189. package/dist/cli-bundle/chunks/{delete-LCS3VPDH.js → delete-ZSPBTVJD.js} +4 -4
  190. package/dist/cli-bundle/chunks/{deps-YG7UF3VR.js → deps-BZTWWOIE.js} +6 -6
  191. package/dist/cli-bundle/chunks/{deps-UH5EQQUY.js → deps-OVAJOQIE.js} +6 -6
  192. package/dist/cli-bundle/chunks/{docs-G32TK6XS.js → docs-3GFMSWLL.js} +6 -6
  193. package/dist/cli-bundle/chunks/docs-SY2NPT6Y.js +14 -0
  194. package/dist/cli-bundle/chunks/{files-4ALMCSKB.js → files-2SEL4QIU.js} +6 -6
  195. package/dist/cli-bundle/chunks/{files-3H32UQ4K.js → files-FYMMJGNN.js} +6 -6
  196. package/dist/cli-bundle/chunks/focus-4A27YJ2Z.js +10 -0
  197. package/dist/cli-bundle/chunks/{focus-7SOUT5PZ.js → focus-TEUJKTAT.js} +5 -5
  198. package/dist/cli-bundle/chunks/history-compact-7QOKL2NB.js +16 -0
  199. package/dist/cli-bundle/chunks/{history-compact-77BT2LUB.js → history-compact-U7A37VR6.js} +6 -6
  200. package/dist/cli-bundle/chunks/{history-redact-LJPZPNFA.js → history-redact-TNKUO4ZE.js} +4 -4
  201. package/dist/cli-bundle/chunks/{history-redact-PWTTJ3XS.js → history-redact-ZWRUWQY3.js} +4 -4
  202. package/dist/cli-bundle/chunks/{history-repair-I7CBNCV3.js → history-repair-6IU5VWHN.js} +7 -7
  203. package/dist/cli-bundle/chunks/history-repair-GWCGJUM2.js +17 -0
  204. package/dist/cli-bundle/chunks/learnings-DDFAUUX3.js +13 -0
  205. package/dist/cli-bundle/chunks/{learnings-KTYW3AL7.js → learnings-GOEZXMKL.js} +7 -7
  206. package/dist/cli-bundle/chunks/{notes-ZERD3KB2.js → notes-BZWODAEK.js} +7 -7
  207. package/dist/cli-bundle/chunks/notes-OBJ6FL36.js +13 -0
  208. package/dist/cli-bundle/chunks/{plan-OFJUBIM5.js → plan-V57VQTAG.js} +12 -11
  209. package/dist/cli-bundle/chunks/plan-ZMOBD6FX.js +27 -0
  210. package/dist/cli-bundle/chunks/{profile-3THJPIQY.js → profile-BG3N4ETA.js} +9 -9
  211. package/dist/cli-bundle/chunks/{profile-XEZAMMBW.js → profile-XLM45FKV.js} +9 -9
  212. package/dist/cli-bundle/chunks/{register-list-query-BR435Q2H.js → register-list-query-EYYNTGMF.js} +48 -38
  213. package/dist/cli-bundle/chunks/register-list-query-EYYNTGMF.js.map +1 -0
  214. package/dist/cli-bundle/chunks/{register-list-query-RWTWLOBE.js → register-list-query-WGXJPXXY.js} +47 -37
  215. package/dist/cli-bundle/chunks/register-list-query-WGXJPXXY.js.map +7 -0
  216. package/dist/cli-bundle/chunks/{register-mutation-HLWC2WNP.js → register-mutation-3YSDDVOL.js} +131 -105
  217. package/dist/cli-bundle/chunks/register-mutation-3YSDDVOL.js.map +1 -0
  218. package/dist/cli-bundle/chunks/{register-mutation-ZJX5AZM5.js → register-mutation-VDGUMMUY.js} +131 -105
  219. package/dist/cli-bundle/chunks/register-mutation-VDGUMMUY.js.map +7 -0
  220. package/dist/cli-bundle/chunks/{register-operations-744YBJMV.js → register-operations-H4URGAHX.js} +36 -35
  221. package/dist/cli-bundle/chunks/{register-operations-744YBJMV.js.map → register-operations-H4URGAHX.js.map} +1 -1
  222. package/dist/cli-bundle/chunks/{register-operations-UEBJH6AN.js → register-operations-HSO7X77D.js} +34 -33
  223. package/dist/cli-bundle/chunks/{register-operations-UEBJH6AN.js.map → register-operations-HSO7X77D.js.map} +1 -1
  224. package/dist/cli-bundle/chunks/{register-setup-5DA4UZXI.js → register-setup-HZ2KKXK4.js} +13 -13
  225. package/dist/cli-bundle/chunks/{register-setup-6H25M3BH.js → register-setup-WCBKJ3H3.js} +13 -13
  226. package/dist/cli-bundle/chunks/{restore-6TDVSATY.js → restore-3NGRFDPX.js} +7 -6
  227. package/dist/cli-bundle/chunks/restore-LNVNUWHE.js +15 -0
  228. package/dist/cli-bundle/chunks/{schema-TPVTIJPO.js → schema-LMFZ742C.js} +6 -6
  229. package/dist/cli-bundle/chunks/{schema-HFXFSGPG.js → schema-O34O33UW.js} +6 -6
  230. package/dist/cli-bundle/chunks/update-BN6VZSYX.js +24 -0
  231. package/dist/cli-bundle/chunks/{update-LJZCL5SI.js → update-FDLPLKOB.js} +14 -13
  232. package/dist/cli-bundle/chunks/update-many-WCKOPN3K.js +35 -0
  233. package/dist/cli-bundle/chunks/update-many-WCKOPN3K.js.map +7 -0
  234. package/dist/cli-bundle/chunks/update-many-X6DVGOMM.js +39 -0
  235. package/dist/cli-bundle/chunks/update-many-X6DVGOMM.js.map +1 -0
  236. package/dist/cli-bundle/main.js +65 -64
  237. package/dist/cli-bundle/main.js.map +2 -2
  238. package/dist/cli-bundle/sdk-runtime.js +53 -52
  239. package/dist/cli-bundle/sdk-testing.js +6 -6
  240. package/dist/cli-bundle/sdk.js +362 -56
  241. package/dist/cli-bundle/sdk.js.map +4 -4
  242. package/dist/cli.js +10 -4
  243. package/dist/cli.js.map +1 -1
  244. package/dist/core/diagnostics/remediation.js +7 -2
  245. package/dist/core/diagnostics/remediation.js.map +1 -1
  246. package/dist/core/search/background-refresh.d.ts +3 -1
  247. package/dist/core/search/background-refresh.js +34 -6
  248. package/dist/core/search/background-refresh.js.map +1 -1
  249. package/dist/core/search/cache.js +28 -5
  250. package/dist/core/search/cache.js.map +1 -1
  251. package/dist/core/shared/constants.d.ts +2 -0
  252. package/dist/core/shared/constants.js +29 -24
  253. package/dist/core/shared/constants.js.map +1 -1
  254. package/dist/core/store/item-metadata-cache.d.ts +32 -1
  255. package/dist/core/store/item-metadata-cache.js +289 -21
  256. package/dist/core/store/item-metadata-cache.js.map +1 -1
  257. package/dist/core/store/item-store.js +71 -34
  258. package/dist/core/store/item-store.js.map +1 -1
  259. package/dist/core/store/settings.js +9 -3
  260. package/dist/core/store/settings.js.map +1 -1
  261. package/dist/sdk/cli-bootstrap.js +68 -76
  262. package/dist/sdk/cli-bootstrap.js.map +1 -1
  263. package/dist/sdk/compile-cache.d.ts +16 -0
  264. package/dist/sdk/compile-cache.js +73 -0
  265. package/dist/sdk/compile-cache.js.map +1 -0
  266. package/dist/sdk/context-relevance.d.ts +16 -1
  267. package/dist/sdk/context-relevance.js +20 -8
  268. package/dist/sdk/context-relevance.js.map +1 -1
  269. package/dist/sdk/context-signal-store.d.ts +77 -0
  270. package/dist/sdk/context-signal-store.js +201 -0
  271. package/dist/sdk/context-signal-store.js.map +1 -0
  272. package/dist/sdk/dependency-provenance.d.ts +12 -0
  273. package/dist/sdk/dependency-provenance.js +38 -0
  274. package/dist/sdk/dependency-provenance.js.map +1 -0
  275. package/dist/sdk/governance/storage-integrity.d.ts +1 -1
  276. package/dist/sdk/governance/storage-integrity.js +47 -6
  277. package/dist/sdk/governance/storage-integrity.js.map +1 -1
  278. package/dist/sdk/graph/assembly.d.ts +2 -0
  279. package/dist/sdk/graph/assembly.js +51 -4
  280. package/dist/sdk/graph/assembly.js.map +1 -1
  281. package/dist/sdk/graph/run.js +12 -13
  282. package/dist/sdk/graph/run.js.map +1 -1
  283. package/dist/sdk/index.d.ts +5 -0
  284. package/dist/sdk/index.js +7 -2
  285. package/dist/sdk/index.js.map +1 -1
  286. package/dist/sdk/item-metadata-index.d.ts +11 -0
  287. package/dist/sdk/item-metadata-index.js +15 -0
  288. package/dist/sdk/item-metadata-index.js.map +1 -0
  289. package/dist/sdk/merge/index.d.ts +1 -0
  290. package/dist/sdk/merge/index.js +3 -2
  291. package/dist/sdk/merge/index.js.map +1 -1
  292. package/dist/sdk/merge/install.js +25 -9
  293. package/dist/sdk/merge/install.js.map +1 -1
  294. package/dist/sdk/merge/reconcile.d.ts +46 -0
  295. package/dist/sdk/merge/reconcile.js +46 -0
  296. package/dist/sdk/merge/reconcile.js.map +1 -0
  297. package/dist/sdk/query/list.d.ts +5 -4
  298. package/dist/sdk/query/list.js +22 -14
  299. package/dist/sdk/query/list.js.map +1 -1
  300. package/dist/sdk/relationship-history.d.ts +30 -0
  301. package/dist/sdk/relationship-history.js +75 -7
  302. package/dist/sdk/relationship-history.js.map +1 -1
  303. package/dist/sdk/relationship-migration.d.ts +42 -0
  304. package/dist/sdk/relationship-migration.js +78 -0
  305. package/dist/sdk/relationship-migration.js.map +1 -0
  306. package/dist/sdk/structured-mutations.js +4 -25
  307. package/dist/sdk/structured-mutations.js.map +1 -1
  308. package/docs/COMMANDS.md +26 -3
  309. package/docs/CONFIGURATION.md +1 -1
  310. package/docs/MERGE_SAFETY.md +14 -5
  311. package/docs/PERFORMANCE.md +28 -0
  312. package/docs/RELATIONSHIP_GRAPH.md +47 -1
  313. package/docs/SDK.md +78 -5
  314. package/marketplace.json +2 -2
  315. package/package.json +2 -2
  316. package/packages/pm-beads/package.json +1 -1
  317. package/packages/pm-calendar/package.json +1 -1
  318. package/packages/pm-command-kit/package.json +1 -1
  319. package/packages/pm-governance-audit/package.json +1 -1
  320. package/packages/pm-guide-shell/package.json +1 -1
  321. package/packages/pm-kanban/package.json +1 -1
  322. package/packages/pm-lifecycle-hooks/package.json +1 -1
  323. package/packages/pm-linked-test-adapters/package.json +1 -1
  324. package/packages/pm-search-advanced/package.json +1 -1
  325. package/packages/pm-templates/package.json +1 -1
  326. package/packages/pm-todos/package.json +1 -1
  327. package/packages/pm-vcs/package.json +1 -1
  328. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  329. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  330. package/dist/cli-bundle/chunks/append-DFETHAZL.js +0 -11
  331. package/dist/cli-bundle/chunks/chunk-4PUUNQDV.js.map +0 -7
  332. package/dist/cli-bundle/chunks/chunk-4QSQ6XDK.js.map +0 -1
  333. package/dist/cli-bundle/chunks/chunk-7AVEY74G.js.map +0 -7
  334. package/dist/cli-bundle/chunks/chunk-7DOJC3HS.js.map +0 -1
  335. package/dist/cli-bundle/chunks/chunk-7RW4JCU2.js.map +0 -7
  336. package/dist/cli-bundle/chunks/chunk-ADBTSVGK.js.map +0 -7
  337. package/dist/cli-bundle/chunks/chunk-AMJPSANK.js.map +0 -7
  338. package/dist/cli-bundle/chunks/chunk-AS4SAZ5R.js.map +0 -7
  339. package/dist/cli-bundle/chunks/chunk-ATBCUC7Y.js.map +0 -1
  340. package/dist/cli-bundle/chunks/chunk-BKIAH72N.js.map +0 -1
  341. package/dist/cli-bundle/chunks/chunk-FJIFFBJX.js.map +0 -1
  342. package/dist/cli-bundle/chunks/chunk-HYW67VJ5.js.map +0 -1
  343. package/dist/cli-bundle/chunks/chunk-ICDAQ4TD.js.map +0 -1
  344. package/dist/cli-bundle/chunks/chunk-IY6VZ3IW.js.map +0 -7
  345. package/dist/cli-bundle/chunks/chunk-JFD5LPMI.js.map +0 -1
  346. package/dist/cli-bundle/chunks/chunk-K36WV5J6.js.map +0 -1
  347. package/dist/cli-bundle/chunks/chunk-K55VMLSS.js.map +0 -7
  348. package/dist/cli-bundle/chunks/chunk-MWQ2HC2A.js.map +0 -1
  349. package/dist/cli-bundle/chunks/chunk-NUF7ROFH.js.map +0 -1
  350. package/dist/cli-bundle/chunks/chunk-O4BCOJTZ.js.map +0 -7
  351. package/dist/cli-bundle/chunks/chunk-POG76WWZ.js.map +0 -1
  352. package/dist/cli-bundle/chunks/chunk-PQSEQD6E.js.map +0 -1
  353. package/dist/cli-bundle/chunks/chunk-QG4GFLQ6.js.map +0 -7
  354. package/dist/cli-bundle/chunks/chunk-R3P6FZJW.js.map +0 -1
  355. package/dist/cli-bundle/chunks/chunk-RNPZYNHS.js.map +0 -1
  356. package/dist/cli-bundle/chunks/chunk-RPESLSO5.js.map +0 -7
  357. package/dist/cli-bundle/chunks/chunk-SY4SFZSD.js.map +0 -7
  358. package/dist/cli-bundle/chunks/chunk-XJTABV3X.js.map +0 -1
  359. package/dist/cli-bundle/chunks/chunk-YQWCZ5AC.js.map +0 -7
  360. package/dist/cli-bundle/chunks/chunk-Z75ONV25.js.map +0 -7
  361. package/dist/cli-bundle/chunks/chunk-ZTVA4KLN.js.map +0 -7
  362. package/dist/cli-bundle/chunks/close-O5QVZ6ET.js +0 -12
  363. package/dist/cli-bundle/chunks/close-many-5RZXVN4J.js +0 -23
  364. package/dist/cli-bundle/chunks/comments-Z4KV6FU3.js +0 -13
  365. package/dist/cli-bundle/chunks/copy-M7DDI6LS.js +0 -9
  366. package/dist/cli-bundle/chunks/create-RGSPN5GD.js +0 -29
  367. package/dist/cli-bundle/chunks/delete-MD7YXQLH.js +0 -10
  368. package/dist/cli-bundle/chunks/docs-JWWNRC27.js +0 -14
  369. package/dist/cli-bundle/chunks/focus-DRQ6FQH6.js +0 -10
  370. package/dist/cli-bundle/chunks/history-compact-VCKGTX64.js +0 -16
  371. package/dist/cli-bundle/chunks/history-repair-YTDZRK5E.js +0 -17
  372. package/dist/cli-bundle/chunks/learnings-CYNOICKR.js +0 -13
  373. package/dist/cli-bundle/chunks/notes-FGO63FXL.js +0 -13
  374. package/dist/cli-bundle/chunks/plan-SGCDDTYR.js +0 -26
  375. package/dist/cli-bundle/chunks/register-list-query-BR435Q2H.js.map +0 -1
  376. package/dist/cli-bundle/chunks/register-list-query-RWTWLOBE.js.map +0 -7
  377. package/dist/cli-bundle/chunks/register-mutation-HLWC2WNP.js.map +0 -1
  378. package/dist/cli-bundle/chunks/register-mutation-ZJX5AZM5.js.map +0 -7
  379. package/dist/cli-bundle/chunks/restore-RSL7C7LO.js +0 -14
  380. package/dist/cli-bundle/chunks/update-SIA7LH5Y.js +0 -23
  381. package/dist/cli-bundle/chunks/update-many-BDBZVGQL.js +0 -38
  382. package/dist/cli-bundle/chunks/update-many-MOY3A5B3.js +0 -34
  383. /package/dist/cli-bundle/chunks/{append-7OVFYR3C.js.map → append-CYMA7RJT.js.map} +0 -0
  384. /package/dist/cli-bundle/chunks/{append-DFETHAZL.js.map → append-H53CAPMP.js.map} +0 -0
  385. /package/dist/cli-bundle/chunks/{chunk-PFNHX655.js.map → chunk-2P7OK4WG.js.map} +0 -0
  386. /package/dist/cli-bundle/chunks/{chunk-EJDGV4GR.js.map → chunk-3EBGHNNQ.js.map} +0 -0
  387. /package/dist/cli-bundle/chunks/{chunk-DZRV2OPA.js.map → chunk-3EDFN3VV.js.map} +0 -0
  388. /package/dist/cli-bundle/chunks/{chunk-ZOY5K4D3.js.map → chunk-3PWJWLLQ.js.map} +0 -0
  389. /package/dist/cli-bundle/chunks/{chunk-VXOOB6YX.js.map → chunk-3SJAR3CY.js.map} +0 -0
  390. /package/dist/cli-bundle/chunks/{chunk-GTLCVJOE.js.map → chunk-3WVKMF2A.js.map} +0 -0
  391. /package/dist/cli-bundle/chunks/{chunk-LAV26CQG.js.map → chunk-42SYYKA4.js.map} +0 -0
  392. /package/dist/cli-bundle/chunks/{chunk-NLR32VFS.js.map → chunk-4IXLNV7W.js.map} +0 -0
  393. /package/dist/cli-bundle/chunks/{chunk-ABWCF646.js.map → chunk-4YTQVO3V.js.map} +0 -0
  394. /package/dist/cli-bundle/chunks/{chunk-E5XMKOSB.js.map → chunk-5EBRMHI6.js.map} +0 -0
  395. /package/dist/cli-bundle/chunks/{chunk-GKX4NJ7U.js.map → chunk-5K5LHZZX.js.map} +0 -0
  396. /package/dist/cli-bundle/chunks/{chunk-T6PPNM7V.js.map → chunk-5K7BOAB6.js.map} +0 -0
  397. /package/dist/cli-bundle/chunks/{chunk-4QOB7L7I.js.map → chunk-5MUZ54G2.js.map} +0 -0
  398. /package/dist/cli-bundle/chunks/{chunk-SF3DT5HJ.js.map → chunk-5QME4KX2.js.map} +0 -0
  399. /package/dist/cli-bundle/chunks/{chunk-TRSHFPRZ.js.map → chunk-6PM6CPPP.js.map} +0 -0
  400. /package/dist/cli-bundle/chunks/{chunk-OR42SO64.js.map → chunk-7B36A3VT.js.map} +0 -0
  401. /package/dist/cli-bundle/chunks/{chunk-QWRVBJ4D.js.map → chunk-7OR2YKKD.js.map} +0 -0
  402. /package/dist/cli-bundle/chunks/{chunk-FPBMLYPI.js.map → chunk-7QUV54XX.js.map} +0 -0
  403. /package/dist/cli-bundle/chunks/{chunk-WWNL6WMH.js.map → chunk-7WXW6JHG.js.map} +0 -0
  404. /package/dist/cli-bundle/chunks/{chunk-BXNDKOR2.js.map → chunk-A2VL5SVG.js.map} +0 -0
  405. /package/dist/cli-bundle/chunks/{close-QEMOYZN3.js.map → chunk-AXGDUXJW.js.map} +0 -0
  406. /package/dist/cli-bundle/chunks/{chunk-IAQE32BI.js.map → chunk-B2AVNGG3.js.map} +0 -0
  407. /package/dist/cli-bundle/chunks/{chunk-HCEBZNC3.js.map → chunk-BRMPF2RM.js.map} +0 -0
  408. /package/dist/cli-bundle/chunks/{chunk-Z7VWXXJM.js.map → chunk-BTNKMF2A.js.map} +0 -0
  409. /package/dist/cli-bundle/chunks/{chunk-KH44WBAT.js.map → chunk-CD4643VW.js.map} +0 -0
  410. /package/dist/cli-bundle/chunks/{chunk-OWXOPDHD.js.map → chunk-CJEEC5O4.js.map} +0 -0
  411. /package/dist/cli-bundle/chunks/{chunk-PZC2FUOQ.js.map → chunk-CTPKCZCF.js.map} +0 -0
  412. /package/dist/cli-bundle/chunks/{chunk-7W2UAXXT.js.map → chunk-D4OBQVL3.js.map} +0 -0
  413. /package/dist/cli-bundle/chunks/{chunk-EWJWSNRU.js.map → chunk-DM4TYC2A.js.map} +0 -0
  414. /package/dist/cli-bundle/chunks/{chunk-VJQG4BIM.js.map → chunk-DSFTAQ7T.js.map} +0 -0
  415. /package/dist/cli-bundle/chunks/{chunk-AELMUANP.js.map → chunk-DVB6SQU7.js.map} +0 -0
  416. /package/dist/cli-bundle/chunks/{chunk-KBLZ3AA5.js.map → chunk-E3ZWOFSO.js.map} +0 -0
  417. /package/dist/cli-bundle/chunks/{close-O5QVZ6ET.js.map → chunk-EP25DV6P.js.map} +0 -0
  418. /package/dist/cli-bundle/chunks/{chunk-GTK4DTEW.js.map → chunk-F4VCB4WY.js.map} +0 -0
  419. /package/dist/cli-bundle/chunks/{chunk-V22ZPOKN.js.map → chunk-F4XAQUQA.js.map} +0 -0
  420. /package/dist/cli-bundle/chunks/{chunk-QOOTOD3W.js.map → chunk-FGR6IBAF.js.map} +0 -0
  421. /package/dist/cli-bundle/chunks/{chunk-JSLT7WVE.js.map → chunk-FKBMT2Q6.js.map} +0 -0
  422. /package/dist/cli-bundle/chunks/{chunk-QIH77CAG.js.map → chunk-G5RLSSIX.js.map} +0 -0
  423. /package/dist/cli-bundle/chunks/{chunk-P7MTHPJQ.js.map → chunk-GEKRVH3G.js.map} +0 -0
  424. /package/dist/cli-bundle/chunks/{chunk-2L6ZP22J.js.map → chunk-GSP6IZFU.js.map} +0 -0
  425. /package/dist/cli-bundle/chunks/{chunk-ZVZGXPQ5.js.map → chunk-HYZZM3Q2.js.map} +0 -0
  426. /package/dist/cli-bundle/chunks/{chunk-4XGJLADW.js.map → chunk-IHY5SX7O.js.map} +0 -0
  427. /package/dist/cli-bundle/chunks/{chunk-UCBDQI5E.js.map → chunk-IMU7JLUI.js.map} +0 -0
  428. /package/dist/cli-bundle/chunks/{chunk-PEQGTJ5Q.js.map → chunk-JCLXCGIL.js.map} +0 -0
  429. /package/dist/cli-bundle/chunks/{chunk-GROYI4RB.js.map → chunk-JLTHOYR7.js.map} +0 -0
  430. /package/dist/cli-bundle/chunks/{chunk-JHJSFOAM.js.map → chunk-JMPVHM44.js.map} +0 -0
  431. /package/dist/cli-bundle/chunks/{chunk-MATHDCGG.js.map → chunk-JWYG36RV.js.map} +0 -0
  432. /package/dist/cli-bundle/chunks/{chunk-VLRGDBLY.js.map → chunk-KEHOPUHH.js.map} +0 -0
  433. /package/dist/cli-bundle/chunks/{chunk-CPX275C6.js.map → chunk-KPCZL2YK.js.map} +0 -0
  434. /package/dist/cli-bundle/chunks/{chunk-FO6OSVEN.js.map → chunk-LANV45W2.js.map} +0 -0
  435. /package/dist/cli-bundle/chunks/{chunk-LVC72YRD.js.map → chunk-LC5ZUXWE.js.map} +0 -0
  436. /package/dist/cli-bundle/chunks/{chunk-TVYYO5A7.js.map → chunk-MBHYQYCS.js.map} +0 -0
  437. /package/dist/cli-bundle/chunks/{chunk-7656MAUL.js.map → chunk-MUAJHL2R.js.map} +0 -0
  438. /package/dist/cli-bundle/chunks/{chunk-7WCE6Y64.js.map → chunk-NUQCSV4P.js.map} +0 -0
  439. /package/dist/cli-bundle/chunks/{chunk-SZVB53Y3.js.map → chunk-O3GFE2PX.js.map} +0 -0
  440. /package/dist/cli-bundle/chunks/{chunk-OY7DMU5P.js.map → chunk-O43LEUSD.js.map} +0 -0
  441. /package/dist/cli-bundle/chunks/{chunk-LZYP423P.js.map → chunk-OZ25YD4Q.js.map} +0 -0
  442. /package/dist/cli-bundle/chunks/{chunk-VZIZB6QH.js.map → chunk-PKYKQCTJ.js.map} +0 -0
  443. /package/dist/cli-bundle/chunks/{chunk-UZLJOEAC.js.map → chunk-PMRED6QZ.js.map} +0 -0
  444. /package/dist/cli-bundle/chunks/{chunk-K4CI6Y45.js.map → chunk-PWGJCP2V.js.map} +0 -0
  445. /package/dist/cli-bundle/chunks/{chunk-UVN66B3M.js.map → chunk-Q3Z2Y5WJ.js.map} +0 -0
  446. /package/dist/cli-bundle/chunks/{chunk-R7QV7ICM.js.map → chunk-QSXN2FAN.js.map} +0 -0
  447. /package/dist/cli-bundle/chunks/{chunk-5NTE36LD.js.map → chunk-RBECHH5K.js.map} +0 -0
  448. /package/dist/cli-bundle/chunks/{chunk-JXCW2TI2.js.map → chunk-RPNC7M63.js.map} +0 -0
  449. /package/dist/cli-bundle/chunks/{chunk-F2LBF7XJ.js.map → chunk-SUSFH6F7.js.map} +0 -0
  450. /package/dist/cli-bundle/chunks/{chunk-VHXHVTUU.js.map → chunk-TDOPC7UY.js.map} +0 -0
  451. /package/dist/cli-bundle/chunks/{chunk-FSE2IKJQ.js.map → chunk-TWHG646K.js.map} +0 -0
  452. /package/dist/cli-bundle/chunks/{chunk-OCUBRA6D.js.map → chunk-U7U7WGEC.js.map} +0 -0
  453. /package/dist/cli-bundle/chunks/{chunk-PONKZPCJ.js.map → chunk-UFRVIIJ2.js.map} +0 -0
  454. /package/dist/cli-bundle/chunks/{chunk-VNTCM3VW.js.map → chunk-VKX2VZZH.js.map} +0 -0
  455. /package/dist/cli-bundle/chunks/{chunk-6JUTHVQS.js.map → chunk-W2JDNTN3.js.map} +0 -0
  456. /package/dist/cli-bundle/chunks/{chunk-AF2CCM5U.js.map → chunk-XKRVX4B3.js.map} +0 -0
  457. /package/dist/cli-bundle/chunks/{chunk-JGUKMMRS.js.map → chunk-XN4NQZJK.js.map} +0 -0
  458. /package/dist/cli-bundle/chunks/{chunk-3P7UJQOX.js.map → chunk-YKFMLQNK.js.map} +0 -0
  459. /package/dist/cli-bundle/chunks/{chunk-YCIUJJOD.js.map → chunk-YKWKMGL7.js.map} +0 -0
  460. /package/dist/cli-bundle/chunks/{chunk-TOBGV45Y.js.map → chunk-YUKIFPWK.js.map} +0 -0
  461. /package/dist/cli-bundle/chunks/{chunk-72LQ4TKV.js.map → chunk-YYEZEP3E.js.map} +0 -0
  462. /package/dist/cli-bundle/chunks/{chunk-X3W65QK3.js.map → chunk-ZEY3XSZQ.js.map} +0 -0
  463. /package/dist/cli-bundle/chunks/{chunk-QJIKE24M.js.map → chunk-ZQ3UMKWE.js.map} +0 -0
  464. /package/dist/cli-bundle/chunks/{chunk-OG5DVFMA.js.map → chunk-ZXE6SNKO.js.map} +0 -0
  465. /package/dist/cli-bundle/chunks/{close-many-5RZXVN4J.js.map → close-GAUIGOQC.js.map} +0 -0
  466. /package/dist/cli-bundle/chunks/{close-many-RZVTUGBG.js.map → close-SJIEKNY4.js.map} +0 -0
  467. /package/dist/cli-bundle/chunks/{comments-TPU7QRBL.js.map → close-many-B6AIC5OQ.js.map} +0 -0
  468. /package/dist/cli-bundle/chunks/{comments-Z4KV6FU3.js.map → close-many-QCINT6I2.js.map} +0 -0
  469. /package/dist/cli-bundle/chunks/{copy-M7DDI6LS.js.map → comments-4SK5EUEJ.js.map} +0 -0
  470. /package/dist/cli-bundle/chunks/{copy-DKTSSCK7.js.map → comments-DM5KV2RS.js.map} +0 -0
  471. /package/dist/cli-bundle/chunks/{create-RGSPN5GD.js.map → copy-4KCCLTYQ.js.map} +0 -0
  472. /package/dist/cli-bundle/chunks/{create-EIFBIVNQ.js.map → copy-HEP5SZHB.js.map} +0 -0
  473. /package/dist/cli-bundle/chunks/{delete-MD7YXQLH.js.map → create-BDKQFPRE.js.map} +0 -0
  474. /package/dist/cli-bundle/chunks/{delete-LCS3VPDH.js.map → create-VCGBCYL2.js.map} +0 -0
  475. /package/dist/cli-bundle/chunks/{deps-YG7UF3VR.js.map → delete-JWDXPR3H.js.map} +0 -0
  476. /package/dist/cli-bundle/chunks/{deps-UH5EQQUY.js.map → delete-ZSPBTVJD.js.map} +0 -0
  477. /package/dist/cli-bundle/chunks/{docs-JWWNRC27.js.map → deps-BZTWWOIE.js.map} +0 -0
  478. /package/dist/cli-bundle/chunks/{docs-G32TK6XS.js.map → deps-OVAJOQIE.js.map} +0 -0
  479. /package/dist/cli-bundle/chunks/{files-3H32UQ4K.js.map → docs-3GFMSWLL.js.map} +0 -0
  480. /package/dist/cli-bundle/chunks/{files-4ALMCSKB.js.map → docs-SY2NPT6Y.js.map} +0 -0
  481. /package/dist/cli-bundle/chunks/{focus-DRQ6FQH6.js.map → files-2SEL4QIU.js.map} +0 -0
  482. /package/dist/cli-bundle/chunks/{focus-7SOUT5PZ.js.map → files-FYMMJGNN.js.map} +0 -0
  483. /package/dist/cli-bundle/chunks/{history-compact-VCKGTX64.js.map → focus-4A27YJ2Z.js.map} +0 -0
  484. /package/dist/cli-bundle/chunks/{history-compact-77BT2LUB.js.map → focus-TEUJKTAT.js.map} +0 -0
  485. /package/dist/cli-bundle/chunks/{history-redact-PWTTJ3XS.js.map → history-compact-7QOKL2NB.js.map} +0 -0
  486. /package/dist/cli-bundle/chunks/{history-redact-LJPZPNFA.js.map → history-compact-U7A37VR6.js.map} +0 -0
  487. /package/dist/cli-bundle/chunks/{history-repair-I7CBNCV3.js.map → history-redact-TNKUO4ZE.js.map} +0 -0
  488. /package/dist/cli-bundle/chunks/{history-repair-YTDZRK5E.js.map → history-redact-ZWRUWQY3.js.map} +0 -0
  489. /package/dist/cli-bundle/chunks/{learnings-KTYW3AL7.js.map → history-repair-6IU5VWHN.js.map} +0 -0
  490. /package/dist/cli-bundle/chunks/{learnings-CYNOICKR.js.map → history-repair-GWCGJUM2.js.map} +0 -0
  491. /package/dist/cli-bundle/chunks/{notes-FGO63FXL.js.map → learnings-DDFAUUX3.js.map} +0 -0
  492. /package/dist/cli-bundle/chunks/{notes-ZERD3KB2.js.map → learnings-GOEZXMKL.js.map} +0 -0
  493. /package/dist/cli-bundle/chunks/{plan-OFJUBIM5.js.map → notes-BZWODAEK.js.map} +0 -0
  494. /package/dist/cli-bundle/chunks/{plan-SGCDDTYR.js.map → notes-OBJ6FL36.js.map} +0 -0
  495. /package/dist/cli-bundle/chunks/{profile-3THJPIQY.js.map → plan-V57VQTAG.js.map} +0 -0
  496. /package/dist/cli-bundle/chunks/{profile-XEZAMMBW.js.map → plan-ZMOBD6FX.js.map} +0 -0
  497. /package/dist/cli-bundle/chunks/{restore-6TDVSATY.js.map → profile-BG3N4ETA.js.map} +0 -0
  498. /package/dist/cli-bundle/chunks/{restore-RSL7C7LO.js.map → profile-XLM45FKV.js.map} +0 -0
  499. /package/dist/cli-bundle/chunks/{register-setup-5DA4UZXI.js.map → register-setup-HZ2KKXK4.js.map} +0 -0
  500. /package/dist/cli-bundle/chunks/{register-setup-6H25M3BH.js.map → register-setup-WCBKJ3H3.js.map} +0 -0
  501. /package/dist/cli-bundle/chunks/{schema-TPVTIJPO.js.map → restore-3NGRFDPX.js.map} +0 -0
  502. /package/dist/cli-bundle/chunks/{schema-HFXFSGPG.js.map → restore-LNVNUWHE.js.map} +0 -0
  503. /package/dist/cli-bundle/chunks/{update-LJZCL5SI.js.map → schema-LMFZ742C.js.map} +0 -0
  504. /package/dist/cli-bundle/chunks/{update-SIA7LH5Y.js.map → schema-O34O33UW.js.map} +0 -0
  505. /package/dist/cli-bundle/chunks/{update-many-MOY3A5B3.js.map → update-BN6VZSYX.js.map} +0 -0
  506. /package/dist/cli-bundle/chunks/{update-many-BDBZVGQL.js.map → update-FDLPLKOB.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../../sdk/merge/three-way.ts","../../../../../../../../sdk/merge/driver.ts","../../../../../../../../sdk/structured-mutations.ts","../../../../../../../../sdk/item-transaction.ts"],"sourcesContent":["/**\n * @module sdk/merge/three-way\n *\n * Field-aware three-way merge primitives for every mergeable tracker artifact\n * class: append-only history JSONL streams, item documents (TOON or\n * JSON+Markdown), and key-level JSON configuration/schema files. These\n * primitives are pure (content in, content out) so the CLI merge driver, the\n * MCP surface, and package integrations all share one merge semantics\n * definition for multi-branch agent workflows.\n */\nimport {\n historyEntriesToRaw,\n reanchorHistoryEntries,\n} from \"../../core/history/replay.js\";\nimport {\n canonicalDocument,\n parseItemDocument,\n serializeItemDocument,\n type ItemDocumentFormatOptions,\n} from \"../../core/item/item-format.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport { findFirstMergeConflictMarker } from \"../../core/shared/conflict-markers.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { stableStringify } from \"../../core/shared/serialization.js\";\nimport { compareTimestampStrings } from \"../../core/shared/time.js\";\nimport type {\n HistoryEntry,\n ItemDocument,\n ItemMetadata,\n} from \"../../types/index.js\";\n\n/** Restricts which side of a three-way merge wins an unresolvable conflict. */\nexport type MergePreferredSide = \"ours\" | \"theirs\";\n\n/** Restricts the strategy labels reported by the history stream merge. */\nexport type HistoryMergeStrategy =\n | \"identical\"\n | \"fast_forward_ours\"\n | \"fast_forward_theirs\"\n | \"union_reanchor\";\n\n/** Documents the history stream merge result payload exchanged by command, SDK, and package integrations. */\nexport interface HistoryMergeResult {\n /** Merged JSONL content ready to be written as the resolved history stream. */\n merged: string;\n /** Strategy the merge used: identical inputs, one-sided fast-forward, or a deterministic union with a re-anchored hash chain. */\n strategy: HistoryMergeStrategy;\n /** Number of entries shared by both sides before their streams diverged. */\n common_entries: number;\n /** Number of divergent entries contributed by the ours side. */\n entries_from_ours: number;\n /** Number of divergent entries contributed by the theirs side. */\n entries_from_theirs: number;\n /** Total entries in the merged stream. */\n entries_total: number;\n /** Whether the merged chain required hash re-anchoring (true for every union merge). */\n reanchored: boolean;\n}\n\nfunction parseHistoryJsonl(raw: string, label: string): HistoryEntry[] {\n const conflictMarker = findFirstMergeConflictMarker(raw);\n if (conflictMarker) {\n throw new PmCliError(\n `History merge input (${label}) contains unresolved conflict markers at line ${conflictMarker.line}. Merge drivers must receive clean per-side versions.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n const entries: HistoryEntry[] = [];\n for (const [index, rawLine] of raw.split(/\\r?\\n/).entries()) {\n const line = rawLine.trim();\n if (!line) {\n continue;\n }\n try {\n const parsed = JSON.parse(line) as unknown;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new TypeError(\"history entry must be an object\");\n }\n entries.push(parsed as HistoryEntry);\n } catch {\n throw new PmCliError(\n `History merge input (${label}) contains invalid JSON at line ${index + 1}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n }\n return entries;\n}\n\nfunction historyEntryIdentity(entry: HistoryEntry): string {\n return stableStringify({\n ts: entry.ts,\n author: entry.author,\n op: entry.op,\n patch: entry.patch,\n message: entry.message ?? null,\n });\n}\n\nfunction commonHistoryPrefixLength(\n ours: HistoryEntry[],\n theirs: HistoryEntry[],\n): number {\n const limit = Math.min(ours.length, theirs.length);\n let shared = 0;\n while (\n shared < limit &&\n historyEntryIdentity(ours[shared]) === historyEntryIdentity(theirs[shared])\n ) {\n shared += 1;\n }\n return shared;\n}\n\n/**\n * Deterministically merge two diverged versions of one append-only history\n * JSONL stream. Identical streams and one-sided fast-forwards keep the winning\n * side byte-for-byte; genuinely diverged streams are merged as the shared\n * prefix plus both suffixes ordered by timestamp (ours-first on ties), then\n * hash re-anchored so the resulting chain verifies again. No side's events are\n * ever discarded: content divergence is preserved for the post-merge\n * reconciliation pass (`pm validate` + `pm history-repair`) instead of being\n * silently resolved by last-writer-wins.\n */\nexport function mergeHistoryStreams(\n baseRaw: string,\n oursRaw: string,\n theirsRaw: string,\n): HistoryMergeResult {\n parseHistoryJsonl(baseRaw, \"base\");\n const ours = parseHistoryJsonl(oursRaw, \"ours\");\n const theirs = parseHistoryJsonl(theirsRaw, \"theirs\");\n const shared = commonHistoryPrefixLength(ours, theirs);\n\n if (shared === ours.length && shared === theirs.length) {\n return {\n merged: historyEntriesToRaw(ours),\n strategy: \"identical\",\n common_entries: shared,\n entries_from_ours: 0,\n entries_from_theirs: 0,\n entries_total: ours.length,\n reanchored: false,\n };\n }\n if (shared === theirs.length) {\n return {\n merged: historyEntriesToRaw(ours),\n strategy: \"fast_forward_ours\",\n common_entries: shared,\n entries_from_ours: ours.length - shared,\n entries_from_theirs: 0,\n entries_total: ours.length,\n reanchored: false,\n };\n }\n if (shared === ours.length) {\n return {\n merged: historyEntriesToRaw(theirs),\n strategy: \"fast_forward_theirs\",\n common_entries: shared,\n entries_from_ours: 0,\n entries_from_theirs: theirs.length - shared,\n entries_total: theirs.length,\n reanchored: false,\n };\n }\n\n const oursSuffix = ours.slice(shared);\n const seenIdentities = new Set(oursSuffix.map(historyEntryIdentity));\n const theirsSuffix = theirs\n .slice(shared)\n .filter((entry) => !seenIdentities.has(historyEntryIdentity(entry)));\n const mergedSuffix = [...oursSuffix, ...theirsSuffix].sort((left, right) => {\n const byTs = compareTimestampStrings(left.ts, right.ts);\n if (byTs !== 0) {\n return byTs;\n }\n const leftFromOurs = seenIdentities.has(historyEntryIdentity(left));\n const rightFromOurs = seenIdentities.has(historyEntryIdentity(right));\n if (leftFromOurs !== rightFromOurs) {\n return Number(rightFromOurs) - Number(leftFromOurs);\n }\n return historyEntryIdentity(left).localeCompare(historyEntryIdentity(right));\n });\n const reanchored = reanchorHistoryEntries([\n ...ours.slice(0, shared),\n ...mergedSuffix,\n ]);\n return {\n merged: historyEntriesToRaw(reanchored.entries),\n strategy: \"union_reanchor\",\n common_entries: shared,\n entries_from_ours: oursSuffix.length,\n entries_from_theirs: theirsSuffix.length,\n entries_total: reanchored.entries.length,\n reanchored: true,\n };\n}\n\n/** Documents the relationship event stream merge result payload exchanged by command, SDK, and package integrations. */\nexport interface RelationshipStreamMergeResult {\n /** Merged JSONL content with consecutively renumbered `sequence` values, ready to be written as the resolved event store. */\n merged: string;\n /** Strategy the merge used: identical inputs, one-sided fast-forward, or a deterministic union with renumbered sequences. */\n strategy: HistoryMergeStrategy;\n /** Number of events shared by both sides before their streams diverged. */\n common_entries: number;\n /** Number of divergent events contributed by the ours side. */\n entries_from_ours: number;\n /** Number of divergent events contributed by the theirs side. */\n entries_from_theirs: number;\n /** Total events in the merged stream. */\n entries_total: number;\n /** Whether merged events required sequence renumbering (true for every union merge). */\n reanchored: boolean;\n}\n\ninterface RelationshipStreamEvent {\n /** Globally unique event identity used for prefix detection and suffix deduplication. */\n eventId: string;\n /** One-based append sequence; rewritten consecutively in the merged stream. */\n sequence: number;\n /** ISO timestamp used to order divergent suffixes deterministically. */\n timestamp?: string;\n /** Remaining event payload fields, preserved verbatim. */\n [key: string]: unknown;\n}\n\nfunction parseRelationshipJsonl(\n raw: string,\n label: string,\n): RelationshipStreamEvent[] {\n const conflictMarker = findFirstMergeConflictMarker(raw);\n if (conflictMarker) {\n throw new PmCliError(\n `Relationship merge input (${label}) contains unresolved conflict markers at line ${conflictMarker.line}. Merge drivers must receive clean per-side versions.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n const events: RelationshipStreamEvent[] = [];\n for (const [index, rawLine] of raw.split(/\\r?\\n/).entries()) {\n const line = rawLine.trim();\n if (!line) {\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(line) as unknown;\n } catch {\n throw new PmCliError(\n `Relationship merge input (${label}) contains invalid JSON at line ${index + 1}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed) ||\n typeof (parsed as { eventId?: unknown }).eventId !== \"string\" ||\n typeof (parsed as { sequence?: unknown }).sequence !== \"number\"\n ) {\n throw new PmCliError(\n `Relationship merge input (${label}) line ${index + 1} is not a relationship event (eventId + sequence required).`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n events.push(parsed as RelationshipStreamEvent);\n }\n return events;\n}\n\nfunction relationshipEventsToRaw(events: RelationshipStreamEvent[]): string {\n return events.length === 0\n ? \"\"\n : `${events.map((event) => JSON.stringify(event)).join(\"\\n\")}\\n`;\n}\n\nfunction renumberRelationshipEvents(\n events: RelationshipStreamEvent[],\n): RelationshipStreamEvent[] {\n return events.map((event, index) => ({ ...event, sequence: index + 1 }));\n}\n\n/**\n * Deterministically merge two diverged versions of one append-only\n * relationship event JSONL store. The store's loader enforces strictly\n * consecutive one-based `sequence` values, so a plain text union of two\n * diverged streams is always unreadable; this merge keeps the shared prefix,\n * unions both divergent suffixes by `eventId` (ordered by event timestamp,\n * ours-first on ties), and renumbers every merged sequence consecutively so\n * the resulting stream loads again. No side's events are ever discarded.\n */\nexport function mergeRelationshipEventStreams(\n baseRaw: string,\n oursRaw: string,\n theirsRaw: string,\n): RelationshipStreamMergeResult {\n parseRelationshipJsonl(baseRaw, \"base\");\n const ours = parseRelationshipJsonl(oursRaw, \"ours\");\n const theirs = parseRelationshipJsonl(theirsRaw, \"theirs\");\n const limit = Math.min(ours.length, theirs.length);\n let shared = 0;\n while (shared < limit && ours[shared].eventId === theirs[shared].eventId) {\n shared += 1;\n }\n\n if (shared === ours.length && shared === theirs.length) {\n return {\n merged: relationshipEventsToRaw(ours),\n strategy: \"identical\",\n common_entries: shared,\n entries_from_ours: 0,\n entries_from_theirs: 0,\n entries_total: ours.length,\n reanchored: false,\n };\n }\n if (shared === theirs.length) {\n return {\n merged: relationshipEventsToRaw(ours),\n strategy: \"fast_forward_ours\",\n common_entries: shared,\n entries_from_ours: ours.length - shared,\n entries_from_theirs: 0,\n entries_total: ours.length,\n reanchored: false,\n };\n }\n if (shared === ours.length) {\n return {\n merged: relationshipEventsToRaw(theirs),\n strategy: \"fast_forward_theirs\",\n common_entries: shared,\n entries_from_ours: 0,\n entries_from_theirs: theirs.length - shared,\n entries_total: theirs.length,\n reanchored: false,\n };\n }\n\n const oursSuffix = ours.slice(shared);\n const oursEventIds = new Set(oursSuffix.map((event) => event.eventId));\n const theirsSuffix = theirs\n .slice(shared)\n .filter((event) => !oursEventIds.has(event.eventId));\n const mergedSuffix = [...oursSuffix, ...theirsSuffix].sort((left, right) => {\n if (left.timestamp !== undefined && right.timestamp !== undefined) {\n const byTs = compareTimestampStrings(left.timestamp, right.timestamp);\n if (byTs !== 0) {\n return byTs;\n }\n } else if (left.timestamp === undefined && right.timestamp !== undefined) {\n return 1;\n } else if (left.timestamp !== undefined) {\n return -1;\n }\n const leftFromOurs = oursEventIds.has(left.eventId);\n const rightFromOurs = oursEventIds.has(right.eventId);\n if (leftFromOurs !== rightFromOurs) {\n return Number(rightFromOurs) - Number(leftFromOurs);\n }\n // Array.prototype.sort is stable: returning zero preserves each side's\n // original append order when its events share a timestamp.\n return 0;\n });\n const merged = renumberRelationshipEvents([\n ...ours.slice(0, shared),\n ...mergedSuffix,\n ]);\n return {\n merged: relationshipEventsToRaw(merged),\n strategy: \"union_reanchor\",\n common_entries: shared,\n entries_from_ours: oursSuffix.length,\n entries_from_theirs: theirsSuffix.length,\n entries_total: merged.length,\n reanchored: true,\n };\n}\n\n/**\n * Item metadata collections merged by element-identity set semantics instead\n * of whole-field three-way comparison: concurrent commutative appends from two\n * branches (notes on A, tags on B, a test run on each) must merge cleanly.\n * Element identity is the stable serialization of the normalized element, so\n * an element edited on one side counts as remove-old + add-new and both sides'\n * contributions survive. Plan collections are deliberately excluded: plan\n * steps carry cross-element ordering invariants that set-union would corrupt,\n * so they stay under scalar three-way semantics with explicit conflicts.\n */\nexport const ITEM_UNION_COLLECTION_FIELDS = [\n \"tags\",\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"tests\",\n \"test_runs\",\n \"docs\",\n \"reminders\",\n \"events\",\n] as const;\n\n/** Item metadata fields resolved by deterministic latest-timestamp-wins instead of three-way conflict, so disjoint-field edits never conflict on the shared freshness scalar every mutation rewrites. */\nexport const ITEM_LATEST_TIMESTAMP_FIELDS = [\"updated_at\"] as const;\n\n/** Documents the item document merge result payload exchanged by command, SDK, and package integrations. */\nexport interface ItemDocumentMergeResult {\n /** Serialized merged item document (always parseable; count headers recomputed by canonical serialization). */\n merged: string;\n /** Metadata fields (plus `body`) where both sides changed to different values; resolved toward the preferred side. */\n conflict_fields: string[];\n /** Fields taken from the theirs side by clean three-way resolution. */\n fields_from_theirs: string[];\n /** Collection fields that merged by element-identity union. */\n union_fields: string[];\n /** Which side unresolvable conflicts were resolved toward. */\n preferred: MergePreferredSide;\n}\n\nfunction jsonEquals(left: unknown, right: unknown): boolean {\n return stableStringify(left ?? null) === stableStringify(right ?? null);\n}\n\nfunction unionCollection(\n base: unknown,\n ours: unknown,\n theirs: unknown,\n): unknown[] {\n const toEntries = (value: unknown): unknown[] =>\n Array.isArray(value) ? value : [];\n const baseIds = new Set(toEntries(base).map((entry) => stableStringify(entry)));\n const oursEntries = toEntries(ours);\n const oursIds = new Set(oursEntries.map((entry) => stableStringify(entry)));\n const theirsEntries = toEntries(theirs);\n const theirsIds = new Set(\n theirsEntries.map((entry) => stableStringify(entry)),\n );\n const merged = oursEntries.filter((entry) => {\n const identity = stableStringify(entry);\n // An element kept by ours survives unless theirs deleted it (present in\n // base, absent from theirs).\n return !baseIds.has(identity) || theirsIds.has(identity);\n });\n for (const entry of theirsEntries) {\n const identity = stableStringify(entry);\n if (!oursIds.has(identity) && !baseIds.has(identity)) {\n merged.push(entry);\n }\n }\n return merged;\n}\n\nfunction latestTimestamp(ours: unknown, theirs: unknown): unknown {\n return compareTimestampStrings(String(ours), String(theirs)) >= 0\n ? ours\n : theirs;\n}\n\ninterface ScalarMergeOutcome {\n value: unknown;\n from_theirs: boolean;\n conflict: boolean;\n}\n\nfunction mergeScalarThreeWay(\n base: unknown,\n ours: unknown,\n theirs: unknown,\n preferred: MergePreferredSide,\n): ScalarMergeOutcome {\n if (jsonEquals(ours, theirs)) {\n return { value: ours, from_theirs: false, conflict: false };\n }\n if (jsonEquals(base, ours)) {\n return { value: theirs, from_theirs: true, conflict: false };\n }\n if (jsonEquals(base, theirs)) {\n return { value: ours, from_theirs: false, conflict: false };\n }\n return {\n value: preferred === \"theirs\" ? theirs : ours,\n from_theirs: preferred === \"theirs\",\n conflict: true,\n };\n}\n\nfunction toMetadataRecord(document: ItemDocument): Record<string, unknown> {\n return { ...(document.metadata as unknown as Record<string, unknown>) };\n}\n\nfunction parseItemMergeSide(\n raw: string,\n label: string,\n options: ItemDocumentFormatOptions,\n): ItemDocument {\n try {\n return canonicalDocument(parseItemDocument(raw, options), options);\n } catch (error) {\n throw new PmCliError(\n `Item merge input (${label}) is not a readable item document: ${String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n}\n\ninterface ItemMetadataMergeAccumulator {\n /** Merged metadata values keyed by canonical field name. */\n merged: Record<string, unknown>;\n /** Scalar fields where both sides diverged from the base. */\n conflictFields: string[];\n /** Scalar fields cleanly selected from the other branch. */\n fieldsFromTheirs: string[];\n /** Collection fields whose final union differs from ours. */\n unionFields: string[];\n}\n\nfunction mergeItemMetadataRecords(\n baseRecord: Record<string, unknown>,\n oursRecord: Record<string, unknown>,\n theirsRecord: Record<string, unknown>,\n preferred: MergePreferredSide,\n): ItemMetadataMergeAccumulator {\n const unionFieldSet = new Set<string>(ITEM_UNION_COLLECTION_FIELDS);\n const latestFieldSet = new Set<string>(ITEM_LATEST_TIMESTAMP_FIELDS);\n const fieldNames = [\n ...new Set([...Object.keys(oursRecord), ...Object.keys(theirsRecord)]),\n ].sort((left, right) => left.localeCompare(right));\n const accumulator: ItemMetadataMergeAccumulator = {\n merged: {},\n conflictFields: [],\n fieldsFromTheirs: [],\n unionFields: [],\n };\n\n for (const field of fieldNames) {\n const baseValue = baseRecord[field];\n const oursValue = oursRecord[field];\n const theirsValue = theirsRecord[field];\n if (unionFieldSet.has(field)) {\n const union = unionCollection(baseValue, oursValue, theirsValue);\n // `fieldNames` is derived from both records' own keys, so a collection\n // reached here is declared by at least one side. Preserve even an empty\n // result (`tags` is required) so serialization never drops it.\n accumulator.merged[field] = union;\n if (!jsonEquals(union, oursValue)) {\n accumulator.unionFields.push(field);\n }\n continue;\n }\n if (latestFieldSet.has(field)) {\n accumulator.merged[field] = latestTimestamp(oursValue, theirsValue);\n continue;\n }\n const outcome = mergeScalarThreeWay(\n baseValue,\n oursValue,\n theirsValue,\n preferred,\n );\n if (outcome.value !== undefined) {\n accumulator.merged[field] = outcome.value;\n }\n if (outcome.conflict) {\n accumulator.conflictFields.push(field);\n } else if (outcome.from_theirs) {\n accumulator.fieldsFromTheirs.push(field);\n }\n }\n return accumulator;\n}\n\n/**\n * Field-aware three-way merge of one tracker item document. Commutative\n * collections (notes, tags, tests, ...) union by element identity so\n * concurrent appends never conflict; `updated_at` resolves to the latest\n * timestamp so disjoint-field edits never collide on the shared freshness\n * scalar; every other metadata field and the body use classic three-way\n * resolution. Unresolvable both-sides-changed conflicts are resolved toward\n * the preferred side but reported in `conflict_fields`, and the merged output\n * is always canonically serialized — count-prefixed TOON array headers are\n * recomputed, so the hand-resolution corruption class (stale `notes[N]`\n * headers) cannot be produced by this merge.\n */\nexport function mergeItemDocuments(\n baseRaw: string,\n oursRaw: string,\n theirsRaw: string,\n options: ItemDocumentFormatOptions & {\n /** Side that wins unresolvable conflicts (default \"ours\"). */\n preferred?: MergePreferredSide;\n } = {},\n): ItemDocumentMergeResult {\n const preferred: MergePreferredSide = options.preferred ?? \"ours\";\n // An empty base means both branches created the file independently\n // (add/add); three-way falls back to treating every differing field as an\n // ours/theirs decision, which the scalar resolver already models.\n const hasBase = baseRaw.trim().length > 0;\n const ours = parseItemMergeSide(oursRaw, \"ours\", options);\n const theirs = parseItemMergeSide(theirsRaw, \"theirs\", options);\n const base = hasBase ? parseItemMergeSide(baseRaw, \"base\", options) : ours;\n\n const baseRecord = hasBase\n ? toMetadataRecord(base)\n : ({} as Record<string, unknown>);\n const oursRecord = toMetadataRecord(ours);\n const theirsRecord = toMetadataRecord(theirs);\n const { merged, conflictFields, fieldsFromTheirs, unionFields } =\n mergeItemMetadataRecords(baseRecord, oursRecord, theirsRecord, preferred);\n\n const bodyOutcome = mergeScalarThreeWay(\n hasBase ? base.body : \"\",\n ours.body,\n theirs.body,\n preferred,\n );\n if (bodyOutcome.conflict) {\n conflictFields.push(\"body\");\n } else if (bodyOutcome.from_theirs) {\n fieldsFromTheirs.push(\"body\");\n }\n\n const mergedRaw = serializeItemDocument(\n {\n metadata: merged as unknown as ItemMetadata,\n body: bodyOutcome.value as string,\n },\n options,\n );\n return {\n merged: mergedRaw,\n conflict_fields: conflictFields,\n fields_from_theirs: fieldsFromTheirs,\n union_fields: unionFields,\n preferred,\n };\n}\n\n/** Documents the JSON document merge result payload exchanged by command, SDK, and package integrations. */\nexport interface JsonDocumentMergeResult {\n /** Serialized merged JSON document (two-space indent, trailing newline — the tracker's canonical config style). */\n merged: string;\n /** Dotted key paths where both sides changed to different values; resolved toward the preferred side. */\n conflict_paths: string[];\n /** Dotted key paths taken from the theirs side by clean three-way resolution. */\n paths_from_theirs: string[];\n /** Which side unresolvable conflicts were resolved toward. */\n preferred: MergePreferredSide;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n );\n}\n\nfunction parseJsonSide(raw: string, label: string): unknown {\n const conflictMarker = findFirstMergeConflictMarker(raw);\n if (conflictMarker) {\n throw new PmCliError(\n `JSON merge input (${label}) contains unresolved conflict markers at line ${conflictMarker.line}.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n if (raw.trim().length === 0) {\n return undefined;\n }\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n throw new PmCliError(\n `JSON merge input (${label}) is not valid JSON.`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n}\n\nfunction mergeJsonValue(\n base: unknown,\n ours: unknown,\n theirs: unknown,\n preferred: MergePreferredSide,\n pathPrefix: string,\n conflictPaths: string[],\n pathsFromTheirs: string[],\n): unknown {\n if (jsonEquals(ours, theirs)) {\n return ours;\n }\n if (isPlainObject(ours) && isPlainObject(theirs)) {\n const baseObject = isPlainObject(base) ? base : {};\n const merged: Record<string, unknown> = {};\n const keys = [\n ...new Set([...Object.keys(ours), ...Object.keys(theirs)]),\n ].sort((left, right) => left.localeCompare(right));\n for (const key of keys) {\n const childPath = pathPrefix.length > 0 ? `${pathPrefix}.${key}` : key;\n const child = mergeJsonKey(\n baseObject,\n ours,\n theirs,\n key,\n preferred,\n childPath,\n conflictPaths,\n pathsFromTheirs,\n );\n if (child !== undefined) {\n merged[key] = child;\n }\n }\n return merged;\n }\n const outcome = mergeScalarThreeWay(base, ours, theirs, preferred);\n if (outcome.conflict) {\n conflictPaths.push(pathPrefix);\n } else if (outcome.from_theirs) {\n pathsFromTheirs.push(pathPrefix);\n }\n return outcome.value;\n}\n\nfunction mergeJsonKey(\n base: Record<string, unknown>,\n ours: Record<string, unknown>,\n theirs: Record<string, unknown>,\n key: string,\n preferred: MergePreferredSide,\n childPath: string,\n conflictPaths: string[],\n pathsFromTheirs: string[],\n): unknown {\n const inOurs = Object.prototype.hasOwnProperty.call(ours, key);\n const inTheirs = Object.prototype.hasOwnProperty.call(theirs, key);\n const inBase = Object.prototype.hasOwnProperty.call(base, key);\n if (inOurs && inTheirs) {\n return mergeJsonValue(\n base[key],\n ours[key],\n theirs[key],\n preferred,\n childPath,\n conflictPaths,\n pathsFromTheirs,\n );\n }\n if (inOurs) {\n // Present only in ours: either ours added it (keep) or theirs deleted it\n // (honor the delete when ours left it untouched from base).\n if (inBase && jsonEquals(base[key], ours[key])) {\n pathsFromTheirs.push(childPath);\n return undefined;\n }\n if (inBase) {\n conflictPaths.push(childPath);\n return preferred === \"theirs\" ? undefined : ours[key];\n }\n return ours[key];\n }\n // Present only in theirs (mirror of the branch above).\n if (inBase && jsonEquals(base[key], theirs[key])) {\n return undefined;\n }\n if (inBase) {\n conflictPaths.push(childPath);\n return preferred === \"theirs\" ? theirs[key] : undefined;\n }\n pathsFromTheirs.push(childPath);\n return theirs[key];\n}\n\n/**\n * Key-level three-way merge for the tracker's single-file JSON configuration\n * artifacts (`settings.json`, `schema/*.json`). Nested objects merge\n * recursively per key so two branches editing disjoint settings never\n * conflict; both-sides-changed leaf values resolve toward the preferred side\n * and are reported in `conflict_paths`. The output is always valid JSON, so a\n * merged configuration can never regress into the silent-defaults fallback\n * that raw conflict markers cause.\n */\nexport function mergeJsonDocuments(\n baseRaw: string,\n oursRaw: string,\n theirsRaw: string,\n options: {\n /** Side that wins unresolvable conflicts (default \"ours\"). */\n preferred?: MergePreferredSide;\n } = {},\n): JsonDocumentMergeResult {\n const preferred: MergePreferredSide = options.preferred ?? \"ours\";\n const base = parseJsonSide(baseRaw, \"base\");\n const ours = parseJsonSide(oursRaw, \"ours\");\n const theirs = parseJsonSide(theirsRaw, \"theirs\");\n const conflictPaths: string[] = [];\n const pathsFromTheirs: string[] = [];\n const merged = mergeJsonValue(\n base,\n ours,\n theirs,\n preferred,\n \"\",\n conflictPaths,\n pathsFromTheirs,\n );\n return {\n merged: `${JSON.stringify(merged ?? null, null, 2)}\\n`,\n conflict_paths: conflictPaths,\n paths_from_theirs: pathsFromTheirs,\n preferred,\n };\n}\n","/**\n * @module sdk/merge/driver\n *\n * File-level git merge driver runner for tracker artifacts. Git invokes the\n * driver with the base (%O), ours (%A), and theirs (%B) temporary files; the\n * driver writes the merged content back to the ours path and reports whether\n * unresolvable conflicts remain. Conflicted artifacts are still written as\n * parseable documents (resolved toward the preferred side) so a conflicted\n * merge never corrupts tracker storage the way raw conflict markers do.\n */\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { collectRegisteredItemFieldNames } from \"../../core/extensions/item-fields.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { nowIso } from \"../../core/shared/time.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemFormat, PmSettings } from \"../../types/index.js\";\nimport {\n mergeHistoryStreams,\n mergeItemDocuments,\n mergeJsonDocuments,\n mergeRelationshipEventStreams,\n type MergePreferredSide,\n} from \"./three-way.js\";\n\n/** Supported values accepted by the merge driver artifact contract across CLI, SDK, and MCP surfaces. */\nexport const MERGE_DRIVER_ARTIFACT_VALUES = [\n \"item\",\n \"history\",\n \"relationship\",\n \"json\",\n] as const;\n/** Restricts merge driver artifact values accepted by command, SDK, and storage contracts. */\nexport type MergeDriverArtifact = (typeof MERGE_DRIVER_ARTIFACT_VALUES)[number];\n\n/** Documents the merge driver options payload exchanged by command, SDK, and package integrations. */\nexport interface MergeDriverOptions {\n /** Artifact class being merged: item document, history JSONL stream, relationship event JSONL store, or key-level JSON config. */\n artifact: string;\n /** Path to the common-ancestor version (git %O). */\n basePath: string;\n /** Path to the current-branch version (git %A); also the default output path per the git merge-driver protocol. */\n oursPath: string;\n /** Path to the other-branch version (git %B). */\n theirsPath: string;\n /** Optional explicit output path overriding the git default of writing to the ours path. */\n outputPath?: string;\n /** Original repository-relative item path supplied by Git as `%P`, used to detect item format when temporary side paths lack extensions. */\n itemPath?: string;\n /** Side that wins unresolvable conflicts (default \"ours\"). */\n prefer?: string;\n}\n\n/** Documents the merge driver result payload exchanged by command, SDK, and package integrations. */\nexport interface MergeDriverResult {\n /** Whether the merge completed without unresolvable conflicts. */\n ok: boolean;\n /** Artifact class that was merged. */\n artifact: MergeDriverArtifact;\n /** Path the merged content was written to. */\n output_path: string;\n /** Side unresolvable conflicts were resolved toward. */\n preferred: MergePreferredSide;\n /** Unresolvable conflict labels: metadata field names (item), dotted key paths (json). Empty for history merges. */\n conflicts: string[];\n /** History-merge strategy and entry accounting; present only for the history artifact. */\n history?: {\n strategy: string;\n common_entries: number;\n entries_from_ours: number;\n entries_from_theirs: number;\n entries_total: number;\n reanchored: boolean;\n };\n /** Relationship-event-merge strategy and accounting; present only for the relationship artifact. */\n relationship?: {\n strategy: string;\n common_entries: number;\n entries_from_ours: number;\n entries_from_theirs: number;\n entries_total: number;\n reanchored: boolean;\n };\n /** Item-merge field accounting; present only for the item artifact. */\n item?: {\n fields_from_theirs: string[];\n union_fields: string[];\n };\n /** JSON-merge key accounting; present only for the json artifact. */\n json?: {\n paths_from_theirs: string[];\n };\n /** Guidance for resolving remaining conflicts or verifying the merged workspace. */\n guidance: string[];\n /** ISO 8601 timestamp recording when generated occurred. */\n generated_at: string;\n}\n\nfunction resolveArtifact(value: string): MergeDriverArtifact {\n const normalized = value.trim().toLowerCase();\n if (\n (MERGE_DRIVER_ARTIFACT_VALUES as readonly string[]).includes(normalized)\n ) {\n return normalized as MergeDriverArtifact;\n }\n throw new PmCliError(\n `Unknown merge artifact \"${value}\". Supported values: ${MERGE_DRIVER_ARTIFACT_VALUES.join(\", \")}.`,\n EXIT_CODE.USAGE,\n );\n}\n\nfunction resolvePreferredSide(value: string | undefined): MergePreferredSide {\n if (value === undefined) {\n return \"ours\";\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === \"ours\" || normalized === \"theirs\") {\n return normalized;\n }\n throw new PmCliError(\n `Unknown --prefer value \"${value}\". Supported values: ours, theirs.`,\n EXIT_CODE.USAGE,\n );\n}\n\nasync function readSideFile(filePath: string, label: string): Promise<string> {\n try {\n return await readFile(filePath, \"utf8\");\n } catch {\n throw new PmCliError(\n `Cannot read merge ${label} file at ${filePath}.`,\n EXIT_CODE.NOT_FOUND,\n );\n }\n}\n\n/**\n * Load the workspace settings when a tracker is initialized at the resolved pm\n * root, or fall back to format defaults when the driver runs outside a tracker\n * (git can invoke merge drivers before `pm init`, e.g. while rebasing the\n * commit that introduces the tracker).\n */\nasync function loadOptionalSettings(\n global: GlobalOptions,\n): Promise<PmSettings | null> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n return null;\n }\n return readSettings(pmRoot);\n}\n\nfunction itemFormatForPath(\n filePath: string,\n settings: PmSettings | null,\n): ItemFormat {\n if (filePath.endsWith(\".md\")) {\n return \"json_markdown\";\n }\n if (filePath.endsWith(\".toon\")) {\n return \"toon\";\n }\n return settings?.item_format ?? \"toon\";\n}\n\n/**\n * Execute one git merge-driver invocation for a tracker artifact. Reads the\n * three per-side versions, applies the artifact's field-aware merge semantics,\n * writes the merged content (parseable even when conflicted) to the output\n * path, and reports remaining conflicts so the CLI can exit non-zero and let\n * git mark the path unmerged.\n */\nexport async function runMergeDriver(\n options: MergeDriverOptions,\n global: GlobalOptions,\n): Promise<MergeDriverResult> {\n const artifact = resolveArtifact(options.artifact);\n const preferred = resolvePreferredSide(options.prefer);\n const outputPath = path.resolve(options.outputPath ?? options.oursPath);\n const [baseRaw, oursRaw, theirsRaw] = await Promise.all([\n readSideFile(options.basePath, \"base\"),\n readSideFile(options.oursPath, \"ours\"),\n readSideFile(options.theirsPath, \"theirs\"),\n ]);\n\n let merged: string;\n const conflicts: string[] = [];\n const result: Partial<MergeDriverResult> = {};\n if (artifact === \"history\") {\n const historyMerge = mergeHistoryStreams(baseRaw, oursRaw, theirsRaw);\n merged = historyMerge.merged;\n result.history = {\n strategy: historyMerge.strategy,\n common_entries: historyMerge.common_entries,\n entries_from_ours: historyMerge.entries_from_ours,\n entries_from_theirs: historyMerge.entries_from_theirs,\n entries_total: historyMerge.entries_total,\n reanchored: historyMerge.reanchored,\n };\n } else if (artifact === \"relationship\") {\n const relationshipMerge = mergeRelationshipEventStreams(\n baseRaw,\n oursRaw,\n theirsRaw,\n );\n merged = relationshipMerge.merged;\n result.relationship = {\n strategy: relationshipMerge.strategy,\n common_entries: relationshipMerge.common_entries,\n entries_from_ours: relationshipMerge.entries_from_ours,\n entries_from_theirs: relationshipMerge.entries_from_theirs,\n entries_total: relationshipMerge.entries_total,\n reanchored: relationshipMerge.reanchored,\n };\n } else if (artifact === \"item\") {\n const settings = await loadOptionalSettings(global);\n const itemMerge = mergeItemDocuments(baseRaw, oursRaw, theirsRaw, {\n format: itemFormatForPath(options.itemPath ?? outputPath, settings),\n schema: settings?.schema,\n extensionFieldNames: collectRegisteredItemFieldNames(\n getActiveExtensionRegistrations(),\n ),\n preferred,\n });\n merged = itemMerge.merged;\n conflicts.push(...itemMerge.conflict_fields);\n result.item = {\n fields_from_theirs: itemMerge.fields_from_theirs,\n union_fields: itemMerge.union_fields,\n };\n } else {\n const jsonMerge = mergeJsonDocuments(baseRaw, oursRaw, theirsRaw, {\n preferred,\n });\n merged = jsonMerge.merged;\n conflicts.push(...jsonMerge.conflict_paths);\n result.json = {\n paths_from_theirs: jsonMerge.paths_from_theirs,\n };\n }\n\n await writeFile(outputPath, merged, \"utf8\");\n const guidance: string[] = [];\n if (conflicts.length > 0) {\n guidance.push(\n `Both branches changed ${conflicts.join(\", \")}; the ${preferred} value was kept. Review the merged file, re-apply the losing change if needed, then \"git add\" it.`,\n );\n }\n if (artifact === \"history\" && result.history?.reanchored) {\n guidance.push(\n 'The merged history chain was re-anchored. Run \"pm validate --check-history-drift\" and \"pm history-repair --all\" after the merge to reconcile item state with merged history.',\n );\n }\n return {\n ok: conflicts.length === 0,\n artifact,\n output_path: outputPath,\n preferred,\n conflicts,\n ...result,\n guidance,\n generated_at: nowIso(),\n };\n}\n","/**\n * @module sdk/structured-mutations\n *\n * Parses agent-authored JSON mutation payloads into the public atomic item\n * transaction contract and normalizes full item documents for CLI round trips.\n */\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\nimport { levenshteinDistanceWithinLimit } from \"../core/shared/levenshtein.js\";\nimport { CLOSE_FLAG_CONTRACTS } from \"./cli-contracts/flag-contracts.js\";\nimport {\n CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS,\n UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS,\n} from \"./cli-contracts/commander-mutation-options.js\";\nimport type { PmClientFullMutationOptions } from \"./runtime.js\";\nimport type { BulkItemMutation } from \"./item-transaction.js\";\n\nconst MUTATION_ROW_KEYS = [\"op\", \"id\", \"reason\", \"options\"] as const;\nconst ITEM_ENVELOPE_KEYS = [\n \"item\",\n \"linked\",\n \"schedule\",\n \"claim_state\",\n \"children\",\n] as const;\nconst READ_ONLY_ITEM_KEYS = new Set([\n \"created_at\",\n \"updated_at\",\n \"closed_at\",\n \"version\",\n \"format_version\",\n \"path\",\n \"author\",\n]);\nconst UPDATE_READ_ONLY_ITEM_KEYS = new Set([...READ_ONLY_ITEM_KEYS, \"id\"]);\nconst ITEM_FIELD_KEYS = new Set([\n \"id\",\n \"title\",\n \"description\",\n \"type\",\n \"status\",\n \"priority\",\n \"tags\",\n \"body\",\n \"deadline\",\n \"estimated_minutes\",\n \"acceptance_criteria\",\n \"definition_of_ready\",\n \"order\",\n \"rank\",\n \"goal\",\n \"objective\",\n \"value\",\n \"impact\",\n \"outcome\",\n \"why_now\",\n \"assignee\",\n \"parent\",\n \"reviewer\",\n \"risk\",\n \"confidence\",\n \"sprint\",\n \"release\",\n \"blocked_by\",\n \"blocked_reason\",\n \"unblock_note\",\n \"reporter\",\n \"severity\",\n \"environment\",\n \"repro_steps\",\n \"resolution\",\n \"expected_result\",\n \"actual_result\",\n \"affected_version\",\n \"fixed_version\",\n \"component\",\n \"regression\",\n \"customer_impact\",\n \"close_reason\",\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"tests\",\n \"docs\",\n \"reminders\",\n \"events\",\n \"type_options\",\n]);\nconst MUTATION_OPTION_KEYS: Readonly<\n Record<BulkItemMutation[\"op\"], readonly string[]>\n> = {\n create: CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS.map(\n (contract) => contract.target,\n ),\n update: UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS.map(\n (contract) => contract.target,\n ),\n close: CLOSE_FLAG_CONTRACTS.map((contract) =>\n contract.flag\n .slice(2)\n .replaceAll(/-([a-z])/gu, (_match, letter: string) =>\n letter.toUpperCase(),\n ),\n ).filter((key) => key !== \"reason\"),\n};\n\n/** Validated transaction controls shared by atomic CLI and MCP adapters. */\nexport interface AtomicMutationControls {\n /** Compensation policy applied to created items when a later step fails. */\n createCompensation?: \"close\" | \"delete\";\n /** Workspace transaction lock lifetime in seconds. */\n lockTtlSeconds?: number;\n /** Maximum time to wait for the workspace transaction lock. */\n lockWaitMs?: number;\n}\n\n/** Validate and normalize atomic transaction controls at every transport boundary. */\nexport function parseAtomicMutationControls(\n value: Record<string, unknown>,\n): AtomicMutationControls {\n const controls: AtomicMutationControls = {};\n const compensation = value.createCompensation;\n if (compensation !== undefined) {\n if (compensation !== \"close\" && compensation !== \"delete\") {\n throw new PmCliError(\n \"createCompensation must be close or delete.\",\n EXIT_CODE.USAGE,\n );\n }\n controls.createCompensation = compensation;\n }\n for (const key of [\"lockTtlSeconds\", \"lockWaitMs\"] as const) {\n const raw = value[key];\n if (raw === undefined) continue;\n const parsed =\n typeof raw === \"number\" ||\n (typeof raw === \"string\" && raw.trim().length > 0)\n ? Number(raw)\n : Number.NaN;\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new PmCliError(\n `${key} must be a positive safe integer.`,\n EXIT_CODE.USAGE,\n );\n }\n controls[key] = parsed;\n }\n return controls;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction nearestKey(\n key: string,\n candidates: readonly string[],\n): string | undefined {\n const limit = Math.max(1, Math.min(3, Math.floor(key.length / 4) + 1));\n let best: { key: string; distance: number } | undefined;\n for (const candidate of candidates) {\n const distance = levenshteinDistanceWithinLimit(key, candidate, limit);\n if (distance !== null && (best === undefined || distance < best.distance)) {\n best = { key: candidate, distance };\n }\n }\n return best?.key;\n}\n\nfunction unknownKeyError(\n scope: string,\n key: string,\n candidates: readonly string[],\n): PmCliError {\n const suggestion = nearestKey(key, candidates);\n return new PmCliError(\n suggestion === undefined\n ? `${scope} does not recognize key \"${key}\". Allowed keys: ${candidates.join(\", \")}.`\n : `${scope} does not recognize key \"${key}\". Did you mean \"${suggestion}\"?`,\n EXIT_CODE.USAGE,\n {\n code: \"stdin_json_unknown_key\",\n required: `Use documented ${scope} keys only.`,\n why: \"Strict structured input prevents silent typos from creating incomplete or unintended mutations.\",\n nextSteps: [\n suggestion === undefined\n ? `Remove or correct \"${key}\".`\n : `Replace \"${key}\" with \"${suggestion}\".`,\n ],\n },\n );\n}\n\nfunction parseJsonValue(input: string, label: string): unknown {\n try {\n return JSON.parse(input) as unknown;\n } catch (error: unknown) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new PmCliError(\n `${label} must be valid JSON: ${detail}`,\n EXIT_CODE.USAGE,\n {\n code: \"stdin_json_invalid\",\n required: `Pipe one valid JSON ${label.toLowerCase()} into stdin.`,\n why: \"Structured mutation input must parse deterministically before any tracker write begins.\",\n },\n );\n }\n}\n\nfunction validateMutationObject(\n value: unknown,\n index: number,\n): Record<string, unknown> {\n if (!isPlainObject(value)) {\n throw new PmCliError(\n `Mutation ${index + 1} must be an object.`,\n EXIT_CODE.USAGE,\n );\n }\n for (const key of Object.keys(value)) {\n if (\n !MUTATION_ROW_KEYS.includes(key as (typeof MUTATION_ROW_KEYS)[number])\n ) {\n throw unknownKeyError(`mutation ${index + 1}`, key, MUTATION_ROW_KEYS);\n }\n }\n return value;\n}\n\nfunction validateMutationOptions(\n options: unknown,\n op: BulkItemMutation[\"op\"],\n index: number,\n): Record<string, unknown> | undefined {\n if (options === undefined) return undefined;\n if (!isPlainObject(options)) {\n throw new PmCliError(\n `Mutation ${index + 1} options must be an object.`,\n EXIT_CODE.USAGE,\n );\n }\n for (const key of Object.keys(options)) {\n if (!MUTATION_OPTION_KEYS[op].includes(key)) {\n throw unknownKeyError(\n `mutation ${index + 1} ${op} options`,\n key,\n MUTATION_OPTION_KEYS[op],\n );\n }\n }\n return options;\n}\n\nfunction validateMutationRow(value: unknown, index: number): BulkItemMutation {\n const mutation = validateMutationObject(value, index);\n const { op, id, reason } = mutation;\n if (op !== \"create\" && op !== \"update\" && op !== \"close\") {\n throw new PmCliError(\n `Mutation ${index + 1} op must be create, update, or close.`,\n EXIT_CODE.USAGE,\n );\n }\n const options = validateMutationOptions(mutation.options, op, index);\n if (typeof id !== \"string\" || id.trim().length === 0) {\n throw new PmCliError(\n `Mutation ${index + 1} requires a non-empty id.`,\n EXIT_CODE.USAGE,\n );\n }\n const normalizedId = id.trim();\n if (op === \"close\") {\n if (typeof reason !== \"string\" || reason.trim().length === 0) {\n throw new PmCliError(\n `Mutation ${index + 1} close requires a non-empty reason.`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n op,\n id: normalizedId,\n reason: reason.trim(),\n ...(options === undefined\n ? {}\n : { options: options as PmClientFullMutationOptions }),\n };\n }\n if (!isPlainObject(options)) {\n throw new PmCliError(\n `Mutation ${index + 1} ${op} requires an options object.`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n op,\n id: normalizedId,\n options: options as PmClientFullMutationOptions,\n };\n}\n\n/** Parse a JSON array, or an object containing `mutations`, into an atomic mutation batch. */\nexport function parseItemMutationBatch(input: string): BulkItemMutation[] {\n const parsed = parseJsonValue(input, \"Mutation batch\");\n const rows = Array.isArray(parsed)\n ? parsed\n : isPlainObject(parsed) && Array.isArray(parsed.mutations)\n ? parsed.mutations\n : undefined;\n if (rows === undefined || rows.length === 0) {\n throw new PmCliError(\n \"Mutation batch must be a non-empty JSON array or an object with a non-empty mutations array.\",\n EXIT_CODE.USAGE,\n );\n }\n return rows.map((row, index) => validateMutationRow(row, index));\n}\n\nfunction serializePairs(\n value: Record<string, unknown>,\n keys: readonly string[],\n): string {\n return keys\n .filter((key) => value[key] !== undefined && value[key] !== null)\n .map((key) => {\n const rendered = String(value[key]);\n return `${key}=${/[\",\\n\\r\\\\]/u.test(rendered) ? JSON.stringify(rendered) : rendered}`;\n })\n .join(\",\");\n}\n\nfunction serializeObjectArray(\n value: unknown,\n keys: readonly string[],\n label: string,\n): string[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value) || !value.every(isPlainObject)) {\n throw new PmCliError(\n `${label} must be an array of objects.`,\n EXIT_CODE.USAGE,\n );\n }\n return value.map((entry) => serializePairs(entry, keys));\n}\n\nfunction scalarItemOption(key: string, value: unknown): unknown {\n if (\n key === \"tags\" &&\n Array.isArray(value) &&\n value.every((entry) => typeof entry === \"string\")\n ) {\n return JSON.stringify(value);\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n return value;\n}\n\nfunction appendFacetOptions(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n skipPersistedAnnotations = false,\n): void {\n const mappings: ReadonlyArray<readonly [string, string, readonly string[]]> =\n [\n [\"dependencies\", \"dep\", [\"id\", \"kind\", \"created_at\", \"author\"]],\n [\"comments\", \"comment\", [\"text\", \"created_at\", \"author\"]],\n [\"notes\", \"note\", [\"text\", \"created_at\", \"author\"]],\n [\"learnings\", \"learning\", [\"text\", \"created_at\", \"author\"]],\n [\"files\", \"file\", [\"path\", \"scope\", \"note\"]],\n [\"tests\", \"test\", [\"command\", \"scope\", \"timeout_seconds\"]],\n [\"docs\", \"doc\", [\"path\", \"scope\", \"note\"]],\n [\"reminders\", \"reminder\", [\"at\", \"text\", \"created_at\"]],\n [\"events\", \"event\", [\"start_at\", \"end_at\", \"title\", \"location\"]],\n [\"type_options\", \"typeOption\", [\"key\", \"value\"]],\n ];\n for (const [sourceKey, targetKey, keys] of mappings) {\n const sourceValue = source[sourceKey];\n const serialized = serializeObjectArray(\n skipPersistedAnnotations &&\n [\"comments\", \"notes\", \"learnings\"].includes(sourceKey) &&\n Array.isArray(sourceValue)\n ? sourceValue.filter(\n (entry) =>\n !isPlainObject(entry) || entry.created_at === undefined,\n )\n : sourceValue,\n keys,\n sourceKey,\n );\n if (serialized !== undefined && serialized.length > 0)\n target[targetKey] = serialized;\n }\n}\n\nfunction validateItemDocumentKeys(\n parsed: Record<string, unknown>,\n envelope: boolean,\n): void {\n for (const key of Object.keys(parsed)) {\n if (envelope) {\n if (\n !ITEM_ENVELOPE_KEYS.includes(key as (typeof ITEM_ENVELOPE_KEYS)[number])\n )\n throw unknownKeyError(\"item envelope\", key, ITEM_ENVELOPE_KEYS);\n continue;\n }\n if (\n !ITEM_FIELD_KEYS.has(key) &&\n nearestKey(key, [...ITEM_FIELD_KEYS]) === undefined &&\n nearestKey(key, ITEM_ENVELOPE_KEYS) === \"item\"\n )\n throw unknownKeyError(\"item envelope\", key, ITEM_ENVELOPE_KEYS);\n }\n}\n\nfunction resolveItemDocument(parsed: Record<string, unknown>): {\n item: Record<string, unknown>;\n linked?: Record<string, unknown>;\n} {\n const envelope = Object.hasOwn(parsed, \"item\");\n validateItemDocumentKeys(parsed, envelope);\n const item = envelope ? parsed.item : parsed;\n if (!isPlainObject(item)) {\n throw new PmCliError(\n \"Item document item must be an object.\",\n EXIT_CODE.USAGE,\n );\n }\n return {\n item,\n ...(envelope && isPlainObject(parsed.linked)\n ? { linked: parsed.linked }\n : {}),\n };\n}\n\nfunction appendItemDocumentEntry(\n documentOptions: Record<string, unknown>,\n key: string,\n value: unknown,\n mode: \"create\" | \"update\",\n): void {\n const readOnlyKeys =\n mode === \"update\" ? UPDATE_READ_ONLY_ITEM_KEYS : READ_ONLY_ITEM_KEYS;\n if (readOnlyKeys.has(key)) return;\n if (!ITEM_FIELD_KEYS.has(key)) {\n const suggestion = nearestKey(key, [...ITEM_FIELD_KEYS]);\n if (suggestion !== undefined)\n throw unknownKeyError(\"item document\", key, [...ITEM_FIELD_KEYS]);\n const fields = Array.isArray(documentOptions.field)\n ? (documentOptions.field as string[])\n : [];\n fields.push(\n serializePairs(\n {\n key,\n value: typeof value === \"string\" ? value : JSON.stringify(value),\n },\n [\"key\", \"value\"],\n ),\n );\n documentOptions.field = fields;\n return;\n }\n if (\n [\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"tests\",\n \"docs\",\n \"reminders\",\n \"events\",\n \"type_options\",\n ].includes(key)\n )\n return;\n documentOptions[\n key.replaceAll(/_([a-z])/gu, (_match, letter: string) =>\n letter.toUpperCase(),\n )\n ] = scalarItemOption(key, value);\n}\n\n/**\n * Convert a direct item JSON document or `pm get --json` envelope into the\n * create/update option shape. Explicit CLI flags override document values.\n */\nexport function itemDocumentToMutationOptions(\n input: string,\n mode: \"create\" | \"update\",\n explicitOptions: Record<string, unknown> = {},\n): Record<string, unknown> {\n const parsed = parseJsonValue(input, \"Item document\");\n if (!isPlainObject(parsed)) {\n throw new PmCliError(\n \"Item document must be a JSON object.\",\n EXIT_CODE.USAGE,\n );\n }\n const { item, linked } = resolveItemDocument(parsed);\n const documentOptions: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(item)) {\n appendItemDocumentEntry(documentOptions, key, value, mode);\n }\n appendFacetOptions(documentOptions, item, mode === \"update\");\n if (linked !== undefined) appendFacetOptions(documentOptions, linked);\n return {\n ...documentOptions,\n ...Object.fromEntries(\n Object.entries(explicitOptions).filter(\n ([, value]) => value !== undefined,\n ),\n ),\n stdinJson: undefined,\n };\n}\n\n/** Validate an already-decoded MCP mutation array through the same strict parser as CLI stdin. */\nexport function validateItemMutationRows(value: unknown): BulkItemMutation[] {\n return parseItemMutationBatch(JSON.stringify(value));\n}\n","/**\n * @module sdk/item-transaction\n *\n * Provides the bulk item-mutation convenience layer over\n * `commitWorkspaceTransaction`: atomic, resumable create/update/close batches\n * with correct-by-construction inspection and compensation wiring.\n */\nimport path from \"node:path\";\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\nimport { readHistoryEntries } from \"./history-read.js\";\nimport {\n close,\n create,\n deleteItem,\n get,\n restore,\n update,\n type PmClientFullMutationOptions,\n} from \"./runtime.js\";\nimport {\n commitWorkspaceTransaction,\n type CommitWorkspaceTransactionOptions,\n type WorkspaceTransactionJsonValue,\n type WorkspaceTransactionStep,\n type WorkspaceTransactionStepInspection,\n} from \"./workspace-transaction.js\";\n\n/**\n * One atomic item creation inside a bulk mutation batch. The explicit `id`\n * doubles as the idempotency key: recovery treats an existing item with this id\n * as the already-applied result, so ids must be stable and transaction-owned.\n */\nexport interface BulkItemCreateMutation {\n /** Discriminates the creation operation. */\n op: \"create\";\n /** Explicit stable item id (normalized with the configured id_prefix). */\n id: string;\n /** Creation options forwarded to the public `create` runtime primitive. */\n options: PmClientFullMutationOptions;\n}\n\n/** One atomic item update inside a bulk mutation batch. */\nexport interface BulkItemUpdateMutation {\n /** Discriminates the update operation. */\n op: \"update\";\n /** Target item id. */\n id: string;\n /** Update options forwarded to the public `update` runtime primitive. */\n options: PmClientFullMutationOptions;\n}\n\n/** One atomic item closure inside a bulk mutation batch. */\nexport interface BulkItemCloseMutation {\n /** Discriminates the close operation. */\n op: \"close\";\n /** Target item id. */\n id: string;\n /** Close reason recorded on the item. */\n reason: string;\n /** Close options forwarded to the public `close` runtime primitive. */\n options?: PmClientFullMutationOptions;\n}\n\n/** Union of the item mutations a bulk transaction batch can carry. */\nexport type BulkItemMutation =\n | BulkItemCreateMutation\n | BulkItemUpdateMutation\n | BulkItemCloseMutation;\n\n/** Options accepted by the bulk item-mutation transaction helper. */\nexport interface CommitItemMutationsOptions {\n /** Tracker root that owns the journal and workspace-wide writer lock. */\n pmRoot: string;\n /** Stable idempotency key reused to recover an interrupted batch. */\n transactionId: string;\n /** Attributable actor recorded in the journal and forwarded to mutations. */\n author: string;\n /** Ordered item mutations; compensations run in reverse order. */\n mutations: readonly BulkItemMutation[];\n /**\n * Compensation strategy for created items: `close` (default) preserves the\n * item and its history with an explanatory close reason, `delete` removes\n * the item document (its history stream is retained by `pm delete`).\n */\n createCompensation?: \"close\" | \"delete\";\n /** Lock lifetime in seconds; size this above the longest expected attempt. */\n lockTtlSeconds?: number;\n /** Maximum time to wait for the workspace writer lock. */\n lockWaitMs?: number;\n /** Optional transition observer used by telemetry and deterministic crash tests. */\n onTransition?: CommitWorkspaceTransactionOptions[\"onTransition\"];\n}\n\n/** Journal-safe outcome recorded for one committed bulk item mutation. */\nexport interface BulkItemMutationOutcome {\n /** Canonical id of the mutated item. */\n id: string;\n /** Operation the batch applied for this item. */\n op: BulkItemMutation[\"op\"];\n}\n\n/** Successful durable result of a bulk item-mutation transaction. */\nexport interface CommitItemMutationsResult {\n /** Stable transaction identifier. */\n transactionId: string;\n /** Final durable state. */\n status: \"committed\";\n /** Whether an interrupted journal was resumed. */\n recovered: boolean;\n /** One outcome per mutation, keyed by the derived transaction step id. */\n results: Record<string, BulkItemMutationOutcome>;\n}\n\ninterface LocatedItemSnapshot {\n id: string;\n closedAt: string | undefined;\n updatedAt: string;\n}\n\n/** Read one item's transaction-relevant fields, mapping not-found to undefined. */\nasync function readItemSnapshot(\n pmRoot: string,\n id: string,\n): Promise<LocatedItemSnapshot | undefined> {\n try {\n const located = await get(id, {}, { pmRoot });\n const item = located.item as {\n id: string;\n closed_at?: string;\n updated_at: string;\n };\n return {\n id: item.id,\n closedAt: item.closed_at,\n updatedAt: item.updated_at,\n };\n } catch (error) {\n if (\n error instanceof PmCliError &&\n error.exitCode === EXIT_CODE.NOT_FOUND\n ) {\n return undefined;\n }\n throw error;\n }\n}\n\n/** Derive a journal-safe step id from one mutation's position and target. */\nfunction deriveStepId(mutation: BulkItemMutation, index: number): string {\n const sanitizedTarget = mutation.id.replaceAll(/[^a-zA-Z0-9._-]/gu, \"_\");\n return `${index + 1}-${mutation.op}-${sanitizedTarget}`;\n}\n\n/** Build the durable history-message marker for one bulk mutation phase. */\nfunction bulkHistoryMarker(\n transactionId: string,\n stepId: string,\n phase: \"apply\" | \"compensate\",\n): string {\n return `bulk-item-transaction ${transactionId} ${stepId} ${phase}`;\n}\n\n/**\n * Report whether an update step's forward mutation is durably applied. Updates\n * cannot be inferred from field values (a moving target), so the applied apply\n * marker in the item's immutable history is the source of truth; a later\n * compensate marker means the mutation was rolled back and must re-apply.\n */\nasync function isUpdateMarkerApplied(\n pmRoot: string,\n canonicalId: string,\n transactionId: string,\n stepId: string,\n): Promise<boolean> {\n const entries = await readHistoryEntries(\n path.join(pmRoot, \"history\", `${canonicalId}.jsonl`),\n canonicalId,\n );\n const applyMarker = bulkHistoryMarker(transactionId, stepId, \"apply\");\n const compensateMarker = bulkHistoryMarker(transactionId, stepId, \"compensate\");\n for (let index = entries.length - 1; index >= 0; index -= 1) {\n const message = entries[index].message;\n if (message === applyMarker) {\n return true;\n }\n if (message === compensateMarker) {\n return false;\n }\n }\n return false;\n}\n\n/** Capture the restore target used to compensate an update or close mutation. */\nasync function prepareRestoreCompensation(\n pmRoot: string,\n mutation: BulkItemMutation,\n): Promise<WorkspaceTransactionJsonValue> {\n const snapshot = await readItemSnapshot(pmRoot, mutation.id);\n if (snapshot?.updatedAt === undefined) {\n throw new PmCliError(\n `Bulk ${mutation.op} target ${mutation.id} does not exist or has no restorable version`,\n EXIT_CODE.NOT_FOUND,\n );\n }\n return { target_updated_at: snapshot.updatedAt };\n}\n\n/** Idempotently restore an item to its captured pre-mutation version. */\nasync function compensateByRestore(\n config: { pmRoot: string; author: string; transactionId: string },\n itemId: string,\n stepId: string,\n data: WorkspaceTransactionJsonValue | undefined,\n): Promise<void> {\n const target =\n data !== null && typeof data === \"object\" && !Array.isArray(data)\n ? data.target_updated_at\n : undefined;\n if (typeof target !== \"string\") {\n return;\n }\n if ((await readItemSnapshot(config.pmRoot, itemId)) === undefined) {\n return;\n }\n await restore(\n itemId,\n target,\n {\n force: true,\n author: config.author,\n message: bulkHistoryMarker(config.transactionId, stepId, \"compensate\"),\n },\n { pmRoot: config.pmRoot },\n );\n}\n\n/** Build the workspace-transaction step for one item creation. */\nfunction buildCreateStep(\n config: {\n pmRoot: string;\n author: string;\n transactionId: string;\n createCompensation: \"close\" | \"delete\";\n },\n mutation: BulkItemCreateMutation,\n stepId: string,\n): WorkspaceTransactionStep {\n return {\n id: stepId,\n async inspect(): Promise<WorkspaceTransactionStepInspection> {\n const snapshot = await readItemSnapshot(config.pmRoot, mutation.id);\n if (snapshot === undefined) {\n return { state: \"pending\" };\n }\n return { state: \"applied\", result: { id: snapshot.id, op: \"create\" } };\n },\n async apply(): Promise<WorkspaceTransactionJsonValue> {\n const created = await create(\n { ...mutation.options, author: config.author, id: mutation.id },\n { pmRoot: config.pmRoot },\n );\n const createdItem = created.item as Record<string, unknown>;\n return { id: String(createdItem.id), op: \"create\" };\n },\n async compensate(): Promise<void> {\n const snapshot = await readItemSnapshot(config.pmRoot, mutation.id);\n if (snapshot === undefined) {\n return;\n }\n if (config.createCompensation === \"delete\") {\n await deleteItem(\n mutation.id,\n {\n force: true,\n author: config.author,\n message: `Compensate interrupted bulk transaction ${config.transactionId}`,\n },\n { pmRoot: config.pmRoot },\n );\n return;\n }\n if (snapshot.closedAt !== undefined) {\n return;\n }\n await close(\n mutation.id,\n `Compensated: interrupted bulk transaction ${config.transactionId}`,\n { force: true, author: config.author },\n { pmRoot: config.pmRoot },\n );\n },\n };\n}\n\n/** Build the workspace-transaction step for one item update. */\nfunction buildUpdateStep(\n config: { pmRoot: string; author: string; transactionId: string },\n mutation: BulkItemUpdateMutation,\n stepId: string,\n): WorkspaceTransactionStep {\n return {\n id: stepId,\n async inspect(): Promise<WorkspaceTransactionStepInspection> {\n const snapshot = await readItemSnapshot(config.pmRoot, mutation.id);\n if (snapshot === undefined) {\n return { state: \"pending\" };\n }\n const applied = await isUpdateMarkerApplied(\n config.pmRoot,\n snapshot.id,\n config.transactionId,\n stepId,\n );\n if (!applied) {\n return { state: \"pending\" };\n }\n return { state: \"applied\", result: { id: snapshot.id, op: \"update\" } };\n },\n async prepareCompensation(): Promise<WorkspaceTransactionJsonValue> {\n return prepareRestoreCompensation(config.pmRoot, mutation);\n },\n async apply(): Promise<WorkspaceTransactionJsonValue> {\n const updated = await update(\n mutation.id,\n {\n ...mutation.options,\n author: config.author,\n message: bulkHistoryMarker(config.transactionId, stepId, \"apply\"),\n },\n { pmRoot: config.pmRoot },\n );\n const updatedItem = updated.item as Record<string, unknown>;\n return { id: String(updatedItem.id), op: \"update\" };\n },\n async compensate(\n data?: WorkspaceTransactionJsonValue,\n ): Promise<void> {\n await compensateByRestore(config, mutation.id, stepId, data);\n },\n };\n}\n\n/** Build the workspace-transaction step for one item closure. */\nfunction buildCloseStep(\n config: { pmRoot: string; author: string; transactionId: string },\n mutation: BulkItemCloseMutation,\n stepId: string,\n): WorkspaceTransactionStep {\n return {\n id: stepId,\n // An already-terminal target counts as applied: closing it again would\n // fight legitimate prior closure, and recovery must adopt completed work.\n async inspect(): Promise<WorkspaceTransactionStepInspection> {\n const snapshot = await readItemSnapshot(config.pmRoot, mutation.id);\n if (snapshot?.closedAt === undefined) {\n return { state: \"pending\" };\n }\n return { state: \"applied\", result: { id: snapshot.id, op: \"close\" } };\n },\n async prepareCompensation(): Promise<WorkspaceTransactionJsonValue> {\n return prepareRestoreCompensation(config.pmRoot, mutation);\n },\n async apply(): Promise<WorkspaceTransactionJsonValue> {\n const closed = await close(\n mutation.id,\n mutation.reason,\n { ...mutation.options, author: config.author },\n { pmRoot: config.pmRoot },\n );\n const closedItem = closed.item as Record<string, unknown>;\n return { id: String(closedItem.id), op: \"close\" };\n },\n async compensate(\n data?: WorkspaceTransactionJsonValue,\n ): Promise<void> {\n await compensateByRestore(config, mutation.id, stepId, data);\n },\n };\n}\n\n/** Convert one validated bulk mutation into its workspace-transaction step. */\nfunction buildStepForMutation(\n config: {\n pmRoot: string;\n author: string;\n transactionId: string;\n createCompensation: \"close\" | \"delete\";\n },\n mutation: BulkItemMutation,\n index: number,\n): WorkspaceTransactionStep {\n const stepId = deriveStepId(mutation, index);\n if (mutation.op === \"create\") {\n return buildCreateStep(config, mutation, stepId);\n }\n if (mutation.op === \"update\") {\n return buildUpdateStep(config, mutation, stepId);\n }\n return buildCloseStep(config, mutation, stepId);\n}\n\n/** Reject malformed bulk mutation rows before any journal or lock work. */\nfunction assertValidBulkMutation(\n mutation: BulkItemMutation,\n index: number,\n): void {\n if (\n mutation === null ||\n typeof mutation !== \"object\" ||\n Array.isArray(mutation)\n ) {\n throw new TypeError(`Bulk mutation ${index + 1} must be an object`);\n }\n if (![\"create\", \"update\", \"close\"].includes(mutation.op)) {\n throw new TypeError(\n `Bulk mutation ${index + 1} op must be create, update, or close`,\n );\n }\n if (typeof mutation.id !== \"string\" || mutation.id.trim().length === 0) {\n throw new TypeError(`Bulk mutation ${index + 1} requires a non-empty id`);\n }\n if (\n mutation.op === \"close\" &&\n (typeof mutation.reason !== \"string\" || mutation.reason.trim().length === 0)\n ) {\n throw new TypeError(\n `Bulk close mutation ${index + 1} requires a non-empty reason`,\n );\n }\n}\n\n/**\n * Commit an ordered batch of item create/update/close mutations atomically\n * (all-or-nothing) in one durable workspace transaction. This is the\n * high-level companion to `commitWorkspaceTransaction`: instead of\n * hand-writing `inspect`/`prepareCompensation`/`apply`/`compensate` for the\n * ubiquitous bulk import/sync case, callers describe the mutations and the\n * helper wires the crash-consistency contract — exists-by-id inspection for\n * creates, version-restore compensation for updates and closes, and\n * close-or-delete compensation for creates. A stable `transactionId` makes\n * interrupted batches resumable across processes and agents.\n */\nexport async function commitItemMutations(\n options: CommitItemMutationsOptions,\n): Promise<CommitItemMutationsResult> {\n const mutations = [...options.mutations];\n if (mutations.length === 0) {\n throw new TypeError(\"Bulk item transaction requires at least one mutation\");\n }\n for (const [index, mutation] of mutations.entries()) {\n assertValidBulkMutation(mutation, index);\n }\n const createCompensation = options.createCompensation ?? \"close\";\n if (![\"close\", \"delete\"].includes(createCompensation)) {\n throw new TypeError(\n \"Bulk item transaction createCompensation must be close or delete\",\n );\n }\n const stepConfig = {\n pmRoot: options.pmRoot,\n author: options.author,\n transactionId: options.transactionId,\n createCompensation,\n };\n const committed = await commitWorkspaceTransaction({\n pmRoot: options.pmRoot,\n transactionId: options.transactionId,\n author: options.author,\n steps: mutations.map((mutation, index) =>\n buildStepForMutation(stepConfig, mutation, index),\n ),\n ...(options.lockTtlSeconds === undefined\n ? {}\n : { lockTtlSeconds: options.lockTtlSeconds }),\n ...(options.lockWaitMs === undefined\n ? {}\n : { lockWaitMs: options.lockWaitMs }),\n ...(options.onTransition === undefined\n ? {}\n : { onTransition: options.onTransition }),\n });\n const results: Record<string, BulkItemMutationOutcome> = {};\n for (const [stepId, value] of Object.entries(committed.results)) {\n // Journal values round-trip this module's own step outputs, which are\n // always {id, op} objects — the cast restores the concrete outcome shape.\n results[stepId] = value as unknown as BulkItemMutationOutcome;\n }\n return {\n transactionId: committed.transactionId,\n status: \"committed\",\n recovered: committed.recovered,\n results,\n };\n}\n\n/** Public contract for test only item transaction internals, shared with white-box specs. */\nexport const _testOnlyItemTransaction = {\n buildCreateStep,\n bulkHistoryMarker,\n compensateByRestore,\n deriveStepId,\n isUpdateMarkerApplied,\n readItemSnapshot,\n};\n"],"names":["isPlainObject","path","path"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,SAAS,kBAAkB,KAAa,OAAa;AACnD,QAAM,iBAAiB,6BAA6B,GAAG;AACvD,MAAI,gBAAgB;AAClB,UAAM,IAAI,WACR,wBAAwB,KAAK,kDAAkD,eAAe,IAAI,yDAClG,UAAU,eAAe;EAE7B;AACA,QAAM,UAA0B,CAAA;AAChC,aAAW,CAAC,OAAO,OAAO,KAAK,IAAI,MAAM,OAAO,EAAE,QAAO,GAAI;AAC3D,UAAM,OAAO,QAAQ,KAAI;AACzB,QAAI,CAAC,MAAM;AACT;IACF;AACA,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,UAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E,cAAM,IAAI,UAAU,iCAAiC;MACvD;AACA,cAAQ,KAAK,MAAsB;IACrC,QAAQ;AACN,YAAM,IAAI,WACR,wBAAwB,KAAK,mCAAmC,QAAQ,CAAC,KACzE,UAAU,eAAe;IAE7B;EACF;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAmB;AAC/C,SAAO,gBAAgB;IACrB,IAAI,MAAM;IACV,QAAQ,MAAM;IACd,IAAI,MAAM;IACV,OAAO,MAAM;IACb,SAAS,MAAM,WAAW;GAC3B;AACH;AAEA,SAAS,0BACP,MACA,QAAsB;AAEtB,QAAM,QAAQ,KAAK,IAAI,KAAK,QAAQ,OAAO,MAAM;AACjD,MAAI,SAAS;AACb,SACE,SAAS,SACT,qBAAqB,KAAK,MAAM,CAAC,MAAM,qBAAqB,OAAO,MAAM,CAAC,GAC1E;AACA,cAAU;EACZ;AACA,SAAO;AACT;AAYM,SAAU,oBACd,SACA,SACA,WAAiB;AAEjB,oBAAkB,SAAS,MAAM;AACjC,QAAM,OAAO,kBAAkB,SAAS,MAAM;AAC9C,QAAM,SAAS,kBAAkB,WAAW,QAAQ;AACpD,QAAM,SAAS,0BAA0B,MAAM,MAAM;AAErD,MAAI,WAAW,KAAK,UAAU,WAAW,OAAO,QAAQ;AACtD,WAAO;MACL,QAAQ,oBAAoB,IAAI;MAChC,UAAU;MACV,gBAAgB;MAChB,mBAAmB;MACnB,qBAAqB;MACrB,eAAe,KAAK;MACpB,YAAY;;EAEhB;AACA,MAAI,WAAW,OAAO,QAAQ;AAC5B,WAAO;MACL,QAAQ,oBAAoB,IAAI;MAChC,UAAU;MACV,gBAAgB;MAChB,mBAAmB,KAAK,SAAS;MACjC,qBAAqB;MACrB,eAAe,KAAK;MACpB,YAAY;;EAEhB;AACA,MAAI,WAAW,KAAK,QAAQ;AAC1B,WAAO;MACL,QAAQ,oBAAoB,MAAM;MAClC,UAAU;MACV,gBAAgB;MAChB,mBAAmB;MACnB,qBAAqB,OAAO,SAAS;MACrC,eAAe,OAAO;MACtB,YAAY;;EAEhB;AAEA,QAAM,aAAa,KAAK,MAAM,MAAM;AACpC,QAAM,iBAAiB,IAAI,IAAI,WAAW,IAAI,oBAAoB,CAAC;AACnE,QAAM,eAAe,OAClB,MAAM,MAAM,EACZ,OAAO,CAAC,UAAU,CAAC,eAAe,IAAI,qBAAqB,KAAK,CAAC,CAAC;AACrE,QAAM,eAAe,CAAC,GAAG,YAAY,GAAG,YAAY,EAAE,KAAK,CAAC,MAAM,UAAS;AACzE,UAAM,OAAO,wBAAwB,KAAK,IAAI,MAAM,EAAE;AACtD,QAAI,SAAS,GAAG;AACd,aAAO;IACT;AACA,UAAM,eAAe,eAAe,IAAI,qBAAqB,IAAI,CAAC;AAClE,UAAM,gBAAgB,eAAe,IAAI,qBAAqB,KAAK,CAAC;AACpE,QAAI,iBAAiB,eAAe;AAClC,aAAO,OAAO,aAAa,IAAI,OAAO,YAAY;IACpD;AACA,WAAO,qBAAqB,IAAI,EAAE,cAAc,qBAAqB,KAAK,CAAC;EAC7E,CAAC;AACD,QAAM,aAAa,uBAAuB;IACxC,GAAG,KAAK,MAAM,GAAG,MAAM;IACvB,GAAG;GACJ;AACD,SAAO;IACL,QAAQ,oBAAoB,WAAW,OAAO;IAC9C,UAAU;IACV,gBAAgB;IAChB,mBAAmB,WAAW;IAC9B,qBAAqB,aAAa;IAClC,eAAe,WAAW,QAAQ;IAClC,YAAY;;AAEhB;AA+BA,SAAS,uBACP,KACA,OAAa;AAEb,QAAM,iBAAiB,6BAA6B,GAAG;AACvD,MAAI,gBAAgB;AAClB,UAAM,IAAI,WACR,6BAA6B,KAAK,kDAAkD,eAAe,IAAI,yDACvG,UAAU,eAAe;EAE7B;AACA,QAAM,SAAoC,CAAA;AAC1C,aAAW,CAAC,OAAO,OAAO,KAAK,IAAI,MAAM,OAAO,EAAE,QAAO,GAAI;AAC3D,UAAM,OAAO,QAAQ,KAAI;AACzB,QAAI,CAAC,MAAM;AACT;IACF;AACA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;IAC1B,QAAQ;AACN,YAAM,IAAI,WACR,6BAA6B,KAAK,mCAAmC,QAAQ,CAAC,KAC9E,UAAU,eAAe;IAE7B;AACA,QACE,OAAO,WAAW,YAClB,WAAW,QACX,MAAM,QAAQ,MAAM,KACpB,OAAQ,OAAiC,YAAY,YACrD,OAAQ,OAAkC,aAAa,UACvD;AACA,YAAM,IAAI,WACR,6BAA6B,KAAK,UAAU,QAAQ,CAAC,+DACrD,UAAU,eAAe;IAE7B;AACA,WAAO,KAAK,MAAiC;EAC/C;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,QAAiC;AAChE,SAAO,OAAO,WAAW,IACrB,KACA,GAAG,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;;AAChE;AAEA,SAAS,2BACP,QAAiC;AAEjC,SAAO,OAAO,IAAI,CAAC,OAAO,WAAW,EAAE,GAAG,OAAO,UAAU,QAAQ,EAAC,EAAG;AACzE;AAWM,SAAU,8BACd,SACA,SACA,WAAiB;AAEjB,yBAAuB,SAAS,MAAM;AACtC,QAAM,OAAO,uBAAuB,SAAS,MAAM;AACnD,QAAM,SAAS,uBAAuB,WAAW,QAAQ;AACzD,QAAM,QAAQ,KAAK,IAAI,KAAK,QAAQ,OAAO,MAAM;AACjD,MAAI,SAAS;AACb,SAAO,SAAS,SAAS,KAAK,MAAM,EAAE,YAAY,OAAO,MAAM,EAAE,SAAS;AACxE,cAAU;EACZ;AAEA,MAAI,WAAW,KAAK,UAAU,WAAW,OAAO,QAAQ;AACtD,WAAO;MACL,QAAQ,wBAAwB,IAAI;MACpC,UAAU;MACV,gBAAgB;MAChB,mBAAmB;MACnB,qBAAqB;MACrB,eAAe,KAAK;MACpB,YAAY;;EAEhB;AACA,MAAI,WAAW,OAAO,QAAQ;AAC5B,WAAO;MACL,QAAQ,wBAAwB,IAAI;MACpC,UAAU;MACV,gBAAgB;MAChB,mBAAmB,KAAK,SAAS;MACjC,qBAAqB;MACrB,eAAe,KAAK;MACpB,YAAY;;EAEhB;AACA,MAAI,WAAW,KAAK,QAAQ;AAC1B,WAAO;MACL,QAAQ,wBAAwB,MAAM;MACtC,UAAU;MACV,gBAAgB;MAChB,mBAAmB;MACnB,qBAAqB,OAAO,SAAS;MACrC,eAAe,OAAO;MACtB,YAAY;;EAEhB;AAEA,QAAM,aAAa,KAAK,MAAM,MAAM;AACpC,QAAM,eAAe,IAAI,IAAI,WAAW,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC;AACrE,QAAM,eAAe,OAClB,MAAM,MAAM,EACZ,OAAO,CAAC,UAAU,CAAC,aAAa,IAAI,MAAM,OAAO,CAAC;AACrD,QAAM,eAAe,CAAC,GAAG,YAAY,GAAG,YAAY,EAAE,KAAK,CAAC,MAAM,UAAS;AACzE,QAAI,KAAK,cAAc,UAAa,MAAM,cAAc,QAAW;AACjE,YAAM,OAAO,wBAAwB,KAAK,WAAW,MAAM,SAAS;AACpE,UAAI,SAAS,GAAG;AACd,eAAO;MACT;IACF,WAAW,KAAK,cAAc,UAAa,MAAM,cAAc,QAAW;AACxE,aAAO;IACT,WAAW,KAAK,cAAc,QAAW;AACvC,aAAO;IACT;AACA,UAAM,eAAe,aAAa,IAAI,KAAK,OAAO;AAClD,UAAM,gBAAgB,aAAa,IAAI,MAAM,OAAO;AACpD,QAAI,iBAAiB,eAAe;AAClC,aAAO,OAAO,aAAa,IAAI,OAAO,YAAY;IACpD;AAGA,WAAO;EACT,CAAC;AACD,QAAM,SAAS,2BAA2B;IACxC,GAAG,KAAK,MAAM,GAAG,MAAM;IACvB,GAAG;GACJ;AACD,SAAO;IACL,QAAQ,wBAAwB,MAAM;IACtC,UAAU;IACV,gBAAgB;IAChB,mBAAmB,WAAW;IAC9B,qBAAqB,aAAa;IAClC,eAAe,OAAO;IACtB,YAAY;;AAEhB;AAYO,IAAM,+BAA+B;EAC1C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIK,IAAM,+BAA+B,CAAC,YAAY;AAgBzD,SAAS,WAAW,MAAe,OAAc;AAC/C,SAAO,gBAAgB,QAAQ,IAAI,MAAM,gBAAgB,SAAS,IAAI;AACxE;AAEA,SAAS,gBACP,MACA,MACA,QAAe;AAEf,QAAM,YAAY,CAAC,UACjB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAA;AACjC,QAAM,UAAU,IAAI,IAAI,UAAU,IAAI,EAAE,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,CAAC;AAC9E,QAAM,cAAc,UAAU,IAAI;AAClC,QAAM,UAAU,IAAI,IAAI,YAAY,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,CAAC;AAC1E,QAAM,gBAAgB,UAAU,MAAM;AACtC,QAAM,YAAY,IAAI,IACpB,cAAc,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,CAAC;AAEtD,QAAM,SAAS,YAAY,OAAO,CAAC,UAAS;AAC1C,UAAM,WAAW,gBAAgB,KAAK;AAGtC,WAAO,CAAC,QAAQ,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ;EACzD,CAAC;AACD,aAAW,SAAS,eAAe;AACjC,UAAM,WAAW,gBAAgB,KAAK;AACtC,QAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,CAAC,QAAQ,IAAI,QAAQ,GAAG;AACpD,aAAO,KAAK,KAAK;IACnB;EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAe,QAAe;AACrD,SAAO,wBAAwB,OAAO,IAAI,GAAG,OAAO,MAAM,CAAC,KAAK,IAC5D,OACA;AACN;AAQA,SAAS,oBACP,MACA,MACA,QACA,WAA6B;AAE7B,MAAI,WAAW,MAAM,MAAM,GAAG;AAC5B,WAAO,EAAE,OAAO,MAAM,aAAa,OAAO,UAAU,MAAK;EAC3D;AACA,MAAI,WAAW,MAAM,IAAI,GAAG;AAC1B,WAAO,EAAE,OAAO,QAAQ,aAAa,MAAM,UAAU,MAAK;EAC5D;AACA,MAAI,WAAW,MAAM,MAAM,GAAG;AAC5B,WAAO,EAAE,OAAO,MAAM,aAAa,OAAO,UAAU,MAAK;EAC3D;AACA,SAAO;IACL,OAAO,cAAc,WAAW,SAAS;IACzC,aAAa,cAAc;IAC3B,UAAU;;AAEd;AAEA,SAAS,iBAAiB,UAAsB;AAC9C,SAAO,EAAE,GAAI,SAAS,SAA+C;AACvE;AAEA,SAAS,mBACP,KACA,OACA,SAAkC;AAElC,MAAI;AACF,WAAO,kBAAkB,kBAAkB,KAAK,OAAO,GAAG,OAAO;EACnE,SAAS,OAAO;AACd,UAAM,IAAI,WACR,qBAAqB,KAAK,sCAAsC,OAAO,KAAK,CAAC,IAC7E,UAAU,eAAe;EAE7B;AACF;AAaA,SAAS,yBACP,YACA,YACA,cACA,WAA6B;AAE7B,QAAM,gBAAgB,IAAI,IAAY,4BAA4B;AAClE,QAAM,iBAAiB,IAAI,IAAY,4BAA4B;AACnE,QAAM,aAAa;IACjB,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,UAAU,GAAG,GAAG,OAAO,KAAK,YAAY,CAAC,CAAC;IACrE,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AACjD,QAAM,cAA4C;IAChD,QAAQ,CAAA;IACR,gBAAgB,CAAA;IAChB,kBAAkB,CAAA;IAClB,aAAa,CAAA;;AAGf,aAAW,SAAS,YAAY;AAC9B,UAAM,YAAY,WAAW,KAAK;AAClC,UAAM,YAAY,WAAW,KAAK;AAClC,UAAM,cAAc,aAAa,KAAK;AACtC,QAAI,cAAc,IAAI,KAAK,GAAG;AAC5B,YAAM,QAAQ,gBAAgB,WAAW,WAAW,WAAW;AAI/D,kBAAY,OAAO,KAAK,IAAI;AAC5B,UAAI,CAAC,WAAW,OAAO,SAAS,GAAG;AACjC,oBAAY,YAAY,KAAK,KAAK;MACpC;AACA;IACF;AACA,QAAI,eAAe,IAAI,KAAK,GAAG;AAC7B,kBAAY,OAAO,KAAK,IAAI,gBAAgB,WAAW,WAAW;AAClE;IACF;AACA,UAAM,UAAU,oBACd,WACA,WACA,aACA,SAAS;AAEX,QAAI,QAAQ,UAAU,QAAW;AAC/B,kBAAY,OAAO,KAAK,IAAI,QAAQ;IACtC;AACA,QAAI,QAAQ,UAAU;AACpB,kBAAY,eAAe,KAAK,KAAK;IACvC,WAAW,QAAQ,aAAa;AAC9B,kBAAY,iBAAiB,KAAK,KAAK;IACzC;EACF;AACA,SAAO;AACT;AAcM,SAAU,mBACd,SACA,SACA,WACA,UAGI,CAAA,GAAE;AAEN,QAAM,YAAgC,QAAQ,aAAa;AAI3D,QAAM,UAAU,QAAQ,KAAI,EAAG,SAAS;AACxC,QAAM,OAAO,mBAAmB,SAAS,QAAQ,OAAO;AACxD,QAAM,SAAS,mBAAmB,WAAW,UAAU,OAAO;AAC9D,QAAM,OAAO,UAAU,mBAAmB,SAAS,QAAQ,OAAO,IAAI;AAEtE,QAAM,aAAa,UACf,iBAAiB,IAAI,IACpB,CAAA;AACL,QAAM,aAAa,iBAAiB,IAAI;AACxC,QAAM,eAAe,iBAAiB,MAAM;AAC5C,QAAM,EAAE,QAAQ,gBAAgB,kBAAkB,YAAW,IAC3D,yBAAyB,YAAY,YAAY,cAAc,SAAS;AAE1E,QAAM,cAAc,oBAClB,UAAU,KAAK,OAAO,IACtB,KAAK,MACL,OAAO,MACP,SAAS;AAEX,MAAI,YAAY,UAAU;AACxB,mBAAe,KAAK,MAAM;EAC5B,WAAW,YAAY,aAAa;AAClC,qBAAiB,KAAK,MAAM;EAC9B;AAEA,QAAM,YAAY,sBAChB;IACE,UAAU;IACV,MAAM,YAAY;KAEpB,OAAO;AAET,SAAO;IACL,QAAQ;IACR,iBAAiB;IACjB,oBAAoB;IACpB,cAAc;IACd;;AAEJ;AAcA,SAAS,cAAc,OAAc;AACnC,SACE,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,KAAK;AAExB;AAEA,SAAS,cAAc,KAAa,OAAa;AAC/C,QAAM,iBAAiB,6BAA6B,GAAG;AACvD,MAAI,gBAAgB;AAClB,UAAM,IAAI,WACR,qBAAqB,KAAK,kDAAkD,eAAe,IAAI,KAC/F,UAAU,eAAe;EAE7B;AACA,MAAI,IAAI,KAAI,EAAG,WAAW,GAAG;AAC3B,WAAO;EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;EACvB,QAAQ;AACN,UAAM,IAAI,WACR,qBAAqB,KAAK,wBAC1B,UAAU,eAAe;EAE7B;AACF;AAEA,SAAS,eACP,MACA,MACA,QACA,WACA,YACA,eACA,iBAAyB;AAEzB,MAAI,WAAW,MAAM,MAAM,GAAG;AAC5B,WAAO;EACT;AACA,MAAI,cAAc,IAAI,KAAK,cAAc,MAAM,GAAG;AAChD,UAAM,aAAa,cAAc,IAAI,IAAI,OAAO,CAAA;AAChD,UAAM,SAAkC,CAAA;AACxC,UAAM,OAAO;MACX,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC;MACzD,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AACjD,eAAW,OAAO,MAAM;AACtB,YAAM,YAAY,WAAW,SAAS,IAAI,GAAG,UAAU,IAAI,GAAG,KAAK;AACnE,YAAM,QAAQ,aACZ,YACA,MACA,QACA,KACA,WACA,WACA,eACA,eAAe;AAEjB,UAAI,UAAU,QAAW;AACvB,eAAO,GAAG,IAAI;MAChB;IACF;AACA,WAAO;EACT;AACA,QAAM,UAAU,oBAAoB,MAAM,MAAM,QAAQ,SAAS;AACjE,MAAI,QAAQ,UAAU;AACpB,kBAAc,KAAK,UAAU;EAC/B,WAAW,QAAQ,aAAa;AAC9B,oBAAgB,KAAK,UAAU;EACjC;AACA,SAAO,QAAQ;AACjB;AAEA,SAAS,aACP,MACA,MACA,QACA,KACA,WACA,WACA,eACA,iBAAyB;AAEzB,QAAM,SAAS,OAAO,UAAU,eAAe,KAAK,MAAM,GAAG;AAC7D,QAAM,WAAW,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG;AACjE,QAAM,SAAS,OAAO,UAAU,eAAe,KAAK,MAAM,GAAG;AAC7D,MAAI,UAAU,UAAU;AACtB,WAAO,eACL,KAAK,GAAG,GACR,KAAK,GAAG,GACR,OAAO,GAAG,GACV,WACA,WACA,eACA,eAAe;EAEnB;AACA,MAAI,QAAQ;AAGV,QAAI,UAAU,WAAW,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG;AAC9C,sBAAgB,KAAK,SAAS;AAC9B,aAAO;IACT;AACA,QAAI,QAAQ;AACV,oBAAc,KAAK,SAAS;AAC5B,aAAO,cAAc,WAAW,SAAY,KAAK,GAAG;IACtD;AACA,WAAO,KAAK,GAAG;EACjB;AAEA,MAAI,UAAU,WAAW,KAAK,GAAG,GAAG,OAAO,GAAG,CAAC,GAAG;AAChD,WAAO;EACT;AACA,MAAI,QAAQ;AACV,kBAAc,KAAK,SAAS;AAC5B,WAAO,cAAc,WAAW,OAAO,GAAG,IAAI;EAChD;AACA,kBAAgB,KAAK,SAAS;AAC9B,SAAO,OAAO,GAAG;AACnB;AAWM,SAAU,mBACd,SACA,SACA,WACA,UAGI,CAAA,GAAE;AAEN,QAAM,YAAgC,QAAQ,aAAa;AAC3D,QAAM,OAAO,cAAc,SAAS,MAAM;AAC1C,QAAM,OAAO,cAAc,SAAS,MAAM;AAC1C,QAAM,SAAS,cAAc,WAAW,QAAQ;AAChD,QAAM,gBAA0B,CAAA;AAChC,QAAM,kBAA4B,CAAA;AAClC,QAAM,SAAS,eACb,MACA,MACA,QACA,WACA,IACA,eACA,eAAe;AAEjB,SAAO;IACL,QAAQ,GAAG,KAAK,UAAU,UAAU,MAAM,MAAM,CAAC,CAAC;;IAClD,gBAAgB;IAChB,mBAAmB;IACnB;;AAEJ;;;ACpyBA,SAAS,UAAU,iBAAiB;AACpC,OAAO,UAAU;AAoBV,IAAM,+BAA+B;EAC1C;EACA;EACA;EACA;;AAoEF,SAAS,gBAAgB,OAAa;AACpC,QAAM,aAAa,MAAM,KAAI,EAAG,YAAW;AAC3C,MACG,6BAAmD,SAAS,UAAU,GACvE;AACA,WAAO;EACT;AACA,QAAM,IAAI,WACR,2BAA2B,KAAK,wBAAwB,6BAA6B,KAAK,IAAI,CAAC,KAC/F,UAAU,KAAK;AAEnB;AAEA,SAAS,qBAAqB,OAAyB;AACrD,MAAI,UAAU,QAAW;AACvB,WAAO;EACT;AACA,QAAM,aAAa,MAAM,KAAI,EAAG,YAAW;AAC3C,MAAI,eAAe,UAAU,eAAe,UAAU;AACpD,WAAO;EACT;AACA,QAAM,IAAI,WACR,2BAA2B,KAAK,sCAChC,UAAU,KAAK;AAEnB;AAEA,eAAe,aAAa,UAAkB,OAAa;AACzD,MAAI;AACF,WAAO,MAAM,SAAS,UAAU,MAAM;EACxC,QAAQ;AACN,UAAM,IAAI,WACR,qBAAqB,KAAK,YAAY,QAAQ,KAC9C,UAAU,SAAS;EAEvB;AACF;AAQA,eAAe,qBACb,QAAqB;AAErB,QAAM,SAAS,cAAc,QAAQ,IAAG,GAAI,OAAO,IAAI;AACvD,MAAI,CAAE,MAAM,WAAW,gBAAgB,MAAM,CAAC,GAAI;AAChD,WAAO;EACT;AACA,SAAO,aAAa,MAAM;AAC5B;AAEA,SAAS,kBACP,UACA,UAA2B;AAE3B,MAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,WAAO;EACT;AACA,MAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,WAAO;EACT;AACA,SAAO,UAAU,eAAe;AAClC;AASA,eAAsB,eACpB,SACA,QAAqB;AAErB,QAAM,WAAW,gBAAgB,QAAQ,QAAQ;AACjD,QAAM,YAAY,qBAAqB,QAAQ,MAAM;AACrD,QAAM,aAAa,KAAK,QAAQ,QAAQ,cAAc,QAAQ,QAAQ;AACtE,QAAM,CAAC,SAAS,SAAS,SAAS,IAAI,MAAM,QAAQ,IAAI;IACtD,aAAa,QAAQ,UAAU,MAAM;IACrC,aAAa,QAAQ,UAAU,MAAM;IACrC,aAAa,QAAQ,YAAY,QAAQ;GAC1C;AAED,MAAI;AACJ,QAAM,YAAsB,CAAA;AAC5B,QAAM,SAAqC,CAAA;AAC3C,MAAI,aAAa,WAAW;AAC1B,UAAM,eAAe,oBAAoB,SAAS,SAAS,SAAS;AACpE,aAAS,aAAa;AACtB,WAAO,UAAU;MACf,UAAU,aAAa;MACvB,gBAAgB,aAAa;MAC7B,mBAAmB,aAAa;MAChC,qBAAqB,aAAa;MAClC,eAAe,aAAa;MAC5B,YAAY,aAAa;;EAE7B,WAAW,aAAa,gBAAgB;AACtC,UAAM,oBAAoB,8BACxB,SACA,SACA,SAAS;AAEX,aAAS,kBAAkB;AAC3B,WAAO,eAAe;MACpB,UAAU,kBAAkB;MAC5B,gBAAgB,kBAAkB;MAClC,mBAAmB,kBAAkB;MACrC,qBAAqB,kBAAkB;MACvC,eAAe,kBAAkB;MACjC,YAAY,kBAAkB;;EAElC,WAAW,aAAa,QAAQ;AAC9B,UAAM,WAAW,MAAM,qBAAqB,MAAM;AAClD,UAAM,YAAY,mBAAmB,SAAS,SAAS,WAAW;MAChE,QAAQ,kBAAkB,QAAQ,YAAY,YAAY,QAAQ;MAClE,QAAQ,UAAU;MAClB,qBAAqB,gCACnB,gCAA+B,CAAE;MAEnC;KACD;AACD,aAAS,UAAU;AACnB,cAAU,KAAK,GAAG,UAAU,eAAe;AAC3C,WAAO,OAAO;MACZ,oBAAoB,UAAU;MAC9B,cAAc,UAAU;;EAE5B,OAAO;AACL,UAAM,YAAY,mBAAmB,SAAS,SAAS,WAAW;MAChE;KACD;AACD,aAAS,UAAU;AACnB,cAAU,KAAK,GAAG,UAAU,cAAc;AAC1C,WAAO,OAAO;MACZ,mBAAmB,UAAU;;EAEjC;AAEA,QAAM,UAAU,YAAY,QAAQ,MAAM;AAC1C,QAAM,WAAqB,CAAA;AAC3B,MAAI,UAAU,SAAS,GAAG;AACxB,aAAS,KACP,yBAAyB,UAAU,KAAK,IAAI,CAAC,SAAS,SAAS,mGAAmG;EAEtK;AACA,MAAI,aAAa,aAAa,OAAO,SAAS,YAAY;AACxD,aAAS,KACP,8KAA8K;EAElL;AACA,SAAO;IACL,IAAI,UAAU,WAAW;IACzB;IACA,aAAa;IACb;IACA;IACA,GAAG;IACH;IACA,cAAc,OAAM;;AAExB;;;AC3PA,IAAM,oBAAoB,CAAC,MAAM,MAAM,UAAU,SAAS;AAC1D,IAAM,qBAAqB;EACzB;EACA;EACA;EACA;EACA;;AAEF,IAAM,sBAAsB,oBAAI,IAAI;EAClC;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AACD,IAAM,6BAA6B,oBAAI,IAAI,CAAC,GAAG,qBAAqB,IAAI,CAAC;AACzE,IAAM,kBAAkB,oBAAI,IAAI;EAC9B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AACD,IAAM,uBAEF;EACF,QAAQ,+CAA+C,IACrD,CAAC,aAAa,SAAS,MAAM;EAE/B,QAAQ,+CAA+C,IACrD,CAAC,aAAa,SAAS,MAAM;EAE/B,OAAO,qBAAqB,IAAI,CAAC,aAC/B,SAAS,KACN,MAAM,CAAC,EACP,WAAW,cAAc,CAAC,QAAQ,WACjC,OAAO,YAAW,CAAE,CACrB,EACH,OAAO,CAAC,QAAQ,QAAQ,QAAQ;;AAc9B,SAAU,4BACd,OAA8B;AAE9B,QAAM,WAAmC,CAAA;AACzC,QAAM,eAAe,MAAM;AAC3B,MAAI,iBAAiB,QAAW;AAC9B,QAAI,iBAAiB,WAAW,iBAAiB,UAAU;AACzD,YAAM,IAAI,WACR,+CACA,UAAU,KAAK;IAEnB;AACA,aAAS,qBAAqB;EAChC;AACA,aAAW,OAAO,CAAC,kBAAkB,YAAY,GAAY;AAC3D,UAAM,MAAM,MAAM,GAAG;AACrB,QAAI,QAAQ;AAAW;AACvB,UAAM,SACJ,OAAO,QAAQ,YACd,OAAO,QAAQ,YAAY,IAAI,KAAI,EAAG,SAAS,IAC5C,OAAO,GAAG,IACV,OAAO;AACb,QAAI,CAAC,OAAO,cAAc,MAAM,KAAK,UAAU,GAAG;AAChD,YAAM,IAAI,WACR,GAAG,GAAG,qCACN,UAAU,KAAK;IAEnB;AACA,aAAS,GAAG,IAAI;EAClB;AACA,SAAO;AACT;AAEA,SAASA,eAAc,OAAc;AACnC,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO;EACT;AACA,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAEA,SAAS,WACP,KACA,YAA6B;AAE7B,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;AACrE,MAAI;AACJ,aAAW,aAAa,YAAY;AAClC,UAAM,WAAW,+BAA+B,KAAK,WAAW,KAAK;AACrE,QAAI,aAAa,SAAS,SAAS,UAAa,WAAW,KAAK,WAAW;AACzE,aAAO,EAAE,KAAK,WAAW,SAAQ;IACnC;EACF;AACA,SAAO,MAAM;AACf;AAEA,SAAS,gBACP,OACA,KACA,YAA6B;AAE7B,QAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,SAAO,IAAI,WACT,eAAe,SACX,GAAG,KAAK,4BAA4B,GAAG,oBAAoB,WAAW,KAAK,IAAI,CAAC,MAChF,GAAG,KAAK,4BAA4B,GAAG,oBAAoB,UAAU,MACzE,UAAU,OACV;IACE,MAAM;IACN,UAAU,kBAAkB,KAAK;IACjC,KAAK;IACL,WAAW;MACT,eAAe,SACX,sBAAsB,GAAG,OACzB,YAAY,GAAG,WAAW,UAAU;;GAE3C;AAEL;AAEA,SAAS,eAAe,OAAe,OAAa;AAClD,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;EACzB,SAAS,OAAgB;AACvB,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACpE,UAAM,IAAI,WACR,GAAG,KAAK,wBAAwB,MAAM,IACtC,UAAU,OACV;MACE,MAAM;MACN,UAAU,uBAAuB,MAAM,YAAW,CAAE;MACpD,KAAK;KACN;EAEL;AACF;AAEA,SAAS,uBACP,OACA,OAAa;AAEb,MAAI,CAACA,eAAc,KAAK,GAAG;AACzB,UAAM,IAAI,WACR,YAAY,QAAQ,CAAC,uBACrB,UAAU,KAAK;EAEnB;AACA,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,QACE,CAAC,kBAAkB,SAAS,GAAyC,GACrE;AACA,YAAM,gBAAgB,YAAY,QAAQ,CAAC,IAAI,KAAK,iBAAiB;IACvE;EACF;AACA,SAAO;AACT;AAEA,SAAS,wBACP,SACA,IACA,OAAa;AAEb,MAAI,YAAY;AAAW,WAAO;AAClC,MAAI,CAACA,eAAc,OAAO,GAAG;AAC3B,UAAM,IAAI,WACR,YAAY,QAAQ,CAAC,+BACrB,UAAU,KAAK;EAEnB;AACA,aAAW,OAAO,OAAO,KAAK,OAAO,GAAG;AACtC,QAAI,CAAC,qBAAqB,EAAE,EAAE,SAAS,GAAG,GAAG;AAC3C,YAAM,gBACJ,YAAY,QAAQ,CAAC,IAAI,EAAE,YAC3B,KACA,qBAAqB,EAAE,CAAC;IAE5B;EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAgB,OAAa;AACxD,QAAM,WAAW,uBAAuB,OAAO,KAAK;AACpD,QAAM,EAAE,IAAI,IAAI,OAAM,IAAK;AAC3B,MAAI,OAAO,YAAY,OAAO,YAAY,OAAO,SAAS;AACxD,UAAM,IAAI,WACR,YAAY,QAAQ,CAAC,yCACrB,UAAU,KAAK;EAEnB;AACA,QAAM,UAAU,wBAAwB,SAAS,SAAS,IAAI,KAAK;AACnE,MAAI,OAAO,OAAO,YAAY,GAAG,KAAI,EAAG,WAAW,GAAG;AACpD,UAAM,IAAI,WACR,YAAY,QAAQ,CAAC,6BACrB,UAAU,KAAK;EAEnB;AACA,QAAM,eAAe,GAAG,KAAI;AAC5B,MAAI,OAAO,SAAS;AAClB,QAAI,OAAO,WAAW,YAAY,OAAO,KAAI,EAAG,WAAW,GAAG;AAC5D,YAAM,IAAI,WACR,YAAY,QAAQ,CAAC,uCACrB,UAAU,KAAK;IAEnB;AACA,WAAO;MACL;MACA,IAAI;MACJ,QAAQ,OAAO,KAAI;MACnB,GAAI,YAAY,SACZ,CAAA,IACA,EAAE,QAA+C;;EAEzD;AACA,MAAI,CAACA,eAAc,OAAO,GAAG;AAC3B,UAAM,IAAI,WACR,YAAY,QAAQ,CAAC,IAAI,EAAE,gCAC3B,UAAU,KAAK;EAEnB;AACA,SAAO;IACL;IACA,IAAI;IACJ;;AAEJ;AAGM,SAAU,uBAAuB,OAAa;AAClD,QAAM,SAAS,eAAe,OAAO,gBAAgB;AACrD,QAAM,OAAO,MAAM,QAAQ,MAAM,IAC7B,SACAA,eAAc,MAAM,KAAK,MAAM,QAAQ,OAAO,SAAS,IACrD,OAAO,YACP;AACN,MAAI,SAAS,UAAa,KAAK,WAAW,GAAG;AAC3C,UAAM,IAAI,WACR,gGACA,UAAU,KAAK;EAEnB;AACA,SAAO,KAAK,IAAI,CAAC,KAAK,UAAU,oBAAoB,KAAK,KAAK,CAAC;AACjE;AAEA,SAAS,eACP,OACA,MAAuB;AAEvB,SAAO,KACJ,OAAO,CAAC,QAAQ,MAAM,GAAG,MAAM,UAAa,MAAM,GAAG,MAAM,IAAI,EAC/D,IAAI,CAAC,QAAO;AACX,UAAM,WAAW,OAAO,MAAM,GAAG,CAAC;AAClC,WAAO,GAAG,GAAG,IAAI,cAAc,KAAK,QAAQ,IAAI,KAAK,UAAU,QAAQ,IAAI,QAAQ;EACrF,CAAC,EACA,KAAK,GAAG;AACb;AAEA,SAAS,qBACP,OACA,MACA,OAAa;AAEb,MAAI,UAAU;AAAW,WAAO;AAChC,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,MAAMA,cAAa,GAAG;AACxD,UAAM,IAAI,WACR,GAAG,KAAK,iCACR,UAAU,KAAK;EAEnB;AACA,SAAO,MAAM,IAAI,CAAC,UAAU,eAAe,OAAO,IAAI,CAAC;AACzD;AAEA,SAAS,iBAAiB,KAAa,OAAc;AACnD,MACE,QAAQ,UACR,MAAM,QAAQ,KAAK,KACnB,MAAM,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,GAChD;AACA,WAAO,KAAK,UAAU,KAAK;EAC7B;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAC3D,WAAO,OAAO,KAAK;EACrB;AACA,SAAO;AACT;AAEA,SAAS,mBACP,QACA,QACA,2BAA2B,OAAK;AAEhC,QAAM,WACJ;IACE,CAAC,gBAAgB,OAAO,CAAC,MAAM,QAAQ,cAAc,QAAQ,CAAC;IAC9D,CAAC,YAAY,WAAW,CAAC,QAAQ,cAAc,QAAQ,CAAC;IACxD,CAAC,SAAS,QAAQ,CAAC,QAAQ,cAAc,QAAQ,CAAC;IAClD,CAAC,aAAa,YAAY,CAAC,QAAQ,cAAc,QAAQ,CAAC;IAC1D,CAAC,SAAS,QAAQ,CAAC,QAAQ,SAAS,MAAM,CAAC;IAC3C,CAAC,SAAS,QAAQ,CAAC,WAAW,SAAS,iBAAiB,CAAC;IACzD,CAAC,QAAQ,OAAO,CAAC,QAAQ,SAAS,MAAM,CAAC;IACzC,CAAC,aAAa,YAAY,CAAC,MAAM,QAAQ,YAAY,CAAC;IACtD,CAAC,UAAU,SAAS,CAAC,YAAY,UAAU,SAAS,UAAU,CAAC;IAC/D,CAAC,gBAAgB,cAAc,CAAC,OAAO,OAAO,CAAC;;AAEnD,aAAW,CAAC,WAAW,WAAW,IAAI,KAAK,UAAU;AACnD,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,aAAa,qBACjB,4BACE,CAAC,YAAY,SAAS,WAAW,EAAE,SAAS,SAAS,KACrD,MAAM,QAAQ,WAAW,IACvB,YAAY,OACV,CAAC,UACC,CAACA,eAAc,KAAK,KAAK,MAAM,eAAe,MAAS,IAE3D,aACJ,MACA,SAAS;AAEX,QAAI,eAAe,UAAa,WAAW,SAAS;AAClD,aAAO,SAAS,IAAI;EACxB;AACF;AAEA,SAAS,yBACP,QACA,UAAiB;AAEjB,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,QAAI,UAAU;AACZ,UACE,CAAC,mBAAmB,SAAS,GAA0C;AAEvE,cAAM,gBAAgB,iBAAiB,KAAK,kBAAkB;AAChE;IACF;AACA,QACE,CAAC,gBAAgB,IAAI,GAAG,KACxB,WAAW,KAAK,CAAC,GAAG,eAAe,CAAC,MAAM,UAC1C,WAAW,KAAK,kBAAkB,MAAM;AAExC,YAAM,gBAAgB,iBAAiB,KAAK,kBAAkB;EAClE;AACF;AAEA,SAAS,oBAAoB,QAA+B;AAI1D,QAAM,WAAW,OAAO,OAAO,QAAQ,MAAM;AAC7C,2BAAyB,QAAQ,QAAQ;AACzC,QAAM,OAAO,WAAW,OAAO,OAAO;AACtC,MAAI,CAACA,eAAc,IAAI,GAAG;AACxB,UAAM,IAAI,WACR,yCACA,UAAU,KAAK;EAEnB;AACA,SAAO;IACL;IACA,GAAI,YAAYA,eAAc,OAAO,MAAM,IACvC,EAAE,QAAQ,OAAO,OAAM,IACvB,CAAA;;AAER;AAEA,SAAS,wBACP,iBACA,KACA,OACA,MAAyB;AAEzB,QAAM,eACJ,SAAS,WAAW,6BAA6B;AACnD,MAAI,aAAa,IAAI,GAAG;AAAG;AAC3B,MAAI,CAAC,gBAAgB,IAAI,GAAG,GAAG;AAC7B,UAAM,aAAa,WAAW,KAAK,CAAC,GAAG,eAAe,CAAC;AACvD,QAAI,eAAe;AACjB,YAAM,gBAAgB,iBAAiB,KAAK,CAAC,GAAG,eAAe,CAAC;AAClE,UAAM,SAAS,MAAM,QAAQ,gBAAgB,KAAK,IAC7C,gBAAgB,QACjB,CAAA;AACJ,WAAO,KACL,eACE;MACE;MACA,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;OAEjE,CAAC,OAAO,OAAO,CAAC,CACjB;AAEH,oBAAgB,QAAQ;AACxB;EACF;AACA,MACE;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,SAAS,GAAG;AAEd;AACF,kBACE,IAAI,WAAW,cAAc,CAAC,QAAQ,WACpC,OAAO,YAAW,CAAE,CACrB,IACC,iBAAiB,KAAK,KAAK;AACjC;AAMM,SAAU,8BACd,OACA,MACA,kBAA2C,CAAA,GAAE;AAE7C,QAAM,SAAS,eAAe,OAAO,eAAe;AACpD,MAAI,CAACA,eAAc,MAAM,GAAG;AAC1B,UAAM,IAAI,WACR,wCACA,UAAU,KAAK;EAEnB;AACA,QAAM,EAAE,MAAM,OAAM,IAAK,oBAAoB,MAAM;AACnD,QAAM,kBAA2C,CAAA;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,4BAAwB,iBAAiB,KAAK,OAAO,IAAI;EAC3D;AACA,qBAAmB,iBAAiB,MAAM,SAAS,QAAQ;AAC3D,MAAI,WAAW;AAAW,uBAAmB,iBAAiB,MAAM;AACpE,SAAO;IACL,GAAG;IACH,GAAG,OAAO,YACR,OAAO,QAAQ,eAAe,EAAE,OAC9B,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,CACnC;IAEH,WAAW;;AAEf;AAGM,SAAU,yBAAyB,OAAc;AACrD,SAAO,uBAAuB,KAAK,UAAU,KAAK,CAAC;AACrD;;;AC5gBA,OAAOC,WAAU;AAkHjB,eAAe,iBACb,QACA,IAAU;AAEV,MAAI;AACF,UAAM,UAAU,MAAM,IAAI,IAAI,CAAA,GAAI,EAAE,OAAM,CAAE;AAC5C,UAAM,OAAO,QAAQ;AAKrB,WAAO;MACL,IAAI,KAAK;MACT,UAAU,KAAK;MACf,WAAW,KAAK;;EAEpB,SAAS,OAAO;AACd,QACE,iBAAiB,cACjB,MAAM,aAAa,UAAU,WAC7B;AACA,aAAO;IACT;AACA,UAAM;EACR;AACF;AAGA,SAAS,aAAa,UAA4B,OAAa;AAC7D,QAAM,kBAAkB,SAAS,GAAG,WAAW,qBAAqB,GAAG;AACvE,SAAO,GAAG,QAAQ,CAAC,IAAI,SAAS,EAAE,IAAI,eAAe;AACvD;AAGA,SAAS,kBACP,eACA,QACA,OAA6B;AAE7B,SAAO,yBAAyB,aAAa,IAAI,MAAM,IAAI,KAAK;AAClE;AAQA,eAAe,sBACb,QACA,aACA,eACA,QAAc;AAEd,QAAM,UAAU,MAAM,mBACpBC,MAAK,KAAK,QAAQ,WAAW,GAAG,WAAW,QAAQ,GACnD,WAAW;AAEb,QAAM,cAAc,kBAAkB,eAAe,QAAQ,OAAO;AACpE,QAAM,mBAAmB,kBAAkB,eAAe,QAAQ,YAAY;AAC9E,WAAS,QAAQ,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC3D,UAAM,UAAU,QAAQ,KAAK,EAAE;AAC/B,QAAI,YAAY,aAAa;AAC3B,aAAO;IACT;AACA,QAAI,YAAY,kBAAkB;AAChC,aAAO;IACT;EACF;AACA,SAAO;AACT;AAGA,eAAe,2BACb,QACA,UAA0B;AAE1B,QAAM,WAAW,MAAM,iBAAiB,QAAQ,SAAS,EAAE;AAC3D,MAAI,UAAU,cAAc,QAAW;AACrC,UAAM,IAAI,WACR,QAAQ,SAAS,EAAE,WAAW,SAAS,EAAE,gDACzC,UAAU,SAAS;EAEvB;AACA,SAAO,EAAE,mBAAmB,SAAS,UAAS;AAChD;AAGA,eAAe,oBACb,QACA,QACA,QACA,MAA+C;AAE/C,QAAM,SACJ,SAAS,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,IAC5D,KAAK,oBACL;AACN,MAAI,OAAO,WAAW,UAAU;AAC9B;EACF;AACA,MAAK,MAAM,iBAAiB,OAAO,QAAQ,MAAM,MAAO,QAAW;AACjE;EACF;AACA,QAAM,QACJ,QACA,QACA;IACE,OAAO;IACP,QAAQ,OAAO;IACf,SAAS,kBAAkB,OAAO,eAAe,QAAQ,YAAY;KAEvE,EAAE,QAAQ,OAAO,OAAM,CAAE;AAE7B;AAGA,SAAS,gBACP,QAMA,UACA,QAAc;AAEd,SAAO;IACL,IAAI;IACJ,MAAM,UAAO;AACX,YAAM,WAAW,MAAM,iBAAiB,OAAO,QAAQ,SAAS,EAAE;AAClE,UAAI,aAAa,QAAW;AAC1B,eAAO,EAAE,OAAO,UAAS;MAC3B;AACA,aAAO,EAAE,OAAO,WAAW,QAAQ,EAAE,IAAI,SAAS,IAAI,IAAI,SAAQ,EAAE;IACtE;IACA,MAAM,QAAK;AACT,YAAM,UAAU,MAAM,OACpB,EAAE,GAAG,SAAS,SAAS,QAAQ,OAAO,QAAQ,IAAI,SAAS,GAAE,GAC7D,EAAE,QAAQ,OAAO,OAAM,CAAE;AAE3B,YAAM,cAAc,QAAQ;AAC5B,aAAO,EAAE,IAAI,OAAO,YAAY,EAAE,GAAG,IAAI,SAAQ;IACnD;IACA,MAAM,aAAU;AACd,YAAM,WAAW,MAAM,iBAAiB,OAAO,QAAQ,SAAS,EAAE;AAClE,UAAI,aAAa,QAAW;AAC1B;MACF;AACA,UAAI,OAAO,uBAAuB,UAAU;AAC1C,cAAM,WACJ,SAAS,IACT;UACE,OAAO;UACP,QAAQ,OAAO;UACf,SAAS,2CAA2C,OAAO,aAAa;WAE1E,EAAE,QAAQ,OAAO,OAAM,CAAE;AAE3B;MACF;AACA,UAAI,SAAS,aAAa,QAAW;AACnC;MACF;AACA,YAAM,MACJ,SAAS,IACT,6CAA6C,OAAO,aAAa,IACjE,EAAE,OAAO,MAAM,QAAQ,OAAO,OAAM,GACpC,EAAE,QAAQ,OAAO,OAAM,CAAE;IAE7B;;AAEJ;AAGA,SAAS,gBACP,QACA,UACA,QAAc;AAEd,SAAO;IACL,IAAI;IACJ,MAAM,UAAO;AACX,YAAM,WAAW,MAAM,iBAAiB,OAAO,QAAQ,SAAS,EAAE;AAClE,UAAI,aAAa,QAAW;AAC1B,eAAO,EAAE,OAAO,UAAS;MAC3B;AACA,YAAM,UAAU,MAAM,sBACpB,OAAO,QACP,SAAS,IACT,OAAO,eACP,MAAM;AAER,UAAI,CAAC,SAAS;AACZ,eAAO,EAAE,OAAO,UAAS;MAC3B;AACA,aAAO,EAAE,OAAO,WAAW,QAAQ,EAAE,IAAI,SAAS,IAAI,IAAI,SAAQ,EAAE;IACtE;IACA,MAAM,sBAAmB;AACvB,aAAO,2BAA2B,OAAO,QAAQ,QAAQ;IAC3D;IACA,MAAM,QAAK;AACT,YAAM,UAAU,MAAM,OACpB,SAAS,IACT;QACE,GAAG,SAAS;QACZ,QAAQ,OAAO;QACf,SAAS,kBAAkB,OAAO,eAAe,QAAQ,OAAO;SAElE,EAAE,QAAQ,OAAO,OAAM,CAAE;AAE3B,YAAM,cAAc,QAAQ;AAC5B,aAAO,EAAE,IAAI,OAAO,YAAY,EAAE,GAAG,IAAI,SAAQ;IACnD;IACA,MAAM,WACJ,MAAoC;AAEpC,YAAM,oBAAoB,QAAQ,SAAS,IAAI,QAAQ,IAAI;IAC7D;;AAEJ;AAGA,SAAS,eACP,QACA,UACA,QAAc;AAEd,SAAO;IACL,IAAI;;;IAGJ,MAAM,UAAO;AACX,YAAM,WAAW,MAAM,iBAAiB,OAAO,QAAQ,SAAS,EAAE;AAClE,UAAI,UAAU,aAAa,QAAW;AACpC,eAAO,EAAE,OAAO,UAAS;MAC3B;AACA,aAAO,EAAE,OAAO,WAAW,QAAQ,EAAE,IAAI,SAAS,IAAI,IAAI,QAAO,EAAE;IACrE;IACA,MAAM,sBAAmB;AACvB,aAAO,2BAA2B,OAAO,QAAQ,QAAQ;IAC3D;IACA,MAAM,QAAK;AACT,YAAM,SAAS,MAAM,MACnB,SAAS,IACT,SAAS,QACT,EAAE,GAAG,SAAS,SAAS,QAAQ,OAAO,OAAM,GAC5C,EAAE,QAAQ,OAAO,OAAM,CAAE;AAE3B,YAAM,aAAa,OAAO;AAC1B,aAAO,EAAE,IAAI,OAAO,WAAW,EAAE,GAAG,IAAI,QAAO;IACjD;IACA,MAAM,WACJ,MAAoC;AAEpC,YAAM,oBAAoB,QAAQ,SAAS,IAAI,QAAQ,IAAI;IAC7D;;AAEJ;AAGA,SAAS,qBACP,QAMA,UACA,OAAa;AAEb,QAAM,SAAS,aAAa,UAAU,KAAK;AAC3C,MAAI,SAAS,OAAO,UAAU;AAC5B,WAAO,gBAAgB,QAAQ,UAAU,MAAM;EACjD;AACA,MAAI,SAAS,OAAO,UAAU;AAC5B,WAAO,gBAAgB,QAAQ,UAAU,MAAM;EACjD;AACA,SAAO,eAAe,QAAQ,UAAU,MAAM;AAChD;AAGA,SAAS,wBACP,UACA,OAAa;AAEb,MACE,aAAa,QACb,OAAO,aAAa,YACpB,MAAM,QAAQ,QAAQ,GACtB;AACA,UAAM,IAAI,UAAU,iBAAiB,QAAQ,CAAC,oBAAoB;EACpE;AACA,MAAI,CAAC,CAAC,UAAU,UAAU,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG;AACxD,UAAM,IAAI,UACR,iBAAiB,QAAQ,CAAC,sCAAsC;EAEpE;AACA,MAAI,OAAO,SAAS,OAAO,YAAY,SAAS,GAAG,KAAI,EAAG,WAAW,GAAG;AACtE,UAAM,IAAI,UAAU,iBAAiB,QAAQ,CAAC,0BAA0B;EAC1E;AACA,MACE,SAAS,OAAO,YACf,OAAO,SAAS,WAAW,YAAY,SAAS,OAAO,KAAI,EAAG,WAAW,IAC1E;AACA,UAAM,IAAI,UACR,uBAAuB,QAAQ,CAAC,8BAA8B;EAElE;AACF;AAaA,eAAsB,oBACpB,SAAmC;AAEnC,QAAM,YAAY,CAAC,GAAG,QAAQ,SAAS;AACvC,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,IAAI,UAAU,sDAAsD;EAC5E;AACA,aAAW,CAAC,OAAO,QAAQ,KAAK,UAAU,QAAO,GAAI;AACnD,4BAAwB,UAAU,KAAK;EACzC;AACA,QAAM,qBAAqB,QAAQ,sBAAsB;AACzD,MAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,kBAAkB,GAAG;AACrD,UAAM,IAAI,UACR,kEAAkE;EAEtE;AACA,QAAM,aAAa;IACjB,QAAQ,QAAQ;IAChB,QAAQ,QAAQ;IAChB,eAAe,QAAQ;IACvB;;AAEF,QAAM,YAAY,MAAM,2BAA2B;IACjD,QAAQ,QAAQ;IAChB,eAAe,QAAQ;IACvB,QAAQ,QAAQ;IAChB,OAAO,UAAU,IAAI,CAAC,UAAU,UAC9B,qBAAqB,YAAY,UAAU,KAAK,CAAC;IAEnD,GAAI,QAAQ,mBAAmB,SAC3B,CAAA,IACA,EAAE,gBAAgB,QAAQ,eAAc;IAC5C,GAAI,QAAQ,eAAe,SACvB,CAAA,IACA,EAAE,YAAY,QAAQ,WAAU;IACpC,GAAI,QAAQ,iBAAiB,SACzB,CAAA,IACA,EAAE,cAAc,QAAQ,aAAY;GACzC;AACD,QAAM,UAAmD,CAAA;AACzD,aAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,UAAU,OAAO,GAAG;AAG/D,YAAQ,MAAM,IAAI;EACpB;AACA,SAAO;IACL,eAAe,UAAU;IACzB,QAAQ;IACR,WAAW,UAAU;IACrB;;AAEJ;AAGO,IAAM,2BAA2B;EACtC;EACA;EACA;EACA;EACA;EACA","debugId":"69f422b7-7912-5517-91f9-247ad58bd84c"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../../cli/commands/copy.ts"],"sourcesContent":["/**\n * @module cli/commands/copy\n *\n * Implements the pm copy command surface and its agent-facing runtime behavior.\n */\nimport {\n pathExists,\n removeFileIfExists,\n writeFileAtomic,\n} from \"../../core/fs/fs-utils.js\";\nimport {\n appendHistoryEntry,\n createHistoryEntry,\n} from \"../../core/history/history.js\";\nimport { generateItemId } from \"../../core/item/id.js\";\nimport {\n canonicalDocument,\n serializeItemDocument,\n} from \"../../core/item/item-format.js\";\nimport { acquireLock } from \"../../core/lock/lock.js\";\nimport {\n getActiveExtensionRegistrations,\n projectAfterCommandItemSnapshot,\n recordAfterCommandAffectedItem,\n runActiveOnWriteHooks,\n} from \"../../core/extensions/index.js\";\nimport { collectRegisteredItemFieldNames } from \"../../core/extensions/item-fields.js\";\nimport { resolveRuntimeStatusRegistry } from \"../../core/schema/runtime-schema.js\";\nimport {\n EXIT_CODE,\n ITEM_METADATA_KEY_ORDER,\n} from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { nowIso } from \"../../core/shared/time.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport {\n buildItemNotFoundError,\n locateItem,\n readLocatedItem,\n} from \"../../core/store/item-store.js\";\nimport {\n getHistoryPath,\n getItemPath,\n getSettingsPath,\n resolvePmRoot,\n} from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemDocument, ItemMetadata } from \"../../types/index.js\";\n\n/** Documents the copy options payload exchanged by command, SDK, and package integrations. */\nexport interface CopyOptions {\n /** Value that configures or reports title for this contract. */\n title?: string;\n /** Value that configures or reports author for this contract. */\n author?: string;\n /** Human-readable explanation suitable for logs and agent-facing output. */\n message?: string;\n}\n\n/** Documents the copy result payload exchanged by command, SDK, and package integrations. */\nexport interface CopyResult {\n /** Value that configures or reports source id for this contract. */\n source_id: string;\n /** Value that configures or reports item for this contract. */\n item: ItemMetadata;\n /** Value that configures or reports changed fields for this contract. */\n changed_fields: string[];\n /** Value that configures or reports warnings for this contract. */\n warnings: string[];\n}\n\nfunction selectAuthor(\n explicitAuthor: string | undefined,\n settingsAuthor: string,\n): string {\n const candidate = explicitAuthor ?? process.env.PM_AUTHOR ?? settingsAuthor;\n const trimmed = candidate.trim();\n return trimmed.length > 0 ? trimmed : \"unknown\";\n}\n\nfunction buildChangedFields(itemMetadata: ItemMetadata, body: string): string[] {\n const changed = [\n ...new Set([\n ...ITEM_METADATA_KEY_ORDER.filter((key) => itemMetadata[key] !== undefined),\n ...Object.keys(itemMetadata).filter(\n (key) => itemMetadata[key] !== undefined,\n ),\n ...(body.length > 0 ? [\"body\"] : []),\n ]),\n ];\n return changed.sort((left, right) => left.localeCompare(right));\n}\n\nfunction buildCopyMessage(\n sourceId: string,\n message: string | undefined,\n): string {\n const suffix = `copied_from=${sourceId}`;\n if (!message) {\n return suffix;\n }\n const trimmed = message.trim();\n return trimmed.length > 0 ? `${trimmed} | ${suffix}` : suffix;\n}\n\n/** Implements run copy for the public runtime surface of this module. */\nexport async function runCopy(\n sourceId: string,\n options: CopyOptions,\n global: GlobalOptions,\n): Promise<CopyResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(\n `Tracker is not initialized at ${pmRoot}. Run pm init first.`,\n EXIT_CODE.NOT_FOUND,\n );\n }\n\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(\n settings,\n getActiveExtensionRegistrations(),\n );\n const located = await locateItem(\n pmRoot,\n sourceId,\n settings.id_prefix,\n settings.item_format,\n typeRegistry.type_to_folder,\n );\n if (!located) {\n throw await buildItemNotFoundError(\n pmRoot,\n sourceId,\n settings.id_prefix,\n typeRegistry.type_to_folder,\n );\n }\n const sourceLoaded = await readLocatedItem(located, {\n schema: settings.schema,\n });\n const sourceMetadata = sourceLoaded.document.metadata;\n const copiedAt = nowIso();\n const author = selectAuthor(options.author, settings.author_default);\n const newId = await generateItemId(pmRoot, settings.id_prefix, {\n tokenLength: settings.ids.token_length,\n });\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const titleOverride = options.title?.trim();\n if (titleOverride !== undefined && titleOverride.length === 0) {\n throw new PmCliError(\"Copy --title must not be empty\", EXIT_CODE.USAGE);\n }\n\n const copiedMetadata: ItemMetadata = {\n ...(sourceMetadata as Record<string, unknown>),\n id: newId,\n title: titleOverride ?? sourceMetadata.title,\n status: statusRegistry.open_status,\n created_at: copiedAt,\n updated_at: copiedAt,\n } as ItemMetadata;\n delete copiedMetadata.closed_at;\n delete copiedMetadata.close_reason;\n delete copiedMetadata.test_runs;\n\n const extensionFieldNames = collectRegisteredItemFieldNames(\n getActiveExtensionRegistrations(),\n );\n const copiedDocument = canonicalDocument(\n {\n metadata: copiedMetadata,\n body: sourceLoaded.document.body,\n },\n {\n schema: settings.schema,\n extensionFieldNames,\n },\n );\n const changedFields = buildChangedFields(\n copiedDocument.metadata,\n copiedDocument.body,\n );\n const itemPath = getItemPath(\n pmRoot,\n copiedDocument.metadata.type,\n newId,\n settings.item_format,\n typeRegistry.type_to_folder,\n );\n const historyPath = getHistoryPath(pmRoot, newId);\n const lockRelease = await acquireLock(\n pmRoot,\n newId,\n settings.locks.ttl_seconds,\n author,\n false,\n settings.governance.force_required_for_stale_lock,\n settings.locks.wait_ms,\n );\n const beforeDocument: ItemDocument = {\n metadata: {} as ItemMetadata,\n body: \"\",\n };\n\n let hookWarnings: string[] = [];\n try {\n await writeFileAtomic(\n itemPath,\n serializeItemDocument(copiedDocument, {\n format: settings.item_format,\n schema: settings.schema,\n extensionFieldNames,\n }),\n );\n try {\n const historyEntry = createHistoryEntry({\n nowIso: copiedAt,\n author,\n op: \"create\",\n before: beforeDocument,\n after: copiedDocument,\n message: buildCopyMessage(located.id, options.message),\n });\n await appendHistoryEntry(historyPath, historyEntry);\n } catch (error: unknown) {\n await removeFileIfExists(itemPath);\n throw error;\n }\n\n hookWarnings = [\n ...(await runActiveOnWriteHooks({\n path: itemPath,\n scope: \"project\",\n op: \"create\",\n item_id: copiedDocument.metadata.id,\n item_type: copiedDocument.metadata.type,\n before: beforeDocument,\n after: copiedDocument,\n changed_fields: changedFields,\n })),\n ...(await runActiveOnWriteHooks({\n path: historyPath,\n scope: \"project\",\n op: \"create:history\",\n item_id: copiedDocument.metadata.id,\n item_type: copiedDocument.metadata.type,\n before: beforeDocument,\n after: copiedDocument,\n changed_fields: changedFields,\n })),\n ];\n recordAfterCommandAffectedItem({\n id: copiedDocument.metadata.id,\n op: \"create\",\n item_type: copiedDocument.metadata.type,\n status: copiedDocument.metadata.status,\n current: projectAfterCommandItemSnapshot(\n copiedDocument.metadata,\n changedFields,\n ),\n changed_fields: changedFields,\n });\n } finally {\n await lockRelease();\n }\n\n return {\n source_id: located.id,\n item: structuredClone(copiedDocument.metadata),\n changed_fields: changedFields,\n warnings: hookWarnings,\n };\n}\n"],"names":[],"mappings":"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","debugId":"8d3fe50f-b0a1-529b-9d64-a4f634366aed"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../../sdk/error-runtime.ts","../../../../../../../../sdk/cli-bootstrap.ts","../../../../../../../../sdk/invocation-author.ts","../../../../../../../../sdk/cli-program.ts"],"sourcesContent":["/**\n * @module sdk/error-runtime\n *\n * Provides presentation-independent normalization for values thrown through CLI and SDK runtimes.\n */\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\n\n/** Returns a stable message for errors and unknown thrown values. */\nexport function describeUnknownError(error: unknown): string {\n if (error instanceof PmCliError) {\n return error.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return \"Unknown failure\";\n}\n\n/** Reads a finite numeric exit code from an arbitrary thrown value. */\nexport function readThrownExitCode(error: unknown): number | undefined {\n if (typeof error !== \"object\" || error === null || !(\"exitCode\" in error)) {\n return undefined;\n }\n const exitCode = (error as { exitCode?: unknown }).exitCode;\n return typeof exitCode === \"number\" && Number.isFinite(exitCode)\n ? exitCode\n : undefined;\n}\n\n/** Normalizes thrown exit codes to a positive integer failure status. */\nexport function normalizeThrownExitCode(exitCode: number): number {\n const normalized = Math.trunc(exitCode);\n return normalized > EXIT_CODE.SUCCESS\n ? normalized\n : EXIT_CODE.GENERIC_FAILURE;\n}\n\n/** Identifies errors emitted by Commander without importing its private classes. */\nexport function isCommanderError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof (error as { code?: unknown }).code === \"string\" &&\n (error as { code: string }).code.startsWith(\"commander.\")\n );\n}\n\n/** Converts non-Error thrown values into errors suitable for Sentry capture. */\nexport function wrapThrownErrorForSentry(\n error: unknown,\n message: string,\n): Error {\n if (error instanceof Error) {\n return error;\n }\n const wrapped = new Error(message) as Error & { exitCode?: number };\n const exitCode = readThrownExitCode(error);\n /* c8 ignore next */\n if (exitCode !== undefined) {\n wrapped.exitCode = normalizeThrownExitCode(exitCode);\n }\n return wrapped;\n}\n","/**\n * @module sdk/cli-bootstrap\n *\n * Provides public bootstrap argument normalization for embedded CLI hosts.\n */\nimport {\n EXECUTABLE_COMMAND_ALIASES,\n resolveSubcommandFlagContractsForCommand,\n type CliFlagContract,\n} from \"./cli-contracts.js\";\nexport { EXECUTABLE_COMMAND_ALIASES };\nimport { levenshteinDistanceWithinLimit } from \"../core/shared/levenshtein.js\";\n\nconst GLOBAL_VALUE_CONSUMING_FLAGS = new Set<string>([\n \"--pm-path\",\n \"--path\",\n \"--author\",\n]);\n\n/** Whether a global value-consuming flag uses its inline `--flag=value` form. */\nconst isInlineGlobalValueToken = (token: string): boolean => {\n const equalsIndex = token.indexOf(\"=\");\n return (\n equalsIndex > 0 &&\n GLOBAL_VALUE_CONSUMING_FLAGS.has(token.slice(0, equalsIndex))\n );\n};\n\n/** Whether optional bootstrap author syntax consumes the following token. */\nconst consumesBootstrapAuthorValue = (next: string | undefined): boolean => {\n return typeof next === \"string\" && !next.startsWith(\"-\");\n};\n\nfunction parseBootstrapPathToken(\n token: string,\n next: string | undefined,\n): { consumed: number; pathValue?: string; preferred: boolean } | null {\n if (token === \"--path\" || token === \"--pm-path\") {\n if (typeof next === \"string\" && next.length > 0) {\n return {\n consumed: 2,\n pathValue: next,\n preferred: token === \"--pm-path\",\n };\n }\n return {\n consumed: 1,\n preferred: token === \"--pm-path\",\n };\n }\n\n const inlinePrefix = token.startsWith(\"--path=\")\n ? \"--path=\"\n : token.startsWith(\"--pm-path=\")\n ? \"--pm-path=\"\n : undefined;\n if (!inlinePrefix) {\n return null;\n }\n\n const value = token.slice(inlinePrefix.length);\n if (value.length > 0) {\n return {\n consumed: 1,\n pathValue: value,\n preferred: inlinePrefix === \"--pm-path=\",\n };\n }\n return {\n consumed: 1,\n preferred: inlinePrefix === \"--pm-path=\",\n };\n}\n\n/** Documents the bootstrap global options payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapGlobalOptions {\n /** Filesystem path used for path resolution. */\n path?: string;\n /** Value that configures or reports no extensions for this contract. */\n noExtensions: boolean;\n /** Value that configures or reports no pager for this contract. */\n noPager: boolean;\n /** Value that configures or reports json for this contract. */\n json: boolean;\n /** Value that configures or reports quiet for this contract. */\n quiet: boolean;\n /** Whether compact JSON projection is requested. */\n lean: boolean;\n /** Invocation-wide mutation author override. */\n author?: string;\n /** Whether `--author` was present without its required value. */\n authorMissingValue?: true;\n}\n\nconst BOOTSTRAP_BOOLEAN_FLAGS = new Set([\n \"--no-extensions\",\n \"--no-pager\",\n \"--json\",\n \"--quiet\",\n \"--lean\",\n]);\n\n/** Implements parse bootstrap global options for the public runtime surface of this module. */\nexport function parseBootstrapGlobalOptions(\n argv: string[],\n): BootstrapGlobalOptions {\n let legacyPathValue: string | undefined;\n let pmPathValue: string | undefined;\n const booleanFlags = new Set<string>();\n let author: string | undefined;\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n break;\n }\n if (BOOTSTRAP_BOOLEAN_FLAGS.has(token)) {\n booleanFlags.add(token);\n index += 1;\n continue;\n }\n const parsedPath = parseBootstrapPathToken(token, argv[index + 1]);\n if (parsedPath) {\n if (parsedPath.pathValue !== undefined) {\n if (parsedPath.preferred) {\n pmPathValue = parsedPath.pathValue;\n } else {\n legacyPathValue = parsedPath.pathValue;\n }\n }\n index += parsedPath.consumed;\n continue;\n }\n if (token === \"--author\") {\n if (consumesBootstrapAuthorValue(argv[index + 1])) {\n author = argv[index + 1];\n index += 2;\n } else {\n author = \"\";\n index += 1;\n }\n continue;\n }\n if (token.startsWith(\"--author=\")) {\n author = token.slice(\"--author=\".length);\n index += 1;\n continue;\n }\n index += 1;\n }\n return {\n path: pmPathValue ?? legacyPathValue,\n noExtensions: booleanFlags.has(\"--no-extensions\"),\n noPager: booleanFlags.has(\"--no-pager\"),\n json: booleanFlags.has(\"--json\"),\n quiet: booleanFlags.has(\"--quiet\"),\n lean: booleanFlags.has(\"--lean\"),\n ...(author === \"\"\n ? { authorMissingValue: true }\n : author !== undefined\n ? { author }\n : {}),\n };\n}\n\n/** Implements strip global bootstrap tokens for the public runtime surface of this module. */\nexport function stripGlobalBootstrapTokens(argv: string[]): string[] {\n const remaining: string[] = [];\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n break;\n }\n if (\n token === \"--json\" ||\n token === \"--quiet\" ||\n token === \"--lean\" ||\n token === \"--no-extensions\" ||\n token === \"--no-pager\" ||\n token === \"--profile\" ||\n token === \"--id-only\" ||\n token === \"--full-changed-fields\" ||\n token === \"--explain\"\n ) {\n index += 1;\n continue;\n }\n if (token === \"--author\") {\n index += consumesBootstrapAuthorValue(argv[index + 1]) ? 2 : 1;\n continue;\n }\n if (GLOBAL_VALUE_CONSUMING_FLAGS.has(token)) {\n index += 2;\n continue;\n }\n if (isInlineGlobalValueToken(token)) {\n index += 1;\n continue;\n }\n remaining.push(token);\n index += 1;\n }\n return remaining;\n}\n\n/** Documents the bootstrap help request payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapHelpRequest {\n /** Value that configures or reports requested for this contract. */\n requested: boolean;\n /** Value that configures or reports command path tokens for this contract. */\n commandPathTokens: string[];\n}\n\n/** Implements parse bootstrap help request for the public runtime surface of this module. */\nexport function parseBootstrapHelpRequest(\n argv: string[],\n): BootstrapHelpRequest {\n const stripped = stripGlobalBootstrapTokens(argv);\n const first = stripped[0]?.trim().toLowerCase();\n if (first === \"help\") {\n const commandPathTokens: string[] = [];\n for (let index = 1; index < stripped.length; index += 1) {\n const token = stripped[index];\n if (token.startsWith(\"-\")) {\n break;\n }\n commandPathTokens.push(token.trim().toLowerCase());\n }\n return {\n requested: true,\n commandPathTokens,\n };\n }\n\n const helpFlagIndex = stripped.findIndex(\n (token) => token === \"--help\" || token === \"-h\",\n );\n if (helpFlagIndex < 0) {\n return {\n requested: false,\n commandPathTokens: [],\n };\n }\n\n const commandPathTokens: string[] = [];\n for (const token of stripped) {\n if (token.startsWith(\"-\")) {\n break;\n }\n commandPathTokens.push(token.trim().toLowerCase());\n }\n return {\n requested: true,\n commandPathTokens,\n };\n}\n\n/**\n * Index of the command token in argv — the first non-flag token, skipping the\n * value-consuming/global bootstrap flags. Returns undefined when there is none\n * (bare invocation, only global flags, or a leading `--`). Single source of truth\n * for command-position scanning shared by {@link parseBootstrapCommandName} and the\n * command-alias rewrite so their precedence rules can never drift apart.\n */\nfunction findCommandTokenIndex(argv: string[]): number | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === \"--\") {\n return undefined;\n }\n if (token === \"--author\") {\n index += consumesBootstrapAuthorValue(argv[index + 1]) ? 1 : 0;\n continue;\n }\n if (GLOBAL_VALUE_CONSUMING_FLAGS.has(token)) {\n index += 1;\n continue;\n }\n if (\n isInlineGlobalValueToken(token) ||\n token === \"--json\" ||\n token === \"--quiet\" ||\n token === \"--lean\" ||\n token === \"--no-extensions\" ||\n token === \"--no-pager\" ||\n token === \"--profile\" ||\n token === \"--id-only\" ||\n token === \"--explain\"\n ) {\n continue;\n }\n if (token.startsWith(\"-\")) {\n continue;\n }\n return index;\n }\n return undefined;\n}\n\n/** Implements parse bootstrap command name for the public runtime surface of this module. */\nexport function parseBootstrapCommandName(argv: string[]): string | undefined {\n const index = findCommandTokenIndex(argv);\n return index === undefined ? undefined : argv[index].trim().toLowerCase();\n}\n\nfunction shouldDisablePagerForInvocation(\n argv: string[],\n bootstrapGlobal: BootstrapGlobalOptions,\n): boolean {\n if (bootstrapGlobal.noPager) {\n return true;\n }\n if (process.stdout.isTTY === true) {\n return false;\n }\n const helpRequest = parseBootstrapHelpRequest(argv);\n return helpRequest.requested;\n}\n\n/** Implements apply bootstrap pager policy for the public runtime surface of this module. */\nexport function applyBootstrapPagerPolicy(argv: string[]): () => void {\n const pagerEnvironmentKeys = [\n \"PAGER\",\n \"MANPAGER\",\n \"GIT_PAGER\",\n \"LESS\",\n ] as const;\n const previousValues = pagerEnvironmentKeys.map((key) => process.env[key]);\n const restore = (): void => {\n for (const [index, key] of pagerEnvironmentKeys.entries()) {\n const value = previousValues[index];\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n }\n };\n const bootstrapGlobal = parseBootstrapGlobalOptions(argv);\n if (!shouldDisablePagerForInvocation(argv, bootstrapGlobal)) {\n return restore;\n }\n process.env.PAGER = \"cat\";\n process.env.MANPAGER = \"cat\";\n process.env.GIT_PAGER = \"cat\";\n if (\n typeof process.env.LESS !== \"string\" ||\n process.env.LESS.trim().length === 0\n ) {\n process.env.LESS = \"FRX\";\n }\n return restore;\n}\n\ntype ExtensionSubcommandAction =\n | \"init\"\n | \"install\"\n | \"uninstall\"\n | \"explore\"\n | \"manage\"\n | \"doctor\"\n | \"adopt\"\n | \"adopt-all\"\n | \"activate\"\n | \"deactivate\";\n\nconst EXTENSION_ACTION_SYNTAX_TOKENS = new Set<ExtensionSubcommandAction>([\n \"install\",\n \"uninstall\",\n \"explore\",\n \"manage\",\n \"doctor\",\n \"adopt\",\n \"adopt-all\",\n \"activate\",\n \"deactivate\",\n]);\n\n/** Implements normalize legacy extension action syntax for the public runtime surface of this module. */\nexport function normalizeLegacyExtensionActionSyntax(argv: string[]): string[] {\n const extensionIndex = findCommandTokenIndex(argv);\n if (extensionIndex === undefined || argv[extensionIndex] !== \"extension\") {\n return [...argv];\n }\n const actionToken = argv[extensionIndex + 1];\n if (!actionToken || actionToken.startsWith(\"-\")) {\n return [...argv];\n }\n if (\n !EXTENSION_ACTION_SYNTAX_TOKENS.has(\n actionToken as ExtensionSubcommandAction,\n )\n ) {\n return [...argv];\n }\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n return [...argv];\n }\n const forcedActionFlag = `--${actionToken}`;\n if (argv.includes(forcedActionFlag)) {\n return [...argv];\n }\n return [\n ...argv.slice(0, extensionIndex + 1),\n forcedActionFlag,\n ...argv.slice(extensionIndex + 2),\n ];\n}\n\ntype BootstrapNormalizationReason =\n | \"legacy_extension_action\"\n | \"command_alias\"\n | \"flag_alias\"\n | \"flag_typo\"\n | \"bare_key_value\"\n | \"list_merge\";\ntype BootstrapNormalizationConfidence = \"high\" | \"medium\";\n\n/** Executable command aliases: a leading command token here is rewritten to its canonical command BEFORE commander parses, so the alias actually runs instead of merely being suggested. These are the highest-frequency aliases real agents type (telemetry: `pm show <id>` alone is the single most common unknown-command) and each target takes the same positional/flags as the alias (with `--comment`/ `--note`/`--learning` flag-aliased to `--add` on the target command). Keeping this in one place means the alias is consistent across registration, commander dispatch, telemetry, and error handling — all of which read the normalized argv. */\n/**\n * Rewrite a leading command-alias token (e.g. `show` -> `get`) in place. Only the\n * command position is considered — the same token appearing later as an argument\n * (`pm get show`) is left untouched — and only when it is not preceded by `--` or a\n * value-consuming global flag, mirroring {@link parseBootstrapCommandName}.\n */\nfunction rewriteCommandAlias(\n argv: string[],\n trace: BootstrapNormalizationEvent[],\n): string[] {\n const index = findCommandTokenIndex(argv);\n if (index === undefined) {\n return argv;\n }\n const token = argv[index];\n const canonical = EXECUTABLE_COMMAND_ALIASES[token.trim().toLowerCase()];\n if (!canonical) {\n return argv;\n }\n const rewritten = [...argv];\n rewritten[index] = canonical;\n trace.push({\n from: token,\n to: [canonical],\n reason: \"command_alias\",\n confidence: \"high\",\n });\n return rewritten;\n}\n\n/** Documents the bootstrap normalization event payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapNormalizationEvent {\n /** Value that configures or reports from for this contract. */\n from: string;\n /** Value that configures or reports to for this contract. */\n to: string[];\n /** Value that configures or reports reason for this contract. */\n reason: BootstrapNormalizationReason;\n /** Value that configures or reports confidence for this contract. */\n confidence: BootstrapNormalizationConfidence;\n}\n\n/** Documents the bootstrap invocation normalization result payload exchanged by command, SDK, and package integrations. */\nexport interface BootstrapInvocationNormalizationResult {\n /** Value that configures or reports argv for this contract. */\n argv: string[];\n /** Value that configures or reports command name for this contract. */\n commandName: string | undefined;\n /** Value that configures or reports trace for this contract. */\n trace: BootstrapNormalizationEvent[];\n}\n\ninterface FlagLookup {\n canonicalByNormalized: Map<string, string | null>;\n canonicalByCompact: Map<string, string | null>;\n canonicalComparables: Array<{ canonicalFlag: string; comparable: string }>;\n listCanonicalFlags: Set<string>;\n}\n\nfunction normalizeFlagKeyToken(raw: string): string {\n const withoutPrefix = raw.replace(/^--?/, \"\");\n return withoutPrefix\n .replace(/_/g, \"-\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\nfunction toComparableFlagKey(raw: string): string {\n return normalizeFlagKeyToken(raw).replace(/-/g, \"\");\n}\n\nfunction markUnambiguousFlag(\n map: Map<string, string | null>,\n key: string,\n canonicalFlag: string,\n): void {\n const existing = map.get(key);\n if (existing === undefined) {\n map.set(key, canonicalFlag);\n return;\n }\n if (existing !== canonicalFlag) {\n map.set(key, null);\n }\n}\n\nfunction collectLongFlagCandidates(contract: CliFlagContract): string[] {\n const candidates: string[] = [];\n const pushLongFlag = (value: string | undefined): void => {\n if (typeof value !== \"string\") {\n return;\n }\n if (!value.startsWith(\"--\")) {\n return;\n }\n candidates.push(value);\n };\n pushLongFlag(contract.flag);\n for (const alias of contract.aliases ?? []) {\n pushLongFlag(alias);\n }\n return candidates;\n}\n\nfunction buildFlagLookup(\n commandName: string | undefined,\n contractsOverride?: CliFlagContract[],\n): FlagLookup {\n const contracts =\n contractsOverride ?? resolveSubcommandFlagContractsForCommand(commandName);\n const canonicalByNormalized = new Map<string, string | null>();\n const canonicalByCompact = new Map<string, string | null>();\n const canonicalComparablesMap = new Map<string, string>();\n const listCanonicalFlags = new Set<string>();\n for (const contract of contracts) {\n const longCandidates = collectLongFlagCandidates(contract);\n if (longCandidates.length === 0) {\n continue;\n }\n const canonicalFlag = `--${normalizeFlagKeyToken(longCandidates[0])}`;\n for (const candidate of longCandidates) {\n markUnambiguousFlag(\n canonicalByNormalized,\n normalizeFlagKeyToken(candidate),\n canonicalFlag,\n );\n markUnambiguousFlag(\n canonicalByCompact,\n toComparableFlagKey(candidate),\n canonicalFlag,\n );\n }\n const comparable = toComparableFlagKey(canonicalFlag);\n if (!canonicalComparablesMap.has(canonicalFlag)) {\n canonicalComparablesMap.set(canonicalFlag, comparable);\n }\n if (contract.list === true) {\n listCanonicalFlags.add(canonicalFlag);\n }\n }\n return {\n canonicalByNormalized,\n canonicalByCompact,\n canonicalComparables: [...canonicalComparablesMap.entries()].map(\n ([canonicalFlag, comparable]) => ({\n canonicalFlag,\n comparable,\n }),\n ),\n listCanonicalFlags,\n };\n}\n\nfunction resolveCanonicalFlag(\n rawKey: string,\n lookup: FlagLookup,\n): {\n flag: string;\n reason: \"flag_alias\" | \"flag_typo\";\n confidence: BootstrapNormalizationConfidence;\n} | null {\n const normalizedKey = normalizeFlagKeyToken(rawKey);\n const direct = lookup.canonicalByNormalized.get(normalizedKey);\n if (typeof direct === \"string\") {\n return {\n flag: direct,\n reason: \"flag_alias\",\n confidence: \"high\",\n };\n }\n const comparableKey = normalizedKey.replace(/-/g, \"\");\n const compactMatch = lookup.canonicalByCompact.get(comparableKey);\n if (typeof compactMatch === \"string\") {\n return {\n flag: compactMatch,\n reason: \"flag_alias\",\n confidence: \"high\",\n };\n }\n const maxDistance = comparableKey.length >= 8 ? 2 : 1;\n let bestDistance = Number.POSITIVE_INFINITY;\n let bestFlag: string | undefined;\n let tied = false;\n for (const candidate of lookup.canonicalComparables) {\n const distance = levenshteinDistanceWithinLimit(\n comparableKey,\n candidate.comparable,\n maxDistance,\n );\n if (distance === null) {\n continue;\n }\n if (distance < bestDistance) {\n bestDistance = distance;\n bestFlag = candidate.canonicalFlag;\n tied = false;\n continue;\n }\n if (distance === bestDistance && bestFlag !== candidate.canonicalFlag) {\n tied = true;\n }\n }\n if (\n !bestFlag ||\n tied ||\n !Number.isFinite(bestDistance) ||\n bestDistance <= 0\n ) {\n return null;\n }\n return {\n flag: bestFlag,\n reason: \"flag_typo\",\n confidence: bestDistance >= 2 ? \"medium\" : \"high\",\n };\n}\n\n/** Implements list alias plural keys for the public runtime surface of this module. */\nexport function listAliasPluralKeys(normalizedKey: string): string[] {\n const candidates = [`${normalizedKey}s`];\n if (normalizedKey.endsWith(\"y\") && normalizedKey.length > 1) {\n candidates.push(`${normalizedKey.slice(0, -1)}ies`);\n }\n return candidates;\n}\n\nfunction parseBareKeyValueToken(\n token: string,\n preserve = false,\n): { key: string; value: string } | null {\n if (preserve || token.includes(\"://\")) {\n return null;\n }\n const match = token.match(/^([A-Za-z][A-Za-z0-9_-]{1,63})([:=])(.*)$/);\n if (!match) {\n return null;\n }\n const key = match[1];\n const value = match[3];\n if (value.length === 0) {\n return null;\n }\n return {\n key,\n value,\n };\n}\n\nfunction normalizeLongOptionToken(\n token: string,\n lookup: FlagLookup,\n preserve = false,\n): { tokens: string[]; event?: BootstrapNormalizationEvent } {\n if (preserve || !token.startsWith(\"--\")) {\n return { tokens: [token] };\n }\n const equalsIndex = token.indexOf(\"=\");\n const key = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;\n const inlineValue =\n equalsIndex >= 0 ? token.slice(equalsIndex + 1) : undefined;\n const resolution = resolveCanonicalFlag(key, lookup);\n if (!resolution) {\n return { tokens: [token] };\n }\n const normalizedToken =\n inlineValue === undefined\n ? resolution.flag\n : `${resolution.flag}=${inlineValue}`;\n if (normalizedToken === token) {\n return { tokens: [token] };\n }\n return {\n tokens: [normalizedToken],\n event: {\n from: token,\n to: [normalizedToken],\n reason: resolution.reason,\n confidence: resolution.confidence,\n },\n };\n}\n\n/** Locate global path-value tokens that normalization must preserve literally. */\nfunction collectBootstrapPathValueIndices(argv: string[]): Set<number> {\n const indices = new Set<number>();\n let expectsValue = false;\n for (let index = 0; index < argv.length; index += 1) {\n if (expectsValue) {\n indices.add(index);\n expectsValue = false;\n continue;\n }\n const token = argv[index];\n expectsValue = token === \"--path\" || token === \"--pm-path\";\n }\n return indices;\n}\n\n// Global option flags whose value may legitimately begin with \"--\" (commander\n// accepts such values). Their value token must not be reinterpreted as a list\n// flag during coalescing. `--pm-path <dir>` and its legacy `--path <dir>`\n// alias are the documented cases; other globals\n// (--json/--quiet/--no-extensions/--no-pager/--profile) are boolean.\nfunction splitCanonicalListToken(\n token: string,\n): { flag: string; inlineValue?: string } | null {\n if (!token.startsWith(\"--\")) {\n return null;\n }\n const equalsIndex = token.indexOf(\"=\");\n if (equalsIndex < 0) {\n return { flag: token };\n }\n return {\n flag: token.slice(0, equalsIndex),\n inlineValue: token.slice(equalsIndex + 1),\n };\n}\n\ninterface ListFlagSlot {\n outputIndex: number;\n originalTokens: string[];\n values: string[];\n occurrences: number;\n}\n\ninterface ListFlagOccurrence {\n originalTokens: string[];\n value: string | undefined;\n consumed: number;\n}\n\ninterface ValuedListFlagOccurrence {\n originalTokens: string[];\n value: string;\n}\n\nfunction copyValueConsumingFlag(\n argv: string[],\n index: number,\n result: (string | null)[],\n): number {\n result.push(argv[index]);\n const next = argv[index + 1];\n if (typeof next === \"string\" && next !== \"--\") {\n result.push(next);\n return index + 2;\n }\n return index + 1;\n}\n\nfunction readListFlagOccurrence(\n argv: string[],\n index: number,\n parsed: { flag: string; inlineValue?: string },\n multiValueListFlags: Set<string>,\n): ListFlagOccurrence {\n if (parsed.inlineValue !== undefined) {\n return {\n originalTokens: [argv[index]],\n value: parsed.inlineValue,\n consumed: 1,\n };\n }\n\n const values: string[] = [];\n let valueIndex = index + 1;\n while (\n valueIndex < argv.length &&\n argv[valueIndex] !== \"--\" &&\n !argv[valueIndex].startsWith(\"-\") &&\n (values.length === 0 || multiValueListFlags.has(parsed.flag))\n ) {\n values.push(argv[valueIndex]);\n valueIndex += 1;\n }\n\n const consumed = values.length === 0 ? 1 : 1 + values.length;\n return {\n originalTokens: argv.slice(index, index + consumed),\n value: values.length === 0 ? undefined : values.join(\",\"),\n consumed,\n };\n}\n\nfunction recordListFlagOccurrence(\n slots: Map<string, ListFlagSlot>,\n result: (string | null)[],\n flag: string,\n occurrence: ValuedListFlagOccurrence,\n): void {\n const existing = slots.get(flag);\n if (existing) {\n existing.values.push(occurrence.value);\n existing.occurrences += 1;\n return;\n }\n\n slots.set(flag, {\n outputIndex: result.length,\n originalTokens: occurrence.originalTokens,\n values: [occurrence.value],\n occurrences: 1,\n });\n // Reserve the anchor position; finalized after the walk so we know the full\n // merged value or can restore the original token form for single uses.\n result.push(null);\n}\n\nfunction buildListFlagCoalescingSplices(\n slots: Map<string, ListFlagSlot>,\n multiValueListFlags: Set<string>,\n): {\n events: BootstrapNormalizationEvent[];\n splices: Array<{ outputIndex: number; tokens: string[] }>;\n} {\n const events: BootstrapNormalizationEvent[] = [];\n const splices: Array<{ outputIndex: number; tokens: string[] }> = [];\n for (const [flag, slot] of slots) {\n const shouldMerge =\n slot.occurrences >= 2 ||\n (multiValueListFlags.has(flag) && slot.originalTokens.length > 2);\n if (!shouldMerge) {\n splices.push({\n outputIndex: slot.outputIndex,\n tokens: slot.originalTokens,\n });\n continue;\n }\n const mergedToken = `${flag}=${slot.values.join(\",\")}`;\n splices.push({ outputIndex: slot.outputIndex, tokens: [mergedToken] });\n events.push({\n from: `${flag} (x${slot.occurrences})`,\n to: [mergedToken],\n reason: \"list_merge\",\n confidence: \"high\",\n });\n }\n return { events, splices };\n}\n\nfunction applyListFlagSplices(\n result: (string | null)[],\n splices: Array<{ outputIndex: number; tokens: string[] }>,\n): void {\n splices.sort((a, b) => b.outputIndex - a.outputIndex);\n for (const splice of splices) {\n result.splice(splice.outputIndex, 1, ...splice.tokens);\n }\n}\n\n/**\n * Coalesce repeated occurrences of comma-separated list flags into a single\n * `--flag=v1,v2,v3` token anchored at the FIRST occurrence. Without this,\n * Commander treats these flags as scalars and silently keeps only the last\n * value (data loss). Both `--flag value` and `--flag=value` forms are merged;\n * a value-less occurrence is preserved untouched, and a `--` terminator stops\n * coalescing (remainder is passed through verbatim).\n *\n * `valueConsumingFlags` lists option flags (e.g. global `--pm-path`) whose value\n * may itself begin with `--`. Their value token is emitted verbatim so a\n * list-flag-looking value (`--path --tags`) is never reinterpreted as a flag\n * nor allowed to swallow the following command/positional token.\n */\nexport function coalesceRepeatedListFlags(\n argv: string[],\n listFlags: Set<string>,\n valueConsumingFlags: Set<string> = new Set(),\n multiValueListFlags: Set<string> = new Set(),\n): { argv: string[]; events: BootstrapNormalizationEvent[] } {\n if (listFlags.size === 0) {\n return { argv: [...argv], events: [] };\n }\n\n const result: (string | null)[] = [];\n const slots = new Map<string, ListFlagSlot>();\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n result.push(...argv.slice(index));\n break;\n }\n // A value-consuming option in space form owns the next token as its value,\n // even when that value begins with \"--\". Emit both verbatim so the value is\n // never misread as a list-flag occurrence.\n if (valueConsumingFlags.has(token)) {\n index = copyValueConsumingFlag(argv, index, result);\n continue;\n }\n const parsed = splitCanonicalListToken(token);\n if (!parsed || !listFlags.has(parsed.flag)) {\n result.push(token);\n index += 1;\n continue;\n }\n\n const occurrence = readListFlagOccurrence(\n argv,\n index,\n parsed,\n multiValueListFlags,\n );\n if (occurrence.value === undefined) {\n // Value-less occurrence: leave untouched, do not coalesce.\n result.push(token);\n index += occurrence.consumed;\n continue;\n }\n\n recordListFlagOccurrence(slots, result, parsed.flag, {\n originalTokens: occurrence.originalTokens,\n value: occurrence.value,\n });\n index += occurrence.consumed;\n }\n\n // Apply anchor splices from the end so earlier indices stay valid when a\n // single-occurrence anchor expands back into two tokens.\n const { events, splices } = buildListFlagCoalescingSplices(\n slots,\n multiValueListFlags,\n );\n applyListFlagSplices(result, splices);\n\n return { argv: result as string[], events };\n}\n\n/** Linked-test entry keys accepted in the two-token form `pm test <id> --add command \"npm test -- parser\"` (GH-191). Only entry-identity keys are merged: `command`/`cmd` name the shell command and `path` names the test file, so a single key=value entry is meaningful for them. Other structured keys (scope, env_set, assertions, ...) cannot form a valid standalone entry and are left for the normal parser to reject. `--remove` matches existing entries by `command=`/`path=` only, so `cmd` is excluded there. Key names mirror STRUCTURED_LINKED_TEST_KEYS in src/cli/commands/linked-test-entry.ts. */\nconst LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG: ReadonlyMap<\n string,\n ReadonlySet<string>\n> = new Map([\n [\"--add\", new Set([\"command\", \"cmd\", \"path\"])],\n [\"--remove\", new Set([\"command\", \"path\"])],\n]);\n\n/** Sandbox-safe linked-test commands legitimately start with env assignments (`PM_PATH=... PM_GLOBAL_PATH=... vitest run -- parser`), which look like bare key=value settings tokens. When the two preceding tokens are a linked-test flag plus a bare two-token key (`--add command <value>`), the value must be left intact for mergeLinkedTestTwoTokenEntries instead of being rewritten into a canonical flag (e.g. PM_PATH= -> --pm-path), which would silently corrupt the command into `--add command --pm-path ...`. */\nfunction isLinkedTestTwoTokenValuePosition(\n commandName: string | undefined,\n emittedTokens: readonly string[],\n): boolean {\n if (commandName !== \"test\" || emittedTokens.length < 2) {\n return false;\n }\n const key = emittedTokens[emittedTokens.length - 1];\n const flag = emittedTokens[emittedTokens.length - 2];\n const keys = LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG.get(flag);\n return keys !== undefined && keys.has(key);\n}\n\nfunction shouldPreserveBareKeyValueToken(\n commandName: string | undefined,\n emittedTokens: readonly string[],\n): boolean {\n return (\n commandName === \"search\" ||\n isLinkedTestTwoTokenValuePosition(commandName, emittedTokens)\n );\n}\n\n/** Accept the two-token linked-test form `pm test <id> --add command \"npm test -- parser\"` by merging the bare key token and its single quoted value into the documented `--add command=...` shape. Without this merge Commander binds the bare key as the option value and treats the quoted command as an excess positional, failing with \"too many arguments\" (GH-191). The merge only fires when EXACTLY ONE non-flag token follows the bare key, i.e. the value was quoted into one shell token — an unquoted multi-token value stays ambiguous (it may swallow the item id), still fails fast, and is routed to targeted quoting guidance by the commander error classifier instead. */\nexport function mergeLinkedTestTwoTokenEntries(\n argv: string[],\n commandName: string | undefined,\n trace: BootstrapNormalizationEvent[],\n): string[] {\n if (commandName !== \"test\") {\n return argv;\n }\n const result: string[] = [];\n let index = 0;\n while (index < argv.length) {\n const token = argv[index];\n if (token === \"--\") {\n result.push(...argv.slice(index));\n return result;\n }\n const keys = LINKED_TEST_TWO_TOKEN_KEYS_BY_FLAG.get(token);\n const key = keys ? argv[index + 1] : undefined;\n if (!keys || typeof key !== \"string\" || !keys.has(key)) {\n result.push(token);\n index += 1;\n continue;\n }\n let runEnd = index + 2;\n while (runEnd < argv.length && !argv[runEnd].startsWith(\"-\")) {\n runEnd += 1;\n }\n if (runEnd - (index + 2) !== 1) {\n result.push(token);\n index += 1;\n continue;\n }\n const value = argv[index + 2];\n const mergedValue = `${key}=${value}`;\n result.push(token, mergedValue);\n trace.push({\n from: `${token} ${key} ${value}`,\n to: [token, mergedValue],\n reason: \"bare_key_value\",\n confidence: \"high\",\n });\n index += 3;\n }\n return result;\n}\n\n/** Implements normalize bootstrap invocation for the public runtime surface of this module. */\nexport function normalizeBootstrapInvocation(\n argv: string[],\n): BootstrapInvocationNormalizationResult {\n const trace: BootstrapNormalizationEvent[] = [];\n const legacyNormalized = normalizeLegacyExtensionActionSyntax(argv);\n if (\n legacyNormalized.length !== argv.length ||\n legacyNormalized.some((token, index) => token !== argv[index])\n ) {\n trace.push({\n from: argv.join(\" \"),\n to: [...legacyNormalized],\n reason: \"legacy_extension_action\",\n confidence: \"high\",\n });\n }\n const aliasNormalized = rewriteCommandAlias(legacyNormalized, trace);\n const commandName = parseBootstrapCommandName(aliasNormalized);\n const commandPathName = parseBootstrapCommandPathName(aliasNormalized);\n const lookup = buildFlagLookup(commandPathName ?? commandName);\n const normalizedArgv: string[] = [];\n const pathValueIndices = collectBootstrapPathValueIndices(aliasNormalized);\n for (let index = 0; index < aliasNormalized.length; index += 1) {\n const token = aliasNormalized[index];\n if (token === \"--\") {\n normalizedArgv.push(...aliasNormalized.slice(index));\n break;\n }\n const preserveCurrentToken = pathValueIndices.has(index);\n const previous = normalizedArgv[normalizedArgv.length - 1];\n if (token.startsWith(\"--\")) {\n const normalizedToken = normalizeLongOptionToken(\n token,\n lookup,\n preserveCurrentToken,\n );\n normalizedArgv.push(...normalizedToken.tokens);\n if (normalizedToken.event) {\n trace.push(normalizedToken.event);\n }\n continue;\n }\n const bareKeyValue = parseBareKeyValueToken(token, preserveCurrentToken);\n if (\n bareKeyValue &&\n !(typeof previous === \"string\" && previous.startsWith(\"-\")) &&\n !shouldPreserveBareKeyValueToken(commandName, normalizedArgv)\n ) {\n const resolution = resolveCanonicalFlag(bareKeyValue.key, lookup);\n if (resolution) {\n const replacement = [resolution.flag, bareKeyValue.value];\n normalizedArgv.push(...replacement);\n trace.push({\n from: token,\n to: replacement,\n reason: \"bare_key_value\",\n confidence: resolution.confidence,\n });\n continue;\n }\n }\n normalizedArgv.push(token);\n }\n const linkedTestNormalized = mergeLinkedTestTwoTokenEntries(\n normalizedArgv,\n commandName,\n trace,\n );\n const coalesced = coalesceRepeatedListFlags(\n linkedTestNormalized,\n lookup.listCanonicalFlags,\n GLOBAL_VALUE_CONSUMING_FLAGS,\n commandName === \"create\" ? new Set([\"--tags\"]) : new Set(),\n );\n for (const event of coalesced.events) {\n trace.push(event);\n }\n return {\n argv: coalesced.argv,\n commandName,\n trace,\n };\n}\n\nfunction parseBootstrapCommandPathName(argv: string[]): string | undefined {\n const stripped = stripGlobalBootstrapTokens(argv);\n const first = stripped[0]?.trim().toLowerCase();\n const second = stripped[1]?.trim().toLowerCase();\n if (\n (first === \"extension\" || first === \"package\" || first === \"packages\") &&\n typeof second === \"string\" &&\n second.length > 0 &&\n !second.startsWith(\"-\")\n ) {\n return `${first} ${second}`;\n }\n return first;\n}\n\n/** Implements parse bootstrap type value for the public runtime surface of this module. */\nexport function parseBootstrapTypeValue(argv: string[]): string | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === \"--\") {\n break;\n }\n if (token === \"--type\") {\n const candidate = argv[index + 1];\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n return candidate.trim();\n }\n continue;\n }\n if (token.startsWith(\"--type=\")) {\n const candidate = token.slice(\"--type=\".length).trim();\n if (candidate.length > 0) {\n return candidate;\n }\n }\n }\n return undefined;\n}\n\n/** Public contract for test only, shared by SDK and presentation-layer consumers. */\nexport const _testOnly = {\n buildFlagLookup,\n collectBootstrapPathValueIndices,\n collectLongFlagCandidates,\n markUnambiguousFlag,\n normalizeLongOptionToken,\n resolveCanonicalFlag,\n};\n","/**\n * @module sdk/invocation-author\n *\n * Safely scopes invocation-wide mutation authors for one-shot and embedded CLI hosts.\n */\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\n\n/** Apply an optional author override and return an idempotent environment restorer. */\nexport function applyInvocationAuthorOverride(\n author: string | undefined,\n): () => void {\n if (author === undefined) {\n return () => {};\n }\n const normalizedAuthor = author.trim();\n if (normalizedAuthor.length === 0) {\n throw new PmCliError(\n \"--author requires a non-empty value.\",\n EXIT_CODE.USAGE,\n {\n code: \"missing_required_argument\",\n nextSteps: [\"Pass an explicit author identifier with --author <id>.\"],\n },\n );\n }\n const previousAuthor = process.env.PM_AUTHOR;\n process.env.PM_AUTHOR = normalizedAuthor;\n let restored = false;\n return () => {\n if (restored) {\n return;\n }\n restored = true;\n if (previousAuthor === undefined) {\n delete process.env.PM_AUTHOR;\n } else {\n process.env.PM_AUTHOR = previousAuthor;\n }\n };\n}\n","/**\n * @module sdk/cli-program\n *\n * Builds the reusable Commander root that embeds pm's universal global contracts.\n */\nimport { Command } from \"commander\";\nimport { writeStdout } from \"../core/output/output.js\";\n\n/** Create a fresh pm root program suitable for one-shot CLI or embedded hosts. */\nexport function createPmCliProgram(version: string): Command {\n return new Command()\n .name(\"pm\")\n .description(\n \"Universal, flexible, extensible, agent-optimized project management CLI for any project or programming language.\",\n )\n .version(version)\n .showHelpAfterError(false)\n .allowExcessArguments(false)\n .allowUnknownOption(false)\n .configureOutput({\n writeOut: (value) => {\n writeStdout(value);\n },\n writeErr: () => {},\n })\n .option(\"--json\", \"Output JSON instead of TOON\")\n .option(\"--lean\", \"Omit null and empty containers from JSON output\")\n .option(\"--quiet\", \"Suppress stdout output\")\n .option(\n \"--no-changed-fields\",\n \"Omit the changed_fields array from mutation output (keeps changed_field_count)\",\n )\n .option(\n \"--full-changed-fields\",\n \"Restore the legacy full mutation envelope and changed_fields array\",\n )\n .option(\n \"--id-only\",\n \"Print only id and status for single-item mutation output\",\n )\n .option(\n \"--pm-path <dir>\",\n \"Explicit tracker storage path for this command (preferred over --path)\",\n )\n .option(\n \"--path <dir>\",\n \"Backward-compatible alias for --pm-path; this is the tracker storage path, not a workspace cwd\",\n )\n .option(\"--no-extensions\", \"Disable extension loading\")\n .option(\"--no-pager\", \"Disable pager integration for help and long output\")\n .option(\n \"--explain\",\n \"Render extended rationale and examples in help output\",\n )\n .option(\"--profile\", \"Print deterministic timing diagnostics\")\n .option(\"--author <id>\", \"Override mutation author for this invocation\")\n .exitOverride();\n}\n"],"names":["commandPathTokens"],"mappings":"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","debugId":"39413a08-0b6f-5fb4-8e45-d039b2979e25"}