@unbrained/pm-cli 2026.6.19 → 2026.6.20

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 (517) hide show
  1. package/CHANGELOG.md +311 -258
  2. package/README.md +1 -1
  3. package/dist/cli/bootstrap-args.d.ts +12 -1
  4. package/dist/cli/bootstrap-args.js +20 -9
  5. package/dist/cli/bootstrap-args.js.map +1 -1
  6. package/dist/cli/commander-usage.js +31 -25
  7. package/dist/cli/commander-usage.js.map +1 -1
  8. package/dist/cli/commands/completion.js +3 -3
  9. package/dist/cli/commands/completion.js.map +1 -1
  10. package/dist/cli/commands/contracts.js +4 -3
  11. package/dist/cli/commands/contracts.js.map +1 -1
  12. package/dist/cli/commands/eval.d.ts +62 -0
  13. package/dist/cli/commands/eval.js +158 -0
  14. package/dist/cli/commands/eval.js.map +1 -0
  15. package/dist/cli/commands/extension/install-sources.d.ts +12 -0
  16. package/dist/cli/commands/extension/install-sources.js +77 -10
  17. package/dist/cli/commands/extension/install-sources.js.map +1 -1
  18. package/dist/cli/commands/gc.d.ts +12 -1
  19. package/dist/cli/commands/gc.js +53 -6
  20. package/dist/cli/commands/gc.js.map +1 -1
  21. package/dist/cli/commands/health.js +14 -8
  22. package/dist/cli/commands/health.js.map +1 -1
  23. package/dist/cli/commands/index.d.ts +1 -0
  24. package/dist/cli/commands/index.js +3 -2
  25. package/dist/cli/commands/index.js.map +1 -1
  26. package/dist/cli/commands/linked-artifacts.js +13 -3
  27. package/dist/cli/commands/linked-artifacts.js.map +1 -1
  28. package/dist/cli/commands/list.js +12 -9
  29. package/dist/cli/commands/list.js.map +1 -1
  30. package/dist/cli/commands/plan.js +2 -2
  31. package/dist/cli/commands/plan.js.map +1 -1
  32. package/dist/cli/commands/restore.js +5 -11
  33. package/dist/cli/commands/restore.js.map +1 -1
  34. package/dist/cli/commands/search.d.ts +39 -1
  35. package/dist/cli/commands/search.js +89 -12
  36. package/dist/cli/commands/search.js.map +1 -1
  37. package/dist/cli/commands/update.js +96 -58
  38. package/dist/cli/commands/update.js.map +1 -1
  39. package/dist/cli/extension-command-help.d.ts +9 -0
  40. package/dist/cli/extension-command-help.js +13 -2
  41. package/dist/cli/extension-command-help.js.map +1 -1
  42. package/dist/cli/extension-command-options.d.ts +8 -0
  43. package/dist/cli/extension-command-options.js +27 -2
  44. package/dist/cli/extension-command-options.js.map +1 -1
  45. package/dist/cli/help-content.js +15 -2
  46. package/dist/cli/help-content.js.map +1 -1
  47. package/dist/cli/main.d.ts +12 -0
  48. package/dist/cli/main.js +49 -9
  49. package/dist/cli/main.js.map +1 -1
  50. package/dist/cli/register-list-query.js +34 -4
  51. package/dist/cli/register-list-query.js.map +1 -1
  52. package/dist/cli/register-operations.js +3 -3
  53. package/dist/cli/register-operations.js.map +1 -1
  54. package/dist/cli-bundle/chunks/activity-7G7NNNZQ.js +18 -0
  55. package/dist/cli-bundle/chunks/{activity-XJ7WRNWS.js → activity-KEEITOTB.js} +11 -11
  56. package/dist/cli-bundle/chunks/{aggregate-OFT4YVB6.js → aggregate-5BTHOHW2.js} +10 -10
  57. package/dist/cli-bundle/chunks/{aggregate-LBCWF6UJ.js → aggregate-GB2LJNTZ.js} +10 -10
  58. package/dist/cli-bundle/chunks/{append-BP2ARHOK.js → append-BBM4MNVD.js} +8 -8
  59. package/dist/cli-bundle/chunks/{append-5U3XR5SD.js → append-BFV5UYWS.js} +8 -8
  60. package/dist/cli-bundle/chunks/{chunk-ZZEM2PH7.js → chunk-26OQTCGH.js} +19 -14
  61. package/dist/cli-bundle/chunks/chunk-26OQTCGH.js.map +1 -0
  62. package/dist/cli-bundle/chunks/{chunk-RVG3WLY3.js → chunk-2LUNPA3U.js} +2 -2
  63. package/dist/cli-bundle/chunks/{chunk-OURX4WVG.js → chunk-2QJLN4KM.js} +7 -7
  64. package/dist/cli-bundle/chunks/{search-2JX776KX.js → chunk-2ZY5SLNR.js} +184 -23
  65. package/dist/cli-bundle/chunks/chunk-2ZY5SLNR.js.map +1 -0
  66. package/dist/cli-bundle/chunks/{chunk-AVMSP2HH.js → chunk-3KVCMB2M.js} +2 -2
  67. package/dist/cli-bundle/chunks/{chunk-FVZSUIN5.js → chunk-3WAKNI2W.js} +3 -3
  68. package/dist/cli-bundle/chunks/{chunk-H3DP6OUM.js → chunk-4KFL5OYK.js} +3 -3
  69. package/dist/cli-bundle/chunks/{chunk-VG3B2CYD.js → chunk-4PW4C3ZB.js} +2 -2
  70. package/dist/cli-bundle/chunks/{chunk-SDUZTZ55.js → chunk-4S4INK3B.js} +7 -7
  71. package/dist/cli-bundle/chunks/{chunk-QCHNPN24.js → chunk-4YMX7XFI.js} +7 -5
  72. package/dist/cli-bundle/chunks/{chunk-QSH34DSQ.js → chunk-5MWA46UN.js} +3 -3
  73. package/dist/cli-bundle/chunks/{chunk-UIMLAFOE.js → chunk-5XK2RYJR.js} +7 -7
  74. package/dist/cli-bundle/chunks/{chunk-B2NEFANY.js → chunk-6DZO5NN7.js} +3 -3
  75. package/dist/cli-bundle/chunks/{chunk-VP4Z36GO.js → chunk-6FSPWUBI.js} +2 -2
  76. package/dist/cli-bundle/chunks/{chunk-MPEWACTG.js → chunk-6KARQMC6.js} +2 -2
  77. package/dist/cli-bundle/chunks/{chunk-N7LDJRB4.js → chunk-6KSFULO6.js} +2 -2
  78. package/dist/cli-bundle/chunks/{chunk-XV6N3QND.js → chunk-6LTSLEHD.js} +2 -2
  79. package/dist/cli-bundle/chunks/{chunk-X26ODPU4.js → chunk-6Y7IQ6XN.js} +14 -18
  80. package/dist/cli-bundle/chunks/chunk-6Y7IQ6XN.js.map +7 -0
  81. package/dist/cli-bundle/chunks/{chunk-USKTNI7P.js → chunk-7MMXBIRZ.js} +2 -2
  82. package/dist/cli-bundle/chunks/{chunk-UCNEPMPY.js → chunk-ACULWT7G.js} +105 -66
  83. package/dist/cli-bundle/chunks/chunk-ACULWT7G.js.map +7 -0
  84. package/dist/cli-bundle/chunks/{chunk-2K56AWDP.js → chunk-AOCYDQLT.js} +5 -5
  85. package/dist/cli-bundle/chunks/{chunk-ZBVYKWT2.js → chunk-ATRXPXAL.js} +15 -15
  86. package/dist/cli-bundle/chunks/{chunk-A5JPMD4Q.js → chunk-AW4PYYNF.js} +2 -2
  87. package/dist/cli-bundle/chunks/{chunk-I2VJM36R.js → chunk-AZ75OVK4.js} +20 -21
  88. package/dist/cli-bundle/chunks/chunk-AZ75OVK4.js.map +1 -0
  89. package/dist/cli-bundle/chunks/{chunk-MTGMNUMJ.js → chunk-B3LROPTV.js} +2 -2
  90. package/dist/cli-bundle/chunks/{chunk-NPNNW5TU.js → chunk-BBSUVIIT.js} +8 -8
  91. package/dist/cli-bundle/chunks/{chunk-47BYN6CA.js → chunk-BYNJWB5F.js} +7 -7
  92. package/dist/cli-bundle/chunks/{chunk-PSWSQHM7.js → chunk-BZWIDTDE.js} +15 -19
  93. package/dist/cli-bundle/chunks/chunk-BZWIDTDE.js.map +1 -0
  94. package/dist/cli-bundle/chunks/{chunk-S673PVHD.js → chunk-CNPWCUDR.js} +3 -3
  95. package/dist/cli-bundle/chunks/{chunk-TYQBGXH2.js → chunk-DKWIPIJY.js} +2 -2
  96. package/dist/cli-bundle/chunks/{search-AZR2JITW.js → chunk-DYOJJTCG.js} +190 -22
  97. package/dist/cli-bundle/chunks/chunk-DYOJJTCG.js.map +7 -0
  98. package/dist/cli-bundle/chunks/{chunk-Y4IBSEQ2.js → chunk-E4E7UQBT.js} +20 -8
  99. package/dist/cli-bundle/chunks/chunk-E4E7UQBT.js.map +1 -0
  100. package/dist/cli-bundle/chunks/{chunk-HMQMRHQJ.js → chunk-EKMHDL6Z.js} +8 -8
  101. package/dist/cli-bundle/chunks/{chunk-LIVRA6VG.js → chunk-EOFROIC5.js} +7 -7
  102. package/dist/cli-bundle/chunks/{chunk-NNMBNN6Q.js → chunk-ETJKPURB.js} +7 -5
  103. package/dist/cli-bundle/chunks/{chunk-2E3KSWFG.js → chunk-F4EYOSNC.js} +2 -2
  104. package/dist/cli-bundle/chunks/{chunk-DJ3YYLHG.js → chunk-FA5O2DEG.js} +5 -5
  105. package/dist/cli-bundle/chunks/{chunk-QTWWHFI3.js → chunk-FBBPCSJM.js} +8 -8
  106. package/dist/cli-bundle/chunks/{chunk-EMFDZ7N3.js → chunk-FSOJCFDS.js} +3 -3
  107. package/dist/cli-bundle/chunks/{chunk-M35R7LFX.js → chunk-FXKPUMIR.js} +5 -5
  108. package/dist/cli-bundle/chunks/{chunk-YOGXK3ON.js → chunk-GF44HVZL.js} +18 -13
  109. package/dist/cli-bundle/chunks/chunk-GF44HVZL.js.map +7 -0
  110. package/dist/cli-bundle/chunks/{chunk-UA4ANRJY.js → chunk-H3ZTSYPA.js} +71 -13
  111. package/dist/cli-bundle/chunks/chunk-H3ZTSYPA.js.map +7 -0
  112. package/dist/cli-bundle/chunks/{chunk-II3WDRCM.js → chunk-HWHZ7EY7.js} +3 -3
  113. package/dist/cli-bundle/chunks/{chunk-7R5YKVKO.js → chunk-ICEWMJYH.js} +7 -7
  114. package/dist/cli-bundle/chunks/{chunk-UMTPQMEG.js → chunk-II4BRHKM.js} +3 -3
  115. package/dist/cli-bundle/chunks/{chunk-GDOTTY2S.js → chunk-IWKD7B33.js} +19 -2
  116. package/dist/cli-bundle/chunks/chunk-IWKD7B33.js.map +7 -0
  117. package/dist/cli-bundle/chunks/{chunk-QG6M6XQE.js → chunk-J7VSEFWB.js} +3 -3
  118. package/dist/cli-bundle/chunks/{chunk-22YA6GCA.js → chunk-K2LBDYDC.js} +2 -2
  119. package/dist/cli-bundle/chunks/{chunk-BQVESTOG.js → chunk-KCJZREBI.js} +2 -2
  120. package/dist/cli-bundle/chunks/{chunk-YWAYOWDQ.js → chunk-LTUB7ARL.js} +72 -14
  121. package/dist/cli-bundle/chunks/chunk-LTUB7ARL.js.map +1 -0
  122. package/dist/cli-bundle/chunks/{chunk-DVUU3AHP.js → chunk-MFCFHL27.js} +17 -6
  123. package/dist/cli-bundle/chunks/chunk-MFCFHL27.js.map +1 -0
  124. package/dist/cli-bundle/chunks/{chunk-5P2LQV2F.js → chunk-MTQK5ZSB.js} +2 -2
  125. package/dist/cli-bundle/chunks/{chunk-LEC57E7K.js → chunk-NCGQ27PK.js} +2 -2
  126. package/dist/cli-bundle/chunks/{chunk-2RI3BDFK.js → chunk-NKTUBA2C.js} +10 -9
  127. package/dist/cli-bundle/chunks/chunk-NKTUBA2C.js.map +7 -0
  128. package/dist/cli-bundle/chunks/{chunk-5LZPDRFW.js → chunk-NMQNXH4U.js} +5 -5
  129. package/dist/cli-bundle/chunks/{chunk-COHNQLB2.js → chunk-OLEP5TJH.js} +20 -3
  130. package/dist/cli-bundle/chunks/chunk-OLEP5TJH.js.map +1 -0
  131. package/dist/cli-bundle/chunks/{chunk-PRUB7RI4.js → chunk-OVSFW4KD.js} +3 -3
  132. package/dist/cli-bundle/chunks/{chunk-4L7Q4OVT.js → chunk-PF5GLFPU.js} +9 -9
  133. package/dist/cli-bundle/chunks/{chunk-YVYJQR6S.js → chunk-QUTJOHGK.js} +9 -9
  134. package/dist/cli-bundle/chunks/{chunk-5QLHQK7V.js → chunk-QWAJPGEI.js} +25 -26
  135. package/dist/cli-bundle/chunks/chunk-QWAJPGEI.js.map +7 -0
  136. package/dist/cli-bundle/chunks/{chunk-K5TD74VU.js → chunk-RADIHKJ3.js} +19 -7
  137. package/dist/cli-bundle/chunks/chunk-RADIHKJ3.js.map +7 -0
  138. package/dist/cli-bundle/chunks/{chunk-CSRFOIHG.js → chunk-RICT5QYR.js} +3 -3
  139. package/dist/cli-bundle/chunks/{chunk-OUG4CL4H.js → chunk-RNKUCHUQ.js} +8 -8
  140. package/dist/cli-bundle/chunks/{chunk-X7RKOJXL.js → chunk-SL233DQD.js} +6 -6
  141. package/dist/cli-bundle/chunks/{chunk-USVOBLGB.js → chunk-U3WTMYBX.js} +2 -2
  142. package/dist/cli-bundle/chunks/{chunk-DYZKSIVX.js → chunk-VE3BUO3R.js} +3 -3
  143. package/dist/cli-bundle/chunks/{chunk-FPQA4ZMA.js → chunk-VONJSFUW.js} +18 -7
  144. package/dist/cli-bundle/chunks/chunk-VONJSFUW.js.map +7 -0
  145. package/dist/cli-bundle/chunks/{chunk-RNWE2HZR.js → chunk-W2ZESOQE.js} +15 -15
  146. package/dist/cli-bundle/chunks/{chunk-4BFNWAMQ.js → chunk-WFOITX4A.js} +29 -12
  147. package/dist/cli-bundle/chunks/chunk-WFOITX4A.js.map +7 -0
  148. package/dist/cli-bundle/chunks/{chunk-FP7YLQ52.js → chunk-WMQBNVZL.js} +11 -10
  149. package/dist/cli-bundle/chunks/chunk-WMQBNVZL.js.map +1 -0
  150. package/dist/cli-bundle/chunks/{chunk-5SRID7DV.js → chunk-X3CD2VUI.js} +29 -12
  151. package/dist/cli-bundle/chunks/chunk-X3CD2VUI.js.map +1 -0
  152. package/dist/cli-bundle/chunks/{chunk-GL3QKIET.js → chunk-XKJDCJEH.js} +6 -6
  153. package/dist/cli-bundle/chunks/{chunk-SO2IOH37.js → chunk-XNQ3YH6N.js} +2 -2
  154. package/dist/cli-bundle/chunks/{chunk-ZGEWEO7B.js → chunk-XXGAWTH5.js} +2 -2
  155. package/dist/cli-bundle/chunks/{chunk-4EOS35RL.js → chunk-YBQF4CAW.js} +3 -3
  156. package/dist/cli-bundle/chunks/{chunk-MTDEEUGV.js → chunk-YT4Z2OVB.js} +3 -3
  157. package/dist/cli-bundle/chunks/{chunk-5NS6TJ2F.js → chunk-ZHCSGIUX.js} +2 -2
  158. package/dist/cli-bundle/chunks/{chunk-MAKOMXVM.js → chunk-ZYG4TR32.js} +106 -67
  159. package/dist/cli-bundle/chunks/chunk-ZYG4TR32.js.map +1 -0
  160. package/dist/cli-bundle/chunks/{claim-2BSYPJTJ.js → claim-G57ZJLZ4.js} +10 -10
  161. package/dist/cli-bundle/chunks/{claim-EZ6JKY5X.js → claim-TRSDQO6L.js} +10 -10
  162. package/dist/cli-bundle/chunks/{close-3TSX6BYF.js → close-4QMUQMON.js} +8 -8
  163. package/dist/cli-bundle/chunks/close-NNZZTZ5V.js +15 -0
  164. package/dist/cli-bundle/chunks/{close-many-B7DBVA46.js → close-many-3UWKJRQK.js} +15 -15
  165. package/dist/cli-bundle/chunks/{close-many-HB4UFCS3.js → close-many-A7U62CRI.js} +15 -15
  166. package/dist/cli-bundle/chunks/{comments-M7PAINZT.js → comments-4EM7XR74.js} +10 -10
  167. package/dist/cli-bundle/chunks/{comments-X7M7XM6I.js → comments-URWDZP2I.js} +10 -10
  168. package/dist/cli-bundle/chunks/{config-YICACPHA.js → config-GRJYZ2O3.js} +30 -10
  169. package/dist/cli-bundle/chunks/config-GRJYZ2O3.js.map +1 -0
  170. package/dist/cli-bundle/chunks/{config-UWF3KRP5.js → config-PSZ5GWAK.js} +29 -9
  171. package/dist/cli-bundle/chunks/config-PSZ5GWAK.js.map +7 -0
  172. package/dist/cli-bundle/chunks/{context-EGUGU4K7.js → context-A46YAV2F.js} +13 -13
  173. package/dist/cli-bundle/chunks/{context-V32ZAPL6.js → context-BCR34RKM.js} +13 -13
  174. package/dist/cli-bundle/chunks/{contracts-7G553BHP.js → contracts-HPT25X4D.js} +10 -8
  175. package/dist/cli-bundle/chunks/contracts-HPT25X4D.js.map +1 -0
  176. package/dist/cli-bundle/chunks/{contracts-B2YWYUV5.js → contracts-JOPCQNDP.js} +10 -8
  177. package/dist/cli-bundle/chunks/contracts-JOPCQNDP.js.map +7 -0
  178. package/dist/cli-bundle/chunks/{copy-RMLXLZOL.js → copy-KBTIUW7L.js} +7 -7
  179. package/dist/cli-bundle/chunks/{copy-NWFFRYWM.js → copy-X7V6AEDB.js} +7 -7
  180. package/dist/cli-bundle/chunks/create-4KOAQ6ME.js +30 -0
  181. package/dist/cli-bundle/chunks/{create-GK4MX2LJ.js → create-ZPZKJDFQ.js} +14 -14
  182. package/dist/cli-bundle/chunks/{delete-EFQLVEAS.js → delete-2ZI6CJZM.js} +7 -7
  183. package/dist/cli-bundle/chunks/{delete-RMGNIL2S.js → delete-FGKVPUQZ.js} +7 -7
  184. package/dist/cli-bundle/chunks/{deps-WKHUPVD3.js → deps-IUJOBF2H.js} +7 -7
  185. package/dist/cli-bundle/chunks/{deps-K2I7QV4Y.js → deps-SJCEFU3C.js} +7 -7
  186. package/dist/cli-bundle/chunks/{docs-2H2UGIT6.js → docs-2LXF5SVC.js} +12 -11
  187. package/dist/cli-bundle/chunks/{docs-2H2UGIT6.js.map → docs-2LXF5SVC.js.map} +1 -1
  188. package/dist/cli-bundle/chunks/{docs-3FXRDYA7.js → docs-UWJ75CKR.js} +10 -9
  189. package/dist/cli-bundle/chunks/{docs-3FXRDYA7.js.map → docs-UWJ75CKR.js.map} +1 -1
  190. package/dist/cli-bundle/chunks/eval-FRIDCTM2.js +276 -0
  191. package/dist/cli-bundle/chunks/eval-FRIDCTM2.js.map +1 -0
  192. package/dist/cli-bundle/chunks/eval-ZTT3F3SL.js +286 -0
  193. package/dist/cli-bundle/chunks/eval-ZTT3F3SL.js.map +7 -0
  194. package/dist/cli-bundle/chunks/{extension-4LPTFTV4.js → extension-VRYTNNSV.js} +5 -5
  195. package/dist/cli-bundle/chunks/{extension-ASUPTDCC.js → extension-XFQG3BXL.js} +5 -5
  196. package/dist/cli-bundle/chunks/{files-UAZFB3EA.js → files-AJOGTTAN.js} +10 -9
  197. package/dist/cli-bundle/chunks/{files-UAZFB3EA.js.map → files-AJOGTTAN.js.map} +1 -1
  198. package/dist/cli-bundle/chunks/{files-TXEQOA7C.js → files-B2RUCA32.js} +12 -11
  199. package/dist/cli-bundle/chunks/{files-TXEQOA7C.js.map → files-B2RUCA32.js.map} +1 -1
  200. package/dist/cli-bundle/chunks/{focus-UGROAMAX.js → focus-7N36RIMT.js} +8 -8
  201. package/dist/cli-bundle/chunks/{focus-ELOPN2SR.js → focus-CFE33IYC.js} +8 -8
  202. package/dist/cli-bundle/chunks/gc-OYJK4YBY.js +395 -0
  203. package/dist/cli-bundle/chunks/gc-OYJK4YBY.js.map +7 -0
  204. package/dist/cli-bundle/chunks/gc-SBF2FGHK.js +385 -0
  205. package/dist/cli-bundle/chunks/gc-SBF2FGHK.js.map +1 -0
  206. package/dist/cli-bundle/chunks/{get-OTXPLWYW.js → get-577VLZZ7.js} +11 -11
  207. package/dist/cli-bundle/chunks/{get-IWZ7IMPS.js → get-LLFWSPXW.js} +11 -11
  208. package/dist/cli-bundle/chunks/{health-PPTJ7XKW.js → health-C2PUT6JZ.js} +21 -22
  209. package/dist/cli-bundle/chunks/{health-PPTJ7XKW.js.map → health-C2PUT6JZ.js.map} +1 -1
  210. package/dist/cli-bundle/chunks/{health-JEBESKID.js → health-PBJS7W2T.js} +20 -21
  211. package/dist/cli-bundle/chunks/{health-JEBESKID.js.map → health-PBJS7W2T.js.map} +2 -2
  212. package/dist/cli-bundle/chunks/{history-HNWBUDMI.js → history-4FJK6Y3O.js} +10 -10
  213. package/dist/cli-bundle/chunks/history-ZXNWG6H4.js +20 -0
  214. package/dist/cli-bundle/chunks/{history-compact-EQXVPK3V.js → history-compact-AXR6R6GU.js} +12 -12
  215. package/dist/cli-bundle/chunks/{history-compact-MMQC7MCW.js → history-compact-HXF3OT7G.js} +12 -12
  216. package/dist/cli-bundle/chunks/history-redact-GV633Z4H.js +21 -0
  217. package/dist/cli-bundle/chunks/{history-redact-UBDHBEJE.js → history-redact-UMPD4G3K.js} +11 -11
  218. package/dist/cli-bundle/chunks/{history-repair-GMMHFAGH.js → history-repair-WHOK2ICG.js} +12 -12
  219. package/dist/cli-bundle/chunks/{history-repair-7DSDRPMX.js → history-repair-X57HE5EA.js} +12 -12
  220. package/dist/cli-bundle/chunks/init-KQWZSNBX.js +20 -0
  221. package/dist/cli-bundle/chunks/{init-QGK4JFF6.js → init-N7MIIYCU.js} +10 -10
  222. package/dist/cli-bundle/chunks/{learnings-A6DGBMG3.js → learnings-FPG7WAVW.js} +10 -10
  223. package/dist/cli-bundle/chunks/{learnings-DR53TWRA.js → learnings-GZRBIEAN.js} +10 -10
  224. package/dist/cli-bundle/chunks/{list-LJ5DBXC3.js → list-MZBCSKLU.js} +10 -10
  225. package/dist/cli-bundle/chunks/{list-KOJN23UL.js → list-ZDQ2OBSO.js} +10 -10
  226. package/dist/cli-bundle/chunks/{notes-K5I3TAYR.js → notes-LW53PFLH.js} +10 -10
  227. package/dist/cli-bundle/chunks/{notes-7VLTHKPW.js → notes-WQAP67EC.js} +10 -10
  228. package/dist/cli-bundle/chunks/{plan-X3STKLED.js → plan-AVJ4VJQO.js} +15 -15
  229. package/dist/cli-bundle/chunks/plan-AVJ4VJQO.js.map +7 -0
  230. package/dist/cli-bundle/chunks/{plan-BK3OMLGP.js → plan-VZKICKIJ.js} +16 -16
  231. package/dist/cli-bundle/chunks/plan-VZKICKIJ.js.map +1 -0
  232. package/dist/cli-bundle/chunks/{register-list-query-FUMXPWZ4.js → register-list-query-7BD6ZHU5.js} +42 -21
  233. package/dist/cli-bundle/chunks/register-list-query-7BD6ZHU5.js.map +7 -0
  234. package/dist/cli-bundle/chunks/{register-list-query-XDLFESU7.js → register-list-query-CM4SVAQA.js} +43 -22
  235. package/dist/cli-bundle/chunks/register-list-query-CM4SVAQA.js.map +1 -0
  236. package/dist/cli-bundle/chunks/{register-mutation-ZAGVKMBQ.js → register-mutation-ANZIWHUF.js} +33 -33
  237. package/dist/cli-bundle/chunks/{register-mutation-RXRX4P7D.js → register-mutation-PLFHAS4N.js} +33 -33
  238. package/dist/cli-bundle/chunks/{register-operations-DGSHCS75.js → register-operations-KQPQIFF2.js} +35 -35
  239. package/dist/cli-bundle/chunks/register-operations-KQPQIFF2.js.map +1 -0
  240. package/dist/cli-bundle/chunks/{register-operations-6UURPZN5.js → register-operations-VLGCAWIW.js} +34 -34
  241. package/dist/cli-bundle/chunks/{register-operations-6UURPZN5.js.map → register-operations-VLGCAWIW.js.map} +2 -2
  242. package/dist/cli-bundle/chunks/{register-setup-2FEGSFLM.js → register-setup-KPTZ36D4.js} +15 -15
  243. package/dist/cli-bundle/chunks/{register-setup-LTJG52WP.js → register-setup-TMEF6V7O.js} +15 -15
  244. package/dist/cli-bundle/chunks/{restore-SJUWYOCK.js → restore-64JKQV7G.js} +11 -11
  245. package/dist/cli-bundle/chunks/restore-GKM26SAW.js +19 -0
  246. package/dist/cli-bundle/chunks/{scheduling-shortcuts-W4F2LKHW.js → scheduling-shortcuts-4ION7QAX.js} +14 -14
  247. package/dist/cli-bundle/chunks/{scheduling-shortcuts-VWAMP2S2.js → scheduling-shortcuts-X6D6VSZR.js} +14 -14
  248. package/dist/cli-bundle/chunks/{schema-N5ETYD4P.js → schema-OA4RSVMI.js} +9 -9
  249. package/dist/cli-bundle/chunks/{schema-DXQRIEFM.js → schema-TA3NF3RG.js} +9 -9
  250. package/dist/cli-bundle/chunks/search-INCM5I4J.js +33 -0
  251. package/dist/cli-bundle/chunks/search-UAIHEQZL.js +37 -0
  252. package/dist/cli-bundle/chunks/{stats-J563NJBY.js → stats-RHEMG4CE.js} +8 -8
  253. package/dist/cli-bundle/chunks/{stats-ZFESFVQC.js → stats-WQWTIA5Y.js} +8 -8
  254. package/dist/cli-bundle/chunks/{telemetry-BNGLIFEM.js → telemetry-G6UKGKJU.js} +4 -4
  255. package/dist/cli-bundle/chunks/{telemetry-SC7HPRXX.js → telemetry-XA5D2QEO.js} +4 -4
  256. package/dist/cli-bundle/chunks/{test-55RJCGRU.js → test-XF7BYLMZ.js} +15 -15
  257. package/dist/cli-bundle/chunks/{test-47UQGEXE.js → test-ZMQF23P3.js} +15 -15
  258. package/dist/cli-bundle/chunks/{test-all-DN6KG4FX.js → test-all-WUBBJCPU.js} +15 -15
  259. package/dist/cli-bundle/chunks/{test-all-5SFTTRNL.js → test-all-ZNQBMUOI.js} +15 -15
  260. package/dist/cli-bundle/chunks/{test-runs-DZEDJ4GH.js → test-runs-N7LI7HLH.js} +5 -5
  261. package/dist/cli-bundle/chunks/{test-runs-NHRBT7SN.js → test-runs-RFA42EEX.js} +5 -5
  262. package/dist/cli-bundle/chunks/update-CPNOG73P.js +24 -0
  263. package/dist/cli-bundle/chunks/update-CPNOG73P.js.map +7 -0
  264. package/dist/cli-bundle/chunks/update-T5AYT6ZN.js +28 -0
  265. package/dist/cli-bundle/chunks/update-T5AYT6ZN.js.map +1 -0
  266. package/dist/cli-bundle/chunks/{update-many-OKYWFCBO.js → update-many-6XFR7TFG.js} +23 -23
  267. package/dist/cli-bundle/chunks/{update-many-IRNV3OTG.js → update-many-NMRUQZL2.js} +23 -23
  268. package/dist/cli-bundle/chunks/{upgrade-KP4I45V5.js → upgrade-EJTME2YQ.js} +5 -5
  269. package/dist/cli-bundle/chunks/{upgrade-3RIAFQIK.js → upgrade-QMCSONWR.js} +5 -5
  270. package/dist/cli-bundle/chunks/{validate-GVY4VE43.js → validate-3SUCHXXX.js} +21 -21
  271. package/dist/cli-bundle/chunks/{validate-ADKGN37M.js → validate-KIIJY5RC.js} +21 -21
  272. package/dist/cli-bundle/main.js +133 -55
  273. package/dist/cli-bundle/main.js.map +2 -2
  274. package/dist/core/checkpoint/checkpoint-gc.d.ts +69 -0
  275. package/dist/core/checkpoint/checkpoint-gc.js +175 -0
  276. package/dist/core/checkpoint/checkpoint-gc.js.map +1 -0
  277. package/dist/core/config/nested-settings.js +22 -2
  278. package/dist/core/config/nested-settings.js.map +1 -1
  279. package/dist/core/diagnostics/remediation.js +19 -2
  280. package/dist/core/diagnostics/remediation.js.map +1 -1
  281. package/dist/core/extensions/extension-types.d.ts +0 -9
  282. package/dist/core/extensions/extension-types.js +2 -27
  283. package/dist/core/extensions/extension-types.js.map +1 -1
  284. package/dist/core/fs/fs-utils.d.ts +17 -1
  285. package/dist/core/fs/fs-utils.js +19 -3
  286. package/dist/core/fs/fs-utils.js.map +1 -1
  287. package/dist/core/history/drift-scan.d.ts +17 -5
  288. package/dist/core/history/drift-scan.js +22 -14
  289. package/dist/core/history/drift-scan.js.map +1 -1
  290. package/dist/core/history/replay.d.ts +7 -0
  291. package/dist/core/history/replay.js +11 -6
  292. package/dist/core/history/replay.js.map +1 -1
  293. package/dist/core/item/status-filter.d.ts +7 -3
  294. package/dist/core/item/status-filter.js +26 -5
  295. package/dist/core/item/status-filter.js.map +1 -1
  296. package/dist/core/search/bm25.d.ts +113 -0
  297. package/dist/core/search/bm25.js +178 -0
  298. package/dist/core/search/bm25.js.map +1 -0
  299. package/dist/core/search/eval.d.ts +114 -0
  300. package/dist/core/search/eval.js +217 -0
  301. package/dist/core/search/eval.js.map +1 -0
  302. package/dist/core/sentry/instrument.d.ts +14 -0
  303. package/dist/core/sentry/instrument.js +43 -3
  304. package/dist/core/sentry/instrument.js.map +1 -1
  305. package/dist/core/shared/constants.js +5 -2
  306. package/dist/core/shared/constants.js.map +1 -1
  307. package/dist/core/store/paths.js +4 -3
  308. package/dist/core/store/paths.js.map +1 -1
  309. package/dist/core/store/settings-validator.d.ts +7 -0
  310. package/dist/core/store/settings-validator.js +10 -2
  311. package/dist/core/store/settings-validator.js.map +1 -1
  312. package/dist/core/store/settings.js +6 -2
  313. package/dist/core/store/settings.js.map +1 -1
  314. package/dist/mcp/tool-definitions.js +4 -3
  315. package/dist/mcp/tool-definitions.js.map +1 -1
  316. package/dist/sdk/cli-contracts/enum-contracts.d.ts +1 -1
  317. package/dist/sdk/cli-contracts/enum-contracts.js +3 -2
  318. package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
  319. package/dist/sdk/cli-contracts/tool-parameter-tables.js +4 -4
  320. package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
  321. package/dist/sdk/cli-contracts.d.ts +1 -0
  322. package/dist/sdk/cli-contracts.js +11 -2
  323. package/dist/sdk/cli-contracts.js.map +1 -1
  324. package/dist/types.d.ts +19 -0
  325. package/dist/types.js +2 -2
  326. package/dist/types.js.map +1 -1
  327. package/docs/AGENT_GUIDE.md +1 -0
  328. package/docs/ARCHITECTURE.md +124 -11
  329. package/docs/CLAUDE_CODE_PLUGIN.md +5 -13
  330. package/docs/COMMANDS.md +55 -5
  331. package/docs/CONFIGURATION.md +39 -0
  332. package/docs/EXTENSIONS.md +2 -2
  333. package/docs/MIGRATION_CLI_SIMPLIFICATION.md +9 -2
  334. package/docs/QUICKSTART.md +2 -0
  335. package/docs/README.md +2 -0
  336. package/docs/RELEASING.md +2 -1
  337. package/docs/SDK.md +9 -1
  338. package/docs/TESTING.md +18 -0
  339. package/package.json +4 -3
  340. package/packages/pm-todos/extensions/todos/index.js +2 -0
  341. package/packages/pm-todos/extensions/todos/index.ts +2 -0
  342. package/packages/pm-todos/extensions/todos/runtime.js +1 -1
  343. package/packages/pm-todos/extensions/todos/runtime.ts +4 -1
  344. package/dist/cli-bundle/chunks/activity-62I26XZB.js +0 -18
  345. package/dist/cli-bundle/chunks/chunk-2RI3BDFK.js.map +0 -7
  346. package/dist/cli-bundle/chunks/chunk-4BFNWAMQ.js.map +0 -7
  347. package/dist/cli-bundle/chunks/chunk-5QLHQK7V.js.map +0 -7
  348. package/dist/cli-bundle/chunks/chunk-5SRID7DV.js.map +0 -1
  349. package/dist/cli-bundle/chunks/chunk-COHNQLB2.js.map +0 -1
  350. package/dist/cli-bundle/chunks/chunk-DVUU3AHP.js.map +0 -1
  351. package/dist/cli-bundle/chunks/chunk-FP7YLQ52.js.map +0 -1
  352. package/dist/cli-bundle/chunks/chunk-FPQA4ZMA.js.map +0 -7
  353. package/dist/cli-bundle/chunks/chunk-GDOTTY2S.js.map +0 -7
  354. package/dist/cli-bundle/chunks/chunk-I2VJM36R.js.map +0 -1
  355. package/dist/cli-bundle/chunks/chunk-K5TD74VU.js.map +0 -7
  356. package/dist/cli-bundle/chunks/chunk-MAKOMXVM.js.map +0 -1
  357. package/dist/cli-bundle/chunks/chunk-PSWSQHM7.js.map +0 -1
  358. package/dist/cli-bundle/chunks/chunk-UA4ANRJY.js.map +0 -7
  359. package/dist/cli-bundle/chunks/chunk-UCNEPMPY.js.map +0 -7
  360. package/dist/cli-bundle/chunks/chunk-X26ODPU4.js.map +0 -7
  361. package/dist/cli-bundle/chunks/chunk-Y4IBSEQ2.js.map +0 -1
  362. package/dist/cli-bundle/chunks/chunk-YOGXK3ON.js.map +0 -7
  363. package/dist/cli-bundle/chunks/chunk-YWAYOWDQ.js.map +0 -1
  364. package/dist/cli-bundle/chunks/chunk-ZZEM2PH7.js.map +0 -1
  365. package/dist/cli-bundle/chunks/close-TQZK43Z5.js +0 -15
  366. package/dist/cli-bundle/chunks/config-UWF3KRP5.js.map +0 -7
  367. package/dist/cli-bundle/chunks/config-YICACPHA.js.map +0 -1
  368. package/dist/cli-bundle/chunks/contracts-7G553BHP.js.map +0 -1
  369. package/dist/cli-bundle/chunks/contracts-B2YWYUV5.js.map +0 -7
  370. package/dist/cli-bundle/chunks/create-UZLJXHLA.js +0 -30
  371. package/dist/cli-bundle/chunks/gc-5RTYXLQU.js +0 -211
  372. package/dist/cli-bundle/chunks/gc-5RTYXLQU.js.map +0 -7
  373. package/dist/cli-bundle/chunks/gc-FK5732EK.js +0 -208
  374. package/dist/cli-bundle/chunks/gc-FK5732EK.js.map +0 -1
  375. package/dist/cli-bundle/chunks/history-TKTULEVE.js +0 -20
  376. package/dist/cli-bundle/chunks/history-redact-SPIFIXVY.js +0 -21
  377. package/dist/cli-bundle/chunks/init-A6FTZ5UC.js +0 -20
  378. package/dist/cli-bundle/chunks/plan-BK3OMLGP.js.map +0 -1
  379. package/dist/cli-bundle/chunks/plan-X3STKLED.js.map +0 -7
  380. package/dist/cli-bundle/chunks/register-list-query-FUMXPWZ4.js.map +0 -7
  381. package/dist/cli-bundle/chunks/register-list-query-XDLFESU7.js.map +0 -1
  382. package/dist/cli-bundle/chunks/register-operations-DGSHCS75.js.map +0 -1
  383. package/dist/cli-bundle/chunks/restore-PI3WM4GK.js +0 -19
  384. package/dist/cli-bundle/chunks/search-2JX776KX.js.map +0 -1
  385. package/dist/cli-bundle/chunks/search-AZR2JITW.js.map +0 -7
  386. package/dist/cli-bundle/chunks/update-2BZEAI7B.js +0 -24
  387. package/dist/cli-bundle/chunks/update-GCNLER2H.js +0 -28
  388. /package/dist/cli-bundle/chunks/{activity-62I26XZB.js.map → activity-7G7NNNZQ.js.map} +0 -0
  389. /package/dist/cli-bundle/chunks/{activity-XJ7WRNWS.js.map → activity-KEEITOTB.js.map} +0 -0
  390. /package/dist/cli-bundle/chunks/{aggregate-OFT4YVB6.js.map → aggregate-5BTHOHW2.js.map} +0 -0
  391. /package/dist/cli-bundle/chunks/{aggregate-LBCWF6UJ.js.map → aggregate-GB2LJNTZ.js.map} +0 -0
  392. /package/dist/cli-bundle/chunks/{append-BP2ARHOK.js.map → append-BBM4MNVD.js.map} +0 -0
  393. /package/dist/cli-bundle/chunks/{append-5U3XR5SD.js.map → append-BFV5UYWS.js.map} +0 -0
  394. /package/dist/cli-bundle/chunks/{chunk-RVG3WLY3.js.map → chunk-2LUNPA3U.js.map} +0 -0
  395. /package/dist/cli-bundle/chunks/{chunk-OURX4WVG.js.map → chunk-2QJLN4KM.js.map} +0 -0
  396. /package/dist/cli-bundle/chunks/{chunk-AVMSP2HH.js.map → chunk-3KVCMB2M.js.map} +0 -0
  397. /package/dist/cli-bundle/chunks/{chunk-FVZSUIN5.js.map → chunk-3WAKNI2W.js.map} +0 -0
  398. /package/dist/cli-bundle/chunks/{chunk-H3DP6OUM.js.map → chunk-4KFL5OYK.js.map} +0 -0
  399. /package/dist/cli-bundle/chunks/{chunk-VG3B2CYD.js.map → chunk-4PW4C3ZB.js.map} +0 -0
  400. /package/dist/cli-bundle/chunks/{chunk-SDUZTZ55.js.map → chunk-4S4INK3B.js.map} +0 -0
  401. /package/dist/cli-bundle/chunks/{chunk-QCHNPN24.js.map → chunk-4YMX7XFI.js.map} +0 -0
  402. /package/dist/cli-bundle/chunks/{chunk-QSH34DSQ.js.map → chunk-5MWA46UN.js.map} +0 -0
  403. /package/dist/cli-bundle/chunks/{chunk-UIMLAFOE.js.map → chunk-5XK2RYJR.js.map} +0 -0
  404. /package/dist/cli-bundle/chunks/{chunk-B2NEFANY.js.map → chunk-6DZO5NN7.js.map} +0 -0
  405. /package/dist/cli-bundle/chunks/{chunk-VP4Z36GO.js.map → chunk-6FSPWUBI.js.map} +0 -0
  406. /package/dist/cli-bundle/chunks/{chunk-MPEWACTG.js.map → chunk-6KARQMC6.js.map} +0 -0
  407. /package/dist/cli-bundle/chunks/{chunk-N7LDJRB4.js.map → chunk-6KSFULO6.js.map} +0 -0
  408. /package/dist/cli-bundle/chunks/{chunk-XV6N3QND.js.map → chunk-6LTSLEHD.js.map} +0 -0
  409. /package/dist/cli-bundle/chunks/{chunk-USKTNI7P.js.map → chunk-7MMXBIRZ.js.map} +0 -0
  410. /package/dist/cli-bundle/chunks/{chunk-2K56AWDP.js.map → chunk-AOCYDQLT.js.map} +0 -0
  411. /package/dist/cli-bundle/chunks/{chunk-ZBVYKWT2.js.map → chunk-ATRXPXAL.js.map} +0 -0
  412. /package/dist/cli-bundle/chunks/{chunk-A5JPMD4Q.js.map → chunk-AW4PYYNF.js.map} +0 -0
  413. /package/dist/cli-bundle/chunks/{chunk-MTGMNUMJ.js.map → chunk-B3LROPTV.js.map} +0 -0
  414. /package/dist/cli-bundle/chunks/{chunk-NPNNW5TU.js.map → chunk-BBSUVIIT.js.map} +0 -0
  415. /package/dist/cli-bundle/chunks/{chunk-47BYN6CA.js.map → chunk-BYNJWB5F.js.map} +0 -0
  416. /package/dist/cli-bundle/chunks/{chunk-S673PVHD.js.map → chunk-CNPWCUDR.js.map} +0 -0
  417. /package/dist/cli-bundle/chunks/{chunk-TYQBGXH2.js.map → chunk-DKWIPIJY.js.map} +0 -0
  418. /package/dist/cli-bundle/chunks/{chunk-HMQMRHQJ.js.map → chunk-EKMHDL6Z.js.map} +0 -0
  419. /package/dist/cli-bundle/chunks/{chunk-LIVRA6VG.js.map → chunk-EOFROIC5.js.map} +0 -0
  420. /package/dist/cli-bundle/chunks/{chunk-NNMBNN6Q.js.map → chunk-ETJKPURB.js.map} +0 -0
  421. /package/dist/cli-bundle/chunks/{chunk-2E3KSWFG.js.map → chunk-F4EYOSNC.js.map} +0 -0
  422. /package/dist/cli-bundle/chunks/{chunk-DJ3YYLHG.js.map → chunk-FA5O2DEG.js.map} +0 -0
  423. /package/dist/cli-bundle/chunks/{chunk-QTWWHFI3.js.map → chunk-FBBPCSJM.js.map} +0 -0
  424. /package/dist/cli-bundle/chunks/{chunk-EMFDZ7N3.js.map → chunk-FSOJCFDS.js.map} +0 -0
  425. /package/dist/cli-bundle/chunks/{chunk-M35R7LFX.js.map → chunk-FXKPUMIR.js.map} +0 -0
  426. /package/dist/cli-bundle/chunks/{chunk-II3WDRCM.js.map → chunk-HWHZ7EY7.js.map} +0 -0
  427. /package/dist/cli-bundle/chunks/{chunk-7R5YKVKO.js.map → chunk-ICEWMJYH.js.map} +0 -0
  428. /package/dist/cli-bundle/chunks/{chunk-UMTPQMEG.js.map → chunk-II4BRHKM.js.map} +0 -0
  429. /package/dist/cli-bundle/chunks/{chunk-QG6M6XQE.js.map → chunk-J7VSEFWB.js.map} +0 -0
  430. /package/dist/cli-bundle/chunks/{chunk-22YA6GCA.js.map → chunk-K2LBDYDC.js.map} +0 -0
  431. /package/dist/cli-bundle/chunks/{chunk-BQVESTOG.js.map → chunk-KCJZREBI.js.map} +0 -0
  432. /package/dist/cli-bundle/chunks/{chunk-5P2LQV2F.js.map → chunk-MTQK5ZSB.js.map} +0 -0
  433. /package/dist/cli-bundle/chunks/{chunk-LEC57E7K.js.map → chunk-NCGQ27PK.js.map} +0 -0
  434. /package/dist/cli-bundle/chunks/{chunk-5LZPDRFW.js.map → chunk-NMQNXH4U.js.map} +0 -0
  435. /package/dist/cli-bundle/chunks/{chunk-PRUB7RI4.js.map → chunk-OVSFW4KD.js.map} +0 -0
  436. /package/dist/cli-bundle/chunks/{chunk-4L7Q4OVT.js.map → chunk-PF5GLFPU.js.map} +0 -0
  437. /package/dist/cli-bundle/chunks/{chunk-YVYJQR6S.js.map → chunk-QUTJOHGK.js.map} +0 -0
  438. /package/dist/cli-bundle/chunks/{chunk-CSRFOIHG.js.map → chunk-RICT5QYR.js.map} +0 -0
  439. /package/dist/cli-bundle/chunks/{chunk-OUG4CL4H.js.map → chunk-RNKUCHUQ.js.map} +0 -0
  440. /package/dist/cli-bundle/chunks/{chunk-X7RKOJXL.js.map → chunk-SL233DQD.js.map} +0 -0
  441. /package/dist/cli-bundle/chunks/{chunk-USVOBLGB.js.map → chunk-U3WTMYBX.js.map} +0 -0
  442. /package/dist/cli-bundle/chunks/{chunk-DYZKSIVX.js.map → chunk-VE3BUO3R.js.map} +0 -0
  443. /package/dist/cli-bundle/chunks/{chunk-RNWE2HZR.js.map → chunk-W2ZESOQE.js.map} +0 -0
  444. /package/dist/cli-bundle/chunks/{chunk-GL3QKIET.js.map → chunk-XKJDCJEH.js.map} +0 -0
  445. /package/dist/cli-bundle/chunks/{chunk-SO2IOH37.js.map → chunk-XNQ3YH6N.js.map} +0 -0
  446. /package/dist/cli-bundle/chunks/{chunk-ZGEWEO7B.js.map → chunk-XXGAWTH5.js.map} +0 -0
  447. /package/dist/cli-bundle/chunks/{chunk-4EOS35RL.js.map → chunk-YBQF4CAW.js.map} +0 -0
  448. /package/dist/cli-bundle/chunks/{chunk-MTDEEUGV.js.map → chunk-YT4Z2OVB.js.map} +0 -0
  449. /package/dist/cli-bundle/chunks/{chunk-5NS6TJ2F.js.map → chunk-ZHCSGIUX.js.map} +0 -0
  450. /package/dist/cli-bundle/chunks/{claim-2BSYPJTJ.js.map → claim-G57ZJLZ4.js.map} +0 -0
  451. /package/dist/cli-bundle/chunks/{claim-EZ6JKY5X.js.map → claim-TRSDQO6L.js.map} +0 -0
  452. /package/dist/cli-bundle/chunks/{close-3TSX6BYF.js.map → close-4QMUQMON.js.map} +0 -0
  453. /package/dist/cli-bundle/chunks/{close-TQZK43Z5.js.map → close-NNZZTZ5V.js.map} +0 -0
  454. /package/dist/cli-bundle/chunks/{close-many-B7DBVA46.js.map → close-many-3UWKJRQK.js.map} +0 -0
  455. /package/dist/cli-bundle/chunks/{close-many-HB4UFCS3.js.map → close-many-A7U62CRI.js.map} +0 -0
  456. /package/dist/cli-bundle/chunks/{comments-M7PAINZT.js.map → comments-4EM7XR74.js.map} +0 -0
  457. /package/dist/cli-bundle/chunks/{comments-X7M7XM6I.js.map → comments-URWDZP2I.js.map} +0 -0
  458. /package/dist/cli-bundle/chunks/{context-EGUGU4K7.js.map → context-A46YAV2F.js.map} +0 -0
  459. /package/dist/cli-bundle/chunks/{context-V32ZAPL6.js.map → context-BCR34RKM.js.map} +0 -0
  460. /package/dist/cli-bundle/chunks/{copy-RMLXLZOL.js.map → copy-KBTIUW7L.js.map} +0 -0
  461. /package/dist/cli-bundle/chunks/{copy-NWFFRYWM.js.map → copy-X7V6AEDB.js.map} +0 -0
  462. /package/dist/cli-bundle/chunks/{create-UZLJXHLA.js.map → create-4KOAQ6ME.js.map} +0 -0
  463. /package/dist/cli-bundle/chunks/{create-GK4MX2LJ.js.map → create-ZPZKJDFQ.js.map} +0 -0
  464. /package/dist/cli-bundle/chunks/{delete-EFQLVEAS.js.map → delete-2ZI6CJZM.js.map} +0 -0
  465. /package/dist/cli-bundle/chunks/{delete-RMGNIL2S.js.map → delete-FGKVPUQZ.js.map} +0 -0
  466. /package/dist/cli-bundle/chunks/{deps-WKHUPVD3.js.map → deps-IUJOBF2H.js.map} +0 -0
  467. /package/dist/cli-bundle/chunks/{deps-K2I7QV4Y.js.map → deps-SJCEFU3C.js.map} +0 -0
  468. /package/dist/cli-bundle/chunks/{extension-4LPTFTV4.js.map → extension-VRYTNNSV.js.map} +0 -0
  469. /package/dist/cli-bundle/chunks/{extension-ASUPTDCC.js.map → extension-XFQG3BXL.js.map} +0 -0
  470. /package/dist/cli-bundle/chunks/{focus-UGROAMAX.js.map → focus-7N36RIMT.js.map} +0 -0
  471. /package/dist/cli-bundle/chunks/{focus-ELOPN2SR.js.map → focus-CFE33IYC.js.map} +0 -0
  472. /package/dist/cli-bundle/chunks/{get-OTXPLWYW.js.map → get-577VLZZ7.js.map} +0 -0
  473. /package/dist/cli-bundle/chunks/{get-IWZ7IMPS.js.map → get-LLFWSPXW.js.map} +0 -0
  474. /package/dist/cli-bundle/chunks/{history-HNWBUDMI.js.map → history-4FJK6Y3O.js.map} +0 -0
  475. /package/dist/cli-bundle/chunks/{history-TKTULEVE.js.map → history-ZXNWG6H4.js.map} +0 -0
  476. /package/dist/cli-bundle/chunks/{history-compact-EQXVPK3V.js.map → history-compact-AXR6R6GU.js.map} +0 -0
  477. /package/dist/cli-bundle/chunks/{history-compact-MMQC7MCW.js.map → history-compact-HXF3OT7G.js.map} +0 -0
  478. /package/dist/cli-bundle/chunks/{history-redact-SPIFIXVY.js.map → history-redact-GV633Z4H.js.map} +0 -0
  479. /package/dist/cli-bundle/chunks/{history-redact-UBDHBEJE.js.map → history-redact-UMPD4G3K.js.map} +0 -0
  480. /package/dist/cli-bundle/chunks/{history-repair-GMMHFAGH.js.map → history-repair-WHOK2ICG.js.map} +0 -0
  481. /package/dist/cli-bundle/chunks/{history-repair-7DSDRPMX.js.map → history-repair-X57HE5EA.js.map} +0 -0
  482. /package/dist/cli-bundle/chunks/{init-A6FTZ5UC.js.map → init-KQWZSNBX.js.map} +0 -0
  483. /package/dist/cli-bundle/chunks/{init-QGK4JFF6.js.map → init-N7MIIYCU.js.map} +0 -0
  484. /package/dist/cli-bundle/chunks/{learnings-A6DGBMG3.js.map → learnings-FPG7WAVW.js.map} +0 -0
  485. /package/dist/cli-bundle/chunks/{learnings-DR53TWRA.js.map → learnings-GZRBIEAN.js.map} +0 -0
  486. /package/dist/cli-bundle/chunks/{list-LJ5DBXC3.js.map → list-MZBCSKLU.js.map} +0 -0
  487. /package/dist/cli-bundle/chunks/{list-KOJN23UL.js.map → list-ZDQ2OBSO.js.map} +0 -0
  488. /package/dist/cli-bundle/chunks/{notes-K5I3TAYR.js.map → notes-LW53PFLH.js.map} +0 -0
  489. /package/dist/cli-bundle/chunks/{notes-7VLTHKPW.js.map → notes-WQAP67EC.js.map} +0 -0
  490. /package/dist/cli-bundle/chunks/{register-mutation-ZAGVKMBQ.js.map → register-mutation-ANZIWHUF.js.map} +0 -0
  491. /package/dist/cli-bundle/chunks/{register-mutation-RXRX4P7D.js.map → register-mutation-PLFHAS4N.js.map} +0 -0
  492. /package/dist/cli-bundle/chunks/{register-setup-2FEGSFLM.js.map → register-setup-KPTZ36D4.js.map} +0 -0
  493. /package/dist/cli-bundle/chunks/{register-setup-LTJG52WP.js.map → register-setup-TMEF6V7O.js.map} +0 -0
  494. /package/dist/cli-bundle/chunks/{restore-SJUWYOCK.js.map → restore-64JKQV7G.js.map} +0 -0
  495. /package/dist/cli-bundle/chunks/{restore-PI3WM4GK.js.map → restore-GKM26SAW.js.map} +0 -0
  496. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-W4F2LKHW.js.map → scheduling-shortcuts-4ION7QAX.js.map} +0 -0
  497. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-VWAMP2S2.js.map → scheduling-shortcuts-X6D6VSZR.js.map} +0 -0
  498. /package/dist/cli-bundle/chunks/{schema-N5ETYD4P.js.map → schema-OA4RSVMI.js.map} +0 -0
  499. /package/dist/cli-bundle/chunks/{schema-DXQRIEFM.js.map → schema-TA3NF3RG.js.map} +0 -0
  500. /package/dist/cli-bundle/chunks/{test-55RJCGRU.js.map → search-INCM5I4J.js.map} +0 -0
  501. /package/dist/cli-bundle/chunks/{test-47UQGEXE.js.map → search-UAIHEQZL.js.map} +0 -0
  502. /package/dist/cli-bundle/chunks/{stats-J563NJBY.js.map → stats-RHEMG4CE.js.map} +0 -0
  503. /package/dist/cli-bundle/chunks/{stats-ZFESFVQC.js.map → stats-WQWTIA5Y.js.map} +0 -0
  504. /package/dist/cli-bundle/chunks/{telemetry-BNGLIFEM.js.map → telemetry-G6UKGKJU.js.map} +0 -0
  505. /package/dist/cli-bundle/chunks/{telemetry-SC7HPRXX.js.map → telemetry-XA5D2QEO.js.map} +0 -0
  506. /package/dist/cli-bundle/chunks/{update-2BZEAI7B.js.map → test-XF7BYLMZ.js.map} +0 -0
  507. /package/dist/cli-bundle/chunks/{update-GCNLER2H.js.map → test-ZMQF23P3.js.map} +0 -0
  508. /package/dist/cli-bundle/chunks/{test-all-DN6KG4FX.js.map → test-all-WUBBJCPU.js.map} +0 -0
  509. /package/dist/cli-bundle/chunks/{test-all-5SFTTRNL.js.map → test-all-ZNQBMUOI.js.map} +0 -0
  510. /package/dist/cli-bundle/chunks/{test-runs-DZEDJ4GH.js.map → test-runs-N7LI7HLH.js.map} +0 -0
  511. /package/dist/cli-bundle/chunks/{test-runs-NHRBT7SN.js.map → test-runs-RFA42EEX.js.map} +0 -0
  512. /package/dist/cli-bundle/chunks/{update-many-OKYWFCBO.js.map → update-many-6XFR7TFG.js.map} +0 -0
  513. /package/dist/cli-bundle/chunks/{update-many-IRNV3OTG.js.map → update-many-NMRUQZL2.js.map} +0 -0
  514. /package/dist/cli-bundle/chunks/{upgrade-KP4I45V5.js.map → upgrade-EJTME2YQ.js.map} +0 -0
  515. /package/dist/cli-bundle/chunks/{upgrade-3RIAFQIK.js.map → upgrade-QMCSONWR.js.map} +0 -0
  516. /package/dist/cli-bundle/chunks/{validate-GVY4VE43.js.map → validate-3SUCHXXX.js.map} +0 -0
  517. /package/dist/cli-bundle/chunks/{validate-ADKGN37M.js.map → validate-KIIJY5RC.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../../cli/register-operations.ts"],"sourcesContent":["/**\n * @module cli/register-operations\n *\n * Provides CLI runtime support for Register Operations.\n */\nimport type { Command } from \"commander\";\nimport {\n normalizeStatusInputWithRegistry,\n resolveRuntimeStatusRegistry,\n type RuntimeStatusRegistry,\n} from \"../core/schema/runtime-schema.js\";\nimport { setActiveCommandResult } from \"../core/extensions/index.js\";\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\nimport { resolvePmRoot } from \"../core/store/paths.js\";\nimport { readSettings } from \"../core/store/settings.js\";\nimport {\n buildBackgroundTestAllCommandArgs,\n buildBackgroundTestCommandArgs,\n collect,\n getGlobalOptions,\n invalidateSearchCachesForMutation,\n printError,\n printResult,\n} from \"./registration-helpers.js\";\n\n/**\n * Resolve the status the `start-task` lifecycle alias should move an item to.\n * Resolves `in_progress` strictly through the workspace registry so a custom\n * workflow that omits in_progress falls back to its open status instead of\n * setting a status the workflow does not define.\n */\nexport function resolveStartTaskInProgressStatus(statusRegistry: RuntimeStatusRegistry): string {\n return normalizeStatusInputWithRegistry(\"in_progress\", statusRegistry) ?? statusRegistry.open_status;\n}\n\nfunction resolveTelemetrySubcommand(namespaceOrSubcommand: string | undefined, subcommand: string | undefined): string | undefined {\n const normalizedNamespace = namespaceOrSubcommand?.trim().toLowerCase();\n const normalizedSubcommand = subcommand?.trim().toLowerCase();\n if (normalizedNamespace === undefined || normalizedNamespace.length === 0) {\n return normalizedSubcommand;\n }\n if (normalizedNamespace === \"local-analytics\") {\n return normalizedSubcommand && normalizedSubcommand.length > 0 ? normalizedSubcommand : \"status\";\n }\n if (normalizedSubcommand !== undefined && normalizedSubcommand.length > 0) {\n throw new PmCliError(\n `Unknown pm telemetry path \"${namespaceOrSubcommand} ${subcommand}\". Use \"pm telemetry ${namespaceOrSubcommand}\" or legacy alias \"pm telemetry local-analytics ${normalizedSubcommand}\".`,\n EXIT_CODE.USAGE,\n {\n code: \"unknown_subcommand\",\n examples: [\n \"pm telemetry status\",\n \"pm telemetry flush\",\n \"pm telemetry stats --limit 10\",\n \"pm telemetry clear\",\n \"pm telemetry local-analytics status --json\",\n ],\n },\n );\n }\n return normalizedNamespace;\n}\n\n\n\n/**\n * Implements register operation commands for the public runtime surface of this module.\n */\nexport function registerOperationCommands(program: Command): void {\n program\n .command(\"test\")\n .argument(\"<id>\", \"Item id\")\n .option(\"--add <value>\", \"Add linked test entry (CSV/markdown pairs or - for stdin)\", collect)\n .option(\"--add-json <value>\", \"Add linked test entry from JSON object/array (or - for stdin)\", collect)\n .option(\"--remove <value>\", \"Remove linked test entry by command/path (command=<value>, path=<value>, markdown pairs, plain value, or - for stdin)\", collect)\n .option(\"--list\", \"List linked tests without mutating\")\n .option(\"--run\", \"Run linked test commands\")\n .option(\"--match <value>\", \"Run only linked tests whose command/path contains this substring\")\n .option(\"--only-index <n>\", \"Run only the 1-based linked-test index from --list order\")\n .option(\"--only-last\", \"Run only the most recently added linked test\")\n .option(\"--background\", \"Run linked tests in managed background mode\")\n .option(\"--timeout <seconds>\", \"Default run timeout in seconds\")\n .option(\"--progress\", \"Emit linked-test progress to stderr (always shown in TTY, opt-in for non-TTY)\")\n .option(\"--env-set <value>\", \"Set environment variable(s) for linked-test runs (KEY=VALUE, repeatable)\", collect)\n .option(\"--env-clear <value>\", \"Clear environment variable(s) for linked-test runs (NAME, repeatable)\", collect)\n .option(\"--shared-host-safe\", \"Apply additive shared-host-safe runtime defaults for linked-test runs\")\n .option(\"--pm-context <mode>\", \"PM linked-test context mode: schema|tracker|auto (default: schema)\")\n .option(\"--override-linked-pm-context\", \"Force run-level --pm-context to override per-linked-test pm_context_mode metadata\")\n .option(\"--fail-on-context-mismatch\", \"Fail linked PM commands when context item counts differ\")\n .option(\"--fail-on-skipped\", \"Treat skipped linked tests as dependency failures\")\n .option(\"--fail-on-empty-test-run\", \"Treat successful linked-test commands that report zero executed tests as failures\")\n .option(\"--require-assertions-for-pm\", \"Require assertion metadata for linked PM command tests\")\n .option(\"--check-context\", \"Preflight linked PM command context diagnostics before executing commands\")\n .option(\"--auto-pm-context\", \"Auto-remediate PM tracker-read context mismatches by routing those linked commands through tracker context\")\n .option(\"--author <value>\", \"Mutation author\")\n .option(\"--message <value>\", \"History message\")\n .option(\"--force\", \"Force ownership override\")\n .description(\"Manage tests linked to an item and optionally run them.\")\n .action(async (id: string, options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const addValues = Array.isArray(options.add) ? (options.add as string[]) : [];\n const addJsonValues = Array.isArray(options.addJson) ? (options.addJson as string[]) : [];\n const removeValues = Array.isArray(options.remove) ? (options.remove as string[]) : [];\n const runInBackground = options.background === true;\n if (runInBackground && options.run !== true) {\n throw new PmCliError(\"--background requires --run\", EXIT_CODE.USAGE);\n }\n if (runInBackground && (addValues.length > 0 || addJsonValues.length > 0 || removeValues.length > 0)) {\n throw new PmCliError(\"--background does not support --add/--add-json/--remove; update linked tests first, then run in background\", EXIT_CODE.USAGE);\n }\n if (runInBackground) {\n const { runStartBackgroundRun } = await import(\"./commands/test-runs.js\");\n const result = await runStartBackgroundRun({\n kind: \"test\",\n commandArgs: buildBackgroundTestCommandArgs(id, { ...options, add: addValues, addJson: addJsonValues, remove: removeValues }),\n targetId: id,\n author: typeof options.author === \"string\" ? options.author : undefined,\n noExtensions: globalOptions.noExtensions === true,\n }, globalOptions);\n printResult(result, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=test took_ms=${Date.now() - startedAt}`);\n }\n return;\n }\n const { runTest } = await import(\"./commands/test.js\");\n const result = await runTest(id, {\n add: addValues,\n addJson: addJsonValues,\n remove: removeValues,\n list: Boolean(options.list),\n run: Boolean(options.run),\n match: typeof options.match === \"string\" ? options.match : undefined,\n onlyIndex: typeof options.onlyIndex === \"string\" || typeof options.onlyIndex === \"number\" ? options.onlyIndex : undefined,\n onlyLast: Boolean(options.onlyLast),\n timeout: typeof options.timeout === \"string\" ? options.timeout : undefined,\n progress: Boolean(options.progress),\n envSet: Array.isArray(options.envSet) ? (options.envSet as string[]) : [],\n envClear: Array.isArray(options.envClear) ? (options.envClear as string[]) : [],\n sharedHostSafe: Boolean(options.sharedHostSafe),\n pmContext: typeof options.pmContext === \"string\" ? options.pmContext : undefined,\n overrideLinkedPmContext: Boolean(options.overrideLinkedPmContext),\n failOnContextMismatch: Boolean(options.failOnContextMismatch),\n failOnSkipped: Boolean(options.failOnSkipped),\n failOnEmptyTestRun: Boolean(options.failOnEmptyTestRun),\n requireAssertionsForPm: Boolean(options.requireAssertionsForPm),\n checkContext: Boolean(options.checkContext),\n autoPmContext: Boolean(options.autoPmContext),\n author: typeof options.author === \"string\" ? options.author : undefined,\n message: typeof options.message === \"string\" ? options.message : undefined,\n force: Boolean(options.force),\n }, globalOptions);\n if (addValues.length > 0 || addJsonValues.length > 0 || removeValues.length > 0 || options.run === true) {\n await invalidateSearchCachesForMutation(globalOptions, result);\n }\n printResult(result, globalOptions);\n if (result.run_results.some((entry) => entry.status === \"failed\") || result.fail_on_skipped_triggered === true) {\n process.exitCode = EXIT_CODE.DEPENDENCY_FAILED;\n }\n if (globalOptions.profile) {\n printError(`profile:command=test took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"test-all\")\n .description(\"Run linked tests across matching items.\")\n .option(\"--status <value>\", \"Filter items by status before running tests\")\n .option(\"--limit <n>\", \"Limit matching items before running linked tests\")\n .option(\"--offset <n>\", \"Skip matching items before running linked tests\")\n .option(\"--background\", \"Run linked tests in managed background mode\")\n .option(\"--timeout <seconds>\", \"Default run timeout in seconds\")\n .option(\"--progress\", \"Emit linked-test progress to stderr (always shown in TTY, opt-in for non-TTY)\")\n .option(\"--env-set <value>\", \"Set environment variable(s) for linked-test runs (KEY=VALUE, repeatable)\", collect)\n .option(\"--env-clear <value>\", \"Clear environment variable(s) for linked-test runs (NAME, repeatable)\", collect)\n .option(\"--shared-host-safe\", \"Apply additive shared-host-safe runtime defaults for linked-test runs\")\n .option(\"--pm-context <mode>\", \"PM linked-test context mode: schema|tracker|auto (default: schema)\")\n .option(\"--override-linked-pm-context\", \"Force run-level --pm-context to override per-linked-test pm_context_mode metadata\")\n .option(\"--fail-on-context-mismatch\", \"Fail linked PM commands when context item counts differ\")\n .option(\"--fail-on-skipped\", \"Treat skipped linked tests as dependency failures\")\n .option(\"--fail-on-empty-test-run\", \"Treat successful linked-test commands that report zero executed tests as failures\")\n .option(\"--require-assertions-for-pm\", \"Require assertion metadata for linked PM command tests\")\n .option(\"--check-context\", \"Preflight linked PM command context diagnostics before executing commands\")\n .option(\"--auto-pm-context\", \"Auto-remediate PM tracker-read context mismatches by routing those linked commands through tracker context\")\n .action(async (options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const runInBackground = options.background === true;\n if (runInBackground) {\n const { runStartBackgroundRun } = await import(\"./commands/test-runs.js\");\n const result = await runStartBackgroundRun({\n kind: \"test-all\",\n commandArgs: buildBackgroundTestAllCommandArgs(options),\n statusFilter: typeof options.status === \"string\" ? options.status : undefined,\n noExtensions: globalOptions.noExtensions === true,\n }, globalOptions);\n printResult(result, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=test-all took_ms=${Date.now() - startedAt}`);\n }\n return;\n }\n const { runTestAll } = await import(\"./commands/test-all.js\");\n const result = await runTestAll({\n status: typeof options.status === \"string\" ? options.status : undefined,\n limit: typeof options.limit === \"string\" ? options.limit : undefined,\n offset: typeof options.offset === \"string\" ? options.offset : undefined,\n timeout: typeof options.timeout === \"string\" ? options.timeout : undefined,\n progress: Boolean(options.progress),\n envSet: Array.isArray(options.envSet) ? (options.envSet as string[]) : [],\n envClear: Array.isArray(options.envClear) ? (options.envClear as string[]) : [],\n sharedHostSafe: Boolean(options.sharedHostSafe),\n pmContext: typeof options.pmContext === \"string\" ? options.pmContext : undefined,\n overrideLinkedPmContext: Boolean(options.overrideLinkedPmContext),\n failOnContextMismatch: Boolean(options.failOnContextMismatch),\n failOnSkipped: Boolean(options.failOnSkipped),\n failOnEmptyTestRun: Boolean(options.failOnEmptyTestRun),\n requireAssertionsForPm: Boolean(options.requireAssertionsForPm),\n checkContext: Boolean(options.checkContext),\n autoPmContext: Boolean(options.autoPmContext),\n }, globalOptions);\n await invalidateSearchCachesForMutation(globalOptions, { ids: result.results.map((entry) => entry.id) });\n printResult(result, globalOptions);\n if (result.failed > 0 || result.fail_on_skipped_triggered === true) {\n process.exitCode = EXIT_CODE.DEPENDENCY_FAILED;\n }\n if (globalOptions.profile) {\n printError(`profile:command=test-all took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"test-runs-worker\", { hidden: true })\n .argument(\"<runId>\", \"Background run id\")\n .description(\"Internal background worker command.\")\n .action(async (runId: string, _options: Record<string, unknown>, command: Command) => {\n const globalOptions = getGlobalOptions(command);\n const { runTestRunsWorker } = await import(\"./commands/test-runs.js\");\n await runTestRunsWorker(runId, globalOptions);\n });\n\n program\n .command(\"telemetry\")\n .argument(\"[namespaceOrSubcommand]\", \"Telemetry subcommand: status, flush, stats, clear (default: status)\")\n .argument(\"[subcommand]\", \"Compatibility alias target for local-analytics: status, flush, stats, clear\")\n .option(\"--limit <n>\", \"Maximum command groups returned by telemetry stats\")\n .description(\"Inspect and manage local telemetry queue/runtime state.\")\n .action(async (namespaceOrSubcommand: string | undefined, subcommand: string | undefined, options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const { runTelemetry } = await import(\"./commands/telemetry.js\");\n const result = await runTelemetry(\n {\n subcommand: resolveTelemetrySubcommand(namespaceOrSubcommand, subcommand),\n // Commander always parses `--limit <n>` to a string (or leaves it\n // undefined), so a string passthrough covers every CLI-reachable input.\n limit: typeof options.limit === \"string\" ? options.limit : undefined,\n },\n globalOptions,\n );\n printResult(result, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=telemetry took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"stats\")\n .description(\"Show project tracker statistics.\")\n .option(\n \"--storage\",\n \"Include aggregate history-stream storage metrics (total streams/lines/bytes, largest + deepest streams, oldest/newest entries)\",\n )\n .option(\n \"--metadata-coverage\",\n \"Include metadata coverage % (acceptance_criteria, estimated_minutes, resolution, tags, parent) overall and by type\",\n )\n .option(\"--by-assignee\", \"Include a lifecycle-bucketed item breakdown grouped by assignee\")\n .option(\"--by-tag\", \"Include a lifecycle-bucketed item breakdown grouped by tag\")\n .option(\"--by-priority\", \"Include a lifecycle-bucketed item breakdown grouped by priority\")\n .option(\"--tag-prefix <value>\", \"With --by-tag: only count tags starting with this prefix (e.g. domain:)\")\n .option(\n \"--field-utilization\",\n \"Report content-field utilization rates (notes/learnings/files/docs/tests/comments/deps/body) for governance audits\",\n )\n .action(async (options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const { runStats } = await import(\"./commands/stats.js\");\n const result = await runStats(globalOptions, {\n storage: options.storage === true,\n metadataCoverage: options.metadataCoverage === true,\n byAssignee: options.byAssignee === true,\n byTag: options.byTag === true,\n byPriority: options.byPriority === true,\n tagPrefix: typeof options.tagPrefix === \"string\" ? options.tagPrefix : undefined,\n fieldUtilization: options.fieldUtilization === true,\n });\n printResult(result, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=stats took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"health\")\n .description(\"Show project tracker health checks.\")\n .option(\"--strict-directories\", \"Treat optional item-type directories as required failures\")\n .option(\"--check-only\", \"Run read-only health diagnostics without refreshing vectors\")\n .option(\"--check-telemetry\", \"Probe telemetry endpoint health and include network diagnostics\")\n .option(\"--no-refresh\", \"Disable automatic vector refresh attempts during health checks\")\n .option(\"--refresh-vectors\", \"Explicitly enable vector refresh attempts during health checks\")\n .option(\"--verbose-stale-items\", \"Include full stale vectorization ID lists in health output\")\n .option(\"--brief\", \"Emit compact health details for low-token agent checks\")\n .option(\"--summary\", \"Emit one-line-style health status with check names and warning count\")\n .option(\"--skip-vectors\", \"Skip vectorization check for a faster run\")\n .option(\"--skip-integrity\", \"Skip item/history file integrity check for a faster run\")\n .option(\"--skip-drift\", \"Skip history drift hash check for a faster run\")\n .option(\"--full\", \"Run all checks including slow integrity, drift, and vectorization checks\")\n .option(\n \"--strict-exit\",\n \"Return non-zero exit when health is not ok (advisory telemetry warnings are excluded; see warnings[])\",\n )\n .option(\"--fail-on-warn\", \"Alias for --strict-exit\")\n .action(async (options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const { runHealth } = await import(\"./commands/health.js\");\n const result = await runHealth(globalOptions, {\n strictDirectories: Boolean(options.strictDirectories),\n checkOnly: Boolean(options.checkOnly),\n checkTelemetry: Boolean(options.checkTelemetry),\n noRefresh: Boolean(options.noRefresh),\n refreshVectors: Boolean(options.refreshVectors),\n verboseStaleItems: Boolean(options.verboseStaleItems),\n brief: Boolean(options.brief),\n summary: Boolean(options.summary),\n skipVectors: Boolean(options.skipVectors),\n skipIntegrity: Boolean(options.skipIntegrity),\n skipDrift: Boolean(options.skipDrift),\n full: Boolean(options.full),\n });\n printResult(result, globalOptions);\n const strictExit = Boolean(options.strictExit) || Boolean(options.failOnWarn);\n if (strictExit && !result.ok) {\n setActiveCommandResult({\n ...result,\n exit_code: EXIT_CODE.GENERIC_FAILURE,\n error_code: \"health_findings\",\n error_category: \"validation\",\n command_resolution: \"health_findings\",\n resolution_stage: \"execute\",\n });\n process.exitCode = EXIT_CODE.GENERIC_FAILURE;\n }\n if (globalOptions.profile) {\n printError(`profile:command=health took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"validate\")\n .description(\"Run standalone metadata, resolution, lifecycle, files, linked-command reference, and history drift validation checks.\")\n .option(\"--check-metadata\", \"Run metadata completeness checks\")\n .option(\"--metadata-profile <value>\", \"Select metadata validation profile for --check-metadata (core|strict|custom)\")\n .option(\"--check-resolution\", \"Run closed-item resolution metadata checks\")\n .option(\"--check-lifecycle\", \"Run active-item lifecycle governance drift checks\")\n .option(\"--check-stale-blockers\", \"Include stale blocker-pattern diagnostics in lifecycle checks\")\n .option(\"--dependency-cycle-severity <value>\", \"Set dependency-cycle warning policy for lifecycle checks (off|warn|error)\")\n .option(\"--parent-cycle-severity <value>\", \"Set parent-hierarchy cycle warning policy for lifecycle checks (off|warn|error)\")\n .option(\"--check-files\", \"Run linked-file and orphaned-file checks\")\n .option(\"--check-command-references\", \"Run linked-command PM-ID reference checks\")\n .option(\"--scan-mode <value>\", \"Select file candidate scan mode for --check-files (default|tracked-all|tracked-all-strict)\")\n .option(\"--include-pm-internals\", \"Include PM storage internals in tracked-all candidate scans\")\n .option(\"--verbose-file-lists\", \"Include full file-path lists for validate --check-files details\")\n .option(\"--verbose-diagnostics\", \"Include full validate diagnostic ID lists instead of compact summaries\")\n .option(\"--all-affected-ids\", \"Emit complete missing_* affected-ID lists with no truncation (implied by --json)\")\n .option(\"--strict-exit\", \"Return non-zero exit when validation warnings are present\")\n .option(\"--fail-on-warn\", \"Alias for --strict-exit\")\n .option(\"--fix-hints\", \"Add a machine-executable fix_hints[] of pm commands to each failing check's details\")\n .option(\"--auto-fix\", \"Apply the safe, deterministic subset of fix-hint remediations (field backfills) automatically\")\n .option(\"--dry-run\", \"Preview planned --auto-fix/--prune-missing fixes without applying them\")\n .option(\"--fix-scope <scope>\", \"Grant --auto-fix scopes (metadata, resolution, lifecycle; comma-separated or repeatable). Default: metadata, resolution; lifecycle must be named explicitly\", collect)\n .option(\"--prune-missing\", \"Remove stale linked-file/doc LINKS whose paths classified as deleted (never touches real files)\")\n .option(\"--check-history-drift\", \"Run item/history hash drift checks\")\n .action(async (options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const { runValidate } = await import(\"./commands/validate.js\");\n const result = await runValidate({\n checkMetadata: Boolean(options.checkMetadata),\n metadataProfile: typeof options.metadataProfile === \"string\" ? options.metadataProfile : undefined,\n checkResolution: Boolean(options.checkResolution),\n checkLifecycle: Boolean(options.checkLifecycle),\n checkStaleBlockers: Boolean(options.checkStaleBlockers),\n dependencyCycleSeverity: typeof options.dependencyCycleSeverity === \"string\" ? options.dependencyCycleSeverity : undefined,\n parentCycleSeverity: typeof options.parentCycleSeverity === \"string\" ? options.parentCycleSeverity : undefined,\n checkFiles: Boolean(options.checkFiles),\n checkCommandReferences: Boolean(options.checkCommandReferences),\n scanMode: typeof options.scanMode === \"string\" ? options.scanMode : undefined,\n includePmInternals: Boolean(options.includePmInternals),\n verboseFileLists: Boolean(options.verboseFileLists),\n verboseDiagnostics: Boolean(options.verboseDiagnostics),\n allAffectedIds: Boolean(options.allAffectedIds),\n checkHistoryDrift: Boolean(options.checkHistoryDrift),\n fixHints: Boolean(options.fixHints),\n autoFix: Boolean(options.autoFix),\n dryRun: Boolean(options.dryRun),\n fixScope: Array.isArray(options.fixScope) ? (options.fixScope as string[]) : undefined,\n pruneMissing: Boolean(options.pruneMissing),\n }, globalOptions);\n printResult(result, globalOptions);\n const strictExit = Boolean(options.strictExit) || Boolean(options.failOnWarn);\n if (strictExit && (result.has_warnings || !result.ok)) {\n setActiveCommandResult({\n ...result,\n exit_code: EXIT_CODE.GENERIC_FAILURE,\n error_code: \"validation_findings\",\n error_category: \"validation\",\n command_resolution: \"validation_findings\",\n resolution_stage: \"execute\",\n });\n process.exitCode = EXIT_CODE.GENERIC_FAILURE;\n }\n if (globalOptions.profile) {\n printError(`profile:command=validate took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"gc\")\n .option(\"--dry-run\", \"Preview cleanup targets without deleting files; without this flag, pm gc deletes matched artifacts\")\n .option(\"--scope <value>\", \"Limit cleanup to one or more scopes (comma-separated or repeatable): index, embeddings, runtime, locks\", collect)\n .description(\"Delete optional cache artifacts by default (including expired lock debris) and show a summary.\")\n .action(async (options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const { runGc } = await import(\"./commands/gc.js\");\n const result = await runGc(globalOptions, {\n dryRun: options.dryRun === true,\n scope: Array.isArray(options.scope) ? (options.scope as string[]) : [],\n });\n printResult(result, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=gc took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"contracts\")\n .description(\"Show machine-readable command and schema contracts for agents.\")\n .option(\"--action <value>\", \"Filter tool schema branches to a specific action\")\n .option(\"--command <value>\", \"Scope contracts output to one CLI command (narrow-by-default)\")\n .option(\"--schema-only\", \"Return schema-focused output only\")\n .option(\"--flags-only\", \"Return command flag contracts only\")\n .option(\"--availability-only\", \"Return action availability surface only\")\n .option(\"--runtime-only\", \"Include only actions invocable in the current runtime\")\n .option(\"--active-only\", \"Alias for --runtime-only\")\n .option(\n \"--full\",\n \"Include full schema and command-flag surfaces (large; default brief output omits heavy sections for unfiltered queries)\",\n )\n .action(async (options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const { runContracts } = await import(\"./commands/contracts.js\");\n const result = await runContracts({\n action: typeof options.action === \"string\" ? options.action : undefined,\n command: typeof options.command === \"string\" ? options.command : undefined,\n schemaOnly: Boolean(options.schemaOnly),\n flagsOnly: Boolean(options.flagsOnly),\n availabilityOnly: Boolean(options.availabilityOnly),\n runtimeOnly: Boolean(options.runtimeOnly) || Boolean(options.activeOnly),\n full: Boolean(options.full),\n }, globalOptions);\n printResult(result, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=contracts took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"claim\")\n .argument(\"<id>\", \"Item id\")\n .option(\"--author <value>\", \"Mutation author\")\n .option(\"--message <value>\", \"History message\")\n .option(\"--force\", \"Force claim override\")\n .option(\"--if-available\", \"Skip silently when the item is already claimed by another author (returns skipped=true)\")\n .description(\"Claim an item for active work.\")\n .action(async (id: string, options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const { runClaim } = await import(\"./commands/claim.js\");\n const result = await runClaim(id, Boolean(options.force), globalOptions, {\n author: typeof options.author === \"string\" ? options.author : undefined,\n message: typeof options.message === \"string\" ? options.message : undefined,\n ifAvailable: options.ifAvailable === true,\n });\n await invalidateSearchCachesForMutation(globalOptions, result);\n printResult(result, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=claim took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"release\")\n .argument(\"<id>\", \"Item id\")\n .option(\"--author <value>\", \"Mutation author\")\n .option(\"--message <value>\", \"History message\")\n .option(\"--allow-audit-release\", \"Allow non-owner release handoffs without requiring --force\")\n .option(\"--force\", \"Force release override\")\n .description(\"Release an item's active claim.\")\n .action(async (id: string, options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const { runRelease } = await import(\"./commands/claim.js\");\n const result = await runRelease(id, Boolean(options.force), globalOptions, {\n author: typeof options.author === \"string\" ? options.author : undefined,\n message: typeof options.message === \"string\" ? options.message : undefined,\n allowAuditRelease: options.allowAuditRelease === true,\n });\n await invalidateSearchCachesForMutation(globalOptions, result);\n printResult(result, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=release took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"start-task\")\n .argument(\"<id>\", \"Item id\")\n .option(\"--author <value>\", \"Mutation author\")\n .option(\"--message <value>\", \"History message\")\n .option(\"--force\", \"Force ownership or terminal override when required\")\n .description(\"Lifecycle alias: claim an item and move it to in_progress.\")\n .action(async (id: string, options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const pmRoot = resolvePmRoot(process.cwd(), globalOptions.path);\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const inProgressStatus = resolveStartTaskInProgressStatus(statusRegistry);\n const force = Boolean(options.force);\n const mutationOptions = {\n author: typeof options.author === \"string\" ? options.author : undefined,\n message: typeof options.message === \"string\" ? options.message : undefined,\n };\n const [{ runClaim }, { runUpdate }] = await Promise.all([\n import(\"./commands/claim.js\"),\n import(\"./commands/update.js\"),\n ]);\n const claimResult = await runClaim(id, force, globalOptions, mutationOptions);\n await invalidateSearchCachesForMutation(globalOptions, claimResult);\n const updateResult = await runUpdate(id, { ...mutationOptions, status: inProgressStatus, force }, globalOptions);\n await invalidateSearchCachesForMutation(globalOptions, updateResult);\n printResult({ id, action: \"start_task\", claim: claimResult, update: updateResult }, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=start-task took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"pause-task\")\n .argument(\"<id>\", \"Item id\")\n .option(\"--author <value>\", \"Mutation author\")\n .option(\"--message <value>\", \"History message\")\n .option(\"--force\", \"Force ownership override when required\")\n .description(\"Lifecycle alias: move an item to open and release its claim.\")\n .action(async (id: string, options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const pmRoot = resolvePmRoot(process.cwd(), globalOptions.path);\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const openStatus = statusRegistry.open_status;\n const force = Boolean(options.force);\n const mutationOptions = {\n author: typeof options.author === \"string\" ? options.author : undefined,\n message: typeof options.message === \"string\" ? options.message : undefined,\n };\n const [{ runUpdate }, { runRelease }] = await Promise.all([\n import(\"./commands/update.js\"),\n import(\"./commands/claim.js\"),\n ]);\n const updateResult = await runUpdate(id, { ...mutationOptions, status: openStatus, force }, globalOptions);\n await invalidateSearchCachesForMutation(globalOptions, updateResult);\n const releaseResult = await runRelease(id, force, globalOptions, mutationOptions);\n await invalidateSearchCachesForMutation(globalOptions, releaseResult);\n printResult({ id, action: \"pause_task\", update: updateResult, release: releaseResult }, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=pause-task took_ms=${Date.now() - startedAt}`);\n }\n });\n\n program\n .command(\"close-task\")\n .argument(\"<id>\", \"Item id\")\n .argument(\"[reason]\", \"Close reason text\")\n .option(\"--author <value>\", \"Mutation author\")\n .option(\"--message <value>\", \"History message\")\n .option(\"--validate-close <value>\", \"Close-time validation mode: off|warn|strict\")\n .option(\"--force\", \"Force ownership or terminal override when required\")\n .description(\"Lifecycle alias: close an item and release assignment metadata.\")\n .action(async (id: string, reason: string | undefined, options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const force = Boolean(options.force);\n const mutationOptions = {\n author: typeof options.author === \"string\" ? options.author : undefined,\n message: typeof options.message === \"string\" ? options.message : undefined,\n };\n const [{ runClose }, { runRelease }] = await Promise.all([\n import(\"./commands/close.js\"),\n import(\"./commands/claim.js\"),\n ]);\n const closeResult = await runClose(id, reason, {\n ...mutationOptions,\n validateClose: typeof options.validateClose === \"string\" ? options.validateClose : undefined,\n force,\n }, globalOptions);\n await invalidateSearchCachesForMutation(globalOptions, closeResult);\n const releaseResult = await runRelease(id, force, globalOptions, mutationOptions);\n await invalidateSearchCachesForMutation(globalOptions, releaseResult);\n printResult({ id, action: \"close_task\", close: closeResult, release: releaseResult }, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=close-task took_ms=${Date.now() - startedAt}`);\n }\n });\n\n registerSchedulingShortcutCommands(program);\n}\n\n/**\n * Optional string accessor for loosely-typed commander option bags.\n */\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * Common create-passthrough options shared by every scheduling shortcut.\n */\nfunction buildShortcutCommonOptions(options: Record<string, unknown>): {\n parent?: string;\n allowMissingParent?: boolean;\n tags?: string;\n priority?: string;\n body?: string;\n description?: string;\n author?: string;\n message?: string;\n} {\n return {\n parent: optionalString(options.parent),\n allowMissingParent: options.allowMissingParent === true ? true : undefined,\n tags: optionalString(options.tags),\n priority: optionalString(options.priority),\n body: optionalString(options.body),\n description: optionalString(options.description),\n author: optionalString(options.author),\n message: optionalString(options.message),\n };\n}\n\n/**\n * GH-217: register the `pm meet`/`pm event`/`pm remind` scheduling shortcuts.\n * Each is a thin friendly-flag wrapper over `runCreate` for an otherwise-unused\n * scheduling type.\n */\nfunction registerSchedulingShortcutCommands(program: Command): void {\n for (const { name, describe } of [\n { name: \"meet\", describe: \"Shortcut: create a Meeting with a start time and duration.\" },\n { name: \"event\", describe: \"Shortcut: create an Event with a start time and duration.\" },\n ] as const) {\n program\n .command(name)\n .argument(\"<title>\", \"Item title\")\n .option(\"--start <when>\", \"Start time (ISO, 'now', or relative like +1h/+2d); defaults to now\")\n .option(\"--duration <span>\", \"Duration from start (relative like 1h/2d); defaults to 1h when --end is omitted\")\n .option(\"--end <when>\", \"End time (ISO or relative); overrides --duration\")\n .option(\"--location <value>\", \"Location\")\n .option(\"--timezone <value>\", \"IANA timezone (for example America/New_York)\")\n .option(\"--all-day\", \"Mark as an all-day event\")\n .option(\"--parent <id>\", \"Parent item id\")\n .option(\"--allow-missing-parent\", \"Permit a parent id that does not exist yet\")\n .option(\"--tags <list>\", \"Comma-separated tags\")\n .option(\"--priority <value>\", \"Priority\")\n .option(\"--body <text>\", \"Body/markdown content\")\n .option(\"--description <text>\", \"Short description\")\n .option(\"--author <value>\", \"Mutation author\")\n .option(\"--message <value>\", \"History message\")\n .description(describe)\n .action(async (title: string, options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const { runMeet, runEvent } = await import(\"./commands/scheduling-shortcuts.js\");\n const run = name === \"meet\" ? runMeet : runEvent;\n const result = await run(\n title,\n {\n ...buildShortcutCommonOptions(options),\n start: optionalString(options.start),\n duration: optionalString(options.duration),\n end: optionalString(options.end),\n location: optionalString(options.location),\n timezone: optionalString(options.timezone),\n allDay: options.allDay === true ? true : undefined,\n },\n globalOptions,\n );\n await invalidateSearchCachesForMutation(globalOptions, result);\n printResult(result, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=${name} took_ms=${Date.now() - startedAt}`);\n }\n });\n }\n\n program\n .command(\"remind\")\n .argument(\"<title>\", \"Item title\")\n .option(\"--at <when>\", \"Reminder time (ISO, 'now', or relative like +2d); defaults to +1d\")\n .option(\"--text <value>\", \"Reminder text; defaults to the title\")\n .option(\"--parent <id>\", \"Parent item id\")\n .option(\"--allow-missing-parent\", \"Permit a parent id that does not exist yet\")\n .option(\"--tags <list>\", \"Comma-separated tags\")\n .option(\"--priority <value>\", \"Priority\")\n .option(\"--body <text>\", \"Body/markdown content\")\n .option(\"--description <text>\", \"Short description\")\n .option(\"--author <value>\", \"Mutation author\")\n .option(\"--message <value>\", \"History message\")\n .description(\"Shortcut: create a Reminder from a single point in time.\")\n .action(async (title: string, options: Record<string, unknown>, command) => {\n const globalOptions = getGlobalOptions(command);\n const startedAt = Date.now();\n const { runRemind } = await import(\"./commands/scheduling-shortcuts.js\");\n const result = await runRemind(\n title,\n {\n ...buildShortcutCommonOptions(options),\n at: optionalString(options.at),\n text: optionalString(options.text),\n },\n globalOptions,\n );\n await invalidateSearchCachesForMutation(globalOptions, result);\n printResult(result, globalOptions);\n if (globalOptions.profile) {\n printError(`profile:command=remind took_ms=${Date.now() - startedAt}`);\n }\n });\n}\n"],"names":["result"],"mappings":"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","debugId":"35b35397-fde2-5504-beb5-bfe36c2d5c9e"}
@@ -1,19 +0,0 @@
1
- import {
2
- _testOnlyRestoreCommand,
3
- runRestore
4
- } from "./chunk-X26ODPU4.js";
5
- import "./chunk-WW4E2DC3.js";
6
- import "./chunk-QTWWHFI3.js";
7
- import "./chunk-2RI3BDFK.js";
8
- import "./chunk-DYZKSIVX.js";
9
- import "./chunk-X7RKOJXL.js";
10
- import "./chunk-5NS6TJ2F.js";
11
- import "./chunk-QSH34DSQ.js";
12
- import "./chunk-SO2IOH37.js";
13
- import "./chunk-MTGMNUMJ.js";
14
- import "./chunk-5QLHQK7V.js";
15
- export {
16
- _testOnlyRestoreCommand,
17
- runRestore
18
- };
19
- //# sourceMappingURL=restore-PI3WM4GK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../../cli/commands/search.ts","../../../../../../../../core/extensions/runtime-registrations.ts","../../../../../../../../core/shared/text-normalization.ts","../../../../../../../../core/search/relevance.ts"],"sourcesContent":["/**\n * @module cli/commands/search\n *\n * Implements the pm search command surface and its agent-facing runtime behavior.\n */\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { coerceNumberInRange, toNonEmptyStringOrUndefined } from \"../../core/shared/primitives.js\";\nimport { isPathWithinDirectory } from \"../../core/fs/path-utils.js\";\nimport { getActiveExtensionRegistrations, runActiveOnReadHooks } from \"../../core/extensions/index.js\";\nimport { collectRegisteredItemFieldNames } from \"../../core/extensions/item-fields.js\";\nimport {\n resolveRegisteredSearchProvider,\n resolveRegisteredVectorStoreAdapter,\n} from \"../../core/extensions/runtime-registrations.js\";\nimport { resolveItemTypeRegistry, type ItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { parseLimit, parsePriority, parseType } from \"../shared-parsers.js\";\nimport {\n executeEmbeddingRequest,\n resolveEmbeddingProviders,\n type EmbeddingProviderConfig,\n type EmbeddingProviderResolution,\n} from \"../../core/search/providers.js\";\nimport {\n buildDeterministicQueryExpansions,\n mergeQueryExpansions,\n normalizeQueryExpansionOutput,\n normalizeRerankOutput,\n rerankCandidatesWithEmbeddings,\n resolveQueryExpansionConfig,\n resolveRerankConfig,\n type QueryExpansionConfig,\n type RerankCandidate,\n type RerankConfig,\n} from \"../../core/search/relevance.js\";\nimport { resolveSettingsWithSemanticRuntimeDefaults } from \"../../core/search/semantic-defaults.js\";\nimport {\n executeVectorQuery,\n resolveVectorStores,\n type VectorQueryHit,\n type VectorStoreConfig,\n type VectorStoreResolution,\n} from \"../../core/search/vector-stores.js\";\nimport { readVectorizationStatusLedger } from \"../../core/search/cache.js\";\nimport { buildEventCorpus, buildPlanFlatCorpus, buildReminderCorpus } from \"../../core/search/corpus.js\";\nimport { collectStaleVectorizationIds } from \"../../core/search/staleness.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { parseItemDocument } from \"../../core/item/item-format.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { isTerminalStatus } from \"../../core/item/status.js\";\nimport { parseStatusFilterCsv } from \"../../core/item/status-filter.js\";\nimport { collectRuntimeFilterValues, matchesRuntimeFilters } from \"../../core/schema/runtime-field-filters.js\";\nimport {\n hasMissingMetadataFilter,\n itemMatchesMissingMetadata,\n lifecycleClassifierFromStatusRegistry,\n type LifecycleClassifier,\n} from \"../../core/governance/metadata-coverage.js\";\nimport {\n hasContentFieldFilter,\n itemMatchesContentFilters,\n} from \"../../core/governance/content-fields.js\";\nimport {\n buildContentFilterEcho,\n buildGovernanceMissingFilterEcho,\n resolveContentFieldFilters,\n resolveMissingMetadataFilters,\n} from \"./list.js\";\nimport {\n resolveRuntimeFieldRegistry,\n resolveRuntimeStatusRegistry,\n type RuntimeFieldRegistry,\n type RuntimeStatusRegistry,\n} from \"../../core/schema/runtime-schema.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 { tokenizeAlphaNumeric } from \"../../core/shared/text-normalization.js\";\nimport { compareTimestampStrings, nowIso, resolveIsoOrRelative } from \"../../core/shared/time.js\";\nimport { listAllDocumentCandidatesCached } from \"../../core/store/front-matter-cache.js\";\nimport { listAllFrontMatter } from \"../../core/store/item-store.js\";\nimport { getItemPath, getSettingsPath, resolveGlobalPmRoot, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemDocument, ItemFormat, ItemFrontMatter, ItemStatus, ItemType, PmSettings } from \"../../types/index.js\";\n\n/**\n * Documents the search options payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchOptions {\n mode?: string;\n matchMode?: string;\n minScore?: string | number;\n count?: boolean;\n semanticWeight?: string | number;\n includeLinked?: boolean;\n titleExact?: boolean;\n phraseExact?: boolean;\n status?: string;\n type?: string;\n tag?: string;\n priority?: string;\n deadlineBefore?: string;\n deadlineAfter?: string;\n updatedAfter?: string;\n updatedBefore?: string;\n createdAfter?: string;\n createdBefore?: string;\n assignee?: string;\n sprint?: string;\n release?: string;\n parent?: string;\n limit?: string;\n compact?: boolean;\n full?: boolean;\n fields?: string;\n // GH-157: emit per-field matched-text snippets on each hit (off by default for\n // token efficiency). Highlighted spans are wrapped with the «…» markers.\n highlight?: boolean;\n // Governance-missing selection filters (GH-236).\n filterReviewerMissing?: boolean;\n filterRiskMissing?: boolean;\n filterConfidenceMissing?: boolean;\n filterSprintMissing?: boolean;\n filterReleaseMissing?: boolean;\n // Content-field presence/absence selection filters (GH-242).\n hasNotes?: boolean;\n hasLearnings?: boolean;\n hasFiles?: boolean;\n hasDocs?: boolean;\n hasTests?: boolean;\n hasComments?: boolean;\n hasDeps?: boolean;\n hasBody?: boolean;\n hasLinkedCommand?: boolean;\n noNotes?: boolean;\n noLearnings?: boolean;\n noFiles?: boolean;\n noDocs?: boolean;\n noTests?: boolean;\n noComments?: boolean;\n noDeps?: boolean;\n emptyBody?: boolean;\n noLinkedCommand?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Restricts search match mode values accepted by command, SDK, and storage contracts.\n */\nexport type SearchMatchMode = \"and\" | \"or\" | \"exact\";\n\ntype SearchMode = \"keyword\" | \"semantic\" | \"hybrid\";\ntype SearchProjectionMode = \"compact\" | \"full\" | \"fields\";\n\ninterface SearchProjectionConfig {\n mode: SearchProjectionMode;\n fields: string[];\n}\n\nconst DEFAULT_COMPACT_SEARCH_FIELDS = [\n \"id\",\n \"title\",\n \"status\",\n \"type\",\n \"priority\",\n \"updated_at\",\n \"score\",\n \"matched_fields\",\n] as const;\n\nconst SEARCH_HIT_FIELD_KEYS = new Set([\"score\", \"matched_fields\", \"highlights\"]);\nconst SEARCH_ITEM_FIELD_KEYS = new Set([\n \"id\",\n \"title\",\n \"description\",\n \"type\",\n \"status\",\n \"priority\",\n \"tags\",\n \"created_at\",\n \"updated_at\",\n \"deadline\",\n \"assignee\",\n \"author\",\n \"estimated_minutes\",\n \"acceptance_criteria\",\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"reminders\",\n \"events\",\n \"files\",\n \"tests\",\n \"docs\",\n \"close_reason\",\n \"parent\",\n \"reviewer\",\n \"risk\",\n \"confidence\",\n \"sprint\",\n \"release\",\n \"blocked_by\",\n \"blocked_reason\",\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 \"definition_of_ready\",\n \"order\",\n \"rank\",\n \"goal\",\n \"objective\",\n \"value\",\n \"impact\",\n \"outcome\",\n \"why_now\",\n \"plan\",\n]);\n\nconst LONG_QUERY_TOKEN_THRESHOLD = 2;\nconst LONG_QUERY_TITLE_EXACT_BONUS = 120;\nconst LONG_QUERY_PHRASE_MULTIPLIER = 6;\n// GH-181: in default (OR) match mode, multi-token queries that match EVERY\n// distinct query token in some searchable field get an additive ranking bonus so\n// items covering all terms outrank items matching only a subset. This is a\n// RANKING preference, not a hard filter (use --match-mode and for that).\nconst ALL_TERMS_COVERAGE_BONUS = 40;\nconst EXACT_ID_MATCH_SCORE = 1_000;\nconst SHORT_ID_MATCH_SCORE = 900;\nconst IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS = 8_000;\nconst IMPLICIT_HYBRID_VECTOR_TIMEOUT_MS = 8_000;\n\n// GH-157 matched-text highlighting (--highlight): markers wrapping each matching\n// token run, and the number of characters of surrounding context retained on\n// each side of the first match in a field. The «…» guillemets are single\n// characters with negligible collision risk against item text, keeping the\n// snippet token-cheap while staying visually unambiguous for agents.\nconst HIGHLIGHT_OPEN = \"«\";\nconst HIGHLIGHT_CLOSE = \"»\";\nconst HIGHLIGHT_SNIPPET_RADIUS = 60;\n\n// GH-157 inline query syntax: bare `field:value` tokens parsed out of the query\n// string and applied as the equivalent filter. The value may itself contain\n// colons (e.g. `tag:area:search`), so only the FIRST colon delimits field from\n// value. Explicit --field flags take precedence over an inline token (see\n// resolveInlineQueryFilters).\nconst INLINE_QUERY_FILTER_FIELDS = [\"tag\", \"status\", \"type\", \"priority\"] as const;\ntype InlineQueryFilterField = (typeof INLINE_QUERY_FILTER_FIELDS)[number];\n\n/**\n * Documents the search hit payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchHit {\n item: ItemFrontMatter;\n score: number;\n matched_fields: string[];\n // GH-181: whether every distinct query token matched some searchable field.\n // Used by --match-mode and (hard filter) and the default all-terms ranking\n // bonus. Not projected into output rows.\n matched_all_terms?: boolean;\n // GH-281: marks the keyword hit produced by the exact full-ID / short-ID\n // early-return in scoreDocument(). The semantic & hybrid ranking paths use it\n // to guarantee the exact-ID target ALWAYS ranks #1 (and is exempt from the\n // score threshold / limit), so the keyword-mode exact-ID guarantee is never\n // lost once vector blending is active. SHORT_ID matches keep score=900 and\n // full-ID matches keep score=1000, so sortHits still orders full above short.\n // Not projected into output rows.\n exact_id_match?: boolean;\n // GH-157: per-field matched-text snippets, populated only when the caller\n // passes --highlight. Each entry pairs a matched field name with a snippet of\n // its text where the matching token runs are wrapped in the «…» markers.\n highlights?: SearchHitHighlight[];\n}\n\n/**\n * Pairs a matched field name with a snippet of its text where every matching\n * token run is wrapped in the {@link HIGHLIGHT_OPEN}/{@link HIGHLIGHT_CLOSE}\n * markers. Emitted on {@link SearchHit.highlights} when `--highlight` is set.\n */\nexport interface SearchHitHighlight {\n field: string;\n snippet: string;\n}\n\n/**\n * Restricts search result item values accepted by command, SDK, and storage contracts.\n */\nexport type SearchResultItem = SearchHit | Record<string, unknown>;\n\ninterface SearchResultBase {\n query: string;\n mode: SearchMode;\n items: SearchResultItem[];\n count: number;\n // GH-181: total matched hits after filters/threshold but BEFORE the limit\n // truncation. Lets callers see how many matched before the (now-default)\n // keyword limit dropped rows. Only emitted when it differs from count.\n total?: number;\n // --count mode: count-only response carries the matched total and skips the\n // hit rows entirely (items is empty). `count` reflects the same total.\n count_only?: boolean;\n warnings?: string[];\n}\n\n/**\n * Documents the search compact result payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchCompactResult extends SearchResultBase {\n filters: Record<string, unknown>;\n projection?: undefined;\n now?: undefined;\n}\n\n/**\n * Documents the search verbose result payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchVerboseResult extends SearchResultBase {\n filters: Record<string, unknown>;\n projection: {\n mode: SearchProjectionMode;\n fields: string[] | null;\n };\n now: string;\n}\n\n/**\n * Restricts search result values accepted by command, SDK, and storage contracts.\n */\nexport type SearchResult = SearchCompactResult | SearchVerboseResult;\n\nfunction isNonEmptyRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && Object.keys(value).length > 0;\n}\n\nfunction buildCompactSearchFilterSummary(params: {\n mode: SearchMode;\n matchMode: SearchMatchMode;\n options: SearchOptions;\n includeLinked: boolean;\n titleExact: boolean;\n phraseExact: boolean;\n scoreThreshold: number;\n hybridSemanticWeight: number;\n runtimeFieldFilters?: Record<string, unknown>;\n}): Record<string, unknown> {\n const {\n mode,\n matchMode,\n options,\n includeLinked,\n titleExact,\n phraseExact,\n scoreThreshold,\n hybridSemanticWeight,\n runtimeFieldFilters,\n } = params;\n const filters: Record<string, unknown> = {};\n if (options.status !== undefined) {\n filters.status = options.status;\n }\n if (options.type !== undefined) {\n filters.type = options.type;\n }\n if (options.tag !== undefined) {\n filters.tag = options.tag;\n }\n if (options.priority !== undefined) {\n filters.priority = options.priority;\n }\n if (options.deadlineBefore !== undefined) {\n filters.deadline_before = options.deadlineBefore;\n }\n if (options.deadlineAfter !== undefined) {\n filters.deadline_after = options.deadlineAfter;\n }\n if (options.updatedAfter !== undefined) {\n filters.updated_after = options.updatedAfter;\n }\n if (options.updatedBefore !== undefined) {\n filters.updated_before = options.updatedBefore;\n }\n if (options.createdAfter !== undefined) {\n filters.created_after = options.createdAfter;\n }\n if (options.createdBefore !== undefined) {\n filters.created_before = options.createdBefore;\n }\n if (options.assignee !== undefined) {\n filters.assignee = options.assignee;\n }\n if (options.sprint !== undefined) {\n filters.sprint = options.sprint;\n }\n if (options.release !== undefined) {\n filters.release = options.release;\n }\n if (options.parent !== undefined) {\n filters.parent = options.parent;\n }\n Object.assign(filters, buildGovernanceMissingFilterEcho(options as Record<string, unknown>));\n Object.assign(filters, buildContentFilterEcho(options as Record<string, unknown>));\n if (matchMode !== \"or\") {\n filters.match_mode = matchMode;\n }\n if (includeLinked) {\n filters.include_linked = true;\n }\n if (titleExact) {\n filters.title_exact = true;\n }\n if (phraseExact) {\n filters.phrase_exact = true;\n }\n if (scoreThreshold > 0) {\n filters.score_threshold = scoreThreshold;\n }\n if (mode === \"hybrid\" && options.semanticWeight !== undefined) {\n filters.hybrid_semantic_weight = hybridSemanticWeight;\n }\n if (options.limit !== undefined) {\n filters.limit = options.limit;\n }\n if (isNonEmptyRecord(runtimeFieldFilters)) {\n filters.runtime_filters = runtimeFieldFilters;\n }\n return filters;\n}\n\n// Shared verbose (non-compact) filters echo. Keeps the count-only, empty-result,\n// and primary return paths emitting an identical filter shape (GH-181/pm-13nx).\nfunction buildVerboseSearchFilters(params: {\n effectiveMode: SearchMode;\n matchMode: SearchMatchMode;\n options: SearchOptions;\n includeLinked: boolean;\n titleExact: boolean;\n phraseExact: boolean;\n scoreThreshold: number;\n hybridSemanticWeight: number;\n queryExpansion: QueryExpansionConfig;\n rerank: RerankConfig;\n runtimeFieldFilters: Record<string, unknown>;\n}): Record<string, unknown> {\n const {\n effectiveMode,\n matchMode,\n options,\n includeLinked,\n titleExact,\n phraseExact,\n scoreThreshold,\n hybridSemanticWeight,\n queryExpansion,\n rerank,\n runtimeFieldFilters,\n } = params;\n return {\n mode: effectiveMode,\n match_mode: matchMode,\n status: options.status ?? null,\n type: options.type ?? null,\n tag: options.tag ?? null,\n priority: options.priority ?? null,\n deadline_before: options.deadlineBefore ?? null,\n deadline_after: options.deadlineAfter ?? null,\n updated_after: options.updatedAfter ?? null,\n updated_before: options.updatedBefore ?? null,\n created_after: options.createdAfter ?? null,\n created_before: options.createdBefore ?? null,\n assignee: options.assignee ?? null,\n sprint: options.sprint ?? null,\n release: options.release ?? null,\n parent: options.parent ?? null,\n ...buildGovernanceMissingFilterEcho(options as Record<string, unknown>),\n ...buildContentFilterEcho(options as Record<string, unknown>),\n include_linked: includeLinked,\n title_exact: titleExact,\n phrase_exact: phraseExact,\n score_threshold: scoreThreshold,\n hybrid_semantic_weight: effectiveMode === \"hybrid\" ? hybridSemanticWeight : null,\n query_expansion_enabled: queryExpansion.enabled,\n query_expansion_provider: queryExpansion.provider,\n rerank_enabled: rerank.enabled,\n rerank_model: rerank.model,\n rerank_top_k: rerank.top_k,\n limit: options.limit ?? null,\n runtime_filters: runtimeFieldFilters,\n };\n}\n\ninterface ExtensionSearchProviderContext {\n query: string;\n mode: SearchMode;\n tokens: string[];\n options: SearchOptions;\n settings: PmSettings;\n documents: ItemDocument[];\n}\n\ninterface ExtensionSearchProviderHit {\n id: string;\n score: number;\n matched_fields?: string[];\n}\n\ntype ExtensionSearchProviderQuery = (\n context: ExtensionSearchProviderContext,\n) => Promise<ExtensionSearchProviderHit[] | { hits?: ExtensionSearchProviderHit[] }> | ExtensionSearchProviderHit[] | { hits?: ExtensionSearchProviderHit[] };\n\ninterface ExtensionSearchProviderQueryExpansionContext {\n query: string;\n mode: Exclude<SearchMode, \"keyword\">;\n settings: PmSettings;\n}\n\ntype ExtensionSearchProviderQueryExpansion = (\n context: ExtensionSearchProviderQueryExpansionContext,\n) => Promise<string[] | { queries?: string[] }> | string[] | { queries?: string[] };\n\ninterface ExtensionSearchProviderRerankCandidate {\n id: string;\n text: string;\n score: number;\n}\n\ninterface ExtensionSearchProviderRerankContext {\n query: string;\n mode: \"hybrid\";\n model: string;\n top_k: number;\n settings: PmSettings;\n candidates: ExtensionSearchProviderRerankCandidate[];\n}\n\ntype ExtensionSearchProviderRerank = (\n context: ExtensionSearchProviderRerankContext,\n) => Promise<Array<{ id?: unknown; score?: unknown }> | { hits?: Array<{ id?: unknown; score?: unknown }> }>\n | Array<{ id?: unknown; score?: unknown }>\n | { hits?: Array<{ id?: unknown; score?: unknown }> };\n\ntype ExtensionVectorQuery = (\n context: {\n vector: number[];\n limit: number;\n settings: PmSettings;\n },\n) => Promise<VectorQueryHit[]> | VectorQueryHit[];\n\ntype ExtensionVectorAdapter = {\n query?: ExtensionVectorQuery;\n};\n\n\n\ninterface SearchModeContext {\n hasProvider: boolean;\n hasVectorStore: boolean;\n}\n\ntype ImplicitSemanticFallbackReason = \"timeout\" | \"connection\" | \"error\";\n\n/**\n * Aggregate the `code` strings found along an error's `cause` chain.\n *\n * undici (Node's fetch) collapses connection errors to the generic message\n * \"fetch failed\" and stashes the real syscall code (e.g. `ECONNREFUSED`) on\n * `error.cause.code`. Walking the chain (bounded depth) lets the fallback\n * classifier label a downed/unreachable Ollama backend as \"connection\" rather\n * than the catch-all \"error\".\n */\nexport function collectErrorCauseCodes(error: unknown): string {\n const codes: string[] = [];\n let current: unknown = error;\n for (let depth = 0; depth < 5 && current && typeof current === \"object\"; depth += 1) {\n const code = (current as { code?: unknown }).code;\n if (typeof code === \"string\") {\n codes.push(code.toLowerCase());\n }\n current = (current as { cause?: unknown }).cause;\n }\n return codes.join(\" \");\n}\n\n/**\n * Classify why an implicit/explicit semantic search degraded to keyword mode,\n * inspecting both the error message and the {@link collectErrorCauseCodes} chain\n * so undici's generic \"fetch failed\" is recognised as a connection failure.\n */\nexport function classifyImplicitSemanticFallbackReason(error: unknown): ImplicitSemanticFallbackReason {\n const message = (error instanceof Error ? error.message : String(error)).toLowerCase();\n const causeCodes = collectErrorCauseCodes(error);\n const haystack = `${message} ${causeCodes}`;\n if (haystack.includes(\"timed out\") || haystack.includes(\"timeout\") || haystack.includes(\"etimedout\")) {\n return \"timeout\";\n }\n if (\n haystack.includes(\"econnrefused\") ||\n haystack.includes(\"connection refused\") ||\n haystack.includes(\"connect \") ||\n haystack.includes(\"enotfound\") ||\n haystack.includes(\"eai_again\") ||\n haystack.includes(\"econnreset\") ||\n haystack.includes(\"fetch failed\")\n ) {\n return \"connection\";\n }\n return \"error\";\n}\n\nfunction buildImplicitSemanticFallbackWarning(error: unknown): string {\n const reason = classifyImplicitSemanticFallbackReason(error);\n if (reason === \"timeout\") {\n return \"search_implicit_semantic_fallback:timeout:using_keyword_mode\";\n }\n if (reason === \"connection\") {\n return \"search_implicit_semantic_fallback:connection:using_keyword_mode\";\n }\n return \"search_implicit_semantic_fallback:error:using_keyword_mode\";\n}\n\n// Explicit --semantic/--hybrid searches must never hard-fail an agent when the\n// embedding/vector backend is unreachable or unconfigured: degrade to keyword\n// search and surface a machine-readable warning instead of an unknown_error.\nfunction buildExplicitSemanticFallbackWarning(requestedMode: SearchMode, error: unknown): string {\n const reason = classifyImplicitSemanticFallbackReason(error);\n return `search_${requestedMode}_fallback:${reason}:using_keyword_mode`;\n}\n\n/**\n * Compare the vectorization-status ledger against the filtered corpus and, when\n * the vector index is behind, emit a one-line stderr warning plus a structured\n * `vector_index_stale:N` entry in the JSON warnings array. Best-effort: ledger\n * read failures fall through silently — the existing semantic/hybrid fallback\n * paths cover backend errors.\n */\nasync function maybeEmitVectorIndexStaleWarning(\n pmRoot: string,\n filteredDocuments: ItemDocument[],\n warnings: string[],\n): Promise<void> {\n try {\n const ledger = await readVectorizationStatusLedger(pmRoot);\n if (ledger.warnings.length > 0) {\n warnings.push(...ledger.warnings);\n }\n const staleIds = collectStaleVectorizationIds(\n filteredDocuments.map((document) => ({\n id: document.metadata.id,\n updated_at: document.metadata.updated_at,\n })),\n ledger.entries,\n );\n if (staleIds.length === 0) {\n return;\n }\n warnings.push(`vector_index_stale:${staleIds.length}`);\n /* c8 ignore start -- singular/plural warning text branches are cosmetic and validated in integration UX tests */\n process.stderr.write(\n `[pm] warning: ${staleIds.length} item${staleIds.length === 1 ? \" is\" : \"s are\"} new or modified since the last reindex and ${staleIds.length === 1 ? \"is\" : \"are\"} NOT in the semantic index yet — they will be missing from semantic/hybrid results until you run 'pm reindex --mode hybrid'. (Write-time embedding is governed by search.mutation_refresh_policy; staleness means the embed was skipped, failed, or the backend was unreachable.)\\n`,\n );\n /* c8 ignore stop */\n } catch {\n // Best-effort: missing/unreadable ledger is not a query-blocking concern.\n }\n}\n\nfunction parseMode(raw: string | undefined, _context: SearchModeContext): SearchMode {\n if (raw === undefined) {\n return \"keyword\";\n }\n const normalized = raw.trim().toLowerCase();\n if (normalized !== \"keyword\" && normalized !== \"semantic\" && normalized !== \"hybrid\") {\n throw new PmCliError(\"Search mode must be one of keyword|semantic|hybrid\", EXIT_CODE.USAGE);\n }\n return normalized;\n}\n\nfunction parseIncludeLinked(raw: boolean | undefined): boolean {\n return raw === true;\n}\n\nfunction parseTitleExact(raw: boolean | undefined): boolean {\n return raw === true;\n}\n\nfunction parsePhraseExact(raw: boolean | undefined): boolean {\n return raw === true;\n}\n\nfunction parseSemanticWeightOverride(raw: unknown): number | undefined {\n return coerceNumberInRange(raw, 0, 1) ?? undefined;\n}\n\nfunction parseMatchMode(raw: string | undefined): SearchMatchMode {\n if (raw === undefined) {\n return \"or\";\n }\n const normalized = raw.trim().toLowerCase();\n if (normalized !== \"and\" && normalized !== \"or\" && normalized !== \"exact\") {\n throw new PmCliError(\"Search --match-mode must be one of and|or|exact\", EXIT_CODE.USAGE);\n }\n return normalized;\n}\n\n// Per-query --min-score overrides the persistent search.score_threshold for this\n// query only. Accepts a finite number >= 0; anything else is a usage error.\nfunction parseMinScoreOverride(raw: unknown): number | undefined {\n if (raw === undefined || raw === null || raw === \"\") {\n return undefined;\n }\n /* c8 ignore start -- numeric-vs-string coercion branch is exercised via integration CLI parsing */\n const parsed = typeof raw === \"number\" ? raw : Number(String(raw).trim());\n /* c8 ignore stop */\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new PmCliError(\"Search --min-score must be a finite number >= 0\", EXIT_CODE.USAGE);\n }\n return parsed;\n}\n\n// updated/created date-window filters share the deadline ISO+relative resolver\n// so `pm search` matches `pm list` semantics exactly: pass an ISO timestamp or a\n// SIGNED relative offset (\"-2h\"/\"-7d\" reach into the past, \"+1d\" the future;\n// units h/d/w/m, m = months — there is no minutes unit).\nfunction parseTimestampWindow(raw: unknown, fieldLabel: string): string | undefined {\n if (raw == null) return undefined;\n const value = String(raw).trim();\n if (value.length === 0) return undefined;\n return resolveIsoOrRelative(value, new Date(), fieldLabel);\n}\n\nfunction normalizeSearchPhrase(value: string): string {\n return value\n .toLowerCase()\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction parseDeadline(raw: string | undefined, fieldLabel: string): string | undefined {\n if (raw === undefined) return undefined;\n return resolveIsoOrRelative(raw, new Date(), fieldLabel);\n}\n\nfunction parseFieldSelectors(raw: string | undefined): string[] | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const selectors = raw\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n if (selectors.length === 0) {\n throw new PmCliError(\"Search --fields requires a comma-separated list of field names\", EXIT_CODE.USAGE);\n }\n return [...new Set(selectors)];\n}\n\nfunction parseProjectionConfig(options: SearchOptions): SearchProjectionConfig {\n const compactRequested = options.compact === true;\n const fullRequested = options.full === true;\n const fieldSelectors = parseFieldSelectors(options.fields);\n const enabledModes = Number(compactRequested) + Number(fullRequested) + Number(fieldSelectors !== undefined);\n if (enabledModes > 1) {\n throw new PmCliError(\n \"Search projection options are mutually exclusive. Use one of --compact, --full, or --fields.\",\n EXIT_CODE.USAGE,\n );\n }\n if (compactRequested) {\n return {\n mode: \"compact\",\n fields: [...DEFAULT_COMPACT_SEARCH_FIELDS],\n };\n }\n if (fullRequested) {\n return {\n mode: \"full\",\n fields: [],\n };\n }\n if (fieldSelectors) {\n return {\n mode: \"fields\",\n fields: fieldSelectors,\n };\n }\n return {\n mode: \"full\",\n fields: [],\n };\n}\n\nexport const _testOnlySearchCommand = {\n applyFilters,\n applyExactQueryFilters,\n applyInlineQueryFilters,\n buildHitHighlights,\n buildVerboseSearchFilters,\n buildExplicitSemanticFallbackWarning,\n buildCompactSearchFilterSummary,\n buildHybridLexicalScore,\n buildImplicitSemanticFallbackWarning,\n buildRerankCorpus,\n buildSemanticHits,\n classifyImplicitSemanticFallbackReason,\n collectErrorCauseCodes,\n collectExactPhraseFields,\n collectLinkedPaths,\n combineHybridHits,\n computeSemanticOrHybridHits,\n countOccurrences,\n dependencyEntries,\n documentContainsExactPhrase,\n emptySearchResult,\n highlightFieldSnippet,\n loadDocuments,\n markTokenRuns,\n parseInlineQueryFilters,\n maybeEmitVectorIndexStaleWarning,\n loadLinkedCorpus,\n mergeVectorHitsById,\n normalizeExtensionProviderHits,\n normalizeScoreMap,\n parseProjectionConfig,\n parseTimestampWindow,\n parseTokens,\n readSearchFieldValue,\n requireSemanticDependencies,\n resolveExtensionSearchProvider,\n resolveExtensionSearchProviderByName,\n resolveExtensionVectorAdapter,\n resolveLinkedCorpusRoots,\n scoreDocument,\n sortHits,\n stringArray,\n textEntries,\n validateSearchProjectionFields,\n};\n\n/* c8 ignore start -- projection/runtime-field validation edge permutations are covered by integration query-contract tests */\nfunction validateSearchProjectionFields(projection: SearchProjectionConfig, runtimeFieldRegistry: RuntimeFieldRegistry): void {\n if (projection.mode !== \"fields\") {\n return;\n }\n const runtimeKeys = new Set(runtimeFieldRegistry.definitions.flatMap((field) => [field.key, field.metadata_key]));\n const unknown = projection.fields.filter((field) => {\n const normalized = field.trim();\n const itemKey = normalized.startsWith(\"item.\") ? normalized.slice(\"item.\".length) : normalized;\n return !SEARCH_HIT_FIELD_KEYS.has(normalized) && !SEARCH_ITEM_FIELD_KEYS.has(itemKey) && !runtimeKeys.has(itemKey);\n });\n if (unknown.length > 0) {\n throw new PmCliError(`Unknown search --fields value(s): ${unknown.join(\", \")}`, EXIT_CODE.USAGE, {\n examples: [\n \"pm search <query> --fields id,title,status,score\",\n \"pm search <query> --fields id,title,item.description,matched_fields\",\n ],\n nextSteps: [\"Use item.<field> for explicit item metadata fields, or run pm search --help for projection examples.\"],\n });\n }\n}\n/* c8 ignore stop */\n\nfunction parseTokens(query: string): string[] {\n const normalized = normalizeSearchPhrase(query);\n if (!normalized) {\n throw new PmCliError(\"Search query must not be empty\", EXIT_CODE.USAGE);\n }\n return normalized.split(/\\s+/).filter(Boolean);\n}\n\n/**\n * Result of extracting inline `field:value` tokens from a raw search query.\n */\ninterface InlineQueryParse {\n /** The query with all recognized inline filter tokens removed. */\n residualQuery: string;\n /** Recognized inline filters keyed by field name; first occurrence per field wins. */\n inlineFilters: Partial<Record<InlineQueryFilterField, string>>;\n}\n\n/**\n * Split a raw search query into its residual keyword text and any inline\n * `field:value` filter tokens (GH-157). Recognized fields are\n * {@link INLINE_QUERY_FILTER_FIELDS}; the value runs to the end of the token so\n * colon-bearing values like `tag:area:search` parse as `{ tag: \"area:search\" }`.\n * Only the first occurrence of each field is captured — later duplicates are left\n * in the residual query so they are never silently dropped. Tokens whose prefix\n * is not a recognized field (`foo:bar`) stay in the residual query verbatim.\n */\nfunction parseInlineQueryFilters(query: string): InlineQueryParse {\n const inlineFilters: Partial<Record<InlineQueryFilterField, string>> = {};\n const residualTokens: string[] = [];\n for (const token of query.split(/\\s+/).filter((entry) => entry.length > 0)) {\n const separatorIndex = token.indexOf(\":\");\n const field = separatorIndex > 0 ? token.slice(0, separatorIndex).toLowerCase() : \"\";\n const value = separatorIndex > 0 ? token.slice(separatorIndex + 1) : \"\";\n const matchedField = (INLINE_QUERY_FILTER_FIELDS as ReadonlyArray<string>).includes(field)\n ? (field as InlineQueryFilterField)\n : undefined;\n if (matchedField && value.length > 0 && inlineFilters[matchedField] === undefined) {\n inlineFilters[matchedField] = value;\n continue;\n }\n residualTokens.push(token);\n }\n return {\n residualQuery: residualTokens.join(\" \"),\n inlineFilters,\n };\n}\n\n/**\n * Merge inline `field:value` filters into a search options object (GH-157).\n * Explicit `--field` flags always win: an inline token is applied only when the\n * corresponding option is not already set, and a conflicting inline token is\n * recorded as a `search_inline_filter_ignored:<field>:flag_takes_precedence`\n * warning so the override is observable rather than silent. Returns a fresh\n * options object — the caller's input is never mutated.\n */\nfunction applyInlineQueryFilters(\n options: SearchOptions,\n inlineFilters: Partial<Record<InlineQueryFilterField, string>>,\n warnings: string[],\n): SearchOptions {\n const merged: SearchOptions = { ...options };\n for (const field of INLINE_QUERY_FILTER_FIELDS) {\n const inlineValue = inlineFilters[field];\n if (inlineValue === undefined) {\n continue;\n }\n if (toNonEmptyStringOrUndefined(merged[field]) !== undefined) {\n warnings.push(`search_inline_filter_ignored:${field}:flag_takes_precedence`);\n continue;\n }\n merged[field] = inlineValue;\n }\n return merged;\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === \"string\") : [];\n}\n\nfunction textEntries(value: unknown): Array<{ text: string }> {\n return Array.isArray(value)\n ? value.filter((entry): entry is { text: string } =>\n typeof entry === \"object\" && entry !== null && typeof (entry as { text?: unknown }).text === \"string\",\n )\n : [];\n}\n\nfunction dependencyEntries(value: unknown): Array<{ id: string; kind: string }> {\n return Array.isArray(value)\n ? value.filter((entry): entry is { id: string; kind: string } =>\n typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as { id?: unknown }).id === \"string\" &&\n typeof (entry as { kind?: unknown }).kind === \"string\",\n )\n : [];\n}\n\nfunction collectExactPhraseFields(document: ItemDocument): string[] {\n const item = document.metadata;\n return [\n item.title,\n item.description,\n item.status,\n stringArray(item.tags).join(\" \"),\n document.body,\n textEntries(item.comments).map((entry) => entry.text).join(\" \"),\n textEntries(item.notes).map((entry) => entry.text).join(\" \"),\n textEntries(item.learnings).map((entry) => entry.text).join(\" \"),\n buildReminderCorpus(item).join(\" \"),\n buildEventCorpus(item).join(\" \"),\n dependencyEntries(item.dependencies).map((entry) => `${entry.id} ${entry.kind}`).join(\" \"),\n buildPlanFlatCorpus(item),\n ];\n}\n\nfunction documentContainsExactPhrase(document: ItemDocument, normalizedQuery: string): boolean {\n return collectExactPhraseFields(document).some((fieldValue) =>\n normalizeSearchPhrase(fieldValue).includes(normalizedQuery),\n );\n}\n\nfunction applyExactQueryFilters(\n items: ItemDocument[],\n normalizedQuery: string,\n options: { titleExact: boolean; phraseExact: boolean },\n): ItemDocument[] {\n if (!options.titleExact && !options.phraseExact) {\n return items;\n }\n return items.filter((document) => {\n if (options.titleExact && normalizeSearchPhrase(document.metadata.title) !== normalizedQuery) {\n return false;\n }\n if (options.phraseExact && !documentContainsExactPhrase(document, normalizedQuery)) {\n return false;\n }\n return true;\n });\n}\n\nfunction applyFilters(\n items: ItemDocument[],\n options: SearchOptions,\n typeRegistry: ItemTypeRegistry,\n runtimeFieldFilters: Record<string, unknown>,\n statusFilter: ItemStatus[] | undefined,\n lifecycleClassifier: LifecycleClassifier,\n): ItemDocument[] {\n const typeFilter = parseType(options.type, typeRegistry);\n const tagFilter = options.tag?.trim().toLowerCase();\n const priorityFilter = parsePriority(options.priority);\n const deadlineBefore = parseDeadline(options.deadlineBefore, \"deadline-before\");\n const deadlineAfter = parseDeadline(options.deadlineAfter, \"deadline-after\");\n const updatedAfter = parseTimestampWindow(options.updatedAfter, \"updated-after\");\n const updatedBefore = parseTimestampWindow(options.updatedBefore, \"updated-before\");\n const createdAfter = parseTimestampWindow(options.createdAfter, \"created-after\");\n const createdBefore = parseTimestampWindow(options.createdBefore, \"created-before\");\n const assigneeFilter = options.assignee?.trim();\n const sprintFilter = options.sprint?.trim();\n const releaseFilter = options.release?.trim();\n const parentFilter = options.parent?.trim();\n const statusSet = statusFilter && statusFilter.length > 0 ? new Set<ItemStatus>(statusFilter) : undefined;\n const missingMetadataFilters = resolveMissingMetadataFilters(options);\n const missingMetadataActive = hasMissingMetadataFilter(missingMetadataFilters);\n const contentFieldFilters = resolveContentFieldFilters(options as Record<string, unknown>);\n const contentFiltersActive = hasContentFieldFilter(contentFieldFilters);\n\n // Match pm list: --assignee no longer accepts none/null (unassigned filtering\n // belongs to a dedicated flag there; pm search has no presence flag so reject\n // the sentinel values explicitly rather than silently matching a literal).\n if (assigneeFilter && (assigneeFilter.toLowerCase() === \"none\" || assigneeFilter.toLowerCase() === \"null\")) {\n throw new PmCliError('--assignee no longer accepts \"none\" or \"null\".', EXIT_CODE.USAGE);\n }\n\n return items.filter((document) => {\n const item = document.metadata;\n if (statusSet && !statusSet.has(item.status)) return false;\n if (typeFilter && item.type !== typeFilter) return false;\n if (tagFilter && !stringArray(item.tags).includes(tagFilter)) return false;\n if (priorityFilter !== undefined && item.priority !== priorityFilter) return false;\n if (deadlineBefore && (!item.deadline || compareTimestampStrings(item.deadline, deadlineBefore) > 0)) return false;\n if (deadlineAfter && (!item.deadline || compareTimestampStrings(item.deadline, deadlineAfter) < 0)) return false;\n if (updatedAfter && compareTimestampStrings(item.updated_at, updatedAfter) < 0) return false;\n if (updatedBefore && compareTimestampStrings(item.updated_at, updatedBefore) > 0) return false;\n if (createdAfter && compareTimestampStrings(item.created_at, createdAfter) < 0) return false;\n if (createdBefore && compareTimestampStrings(item.created_at, createdBefore) > 0) return false;\n if (assigneeFilter !== undefined && item.assignee !== assigneeFilter) return false;\n if (sprintFilter !== undefined && item.sprint !== sprintFilter) return false;\n /* c8 ignore start -- release/parent metadata filter combinations are covered by integration search fixtures */\n if (releaseFilter !== undefined && item.release !== releaseFilter) return false;\n if (parentFilter !== undefined && item.parent !== parentFilter) return false;\n /* c8 ignore stop */\n if (!matchesRuntimeFilters(item as Record<string, unknown>, runtimeFieldFilters)) return false;\n if (missingMetadataActive && !itemMatchesMissingMetadata(item, missingMetadataFilters, lifecycleClassifier)) {\n return false;\n }\n if (contentFiltersActive && !itemMatchesContentFilters(item, contentFieldFilters)) {\n return false;\n }\n return true;\n });\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n let count = 0;\n let index = 0;\n while (true) {\n const foundAt = haystack.indexOf(needle, index);\n if (foundAt < 0) {\n return count;\n }\n count += 1;\n index = foundAt + needle.length;\n }\n}\n\nfunction tokenizeForExactTokenMatch(value: string): string[] {\n return tokenizeAlphaNumeric(value);\n}\n\nfunction collectLinkedPaths(item: ItemFrontMatter): Array<{ scope: \"project\" | \"global\"; path: string }> {\n const fromFiles = (item.files ?? []).map((entry) => ({\n scope: entry.scope,\n path: entry.path.trim(),\n }));\n const fromDocs = (item.docs ?? []).map((entry) => ({\n scope: entry.scope,\n path: entry.path.trim(),\n }));\n const fromTests = (item.tests ?? [])\n .filter((entry): entry is typeof entry & { path: string } => typeof entry.path === \"string\" && entry.path.trim().length > 0)\n .map((entry) => ({\n scope: entry.scope,\n path: entry.path.trim(),\n }));\n const sorted = [...fromFiles, ...fromDocs, ...fromTests]\n .filter((entry) => entry.path.length > 0)\n .sort((a, b) => a.scope.localeCompare(b.scope) || a.path.localeCompare(b.path));\n const deduped = new Map<string, { scope: \"project\" | \"global\"; path: string }>();\n for (const entry of sorted) {\n deduped.set(`${entry.scope}:${entry.path}`, entry);\n }\n return [...deduped.values()];\n}\n\ninterface ContainmentRoot {\n resolved: string;\n realpath: string;\n}\n\ninterface LinkedCorpusRoots {\n projectContainmentRoot: ContainmentRoot | null;\n globalContainmentRoot: ContainmentRoot | null;\n}\n\nasync function resolveContainmentRoot(root: string): Promise<ContainmentRoot | null> {\n const resolved = path.resolve(root);\n try {\n const realpathRoot = await fs.realpath(resolved);\n return {\n resolved,\n realpath: realpathRoot,\n };\n } catch {\n return null;\n }\n}\n\nasync function resolveLinkedCorpusRoots(projectRoot: string, globalRoot: string): Promise<LinkedCorpusRoots> {\n const [projectContainmentRoot, globalContainmentRoot] = await Promise.all([\n resolveContainmentRoot(projectRoot),\n resolveContainmentRoot(globalRoot),\n ]);\n return {\n projectContainmentRoot,\n globalContainmentRoot,\n };\n}\n\nasync function loadLinkedCorpus(\n document: ItemDocument,\n roots: LinkedCorpusRoots,\n): Promise<string> {\n const linkedPaths = collectLinkedPaths(document.metadata);\n const chunks: string[] = [];\n for (const linkedPath of linkedPaths) {\n const containmentRoot = linkedPath.scope === \"global\" ? roots.globalContainmentRoot : roots.projectContainmentRoot;\n if (!containmentRoot) {\n continue;\n }\n const resolved = path.resolve(containmentRoot.resolved, linkedPath.path);\n if (!isPathWithinDirectory(containmentRoot.resolved, resolved)) {\n continue;\n }\n let linkedRealpath: string;\n try {\n linkedRealpath = await fs.realpath(resolved);\n } catch {\n continue;\n }\n if (!isPathWithinDirectory(containmentRoot.realpath, linkedRealpath)) {\n continue;\n }\n try {\n await runActiveOnReadHooks({\n path: resolved,\n scope: linkedPath.scope,\n });\n chunks.push(await fs.readFile(resolved, \"utf8\"));\n } catch {\n // Best-effort linked-content indexing: unreadable paths are ignored.\n }\n }\n return chunks.join(\"\\n\");\n}\n\n/**\n * Documents the search tuning payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchTuning {\n title_exact_bonus: number;\n title_weight: number;\n description_weight: number;\n tags_weight: number;\n status_weight: number;\n body_weight: number;\n comments_weight: number;\n notes_weight: number;\n learnings_weight: number;\n reminders_weight: number;\n events_weight: number;\n dependencies_weight: number;\n linked_content_weight: number;\n}\n\n/**\n * Canonical definition of the document-derived searchable fields shared by the\n * lexical scorer ({@link scoreDocument}) and the matched-text highlighter\n * ({@link buildHitHighlights}). Keeping a single source of field name → text\n * extractor → tuning weight guarantees the highlighter can only ever produce\n * snippets for fields the scorer actually inspected. The `linked_content` field\n * is appended separately by the scorer because its text is supplied per-query\n * rather than derived from the document.\n */\nconst SEARCHABLE_FIELD_BUILDERS: ReadonlyArray<{\n name: string;\n weightKey: keyof SearchTuning;\n value: (document: ItemDocument) => string;\n}> = [\n { name: \"title\", weightKey: \"title_weight\", value: (document) => document.metadata.title },\n { name: \"description\", weightKey: \"description_weight\", value: (document) => document.metadata.description },\n { name: \"tags\", weightKey: \"tags_weight\", value: (document) => stringArray(document.metadata.tags).join(\" \") },\n {\n name: \"status\",\n weightKey: \"status_weight\",\n value: (document) => (typeof document.metadata.status === \"string\" ? document.metadata.status : \"\"),\n },\n { name: \"body\", weightKey: \"body_weight\", value: (document) => document.body },\n {\n name: \"comments\",\n weightKey: \"comments_weight\",\n value: (document) => textEntries(document.metadata.comments).map((entry) => entry.text).join(\" \"),\n },\n {\n name: \"notes\",\n weightKey: \"notes_weight\",\n value: (document) => textEntries(document.metadata.notes).map((entry) => entry.text).join(\" \"),\n },\n {\n name: \"learnings\",\n weightKey: \"learnings_weight\",\n value: (document) => textEntries(document.metadata.learnings).map((entry) => entry.text).join(\" \"),\n },\n { name: \"reminders\", weightKey: \"reminders_weight\", value: (document) => buildReminderCorpus(document.metadata).join(\" \") },\n { name: \"events\", weightKey: \"events_weight\", value: (document) => buildEventCorpus(document.metadata).join(\" \") },\n {\n name: \"dependencies\",\n weightKey: \"dependencies_weight\",\n value: (document) => dependencyEntries(document.metadata.dependencies).map((entry) => `${entry.id} ${entry.kind}`).join(\" \"),\n },\n { name: \"plan\", weightKey: \"body_weight\", value: (document) => buildPlanFlatCorpus(document.metadata) },\n];\n\n// Name → builder index so the highlighter can resolve a matched field to its\n// text extractor in O(1) and evaluate ONLY the matched fields' values, instead\n// of materializing all twelve (several of which join/build corpora) per hit.\nconst SEARCHABLE_FIELD_BUILDER_BY_NAME = new Map(SEARCHABLE_FIELD_BUILDERS.map((builder) => [builder.name, builder]));\n\nfunction escapeRegExpLiteral(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Wrap every case-insensitive occurrence of any query token in `text` with the\n * {@link HIGHLIGHT_OPEN}/{@link HIGHLIGHT_CLOSE} markers. Token boundaries follow\n * the same substring semantics as the lexical scorer (a token highlights inside\n * longer words, matching how it scored), and overlapping matches are coalesced\n * by the single combined alternation so markers never nest.\n */\nfunction markTokenRuns(text: string, tokens: string[]): string {\n // Sort by length descending before building the alternation so a longer token\n // wins over a shorter token that is its prefix (regex alternation is greedy\n // left-to-right, so `auth|authority` would mark «auth»ority instead of\n // «authority»). `.filter` already returns a fresh array, so the in-place sort\n // never mutates the caller's token list.\n const escaped = tokens\n .filter((token) => token.length > 0)\n .sort((left, right) => right.length - left.length)\n .map(escapeRegExpLiteral);\n if (escaped.length === 0) {\n return text;\n }\n const pattern = new RegExp(escaped.join(\"|\"), \"gi\");\n return text.replace(pattern, (match) => `${HIGHLIGHT_OPEN}${match}${HIGHLIGHT_CLOSE}`);\n}\n\n/**\n * Build a single highlighted snippet for one field value (GH-157), or null when\n * no token matches. The snippet is a window of {@link HIGHLIGHT_SNIPPET_RADIUS}\n * characters on each side of the first match with the matching token runs\n * wrapped in markers, prefixed/suffixed with an ellipsis when the field text was\n * trimmed. Returning null lets the caller skip fields with no concrete textual\n * match (e.g. a field flagged purely by the phrase-coverage bonus).\n */\nfunction highlightFieldSnippet(text: string, tokens: string[]): string | null {\n if (text.length === 0) {\n return null;\n }\n const lowerText = text.toLowerCase();\n let firstMatchIndex = -1;\n for (const token of tokens) {\n if (token.length === 0) {\n continue;\n }\n const index = lowerText.indexOf(token);\n if (index >= 0 && (firstMatchIndex < 0 || index < firstMatchIndex)) {\n firstMatchIndex = index;\n }\n }\n if (firstMatchIndex < 0) {\n return null;\n }\n const windowStart = Math.max(0, firstMatchIndex - HIGHLIGHT_SNIPPET_RADIUS);\n const windowEnd = Math.min(text.length, firstMatchIndex + HIGHLIGHT_SNIPPET_RADIUS);\n const marked = markTokenRuns(text.slice(windowStart, windowEnd), tokens);\n const prefix = windowStart > 0 ? \"…\" : \"\";\n const suffix = windowEnd < text.length ? \"…\" : \"\";\n return `${prefix}${marked}${suffix}`;\n}\n\n/**\n * Produce per-field matched-text snippets for a hit (GH-157, `--highlight`).\n * Iterates the hit's already-sorted `matched_fields`, retains only the\n * document-derived searchable fields (skipping synthetic markers like `id`,\n * `semantic`, `rerank`, and `linked_content`), and emits a snippet for each\n * field that still contains a concrete token match.\n */\nfunction buildHitHighlights(document: ItemDocument, matchedFields: string[], tokens: string[]): SearchHitHighlight[] {\n const highlights: SearchHitHighlight[] = [];\n for (const field of matchedFields) {\n const builder = SEARCHABLE_FIELD_BUILDER_BY_NAME.get(field);\n if (builder === undefined) {\n continue;\n }\n const snippet = highlightFieldSnippet(builder.value(document), tokens);\n if (snippet !== null) {\n highlights.push({ field, snippet });\n }\n }\n return highlights;\n}\n\nfunction scoreDocument(\n document: ItemDocument,\n tokens: string[],\n normalizedQuery: string,\n linkedCorpus: string,\n tuning: SearchTuning,\n idPrefix: string,\n applyCoverageBonus = false,\n): SearchHit | null {\n const item = document.metadata;\n const normalizedId = item.id.trim().toLowerCase();\n const normalizedIdPrefix = typeof idPrefix === \"string\" ? idPrefix.trim().toLowerCase() : \"\";\n const normalizedShortId =\n normalizedIdPrefix.length > 0 && normalizedId.startsWith(normalizedIdPrefix)\n ? normalizedId.slice(normalizedIdPrefix.length)\n : normalizedId;\n if (normalizedQuery === normalizedId || normalizedQuery === normalizedShortId) {\n return {\n item,\n score: normalizedQuery === normalizedId ? EXACT_ID_MATCH_SCORE : SHORT_ID_MATCH_SCORE,\n matched_fields: [\"id\"],\n matched_all_terms: true,\n exact_id_match: true,\n };\n }\n const titleTokenCounts = new Map<string, number>();\n for (const token of tokenizeForExactTokenMatch(item.title)) {\n titleTokenCounts.set(token, (titleTokenCounts.get(token) ?? 0) + 1);\n }\n const searchableFields: Array<{ name: string; value: string; weight: number }> = [\n ...SEARCHABLE_FIELD_BUILDERS.map((builder) => ({\n name: builder.name,\n value: builder.value(document),\n weight: tuning[builder.weightKey],\n })),\n { name: \"linked_content\", value: linkedCorpus, weight: tuning.linked_content_weight },\n ];\n\n let score = 0;\n const matched = new Set<string>();\n const matchedTokens = new Set<string>();\n for (const token of tokens) {\n const exactTitleMatches = titleTokenCounts.get(token) ?? 0;\n if (exactTitleMatches > 0) {\n score += exactTitleMatches * tuning.title_exact_bonus;\n matched.add(\"title\");\n matchedTokens.add(token);\n }\n for (const field of searchableFields) {\n const fieldValue = field.value.toLowerCase();\n const occurrences = countOccurrences(fieldValue, token);\n if (occurrences > 0) {\n score += occurrences * field.weight;\n matched.add(field.name);\n matchedTokens.add(token);\n }\n }\n }\n const distinctTokens = new Set(tokens);\n // matchedTokens only ever holds entries drawn from `tokens`, so it is always a\n // subset of distinctTokens — exact size equality means every distinct term matched.\n const matchedAllTerms = distinctTokens.size > 0 && matchedTokens.size === distinctTokens.size;\n // GH-181 default-mode all-terms ranking bonus: only meaningful for multi-token\n // queries where every distinct token matched somewhere.\n if (applyCoverageBonus && distinctTokens.size > 1 && matchedAllTerms) {\n score += ALL_TERMS_COVERAGE_BONUS;\n }\n\n const isLongPhraseQuery = tokens.length >= LONG_QUERY_TOKEN_THRESHOLD && normalizedQuery.includes(\" \");\n if (isLongPhraseQuery) {\n const normalizedTitle = normalizeSearchPhrase(item.title);\n if (normalizedTitle === normalizedQuery) {\n score += LONG_QUERY_TITLE_EXACT_BONUS;\n matched.add(\"title\");\n }\n for (const field of searchableFields) {\n const normalizedField = normalizeSearchPhrase(field.value);\n const phraseOccurrences = countOccurrences(normalizedField, normalizedQuery);\n if (phraseOccurrences > 0) {\n score += phraseOccurrences * field.weight * LONG_QUERY_PHRASE_MULTIPLIER;\n matched.add(field.name);\n }\n }\n }\n\n if (score <= 0) {\n return null;\n }\n\n return {\n item,\n score,\n matched_fields: [...matched].sort((a, b) => a.localeCompare(b)),\n matched_all_terms: matchedAllTerms,\n };\n}\n\nfunction sortHits(items: SearchHit[], statusRegistry: RuntimeStatusRegistry): SearchHit[] {\n return [...items].sort((a, b) => {\n const byScore = b.score - a.score;\n if (byScore !== 0) return byScore;\n const aTerminal = isTerminalStatus(a.item.status, statusRegistry);\n const bTerminal = isTerminalStatus(b.item.status, statusRegistry);\n if (aTerminal !== bTerminal) {\n return aTerminal ? 1 : -1;\n }\n const byPriority = a.item.priority - b.item.priority;\n if (byPriority !== 0) return byPriority;\n const byUpdated = compareTimestampStrings(b.item.updated_at, a.item.updated_at);\n if (byUpdated !== 0) return byUpdated;\n return a.item.id.localeCompare(b.item.id);\n });\n}\n\nfunction buildHybridLexicalScore(\n document: ItemDocument,\n tokens: string[],\n normalizedQuery: string,\n includeLinked: boolean,\n linkedCorpusById: Map<string, string>,\n tuning: SearchTuning,\n idPrefix: string,\n applyCoverageBonus = false,\n): SearchHit | null {\n /* c8 ignore start -- linked corpus presence branch is covered by keyword/hybrid integration query tests */\n return scoreDocument(\n document,\n tokens,\n normalizedQuery,\n includeLinked ? linkedCorpusById.get(document.metadata.id) ?? \"\" : \"\",\n tuning,\n idPrefix,\n applyCoverageBonus,\n );\n /* c8 ignore stop */\n}\n\nfunction normalizeScoreMap(scoreById: Map<string, number>): Map<string, number> {\n if (scoreById.size === 0) {\n return new Map();\n }\n const values = [...scoreById.values()];\n const minScore = Math.min(...values);\n const maxScore = Math.max(...values);\n if (maxScore === minScore) {\n return new Map([...scoreById.keys()].map((id) => [id, 1]));\n }\n const normalized = new Map<string, number>();\n for (const [id, score] of scoreById) {\n normalized.set(id, (score - minScore) / (maxScore - minScore));\n }\n return normalized;\n}\n\n/**\n * Implements resolve search max results for the public runtime surface of this module.\n */\nexport function resolveSearchMaxResults(settings: unknown): number {\n const candidate = (settings as { search?: { max_results?: unknown } }).search?.max_results;\n if (typeof candidate === \"number\" && Number.isFinite(candidate) && candidate > 0) {\n return Math.floor(candidate);\n }\n return 50;\n}\n\n/**\n * Implements resolve search score threshold for the public runtime surface of this module.\n */\nexport function resolveSearchScoreThreshold(settings: unknown): number {\n const candidate = (settings as { search?: { score_threshold?: unknown } }).search?.score_threshold;\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n return 0;\n}\n\n/**\n * Implements resolve hybrid semantic weight for the public runtime surface of this module.\n */\nexport function resolveHybridSemanticWeight(settings: unknown): number {\n const candidate = (settings as { search?: { hybrid_semantic_weight?: unknown } }).search?.hybrid_semantic_weight;\n if (typeof candidate === \"number\" && Number.isFinite(candidate) && candidate >= 0 && candidate <= 1) {\n return candidate;\n }\n return 0.7;\n}\n\n/**\n * Implements resolve search tuning for the public runtime surface of this module.\n */\nexport function resolveSearchTuning(settings: unknown): SearchTuning {\n const defaults: SearchTuning = {\n title_exact_bonus: 10,\n title_weight: 8,\n description_weight: 5,\n tags_weight: 6,\n status_weight: 2,\n body_weight: 1,\n comments_weight: 1,\n notes_weight: 1,\n learnings_weight: 1,\n reminders_weight: 2,\n events_weight: 2,\n dependencies_weight: 3,\n linked_content_weight: 1,\n };\n const tuning = (settings as { search?: { tuning?: Partial<SearchTuning> } }).search?.tuning;\n if (!tuning) return defaults;\n\n const resolveWeight = (candidate: unknown, fallback: number) => {\n if (typeof candidate === \"number\" && Number.isFinite(candidate) && candidate >= 0) {\n return candidate;\n }\n return fallback;\n };\n\n return {\n title_exact_bonus: resolveWeight(tuning.title_exact_bonus, defaults.title_exact_bonus),\n title_weight: resolveWeight(tuning.title_weight, defaults.title_weight),\n description_weight: resolveWeight(tuning.description_weight, defaults.description_weight),\n tags_weight: resolveWeight(tuning.tags_weight, defaults.tags_weight),\n status_weight: resolveWeight(tuning.status_weight, defaults.status_weight),\n body_weight: resolveWeight(tuning.body_weight, defaults.body_weight),\n comments_weight: resolveWeight(tuning.comments_weight, defaults.comments_weight),\n notes_weight: resolveWeight(tuning.notes_weight, defaults.notes_weight),\n learnings_weight: resolveWeight(tuning.learnings_weight, defaults.learnings_weight),\n reminders_weight: resolveWeight(tuning.reminders_weight, defaults.reminders_weight),\n events_weight: resolveWeight(tuning.events_weight, defaults.events_weight),\n dependencies_weight: resolveWeight(tuning.dependencies_weight, defaults.dependencies_weight),\n linked_content_weight: resolveWeight(tuning.linked_content_weight, defaults.linked_content_weight),\n };\n}\n\n/* c8 ignore start -- empty-result projection/count/warnings shape matrix is validated by integration response-contract tests */\nfunction emptySearchResult(\n query: string,\n mode: SearchMode,\n matchMode: SearchMatchMode,\n options: SearchOptions,\n includeLinked: boolean,\n scoreThreshold: number,\n hybridSemanticWeight: number,\n queryExpansion: QueryExpansionConfig,\n rerank: RerankConfig,\n projection: SearchProjectionConfig,\n warnings: string[],\n runtimeFieldFilters?: Record<string, unknown>,\n countOnly = false,\n): SearchResult {\n // --count consistency: a count-only query that matches nothing must still\n // carry the same { count_only: true, total } shape as the non-empty path.\n const countExtras = countOnly ? { total: 0, count_only: true } : {};\n const compactSummaryMode = projection.mode === \"compact\" && options.compact === true;\n if (compactSummaryMode) {\n const compactFilters = buildCompactSearchFilterSummary({\n mode,\n matchMode,\n options,\n includeLinked,\n titleExact: options.titleExact === true,\n phraseExact: options.phraseExact === true,\n scoreThreshold,\n hybridSemanticWeight,\n runtimeFieldFilters,\n });\n return {\n query: query.trim(),\n mode,\n items: [],\n count: 0,\n ...countExtras,\n filters: compactFilters,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n const projectionFields = projection.mode === \"full\" ? null : [...projection.fields];\n return {\n query: query.trim(),\n mode,\n items: [],\n count: 0,\n ...countExtras,\n filters: buildVerboseSearchFilters({\n effectiveMode: mode,\n matchMode,\n options,\n includeLinked,\n titleExact: options.titleExact === true,\n phraseExact: options.phraseExact === true,\n scoreThreshold,\n hybridSemanticWeight,\n queryExpansion,\n rerank,\n runtimeFieldFilters: runtimeFieldFilters ?? {},\n }),\n projection: {\n mode: projection.mode,\n fields: projectionFields,\n },\n now: nowIso(),\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n}\n/* c8 ignore stop */\n\nfunction requireSemanticDependencies(\n requestedMode: Exclude<SearchMode, \"keyword\">,\n providerResolution: EmbeddingProviderResolution,\n vectorResolution: VectorStoreResolution,\n hasExtensionVectorQuery: boolean,\n): { provider: EmbeddingProviderConfig; vectorStore: VectorStoreConfig | null } {\n if (!providerResolution.active) {\n throw new PmCliError(\n `Search mode '${requestedMode}' requires a configured embedding provider in settings.providers.openai or settings.providers.ollama`,\n EXIT_CODE.USAGE,\n );\n }\n if (!vectorResolution.active && !hasExtensionVectorQuery) {\n throw new PmCliError(\n `Search mode '${requestedMode}' requires a configured vector store in settings.vector_store.qdrant/settings.vector_store.lancedb or an extension adapter selected by settings.vector_store.adapter`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n provider: providerResolution.active,\n vectorStore: vectorResolution.active ?? null,\n };\n}\n\nconst toOptionalNonEmptyString = toNonEmptyStringOrUndefined;\n\ninterface ExtensionSearchProviderHooks {\n providerName: string;\n query?: ExtensionSearchProviderQuery;\n queryExpansion?: ExtensionSearchProviderQueryExpansion;\n rerank?: ExtensionSearchProviderRerank;\n}\n\n/* c8 ignore start -- extension search-provider registration permutations are covered by extension integration suites */\nfunction resolveExtensionSearchProviderByName(providerName: string | undefined): ExtensionSearchProviderHooks | null {\n const registrations = getActiveExtensionRegistrations();\n const resolved = resolveRegisteredSearchProvider(registrations, providerName);\n if (!resolved) {\n return null;\n }\n const runtimeDefinition = resolved.runtime_definition ?? resolved.definition;\n const query = (runtimeDefinition as { query?: unknown }).query;\n const queryExpansion =\n (runtimeDefinition as { queryExpansion?: unknown; query_expansion?: unknown }).queryExpansion ??\n (runtimeDefinition as { queryExpansion?: unknown; query_expansion?: unknown }).query_expansion;\n const rerank = (runtimeDefinition as { rerank?: unknown }).rerank;\n const registeredName =\n toOptionalNonEmptyString((runtimeDefinition as { name?: unknown }).name) ??\n toOptionalNonEmptyString((resolved.definition as { name?: unknown }).name) ??\n providerName;\n /* c8 ignore next 2 -- providerName is required for lookup and remains a non-empty fallback */\n if (!registeredName) {\n return null;\n }\n const hooks: ExtensionSearchProviderHooks = {\n providerName: registeredName,\n ...(typeof query === \"function\" ? { query: query as ExtensionSearchProviderQuery } : {}),\n ...(typeof queryExpansion === \"function\"\n ? { queryExpansion: queryExpansion as ExtensionSearchProviderQueryExpansion }\n : {}),\n ...(typeof rerank === \"function\" ? { rerank: rerank as ExtensionSearchProviderRerank } : {}),\n };\n if (!hooks.query && !hooks.queryExpansion && !hooks.rerank) {\n return null;\n }\n return hooks;\n}\n/* c8 ignore stop */\n\nfunction resolveExtensionSearchProvider(settings: PmSettings): { providerName: string; query: ExtensionSearchProviderQuery } | null {\n const providerName = toOptionalNonEmptyString((settings.search as { provider?: unknown } | undefined)?.provider);\n const resolved = resolveExtensionSearchProviderByName(providerName);\n if (!resolved?.query) {\n return null;\n }\n return {\n providerName: resolved.providerName,\n query: resolved.query,\n };\n}\n\n/* c8 ignore start -- vector adapter runtime definition permutations are covered by extension integration suites */\nfunction resolveExtensionVectorAdapter(settings: PmSettings): ExtensionVectorAdapter | null {\n const registrations = getActiveExtensionRegistrations();\n const adapterName = toOptionalNonEmptyString((settings.vector_store as { adapter?: unknown } | undefined)?.adapter);\n const resolved = resolveRegisteredVectorStoreAdapter(registrations, adapterName);\n if (!resolved) {\n return null;\n }\n const runtimeDefinition = resolved.runtime_definition ?? resolved.definition;\n const query = (runtimeDefinition as { query?: unknown }).query;\n if (typeof query !== \"function\") {\n return null;\n }\n return {\n query: query as ExtensionVectorQuery,\n };\n}\n/* c8 ignore stop */\n\nfunction normalizeExtensionProviderHits(\n providerName: string,\n raw: unknown,\n filteredById: Map<string, ItemDocument>,\n): SearchHit[] {\n const rawHits = Array.isArray(raw)\n ? raw\n : (raw as { hits?: unknown } | null | undefined)?.hits;\n if (!Array.isArray(rawHits)) {\n throw new PmCliError(\n `Extension search provider \"${providerName}\" must return an array of hits or { hits: [...] }`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n\n const seen = new Set<string>();\n const hits: SearchHit[] = [];\n for (const rawHit of rawHits) {\n if (typeof rawHit !== \"object\" || rawHit === null) {\n continue;\n }\n const id = toOptionalNonEmptyString((rawHit as { id?: unknown }).id);\n const score = (rawHit as { score?: unknown }).score;\n if (!id || typeof score !== \"number\" || !Number.isFinite(score) || seen.has(id)) {\n continue;\n }\n const document = filteredById.get(id);\n if (!document) {\n continue;\n }\n const matchedFieldsRaw = (rawHit as { matched_fields?: unknown }).matched_fields;\n const matchedFields =\n Array.isArray(matchedFieldsRaw) && matchedFieldsRaw.every((entry) => typeof entry === \"string\")\n ? [...new Set((matchedFieldsRaw as string[]).map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) =>\n a.localeCompare(b),\n )\n : [`provider:${providerName}`];\n seen.add(id);\n hits.push({\n item: document.metadata,\n score,\n matched_fields: matchedFields,\n });\n }\n return hits;\n}\n\nfunction buildSemanticHits(\n vectorHits: VectorQueryHit[],\n filteredById: Map<string, ItemDocument>,\n): { semanticHits: SearchHit[]; semanticScores: Map<string, number> } {\n const semanticHits: SearchHit[] = [];\n const semanticScores = new Map<string, number>();\n for (const vectorHit of vectorHits) {\n if (semanticScores.has(vectorHit.id)) {\n continue;\n }\n const document = filteredById.get(vectorHit.id);\n if (!document) {\n continue;\n }\n semanticScores.set(vectorHit.id, vectorHit.score);\n semanticHits.push({\n item: document.metadata,\n score: vectorHit.score,\n matched_fields: [\"semantic\"],\n });\n }\n return {\n semanticHits,\n semanticScores,\n };\n}\n\n// GH-281: in semantic & hybrid mode the blended/vector scores live on an\n// arbitrary scale (blended hybrid scores are [0,1]; raw vector similarities are\n// provider-defined), so an exact full-ID or short-ID keyword match can be\n// out-ranked by a high-semantic body mention. This reattaches the exact-ID\n// keyword hit(s) to the top of the ranked set in a reserved band ABOVE every\n// other hit, preserving matched_fields:[\"id\"] and keeping full-ID above\n// short-ID. The reserved scores are derived from the current max so the\n// guarantee holds no matter what scale the backend returns, and the hit is\n// re-inserted even if it was dropped from `rankedHits` (e.g. it had no semantic\n// vector match) so it is never lost to the threshold or the result-limit slice.\nfunction forceExactIdHitsToTop(rankedHits: SearchHit[], keywordHits: SearchHit[]): SearchHit[] {\n const exactIdHits = keywordHits.filter((hit) => hit.exact_id_match === true);\n if (exactIdHits.length === 0) {\n return rankedHits;\n }\n const exactIdIds = new Set(exactIdHits.map((hit) => hit.item.id));\n const remaining = rankedHits.filter((hit) => !exactIdIds.has(hit.item.id));\n // reduce (not Math.max(...spread)) so a very large pre-truncation candidate\n // set can never overflow the call stack.\n const maxRemainingScore = remaining.reduce((max, hit) => Math.max(max, hit.score), 0);\n // Full-ID hits (score 1000) must rank above short-ID hits (score 900): rank\n // within the exact-ID band by the original keyword score (descending) so a\n // full-ID match always precedes a short-ID match for the same query, then\n // offset the whole band above every remaining hit. ids are unique, so two\n // exact-ID hits can never tie on score — sorting on score alone is total.\n // exactIdHits is already a fresh array from keywordHits.filter(...), so sort\n // it in place — no defensive copy needed.\n const orderedExactHits = exactIdHits.sort((left, right) => right.score - left.score);\n const bandBase = maxRemainingScore + orderedExactHits.length + 1;\n const promoted = orderedExactHits.map((hit, index) => ({\n // Spread the original keyword hit so flags like matched_all_terms /\n // exact_id_match are preserved; only the band-slot score and the id-only\n // matched_fields are overridden.\n ...hit,\n // Higher band slot for earlier (higher original keyword score) hits.\n score: bandBase - index,\n matched_fields: [\"id\"],\n }));\n return [...promoted, ...remaining];\n}\n\nfunction combineHybridHits(\n filteredById: Map<string, ItemDocument>,\n semanticScores: Map<string, number>,\n keywordHits: SearchHit[],\n hybridSemanticWeight: number,\n): SearchHit[] {\n const keywordScores = new Map(keywordHits.map((entry) => [entry.item.id, entry.score]));\n const keywordMatches = new Map(keywordHits.map((entry) => [entry.item.id, entry.matched_fields]));\n const normalizedSemantic = normalizeScoreMap(semanticScores);\n const normalizedKeyword = normalizeScoreMap(keywordScores);\n const candidateIds = new Set<string>([...semanticScores.keys(), ...keywordScores.keys()]);\n const keywordWeight = 1 - hybridSemanticWeight;\n return [...candidateIds]\n .map((id) => {\n const document = filteredById.get(id)!;\n const semanticScore = normalizedSemantic.get(id) ?? 0;\n const keywordScore = normalizedKeyword.get(id) ?? 0;\n const combinedScore = (semanticScore * hybridSemanticWeight) + (keywordScore * keywordWeight);\n if (combinedScore <= 0) {\n return null;\n }\n const matchedFields = new Set<string>();\n if (semanticScores.has(id)) {\n matchedFields.add(\"semantic\");\n }\n for (const field of keywordMatches.get(id) ?? []) {\n matchedFields.add(field);\n }\n return {\n item: document.metadata,\n score: combinedScore,\n matched_fields: [...matchedFields].sort((a, b) => a.localeCompare(b)),\n };\n })\n .filter((entry): entry is SearchHit => entry !== null);\n}\n\ninterface SemanticQueryContext {\n requestedMode: Exclude<SearchMode, \"keyword\">;\n query: string;\n filteredDocuments: ItemDocument[];\n keywordHits: SearchHit[];\n hybridSemanticWeight: number;\n limit: number | undefined;\n maxResults: number;\n provider: EmbeddingProviderConfig;\n vectorStore: VectorStoreConfig | null;\n extensionVectorAdapter: ExtensionVectorAdapter | null;\n queryExpansion: QueryExpansionConfig;\n queryExpansionExtension: { providerName: string; expand: ExtensionSearchProviderQueryExpansion } | null;\n rerank: RerankConfig;\n rerankExtension: { providerName: string; rerank: ExtensionSearchProviderRerank } | null;\n warnings: string[];\n settings: PmSettings;\n embeddingTimeoutMs?: number;\n vectorQueryTimeoutMs?: number;\n}\n\ninterface SemanticQueryResult {\n hits: SearchHit[];\n // Number of documents returned by the vector stage for this query after the\n // current metadata filters. When this is 0 the semantic/hybrid query ran\n // successfully, but vector ranking contributed nothing to the returned hits.\n vectorMatchCount: number;\n}\n\nfunction mergeVectorHitsById(vectorHitGroups: VectorQueryHit[][]): VectorQueryHit[] {\n const bestById = new Map<string, VectorQueryHit>();\n for (const group of vectorHitGroups) {\n for (const hit of group) {\n const existing = bestById.get(hit.id);\n if (!existing || hit.score > existing.score) {\n bestById.set(hit.id, hit);\n }\n }\n }\n const merged = [...bestById.values()];\n merged.sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.id.localeCompare(right.id);\n });\n return merged;\n}\n\n/* c8 ignore start -- rerank corpus metadata-shape permutations are covered by semantic integration tests */\nfunction buildRerankCorpus(document: ItemDocument): string {\n const metadata = (document as { metadata?: ItemDocument[\"metadata\"] | null }).metadata;\n const tags = Array.isArray(metadata?.tags) ? metadata.tags.join(\" \") : \"\";\n return [\n metadata?.title,\n metadata?.description,\n metadata?.type,\n metadata?.status,\n tags,\n document.body,\n ]\n .map((entry) => (typeof entry === \"string\" ? entry.trim() : \"\"))\n .filter((entry) => entry.length > 0)\n .join(\"\\n\");\n}\n/* c8 ignore stop */\n\n/* c8 ignore start -- semantic expansion/rerank fallback matrices are covered by end-to-end semantic search tests */\nasync function computeSemanticOrHybridHits(context: SemanticQueryContext): Promise<SemanticQueryResult> {\n const semanticLimit = context.limit ?? context.maxResults;\n const embeddingOptions = context.embeddingTimeoutMs !== undefined ? { timeout_ms: context.embeddingTimeoutMs } : {};\n const vectorQueryOptions = context.vectorQueryTimeoutMs !== undefined ? { timeout_ms: context.vectorQueryTimeoutMs } : {};\n const queryTrimmed = context.query.trim();\n const baseExpandedQueries = context.queryExpansion.enabled\n ? buildDeterministicQueryExpansions(queryTrimmed, context.queryExpansion.max_queries)\n : [queryTrimmed];\n let expandedQueries = baseExpandedQueries.length > 0 ? baseExpandedQueries : [queryTrimmed];\n if (context.queryExpansion.enabled) {\n if (context.queryExpansionExtension?.expand) {\n try {\n const rawExpansion = await Promise.resolve(\n context.queryExpansionExtension.expand({\n query: queryTrimmed,\n mode: context.requestedMode,\n settings: context.settings,\n }),\n );\n const extensionExpansion = normalizeQueryExpansionOutput(rawExpansion);\n expandedQueries = mergeQueryExpansions(expandedQueries, extensionExpansion, context.queryExpansion.max_queries);\n } catch {\n context.warnings.push(\n `search_query_expansion_provider_failed:${context.queryExpansionExtension.providerName}:using_builtin`,\n );\n }\n } else if (\n context.queryExpansion.provider &&\n context.queryExpansion.provider !== \"openai\" &&\n context.queryExpansion.provider !== \"ollama\"\n ) {\n context.warnings.push(\n `search_query_expansion_provider_unavailable:${context.queryExpansion.provider}:using_builtin`,\n );\n }\n }\n\n const queryVectors = await executeEmbeddingRequest(context.provider, expandedQueries, embeddingOptions);\n\n const executeVectorQueryWithFallback = async (semanticVector: number[]): Promise<VectorQueryHit[]> => {\n if (context.extensionVectorAdapter?.query) {\n try {\n return await Promise.resolve(\n context.extensionVectorAdapter.query({\n vector: semanticVector,\n limit: semanticLimit,\n settings: context.settings,\n }),\n );\n } catch (error: unknown) {\n if (!context.vectorStore) {\n throw new PmCliError(\n `Extension vector adapter query failed and no built-in fallback store is configured (${error instanceof Error ? error.message : String(error)})`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);\n }\n }\n if (context.vectorStore) {\n return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);\n }\n throw new PmCliError(\n \"Semantic search requires either a configured vector store or an extension vector adapter query handler\",\n EXIT_CODE.USAGE,\n );\n };\n\n const queryVectorGroups = await Promise.all(\n queryVectors.map(async (semanticVector) => await executeVectorQueryWithFallback(semanticVector)),\n );\n const vectorHits = mergeVectorHitsById(queryVectorGroups);\n const filteredById = new Map(context.filteredDocuments.map((document) => [document.metadata.id, document]));\n const { semanticHits, semanticScores } = buildSemanticHits(vectorHits, filteredById);\n const vectorMatchCount = semanticScores.size;\n if (context.requestedMode === \"semantic\") {\n // GH-281: guarantee an exact full-ID / short-ID match ranks #1 even in pure\n // semantic mode, where it otherwise carries no vector hit at all.\n return { hits: forceExactIdHitsToTop(semanticHits, context.keywordHits), vectorMatchCount };\n }\n let hybridHits = combineHybridHits(filteredById, semanticScores, context.keywordHits, context.hybridSemanticWeight);\n if (context.rerank.enabled && hybridHits.length > 1) {\n const sortedForCandidates = [...hybridHits].sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.item.id.localeCompare(right.item.id);\n });\n const candidateHits = sortedForCandidates.slice(0, context.rerank.top_k);\n const candidateContexts = candidateHits\n .map((hit) => {\n const document = filteredById.get(hit.item.id);\n if (!document) {\n return null;\n }\n return { hit, text: buildRerankCorpus(document) };\n })\n .filter((entry): entry is { hit: SearchHit; text: string } => entry !== null);\n const rerankCandidates: RerankCandidate[] = candidateContexts.map((entry) => ({\n id: entry.hit.item.id,\n text: entry.text,\n }));\n let rerankScores: Map<string, number> | null = null;\n if (context.rerankExtension?.rerank) {\n try {\n const rawRerank = await Promise.resolve(\n context.rerankExtension.rerank({\n query: queryTrimmed,\n mode: \"hybrid\",\n model: context.rerank.model,\n top_k: context.rerank.top_k,\n settings: context.settings,\n candidates: candidateContexts.map((entry) => ({\n id: entry.hit.item.id,\n text: entry.text,\n score: entry.hit.score,\n })),\n }),\n );\n const normalizedRerank = normalizeRerankOutput(rawRerank);\n if (normalizedRerank.length > 0) {\n rerankScores = new Map(normalizedRerank.map((entry) => [entry.id, entry.score]));\n } else {\n context.warnings.push(\n `search_rerank_provider_invalid_response:${context.rerankExtension.providerName}:using_builtin`,\n );\n }\n } catch {\n context.warnings.push(`search_rerank_provider_failed:${context.rerankExtension.providerName}:using_builtin`);\n }\n }\n if (!rerankScores) {\n try {\n rerankScores = await rerankCandidatesWithEmbeddings(\n context.provider,\n context.rerank.model,\n queryTrimmed,\n rerankCandidates,\n context.embeddingTimeoutMs,\n );\n } catch {\n context.warnings.push(\"search_rerank_failed:using_hybrid_scores\");\n }\n }\n if (rerankScores && rerankScores.size > 0) {\n const rerankedIds = new Set(rerankScores.keys());\n hybridHits = hybridHits.map((hit) => {\n const rerankScore = rerankScores.get(hit.item.id);\n if (rerankScore === undefined) {\n return hit;\n }\n const matchedFields = new Set(hit.matched_fields);\n matchedFields.add(\"rerank\");\n return {\n ...hit,\n score: rerankScore,\n matched_fields: [...matchedFields].sort((left, right) => left.localeCompare(right)),\n };\n });\n hybridHits.sort((left, right) => {\n const leftWasReranked = rerankedIds.has(left.item.id);\n const rightWasReranked = rerankedIds.has(right.item.id);\n if (leftWasReranked !== rightWasReranked) {\n return leftWasReranked ? -1 : 1;\n }\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.item.id.localeCompare(right.item.id);\n });\n }\n }\n return {\n // GH-281: applied LAST (after any rerank reordering) so an exact full-ID /\n // short-ID keyword match always ranks #1 in hybrid mode regardless of the\n // semantic blend weight or rerank scores.\n hits: forceExactIdHitsToTop(hybridHits, context.keywordHits),\n vectorMatchCount,\n };\n}\n/* c8 ignore stop */\n\n/* c8 ignore start -- item body fallback read-path combinations are covered by document-cache integration tests */\nasync function loadDocuments(\n pmRoot: string,\n itemFormat: ItemFormat,\n typeToFolder: Record<string, string>,\n schema: PmSettings[\"schema\"],\n): Promise<{ documents: ItemDocument[]; warnings: string[] }> {\n const extensionFieldNames = collectRegisteredItemFieldNames(getActiveExtensionRegistrations());\n const readDocumentBody = async (\n metadata: ItemFrontMatter,\n preferredPath: string,\n preferredFormat: ItemFormat,\n ): Promise<string> => {\n const tryRead = async (targetPath: string, format: ItemFormat): Promise<string> => {\n await runActiveOnReadHooks({ path: targetPath, scope: \"project\" });\n const raw = await fs.readFile(targetPath, \"utf8\");\n const parsed = parseItemDocument(raw, {\n format,\n schema,\n extensionFieldNames,\n onWarning: (warning) => listWarnings.push(warning),\n });\n return parsed.body;\n };\n\n try {\n return await tryRead(preferredPath, preferredFormat);\n } catch {\n const alternateFormat: ItemFormat = preferredFormat === \"toon\" ? \"json_markdown\" : \"toon\";\n const alternatePath = getItemPath(pmRoot, metadata.type as ItemType, metadata.id, alternateFormat, typeToFolder);\n try {\n return await tryRead(alternatePath, alternateFormat);\n } catch {\n listWarnings.push(`item_list_item_read_failed:${path.relative(pmRoot, alternatePath)}`);\n return \"\";\n }\n }\n };\n\n const listWarnings: string[] = [];\n const cachedDocuments = await listAllDocumentCandidatesCached(pmRoot, itemFormat, typeToFolder, listWarnings, schema);\n const documents: ItemDocument[] = [];\n if (cachedDocuments.length === 0) {\n const frontMatterDocuments = await listAllFrontMatter(pmRoot, itemFormat, typeToFolder, listWarnings, schema);\n for (const metadata of frontMatterDocuments) {\n const preferredPath = getItemPath(pmRoot, metadata.type as ItemType, metadata.id, itemFormat, typeToFolder);\n const body = await readDocumentBody(metadata, preferredPath, itemFormat);\n documents.push({ metadata, body });\n }\n return {\n documents,\n warnings: [...new Set(listWarnings)].sort((left, right) => left.localeCompare(right)),\n };\n }\n\n for (const cachedDocument of cachedDocuments) {\n if (typeof cachedDocument.body === \"string\") {\n documents.push({\n metadata: cachedDocument.metadata,\n body: cachedDocument.body,\n });\n continue;\n }\n const body = await readDocumentBody(cachedDocument.metadata, cachedDocument.item_path, cachedDocument.item_format);\n documents.push({\n metadata: cachedDocument.metadata,\n body,\n });\n }\n return {\n documents,\n warnings: [...new Set(listWarnings)].sort((left, right) => left.localeCompare(right)),\n };\n}\n/* c8 ignore stop */\n\n/* c8 ignore start -- field projection lookup precedence is validated by output-shaping integration tests */\nfunction readSearchFieldValue(hit: SearchHit, field: string): unknown {\n const normalized = field.trim();\n if (normalized.length === 0) {\n return null;\n }\n if (normalized === \"score\") {\n return hit.score;\n }\n if (normalized === \"matched_fields\") {\n return hit.matched_fields;\n }\n if (normalized.startsWith(\"item.\")) {\n const itemKey = normalized.slice(\"item.\".length);\n if (itemKey.length === 0) {\n return null;\n }\n const itemRecord = toItemRecord(hit.item);\n return itemRecord[itemKey] ?? null;\n }\n const hitRecord = hit as unknown as Record<string, unknown>;\n const itemRecord = toItemRecord(hit.item);\n if (Object.prototype.hasOwnProperty.call(itemRecord, normalized)) {\n return itemRecord[normalized] ?? null;\n }\n if (Object.prototype.hasOwnProperty.call(hitRecord, normalized)) {\n return hitRecord[normalized] ?? null;\n }\n return null;\n}\n/* c8 ignore stop */\n\nfunction projectSearchHits(hits: SearchHit[], projection: SearchProjectionConfig): SearchResultItem[] {\n if (projection.mode === \"full\") {\n // matched_all_terms is an internal ranking signal (GH-181); strip it from\n // full-mode output rows so the public hit shape stays { item, score, matched_fields }.\n return hits.map(({ matched_all_terms: _matchedAllTerms, ...hit }) => hit);\n }\n return hits.map((hit) => {\n const projected: Record<string, unknown> = {};\n for (const field of projection.fields) {\n projected[field] = readSearchFieldValue(hit, field);\n }\n return projected;\n });\n}\n\n/**\n * Implements run search for the public runtime surface of this module.\n */\nexport async function runSearch(rawQuery: string, rawOptions: SearchOptions, global: GlobalOptions): Promise<SearchResult> {\n // GH-157 inline query syntax: pull `field:value` filter tokens out of the raw\n // query before any other parsing. Explicit flags win — an inline token only\n // applies when its flag is unset, and a conflicting token surfaces as a\n // warning. The residual keyword text drives tokenization/scoring as usual.\n const inlineWarnings: string[] = [];\n const inlineParse = parseInlineQueryFilters(rawQuery);\n const hasInlineFilters = Object.keys(inlineParse.inlineFilters).length > 0;\n if (hasInlineFilters && inlineParse.residualQuery.trim().length === 0) {\n throw new PmCliError(\n \"Inline field:value tokens consumed the entire query, leaving no search terms.\",\n EXIT_CODE.USAGE,\n {\n examples: [\"pm search auth tag:area:search\", \"pm list --tag area:search --status open\"],\n nextSteps: [\n \"Add keyword terms alongside the inline filters, or use pm list for pure tag/status/type/priority filtering.\",\n ],\n },\n );\n }\n const query = hasInlineFilters ? inlineParse.residualQuery : rawQuery;\n const options = applyInlineQueryFilters(rawOptions, inlineParse.inlineFilters, inlineWarnings);\n const highlight = options.highlight === true;\n const includeLinked = parseIncludeLinked(options.includeLinked);\n const titleExact = parseTitleExact(options.titleExact);\n const phraseExact = parsePhraseExact(options.phraseExact);\n const matchMode = parseMatchMode(typeof options.matchMode === \"string\" ? options.matchMode : undefined);\n const minScoreOverride = parseMinScoreOverride(options.minScore);\n const countOnly = options.count === true;\n const tokens = parseTokens(query);\n const normalizedQuery = normalizeSearchPhrase(query);\n const limit = parseLimit(options.limit);\n const projection = parseProjectionConfig(options);\n const modeWasExplicit = typeof options.mode === \"string\" && options.mode.trim().length > 0;\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const storedSettings = await readSettings(pmRoot);\n const runtimeDefaultsResolution = resolveSettingsWithSemanticRuntimeDefaults(storedSettings);\n const settings = runtimeDefaultsResolution.settings;\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const runtimeFieldRegistry = resolveRuntimeFieldRegistry(settings.schema);\n validateSearchProjectionFields(projection, runtimeFieldRegistry);\n const runtimeFieldFilters = collectRuntimeFilterValues(options as Record<string, unknown>, runtimeFieldRegistry, \"search\");\n // `pm search --status` resolves strictly (a typo'd status surfaces a\n // did-you-mean hint) so agents can scope retrieval to open work and drop\n // closed-history noise without re-listing. Resolved before the corpus scan so\n // an invalid value fails fast.\n const statusFilter = parseStatusFilterCsv(\n typeof options.status === \"string\" ? options.status : undefined,\n statusRegistry,\n { strict: true },\n );\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const maxResults = resolveSearchMaxResults(settings);\n // pm-cstl: --min-score overrides the persistent search.score_threshold for this\n // query only; the effective threshold is reflected in filters.score_threshold.\n const scoreThreshold = minScoreOverride ?? resolveSearchScoreThreshold(settings);\n const semanticWeightProvided = options.semanticWeight !== undefined;\n const semanticWeightOverride = parseSemanticWeightOverride(options.semanticWeight);\n const hybridSemanticWeight = semanticWeightOverride ?? resolveHybridSemanticWeight(settings);\n const tuning = resolveSearchTuning(settings);\n const providerResolution = resolveEmbeddingProviders(settings);\n const vectorResolution = resolveVectorStores(settings);\n const extensionSearchProvider = resolveExtensionSearchProvider(settings);\n const extensionVectorAdapter = resolveExtensionVectorAdapter(settings);\n const queryExpansion = resolveQueryExpansionConfig(settings, providerResolution.active?.name ?? null);\n const rerank = resolveRerankConfig(\n settings,\n providerResolution.active?.model ?? toOptionalNonEmptyString(settings.search?.embedding_model) ?? \"text-embedding-3-small\",\n );\n const queryExpansionProvider = resolveExtensionSearchProviderByName(queryExpansion.provider ?? undefined);\n const queryExpansionExtension = queryExpansionProvider?.queryExpansion\n ? { providerName: queryExpansionProvider.providerName, expand: queryExpansionProvider.queryExpansion }\n : null;\n const rerankProvider = resolveExtensionSearchProviderByName(toOptionalNonEmptyString(settings.search?.provider));\n const rerankExtension = rerankProvider?.rerank\n ? { providerName: rerankProvider.providerName, rerank: rerankProvider.rerank }\n : null;\n let effectiveMode = parseMode(options.mode, {\n hasProvider: providerResolution.active !== null || extensionSearchProvider !== null,\n hasVectorStore: vectorResolution.active !== null || extensionVectorAdapter !== null,\n });\n const loadedDocuments = await loadDocuments(\n pmRoot,\n settings.item_format ?? \"toon\",\n typeRegistry.type_to_folder,\n settings.schema,\n );\n const warnings = loadedDocuments.warnings;\n if (inlineWarnings.length > 0) {\n warnings.push(...inlineWarnings);\n }\n if (effectiveMode === \"hybrid\" && semanticWeightProvided && semanticWeightOverride === undefined) {\n warnings.push(\"search_hybrid_semantic_weight_override_invalid:using_settings_default\");\n }\n const allDocuments = loadedDocuments.documents;\n const lifecycleClassifier = lifecycleClassifierFromStatusRegistry(statusRegistry);\n const metadataFilteredDocuments = applyFilters(\n allDocuments,\n options,\n typeRegistry,\n runtimeFieldFilters,\n statusFilter,\n lifecycleClassifier,\n );\n const filteredDocuments = applyExactQueryFilters(metadataFilteredDocuments, normalizedQuery, {\n titleExact,\n // --match-mode exact reuses the exact-phrase containment logic so the whole\n // normalized query must appear as a contiguous phrase in some searchable field.\n phraseExact: phraseExact || matchMode === \"exact\",\n });\n if (effectiveMode === \"keyword\" && (filteredDocuments.length === 0 || limit === 0)) {\n return emptySearchResult(\n query,\n effectiveMode,\n matchMode,\n options,\n includeLinked,\n scoreThreshold,\n hybridSemanticWeight,\n queryExpansion,\n rerank,\n projection,\n warnings,\n runtimeFieldFilters,\n countOnly,\n );\n }\n\n const projectRoot = process.cwd();\n const globalRoot = resolveGlobalPmRoot(projectRoot);\n const linkedCorpusById = new Map<string, string>();\n if (includeLinked && (effectiveMode === \"keyword\" || effectiveMode === \"hybrid\")) {\n const linkedCorpusRoots = await resolveLinkedCorpusRoots(projectRoot, globalRoot);\n const linkedCorpusEntries = await Promise.all(\n filteredDocuments.map(async (document) => [document.metadata.id, await loadLinkedCorpus(document, linkedCorpusRoots)] as const),\n );\n for (const [id, corpus] of linkedCorpusEntries) {\n linkedCorpusById.set(id, corpus);\n }\n }\n\n // GH-181: the all-terms coverage RANKING bonus only applies in default OR mode\n // (no hard term filter) so multi-term queries prefer items covering all tokens.\n // and/exact modes hard-filter instead, so the additive bonus would be redundant.\n const applyCoverageBonus = matchMode === \"or\";\n const keywordHits = filteredDocuments\n .map((document) =>\n buildHybridLexicalScore(\n document,\n tokens,\n normalizedQuery,\n // Linked corpus is only collected into linkedCorpusById when the user\n // passed --include-linked (and mode is keyword/hybrid), so pass the\n // parsed flag directly rather than re-deriving it from the mode.\n includeLinked,\n linkedCorpusById,\n tuning,\n settings.id_prefix,\n applyCoverageBonus,\n ),\n )\n .filter((entry): entry is SearchHit => entry !== null)\n // --match-mode and: hard-filter to items where EVERY distinct query token\n // matched some searchable field.\n .filter((entry) => matchMode !== \"and\" || entry.matched_all_terms === true);\n\n let hits = keywordHits;\n /* c8 ignore start -- semantic/provider fallback + compact/count warning-shape permutations are covered by integration command-contract tests */\n if (effectiveMode !== \"keyword\") {\n // Surface vector-index staleness once per query so agents notice when a\n // refresh is overdue. Only emitted when:\n // (1) the user explicitly asked for semantic/hybrid mode (implicit\n // upgrades fall back silently to keyword on any failure path below\n // and shouldn't carry noise), AND\n // (2) the BUILT-IN semantic path is what will run — an extension search\n // provider has its own indexing lifecycle and the local ledger we\n // read is irrelevant to it.\n const builtInSemanticWillRun =\n !extensionSearchProvider &&\n providerResolution.active !== null &&\n (vectorResolution.active !== null || extensionVectorAdapter !== null);\n if (modeWasExplicit && builtInSemanticWillRun) {\n await maybeEmitVectorIndexStaleWarning(pmRoot, filteredDocuments, warnings);\n }\n try {\n if (!extensionSearchProvider) {\n requireSemanticDependencies(effectiveMode, providerResolution, vectorResolution, extensionVectorAdapter !== null);\n }\n if (filteredDocuments.length === 0 || limit === 0) {\n return emptySearchResult(\n query,\n effectiveMode,\n matchMode,\n options,\n includeLinked,\n scoreThreshold,\n hybridSemanticWeight,\n queryExpansion,\n rerank,\n projection,\n warnings,\n runtimeFieldFilters,\n countOnly,\n );\n }\n const filteredById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));\n const canUseBuiltInSemantic =\n providerResolution.active !== null && (vectorResolution.active !== null || extensionVectorAdapter !== null);\n if (extensionSearchProvider) {\n try {\n const providerResponse = await Promise.resolve(\n extensionSearchProvider.query({\n query,\n mode: effectiveMode,\n tokens,\n options,\n settings,\n documents: filteredDocuments,\n }),\n );\n hits = normalizeExtensionProviderHits(extensionSearchProvider.providerName, providerResponse, filteredById);\n } catch (error: unknown) {\n if (!canUseBuiltInSemantic) {\n throw new PmCliError(\n `Extension search provider \"${extensionSearchProvider.providerName}\" failed: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n }\n }\n if (hits === keywordHits) {\n const implicitHybridMode = !modeWasExplicit && effectiveMode === \"hybrid\";\n const { provider, vectorStore } = requireSemanticDependencies(\n effectiveMode,\n providerResolution,\n vectorResolution,\n extensionVectorAdapter !== null,\n );\n const semanticResult = await computeSemanticOrHybridHits({\n requestedMode: effectiveMode,\n query,\n filteredDocuments,\n keywordHits,\n hybridSemanticWeight,\n limit,\n maxResults,\n provider,\n vectorStore,\n extensionVectorAdapter,\n queryExpansion,\n queryExpansionExtension,\n rerank,\n rerankExtension,\n warnings,\n settings,\n /* c8 ignore next 5 -- reserved for future implicit-hybrid auto-mode; current parseMode defaults keyword when mode is omitted */\n ...(implicitHybridMode\n ? {\n embeddingTimeoutMs: IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS,\n vectorQueryTimeoutMs: IMPLICIT_HYBRID_VECTOR_TIMEOUT_MS,\n }\n : {}),\n });\n hits = semanticResult.hits;\n // The semantic/hybrid query ran without error, but vector ranking\n // contributed no hits for this query/filter set. Pure semantic mode would\n // otherwise return an empty set, so degrade to the locally computed\n // keyword hits (hybrid already blends them in) and warn so agents do not\n // mistake them for true vector ranking. The reported mode is left\n // unchanged; the warning is the signal.\n if (semanticResult.vectorMatchCount === 0) {\n if (effectiveMode === \"semantic\") {\n hits = keywordHits;\n }\n warnings.push(`search_${effectiveMode}_degraded:no_vector_matches:results_are_lexical`);\n }\n }\n } catch (error: unknown) {\n // Any semantic/hybrid attempt that fails (backend down, timeout, or the\n // project is not configured for semantic search) degrades to keyword mode\n // so agents are never blocked. Keyword hits are always computed locally\n // before this point, so the fallback is guaranteed to succeed.\n const fallbackWarning = modeWasExplicit\n ? buildExplicitSemanticFallbackWarning(effectiveMode, error)\n /* c8 ignore next -- reserved for future implicit semantic/hybrid auto-mode fallback */\n : buildImplicitSemanticFallbackWarning(error);\n effectiveMode = \"keyword\";\n hits = keywordHits;\n warnings.push(fallbackWarning);\n }\n }\n\n // GH-281: an exact full-ID / short-ID match is always retained regardless of\n // the (possibly user-raised --min-score) threshold so the exact-target lookup\n // is never silently dropped in any mode.\n const thresholded = hits.filter((entry) => entry.exact_id_match === true || entry.score >= scoreThreshold);\n const sorted = sortHits(thresholded, statusRegistry);\n // total = matched hits after filters + threshold, BEFORE limit truncation.\n const total = sorted.length;\n // GH-181: keyword mode now also falls back to the configured max_results (50)\n // default when --limit is omitted, so a broad query no longer returns ALL hits.\n const resolvedLimit = limit ?? maxResults;\n const limited = sorted.slice(0, resolvedLimit);\n const projectionFields = projection.mode === \"full\" ? null : [...projection.fields];\n const compactSummaryMode = projection.mode === \"compact\" && options.compact === true;\n\n // --count: count-only response. Skips projecting/returning hit rows entirely so\n // an agent asking \"how many\" pays minimal tokens. `count` carries the matched\n // total (post-filter, post-threshold, pre-limit).\n if (countOnly) {\n if (compactSummaryMode) {\n const compactFilters = buildCompactSearchFilterSummary({\n mode: effectiveMode,\n matchMode,\n options,\n includeLinked,\n titleExact,\n phraseExact,\n scoreThreshold,\n hybridSemanticWeight,\n runtimeFieldFilters,\n });\n return {\n query: query.trim(),\n mode: effectiveMode,\n items: [],\n count: total,\n total,\n count_only: true,\n filters: compactFilters,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n return {\n query: query.trim(),\n mode: effectiveMode,\n items: [],\n count: total,\n total,\n count_only: true,\n filters: buildVerboseSearchFilters({\n effectiveMode,\n matchMode,\n options,\n includeLinked,\n titleExact,\n phraseExact,\n scoreThreshold,\n hybridSemanticWeight,\n queryExpansion,\n rerank,\n runtimeFieldFilters,\n }),\n projection: {\n mode: projection.mode,\n fields: projectionFields,\n },\n now: nowIso(),\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n\n // GH-157 --highlight: attach per-field matched-text snippets to the returned\n // page of hits (only the post-limit slice pays the cost). In compact/fields\n // projections we add \"highlights\" to the projected field set so the snippets\n // are actually emitted; full mode already carries them on the hit.\n let projectedHits: SearchHit[] = limited;\n let effectiveProjection = projection;\n if (highlight) {\n const documentById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));\n projectedHits = limited.map((hit) => ({\n ...hit,\n highlights: buildHitHighlights(documentById.get(hit.item.id)!, hit.matched_fields, tokens),\n }));\n if (projection.mode !== \"full\" && !projection.fields.includes(\"highlights\")) {\n effectiveProjection = { mode: projection.mode, fields: [...projection.fields, \"highlights\"] };\n }\n }\n const projectedItems = projectSearchHits(projectedHits, effectiveProjection);\n const finalProjectionFields = effectiveProjection.mode === \"full\" ? null : [...effectiveProjection.fields];\n // Surface the pre-limit total only when the limit actually dropped rows.\n const truncationExtras = limited.length < total ? { total } : {};\n if (compactSummaryMode) {\n const compactFilters = buildCompactSearchFilterSummary({\n mode: effectiveMode,\n matchMode,\n options,\n includeLinked,\n titleExact,\n phraseExact,\n scoreThreshold,\n hybridSemanticWeight,\n runtimeFieldFilters,\n });\n return {\n query: query.trim(),\n mode: effectiveMode,\n items: projectedItems,\n count: projectedItems.length,\n ...truncationExtras,\n filters: compactFilters,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n /* c8 ignore stop */\n\n return {\n query: query.trim(),\n mode: effectiveMode,\n items: projectedItems,\n count: projectedItems.length,\n ...truncationExtras,\n filters: buildVerboseSearchFilters({\n effectiveMode,\n matchMode,\n options,\n includeLinked,\n titleExact,\n phraseExact,\n scoreThreshold,\n hybridSemanticWeight,\n queryExpansion,\n rerank,\n runtimeFieldFilters,\n }),\n projection: {\n mode: effectiveProjection.mode,\n fields: finalProjectionFields,\n },\n now: nowIso(),\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n}\n","/**\n * @module core/extensions/runtime-registrations\n *\n * Implements extension runtime contracts and governance for Runtime Registrations.\n */\nimport type {\n ExtensionRegistrationRegistry,\n RegisteredExtensionSchemaMigrationDefinition,\n RegisteredExtensionSearchProvider,\n RegisteredExtensionVectorStoreAdapter,\n} from \"./loader.js\";\n\nfunction normalizeRegistrationName(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n return normalized.length > 0 ? normalized : null;\n}\n\n/**\n * Implements collect registered item fields for the public runtime surface of this module.\n */\nexport function collectRegisteredItemFields(registrations: ExtensionRegistrationRegistry | null): Array<Record<string, unknown>> {\n if (!registrations) {\n return [];\n }\n const fields: Array<Record<string, unknown>> = [];\n for (const registration of registrations.item_fields) {\n for (const field of registration.fields) {\n fields.push(field);\n }\n }\n return fields;\n}\n\n/**\n * Implements resolve registered search provider for the public runtime surface of this module.\n */\nexport function resolveRegisteredSearchProvider(\n registrations: ExtensionRegistrationRegistry | null,\n configuredProvider: string | undefined,\n): RegisteredExtensionSearchProvider | null {\n const providerName = normalizeRegistrationName(configuredProvider);\n if (!registrations || !providerName) {\n return null;\n }\n const matched = [...registrations.search_providers]\n .reverse()\n .find((registration) => {\n const definitionName =\n normalizeRegistrationName(registration.runtime_definition?.name) ??\n normalizeRegistrationName(registration.definition?.name);\n return definitionName === providerName;\n });\n return matched ?? null;\n}\n\n/**\n * Implements resolve registered vector store adapter for the public runtime surface of this module.\n */\nexport function resolveRegisteredVectorStoreAdapter(\n registrations: ExtensionRegistrationRegistry | null,\n configuredAdapter: string | undefined,\n): RegisteredExtensionVectorStoreAdapter | null {\n const adapterName = normalizeRegistrationName(configuredAdapter);\n if (!registrations || !adapterName) {\n return null;\n }\n const matched = [...registrations.vector_store_adapters]\n .reverse()\n .find((registration) => {\n const definitionName =\n normalizeRegistrationName(registration.runtime_definition?.name) ??\n normalizeRegistrationName(registration.definition?.name);\n return definitionName === adapterName;\n });\n return matched ?? null;\n}\n\n/**\n * Implements get migration runtime definition for the public runtime surface of this module.\n */\nexport function getMigrationRuntimeDefinition(\n migration: RegisteredExtensionSchemaMigrationDefinition,\n): Record<string, unknown> {\n return migration.runtime_definition ?? migration.definition;\n}\n","/**\n * @module core/shared/text-normalization\n *\n * Provides shared primitives and utilities for Text Normalization.\n */\n/**\n * Normalizes text to lowercase whitespace-collapsed form for stable matching and comparison.\n */\nexport function normalizeLowercaseWhitespace(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \" \");\n}\n\n/**\n * Implements tokenize alpha numeric for the public runtime surface of this module.\n */\nexport function tokenizeAlphaNumeric(value: string): string[] {\n return normalizeLowercaseWhitespace(value)\n .split(/[^a-z0-9]+/)\n .filter((token) => token.length > 0);\n}\n\n/**\n * Implements jaccard similarity for the public runtime surface of this module.\n */\nexport function jaccardSimilarity(leftTokens: string[], rightTokens: string[]): number {\n if (leftTokens.length === 0 && rightTokens.length === 0) {\n return 1;\n }\n if (leftTokens.length === 0 || rightTokens.length === 0) {\n return 0;\n }\n const leftSet = new Set(leftTokens);\n const rightSet = new Set(rightTokens);\n let intersection = 0;\n for (const token of leftSet) {\n if (rightSet.has(token)) {\n intersection += 1;\n }\n }\n // Both token sets are non-empty here (guarded above), so union is always >= 1.\n const union = new Set([...leftSet, ...rightSet]).size;\n return intersection / union;\n}\n","/**\n * @module core/search/relevance\n *\n * Powers search, embeddings, and semantic retrieval behavior for Relevance.\n */\nimport type { PmSettings } from \"../../types.js\";\nimport { coercePositiveInteger, toNonEmptyString } from \"../shared/primitives.js\";\nimport { tokenizeAlphaNumeric } from \"../shared/text-normalization.js\";\nimport { executeEmbeddingRequest, type EmbeddingProviderConfig } from \"./providers.js\";\n\nexport const DEFAULT_QUERY_EXPANSION_MAX_QUERIES = 4;\nexport const DEFAULT_RERANK_TOP_K = 20;\nconst MAX_RERANK_TOP_K = 200;\n\nconst QUERY_EXPANSION_STOP_WORDS = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"for\",\n \"from\",\n \"in\",\n \"into\",\n \"of\",\n \"on\",\n \"or\",\n \"the\",\n \"to\",\n \"with\",\n]);\n\n/**\n * Documents the query expansion config payload exchanged by command, SDK, and package integrations.\n */\nexport interface QueryExpansionConfig {\n enabled: boolean;\n provider: string | null;\n max_queries: number;\n}\n\n/**\n * Documents the rerank config payload exchanged by command, SDK, and package integrations.\n */\nexport interface RerankConfig {\n enabled: boolean;\n model: string;\n top_k: number;\n}\n\n/**\n * Documents the rerank candidate payload exchanged by command, SDK, and package integrations.\n */\nexport interface RerankCandidate {\n id: string;\n text: string;\n}\n\n/**\n * Documents the rerank scored hit payload exchanged by command, SDK, and package integrations.\n */\nexport interface RerankScoredHit {\n id: string;\n score: number;\n}\n\nfunction dedupeQueries(values: string[], limit: number): string[] {\n const deduped: string[] = [];\n const seen = new Set<string>();\n for (const entry of values) {\n const normalized = entry.trim().replaceAll(/\\s+/g, \" \");\n if (normalized.length === 0) {\n continue;\n }\n const dedupeKey = normalized.toLowerCase();\n if (seen.has(dedupeKey)) {\n continue;\n }\n seen.add(dedupeKey);\n deduped.push(normalized);\n if (deduped.length >= limit) {\n break;\n }\n }\n return deduped;\n}\n\nfunction singularizeSimple(token: string): string {\n const normalizedToken = token.toLowerCase();\n if (normalizedToken.length > 4 && normalizedToken.endsWith(\"ies\")) {\n return `${normalizedToken.slice(0, -3)}y`;\n }\n if (\n normalizedToken.length > 4 &&\n (normalizedToken.endsWith(\"ches\") ||\n normalizedToken.endsWith(\"shes\") ||\n normalizedToken.endsWith(\"xes\") ||\n normalizedToken.endsWith(\"zes\") ||\n normalizedToken.endsWith(\"sses\"))\n ) {\n return normalizedToken.slice(0, -2);\n }\n if (\n normalizedToken.length > 3 &&\n normalizedToken.endsWith(\"s\") &&\n !normalizedToken.endsWith(\"ss\") &&\n !normalizedToken.endsWith(\"us\") &&\n !normalizedToken.endsWith(\"is\") &&\n !normalizedToken.endsWith(\"as\")\n ) {\n return normalizedToken.slice(0, -1);\n }\n return normalizedToken;\n}\n\nfunction pluralizeSimple(token: string): string {\n const normalizedToken = token.toLowerCase();\n if (normalizedToken.length > 2 && (!normalizedToken.endsWith(\"s\") || normalizedToken.endsWith(\"ss\"))) {\n if (normalizedToken.endsWith(\"y\") && !/[aeiou]y$/u.test(normalizedToken)) {\n return `${normalizedToken.slice(0, -1)}ies`;\n }\n if (\n normalizedToken.endsWith(\"ch\") ||\n normalizedToken.endsWith(\"sh\") ||\n normalizedToken.endsWith(\"x\") ||\n normalizedToken.endsWith(\"z\") ||\n normalizedToken.endsWith(\"ss\")\n ) {\n return `${normalizedToken}es`;\n }\n return `${normalizedToken}s`;\n }\n return normalizedToken;\n}\n\n/**\n * Implements build deterministic query expansions for the public runtime surface of this module.\n */\nexport function buildDeterministicQueryExpansions(\n query: string,\n maxQueries = DEFAULT_QUERY_EXPANSION_MAX_QUERIES,\n): string[] {\n const normalizedQuery = query.trim().replaceAll(/\\s+/g, \" \");\n if (normalizedQuery.length === 0) {\n return [];\n }\n const tokens = tokenizeAlphaNumeric(normalizedQuery);\n if (tokens.length === 0) {\n return [normalizedQuery];\n }\n const contentTokens = tokens.filter((token) => !QUERY_EXPANSION_STOP_WORDS.has(token.toLowerCase()));\n const singularized = tokens.map((token) => singularizeSimple(token));\n const pluralized = contentTokens.map((token) => pluralizeSimple(token));\n return dedupeQueries(\n [\n normalizedQuery,\n tokens.join(\" \"),\n contentTokens.join(\" \"),\n singularized.join(\" \"),\n pluralized.join(\" \"),\n ],\n Math.max(1, maxQueries),\n );\n}\n\n/**\n * Implements normalize query expansion output for the public runtime surface of this module.\n */\nexport function normalizeQueryExpansionOutput(raw: unknown): string[] {\n const rawQueries = Array.isArray(raw)\n ? raw\n : (raw as { queries?: unknown } | null | undefined)?.queries;\n if (!Array.isArray(rawQueries)) {\n return [];\n }\n return dedupeQueries(\n rawQueries.filter((entry): entry is string => typeof entry === \"string\"),\n DEFAULT_QUERY_EXPANSION_MAX_QUERIES,\n );\n}\n\n/**\n * Implements merge query expansions for the public runtime surface of this module.\n */\nexport function mergeQueryExpansions(base: string[], extra: string[], maxQueries: number): string[] {\n return dedupeQueries([...base, ...extra], Math.max(1, maxQueries));\n}\n\n/**\n * Implements resolve query expansion config for the public runtime surface of this module.\n */\nexport function resolveQueryExpansionConfig(\n settings: PmSettings,\n fallbackProviderName: string | null,\n): QueryExpansionConfig {\n const search = (settings as { search?: { query_expansion?: { enabled?: unknown; provider?: unknown } } }).search;\n const queryExpansion = search?.query_expansion;\n const configuredProvider = toNonEmptyString(queryExpansion?.provider);\n return {\n enabled: queryExpansion?.enabled === true,\n provider: configuredProvider ?? fallbackProviderName,\n max_queries: DEFAULT_QUERY_EXPANSION_MAX_QUERIES,\n };\n}\n\n/**\n * Implements resolve rerank config for the public runtime surface of this module.\n */\nexport function resolveRerankConfig(settings: PmSettings, fallbackModel: string): RerankConfig {\n const search = (settings as { search?: { rerank?: { enabled?: unknown; model?: unknown; top_k?: unknown } } }).search;\n const rerank = search?.rerank;\n const configuredModel = toNonEmptyString(rerank?.model);\n const configuredTopK = coercePositiveInteger(rerank?.top_k);\n const normalizedTopK = configuredTopK ?? DEFAULT_RERANK_TOP_K;\n return {\n enabled: rerank?.enabled === true,\n model: configuredModel ?? fallbackModel,\n top_k: Math.min(MAX_RERANK_TOP_K, normalizedTopK),\n };\n}\n\n/**\n * Implements normalize rerank output for the public runtime surface of this module.\n */\nexport function normalizeRerankOutput(raw: unknown): RerankScoredHit[] {\n const rawHits = Array.isArray(raw)\n ? raw\n : (raw as { hits?: unknown } | null | undefined)?.hits;\n if (!Array.isArray(rawHits)) {\n return [];\n }\n const bestById = new Map<string, number>();\n for (const entry of rawHits) {\n if (typeof entry !== \"object\" || entry === null) {\n continue;\n }\n const id = toNonEmptyString((entry as { id?: unknown }).id);\n const score = (entry as { score?: unknown }).score;\n if (!id || typeof score !== \"number\" || !Number.isFinite(score)) {\n continue;\n }\n const existing = bestById.get(id);\n if (existing === undefined || score > existing) {\n bestById.set(id, score);\n }\n }\n const normalized = [...bestById.entries()].map(([id, score]) => ({ id, score }));\n normalized.sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.id.localeCompare(right.id);\n });\n return normalized;\n}\n\nfunction dotProduct(left: number[], right: number[]): number {\n const size = left.length;\n let result = 0;\n for (let index = 0; index < size; index += 1) {\n result += left[index] * right[index];\n }\n return result;\n}\n\nfunction l2Norm(vector: number[]): number {\n let sumSquares = 0;\n for (let index = 0; index < vector.length; index += 1) {\n sumSquares += vector[index] * vector[index];\n }\n return Math.sqrt(sumSquares);\n}\n\nfunction cosineSimilarityWithKnownLeftNorm(\n left: number[] | null | undefined,\n right: number[] | null | undefined,\n leftNorm: number,\n): number {\n if (!left || !right || left.length === 0 || right.length === 0 || left.length !== right.length) {\n return 0;\n }\n const numerator = dotProduct(left, right);\n const rightNorm = l2Norm(right);\n const denominator = leftNorm * rightNorm;\n if (\n !Number.isFinite(numerator) ||\n !Number.isFinite(leftNorm) ||\n !Number.isFinite(rightNorm) ||\n !Number.isFinite(denominator) ||\n denominator === 0\n ) {\n return 0;\n }\n return Math.max(-1, Math.min(1, numerator / denominator));\n}\n\n/**\n * Implements rerank candidates with embeddings for the public runtime surface of this module.\n */\nexport async function rerankCandidatesWithEmbeddings(\n provider: EmbeddingProviderConfig,\n model: string,\n query: string,\n candidates: RerankCandidate[],\n timeoutMs?: number,\n): Promise<Map<string, number>> {\n if (candidates.length === 0) {\n return new Map();\n }\n const effectiveModel = toNonEmptyString(model) ?? provider.model;\n const rerankProvider: EmbeddingProviderConfig =\n effectiveModel === provider.model ? provider : { ...provider, model: effectiveModel };\n const payload = [query.trim(), ...candidates.map((entry) => entry.text)];\n const vectors = await executeEmbeddingRequest(rerankProvider, payload, timeoutMs ? { timeout_ms: timeoutMs } : {});\n const queryVector = vectors[0];\n if (!queryVector) {\n return new Map();\n }\n const queryNorm = l2Norm(queryVector);\n const scoreById = new Map<string, number>();\n for (let index = 0; index < candidates.length; index += 1) {\n const candidate = candidates[index];\n const candidateVector = vectors[index + 1];\n if (!candidateVector) {\n continue;\n }\n const similarity = cosineSimilarityWithKnownLeftNorm(queryVector, candidateVector, queryNorm);\n scoreById.set(candidate.id, Math.max(0, Math.min(1, (similarity + 1) / 2)));\n }\n return scoreById;\n}\n"],"names":["itemRecord"],"mappings":"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","debugId":"aefc1a6f-1597-51fe-8f41-aa81f6bc1f71"}