@unbrained/pm-cli 2026.7.1 → 2026.7.3

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 (625) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/CHANGELOG.md +25 -0
  3. package/CONTRIBUTING.md +2 -2
  4. package/README.md +1 -1
  5. package/dist/cli/commander-usage.d.ts +2 -0
  6. package/dist/cli/commander-usage.js +110 -86
  7. package/dist/cli/commander-usage.js.map +1 -1
  8. package/dist/cli/commands/activity.js +79 -57
  9. package/dist/cli/commands/activity.js.map +1 -1
  10. package/dist/cli/commands/aggregate.js +102 -79
  11. package/dist/cli/commands/aggregate.js.map +1 -1
  12. package/dist/cli/commands/calendar.js +278 -243
  13. package/dist/cli/commands/calendar.js.map +1 -1
  14. package/dist/cli/commands/close-many.js +176 -114
  15. package/dist/cli/commands/close-many.js.map +1 -1
  16. package/dist/cli/commands/close.js +157 -129
  17. package/dist/cli/commands/close.js.map +1 -1
  18. package/dist/cli/commands/comments-audit.js +50 -42
  19. package/dist/cli/commands/comments-audit.js.map +1 -1
  20. package/dist/cli/commands/config.d.ts +2 -0
  21. package/dist/cli/commands/config.js +443 -879
  22. package/dist/cli/commands/config.js.map +1 -1
  23. package/dist/cli/commands/context.js +365 -287
  24. package/dist/cli/commands/context.js.map +1 -1
  25. package/dist/cli/commands/contracts.js +352 -238
  26. package/dist/cli/commands/contracts.js.map +1 -1
  27. package/dist/cli/commands/create.js +32 -17
  28. package/dist/cli/commands/create.js.map +1 -1
  29. package/dist/cli/commands/dedupe-audit.js +46 -39
  30. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  31. package/dist/cli/commands/dedupe-merge.js +88 -69
  32. package/dist/cli/commands/dedupe-merge.js.map +1 -1
  33. package/dist/cli/commands/extension/doctor.js +56 -67
  34. package/dist/cli/commands/extension/doctor.js.map +1 -1
  35. package/dist/cli/commands/extension/shared.js +21 -15
  36. package/dist/cli/commands/extension/shared.js.map +1 -1
  37. package/dist/cli/commands/get.js +114 -81
  38. package/dist/cli/commands/get.js.map +1 -1
  39. package/dist/cli/commands/health.d.ts +17 -0
  40. package/dist/cli/commands/health.js +545 -417
  41. package/dist/cli/commands/health.js.map +1 -1
  42. package/dist/cli/commands/history-compact.js +209 -140
  43. package/dist/cli/commands/history-compact.js.map +1 -1
  44. package/dist/cli/commands/history-redact.js +162 -119
  45. package/dist/cli/commands/history-redact.js.map +1 -1
  46. package/dist/cli/commands/history-repair.js +120 -85
  47. package/dist/cli/commands/history-repair.js.map +1 -1
  48. package/dist/cli/commands/init-agent-guidance.js +32 -19
  49. package/dist/cli/commands/init-agent-guidance.js.map +1 -1
  50. package/dist/cli/commands/init.d.ts +8 -2
  51. package/dist/cli/commands/init.js +263 -162
  52. package/dist/cli/commands/init.js.map +1 -1
  53. package/dist/cli/commands/list.js +152 -102
  54. package/dist/cli/commands/list.js.map +1 -1
  55. package/dist/cli/commands/next.js +60 -40
  56. package/dist/cli/commands/next.js.map +1 -1
  57. package/dist/cli/commands/plan.js +373 -298
  58. package/dist/cli/commands/plan.js.map +1 -1
  59. package/dist/cli/commands/profile.js +23 -15
  60. package/dist/cli/commands/profile.js.map +1 -1
  61. package/dist/cli/commands/recurrence-parsers.js +43 -25
  62. package/dist/cli/commands/recurrence-parsers.js.map +1 -1
  63. package/dist/cli/commands/reindex.d.ts +21 -5
  64. package/dist/cli/commands/reindex.js +345 -205
  65. package/dist/cli/commands/reindex.js.map +1 -1
  66. package/dist/cli/commands/restore.d.ts +8 -7
  67. package/dist/cli/commands/restore.js +105 -69
  68. package/dist/cli/commands/restore.js.map +1 -1
  69. package/dist/cli/commands/schema.js +33 -30
  70. package/dist/cli/commands/schema.js.map +1 -1
  71. package/dist/cli/commands/search.d.ts +10 -2
  72. package/dist/cli/commands/search.js +503 -470
  73. package/dist/cli/commands/search.js.map +1 -1
  74. package/dist/cli/commands/telemetry.js +98 -87
  75. package/dist/cli/commands/telemetry.js.map +1 -1
  76. package/dist/cli/commands/test-all.js +237 -168
  77. package/dist/cli/commands/test-all.js.map +1 -1
  78. package/dist/cli/commands/test.d.ts +6 -5
  79. package/dist/cli/commands/test.js +424 -344
  80. package/dist/cli/commands/test.js.map +1 -1
  81. package/dist/cli/commands/update-many.js +57 -42
  82. package/dist/cli/commands/update-many.js.map +1 -1
  83. package/dist/cli/commands/update.d.ts +1 -1
  84. package/dist/cli/commands/update.js +738 -671
  85. package/dist/cli/commands/update.js.map +1 -1
  86. package/dist/cli/commands/validate.d.ts +20 -1
  87. package/dist/cli/commands/validate.js +478 -343
  88. package/dist/cli/commands/validate.js.map +1 -1
  89. package/dist/cli/error-guidance.js +406 -361
  90. package/dist/cli/error-guidance.js.map +1 -1
  91. package/dist/cli/extension-command-help.js +27 -19
  92. package/dist/cli/extension-command-help.js.map +1 -1
  93. package/dist/cli/help-json-payload.js +57 -49
  94. package/dist/cli/help-json-payload.js.map +1 -1
  95. package/dist/cli/main.d.ts +47 -0
  96. package/dist/cli/main.js +474 -371
  97. package/dist/cli/main.js.map +1 -1
  98. package/dist/cli/migration-gates.js +22 -45
  99. package/dist/cli/migration-gates.js.map +1 -1
  100. package/dist/cli/register-list-query.js +299 -310
  101. package/dist/cli/register-list-query.js.map +1 -1
  102. package/dist/cli/register-mutation.js +763 -779
  103. package/dist/cli/register-mutation.js.map +1 -1
  104. package/dist/cli/register-operations.js +386 -362
  105. package/dist/cli/register-operations.js.map +1 -1
  106. package/dist/cli/register-setup.js +120 -101
  107. package/dist/cli/register-setup.js.map +1 -1
  108. package/dist/cli/registration-helpers.d.ts +4 -0
  109. package/dist/cli/registration-helpers.js +45 -56
  110. package/dist/cli/registration-helpers.js.map +1 -1
  111. package/dist/cli-bundle/chunks/{activity-DBLQVIP6.js → activity-5YWLSPGE.js} +9 -9
  112. package/dist/cli-bundle/chunks/activity-BIML7K2D.js +16 -0
  113. package/dist/cli-bundle/chunks/{aggregate-SDF7DUOD.js → aggregate-2V2M3JZU.js} +107 -83
  114. package/dist/cli-bundle/chunks/{aggregate-SDF7DUOD.js.map → aggregate-2V2M3JZU.js.map} +2 -2
  115. package/dist/cli-bundle/chunks/{aggregate-JTEF4BP7.js → aggregate-EK7DXML7.js} +108 -84
  116. package/dist/cli-bundle/chunks/aggregate-EK7DXML7.js.map +1 -0
  117. package/dist/cli-bundle/chunks/{append-LOVPGVPT.js → append-EZESUVJT.js} +8 -8
  118. package/dist/cli-bundle/chunks/{append-QCFJSDFL.js → append-JFG4WQMG.js} +8 -8
  119. package/dist/cli-bundle/chunks/{chunk-TP5Q5ZD3.js → chunk-32IUNTG4.js} +158 -119
  120. package/dist/cli-bundle/chunks/chunk-32IUNTG4.js.map +1 -0
  121. package/dist/cli-bundle/chunks/{chunk-BHO33VBQ.js → chunk-3W2HJKJX.js} +3 -3
  122. package/dist/cli-bundle/chunks/{chunk-VARHOHYV.js → chunk-4EXFFP7T.js} +86 -52
  123. package/dist/cli-bundle/chunks/chunk-4EXFFP7T.js.map +7 -0
  124. package/dist/cli-bundle/chunks/{chunk-4DUVCVLZ.js → chunk-4PFVUUYV.js} +2 -2
  125. package/dist/cli-bundle/chunks/{chunk-JSU5P7VS.js → chunk-4WB6S4YX.js} +308 -184
  126. package/dist/cli-bundle/chunks/chunk-4WB6S4YX.js.map +1 -0
  127. package/dist/cli-bundle/chunks/{chunk-HXTQJXWT.js → chunk-572FKBRL.js} +61 -102
  128. package/dist/cli-bundle/chunks/chunk-572FKBRL.js.map +1 -0
  129. package/dist/cli-bundle/chunks/{chunk-IJYK2T43.js → chunk-5E7N4T2Z.js} +2 -2
  130. package/dist/cli-bundle/chunks/{chunk-NKZAN7BD.js → chunk-5IZUBZBR.js} +3 -3
  131. package/dist/cli-bundle/chunks/{chunk-NOLPZMSV.js → chunk-5JIWFWOZ.js} +2 -2
  132. package/dist/cli-bundle/chunks/{chunk-FFMQB7WR.js → chunk-67LARBDL.js} +493 -404
  133. package/dist/cli-bundle/chunks/chunk-67LARBDL.js.map +1 -0
  134. package/dist/cli-bundle/chunks/{chunk-6AQZPVHQ.js → chunk-6CDCWKSX.js} +4 -4
  135. package/dist/cli-bundle/chunks/{chunk-3K2M5OYU.js → chunk-6KRFL33E.js} +308 -184
  136. package/dist/cli-bundle/chunks/chunk-6KRFL33E.js.map +7 -0
  137. package/dist/cli-bundle/chunks/{chunk-LB6TP6MC.js → chunk-6NYJGMTY.js} +2 -2
  138. package/dist/cli-bundle/chunks/{chunk-SLMUGTK3.js → chunk-7CLLC75T.js} +4 -4
  139. package/dist/cli-bundle/chunks/{chunk-2466X6E4.js → chunk-7LYO6S5A.js} +8 -8
  140. package/dist/cli-bundle/chunks/{chunk-W4ULYO7Z.js → chunk-A3OQ7TFW.js} +8 -8
  141. package/dist/cli-bundle/chunks/{chunk-5CGRF3L5.js → chunk-AIKU3IIL.js} +153 -90
  142. package/dist/cli-bundle/chunks/chunk-AIKU3IIL.js.map +1 -0
  143. package/dist/cli-bundle/chunks/{chunk-WYDHYJPO.js → chunk-AJHYQCBJ.js} +39 -5
  144. package/dist/cli-bundle/chunks/chunk-AJHYQCBJ.js.map +7 -0
  145. package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js → chunk-B4O5S7I3.js} +79 -57
  146. package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js.map → chunk-B4O5S7I3.js.map} +2 -2
  147. package/dist/cli-bundle/chunks/{chunk-OTUHB4HS.js → chunk-BE2SR6QL.js} +92 -77
  148. package/dist/cli-bundle/chunks/chunk-BE2SR6QL.js.map +1 -0
  149. package/dist/cli-bundle/chunks/{chunk-JLM7BHI7.js → chunk-BI4R7HI2.js} +75 -53
  150. package/dist/cli-bundle/chunks/chunk-BI4R7HI2.js.map +7 -0
  151. package/dist/cli-bundle/chunks/{chunk-AXIDKKAT.js → chunk-CXR3CMBQ.js} +33 -6
  152. package/dist/cli-bundle/chunks/chunk-CXR3CMBQ.js.map +1 -0
  153. package/dist/cli-bundle/chunks/{chunk-ZETXE4SE.js → chunk-ECU6MMTQ.js} +713 -613
  154. package/dist/cli-bundle/chunks/chunk-ECU6MMTQ.js.map +1 -0
  155. package/dist/cli-bundle/chunks/{chunk-2D4HATP2.js → chunk-EJ2OCBHF.js} +54 -30
  156. package/dist/cli-bundle/chunks/chunk-EJ2OCBHF.js.map +1 -0
  157. package/dist/cli-bundle/chunks/{chunk-BDTISOSD.js → chunk-EQURFOMH.js} +41 -26
  158. package/dist/cli-bundle/chunks/chunk-EQURFOMH.js.map +7 -0
  159. package/dist/cli-bundle/chunks/{chunk-GJ326ZKX.js → chunk-ER4ME5U2.js} +3 -3
  160. package/dist/cli-bundle/chunks/{chunk-HZZEHPRG.js → chunk-ERG65A2L.js} +2 -2
  161. package/dist/cli-bundle/chunks/{chunk-IZBR4NRW.js → chunk-F6WNBITZ.js} +157 -113
  162. package/dist/cli-bundle/chunks/chunk-F6WNBITZ.js.map +7 -0
  163. package/dist/cli-bundle/chunks/{chunk-L5OEFZQG.js → chunk-FH2H3CBD.js} +3 -3
  164. package/dist/cli-bundle/chunks/{chunk-JPECA746.js → chunk-FUFFPIYA.js} +2 -2
  165. package/dist/cli-bundle/chunks/{chunk-CF7RL6FR.js → chunk-FZJM2TXF.js} +110 -73
  166. package/dist/cli-bundle/chunks/chunk-FZJM2TXF.js.map +1 -0
  167. package/dist/cli-bundle/chunks/{chunk-27BXPBAY.js → chunk-GUYNUXQT.js} +3 -3
  168. package/dist/cli-bundle/chunks/{chunk-MAUKX7JC.js → chunk-GVJE5T7Q.js} +2 -2
  169. package/dist/cli-bundle/chunks/{chunk-3J6JRJ3I.js → chunk-HB4FAT3O.js} +42 -60
  170. package/dist/cli-bundle/chunks/chunk-HB4FAT3O.js.map +7 -0
  171. package/dist/cli-bundle/chunks/{chunk-55SNVXRQ.js → chunk-HQAF23Q2.js} +626 -484
  172. package/dist/cli-bundle/chunks/chunk-HQAF23Q2.js.map +7 -0
  173. package/dist/cli-bundle/chunks/{chunk-ZRP4VG5U.js → chunk-JBZ2NTKX.js} +2 -2
  174. package/dist/cli-bundle/chunks/{chunk-RMMQ74TG.js → chunk-JPATY4SE.js} +54 -30
  175. package/dist/cli-bundle/chunks/chunk-JPATY4SE.js.map +7 -0
  176. package/dist/cli-bundle/chunks/{chunk-IPYBJWTE.js → chunk-K5DT2YKM.js} +109 -72
  177. package/dist/cli-bundle/chunks/chunk-K5DT2YKM.js.map +7 -0
  178. package/dist/cli-bundle/chunks/{chunk-EJUDVUYZ.js → chunk-KEZOIPCR.js} +3 -3
  179. package/dist/cli-bundle/chunks/{chunk-RVUALSJF.js → chunk-KHVGM5CS.js} +466 -365
  180. package/dist/cli-bundle/chunks/chunk-KHVGM5CS.js.map +7 -0
  181. package/dist/cli-bundle/chunks/{chunk-YITK2PJ6.js → chunk-KS6ATO47.js} +288 -175
  182. package/dist/cli-bundle/chunks/chunk-KS6ATO47.js.map +7 -0
  183. package/dist/cli-bundle/chunks/{chunk-7R4QEMZZ.js → chunk-L4SLHV6G.js} +463 -362
  184. package/dist/cli-bundle/chunks/chunk-L4SLHV6G.js.map +1 -0
  185. package/dist/cli-bundle/chunks/{chunk-RLDHZHQS.js → chunk-LBE5QFMZ.js} +158 -114
  186. package/dist/cli-bundle/chunks/chunk-LBE5QFMZ.js.map +1 -0
  187. package/dist/cli-bundle/chunks/{chunk-22WKIL3H.js → chunk-LCWQP6NM.js} +76 -54
  188. package/dist/cli-bundle/chunks/chunk-LCWQP6NM.js.map +1 -0
  189. package/dist/cli-bundle/chunks/{chunk-KNPEF7QG.js → chunk-LOWVNZBZ.js} +91 -76
  190. package/dist/cli-bundle/chunks/chunk-LOWVNZBZ.js.map +7 -0
  191. package/dist/cli-bundle/chunks/{chunk-HYTGA6GI.js → chunk-MDHWWBNZ.js} +3 -3
  192. package/dist/cli-bundle/chunks/{chunk-N74UMG5H.js → chunk-MEZZZBYX.js} +2 -2
  193. package/dist/cli-bundle/chunks/{chunk-V3NOKJF2.js → chunk-MHRS5FUX.js} +288 -175
  194. package/dist/cli-bundle/chunks/chunk-MHRS5FUX.js.map +1 -0
  195. package/dist/cli-bundle/chunks/{chunk-3XZCOZ5J.js → chunk-NOIEVOK5.js} +391 -313
  196. package/dist/cli-bundle/chunks/chunk-NOIEVOK5.js.map +1 -0
  197. package/dist/cli-bundle/chunks/{chunk-SDR5J34Q.js → chunk-NZ7QIUP5.js} +4 -4
  198. package/dist/cli-bundle/chunks/{chunk-UYUYDGIB.js → chunk-OGLGI22K.js} +115 -67
  199. package/dist/cli-bundle/chunks/{chunk-UYUYDGIB.js.map → chunk-OGLGI22K.js.map} +1 -1
  200. package/dist/cli-bundle/chunks/{chunk-DDPTYJIM.js → chunk-P5L7Z2O6.js} +2 -2
  201. package/dist/cli-bundle/chunks/{chunk-BZCEN4JA.js → chunk-PULUSQAV.js} +492 -403
  202. package/dist/cli-bundle/chunks/chunk-PULUSQAV.js.map +7 -0
  203. package/dist/cli-bundle/chunks/{chunk-3VGN2UWE.js → chunk-QCDTQCMW.js} +22 -30
  204. package/dist/cli-bundle/chunks/chunk-QCDTQCMW.js.map +1 -0
  205. package/dist/cli-bundle/chunks/{chunk-4A3BJ675.js → chunk-QNNQAAZ5.js} +24 -18
  206. package/dist/cli-bundle/chunks/{chunk-4A3BJ675.js.map → chunk-QNNQAAZ5.js.map} +1 -1
  207. package/dist/cli-bundle/chunks/{chunk-MDPEOIGN.js → chunk-RAHINBVP.js} +60 -101
  208. package/dist/cli-bundle/chunks/chunk-RAHINBVP.js.map +7 -0
  209. package/dist/cli-bundle/chunks/{chunk-CWFNTKQJ.js → chunk-RJH5VQHW.js} +43 -61
  210. package/dist/cli-bundle/chunks/chunk-RJH5VQHW.js.map +1 -0
  211. package/dist/cli-bundle/chunks/{chunk-OGXLACHC.js → chunk-SU2E4AWU.js} +6 -6
  212. package/dist/cli-bundle/chunks/{chunk-HPPFYYOV.js → chunk-SU3TB4NS.js} +2 -2
  213. package/dist/cli-bundle/chunks/{chunk-JWXRETDF.js → chunk-SYE6WMV6.js} +626 -484
  214. package/dist/cli-bundle/chunks/chunk-SYE6WMV6.js.map +1 -0
  215. package/dist/cli-bundle/chunks/{chunk-NWMZWYYB.js → chunk-T3P7PMZP.js} +42 -27
  216. package/dist/cli-bundle/chunks/chunk-T3P7PMZP.js.map +1 -0
  217. package/dist/cli-bundle/chunks/{chunk-G7I7DEZA.js → chunk-T4XBKJ3F.js} +4 -4
  218. package/dist/cli-bundle/chunks/{chunk-RH5ZBYFD.js → chunk-T6AXEBOP.js} +23 -17
  219. package/dist/cli-bundle/chunks/{chunk-RH5ZBYFD.js.map → chunk-T6AXEBOP.js.map} +2 -2
  220. package/dist/cli-bundle/chunks/{chunk-5QFDBI4F.js → chunk-TQ6AX5SQ.js} +58 -69
  221. package/dist/cli-bundle/chunks/{chunk-5QFDBI4F.js.map → chunk-TQ6AX5SQ.js.map} +2 -2
  222. package/dist/cli-bundle/chunks/{chunk-4XOIEKSD.js → chunk-U3S2B7TA.js} +86 -52
  223. package/dist/cli-bundle/chunks/chunk-U3S2B7TA.js.map +1 -0
  224. package/dist/cli-bundle/chunks/{chunk-VICZWYGZ.js → chunk-U5TR4N7J.js} +7 -7
  225. package/dist/cli-bundle/chunks/{chunk-EVMTBV6V.js → chunk-UMNQZS4H.js} +3 -3
  226. package/dist/cli-bundle/chunks/{chunk-A7FPBAQS.js → chunk-WJA3PXW7.js} +7 -7
  227. package/dist/cli-bundle/chunks/{chunk-RGEMWD6Q.js → chunk-WRYERRZX.js} +157 -118
  228. package/dist/cli-bundle/chunks/chunk-WRYERRZX.js.map +7 -0
  229. package/dist/cli-bundle/chunks/{chunk-NUHHPVVS.js → chunk-WYOIIFSE.js} +712 -612
  230. package/dist/cli-bundle/chunks/chunk-WYOIIFSE.js.map +7 -0
  231. package/dist/cli-bundle/chunks/{chunk-4DSGXSBL.js → chunk-XRYSCRZR.js} +116 -68
  232. package/dist/cli-bundle/chunks/{chunk-4DSGXSBL.js.map → chunk-XRYSCRZR.js.map} +3 -3
  233. package/dist/cli-bundle/chunks/{chunk-NU2UEROZ.js → chunk-YF746GTH.js} +59 -70
  234. package/dist/cli-bundle/chunks/{chunk-NU2UEROZ.js.map → chunk-YF746GTH.js.map} +1 -1
  235. package/dist/cli-bundle/chunks/{chunk-JMP4E6D7.js → chunk-YPWUSH72.js} +390 -312
  236. package/dist/cli-bundle/chunks/{chunk-JMP4E6D7.js.map → chunk-YPWUSH72.js.map} +2 -2
  237. package/dist/cli-bundle/chunks/{chunk-QCWF6IYD.js → chunk-YSDFIY7N.js} +3 -3
  238. package/dist/cli-bundle/chunks/{chunk-UZIWVBE6.js → chunk-YSGTMDWC.js} +2 -2
  239. package/dist/cli-bundle/chunks/{chunk-NFDPYAIP.js → chunk-YVKZ3ANP.js} +21 -29
  240. package/dist/cli-bundle/chunks/chunk-YVKZ3ANP.js.map +7 -0
  241. package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js → chunk-Z4DGFQDH.js} +80 -58
  242. package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js.map → chunk-Z4DGFQDH.js.map} +1 -1
  243. package/dist/cli-bundle/chunks/{chunk-64HNBBFQ.js → chunk-Z5F6XZXE.js} +6 -6
  244. package/dist/cli-bundle/chunks/{chunk-AVEE5EHK.js → chunk-Z7RPDF2Y.js} +3 -3
  245. package/dist/cli-bundle/chunks/{chunk-3S2KT7NG.js → chunk-ZFTKYWIF.js} +152 -89
  246. package/dist/cli-bundle/chunks/chunk-ZFTKYWIF.js.map +7 -0
  247. package/dist/cli-bundle/chunks/{claim-T3GCKV7C.js → claim-2BGBGSVI.js} +8 -8
  248. package/dist/cli-bundle/chunks/{claim-EMQLYPRW.js → claim-5GU7OE67.js} +8 -8
  249. package/dist/cli-bundle/chunks/close-6YODBUIV.js +14 -0
  250. package/dist/cli-bundle/chunks/{close-TQYAAFJP.js → close-AFVKPR57.js} +7 -7
  251. package/dist/cli-bundle/chunks/{close-many-BG5QQIDQ.js → close-many-7KLOSYLP.js} +186 -122
  252. package/dist/cli-bundle/chunks/close-many-7KLOSYLP.js.map +7 -0
  253. package/dist/cli-bundle/chunks/{close-many-LDRVEQY2.js → close-many-JKUJMHLG.js} +187 -123
  254. package/dist/cli-bundle/chunks/close-many-JKUJMHLG.js.map +1 -0
  255. package/dist/cli-bundle/chunks/{comments-YUXJRZPQ.js → comments-DNWHEBOS.js} +9 -9
  256. package/dist/cli-bundle/chunks/{comments-QCKR2YY2.js → comments-RW23R3VE.js} +9 -9
  257. package/dist/cli-bundle/chunks/config-AUM5WBYA.js +1072 -0
  258. package/dist/cli-bundle/chunks/config-AUM5WBYA.js.map +7 -0
  259. package/dist/cli-bundle/chunks/config-OZWSA2NP.js +1062 -0
  260. package/dist/cli-bundle/chunks/config-OZWSA2NP.js.map +1 -0
  261. package/dist/cli-bundle/chunks/{context-B6275WPX.js → context-OYXRGY7S.js} +12 -12
  262. package/dist/cli-bundle/chunks/{context-OCZ3FJ4Z.js → context-PKCEHQY3.js} +12 -12
  263. package/dist/cli-bundle/chunks/{contracts-HN7ABKLP.js → contracts-L6ODXNUM.js} +320 -199
  264. package/dist/cli-bundle/chunks/contracts-L6ODXNUM.js.map +7 -0
  265. package/dist/cli-bundle/chunks/{contracts-W4FZVVD6.js → contracts-X74F2GSM.js} +321 -200
  266. package/dist/cli-bundle/chunks/contracts-X74F2GSM.js.map +1 -0
  267. package/dist/cli-bundle/chunks/{copy-DEM4DATS.js → copy-6XOR3HKN.js} +5 -5
  268. package/dist/cli-bundle/chunks/{copy-BTJOSKKT.js → copy-I4NCLBR4.js} +5 -5
  269. package/dist/cli-bundle/chunks/{create-RLRJMRTM.js → create-PM45M6PE.js} +12 -12
  270. package/dist/cli-bundle/chunks/create-Z7YCH3BE.js +28 -0
  271. package/dist/cli-bundle/chunks/{delete-BHK7VB2Z.js → delete-7YXHYG67.js} +5 -5
  272. package/dist/cli-bundle/chunks/{delete-LSVHAB4Y.js → delete-LPISP43T.js} +5 -5
  273. package/dist/cli-bundle/chunks/{deps-XHYXWEPT.js → deps-N2T26FME.js} +5 -5
  274. package/dist/cli-bundle/chunks/{deps-4UDFJRUA.js → deps-WATKQDE3.js} +5 -5
  275. package/dist/cli-bundle/chunks/{docs-GYZNVS26.js → docs-6LQ3GLM7.js} +7 -7
  276. package/dist/cli-bundle/chunks/{docs-26S44RXU.js → docs-Z3X6JZLT.js} +7 -7
  277. package/dist/cli-bundle/chunks/{eval-UYF3ZPVO.js → eval-6DCLG52D.js} +10 -10
  278. package/dist/cli-bundle/chunks/{eval-PGRVIJQU.js → eval-Y3ZCUTHK.js} +10 -10
  279. package/dist/cli-bundle/chunks/{extension-CPSLJQVE.js → extension-BNINIMT7.js} +11 -11
  280. package/dist/cli-bundle/chunks/{extension-CXJ6RELI.js → extension-QWE4YYK5.js} +11 -11
  281. package/dist/cli-bundle/chunks/{files-NQHEXUZD.js → files-6SGKHS6O.js} +7 -7
  282. package/dist/cli-bundle/chunks/{files-MBNICQFM.js → files-FUYPSOFJ.js} +7 -7
  283. package/dist/cli-bundle/chunks/{focus-DWYIG7GU.js → focus-2Q3K76G2.js} +6 -6
  284. package/dist/cli-bundle/chunks/{focus-XZW5423D.js → focus-ATLBWXXD.js} +6 -6
  285. package/dist/cli-bundle/chunks/{gc-LPVMKJQJ.js → gc-RUYEMNRF.js} +3 -3
  286. package/dist/cli-bundle/chunks/{gc-7GQYOS2G.js → gc-TDWSDR66.js} +3 -3
  287. package/dist/cli-bundle/chunks/{get-A7MAOHCU.js → get-2WGLX74N.js} +120 -80
  288. package/dist/cli-bundle/chunks/get-2WGLX74N.js.map +7 -0
  289. package/dist/cli-bundle/chunks/{get-DSDEKJ3L.js → get-LY6M2JIM.js} +121 -81
  290. package/dist/cli-bundle/chunks/get-LY6M2JIM.js.map +1 -0
  291. package/dist/cli-bundle/chunks/{health-3IPFLKXB.js → health-4RKHYS3T.js} +535 -371
  292. package/dist/cli-bundle/chunks/health-4RKHYS3T.js.map +1 -0
  293. package/dist/cli-bundle/chunks/{health-GZXGBZ36.js → health-TMFVNYRA.js} +534 -370
  294. package/dist/cli-bundle/chunks/health-TMFVNYRA.js.map +7 -0
  295. package/dist/cli-bundle/chunks/history-CGNQJXFE.js +18 -0
  296. package/dist/cli-bundle/chunks/{history-NERDJNUB.js → history-SGRRS72R.js} +8 -8
  297. package/dist/cli-bundle/chunks/{history-compact-2WRZ2WK4.js → history-compact-LOED43R3.js} +213 -134
  298. package/dist/cli-bundle/chunks/history-compact-LOED43R3.js.map +7 -0
  299. package/dist/cli-bundle/chunks/{history-compact-HR7BB4LR.js → history-compact-V5DNAQHH.js} +214 -135
  300. package/dist/cli-bundle/chunks/history-compact-V5DNAQHH.js.map +1 -0
  301. package/dist/cli-bundle/chunks/{history-redact-O3NBCNWC.js → history-redact-IRL7WJ3E.js} +9 -9
  302. package/dist/cli-bundle/chunks/history-redact-N3JK7VBW.js +19 -0
  303. package/dist/cli-bundle/chunks/{history-repair-XA3LC4GA.js → history-repair-4WVBVHFR.js} +124 -84
  304. package/dist/cli-bundle/chunks/history-repair-4WVBVHFR.js.map +1 -0
  305. package/dist/cli-bundle/chunks/{history-repair-LCMOS45X.js → history-repair-PGYQJMGD.js} +123 -83
  306. package/dist/cli-bundle/chunks/history-repair-PGYQJMGD.js.map +7 -0
  307. package/dist/cli-bundle/chunks/{init-64XDLQJB.js → init-4GESW7RM.js} +12 -12
  308. package/dist/cli-bundle/chunks/init-XIDPABA4.js +22 -0
  309. package/dist/cli-bundle/chunks/{learnings-LPKCSJX7.js → learnings-4BHWFFUV.js} +9 -9
  310. package/dist/cli-bundle/chunks/{learnings-JR6MA5TI.js → learnings-4FJY7WIW.js} +9 -9
  311. package/dist/cli-bundle/chunks/{list-G5Y65VF6.js → list-472TIOVK.js} +8 -8
  312. package/dist/cli-bundle/chunks/{list-DNBJVO3E.js → list-D7BF5CL2.js} +8 -8
  313. package/dist/cli-bundle/chunks/{next-FYTQF6HG.js → next-D5STGWI2.js} +71 -46
  314. package/dist/cli-bundle/chunks/next-D5STGWI2.js.map +1 -0
  315. package/dist/cli-bundle/chunks/{next-BCERKDUR.js → next-SFQZVX2B.js} +70 -45
  316. package/dist/cli-bundle/chunks/next-SFQZVX2B.js.map +7 -0
  317. package/dist/cli-bundle/chunks/{notes-2BMU3VVQ.js → notes-6KNOSLIT.js} +9 -9
  318. package/dist/cli-bundle/chunks/{notes-6KTGO2OJ.js → notes-W4UEICGF.js} +9 -9
  319. package/dist/cli-bundle/chunks/{plan-RKZHQVXR.js → plan-JO6V7BXO.js} +373 -279
  320. package/dist/cli-bundle/chunks/plan-JO6V7BXO.js.map +1 -0
  321. package/dist/cli-bundle/chunks/{plan-4WXEQCTN.js → plan-MJQW5XK3.js} +372 -278
  322. package/dist/cli-bundle/chunks/plan-MJQW5XK3.js.map +7 -0
  323. package/dist/cli-bundle/chunks/{profile-4OMM32CD.js → profile-3TOTMUR4.js} +27 -19
  324. package/dist/cli-bundle/chunks/profile-3TOTMUR4.js.map +7 -0
  325. package/dist/cli-bundle/chunks/{profile-QLER5ENE.js → profile-WIQY2KCV.js} +28 -20
  326. package/dist/cli-bundle/chunks/profile-WIQY2KCV.js.map +1 -0
  327. package/dist/cli-bundle/chunks/register-list-query-ELBHCCFI.js +416 -0
  328. package/dist/cli-bundle/chunks/register-list-query-ELBHCCFI.js.map +7 -0
  329. package/dist/cli-bundle/chunks/register-list-query-GAPQ6DM3.js +406 -0
  330. package/dist/cli-bundle/chunks/register-list-query-GAPQ6DM3.js.map +1 -0
  331. package/dist/cli-bundle/chunks/{register-mutation-KK7PHYYU.js → register-mutation-ROFE2YPC.js} +729 -702
  332. package/dist/cli-bundle/chunks/register-mutation-ROFE2YPC.js.map +7 -0
  333. package/dist/cli-bundle/chunks/{register-mutation-ENNDUAZG.js → register-mutation-SJWMVIJ2.js} +730 -703
  334. package/dist/cli-bundle/chunks/register-mutation-SJWMVIJ2.js.map +1 -0
  335. package/dist/cli-bundle/chunks/{register-operations-HZ6XERQG.js → register-operations-IADFVH53.js} +389 -365
  336. package/dist/cli-bundle/chunks/register-operations-IADFVH53.js.map +7 -0
  337. package/dist/cli-bundle/chunks/register-operations-MEKU3AKC.js +510 -0
  338. package/dist/cli-bundle/chunks/register-operations-MEKU3AKC.js.map +1 -0
  339. package/dist/cli-bundle/chunks/{register-setup-ZKJ53RS7.js → register-setup-3QJY43CY.js} +128 -103
  340. package/dist/cli-bundle/chunks/register-setup-3QJY43CY.js.map +7 -0
  341. package/dist/cli-bundle/chunks/{register-setup-P67EMBDJ.js → register-setup-AJWUSSQX.js} +129 -104
  342. package/dist/cli-bundle/chunks/register-setup-AJWUSSQX.js.map +1 -0
  343. package/dist/cli-bundle/chunks/{restore-4MHZFJ2E.js → restore-44IHMMZZ.js} +9 -9
  344. package/dist/cli-bundle/chunks/restore-EXHU34EU.js +17 -0
  345. package/dist/cli-bundle/chunks/{scheduling-shortcuts-LB6DOLRL.js → scheduling-shortcuts-OLHNLAZY.js} +12 -12
  346. package/dist/cli-bundle/chunks/{scheduling-shortcuts-UTOYKLXQ.js → scheduling-shortcuts-TSBK4AY5.js} +12 -12
  347. package/dist/cli-bundle/chunks/{schema-73HR2OJW.js → schema-IB2NZZWD.js} +7 -7
  348. package/dist/cli-bundle/chunks/{schema-U6LJKSIR.js → schema-VBCELP5G.js} +7 -7
  349. package/dist/cli-bundle/chunks/{search-AXPXKZER.js → search-7UBETML4.js} +10 -10
  350. package/dist/cli-bundle/chunks/{search-KILGT37L.js → search-R227JOL6.js} +10 -10
  351. package/dist/cli-bundle/chunks/{stats-W5KNVJWQ.js → stats-FAG7COEH.js} +6 -6
  352. package/dist/cli-bundle/chunks/{stats-PSYVVTNZ.js → stats-MCK7PLYS.js} +6 -6
  353. package/dist/cli-bundle/chunks/{telemetry-GAHHQTOS.js → telemetry-DRPDZMAO.js} +84 -70
  354. package/dist/cli-bundle/chunks/telemetry-DRPDZMAO.js.map +7 -0
  355. package/dist/cli-bundle/chunks/{telemetry-BZUF6H7G.js → telemetry-GVVUQSJQ.js} +85 -71
  356. package/dist/cli-bundle/chunks/telemetry-GVVUQSJQ.js.map +1 -0
  357. package/dist/cli-bundle/chunks/{test-PWDIZ255.js → test-QY44WAMR.js} +15 -15
  358. package/dist/cli-bundle/chunks/{test-ACD52Z3S.js → test-SY76DZTO.js} +15 -15
  359. package/dist/cli-bundle/chunks/test-all-QD6QAEG7.js +430 -0
  360. package/dist/cli-bundle/chunks/test-all-QD6QAEG7.js.map +7 -0
  361. package/dist/cli-bundle/chunks/test-all-USPJHXFR.js +427 -0
  362. package/dist/cli-bundle/chunks/test-all-USPJHXFR.js.map +1 -0
  363. package/dist/cli-bundle/chunks/{test-runs-UXIXPDKU.js → test-runs-MG5VIGSK.js} +185 -147
  364. package/dist/cli-bundle/chunks/test-runs-MG5VIGSK.js.map +1 -0
  365. package/dist/cli-bundle/chunks/{test-runs-PLRAZEFW.js → test-runs-QIR5MJPL.js} +184 -146
  366. package/dist/cli-bundle/chunks/test-runs-QIR5MJPL.js.map +7 -0
  367. package/dist/cli-bundle/chunks/update-A7EICML6.js +24 -0
  368. package/dist/cli-bundle/chunks/{update-KFX2SIAC.js → update-IKJZWLQC.js} +15 -15
  369. package/dist/cli-bundle/chunks/{update-many-RNSBX2TA.js → update-many-BEMTDA2X.js} +84 -69
  370. package/dist/cli-bundle/chunks/{update-many-RNSBX2TA.js.map → update-many-BEMTDA2X.js.map} +1 -1
  371. package/dist/cli-bundle/chunks/{update-many-Z5GJS5LC.js → update-many-RATAARHU.js} +83 -68
  372. package/dist/cli-bundle/chunks/{update-many-Z5GJS5LC.js.map → update-many-RATAARHU.js.map} +2 -2
  373. package/dist/cli-bundle/chunks/{upgrade-BRL6KCOJ.js → upgrade-NWMR3VQL.js} +11 -11
  374. package/dist/cli-bundle/chunks/{upgrade-HAK6JG2O.js → upgrade-VU46BLJZ.js} +11 -11
  375. package/dist/cli-bundle/chunks/{validate-X5W76YJL.js → validate-GAJ6FUSI.js} +451 -321
  376. package/dist/cli-bundle/chunks/validate-GAJ6FUSI.js.map +1 -0
  377. package/dist/cli-bundle/chunks/{validate-MTUVL5VC.js → validate-NRY6MFXN.js} +450 -320
  378. package/dist/cli-bundle/chunks/validate-NRY6MFXN.js.map +7 -0
  379. package/dist/cli-bundle/main.js +1107 -916
  380. package/dist/cli-bundle/main.js.map +3 -3
  381. package/dist/core/config/nested-settings.js +89 -67
  382. package/dist/core/config/nested-settings.js.map +1 -1
  383. package/dist/core/governance/metadata-coverage.js +20 -28
  384. package/dist/core/governance/metadata-coverage.js.map +1 -1
  385. package/dist/core/history/drift-scan.js +93 -81
  386. package/dist/core/history/drift-scan.js.map +1 -1
  387. package/dist/core/item/item-type-definition.js +14 -14
  388. package/dist/core/item/item-type-definition.js.map +1 -1
  389. package/dist/core/item/type-registry.js +114 -99
  390. package/dist/core/item/type-registry.js.map +1 -1
  391. package/dist/core/output/mutation-projection.js +42 -26
  392. package/dist/core/output/mutation-projection.js.map +1 -1
  393. package/dist/core/schema/runtime-schema.js +97 -80
  394. package/dist/core/schema/runtime-schema.js.map +1 -1
  395. package/dist/core/schema/status-defs-file.js +26 -3
  396. package/dist/core/schema/status-defs-file.js.map +1 -1
  397. package/dist/core/search/corpus.js +25 -19
  398. package/dist/core/search/corpus.js.map +1 -1
  399. package/dist/core/search/semantic-defaults.js +64 -37
  400. package/dist/core/search/semantic-defaults.js.map +1 -1
  401. package/dist/core/search/vector-stores.js +32 -17
  402. package/dist/core/search/vector-stores.js.map +1 -1
  403. package/dist/core/sentry/helpers.js +31 -28
  404. package/dist/core/sentry/helpers.js.map +1 -1
  405. package/dist/core/sentry/instrument.js +54 -43
  406. package/dist/core/sentry/instrument.js.map +1 -1
  407. package/dist/core/shared/memo.d.ts +12 -0
  408. package/dist/core/shared/memo.js +25 -0
  409. package/dist/core/shared/memo.js.map +1 -0
  410. package/dist/core/shared/serialization.js +24 -14
  411. package/dist/core/shared/serialization.js.map +1 -1
  412. package/dist/core/shared/time.js +26 -4
  413. package/dist/core/shared/time.js.map +1 -1
  414. package/dist/core/store/front-matter-cache.d.ts +5 -0
  415. package/dist/core/store/front-matter-cache.js +316 -171
  416. package/dist/core/store/front-matter-cache.js.map +1 -1
  417. package/dist/core/store/item-store.js +33 -26
  418. package/dist/core/store/item-store.js.map +1 -1
  419. package/dist/core/store/settings.js +247 -203
  420. package/dist/core/store/settings.js.map +1 -1
  421. package/dist/core/test/background-runs.js +189 -160
  422. package/dist/core/test/background-runs.js.map +1 -1
  423. package/dist/sdk/cli-contracts/flag-contracts.js +71 -99
  424. package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
  425. package/dist/sdk/compose.js +51 -42
  426. package/dist/sdk/compose.js.map +1 -1
  427. package/docs/AGENT_GUIDE.md +2 -2
  428. package/docs/ARCHITECTURE.md +2 -2
  429. package/docs/COMMANDS.md +8 -4
  430. package/docs/CONFIGURATION.md +1 -1
  431. package/docs/EXTENSIONS.md +12 -12
  432. package/docs/ONBOARDING.md +4 -2
  433. package/docs/README.md +2 -0
  434. package/docs/examples/starter-extension/README.md +11 -10
  435. package/marketplace.json +3 -3
  436. package/package.json +2 -2
  437. package/packages/pm-beads/extensions/beads/runtime.ts +240 -167
  438. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +65 -58
  439. package/packages/pm-todos/extensions/todos/runtime.ts +65 -42
  440. package/plugins/pm-claude/.claude-plugin/plugin.json +2 -2
  441. package/plugins/pm-claude/README.md +6 -3
  442. package/plugins/pm-claude/commands/pm-init.md +1 -1
  443. package/dist/cli-bundle/chunks/activity-AW6XVFH6.js +0 -16
  444. package/dist/cli-bundle/chunks/aggregate-JTEF4BP7.js.map +0 -1
  445. package/dist/cli-bundle/chunks/chunk-22WKIL3H.js.map +0 -1
  446. package/dist/cli-bundle/chunks/chunk-2D4HATP2.js.map +0 -1
  447. package/dist/cli-bundle/chunks/chunk-3J6JRJ3I.js.map +0 -7
  448. package/dist/cli-bundle/chunks/chunk-3K2M5OYU.js.map +0 -7
  449. package/dist/cli-bundle/chunks/chunk-3S2KT7NG.js.map +0 -7
  450. package/dist/cli-bundle/chunks/chunk-3VGN2UWE.js.map +0 -1
  451. package/dist/cli-bundle/chunks/chunk-3XZCOZ5J.js.map +0 -1
  452. package/dist/cli-bundle/chunks/chunk-4XOIEKSD.js.map +0 -1
  453. package/dist/cli-bundle/chunks/chunk-55SNVXRQ.js.map +0 -7
  454. package/dist/cli-bundle/chunks/chunk-5CGRF3L5.js.map +0 -1
  455. package/dist/cli-bundle/chunks/chunk-7R4QEMZZ.js.map +0 -1
  456. package/dist/cli-bundle/chunks/chunk-AXIDKKAT.js.map +0 -1
  457. package/dist/cli-bundle/chunks/chunk-BDTISOSD.js.map +0 -7
  458. package/dist/cli-bundle/chunks/chunk-BZCEN4JA.js.map +0 -7
  459. package/dist/cli-bundle/chunks/chunk-CF7RL6FR.js.map +0 -1
  460. package/dist/cli-bundle/chunks/chunk-CWFNTKQJ.js.map +0 -1
  461. package/dist/cli-bundle/chunks/chunk-FFMQB7WR.js.map +0 -1
  462. package/dist/cli-bundle/chunks/chunk-HXTQJXWT.js.map +0 -1
  463. package/dist/cli-bundle/chunks/chunk-IPYBJWTE.js.map +0 -7
  464. package/dist/cli-bundle/chunks/chunk-IZBR4NRW.js.map +0 -7
  465. package/dist/cli-bundle/chunks/chunk-JLM7BHI7.js.map +0 -7
  466. package/dist/cli-bundle/chunks/chunk-JSU5P7VS.js.map +0 -1
  467. package/dist/cli-bundle/chunks/chunk-JWXRETDF.js.map +0 -1
  468. package/dist/cli-bundle/chunks/chunk-KNPEF7QG.js.map +0 -7
  469. package/dist/cli-bundle/chunks/chunk-MDPEOIGN.js.map +0 -7
  470. package/dist/cli-bundle/chunks/chunk-NFDPYAIP.js.map +0 -7
  471. package/dist/cli-bundle/chunks/chunk-NUHHPVVS.js.map +0 -7
  472. package/dist/cli-bundle/chunks/chunk-NWMZWYYB.js.map +0 -1
  473. package/dist/cli-bundle/chunks/chunk-OTUHB4HS.js.map +0 -1
  474. package/dist/cli-bundle/chunks/chunk-RGEMWD6Q.js.map +0 -7
  475. package/dist/cli-bundle/chunks/chunk-RLDHZHQS.js.map +0 -1
  476. package/dist/cli-bundle/chunks/chunk-RMMQ74TG.js.map +0 -7
  477. package/dist/cli-bundle/chunks/chunk-RVUALSJF.js.map +0 -7
  478. package/dist/cli-bundle/chunks/chunk-TP5Q5ZD3.js.map +0 -1
  479. package/dist/cli-bundle/chunks/chunk-V3NOKJF2.js.map +0 -1
  480. package/dist/cli-bundle/chunks/chunk-VARHOHYV.js.map +0 -7
  481. package/dist/cli-bundle/chunks/chunk-WYDHYJPO.js.map +0 -7
  482. package/dist/cli-bundle/chunks/chunk-YITK2PJ6.js.map +0 -7
  483. package/dist/cli-bundle/chunks/chunk-ZETXE4SE.js.map +0 -1
  484. package/dist/cli-bundle/chunks/close-E6ZZGCJY.js +0 -14
  485. package/dist/cli-bundle/chunks/close-many-BG5QQIDQ.js.map +0 -7
  486. package/dist/cli-bundle/chunks/close-many-LDRVEQY2.js.map +0 -1
  487. package/dist/cli-bundle/chunks/config-DMSU64QO.js +0 -1541
  488. package/dist/cli-bundle/chunks/config-DMSU64QO.js.map +0 -7
  489. package/dist/cli-bundle/chunks/config-QH2DICD6.js +0 -1531
  490. package/dist/cli-bundle/chunks/config-QH2DICD6.js.map +0 -1
  491. package/dist/cli-bundle/chunks/contracts-HN7ABKLP.js.map +0 -7
  492. package/dist/cli-bundle/chunks/contracts-W4FZVVD6.js.map +0 -1
  493. package/dist/cli-bundle/chunks/create-OH3BDGBB.js +0 -28
  494. package/dist/cli-bundle/chunks/get-A7MAOHCU.js.map +0 -7
  495. package/dist/cli-bundle/chunks/get-DSDEKJ3L.js.map +0 -1
  496. package/dist/cli-bundle/chunks/health-3IPFLKXB.js.map +0 -1
  497. package/dist/cli-bundle/chunks/health-GZXGBZ36.js.map +0 -7
  498. package/dist/cli-bundle/chunks/history-WSZHY3PN.js +0 -18
  499. package/dist/cli-bundle/chunks/history-compact-2WRZ2WK4.js.map +0 -7
  500. package/dist/cli-bundle/chunks/history-compact-HR7BB4LR.js.map +0 -1
  501. package/dist/cli-bundle/chunks/history-redact-MP6CH7U5.js +0 -19
  502. package/dist/cli-bundle/chunks/history-repair-LCMOS45X.js.map +0 -7
  503. package/dist/cli-bundle/chunks/history-repair-XA3LC4GA.js.map +0 -1
  504. package/dist/cli-bundle/chunks/init-PAX32BJA.js +0 -22
  505. package/dist/cli-bundle/chunks/next-BCERKDUR.js.map +0 -7
  506. package/dist/cli-bundle/chunks/next-FYTQF6HG.js.map +0 -1
  507. package/dist/cli-bundle/chunks/plan-4WXEQCTN.js.map +0 -7
  508. package/dist/cli-bundle/chunks/plan-RKZHQVXR.js.map +0 -1
  509. package/dist/cli-bundle/chunks/profile-4OMM32CD.js.map +0 -7
  510. package/dist/cli-bundle/chunks/profile-QLER5ENE.js.map +0 -1
  511. package/dist/cli-bundle/chunks/register-list-query-7LV46VAU.js +0 -400
  512. package/dist/cli-bundle/chunks/register-list-query-7LV46VAU.js.map +0 -1
  513. package/dist/cli-bundle/chunks/register-list-query-SNG5PGA4.js +0 -410
  514. package/dist/cli-bundle/chunks/register-list-query-SNG5PGA4.js.map +0 -7
  515. package/dist/cli-bundle/chunks/register-mutation-ENNDUAZG.js.map +0 -1
  516. package/dist/cli-bundle/chunks/register-mutation-KK7PHYYU.js.map +0 -7
  517. package/dist/cli-bundle/chunks/register-operations-C6OWLDSH.js +0 -486
  518. package/dist/cli-bundle/chunks/register-operations-C6OWLDSH.js.map +0 -1
  519. package/dist/cli-bundle/chunks/register-operations-HZ6XERQG.js.map +0 -7
  520. package/dist/cli-bundle/chunks/register-setup-P67EMBDJ.js.map +0 -1
  521. package/dist/cli-bundle/chunks/register-setup-ZKJ53RS7.js.map +0 -7
  522. package/dist/cli-bundle/chunks/restore-YALDGTQR.js +0 -17
  523. package/dist/cli-bundle/chunks/telemetry-BZUF6H7G.js.map +0 -1
  524. package/dist/cli-bundle/chunks/telemetry-GAHHQTOS.js.map +0 -7
  525. package/dist/cli-bundle/chunks/test-all-L2MDDUCA.js +0 -358
  526. package/dist/cli-bundle/chunks/test-all-L2MDDUCA.js.map +0 -1
  527. package/dist/cli-bundle/chunks/test-all-RBZ6DLU2.js +0 -361
  528. package/dist/cli-bundle/chunks/test-all-RBZ6DLU2.js.map +0 -7
  529. package/dist/cli-bundle/chunks/test-runs-PLRAZEFW.js.map +0 -7
  530. package/dist/cli-bundle/chunks/test-runs-UXIXPDKU.js.map +0 -1
  531. package/dist/cli-bundle/chunks/update-AMRSOIWP.js +0 -24
  532. package/dist/cli-bundle/chunks/validate-MTUVL5VC.js.map +0 -7
  533. package/dist/cli-bundle/chunks/validate-X5W76YJL.js.map +0 -1
  534. /package/dist/cli-bundle/chunks/{activity-DBLQVIP6.js.map → activity-5YWLSPGE.js.map} +0 -0
  535. /package/dist/cli-bundle/chunks/{activity-AW6XVFH6.js.map → activity-BIML7K2D.js.map} +0 -0
  536. /package/dist/cli-bundle/chunks/{append-LOVPGVPT.js.map → append-EZESUVJT.js.map} +0 -0
  537. /package/dist/cli-bundle/chunks/{append-QCFJSDFL.js.map → append-JFG4WQMG.js.map} +0 -0
  538. /package/dist/cli-bundle/chunks/{chunk-BHO33VBQ.js.map → chunk-3W2HJKJX.js.map} +0 -0
  539. /package/dist/cli-bundle/chunks/{chunk-4DUVCVLZ.js.map → chunk-4PFVUUYV.js.map} +0 -0
  540. /package/dist/cli-bundle/chunks/{chunk-IJYK2T43.js.map → chunk-5E7N4T2Z.js.map} +0 -0
  541. /package/dist/cli-bundle/chunks/{chunk-NKZAN7BD.js.map → chunk-5IZUBZBR.js.map} +0 -0
  542. /package/dist/cli-bundle/chunks/{chunk-NOLPZMSV.js.map → chunk-5JIWFWOZ.js.map} +0 -0
  543. /package/dist/cli-bundle/chunks/{chunk-6AQZPVHQ.js.map → chunk-6CDCWKSX.js.map} +0 -0
  544. /package/dist/cli-bundle/chunks/{chunk-LB6TP6MC.js.map → chunk-6NYJGMTY.js.map} +0 -0
  545. /package/dist/cli-bundle/chunks/{chunk-SLMUGTK3.js.map → chunk-7CLLC75T.js.map} +0 -0
  546. /package/dist/cli-bundle/chunks/{chunk-2466X6E4.js.map → chunk-7LYO6S5A.js.map} +0 -0
  547. /package/dist/cli-bundle/chunks/{chunk-W4ULYO7Z.js.map → chunk-A3OQ7TFW.js.map} +0 -0
  548. /package/dist/cli-bundle/chunks/{chunk-GJ326ZKX.js.map → chunk-ER4ME5U2.js.map} +0 -0
  549. /package/dist/cli-bundle/chunks/{chunk-HZZEHPRG.js.map → chunk-ERG65A2L.js.map} +0 -0
  550. /package/dist/cli-bundle/chunks/{chunk-L5OEFZQG.js.map → chunk-FH2H3CBD.js.map} +0 -0
  551. /package/dist/cli-bundle/chunks/{chunk-JPECA746.js.map → chunk-FUFFPIYA.js.map} +0 -0
  552. /package/dist/cli-bundle/chunks/{chunk-27BXPBAY.js.map → chunk-GUYNUXQT.js.map} +0 -0
  553. /package/dist/cli-bundle/chunks/{chunk-MAUKX7JC.js.map → chunk-GVJE5T7Q.js.map} +0 -0
  554. /package/dist/cli-bundle/chunks/{chunk-ZRP4VG5U.js.map → chunk-JBZ2NTKX.js.map} +0 -0
  555. /package/dist/cli-bundle/chunks/{chunk-EJUDVUYZ.js.map → chunk-KEZOIPCR.js.map} +0 -0
  556. /package/dist/cli-bundle/chunks/{chunk-HYTGA6GI.js.map → chunk-MDHWWBNZ.js.map} +0 -0
  557. /package/dist/cli-bundle/chunks/{chunk-N74UMG5H.js.map → chunk-MEZZZBYX.js.map} +0 -0
  558. /package/dist/cli-bundle/chunks/{chunk-SDR5J34Q.js.map → chunk-NZ7QIUP5.js.map} +0 -0
  559. /package/dist/cli-bundle/chunks/{chunk-DDPTYJIM.js.map → chunk-P5L7Z2O6.js.map} +0 -0
  560. /package/dist/cli-bundle/chunks/{chunk-OGXLACHC.js.map → chunk-SU2E4AWU.js.map} +0 -0
  561. /package/dist/cli-bundle/chunks/{chunk-HPPFYYOV.js.map → chunk-SU3TB4NS.js.map} +0 -0
  562. /package/dist/cli-bundle/chunks/{chunk-G7I7DEZA.js.map → chunk-T4XBKJ3F.js.map} +0 -0
  563. /package/dist/cli-bundle/chunks/{chunk-VICZWYGZ.js.map → chunk-U5TR4N7J.js.map} +0 -0
  564. /package/dist/cli-bundle/chunks/{chunk-EVMTBV6V.js.map → chunk-UMNQZS4H.js.map} +0 -0
  565. /package/dist/cli-bundle/chunks/{chunk-A7FPBAQS.js.map → chunk-WJA3PXW7.js.map} +0 -0
  566. /package/dist/cli-bundle/chunks/{chunk-QCWF6IYD.js.map → chunk-YSDFIY7N.js.map} +0 -0
  567. /package/dist/cli-bundle/chunks/{chunk-UZIWVBE6.js.map → chunk-YSGTMDWC.js.map} +0 -0
  568. /package/dist/cli-bundle/chunks/{chunk-64HNBBFQ.js.map → chunk-Z5F6XZXE.js.map} +0 -0
  569. /package/dist/cli-bundle/chunks/{chunk-AVEE5EHK.js.map → chunk-Z7RPDF2Y.js.map} +0 -0
  570. /package/dist/cli-bundle/chunks/{claim-T3GCKV7C.js.map → claim-2BGBGSVI.js.map} +0 -0
  571. /package/dist/cli-bundle/chunks/{claim-EMQLYPRW.js.map → claim-5GU7OE67.js.map} +0 -0
  572. /package/dist/cli-bundle/chunks/{close-E6ZZGCJY.js.map → close-6YODBUIV.js.map} +0 -0
  573. /package/dist/cli-bundle/chunks/{close-TQYAAFJP.js.map → close-AFVKPR57.js.map} +0 -0
  574. /package/dist/cli-bundle/chunks/{comments-YUXJRZPQ.js.map → comments-DNWHEBOS.js.map} +0 -0
  575. /package/dist/cli-bundle/chunks/{comments-QCKR2YY2.js.map → comments-RW23R3VE.js.map} +0 -0
  576. /package/dist/cli-bundle/chunks/{context-B6275WPX.js.map → context-OYXRGY7S.js.map} +0 -0
  577. /package/dist/cli-bundle/chunks/{context-OCZ3FJ4Z.js.map → context-PKCEHQY3.js.map} +0 -0
  578. /package/dist/cli-bundle/chunks/{copy-DEM4DATS.js.map → copy-6XOR3HKN.js.map} +0 -0
  579. /package/dist/cli-bundle/chunks/{copy-BTJOSKKT.js.map → copy-I4NCLBR4.js.map} +0 -0
  580. /package/dist/cli-bundle/chunks/{create-RLRJMRTM.js.map → create-PM45M6PE.js.map} +0 -0
  581. /package/dist/cli-bundle/chunks/{create-OH3BDGBB.js.map → create-Z7YCH3BE.js.map} +0 -0
  582. /package/dist/cli-bundle/chunks/{delete-BHK7VB2Z.js.map → delete-7YXHYG67.js.map} +0 -0
  583. /package/dist/cli-bundle/chunks/{delete-LSVHAB4Y.js.map → delete-LPISP43T.js.map} +0 -0
  584. /package/dist/cli-bundle/chunks/{deps-XHYXWEPT.js.map → deps-N2T26FME.js.map} +0 -0
  585. /package/dist/cli-bundle/chunks/{deps-4UDFJRUA.js.map → deps-WATKQDE3.js.map} +0 -0
  586. /package/dist/cli-bundle/chunks/{docs-GYZNVS26.js.map → docs-6LQ3GLM7.js.map} +0 -0
  587. /package/dist/cli-bundle/chunks/{docs-26S44RXU.js.map → docs-Z3X6JZLT.js.map} +0 -0
  588. /package/dist/cli-bundle/chunks/{eval-UYF3ZPVO.js.map → eval-6DCLG52D.js.map} +0 -0
  589. /package/dist/cli-bundle/chunks/{eval-PGRVIJQU.js.map → eval-Y3ZCUTHK.js.map} +0 -0
  590. /package/dist/cli-bundle/chunks/{extension-CPSLJQVE.js.map → extension-BNINIMT7.js.map} +0 -0
  591. /package/dist/cli-bundle/chunks/{extension-CXJ6RELI.js.map → extension-QWE4YYK5.js.map} +0 -0
  592. /package/dist/cli-bundle/chunks/{files-NQHEXUZD.js.map → files-6SGKHS6O.js.map} +0 -0
  593. /package/dist/cli-bundle/chunks/{files-MBNICQFM.js.map → files-FUYPSOFJ.js.map} +0 -0
  594. /package/dist/cli-bundle/chunks/{focus-DWYIG7GU.js.map → focus-2Q3K76G2.js.map} +0 -0
  595. /package/dist/cli-bundle/chunks/{focus-XZW5423D.js.map → focus-ATLBWXXD.js.map} +0 -0
  596. /package/dist/cli-bundle/chunks/{gc-LPVMKJQJ.js.map → gc-RUYEMNRF.js.map} +0 -0
  597. /package/dist/cli-bundle/chunks/{gc-7GQYOS2G.js.map → gc-TDWSDR66.js.map} +0 -0
  598. /package/dist/cli-bundle/chunks/{history-WSZHY3PN.js.map → history-CGNQJXFE.js.map} +0 -0
  599. /package/dist/cli-bundle/chunks/{history-NERDJNUB.js.map → history-SGRRS72R.js.map} +0 -0
  600. /package/dist/cli-bundle/chunks/{history-redact-O3NBCNWC.js.map → history-redact-IRL7WJ3E.js.map} +0 -0
  601. /package/dist/cli-bundle/chunks/{history-redact-MP6CH7U5.js.map → history-redact-N3JK7VBW.js.map} +0 -0
  602. /package/dist/cli-bundle/chunks/{init-64XDLQJB.js.map → init-4GESW7RM.js.map} +0 -0
  603. /package/dist/cli-bundle/chunks/{init-PAX32BJA.js.map → init-XIDPABA4.js.map} +0 -0
  604. /package/dist/cli-bundle/chunks/{learnings-LPKCSJX7.js.map → learnings-4BHWFFUV.js.map} +0 -0
  605. /package/dist/cli-bundle/chunks/{learnings-JR6MA5TI.js.map → learnings-4FJY7WIW.js.map} +0 -0
  606. /package/dist/cli-bundle/chunks/{list-G5Y65VF6.js.map → list-472TIOVK.js.map} +0 -0
  607. /package/dist/cli-bundle/chunks/{list-DNBJVO3E.js.map → list-D7BF5CL2.js.map} +0 -0
  608. /package/dist/cli-bundle/chunks/{notes-2BMU3VVQ.js.map → notes-6KNOSLIT.js.map} +0 -0
  609. /package/dist/cli-bundle/chunks/{notes-6KTGO2OJ.js.map → notes-W4UEICGF.js.map} +0 -0
  610. /package/dist/cli-bundle/chunks/{restore-4MHZFJ2E.js.map → restore-44IHMMZZ.js.map} +0 -0
  611. /package/dist/cli-bundle/chunks/{restore-YALDGTQR.js.map → restore-EXHU34EU.js.map} +0 -0
  612. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-LB6DOLRL.js.map → scheduling-shortcuts-OLHNLAZY.js.map} +0 -0
  613. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-UTOYKLXQ.js.map → scheduling-shortcuts-TSBK4AY5.js.map} +0 -0
  614. /package/dist/cli-bundle/chunks/{schema-73HR2OJW.js.map → schema-IB2NZZWD.js.map} +0 -0
  615. /package/dist/cli-bundle/chunks/{schema-U6LJKSIR.js.map → schema-VBCELP5G.js.map} +0 -0
  616. /package/dist/cli-bundle/chunks/{search-AXPXKZER.js.map → search-7UBETML4.js.map} +0 -0
  617. /package/dist/cli-bundle/chunks/{search-KILGT37L.js.map → search-R227JOL6.js.map} +0 -0
  618. /package/dist/cli-bundle/chunks/{stats-W5KNVJWQ.js.map → stats-FAG7COEH.js.map} +0 -0
  619. /package/dist/cli-bundle/chunks/{stats-PSYVVTNZ.js.map → stats-MCK7PLYS.js.map} +0 -0
  620. /package/dist/cli-bundle/chunks/{test-PWDIZ255.js.map → test-QY44WAMR.js.map} +0 -0
  621. /package/dist/cli-bundle/chunks/{test-ACD52Z3S.js.map → test-SY76DZTO.js.map} +0 -0
  622. /package/dist/cli-bundle/chunks/{update-AMRSOIWP.js.map → update-A7EICML6.js.map} +0 -0
  623. /package/dist/cli-bundle/chunks/{update-KFX2SIAC.js.map → update-IKJZWLQC.js.map} +0 -0
  624. /package/dist/cli-bundle/chunks/{upgrade-BRL6KCOJ.js.map → upgrade-NWMR3VQL.js.map} +0 -0
  625. /package/dist/cli-bundle/chunks/{upgrade-HAK6JG2O.js.map → upgrade-VU46BLJZ.js.map} +0 -0
@@ -13,7 +13,7 @@ import {
13
13
  resolveSearchCorpusFields,
14
14
  resolveSettingsWithSemanticRuntimeDefaults,
15
15
  resolveVectorStores
16
- } from "./chunk-4DSGXSBL.js";
16
+ } from "./chunk-XRYSCRZR.js";
17
17
  import {
18
18
  applyFilterValueEcho,
19
19
  buildContentFilterEcho,
@@ -24,7 +24,7 @@ import {
24
24
  parseStatusFilterCsv,
25
25
  resolveContentFieldFilters,
26
26
  resolveMissingMetadataFilters
27
- } from "./chunk-3S2KT7NG.js";
27
+ } from "./chunk-ZFTKYWIF.js";
28
28
  import {
29
29
  hasContentFieldFilter,
30
30
  itemMatchesContentFilters
@@ -33,27 +33,27 @@ import {
33
33
  hasMissingMetadataFilter,
34
34
  itemMatchesMissingMetadata,
35
35
  lifecycleClassifierFromStatusRegistry
36
- } from "./chunk-NFDPYAIP.js";
36
+ } from "./chunk-YVKZ3ANP.js";
37
37
  import {
38
38
  parseLimit,
39
39
  parsePriority,
40
40
  parseType
41
- } from "./chunk-4DUVCVLZ.js";
41
+ } from "./chunk-4PFVUUYV.js";
42
42
  import {
43
43
  collectRegisteredItemFieldNames,
44
44
  listAllDocumentCandidatesCached,
45
45
  listAllFrontMatter,
46
46
  toItemRecord
47
- } from "./chunk-3K2M5OYU.js";
47
+ } from "./chunk-6KRFL33E.js";
48
48
  import {
49
49
  isTerminalStatus,
50
50
  parseItemDocument
51
- } from "./chunk-BHO33VBQ.js";
51
+ } from "./chunk-3W2HJKJX.js";
52
52
  import {
53
53
  compareTimestampStrings,
54
54
  nowIso,
55
55
  resolveIsoOrRelative
56
- } from "./chunk-WYDHYJPO.js";
56
+ } from "./chunk-AJHYQCBJ.js";
57
57
  import {
58
58
  EXIT_CODE,
59
59
  PmCliError,
@@ -73,7 +73,7 @@ import {
73
73
  runActiveOnReadHooks,
74
74
  toNonEmptyString,
75
75
  toNonEmptyStringOrUndefined
76
- } from "./chunk-RVUALSJF.js";
76
+ } from "./chunk-KHVGM5CS.js";
77
77
 
78
78
  // dist/cli/commands/search.js
79
79
  import fs from "node:fs/promises";
@@ -455,7 +455,7 @@ function resolveBm25Params(settings) {
455
455
  !(function() {
456
456
  try {
457
457
  var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
458
- n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "abfd6249-f15e-50a9-867a-69c5d305e97e");
458
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "fe9c6a3a-fb99-53ed-9a6c-8c32bb745364");
459
459
  } catch (e2) {
460
460
  }
461
461
  })();
@@ -532,8 +532,6 @@ var LONG_QUERY_PHRASE_MULTIPLIER = 6;
532
532
  var ALL_TERMS_COVERAGE_BONUS = 40;
533
533
  var EXACT_ID_MATCH_SCORE = 1e3;
534
534
  var SHORT_ID_MATCH_SCORE = 900;
535
- var IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS = 8e3;
536
- var IMPLICIT_HYBRID_VECTOR_TIMEOUT_MS = 8e3;
537
535
  var HIGHLIGHT_OPEN = "\xAB";
538
536
  var HIGHLIGHT_CLOSE = "\xBB";
539
537
  var HIGHLIGHT_SNIPPET_RADIUS = 60;
@@ -655,16 +653,6 @@ function classifyImplicitSemanticFallbackReason(error) {
655
653
  }
656
654
  return "error";
657
655
  }
658
- function buildImplicitSemanticFallbackWarning(error) {
659
- const reason = classifyImplicitSemanticFallbackReason(error);
660
- if (reason === "timeout") {
661
- return "search_implicit_semantic_fallback:timeout:using_keyword_mode";
662
- }
663
- if (reason === "connection") {
664
- return "search_implicit_semantic_fallback:connection:using_keyword_mode";
665
- }
666
- return "search_implicit_semantic_fallback:error:using_keyword_mode";
667
- }
668
656
  function buildExplicitSemanticFallbackWarning(requestedMode, error) {
669
657
  const reason = classifyImplicitSemanticFallbackReason(error);
670
658
  return `search_${requestedMode}_fallback:${reason}:using_keyword_mode`;
@@ -796,7 +784,6 @@ var _testOnlySearchCommand = {
796
784
  buildExplicitSemanticFallbackWarning,
797
785
  buildCompactSearchFilterSummary,
798
786
  buildHybridLexicalScore,
799
- buildImplicitSemanticFallbackWarning,
800
787
  buildRerankCorpus,
801
788
  buildSemanticHits,
802
789
  classifyImplicitSemanticFallbackReason,
@@ -1508,8 +1495,12 @@ function resolveExtensionVectorAdapter(settings) {
1508
1495
  if (typeof query !== "function") {
1509
1496
  return null;
1510
1497
  }
1498
+ const upsert = runtimeDefinition.upsert;
1499
+ const runtimeAdapterName = toOptionalNonEmptyString(runtimeDefinition.name) ?? toOptionalNonEmptyString(resolved.definition.name) ?? adapterName ?? "extension";
1511
1500
  return {
1512
- query
1501
+ adapterName: runtimeAdapterName,
1502
+ query,
1503
+ ...typeof upsert === "function" ? { upsert } : {}
1513
1504
  };
1514
1505
  }
1515
1506
  function normalizeExtensionProviderHits(providerName, raw, filteredById) {
@@ -1676,52 +1667,151 @@ function buildRerankCorpus(document) {
1676
1667
  document.body
1677
1668
  ].map((entry) => typeof entry === "string" ? entry.trim() : "").filter((entry) => entry.length > 0).join("\n");
1678
1669
  }
1679
- async function computeSemanticOrHybridHits(context) {
1680
- const semanticLimit = context.limit ?? context.maxResults;
1681
- const embeddingOptions = context.embeddingTimeoutMs !== void 0 ? { timeout_ms: context.embeddingTimeoutMs } : {};
1682
- const vectorQueryOptions = context.vectorQueryTimeoutMs !== void 0 ? { timeout_ms: context.vectorQueryTimeoutMs } : {};
1683
- const queryTrimmed = context.query.trim();
1670
+ async function resolveExpandedSemanticQueries(context, queryTrimmed) {
1684
1671
  const baseExpandedQueries = context.queryExpansion.enabled ? buildDeterministicQueryExpansions(queryTrimmed, context.queryExpansion.max_queries) : [queryTrimmed];
1685
- let expandedQueries = baseExpandedQueries.length > 0 ? baseExpandedQueries : [queryTrimmed];
1686
- if (context.queryExpansion.enabled) {
1687
- if (context.queryExpansionExtension?.expand) {
1688
- try {
1689
- const rawExpansion = await Promise.resolve(context.queryExpansionExtension.expand({
1690
- query: queryTrimmed,
1691
- mode: context.requestedMode,
1692
- settings: context.settings
1693
- }));
1694
- const extensionExpansion = normalizeQueryExpansionOutput(rawExpansion);
1695
- expandedQueries = mergeQueryExpansions(expandedQueries, extensionExpansion, context.queryExpansion.max_queries);
1696
- } catch {
1697
- context.warnings.push(`search_query_expansion_provider_failed:${context.queryExpansionExtension.providerName}:using_builtin`);
1698
- }
1699
- } else if (context.queryExpansion.provider && context.queryExpansion.provider !== "openai" && context.queryExpansion.provider !== "ollama") {
1700
- context.warnings.push(`search_query_expansion_provider_unavailable:${context.queryExpansion.provider}:using_builtin`);
1672
+ const expandedQueries = baseExpandedQueries.length > 0 ? baseExpandedQueries : [queryTrimmed];
1673
+ if (!context.queryExpansion.enabled) {
1674
+ return expandedQueries;
1675
+ }
1676
+ if (context.queryExpansionExtension?.expand) {
1677
+ try {
1678
+ const rawExpansion = await Promise.resolve(context.queryExpansionExtension.expand({
1679
+ query: queryTrimmed,
1680
+ mode: context.requestedMode,
1681
+ settings: context.settings
1682
+ }));
1683
+ return mergeQueryExpansions(expandedQueries, normalizeQueryExpansionOutput(rawExpansion), context.queryExpansion.max_queries);
1684
+ } catch {
1685
+ context.warnings.push(`search_query_expansion_provider_failed:${context.queryExpansionExtension.providerName}:using_builtin`);
1686
+ return expandedQueries;
1701
1687
  }
1702
1688
  }
1703
- const queryVectors = await executeEmbeddingRequest(context.provider, expandedQueries, embeddingOptions);
1704
- const executeVectorQueryWithFallback = async (semanticVector) => {
1705
- if (context.extensionVectorAdapter?.query) {
1706
- try {
1707
- return await Promise.resolve(context.extensionVectorAdapter.query({
1708
- vector: semanticVector,
1709
- limit: semanticLimit,
1710
- settings: context.settings
1711
- }));
1712
- } catch (error) {
1713
- if (!context.vectorStore) {
1714
- throw new PmCliError(`Extension vector adapter query failed and no built-in fallback store is configured (${error instanceof Error ? error.message : String(error)})`, EXIT_CODE.GENERIC_FAILURE);
1715
- }
1716
- return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);
1689
+ if (context.queryExpansion.provider && context.queryExpansion.provider !== "openai" && context.queryExpansion.provider !== "ollama") {
1690
+ context.warnings.push(`search_query_expansion_provider_unavailable:${context.queryExpansion.provider}:using_builtin`);
1691
+ }
1692
+ return expandedQueries;
1693
+ }
1694
+ async function executeSemanticVectorQuery(context, semanticVector, semanticLimit, vectorQueryOptions) {
1695
+ if (context.extensionVectorAdapter?.query) {
1696
+ try {
1697
+ return await Promise.resolve(context.extensionVectorAdapter.query({
1698
+ vector: semanticVector,
1699
+ limit: semanticLimit,
1700
+ settings: context.settings
1701
+ }));
1702
+ } catch (error) {
1703
+ if (!context.vectorStore) {
1704
+ throw new PmCliError(`Extension vector adapter query failed and no built-in fallback store is configured (${error instanceof Error ? error.message : String(error)})`, EXIT_CODE.GENERIC_FAILURE);
1717
1705
  }
1718
- }
1719
- if (context.vectorStore) {
1706
+ context.warnings.push(`search_vector_adapter_failed:${context.extensionVectorAdapter.adapterName}:using_builtin`);
1720
1707
  return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);
1721
1708
  }
1722
- throw new PmCliError("Semantic search requires either a configured vector store or an extension vector adapter query handler", EXIT_CODE.USAGE);
1723
- };
1724
- const queryVectorGroups = await Promise.all(queryVectors.map(async (semanticVector) => await executeVectorQueryWithFallback(semanticVector)));
1709
+ }
1710
+ if (context.vectorStore) {
1711
+ return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);
1712
+ }
1713
+ throw new PmCliError("Semantic search requires either a configured vector store or an extension vector adapter query handler", EXIT_CODE.USAGE);
1714
+ }
1715
+ function buildRerankCandidateContexts(hybridHits, filteredById, topK) {
1716
+ const sortedForCandidates = [...hybridHits].sort((left, right) => {
1717
+ if (left.score !== right.score) {
1718
+ return right.score - left.score;
1719
+ }
1720
+ return left.item.id.localeCompare(right.item.id);
1721
+ });
1722
+ return sortedForCandidates.slice(0, topK).map((hit) => {
1723
+ const document = filteredById.get(hit.item.id);
1724
+ return document ? { hit, text: buildRerankCorpus(document) } : null;
1725
+ }).filter((entry) => entry !== null);
1726
+ }
1727
+ async function resolveExtensionRerankScores(context, queryTrimmed, candidateContexts) {
1728
+ if (!context.rerankExtension?.rerank) {
1729
+ return null;
1730
+ }
1731
+ try {
1732
+ const rawRerank = await Promise.resolve(context.rerankExtension.rerank({
1733
+ query: queryTrimmed,
1734
+ mode: "hybrid",
1735
+ model: context.rerank.model,
1736
+ top_k: context.rerank.top_k,
1737
+ settings: context.settings,
1738
+ candidates: candidateContexts.map((entry) => ({
1739
+ id: entry.hit.item.id,
1740
+ text: entry.text,
1741
+ score: entry.hit.score
1742
+ }))
1743
+ }));
1744
+ const normalizedRerank = normalizeRerankOutput(rawRerank);
1745
+ if (normalizedRerank.length > 0) {
1746
+ return new Map(normalizedRerank.map((entry) => [entry.id, entry.score]));
1747
+ }
1748
+ context.warnings.push(`search_rerank_provider_invalid_response:${context.rerankExtension.providerName}:using_builtin`);
1749
+ return null;
1750
+ } catch {
1751
+ context.warnings.push(`search_rerank_provider_failed:${context.rerankExtension.providerName}:using_builtin`);
1752
+ return null;
1753
+ }
1754
+ }
1755
+ async function resolveRerankScores(context, queryTrimmed, candidateContexts) {
1756
+ const extensionScores = await resolveExtensionRerankScores(context, queryTrimmed, candidateContexts);
1757
+ if (extensionScores) {
1758
+ return extensionScores;
1759
+ }
1760
+ const rerankCandidates = candidateContexts.map((entry) => ({
1761
+ id: entry.hit.item.id,
1762
+ text: entry.text
1763
+ }));
1764
+ try {
1765
+ return await rerankCandidatesWithEmbeddings(context.provider, context.rerank.model, queryTrimmed, rerankCandidates, context.embeddingTimeoutMs);
1766
+ } catch {
1767
+ context.warnings.push("search_rerank_failed:using_hybrid_scores");
1768
+ return null;
1769
+ }
1770
+ }
1771
+ function applyRerankScores(hybridHits, rerankScores) {
1772
+ const rerankedIds = new Set(rerankScores.keys());
1773
+ const rerankedHits = hybridHits.map((hit) => {
1774
+ const rerankScore = rerankScores.get(hit.item.id);
1775
+ if (rerankScore === void 0) {
1776
+ return hit;
1777
+ }
1778
+ const matchedFields = new Set(hit.matched_fields);
1779
+ matchedFields.add("rerank");
1780
+ return {
1781
+ ...hit,
1782
+ score: rerankScore,
1783
+ matched_fields: [...matchedFields].sort((left, right) => left.localeCompare(right))
1784
+ };
1785
+ });
1786
+ rerankedHits.sort((left, right) => {
1787
+ const leftWasReranked = rerankedIds.has(left.item.id);
1788
+ const rightWasReranked = rerankedIds.has(right.item.id);
1789
+ if (leftWasReranked !== rightWasReranked) {
1790
+ return leftWasReranked ? -1 : 1;
1791
+ }
1792
+ if (left.score !== right.score) {
1793
+ return right.score - left.score;
1794
+ }
1795
+ return left.item.id.localeCompare(right.item.id);
1796
+ });
1797
+ return rerankedHits;
1798
+ }
1799
+ async function applyHybridRerank(context, queryTrimmed, hybridHits, filteredById) {
1800
+ if (!context.rerank.enabled || hybridHits.length <= 1) {
1801
+ return hybridHits;
1802
+ }
1803
+ const candidateContexts = buildRerankCandidateContexts(hybridHits, filteredById, context.rerank.top_k);
1804
+ const rerankScores = await resolveRerankScores(context, queryTrimmed, candidateContexts);
1805
+ return rerankScores && rerankScores.size > 0 ? applyRerankScores(hybridHits, rerankScores) : hybridHits;
1806
+ }
1807
+ async function computeSemanticOrHybridHits(context) {
1808
+ const semanticLimit = context.limit ?? context.maxResults;
1809
+ const embeddingOptions = context.embeddingTimeoutMs !== void 0 ? { timeout_ms: context.embeddingTimeoutMs } : {};
1810
+ const vectorQueryOptions = context.vectorQueryTimeoutMs !== void 0 ? { timeout_ms: context.vectorQueryTimeoutMs } : {};
1811
+ const queryTrimmed = context.query.trim();
1812
+ const expandedQueries = await resolveExpandedSemanticQueries(context, queryTrimmed);
1813
+ const queryVectors = await executeEmbeddingRequest(context.provider, expandedQueries, embeddingOptions);
1814
+ const queryVectorGroups = await Promise.all(queryVectors.map(async (semanticVector) => await executeSemanticVectorQuery(context, semanticVector, semanticLimit, vectorQueryOptions)));
1725
1815
  const vectorHits = mergeVectorHitsById(queryVectorGroups);
1726
1816
  const filteredById = new Map(context.filteredDocuments.map((document) => [document.metadata.id, document]));
1727
1817
  const { semanticHits, semanticScores } = buildSemanticHits(vectorHits, filteredById);
@@ -1729,86 +1819,7 @@ async function computeSemanticOrHybridHits(context) {
1729
1819
  if (context.requestedMode === "semantic") {
1730
1820
  return { hits: forceExactIdHitsToTop(semanticHits, context.keywordHits), vectorMatchCount };
1731
1821
  }
1732
- let hybridHits = combineHybridHits(filteredById, semanticScores, context.keywordHits, context.hybridSemanticWeight);
1733
- if (context.rerank.enabled && hybridHits.length > 1) {
1734
- const sortedForCandidates = [...hybridHits].sort((left, right) => {
1735
- if (left.score !== right.score) {
1736
- return right.score - left.score;
1737
- }
1738
- return left.item.id.localeCompare(right.item.id);
1739
- });
1740
- const candidateHits = sortedForCandidates.slice(0, context.rerank.top_k);
1741
- const candidateContexts = candidateHits.map((hit) => {
1742
- const document = filteredById.get(hit.item.id);
1743
- if (!document) {
1744
- return null;
1745
- }
1746
- return { hit, text: buildRerankCorpus(document) };
1747
- }).filter((entry) => entry !== null);
1748
- const rerankCandidates = candidateContexts.map((entry) => ({
1749
- id: entry.hit.item.id,
1750
- text: entry.text
1751
- }));
1752
- let rerankScores = null;
1753
- if (context.rerankExtension?.rerank) {
1754
- try {
1755
- const rawRerank = await Promise.resolve(context.rerankExtension.rerank({
1756
- query: queryTrimmed,
1757
- mode: "hybrid",
1758
- model: context.rerank.model,
1759
- top_k: context.rerank.top_k,
1760
- settings: context.settings,
1761
- candidates: candidateContexts.map((entry) => ({
1762
- id: entry.hit.item.id,
1763
- text: entry.text,
1764
- score: entry.hit.score
1765
- }))
1766
- }));
1767
- const normalizedRerank = normalizeRerankOutput(rawRerank);
1768
- if (normalizedRerank.length > 0) {
1769
- rerankScores = new Map(normalizedRerank.map((entry) => [entry.id, entry.score]));
1770
- } else {
1771
- context.warnings.push(`search_rerank_provider_invalid_response:${context.rerankExtension.providerName}:using_builtin`);
1772
- }
1773
- } catch {
1774
- context.warnings.push(`search_rerank_provider_failed:${context.rerankExtension.providerName}:using_builtin`);
1775
- }
1776
- }
1777
- if (!rerankScores) {
1778
- try {
1779
- rerankScores = await rerankCandidatesWithEmbeddings(context.provider, context.rerank.model, queryTrimmed, rerankCandidates, context.embeddingTimeoutMs);
1780
- } catch {
1781
- context.warnings.push("search_rerank_failed:using_hybrid_scores");
1782
- }
1783
- }
1784
- if (rerankScores && rerankScores.size > 0) {
1785
- const rerankedIds = new Set(rerankScores.keys());
1786
- hybridHits = hybridHits.map((hit) => {
1787
- const rerankScore = rerankScores.get(hit.item.id);
1788
- if (rerankScore === void 0) {
1789
- return hit;
1790
- }
1791
- const matchedFields = new Set(hit.matched_fields);
1792
- matchedFields.add("rerank");
1793
- return {
1794
- ...hit,
1795
- score: rerankScore,
1796
- matched_fields: [...matchedFields].sort((left, right) => left.localeCompare(right))
1797
- };
1798
- });
1799
- hybridHits.sort((left, right) => {
1800
- const leftWasReranked = rerankedIds.has(left.item.id);
1801
- const rightWasReranked = rerankedIds.has(right.item.id);
1802
- if (leftWasReranked !== rightWasReranked) {
1803
- return leftWasReranked ? -1 : 1;
1804
- }
1805
- if (left.score !== right.score) {
1806
- return right.score - left.score;
1807
- }
1808
- return left.item.id.localeCompare(right.item.id);
1809
- });
1810
- }
1811
- }
1822
+ const hybridHits = await applyHybridRerank(context, queryTrimmed, combineHybridHits(filteredById, semanticScores, context.keywordHits, context.hybridSemanticWeight), filteredById);
1812
1823
  return {
1813
1824
  // GH-281: applied LAST (after any rerank reordering) so an exact full-ID /
1814
1825
  // short-ID keyword match always ranks #1 in hybrid mode regardless of the
@@ -1919,7 +1930,15 @@ function projectSearchHits(hits, projection) {
1919
1930
  return projected;
1920
1931
  });
1921
1932
  }
1922
- async function runSearch(rawQuery, rawOptions, global2) {
1933
+ function resolveQueryExpansionExtension(queryExpansion) {
1934
+ const provider = resolveExtensionSearchProviderByName(queryExpansion.provider ?? void 0);
1935
+ return provider?.queryExpansion ? { providerName: provider.providerName, expand: provider.queryExpansion } : null;
1936
+ }
1937
+ function resolveRerankExtension(settings) {
1938
+ const provider = resolveExtensionSearchProviderByName(toOptionalNonEmptyString(settings.search?.provider));
1939
+ return provider?.rerank ? { providerName: provider.providerName, rerank: provider.rerank } : null;
1940
+ }
1941
+ function prepareSearchInput(rawQuery, rawOptions) {
1923
1942
  const inlineWarnings = [];
1924
1943
  const inlineParse = parseInlineQueryFilters(rawQuery);
1925
1944
  const hasInlineFilters = Object.keys(inlineParse.inlineFilters).length > 0;
@@ -1933,310 +1952,380 @@ async function runSearch(rawQuery, rawOptions, global2) {
1933
1952
  }
1934
1953
  const query = hasInlineFilters ? inlineParse.residualQuery : rawQuery;
1935
1954
  const options = applyInlineQueryFilters(rawOptions, inlineParse.inlineFilters, inlineWarnings);
1936
- const highlight = options.highlight === true;
1937
- const includeLinked = parseIncludeLinked(options.includeLinked);
1938
- const titleExact = parseTitleExact(options.titleExact);
1939
- const phraseExact = parsePhraseExact(options.phraseExact);
1940
- const matchMode = parseMatchMode(typeof options.matchMode === "string" ? options.matchMode : void 0);
1941
- const minScoreOverride = parseMinScoreOverride(options.minScore);
1942
- const countOnly = options.count === true;
1943
- const tokens = parseTokens(query);
1944
- const normalizedQuery = normalizeSearchPhrase(query);
1945
- const limit = parseLimit(options.limit);
1946
- const projection = parseProjectionConfig(options);
1947
- const modeWasExplicit = typeof options.mode === "string" && options.mode.trim().length > 0;
1955
+ return {
1956
+ query,
1957
+ options,
1958
+ inlineWarnings,
1959
+ highlight: options.highlight === true,
1960
+ includeLinked: parseIncludeLinked(options.includeLinked),
1961
+ titleExact: parseTitleExact(options.titleExact),
1962
+ phraseExact: parsePhraseExact(options.phraseExact),
1963
+ matchMode: parseMatchMode(typeof options.matchMode === "string" ? options.matchMode : void 0),
1964
+ minScoreOverride: parseMinScoreOverride(options.minScore),
1965
+ countOnly: options.count === true,
1966
+ tokens: parseTokens(query),
1967
+ normalizedQuery: normalizeSearchPhrase(query),
1968
+ limit: parseLimit(options.limit),
1969
+ projection: parseProjectionConfig(options),
1970
+ modeWasExplicit: typeof options.mode === "string" && options.mode.trim().length > 0
1971
+ };
1972
+ }
1973
+ async function resolveSearchRuntimeContext(prepared, global2) {
1948
1974
  const pmRoot = resolvePmRoot(process.cwd(), global2.path);
1949
1975
  if (!await pathExists(getSettingsPath(pmRoot))) {
1950
1976
  throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
1951
1977
  }
1952
1978
  const storedSettings = await readSettings(pmRoot);
1953
- const runtimeDefaultsResolution = resolveSettingsWithSemanticRuntimeDefaults(storedSettings);
1954
- const settings = runtimeDefaultsResolution.settings;
1979
+ const settings = resolveSettingsWithSemanticRuntimeDefaults(storedSettings).settings;
1955
1980
  const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
1956
1981
  const runtimeFieldRegistry = resolveRuntimeFieldRegistry(settings.schema);
1957
- validateSearchProjectionFields(projection, runtimeFieldRegistry);
1958
- const runtimeFieldFilters = collectRuntimeFilterValues(options, runtimeFieldRegistry, "search");
1959
- const statusFilter = parseStatusFilterCsv(typeof options.status === "string" ? options.status : void 0, statusRegistry, { strict: true });
1982
+ validateSearchProjectionFields(prepared.projection, runtimeFieldRegistry);
1983
+ const runtimeFieldFilters = collectRuntimeFilterValues(prepared.options, runtimeFieldRegistry, "search");
1960
1984
  const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
1961
- const maxResults = resolveSearchMaxResults(settings);
1962
- const scoreThreshold = minScoreOverride ?? resolveSearchScoreThreshold(settings);
1963
- const semanticWeightProvided = options.semanticWeight !== void 0;
1964
- const semanticWeightOverride = parseSemanticWeightOverride(options.semanticWeight);
1965
- const hybridSemanticWeight = semanticWeightOverride ?? resolveHybridSemanticWeight(settings);
1966
- const tuning = resolveSearchTuning(settings);
1967
1985
  const providerResolution = resolveEmbeddingProviders(settings);
1968
1986
  const vectorResolution = resolveVectorStores(settings);
1969
1987
  const extensionSearchProvider = resolveExtensionSearchProvider(settings);
1970
1988
  const extensionVectorAdapter = resolveExtensionVectorAdapter(settings);
1971
- const bm25Mode = resolveBuiltInBm25Mode({
1972
- configuredProvider: toOptionalNonEmptyString(settings.search?.provider),
1973
- hasEmbeddingProvider: providerResolution.active !== null,
1974
- hasExtensionSearchProvider: extensionSearchProvider !== null
1975
- });
1989
+ const semanticWeightOverride = parseSemanticWeightOverride(prepared.options.semanticWeight);
1976
1990
  const queryExpansion = resolveQueryExpansionConfig(settings, providerResolution.active?.name ?? null);
1977
1991
  const rerank = resolveRerankConfig(settings, providerResolution.active?.model ?? toOptionalNonEmptyString(settings.search?.embedding_model) ?? "text-embedding-3-small");
1978
- const queryExpansionProvider = resolveExtensionSearchProviderByName(queryExpansion.provider ?? void 0);
1979
- const queryExpansionExtension = queryExpansionProvider?.queryExpansion ? { providerName: queryExpansionProvider.providerName, expand: queryExpansionProvider.queryExpansion } : null;
1980
- const rerankProvider = resolveExtensionSearchProviderByName(toOptionalNonEmptyString(settings.search?.provider));
1981
- const rerankExtension = rerankProvider?.rerank ? { providerName: rerankProvider.providerName, rerank: rerankProvider.rerank } : null;
1982
- let effectiveMode = parseMode(options.mode, {
1983
- hasProvider: providerResolution.active !== null || extensionSearchProvider !== null,
1984
- hasVectorStore: vectorResolution.active !== null || extensionVectorAdapter !== null
1985
- });
1986
- const loadedDocuments = await loadDocuments(pmRoot, settings.item_format ?? "toon", typeRegistry.type_to_folder, settings.schema);
1987
- const warnings = loadedDocuments.warnings;
1988
- if (inlineWarnings.length > 0) {
1989
- warnings.push(...inlineWarnings);
1992
+ return {
1993
+ pmRoot,
1994
+ settings,
1995
+ statusRegistry,
1996
+ runtimeFieldRegistry,
1997
+ runtimeFieldFilters,
1998
+ typeRegistry,
1999
+ maxResults: resolveSearchMaxResults(settings),
2000
+ scoreThreshold: prepared.minScoreOverride ?? resolveSearchScoreThreshold(settings),
2001
+ semanticWeightProvided: prepared.options.semanticWeight !== void 0,
2002
+ semanticWeightOverride,
2003
+ hybridSemanticWeight: semanticWeightOverride ?? resolveHybridSemanticWeight(settings),
2004
+ tuning: resolveSearchTuning(settings),
2005
+ providerResolution,
2006
+ vectorResolution,
2007
+ extensionSearchProvider,
2008
+ extensionVectorAdapter,
2009
+ bm25Mode: resolveBuiltInBm25Mode({
2010
+ configuredProvider: toOptionalNonEmptyString(settings.search?.provider),
2011
+ hasEmbeddingProvider: providerResolution.active !== null,
2012
+ hasExtensionSearchProvider: extensionSearchProvider !== null
2013
+ }),
2014
+ queryExpansion,
2015
+ queryExpansionExtension: resolveQueryExpansionExtension(queryExpansion),
2016
+ rerank,
2017
+ rerankExtension: resolveRerankExtension(settings),
2018
+ effectiveMode: parseMode(prepared.options.mode, {
2019
+ hasProvider: providerResolution.active !== null || extensionSearchProvider !== null,
2020
+ hasVectorStore: vectorResolution.active !== null || extensionVectorAdapter !== null
2021
+ })
2022
+ };
2023
+ }
2024
+ async function loadFilteredSearchCorpus(prepared, runtime) {
2025
+ const loadedDocuments = await loadDocuments(runtime.pmRoot, runtime.settings.item_format ?? "toon", runtime.typeRegistry.type_to_folder, runtime.settings.schema);
2026
+ const statusFilter = parseStatusFilterCsv(typeof prepared.options.status === "string" ? prepared.options.status : void 0, runtime.statusRegistry, { strict: true });
2027
+ const lifecycleClassifier = lifecycleClassifierFromStatusRegistry(runtime.statusRegistry);
2028
+ const metadataFilteredDocuments = applyFilters(loadedDocuments.documents, prepared.options, runtime.typeRegistry, runtime.runtimeFieldFilters, statusFilter, lifecycleClassifier);
2029
+ return {
2030
+ warnings: loadedDocuments.warnings,
2031
+ allDocuments: loadedDocuments.documents,
2032
+ filteredDocuments: applyExactQueryFilters(metadataFilteredDocuments, prepared.normalizedQuery, {
2033
+ titleExact: prepared.titleExact,
2034
+ phraseExact: prepared.phraseExact || prepared.matchMode === "exact"
2035
+ })
2036
+ };
2037
+ }
2038
+ async function collectLinkedCorpusById(includeLinked, effectiveMode, filteredDocuments) {
2039
+ const linkedCorpusById = /* @__PURE__ */ new Map();
2040
+ if (!includeLinked || effectiveMode !== "keyword" && effectiveMode !== "hybrid") {
2041
+ return linkedCorpusById;
1990
2042
  }
1991
- if (effectiveMode === "hybrid" && semanticWeightProvided && semanticWeightOverride === void 0) {
1992
- warnings.push("search_hybrid_semantic_weight_override_invalid:using_settings_default");
2043
+ const projectRoot = process.cwd();
2044
+ const linkedCorpusRoots = await resolveLinkedCorpusRoots(projectRoot, resolveGlobalPmRoot(projectRoot));
2045
+ const linkedCorpusEntries = await Promise.all(filteredDocuments.map(async (document) => [document.metadata.id, await loadLinkedCorpus(document, linkedCorpusRoots)]));
2046
+ for (const [id, corpus] of linkedCorpusEntries) {
2047
+ linkedCorpusById.set(id, corpus);
2048
+ }
2049
+ return linkedCorpusById;
2050
+ }
2051
+ async function computeKeywordSearchHits(prepared, runtime, filteredDocuments) {
2052
+ const linkedCorpusById = await collectLinkedCorpusById(prepared.includeLinked, runtime.effectiveMode, filteredDocuments);
2053
+ const applyCoverageBonus = prepared.matchMode === "or";
2054
+ return filteredDocuments.map((document) => buildHybridLexicalScore(document, prepared.tokens, prepared.normalizedQuery, prepared.includeLinked, linkedCorpusById, runtime.tuning, runtime.settings.id_prefix, applyCoverageBonus)).filter((entry) => entry !== null).filter((entry) => prepared.matchMode !== "and" || entry.matched_all_terms === true);
2055
+ }
2056
+ function buildEmptySearchResultFromContext(response, countOnly) {
2057
+ return emptySearchResult(response.query, response.effectiveMode, response.matchMode, response.options, response.includeLinked, response.scoreThreshold, response.hybridSemanticWeight, response.queryExpansion, response.rerank, response.projection, response.warnings, response.runtimeFieldFilters, countOnly);
2058
+ }
2059
+ async function executeBuiltInBm25Search(prepared, runtime, filteredDocuments, keywordHits, warnings) {
2060
+ if (runtime.bm25Mode === null || runtime.effectiveMode === "keyword") {
2061
+ return null;
1993
2062
  }
1994
- const allDocuments = loadedDocuments.documents;
1995
- const lifecycleClassifier = lifecycleClassifierFromStatusRegistry(statusRegistry);
1996
- const metadataFilteredDocuments = applyFilters(allDocuments, options, typeRegistry, runtimeFieldFilters, statusFilter, lifecycleClassifier);
1997
- const filteredDocuments = applyExactQueryFilters(metadataFilteredDocuments, normalizedQuery, {
1998
- titleExact,
1999
- // --match-mode exact reuses the exact-phrase containment logic so the whole
2000
- // normalized query must appear as a contiguous phrase in some searchable field.
2001
- phraseExact: phraseExact || matchMode === "exact"
2063
+ const hits = computeBuiltInBm25Hits({
2064
+ requestedMode: runtime.effectiveMode,
2065
+ query: prepared.query,
2066
+ filteredDocuments,
2067
+ keywordHits,
2068
+ corpusFields: resolveSearchCorpusFields(runtime.settings),
2069
+ bm25Params: resolveBm25Params(runtime.settings),
2070
+ hybridSemanticWeight: runtime.hybridSemanticWeight
2002
2071
  });
2003
- if (effectiveMode === "keyword" && (filteredDocuments.length === 0 || limit === 0)) {
2004
- return emptySearchResult(query, effectiveMode, matchMode, options, includeLinked, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, projection, warnings, runtimeFieldFilters, countOnly);
2072
+ if (runtime.bm25Mode === "auto-fallback") {
2073
+ warnings.push(`search_${runtime.effectiveMode}_offline_bm25:no_embedding_provider:using_lexical_bm25`);
2005
2074
  }
2006
- const projectRoot = process.cwd();
2007
- const globalRoot = resolveGlobalPmRoot(projectRoot);
2008
- const linkedCorpusById = /* @__PURE__ */ new Map();
2009
- if (includeLinked && (effectiveMode === "keyword" || effectiveMode === "hybrid")) {
2010
- const linkedCorpusRoots = await resolveLinkedCorpusRoots(projectRoot, globalRoot);
2011
- const linkedCorpusEntries = await Promise.all(filteredDocuments.map(async (document) => [document.metadata.id, await loadLinkedCorpus(document, linkedCorpusRoots)]));
2012
- for (const [id, corpus] of linkedCorpusEntries) {
2013
- linkedCorpusById.set(id, corpus);
2014
- }
2075
+ return hits;
2076
+ }
2077
+ async function executeExtensionSearchProvider(prepared, runtime, filteredDocuments, filteredById) {
2078
+ if (!runtime.extensionSearchProvider) {
2079
+ return null;
2015
2080
  }
2016
- const applyCoverageBonus = matchMode === "or";
2017
- const keywordHits = filteredDocuments.map((document) => buildHybridLexicalScore(
2018
- document,
2019
- tokens,
2020
- normalizedQuery,
2021
- // Linked corpus is only collected into linkedCorpusById when the user
2022
- // passed --include-linked (and mode is keyword/hybrid), so pass the
2023
- // parsed flag directly rather than re-deriving it from the mode.
2024
- includeLinked,
2025
- linkedCorpusById,
2026
- tuning,
2027
- settings.id_prefix,
2028
- applyCoverageBonus
2029
- )).filter((entry) => entry !== null).filter((entry) => matchMode !== "and" || entry.matched_all_terms === true);
2030
- let hits = keywordHits;
2031
- const useBuiltInBm25 = bm25Mode !== null && effectiveMode !== "keyword";
2032
- if (bm25Mode !== null && effectiveMode !== "keyword") {
2033
- hits = computeBuiltInBm25Hits({
2034
- requestedMode: effectiveMode,
2035
- query,
2036
- filteredDocuments,
2037
- keywordHits,
2038
- corpusFields: resolveSearchCorpusFields(settings),
2039
- bm25Params: resolveBm25Params(settings),
2040
- hybridSemanticWeight
2041
- });
2042
- if (bm25Mode === "auto-fallback") {
2043
- warnings.push(`search_${effectiveMode}_offline_bm25:no_embedding_provider:using_lexical_bm25`);
2081
+ const canUseBuiltInSemantic = runtime.providerResolution.active !== null && (runtime.vectorResolution.active !== null || runtime.extensionVectorAdapter !== null);
2082
+ try {
2083
+ const providerResponse = await Promise.resolve(runtime.extensionSearchProvider.query({
2084
+ query: prepared.query,
2085
+ mode: runtime.effectiveMode,
2086
+ tokens: prepared.tokens,
2087
+ options: prepared.options,
2088
+ settings: runtime.settings,
2089
+ documents: filteredDocuments
2090
+ }));
2091
+ return normalizeExtensionProviderHits(runtime.extensionSearchProvider.providerName, providerResponse, filteredById);
2092
+ } catch (error) {
2093
+ if (!canUseBuiltInSemantic) {
2094
+ throw new PmCliError(`Extension search provider "${runtime.extensionSearchProvider.providerName}" failed: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
2044
2095
  }
2096
+ return null;
2045
2097
  }
2046
- if (effectiveMode !== "keyword" && !useBuiltInBm25) {
2047
- const builtInSemanticWillRun = !extensionSearchProvider && providerResolution.active !== null && (vectorResolution.active !== null || extensionVectorAdapter !== null);
2048
- if (modeWasExplicit && builtInSemanticWillRun) {
2049
- await maybeEmitVectorIndexStaleWarning(pmRoot, filteredDocuments, warnings);
2050
- }
2051
- try {
2052
- if (!extensionSearchProvider) {
2053
- requireSemanticDependencies(effectiveMode, providerResolution, vectorResolution, extensionVectorAdapter !== null);
2054
- }
2055
- if (filteredDocuments.length === 0 || limit === 0) {
2056
- return emptySearchResult(query, effectiveMode, matchMode, options, includeLinked, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, projection, warnings, runtimeFieldFilters, countOnly);
2057
- }
2058
- const filteredById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
2059
- const canUseBuiltInSemantic = providerResolution.active !== null && (vectorResolution.active !== null || extensionVectorAdapter !== null);
2060
- if (extensionSearchProvider) {
2061
- try {
2062
- const providerResponse = await Promise.resolve(extensionSearchProvider.query({
2063
- query,
2064
- mode: effectiveMode,
2065
- tokens,
2066
- options,
2067
- settings,
2068
- documents: filteredDocuments
2069
- }));
2070
- hits = normalizeExtensionProviderHits(extensionSearchProvider.providerName, providerResponse, filteredById);
2071
- } catch (error) {
2072
- if (!canUseBuiltInSemantic) {
2073
- throw new PmCliError(`Extension search provider "${extensionSearchProvider.providerName}" failed: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
2074
- }
2075
- }
2076
- }
2077
- if (hits === keywordHits) {
2078
- const implicitHybridMode = !modeWasExplicit && effectiveMode === "hybrid";
2079
- const { provider, vectorStore } = requireSemanticDependencies(effectiveMode, providerResolution, vectorResolution, extensionVectorAdapter !== null);
2080
- const semanticResult = await computeSemanticOrHybridHits({
2081
- requestedMode: effectiveMode,
2082
- query,
2083
- filteredDocuments,
2084
- keywordHits,
2085
- hybridSemanticWeight,
2086
- limit,
2087
- maxResults,
2088
- provider,
2089
- vectorStore,
2090
- extensionVectorAdapter,
2091
- queryExpansion,
2092
- queryExpansionExtension,
2093
- rerank,
2094
- rerankExtension,
2095
- warnings,
2096
- settings,
2097
- /* c8 ignore next 5 -- reserved for future implicit-hybrid auto-mode; current parseMode defaults keyword when mode is omitted */
2098
- ...implicitHybridMode ? {
2099
- embeddingTimeoutMs: IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS,
2100
- vectorQueryTimeoutMs: IMPLICIT_HYBRID_VECTOR_TIMEOUT_MS
2101
- } : {}
2102
- });
2103
- hits = semanticResult.hits;
2104
- if (semanticResult.vectorMatchCount === 0) {
2105
- if (effectiveMode === "semantic") {
2106
- hits = keywordHits;
2107
- }
2108
- warnings.push(`search_${effectiveMode}_degraded:no_vector_matches:results_are_lexical`);
2109
- }
2110
- }
2111
- } catch (error) {
2112
- const fallbackWarning = modeWasExplicit ? buildExplicitSemanticFallbackWarning(effectiveMode, error) : buildImplicitSemanticFallbackWarning(error);
2113
- effectiveMode = "keyword";
2114
- hits = keywordHits;
2115
- warnings.push(fallbackWarning);
2116
- }
2098
+ }
2099
+ function maybeApplyNoVectorFallback(effectiveMode, semanticResult, keywordHits, warnings) {
2100
+ if (semanticResult.vectorMatchCount > 0) {
2101
+ return semanticResult.hits;
2117
2102
  }
2118
- const thresholded = hits.filter((entry) => entry.exact_id_match === true || entry.score >= scoreThreshold);
2119
- const sorted = sortHits(thresholded, statusRegistry);
2120
- const total = sorted.length;
2121
- const resolvedLimit = limit ?? maxResults;
2122
- const limited = sorted.slice(0, resolvedLimit);
2123
- const projectionFields = projection.mode === "full" ? null : [...projection.fields];
2124
- const compactSummaryMode = projection.mode === "compact" && options.compact === true;
2125
- if (countOnly) {
2126
- if (compactSummaryMode) {
2127
- const compactFilters = buildCompactSearchFilterSummary({
2128
- mode: effectiveMode,
2129
- matchMode,
2130
- options,
2131
- includeLinked,
2132
- titleExact,
2133
- phraseExact,
2134
- scoreThreshold,
2135
- hybridSemanticWeight,
2136
- runtimeFieldFilters
2103
+ warnings.push(`search_${effectiveMode}_degraded:no_vector_matches:results_are_lexical`);
2104
+ return effectiveMode === "semantic" ? keywordHits : semanticResult.hits;
2105
+ }
2106
+ async function prepareBuiltInSemanticSearch(runtime, effectiveMode, filteredDocuments, warnings, modeWasExplicit) {
2107
+ const builtInSemanticWillRun = !runtime.extensionSearchProvider && runtime.providerResolution.active !== null && (runtime.vectorResolution.active !== null || runtime.extensionVectorAdapter !== null);
2108
+ if (modeWasExplicit && builtInSemanticWillRun) {
2109
+ await maybeEmitVectorIndexStaleWarning(runtime.pmRoot, filteredDocuments, warnings);
2110
+ }
2111
+ if (!runtime.extensionSearchProvider) {
2112
+ requireSemanticDependencies(effectiveMode, runtime.providerResolution, runtime.vectorResolution, runtime.extensionVectorAdapter !== null);
2113
+ }
2114
+ }
2115
+ async function executeSemanticSearch(input) {
2116
+ const { prepared, runtime, filteredDocuments, keywordHits, warnings, modeWasExplicit } = input;
2117
+ let hits = keywordHits;
2118
+ const bm25Hits = await executeBuiltInBm25Search(prepared, runtime, filteredDocuments, keywordHits, warnings);
2119
+ const semanticMode = runtime.effectiveMode;
2120
+ if (bm25Hits !== null || semanticMode === "keyword") {
2121
+ return { effectiveMode: runtime.effectiveMode, hits: bm25Hits ?? hits };
2122
+ }
2123
+ try {
2124
+ await prepareBuiltInSemanticSearch(runtime, semanticMode, filteredDocuments, warnings, modeWasExplicit);
2125
+ if (filteredDocuments.length === 0 || prepared.limit === 0) {
2126
+ return { effectiveMode: runtime.effectiveMode, hits: [] };
2127
+ }
2128
+ const filteredById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
2129
+ hits = await executeExtensionSearchProvider(prepared, runtime, filteredDocuments, filteredById) ?? hits;
2130
+ if (hits === keywordHits) {
2131
+ const { provider, vectorStore } = requireSemanticDependencies(semanticMode, runtime.providerResolution, runtime.vectorResolution, runtime.extensionVectorAdapter !== null);
2132
+ const semanticResult = await computeSemanticOrHybridHits({
2133
+ requestedMode: semanticMode,
2134
+ query: prepared.query,
2135
+ filteredDocuments,
2136
+ keywordHits,
2137
+ hybridSemanticWeight: runtime.hybridSemanticWeight,
2138
+ limit: prepared.limit,
2139
+ maxResults: runtime.maxResults,
2140
+ provider,
2141
+ vectorStore,
2142
+ extensionVectorAdapter: runtime.extensionVectorAdapter,
2143
+ queryExpansion: runtime.queryExpansion,
2144
+ queryExpansionExtension: runtime.queryExpansionExtension,
2145
+ rerank: runtime.rerank,
2146
+ rerankExtension: runtime.rerankExtension,
2147
+ warnings,
2148
+ settings: runtime.settings
2137
2149
  });
2138
- return {
2139
- query: query.trim(),
2140
- mode: effectiveMode,
2141
- items: [],
2142
- count: total,
2143
- total,
2144
- count_only: true,
2145
- filters: compactFilters,
2146
- ...warnings.length > 0 ? { warnings } : {}
2147
- };
2150
+ hits = maybeApplyNoVectorFallback(semanticMode, semanticResult, keywordHits, warnings);
2148
2151
  }
2149
- return {
2150
- query: query.trim(),
2151
- mode: effectiveMode,
2152
+ return { effectiveMode: runtime.effectiveMode, hits };
2153
+ } catch (error) {
2154
+ warnings.push(buildExplicitSemanticFallbackWarning(runtime.effectiveMode, error));
2155
+ return { effectiveMode: "keyword", hits: keywordHits };
2156
+ }
2157
+ }
2158
+ function buildCountOnlySearchResult(response, total) {
2159
+ if (response.projection.mode === "compact" && response.options.compact === true) {
2160
+ return withSearchWarnings({
2161
+ query: response.query.trim(),
2162
+ mode: response.effectiveMode,
2152
2163
  items: [],
2153
2164
  count: total,
2154
2165
  total,
2155
2166
  count_only: true,
2156
- filters: buildVerboseSearchFilters({
2157
- effectiveMode,
2158
- matchMode,
2159
- options,
2160
- includeLinked,
2161
- titleExact,
2162
- phraseExact,
2163
- scoreThreshold,
2164
- hybridSemanticWeight,
2165
- queryExpansion,
2166
- rerank,
2167
- runtimeFieldFilters
2168
- }),
2169
- projection: {
2170
- mode: projection.mode,
2171
- fields: projectionFields
2172
- },
2173
- now: nowIso(),
2174
- ...warnings.length > 0 ? { warnings } : {}
2175
- };
2167
+ filters: buildCompactSearchFilterSummary({
2168
+ mode: response.effectiveMode,
2169
+ matchMode: response.matchMode,
2170
+ options: response.options,
2171
+ includeLinked: response.includeLinked,
2172
+ titleExact: response.titleExact,
2173
+ phraseExact: response.phraseExact,
2174
+ scoreThreshold: response.scoreThreshold,
2175
+ hybridSemanticWeight: response.hybridSemanticWeight,
2176
+ runtimeFieldFilters: response.runtimeFieldFilters
2177
+ })
2178
+ }, response.warnings);
2179
+ }
2180
+ const projectionFields = response.projection.mode === "full" ? null : [...response.projection.fields];
2181
+ return withSearchWarnings({
2182
+ query: response.query.trim(),
2183
+ mode: response.effectiveMode,
2184
+ items: [],
2185
+ count: total,
2186
+ total,
2187
+ count_only: true,
2188
+ filters: buildVerboseSearchFilters({
2189
+ effectiveMode: response.effectiveMode,
2190
+ matchMode: response.matchMode,
2191
+ options: response.options,
2192
+ includeLinked: response.includeLinked,
2193
+ titleExact: response.titleExact,
2194
+ phraseExact: response.phraseExact,
2195
+ scoreThreshold: response.scoreThreshold,
2196
+ hybridSemanticWeight: response.hybridSemanticWeight,
2197
+ queryExpansion: response.queryExpansion,
2198
+ rerank: response.rerank,
2199
+ runtimeFieldFilters: response.runtimeFieldFilters
2200
+ }),
2201
+ projection: {
2202
+ mode: response.projection.mode,
2203
+ fields: projectionFields
2204
+ },
2205
+ now: nowIso()
2206
+ }, response.warnings);
2207
+ }
2208
+ function withSearchWarnings(result, warnings) {
2209
+ if (warnings.length === 0) {
2210
+ return result;
2176
2211
  }
2177
- let projectedHits = limited;
2178
- let effectiveProjection = projection;
2179
- if (highlight) {
2180
- const documentById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
2181
- projectedHits = limited.map((hit) => ({
2182
- ...hit,
2183
- highlights: buildHitHighlights(documentById.get(hit.item.id), hit.matched_fields, tokens)
2184
- }));
2185
- if (projection.mode !== "full" && !projection.fields.includes("highlights")) {
2186
- effectiveProjection = { mode: projection.mode, fields: [...projection.fields, "highlights"] };
2187
- }
2212
+ return { ...result, warnings };
2213
+ }
2214
+ function attachSearchHighlights(prepared, filteredDocuments, limited) {
2215
+ if (!prepared.highlight) {
2216
+ return { hits: limited, projection: prepared.projection };
2188
2217
  }
2189
- const projectedItems = projectSearchHits(projectedHits, effectiveProjection);
2190
- const finalProjectionFields = effectiveProjection.mode === "full" ? null : [...effectiveProjection.fields];
2191
- const truncationExtras = limited.length < total ? { total } : {};
2192
- if (compactSummaryMode) {
2193
- const compactFilters = buildCompactSearchFilterSummary({
2194
- mode: effectiveMode,
2195
- matchMode,
2196
- options,
2197
- includeLinked,
2198
- titleExact,
2199
- phraseExact,
2200
- scoreThreshold,
2201
- hybridSemanticWeight,
2202
- runtimeFieldFilters
2203
- });
2204
- return {
2205
- query: query.trim(),
2206
- mode: effectiveMode,
2218
+ const documentById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
2219
+ const hits = limited.map((hit) => ({
2220
+ ...hit,
2221
+ highlights: buildHitHighlights(documentById.get(hit.item.id), hit.matched_fields, prepared.tokens)
2222
+ }));
2223
+ if (prepared.projection.mode === "full" || prepared.projection.fields.includes("highlights")) {
2224
+ return { hits, projection: prepared.projection };
2225
+ }
2226
+ return { hits, projection: { mode: prepared.projection.mode, fields: [...prepared.projection.fields, "highlights"] } };
2227
+ }
2228
+ function buildSearchResultForHits(response, projectedItems, total, limitedCount, effectiveProjection) {
2229
+ const truncationExtras = limitedCount < total ? { total } : {};
2230
+ if (response.projection.mode === "compact" && response.options.compact === true) {
2231
+ return withSearchWarnings({
2232
+ query: response.query.trim(),
2233
+ mode: response.effectiveMode,
2207
2234
  items: projectedItems,
2208
2235
  count: projectedItems.length,
2209
2236
  ...truncationExtras,
2210
- filters: compactFilters,
2211
- ...warnings.length > 0 ? { warnings } : {}
2212
- };
2237
+ filters: buildCompactSearchFilterSummary({
2238
+ mode: response.effectiveMode,
2239
+ matchMode: response.matchMode,
2240
+ options: response.options,
2241
+ includeLinked: response.includeLinked,
2242
+ titleExact: response.titleExact,
2243
+ phraseExact: response.phraseExact,
2244
+ scoreThreshold: response.scoreThreshold,
2245
+ hybridSemanticWeight: response.hybridSemanticWeight,
2246
+ runtimeFieldFilters: response.runtimeFieldFilters
2247
+ })
2248
+ }, response.warnings);
2213
2249
  }
2250
+ const finalProjectionFields = effectiveProjection.mode === "full" ? null : [...effectiveProjection.fields];
2214
2251
  return {
2215
- query: query.trim(),
2216
- mode: effectiveMode,
2252
+ query: response.query.trim(),
2253
+ mode: response.effectiveMode,
2217
2254
  items: projectedItems,
2218
2255
  count: projectedItems.length,
2219
2256
  ...truncationExtras,
2220
2257
  filters: buildVerboseSearchFilters({
2221
- effectiveMode,
2222
- matchMode,
2223
- options,
2224
- includeLinked,
2225
- titleExact,
2226
- phraseExact,
2227
- scoreThreshold,
2228
- hybridSemanticWeight,
2229
- queryExpansion,
2230
- rerank,
2231
- runtimeFieldFilters
2258
+ effectiveMode: response.effectiveMode,
2259
+ matchMode: response.matchMode,
2260
+ options: response.options,
2261
+ includeLinked: response.includeLinked,
2262
+ titleExact: response.titleExact,
2263
+ phraseExact: response.phraseExact,
2264
+ scoreThreshold: response.scoreThreshold,
2265
+ hybridSemanticWeight: response.hybridSemanticWeight,
2266
+ queryExpansion: response.queryExpansion,
2267
+ rerank: response.rerank,
2268
+ runtimeFieldFilters: response.runtimeFieldFilters
2232
2269
  }),
2233
2270
  projection: {
2234
2271
  mode: effectiveProjection.mode,
2235
2272
  fields: finalProjectionFields
2236
2273
  },
2237
2274
  now: nowIso(),
2238
- ...warnings.length > 0 ? { warnings } : {}
2275
+ ...response.warnings.length > 0 ? { warnings: response.warnings } : {}
2276
+ };
2277
+ }
2278
+ async function runSearch(rawQuery, rawOptions, global2) {
2279
+ const prepared = prepareSearchInput(rawQuery, rawOptions);
2280
+ const runtime = await resolveSearchRuntimeContext(prepared, global2);
2281
+ const corpus = await loadFilteredSearchCorpus(prepared, runtime);
2282
+ const warnings = corpus.warnings;
2283
+ warnings.push(...prepared.inlineWarnings);
2284
+ if (runtime.effectiveMode === "hybrid" && runtime.semanticWeightProvided && runtime.semanticWeightOverride === void 0) {
2285
+ warnings.push("search_hybrid_semantic_weight_override_invalid:using_settings_default");
2286
+ }
2287
+ const responseBase = {
2288
+ query: prepared.query,
2289
+ matchMode: prepared.matchMode,
2290
+ options: prepared.options,
2291
+ includeLinked: prepared.includeLinked,
2292
+ titleExact: prepared.titleExact,
2293
+ phraseExact: prepared.phraseExact,
2294
+ scoreThreshold: runtime.scoreThreshold,
2295
+ hybridSemanticWeight: runtime.hybridSemanticWeight,
2296
+ queryExpansion: runtime.queryExpansion,
2297
+ rerank: runtime.rerank,
2298
+ projection: prepared.projection,
2299
+ warnings,
2300
+ runtimeFieldFilters: runtime.runtimeFieldFilters
2239
2301
  };
2302
+ if (runtime.effectiveMode === "keyword" && (corpus.filteredDocuments.length === 0 || prepared.limit === 0)) {
2303
+ return buildEmptySearchResultFromContext({ ...responseBase, effectiveMode: runtime.effectiveMode }, prepared.countOnly);
2304
+ }
2305
+ const keywordHits = await computeKeywordSearchHits(prepared, runtime, corpus.filteredDocuments);
2306
+ const modeResult = await executeSemanticSearch({
2307
+ prepared,
2308
+ runtime,
2309
+ filteredDocuments: corpus.filteredDocuments,
2310
+ keywordHits,
2311
+ warnings,
2312
+ modeWasExplicit: prepared.modeWasExplicit
2313
+ });
2314
+ if (modeResult.effectiveMode !== "keyword" && modeResult.hits.length === 0 && (corpus.filteredDocuments.length === 0 || prepared.limit === 0)) {
2315
+ return buildEmptySearchResultFromContext({ ...responseBase, effectiveMode: modeResult.effectiveMode }, prepared.countOnly);
2316
+ }
2317
+ const thresholded = modeResult.hits.filter((entry) => entry.exact_id_match === true || entry.score >= runtime.scoreThreshold);
2318
+ const sorted = sortHits(thresholded, runtime.statusRegistry);
2319
+ const total = sorted.length;
2320
+ const resolvedLimit = prepared.limit ?? runtime.maxResults;
2321
+ const limited = sorted.slice(0, resolvedLimit);
2322
+ const response = { ...responseBase, effectiveMode: modeResult.effectiveMode };
2323
+ if (prepared.countOnly) {
2324
+ return buildCountOnlySearchResult(response, total);
2325
+ }
2326
+ const { hits: projectedHits, projection: effectiveProjection } = attachSearchHighlights(prepared, corpus.filteredDocuments, limited);
2327
+ const projectedItems = projectSearchHits(projectedHits, effectiveProjection);
2328
+ return buildSearchResultForHits(response, projectedItems, total, limited.length, effectiveProjection);
2240
2329
  }
2241
2330
 
2242
2331
  export {
@@ -2249,4 +2338,4 @@ export {
2249
2338
  resolveSearchTuning,
2250
2339
  runSearch
2251
2340
  };
2252
- //# sourceMappingURL=chunk-BZCEN4JA.js.map
2341
+ //# sourceMappingURL=chunk-PULUSQAV.js.map