@unbrained/pm-cli 2026.6.30 → 2026.7.2

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 (628) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +26 -0
  3. package/dist/cli/bootstrap-args.js +89 -79
  4. package/dist/cli/bootstrap-args.js.map +1 -1
  5. package/dist/cli/commander-usage.d.ts +2 -0
  6. package/dist/cli/commander-usage.js +58 -47
  7. package/dist/cli/commander-usage.js.map +1 -1
  8. package/dist/cli/commands/aggregate.js +102 -79
  9. package/dist/cli/commands/aggregate.js.map +1 -1
  10. package/dist/cli/commands/calendar.js +339 -303
  11. package/dist/cli/commands/calendar.js.map +1 -1
  12. package/dist/cli/commands/close-many.js +89 -68
  13. package/dist/cli/commands/close-many.js.map +1 -1
  14. package/dist/cli/commands/close.js +157 -129
  15. package/dist/cli/commands/close.js.map +1 -1
  16. package/dist/cli/commands/comments-audit.js +50 -42
  17. package/dist/cli/commands/comments-audit.js.map +1 -1
  18. package/dist/cli/commands/config.d.ts +2 -0
  19. package/dist/cli/commands/config.js +443 -879
  20. package/dist/cli/commands/config.js.map +1 -1
  21. package/dist/cli/commands/context.js +365 -287
  22. package/dist/cli/commands/context.js.map +1 -1
  23. package/dist/cli/commands/contracts.js +352 -238
  24. package/dist/cli/commands/contracts.js.map +1 -1
  25. package/dist/cli/commands/create.js +483 -434
  26. package/dist/cli/commands/create.js.map +1 -1
  27. package/dist/cli/commands/dedupe-audit.js +46 -39
  28. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  29. package/dist/cli/commands/dedupe-merge.js +88 -69
  30. package/dist/cli/commands/dedupe-merge.js.map +1 -1
  31. package/dist/cli/commands/extension/bundled-catalog.js +59 -46
  32. package/dist/cli/commands/extension/bundled-catalog.js.map +1 -1
  33. package/dist/cli/commands/extension/doctor.js +129 -78
  34. package/dist/cli/commands/extension/doctor.js.map +1 -1
  35. package/dist/cli/commands/extension/managed-state.js +101 -57
  36. package/dist/cli/commands/extension/managed-state.js.map +1 -1
  37. package/dist/cli/commands/extension/scaffold.d.ts +7 -0
  38. package/dist/cli/commands/extension/scaffold.js +214 -186
  39. package/dist/cli/commands/extension/scaffold.js.map +1 -1
  40. package/dist/cli/commands/extension.d.ts +6 -1
  41. package/dist/cli/commands/extension.js +1034 -902
  42. package/dist/cli/commands/extension.js.map +1 -1
  43. package/dist/cli/commands/get.js +114 -81
  44. package/dist/cli/commands/get.js.map +1 -1
  45. package/dist/cli/commands/health.d.ts +17 -0
  46. package/dist/cli/commands/health.js +446 -307
  47. package/dist/cli/commands/health.js.map +1 -1
  48. package/dist/cli/commands/history-compact.js +209 -140
  49. package/dist/cli/commands/history-compact.js.map +1 -1
  50. package/dist/cli/commands/history-redact.js +162 -119
  51. package/dist/cli/commands/history-redact.js.map +1 -1
  52. package/dist/cli/commands/history-repair.js +120 -85
  53. package/dist/cli/commands/history-repair.js.map +1 -1
  54. package/dist/cli/commands/init.d.ts +8 -2
  55. package/dist/cli/commands/init.js +263 -162
  56. package/dist/cli/commands/init.js.map +1 -1
  57. package/dist/cli/commands/list-filter-shared.js +55 -48
  58. package/dist/cli/commands/list-filter-shared.js.map +1 -1
  59. package/dist/cli/commands/list.js +152 -102
  60. package/dist/cli/commands/list.js.map +1 -1
  61. package/dist/cli/commands/next.js +49 -32
  62. package/dist/cli/commands/next.js.map +1 -1
  63. package/dist/cli/commands/plan.js +373 -298
  64. package/dist/cli/commands/plan.js.map +1 -1
  65. package/dist/cli/commands/recurrence-parsers.js +43 -25
  66. package/dist/cli/commands/recurrence-parsers.js.map +1 -1
  67. package/dist/cli/commands/reindex.d.ts +21 -5
  68. package/dist/cli/commands/reindex.js +345 -205
  69. package/dist/cli/commands/reindex.js.map +1 -1
  70. package/dist/cli/commands/restore.d.ts +8 -7
  71. package/dist/cli/commands/restore.js +105 -69
  72. package/dist/cli/commands/restore.js.map +1 -1
  73. package/dist/cli/commands/schema.js +33 -30
  74. package/dist/cli/commands/schema.js.map +1 -1
  75. package/dist/cli/commands/search.d.ts +10 -2
  76. package/dist/cli/commands/search.js +595 -536
  77. package/dist/cli/commands/search.js.map +1 -1
  78. package/dist/cli/commands/telemetry.js +98 -87
  79. package/dist/cli/commands/telemetry.js.map +1 -1
  80. package/dist/cli/commands/test-all.js +237 -168
  81. package/dist/cli/commands/test-all.js.map +1 -1
  82. package/dist/cli/commands/test.d.ts +6 -5
  83. package/dist/cli/commands/test.js +530 -464
  84. package/dist/cli/commands/test.js.map +1 -1
  85. package/dist/cli/commands/update-many.js +57 -42
  86. package/dist/cli/commands/update-many.js.map +1 -1
  87. package/dist/cli/commands/update.d.ts +1 -1
  88. package/dist/cli/commands/update.js +764 -747
  89. package/dist/cli/commands/update.js.map +1 -1
  90. package/dist/cli/commands/validate.d.ts +18 -1
  91. package/dist/cli/commands/validate.js +466 -343
  92. package/dist/cli/commands/validate.js.map +1 -1
  93. package/dist/cli/error-guidance.js +399 -357
  94. package/dist/cli/error-guidance.js.map +1 -1
  95. package/dist/cli/extension-command-options.js +48 -21
  96. package/dist/cli/extension-command-options.js.map +1 -1
  97. package/dist/cli/main.d.ts +47 -0
  98. package/dist/cli/main.js +428 -341
  99. package/dist/cli/main.js.map +1 -1
  100. package/dist/cli/migration-gates.js +22 -45
  101. package/dist/cli/migration-gates.js.map +1 -1
  102. package/dist/cli/register-list-query.js +94 -105
  103. package/dist/cli/register-list-query.js.map +1 -1
  104. package/dist/cli/register-mutation.js +400 -416
  105. package/dist/cli/register-mutation.js.map +1 -1
  106. package/dist/cli/register-operations.js +86 -66
  107. package/dist/cli/register-operations.js.map +1 -1
  108. package/dist/cli/register-setup.js +120 -101
  109. package/dist/cli/register-setup.js.map +1 -1
  110. package/dist/cli/registration-helpers.js +117 -122
  111. package/dist/cli/registration-helpers.js.map +1 -1
  112. package/dist/cli-bundle/chunks/{activity-MVSEND6D.js → activity-CUC4JY3U.js} +9 -9
  113. package/dist/cli-bundle/chunks/activity-WEIEMM73.js +16 -0
  114. package/dist/cli-bundle/chunks/{aggregate-MOC4TR2G.js → aggregate-DKUTRY6R.js} +109 -85
  115. package/dist/cli-bundle/chunks/aggregate-DKUTRY6R.js.map +1 -0
  116. package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js → aggregate-SW5PNGCS.js} +108 -84
  117. package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js.map → aggregate-SW5PNGCS.js.map} +2 -2
  118. package/dist/cli-bundle/chunks/{append-KDHT4GHI.js → append-H32VOR2Y.js} +6 -6
  119. package/dist/cli-bundle/chunks/{append-LEDBAM3K.js → append-UBM632FK.js} +6 -6
  120. package/dist/cli-bundle/chunks/{chunk-Z55WX4IQ.js → chunk-2227673O.js} +158 -114
  121. package/dist/cli-bundle/chunks/chunk-2227673O.js.map +1 -0
  122. package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js → chunk-2ASNV4DH.js} +4 -4
  123. package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js → chunk-2CHRYUXL.js} +2 -2
  124. package/dist/cli-bundle/chunks/{chunk-QE5UFCCO.js → chunk-2KWL5NPW.js} +42 -27
  125. package/dist/cli-bundle/chunks/chunk-2KWL5NPW.js.map +1 -0
  126. package/dist/cli-bundle/chunks/{chunk-ZEATCVAC.js → chunk-36UGKF4O.js} +21 -29
  127. package/dist/cli-bundle/chunks/chunk-36UGKF4O.js.map +7 -0
  128. package/dist/cli-bundle/chunks/{chunk-JZG5ADVE.js → chunk-3AZUFQK6.js} +1103 -963
  129. package/dist/cli-bundle/chunks/chunk-3AZUFQK6.js.map +1 -0
  130. package/dist/cli-bundle/chunks/{chunk-DRPF274X.js → chunk-3LCUASYG.js} +2 -2
  131. package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js → chunk-3Q2HBMTI.js} +2 -2
  132. package/dist/cli-bundle/chunks/chunk-4BU75MF4.js +87 -0
  133. package/dist/cli-bundle/chunks/chunk-4BU75MF4.js.map +7 -0
  134. package/dist/cli-bundle/chunks/{chunk-GF7EAR22.js → chunk-4NUOWFBT.js} +109 -72
  135. package/dist/cli-bundle/chunks/chunk-4NUOWFBT.js.map +7 -0
  136. package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js → chunk-55XRYWEG.js} +6 -6
  137. package/dist/cli-bundle/chunks/{chunk-5IRVSKPS.js → chunk-5GVTFFTC.js} +150 -224
  138. package/dist/cli-bundle/chunks/chunk-5GVTFFTC.js.map +1 -0
  139. package/dist/cli-bundle/chunks/{chunk-CHRNYKNI.js → chunk-5PGBHRY3.js} +41 -26
  140. package/dist/cli-bundle/chunks/chunk-5PGBHRY3.js.map +7 -0
  141. package/dist/cli-bundle/chunks/{chunk-53ARXF2O.js → chunk-66Z3X7ZG.js} +261 -161
  142. package/dist/cli-bundle/chunks/chunk-66Z3X7ZG.js.map +7 -0
  143. package/dist/cli-bundle/chunks/{chunk-A3UNLXNJ.js → chunk-6ITZLD4T.js} +738 -688
  144. package/dist/cli-bundle/chunks/chunk-6ITZLD4T.js.map +7 -0
  145. package/dist/cli-bundle/chunks/{chunk-JTRKME24.js → chunk-6YCYF2AI.js} +262 -162
  146. package/dist/cli-bundle/chunks/chunk-6YCYF2AI.js.map +1 -0
  147. package/dist/cli-bundle/chunks/{chunk-RM6MHL6A.js → chunk-6ZMBJRDJ.js} +580 -467
  148. package/dist/cli-bundle/chunks/chunk-6ZMBJRDJ.js.map +7 -0
  149. package/dist/cli-bundle/chunks/{chunk-RPRW26NG.js → chunk-7MYWF4ZX.js} +110 -73
  150. package/dist/cli-bundle/chunks/chunk-7MYWF4ZX.js.map +1 -0
  151. package/dist/cli-bundle/chunks/{chunk-SNUK7H5J.js → chunk-7NSPKJUS.js} +716 -606
  152. package/dist/cli-bundle/chunks/chunk-7NSPKJUS.js.map +7 -0
  153. package/dist/cli-bundle/chunks/{chunk-KYDYQMNW.js → chunk-7TH5NMVB.js} +95 -53
  154. package/dist/cli-bundle/chunks/chunk-7TH5NMVB.js.map +7 -0
  155. package/dist/cli-bundle/chunks/{chunk-VD3LKZFX.js → chunk-7W4H4K26.js} +739 -689
  156. package/dist/cli-bundle/chunks/chunk-7W4H4K26.js.map +1 -0
  157. package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js → chunk-A6VOGKBA.js} +6 -6
  158. package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js → chunk-AIAIXG7I.js} +2 -2
  159. package/dist/cli-bundle/chunks/{chunk-NIBP3I7A.js → chunk-AJEBCRIY.js} +128 -126
  160. package/dist/cli-bundle/chunks/chunk-AJEBCRIY.js.map +1 -0
  161. package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js → chunk-B4O5S7I3.js} +79 -57
  162. package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js.map → chunk-B4O5S7I3.js.map} +2 -2
  163. package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js → chunk-BTX5MIQF.js} +2 -2
  164. package/dist/cli-bundle/chunks/chunk-BVZZN2LH.js +809 -0
  165. package/dist/cli-bundle/chunks/chunk-BVZZN2LH.js.map +7 -0
  166. package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js → chunk-CYBDUHNO.js} +3 -3
  167. package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js → chunk-CZPVDLD2.js} +4 -4
  168. package/dist/cli-bundle/chunks/{chunk-FDEVKXC4.js → chunk-EMPGXBUF.js} +22 -30
  169. package/dist/cli-bundle/chunks/chunk-EMPGXBUF.js.map +1 -0
  170. package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js → chunk-EUKTMRN3.js} +2 -2
  171. package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js → chunk-FFOQHGNH.js} +6 -6
  172. package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js → chunk-GFMSLORL.js} +6 -6
  173. package/dist/cli-bundle/chunks/{chunk-IZQOJR2B.js → chunk-GRRG3MCT.js} +198 -189
  174. package/dist/cli-bundle/chunks/chunk-GRRG3MCT.js.map +7 -0
  175. package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js → chunk-H4GRLYJS.js} +3 -3
  176. package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js → chunk-HQTPRV4D.js} +6 -6
  177. package/dist/cli-bundle/chunks/{chunk-CY5IJMUM.js → chunk-I66WE2HE.js} +712 -602
  178. package/dist/cli-bundle/chunks/chunk-I66WE2HE.js.map +1 -0
  179. package/dist/cli-bundle/chunks/{chunk-ZFIEEDTJ.js → chunk-IEEJQCZ4.js} +509 -363
  180. package/dist/cli-bundle/chunks/chunk-IEEJQCZ4.js.map +7 -0
  181. package/dist/cli-bundle/chunks/{chunk-DU66JUGT.js → chunk-IG5JYZGU.js} +488 -420
  182. package/dist/cli-bundle/chunks/chunk-IG5JYZGU.js.map +7 -0
  183. package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js → chunk-JMK5GCK2.js} +2 -2
  184. package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js → chunk-JXAUVO6X.js} +258 -169
  185. package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js.map → chunk-JXAUVO6X.js.map} +2 -2
  186. package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js → chunk-K2VYLVX4.js} +2 -2
  187. package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js → chunk-KCO2EAN5.js} +3 -3
  188. package/dist/cli-bundle/chunks/{chunk-T7ZMQI4J.js → chunk-KIYCOJ63.js} +198 -189
  189. package/dist/cli-bundle/chunks/chunk-KIYCOJ63.js.map +1 -0
  190. package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js → chunk-KLXF7NCC.js} +2 -2
  191. package/dist/cli-bundle/chunks/{chunk-V3KLX7U7.js → chunk-KN3URLKS.js} +510 -364
  192. package/dist/cli-bundle/chunks/chunk-KN3URLKS.js.map +1 -0
  193. package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js → chunk-LRKMWUUV.js} +2 -2
  194. package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js → chunk-LTRAF2D7.js} +3 -3
  195. package/dist/cli-bundle/chunks/{chunk-5T6WPLRO.js → chunk-MNBPX5JS.js} +394 -354
  196. package/dist/cli-bundle/chunks/chunk-MNBPX5JS.js.map +7 -0
  197. package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js → chunk-MRD4T5LF.js} +2 -2
  198. package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js → chunk-N2JSWVWG.js} +4 -4
  199. package/dist/cli-bundle/chunks/{chunk-7WDETKGP.js → chunk-N3QCJS4M.js} +1105 -965
  200. package/dist/cli-bundle/chunks/chunk-N3QCJS4M.js.map +7 -0
  201. package/dist/cli-bundle/chunks/{chunk-KGQ3W65B.js → chunk-NRZS637N.js} +258 -169
  202. package/dist/cli-bundle/chunks/chunk-NRZS637N.js.map +1 -0
  203. package/dist/cli-bundle/chunks/chunk-OTUJZKGI.js +799 -0
  204. package/dist/cli-bundle/chunks/chunk-OTUJZKGI.js.map +1 -0
  205. package/dist/cli-bundle/chunks/{chunk-ZIE6WXJ2.js → chunk-Q6K2OACU.js} +153 -90
  206. package/dist/cli-bundle/chunks/chunk-Q6K2OACU.js.map +1 -0
  207. package/dist/cli-bundle/chunks/{chunk-K46GQ265.js → chunk-Q6NXOHS6.js} +489 -421
  208. package/dist/cli-bundle/chunks/chunk-Q6NXOHS6.js.map +1 -0
  209. package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js → chunk-QH3FSKRJ.js} +2 -2
  210. package/dist/cli-bundle/chunks/{chunk-UB3V5WUI.js → chunk-RM37OPYK.js} +394 -354
  211. package/dist/cli-bundle/chunks/chunk-RM37OPYK.js.map +1 -0
  212. package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js → chunk-S62UANU7.js} +3 -3
  213. package/dist/cli-bundle/chunks/{chunk-NO6Y6FB2.js → chunk-SPM2XLWI.js} +37 -28
  214. package/dist/cli-bundle/chunks/chunk-SPM2XLWI.js.map +7 -0
  215. package/dist/cli-bundle/chunks/{chunk-DORJSBGJ.js → chunk-SYNKD3ZG.js} +127 -125
  216. package/dist/cli-bundle/chunks/chunk-SYNKD3ZG.js.map +7 -0
  217. package/dist/cli-bundle/chunks/{chunk-6YRAMXRS.js → chunk-SYVUU7EK.js} +581 -468
  218. package/dist/cli-bundle/chunks/chunk-SYVUU7EK.js.map +1 -0
  219. package/dist/cli-bundle/chunks/{chunk-D5LYZVGB.js → chunk-TPOFWBMY.js} +95 -53
  220. package/dist/cli-bundle/chunks/chunk-TPOFWBMY.js.map +1 -0
  221. package/dist/cli-bundle/chunks/{chunk-IHXXUIXS.js → chunk-TTHCEV5Q.js} +92 -77
  222. package/dist/cli-bundle/chunks/chunk-TTHCEV5Q.js.map +1 -0
  223. package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js → chunk-U2BEEM2X.js} +3 -3
  224. package/dist/cli-bundle/chunks/{chunk-Z5BM2FKQ.js → chunk-UGLU6Q2I.js} +91 -76
  225. package/dist/cli-bundle/chunks/chunk-UGLU6Q2I.js.map +7 -0
  226. package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js → chunk-UT73HUPC.js} +3 -3
  227. package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js → chunk-UTSH5GWX.js} +4 -4
  228. package/dist/cli-bundle/chunks/{chunk-AWN4PPH5.js → chunk-UWKEJMZU.js} +157 -113
  229. package/dist/cli-bundle/chunks/chunk-UWKEJMZU.js.map +7 -0
  230. package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js +84 -0
  231. package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js.map +1 -0
  232. package/dist/cli-bundle/chunks/{chunk-KTMMTOIP.js → chunk-W47SML5B.js} +152 -89
  233. package/dist/cli-bundle/chunks/chunk-W47SML5B.js.map +7 -0
  234. package/dist/cli-bundle/chunks/{chunk-UFKNF23C.js → chunk-WJAMWAHZ.js} +157 -118
  235. package/dist/cli-bundle/chunks/chunk-WJAMWAHZ.js.map +7 -0
  236. package/dist/cli-bundle/chunks/{chunk-HIBK6H4S.js → chunk-XCHUVHKU.js} +685 -544
  237. package/dist/cli-bundle/chunks/chunk-XCHUVHKU.js.map +1 -0
  238. package/dist/cli-bundle/chunks/{chunk-DJDXAU74.js → chunk-XEWQKDYZ.js} +685 -544
  239. package/dist/cli-bundle/chunks/chunk-XEWQKDYZ.js.map +7 -0
  240. package/dist/cli-bundle/chunks/{chunk-BOWQWXLI.js → chunk-XTHQWXVC.js} +158 -119
  241. package/dist/cli-bundle/chunks/chunk-XTHQWXVC.js.map +1 -0
  242. package/dist/cli-bundle/chunks/{chunk-6T5ZIWBS.js → chunk-XWGEMNBR.js} +150 -224
  243. package/dist/cli-bundle/chunks/chunk-XWGEMNBR.js.map +7 -0
  244. package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js → chunk-Y4NRKBFW.js} +3 -3
  245. package/dist/cli-bundle/chunks/{chunk-WTRUDJ3R.js → chunk-YLZZ6T54.js} +38 -29
  246. package/dist/cli-bundle/chunks/chunk-YLZZ6T54.js.map +1 -0
  247. package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js → chunk-YPKFV2JR.js} +6 -6
  248. package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js → chunk-Z4DGFQDH.js} +80 -58
  249. package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js.map → chunk-Z4DGFQDH.js.map} +1 -1
  250. package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js → chunk-ZNHEYCDD.js} +2 -2
  251. package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js → chunk-ZNT7KEWE.js} +2 -2
  252. package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js → claim-SENTPZBN.js} +8 -8
  253. package/dist/cli-bundle/chunks/{claim-6NINZYB3.js → claim-Z7MEQCBT.js} +8 -8
  254. package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js → close-424MX4CU.js} +7 -7
  255. package/dist/cli-bundle/chunks/close-YCWQQPDS.js +14 -0
  256. package/dist/cli-bundle/chunks/{close-many-CXJBOWWY.js → close-many-2IV4J2TR.js} +103 -82
  257. package/dist/cli-bundle/chunks/close-many-2IV4J2TR.js.map +1 -0
  258. package/dist/cli-bundle/chunks/{close-many-BFMP6HHK.js → close-many-SWY34BII.js} +102 -81
  259. package/dist/cli-bundle/chunks/close-many-SWY34BII.js.map +7 -0
  260. package/dist/cli-bundle/chunks/{comments-ETHABIY6.js → comments-4FGNTSNV.js} +8 -8
  261. package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js → comments-7YS5MY5X.js} +8 -8
  262. package/dist/cli-bundle/chunks/config-BZJKK7FZ.js +1062 -0
  263. package/dist/cli-bundle/chunks/config-BZJKK7FZ.js.map +1 -0
  264. package/dist/cli-bundle/chunks/config-G74GISC4.js +1072 -0
  265. package/dist/cli-bundle/chunks/config-G74GISC4.js.map +7 -0
  266. package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js → context-LHVKJSPJ.js} +12 -12
  267. package/dist/cli-bundle/chunks/{context-XDI4DKKT.js → context-ZQY54JNS.js} +12 -12
  268. package/dist/cli-bundle/chunks/{contracts-SMOAN5NF.js → contracts-CP2EZJC7.js} +320 -199
  269. package/dist/cli-bundle/chunks/contracts-CP2EZJC7.js.map +7 -0
  270. package/dist/cli-bundle/chunks/{contracts-KP4QAGVW.js → contracts-FIZLMP7O.js} +321 -200
  271. package/dist/cli-bundle/chunks/contracts-FIZLMP7O.js.map +1 -0
  272. package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js → copy-GYNQQPW2.js} +5 -5
  273. package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js → copy-TLW7JTQT.js} +5 -5
  274. package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js → create-VSKYSOCD.js} +12 -12
  275. package/dist/cli-bundle/chunks/create-XTMAPS7I.js +28 -0
  276. package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js → delete-4W5JYCEG.js} +5 -5
  277. package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js → delete-ANTOTI2I.js} +5 -5
  278. package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js → deps-HPPE6MJN.js} +5 -5
  279. package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js → deps-ZQZN54EZ.js} +5 -5
  280. package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js → docs-RPOVFMP3.js} +7 -7
  281. package/dist/cli-bundle/chunks/{docs-2TIFR62T.js → docs-XJNYBJGE.js} +7 -7
  282. package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js → eval-DM6JBZTS.js} +10 -10
  283. package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js → eval-RFBI5FGS.js} +10 -10
  284. package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js → extension-B3YY4WY5.js} +11 -10
  285. package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js → extension-TTSEFQTS.js} +11 -10
  286. package/dist/cli-bundle/chunks/{files-DF3HO6XK.js → files-5D65CHGE.js} +7 -7
  287. package/dist/cli-bundle/chunks/{files-T5ODMETM.js → files-GPIG77EN.js} +7 -7
  288. package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js → focus-C3PEJV2C.js} +6 -6
  289. package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js → focus-ZHN7WIGX.js} +6 -6
  290. package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js → gc-D4JQ6OWN.js} +3 -3
  291. package/dist/cli-bundle/chunks/{gc-FULIVYR4.js → gc-VZIXDL32.js} +3 -3
  292. package/dist/cli-bundle/chunks/{get-VYPIICPC.js → get-GIBRUUOP.js} +121 -81
  293. package/dist/cli-bundle/chunks/get-GIBRUUOP.js.map +1 -0
  294. package/dist/cli-bundle/chunks/{get-AWK324RS.js → get-IOVAN6RU.js} +120 -80
  295. package/dist/cli-bundle/chunks/get-IOVAN6RU.js.map +7 -0
  296. package/dist/cli-bundle/chunks/{health-Q66C43GN.js → health-L2U3AFKV.js} +437 -264
  297. package/dist/cli-bundle/chunks/health-L2U3AFKV.js.map +1 -0
  298. package/dist/cli-bundle/chunks/{health-FBCVZGSX.js → health-MM7AWXYF.js} +436 -263
  299. package/dist/cli-bundle/chunks/health-MM7AWXYF.js.map +7 -0
  300. package/dist/cli-bundle/chunks/history-DD7L7BNL.js +18 -0
  301. package/dist/cli-bundle/chunks/{history-X4OSES6K.js → history-IL7XCEX2.js} +8 -8
  302. package/dist/cli-bundle/chunks/{history-compact-2GHT32UX.js → history-compact-HALOTOU7.js} +214 -135
  303. package/dist/cli-bundle/chunks/history-compact-HALOTOU7.js.map +1 -0
  304. package/dist/cli-bundle/chunks/{history-compact-WLCQEKXS.js → history-compact-MV25P7DM.js} +213 -134
  305. package/dist/cli-bundle/chunks/history-compact-MV25P7DM.js.map +7 -0
  306. package/dist/cli-bundle/chunks/history-redact-IX4YEWMY.js +19 -0
  307. package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js → history-redact-VYCWQFK7.js} +9 -9
  308. package/dist/cli-bundle/chunks/{history-repair-FY75IC26.js → history-repair-44MODPQF.js} +124 -84
  309. package/dist/cli-bundle/chunks/history-repair-44MODPQF.js.map +1 -0
  310. package/dist/cli-bundle/chunks/{history-repair-GABSDSVD.js → history-repair-CPNAOCNF.js} +123 -83
  311. package/dist/cli-bundle/chunks/history-repair-CPNAOCNF.js.map +7 -0
  312. package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js → init-F27NHENZ.js} +12 -11
  313. package/dist/cli-bundle/chunks/init-HHVQQP6C.js +22 -0
  314. package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js → learnings-HJVDQIGY.js} +8 -8
  315. package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js → learnings-XSFSUUWK.js} +8 -8
  316. package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js → list-HPMEKCAA.js} +8 -8
  317. package/dist/cli-bundle/chunks/{list-ROT7JF62.js → list-VMPWTURB.js} +8 -8
  318. package/dist/cli-bundle/chunks/{next-66BJB4N2.js → next-ETXF2ZCN.js} +59 -37
  319. package/dist/cli-bundle/chunks/next-ETXF2ZCN.js.map +7 -0
  320. package/dist/cli-bundle/chunks/{next-N5MWJTBY.js → next-QM6YJIIS.js} +60 -38
  321. package/dist/cli-bundle/chunks/next-QM6YJIIS.js.map +1 -0
  322. package/dist/cli-bundle/chunks/{notes-FW6YFLND.js → notes-GDZIKGR6.js} +8 -8
  323. package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js → notes-WDDBPC4D.js} +8 -8
  324. package/dist/cli-bundle/chunks/{plan-ZHKZ7JVF.js → plan-BGDR73Z6.js} +373 -279
  325. package/dist/cli-bundle/chunks/plan-BGDR73Z6.js.map +1 -0
  326. package/dist/cli-bundle/chunks/{plan-DQ7G4EDC.js → plan-C5IMM335.js} +372 -278
  327. package/dist/cli-bundle/chunks/plan-C5IMM335.js.map +7 -0
  328. package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js → profile-CCOKZ2IQ.js} +9 -9
  329. package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js → profile-HUCENIEQ.js} +9 -9
  330. package/dist/cli-bundle/chunks/{register-list-query-Y2VRHPCL.js → register-list-query-ROSNIL52.js} +80 -83
  331. package/dist/cli-bundle/chunks/register-list-query-ROSNIL52.js.map +1 -0
  332. package/dist/cli-bundle/chunks/{register-list-query-KY6Z6WV7.js → register-list-query-XN4ZRHSV.js} +79 -82
  333. package/dist/cli-bundle/chunks/register-list-query-XN4ZRHSV.js.map +7 -0
  334. package/dist/cli-bundle/chunks/{register-mutation-PCARIGZS.js → register-mutation-CFSB2MS3.js} +406 -385
  335. package/dist/cli-bundle/chunks/register-mutation-CFSB2MS3.js.map +1 -0
  336. package/dist/cli-bundle/chunks/{register-mutation-N6AYSKPM.js → register-mutation-KRLAHEL2.js} +405 -384
  337. package/dist/cli-bundle/chunks/register-mutation-KRLAHEL2.js.map +7 -0
  338. package/dist/cli-bundle/chunks/{register-operations-L6CYTOIH.js → register-operations-4PASGJDB.js} +112 -93
  339. package/dist/cli-bundle/chunks/register-operations-4PASGJDB.js.map +7 -0
  340. package/dist/cli-bundle/chunks/{register-operations-YAT6FUUB.js → register-operations-MBN4KGUM.js} +113 -94
  341. package/dist/cli-bundle/chunks/register-operations-MBN4KGUM.js.map +1 -0
  342. package/dist/cli-bundle/chunks/{register-setup-N7UGXYJC.js → register-setup-VIAWYFP5.js} +129 -104
  343. package/dist/cli-bundle/chunks/register-setup-VIAWYFP5.js.map +1 -0
  344. package/dist/cli-bundle/chunks/{register-setup-MPANILQF.js → register-setup-ZCGKHDKL.js} +128 -103
  345. package/dist/cli-bundle/chunks/register-setup-ZCGKHDKL.js.map +7 -0
  346. package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js → restore-4CBWUMCX.js} +9 -9
  347. package/dist/cli-bundle/chunks/restore-5UEAGG3W.js +17 -0
  348. package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js → scheduling-shortcuts-6VFKNKCM.js} +12 -12
  349. package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js → scheduling-shortcuts-ERHCVTEM.js} +12 -12
  350. package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js → schema-TDGK6N3I.js} +7 -7
  351. package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js → schema-UE5KKAUX.js} +7 -7
  352. package/dist/cli-bundle/chunks/{search-KP6H7COV.js → search-FP7MEU4S.js} +10 -10
  353. package/dist/cli-bundle/chunks/{search-CX5UMV4H.js → search-K4CFLQ5S.js} +10 -10
  354. package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js → stats-NJJCALEZ.js} +6 -6
  355. package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js → stats-XT6QRKQY.js} +6 -6
  356. package/dist/cli-bundle/chunks/{telemetry-DIFPXCAT.js → telemetry-5SQ5UDXC.js} +84 -70
  357. package/dist/cli-bundle/chunks/telemetry-5SQ5UDXC.js.map +7 -0
  358. package/dist/cli-bundle/chunks/{telemetry-WTYFUPRL.js → telemetry-HVXFZA2U.js} +85 -71
  359. package/dist/cli-bundle/chunks/telemetry-HVXFZA2U.js.map +1 -0
  360. package/dist/cli-bundle/chunks/{test-QNDXZQCW.js → test-UFSJ5YIO.js} +15 -14
  361. package/dist/cli-bundle/chunks/{test-HU2BS7EY.js → test-YCDAUBWF.js} +15 -14
  362. package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js +427 -0
  363. package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js.map +1 -0
  364. package/dist/cli-bundle/chunks/test-all-PM7UYN42.js +430 -0
  365. package/dist/cli-bundle/chunks/test-all-PM7UYN42.js.map +7 -0
  366. package/dist/cli-bundle/chunks/{test-runs-CA6K32RD.js → test-runs-FK5E75AA.js} +185 -147
  367. package/dist/cli-bundle/chunks/test-runs-FK5E75AA.js.map +1 -0
  368. package/dist/cli-bundle/chunks/{test-runs-LANLLPVO.js → test-runs-H4TGWGRN.js} +184 -146
  369. package/dist/cli-bundle/chunks/test-runs-H4TGWGRN.js.map +7 -0
  370. package/dist/cli-bundle/chunks/update-MTCFES6X.js +24 -0
  371. package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js → update-Y5WQVT5O.js} +15 -15
  372. package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js → update-many-6YAYYRLE.js} +83 -68
  373. package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js.map → update-many-6YAYYRLE.js.map} +2 -2
  374. package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js → update-many-JTKKSA7Y.js} +84 -69
  375. package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js.map → update-many-JTKKSA7Y.js.map} +1 -1
  376. package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js → upgrade-DTAHZ236.js} +11 -10
  377. package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js.map → upgrade-DTAHZ236.js.map} +1 -1
  378. package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js → upgrade-JUDU7YL4.js} +13 -12
  379. package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js.map → upgrade-JUDU7YL4.js.map} +1 -1
  380. package/dist/cli-bundle/chunks/{validate-2G566PKQ.js → validate-732RWS5W.js} +440 -319
  381. package/dist/cli-bundle/chunks/validate-732RWS5W.js.map +7 -0
  382. package/dist/cli-bundle/chunks/{validate-BDPVXHHH.js → validate-W7H5TEDC.js} +441 -320
  383. package/dist/cli-bundle/chunks/validate-W7H5TEDC.js.map +1 -0
  384. package/dist/cli-bundle/main.js +986 -1500
  385. package/dist/cli-bundle/main.js.map +4 -4
  386. package/dist/core/config/nested-settings.js +89 -67
  387. package/dist/core/config/nested-settings.js.map +1 -1
  388. package/dist/core/extensions/activation-summary-markdown.js +23 -12
  389. package/dist/core/extensions/activation-summary-markdown.js.map +1 -1
  390. package/dist/core/extensions/extension-policy.d.ts +18 -3
  391. package/dist/core/extensions/extension-policy.js +116 -106
  392. package/dist/core/extensions/extension-policy.js.map +1 -1
  393. package/dist/core/extensions/loader.js +310 -232
  394. package/dist/core/extensions/loader.js.map +1 -1
  395. package/dist/core/governance/metadata-coverage.js +20 -28
  396. package/dist/core/governance/metadata-coverage.js.map +1 -1
  397. package/dist/core/history/drift-scan.js +93 -81
  398. package/dist/core/history/drift-scan.js.map +1 -1
  399. package/dist/core/item/item-format.js +523 -410
  400. package/dist/core/item/item-format.js.map +1 -1
  401. package/dist/core/item/item-type-definition.js +14 -14
  402. package/dist/core/item/item-type-definition.js.map +1 -1
  403. package/dist/core/item/type-registry.js +87 -82
  404. package/dist/core/item/type-registry.js.map +1 -1
  405. package/dist/core/output/mutation-projection.js +42 -26
  406. package/dist/core/output/mutation-projection.js.map +1 -1
  407. package/dist/core/schema/runtime-schema.js +34 -28
  408. package/dist/core/schema/runtime-schema.js.map +1 -1
  409. package/dist/core/search/semantic-defaults.js +64 -37
  410. package/dist/core/search/semantic-defaults.js.map +1 -1
  411. package/dist/core/search/vector-stores.js +32 -17
  412. package/dist/core/search/vector-stores.js.map +1 -1
  413. package/dist/core/sentry/helpers.js +31 -28
  414. package/dist/core/sentry/helpers.js.map +1 -1
  415. package/dist/core/sentry/instrument.js +54 -43
  416. package/dist/core/sentry/instrument.js.map +1 -1
  417. package/dist/core/store/front-matter-cache.js +239 -153
  418. package/dist/core/store/front-matter-cache.js.map +1 -1
  419. package/dist/core/store/item-store.js +33 -26
  420. package/dist/core/store/item-store.js.map +1 -1
  421. package/dist/core/store/settings.js +247 -203
  422. package/dist/core/store/settings.js.map +1 -1
  423. package/dist/core/test/background-runs.js +189 -160
  424. package/dist/core/test/background-runs.js.map +1 -1
  425. package/dist/mcp/server.js +387 -367
  426. package/dist/mcp/server.js.map +1 -1
  427. package/dist/sdk/cli-contracts/flag-contracts.js +111 -180
  428. package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
  429. package/dist/sdk/cli-contracts/tool-schema.js +76 -45
  430. package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
  431. package/dist/sdk/compose.d.ts +4 -1
  432. package/dist/sdk/compose.js +181 -115
  433. package/dist/sdk/compose.js.map +1 -1
  434. package/docs/RELEASING.md +2 -3
  435. package/package.json +2 -2
  436. package/packages/pm-beads/extensions/beads/runtime.ts +240 -167
  437. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +65 -58
  438. package/packages/pm-todos/extensions/todos/runtime.ts +65 -42
  439. package/dist/cli-bundle/chunks/activity-EJBMXUBH.js +0 -16
  440. package/dist/cli-bundle/chunks/aggregate-MOC4TR2G.js.map +0 -1
  441. package/dist/cli-bundle/chunks/chunk-53ARXF2O.js.map +0 -7
  442. package/dist/cli-bundle/chunks/chunk-5IRVSKPS.js.map +0 -1
  443. package/dist/cli-bundle/chunks/chunk-5T6WPLRO.js.map +0 -7
  444. package/dist/cli-bundle/chunks/chunk-6T5ZIWBS.js.map +0 -7
  445. package/dist/cli-bundle/chunks/chunk-6YRAMXRS.js.map +0 -1
  446. package/dist/cli-bundle/chunks/chunk-7WDETKGP.js.map +0 -7
  447. package/dist/cli-bundle/chunks/chunk-A3UNLXNJ.js.map +0 -7
  448. package/dist/cli-bundle/chunks/chunk-AWN4PPH5.js.map +0 -7
  449. package/dist/cli-bundle/chunks/chunk-BOWQWXLI.js.map +0 -1
  450. package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js +0 -115
  451. package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js.map +0 -1
  452. package/dist/cli-bundle/chunks/chunk-CHRNYKNI.js.map +0 -7
  453. package/dist/cli-bundle/chunks/chunk-CY5IJMUM.js.map +0 -1
  454. package/dist/cli-bundle/chunks/chunk-D5LYZVGB.js.map +0 -1
  455. package/dist/cli-bundle/chunks/chunk-DJDXAU74.js.map +0 -7
  456. package/dist/cli-bundle/chunks/chunk-DORJSBGJ.js.map +0 -7
  457. package/dist/cli-bundle/chunks/chunk-DU66JUGT.js.map +0 -7
  458. package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js +0 -118
  459. package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js.map +0 -7
  460. package/dist/cli-bundle/chunks/chunk-FDEVKXC4.js.map +0 -1
  461. package/dist/cli-bundle/chunks/chunk-GF7EAR22.js.map +0 -7
  462. package/dist/cli-bundle/chunks/chunk-HIBK6H4S.js.map +0 -1
  463. package/dist/cli-bundle/chunks/chunk-IHXXUIXS.js.map +0 -1
  464. package/dist/cli-bundle/chunks/chunk-ISEKN64V.js +0 -35
  465. package/dist/cli-bundle/chunks/chunk-ISEKN64V.js.map +0 -7
  466. package/dist/cli-bundle/chunks/chunk-IZQOJR2B.js.map +0 -7
  467. package/dist/cli-bundle/chunks/chunk-JTRKME24.js.map +0 -1
  468. package/dist/cli-bundle/chunks/chunk-JZG5ADVE.js.map +0 -1
  469. package/dist/cli-bundle/chunks/chunk-K46GQ265.js.map +0 -1
  470. package/dist/cli-bundle/chunks/chunk-KGQ3W65B.js.map +0 -1
  471. package/dist/cli-bundle/chunks/chunk-KTMMTOIP.js.map +0 -7
  472. package/dist/cli-bundle/chunks/chunk-KYDYQMNW.js.map +0 -7
  473. package/dist/cli-bundle/chunks/chunk-NIBP3I7A.js.map +0 -1
  474. package/dist/cli-bundle/chunks/chunk-NO6Y6FB2.js.map +0 -7
  475. package/dist/cli-bundle/chunks/chunk-QE5UFCCO.js.map +0 -1
  476. package/dist/cli-bundle/chunks/chunk-RM6MHL6A.js.map +0 -7
  477. package/dist/cli-bundle/chunks/chunk-RPRW26NG.js.map +0 -1
  478. package/dist/cli-bundle/chunks/chunk-SNUK7H5J.js.map +0 -7
  479. package/dist/cli-bundle/chunks/chunk-T7ZMQI4J.js.map +0 -1
  480. package/dist/cli-bundle/chunks/chunk-UB3V5WUI.js.map +0 -1
  481. package/dist/cli-bundle/chunks/chunk-UFKNF23C.js.map +0 -7
  482. package/dist/cli-bundle/chunks/chunk-V3KLX7U7.js.map +0 -1
  483. package/dist/cli-bundle/chunks/chunk-VD3LKZFX.js.map +0 -1
  484. package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js +0 -32
  485. package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js.map +0 -1
  486. package/dist/cli-bundle/chunks/chunk-WTRUDJ3R.js.map +0 -1
  487. package/dist/cli-bundle/chunks/chunk-Z55WX4IQ.js.map +0 -1
  488. package/dist/cli-bundle/chunks/chunk-Z5BM2FKQ.js.map +0 -7
  489. package/dist/cli-bundle/chunks/chunk-ZEATCVAC.js.map +0 -7
  490. package/dist/cli-bundle/chunks/chunk-ZFIEEDTJ.js.map +0 -7
  491. package/dist/cli-bundle/chunks/chunk-ZIE6WXJ2.js.map +0 -1
  492. package/dist/cli-bundle/chunks/close-37KEHLYM.js +0 -14
  493. package/dist/cli-bundle/chunks/close-many-BFMP6HHK.js.map +0 -7
  494. package/dist/cli-bundle/chunks/close-many-CXJBOWWY.js.map +0 -1
  495. package/dist/cli-bundle/chunks/config-FIXJZEQK.js +0 -1541
  496. package/dist/cli-bundle/chunks/config-FIXJZEQK.js.map +0 -7
  497. package/dist/cli-bundle/chunks/config-X3ZVCUUG.js +0 -1531
  498. package/dist/cli-bundle/chunks/config-X3ZVCUUG.js.map +0 -1
  499. package/dist/cli-bundle/chunks/contracts-KP4QAGVW.js.map +0 -1
  500. package/dist/cli-bundle/chunks/contracts-SMOAN5NF.js.map +0 -7
  501. package/dist/cli-bundle/chunks/create-DFMNBKBS.js +0 -28
  502. package/dist/cli-bundle/chunks/get-AWK324RS.js.map +0 -7
  503. package/dist/cli-bundle/chunks/get-VYPIICPC.js.map +0 -1
  504. package/dist/cli-bundle/chunks/health-FBCVZGSX.js.map +0 -7
  505. package/dist/cli-bundle/chunks/health-Q66C43GN.js.map +0 -1
  506. package/dist/cli-bundle/chunks/history-5XUSLAJA.js +0 -18
  507. package/dist/cli-bundle/chunks/history-compact-2GHT32UX.js.map +0 -1
  508. package/dist/cli-bundle/chunks/history-compact-WLCQEKXS.js.map +0 -7
  509. package/dist/cli-bundle/chunks/history-redact-BVHWDXPR.js +0 -19
  510. package/dist/cli-bundle/chunks/history-repair-FY75IC26.js.map +0 -1
  511. package/dist/cli-bundle/chunks/history-repair-GABSDSVD.js.map +0 -7
  512. package/dist/cli-bundle/chunks/init-TRYJELH4.js +0 -21
  513. package/dist/cli-bundle/chunks/next-66BJB4N2.js.map +0 -7
  514. package/dist/cli-bundle/chunks/next-N5MWJTBY.js.map +0 -1
  515. package/dist/cli-bundle/chunks/plan-DQ7G4EDC.js.map +0 -7
  516. package/dist/cli-bundle/chunks/plan-ZHKZ7JVF.js.map +0 -1
  517. package/dist/cli-bundle/chunks/register-list-query-KY6Z6WV7.js.map +0 -7
  518. package/dist/cli-bundle/chunks/register-list-query-Y2VRHPCL.js.map +0 -1
  519. package/dist/cli-bundle/chunks/register-mutation-N6AYSKPM.js.map +0 -7
  520. package/dist/cli-bundle/chunks/register-mutation-PCARIGZS.js.map +0 -1
  521. package/dist/cli-bundle/chunks/register-operations-L6CYTOIH.js.map +0 -7
  522. package/dist/cli-bundle/chunks/register-operations-YAT6FUUB.js.map +0 -1
  523. package/dist/cli-bundle/chunks/register-setup-MPANILQF.js.map +0 -7
  524. package/dist/cli-bundle/chunks/register-setup-N7UGXYJC.js.map +0 -1
  525. package/dist/cli-bundle/chunks/restore-IRAKSWIW.js +0 -17
  526. package/dist/cli-bundle/chunks/telemetry-DIFPXCAT.js.map +0 -7
  527. package/dist/cli-bundle/chunks/telemetry-WTYFUPRL.js.map +0 -1
  528. package/dist/cli-bundle/chunks/test-all-PZTBLLQ6.js +0 -360
  529. package/dist/cli-bundle/chunks/test-all-PZTBLLQ6.js.map +0 -7
  530. package/dist/cli-bundle/chunks/test-all-XLPI4USF.js +0 -357
  531. package/dist/cli-bundle/chunks/test-all-XLPI4USF.js.map +0 -1
  532. package/dist/cli-bundle/chunks/test-runs-CA6K32RD.js.map +0 -1
  533. package/dist/cli-bundle/chunks/test-runs-LANLLPVO.js.map +0 -7
  534. package/dist/cli-bundle/chunks/update-UXDLTEOZ.js +0 -24
  535. package/dist/cli-bundle/chunks/validate-2G566PKQ.js.map +0 -7
  536. package/dist/cli-bundle/chunks/validate-BDPVXHHH.js.map +0 -1
  537. /package/dist/cli-bundle/chunks/{activity-MVSEND6D.js.map → activity-CUC4JY3U.js.map} +0 -0
  538. /package/dist/cli-bundle/chunks/{activity-EJBMXUBH.js.map → activity-WEIEMM73.js.map} +0 -0
  539. /package/dist/cli-bundle/chunks/{append-KDHT4GHI.js.map → append-H32VOR2Y.js.map} +0 -0
  540. /package/dist/cli-bundle/chunks/{append-LEDBAM3K.js.map → append-UBM632FK.js.map} +0 -0
  541. /package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js.map → chunk-2ASNV4DH.js.map} +0 -0
  542. /package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js.map → chunk-2CHRYUXL.js.map} +0 -0
  543. /package/dist/cli-bundle/chunks/{chunk-DRPF274X.js.map → chunk-3LCUASYG.js.map} +0 -0
  544. /package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js.map → chunk-3Q2HBMTI.js.map} +0 -0
  545. /package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js.map → chunk-55XRYWEG.js.map} +0 -0
  546. /package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js.map → chunk-A6VOGKBA.js.map} +0 -0
  547. /package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js.map → chunk-AIAIXG7I.js.map} +0 -0
  548. /package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js.map → chunk-BTX5MIQF.js.map} +0 -0
  549. /package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js.map → chunk-CYBDUHNO.js.map} +0 -0
  550. /package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js.map → chunk-CZPVDLD2.js.map} +0 -0
  551. /package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js.map → chunk-EUKTMRN3.js.map} +0 -0
  552. /package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js.map → chunk-FFOQHGNH.js.map} +0 -0
  553. /package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js.map → chunk-GFMSLORL.js.map} +0 -0
  554. /package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js.map → chunk-H4GRLYJS.js.map} +0 -0
  555. /package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js.map → chunk-HQTPRV4D.js.map} +0 -0
  556. /package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js.map → chunk-JMK5GCK2.js.map} +0 -0
  557. /package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js.map → chunk-K2VYLVX4.js.map} +0 -0
  558. /package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js.map → chunk-KCO2EAN5.js.map} +0 -0
  559. /package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js.map → chunk-KLXF7NCC.js.map} +0 -0
  560. /package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js.map → chunk-LRKMWUUV.js.map} +0 -0
  561. /package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js.map → chunk-LTRAF2D7.js.map} +0 -0
  562. /package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js.map → chunk-MRD4T5LF.js.map} +0 -0
  563. /package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js.map → chunk-N2JSWVWG.js.map} +0 -0
  564. /package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js.map → chunk-QH3FSKRJ.js.map} +0 -0
  565. /package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js.map → chunk-S62UANU7.js.map} +0 -0
  566. /package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js.map → chunk-U2BEEM2X.js.map} +0 -0
  567. /package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js.map → chunk-UT73HUPC.js.map} +0 -0
  568. /package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js.map → chunk-UTSH5GWX.js.map} +0 -0
  569. /package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js.map → chunk-Y4NRKBFW.js.map} +0 -0
  570. /package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js.map → chunk-YPKFV2JR.js.map} +0 -0
  571. /package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js.map → chunk-ZNHEYCDD.js.map} +0 -0
  572. /package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js.map → chunk-ZNT7KEWE.js.map} +0 -0
  573. /package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js.map → claim-SENTPZBN.js.map} +0 -0
  574. /package/dist/cli-bundle/chunks/{claim-6NINZYB3.js.map → claim-Z7MEQCBT.js.map} +0 -0
  575. /package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js.map → close-424MX4CU.js.map} +0 -0
  576. /package/dist/cli-bundle/chunks/{close-37KEHLYM.js.map → close-YCWQQPDS.js.map} +0 -0
  577. /package/dist/cli-bundle/chunks/{comments-ETHABIY6.js.map → comments-4FGNTSNV.js.map} +0 -0
  578. /package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js.map → comments-7YS5MY5X.js.map} +0 -0
  579. /package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js.map → context-LHVKJSPJ.js.map} +0 -0
  580. /package/dist/cli-bundle/chunks/{context-XDI4DKKT.js.map → context-ZQY54JNS.js.map} +0 -0
  581. /package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js.map → copy-GYNQQPW2.js.map} +0 -0
  582. /package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js.map → copy-TLW7JTQT.js.map} +0 -0
  583. /package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js.map → create-VSKYSOCD.js.map} +0 -0
  584. /package/dist/cli-bundle/chunks/{create-DFMNBKBS.js.map → create-XTMAPS7I.js.map} +0 -0
  585. /package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js.map → delete-4W5JYCEG.js.map} +0 -0
  586. /package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js.map → delete-ANTOTI2I.js.map} +0 -0
  587. /package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js.map → deps-HPPE6MJN.js.map} +0 -0
  588. /package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js.map → deps-ZQZN54EZ.js.map} +0 -0
  589. /package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js.map → docs-RPOVFMP3.js.map} +0 -0
  590. /package/dist/cli-bundle/chunks/{docs-2TIFR62T.js.map → docs-XJNYBJGE.js.map} +0 -0
  591. /package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js.map → eval-DM6JBZTS.js.map} +0 -0
  592. /package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js.map → eval-RFBI5FGS.js.map} +0 -0
  593. /package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js.map → extension-B3YY4WY5.js.map} +0 -0
  594. /package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js.map → extension-TTSEFQTS.js.map} +0 -0
  595. /package/dist/cli-bundle/chunks/{files-DF3HO6XK.js.map → files-5D65CHGE.js.map} +0 -0
  596. /package/dist/cli-bundle/chunks/{files-T5ODMETM.js.map → files-GPIG77EN.js.map} +0 -0
  597. /package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js.map → focus-C3PEJV2C.js.map} +0 -0
  598. /package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js.map → focus-ZHN7WIGX.js.map} +0 -0
  599. /package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js.map → gc-D4JQ6OWN.js.map} +0 -0
  600. /package/dist/cli-bundle/chunks/{gc-FULIVYR4.js.map → gc-VZIXDL32.js.map} +0 -0
  601. /package/dist/cli-bundle/chunks/{history-5XUSLAJA.js.map → history-DD7L7BNL.js.map} +0 -0
  602. /package/dist/cli-bundle/chunks/{history-X4OSES6K.js.map → history-IL7XCEX2.js.map} +0 -0
  603. /package/dist/cli-bundle/chunks/{history-redact-BVHWDXPR.js.map → history-redact-IX4YEWMY.js.map} +0 -0
  604. /package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js.map → history-redact-VYCWQFK7.js.map} +0 -0
  605. /package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js.map → init-F27NHENZ.js.map} +0 -0
  606. /package/dist/cli-bundle/chunks/{init-TRYJELH4.js.map → init-HHVQQP6C.js.map} +0 -0
  607. /package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js.map → learnings-HJVDQIGY.js.map} +0 -0
  608. /package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js.map → learnings-XSFSUUWK.js.map} +0 -0
  609. /package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js.map → list-HPMEKCAA.js.map} +0 -0
  610. /package/dist/cli-bundle/chunks/{list-ROT7JF62.js.map → list-VMPWTURB.js.map} +0 -0
  611. /package/dist/cli-bundle/chunks/{notes-FW6YFLND.js.map → notes-GDZIKGR6.js.map} +0 -0
  612. /package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js.map → notes-WDDBPC4D.js.map} +0 -0
  613. /package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js.map → profile-CCOKZ2IQ.js.map} +0 -0
  614. /package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js.map → profile-HUCENIEQ.js.map} +0 -0
  615. /package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js.map → restore-4CBWUMCX.js.map} +0 -0
  616. /package/dist/cli-bundle/chunks/{restore-IRAKSWIW.js.map → restore-5UEAGG3W.js.map} +0 -0
  617. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js.map → scheduling-shortcuts-6VFKNKCM.js.map} +0 -0
  618. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js.map → scheduling-shortcuts-ERHCVTEM.js.map} +0 -0
  619. /package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js.map → schema-TDGK6N3I.js.map} +0 -0
  620. /package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js.map → schema-UE5KKAUX.js.map} +0 -0
  621. /package/dist/cli-bundle/chunks/{search-KP6H7COV.js.map → search-FP7MEU4S.js.map} +0 -0
  622. /package/dist/cli-bundle/chunks/{search-CX5UMV4H.js.map → search-K4CFLQ5S.js.map} +0 -0
  623. /package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js.map → stats-NJJCALEZ.js.map} +0 -0
  624. /package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js.map → stats-XT6QRKQY.js.map} +0 -0
  625. /package/dist/cli-bundle/chunks/{test-QNDXZQCW.js.map → test-UFSJ5YIO.js.map} +0 -0
  626. /package/dist/cli-bundle/chunks/{test-HU2BS7EY.js.map → test-YCDAUBWF.js.map} +0 -0
  627. /package/dist/cli-bundle/chunks/{update-UXDLTEOZ.js.map → update-MTCFES6X.js.map} +0 -0
  628. /package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js.map → update-Y5WQVT5O.js.map} +0 -0
@@ -13,7 +13,7 @@ import {
13
13
  resolveSearchCorpusFields,
14
14
  resolveSettingsWithSemanticRuntimeDefaults,
15
15
  resolveVectorStores
16
- } from "./chunk-KYDYQMNW.js";
16
+ } from "./chunk-7TH5NMVB.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-KTMMTOIP.js";
27
+ } from "./chunk-W47SML5B.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-ZEATCVAC.js";
36
+ } from "./chunk-36UGKF4O.js";
37
37
  import {
38
38
  parseLimit,
39
39
  parsePriority,
40
40
  parseType
41
- } from "./chunk-7L6TXOOC.js";
41
+ } from "./chunk-JMK5GCK2.js";
42
42
  import {
43
43
  collectRegisteredItemFieldNames,
44
44
  listAllDocumentCandidatesCached,
45
45
  listAllFrontMatter,
46
46
  toItemRecord
47
- } from "./chunk-LBH7UYKY.js";
47
+ } from "./chunk-JXAUVO6X.js";
48
48
  import {
49
49
  isTerminalStatus,
50
50
  parseItemDocument
51
- } from "./chunk-ZFIEEDTJ.js";
51
+ } from "./chunk-IEEJQCZ4.js";
52
52
  import {
53
53
  compareTimestampStrings,
54
54
  nowIso,
55
55
  resolveIsoOrRelative
56
- } from "./chunk-MLHX6DN5.js";
56
+ } from "./chunk-AIAIXG7I.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-SNUK7H5J.js";
76
+ } from "./chunk-7NSPKJUS.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] = "0417fe76-c2a2-5a0a-82f3-0861f46175e9");
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;
@@ -598,20 +596,20 @@ function buildVerboseSearchFilters(params) {
598
596
  return {
599
597
  mode: effectiveMode,
600
598
  match_mode: matchMode,
601
- status: isStatusAllFilterInput(options.status) ? "all" : options.status ?? null,
602
- type: options.type ?? null,
603
- tag: options.tag ?? null,
604
- priority: options.priority ?? null,
605
- deadline_before: options.deadlineBefore ?? null,
606
- deadline_after: options.deadlineAfter ?? null,
607
- updated_after: options.updatedAfter ?? null,
608
- updated_before: options.updatedBefore ?? null,
609
- created_after: options.createdAfter ?? null,
610
- created_before: options.createdBefore ?? null,
611
- assignee: options.assignee ?? null,
612
- sprint: options.sprint ?? null,
613
- release: options.release ?? null,
614
- parent: options.parent ?? null,
599
+ status: isStatusAllFilterInput(options.status) ? "all" : valueOrNull(options.status),
600
+ type: valueOrNull(options.type),
601
+ tag: valueOrNull(options.tag),
602
+ priority: valueOrNull(options.priority),
603
+ deadline_before: valueOrNull(options.deadlineBefore),
604
+ deadline_after: valueOrNull(options.deadlineAfter),
605
+ updated_after: valueOrNull(options.updatedAfter),
606
+ updated_before: valueOrNull(options.updatedBefore),
607
+ created_after: valueOrNull(options.createdAfter),
608
+ created_before: valueOrNull(options.createdBefore),
609
+ assignee: valueOrNull(options.assignee),
610
+ sprint: valueOrNull(options.sprint),
611
+ release: valueOrNull(options.release),
612
+ parent: valueOrNull(options.parent),
615
613
  ...buildGovernanceMissingFilterEcho(options),
616
614
  ...buildContentFilterEcho(options),
617
615
  include_linked: includeLinked,
@@ -624,10 +622,13 @@ function buildVerboseSearchFilters(params) {
624
622
  rerank_enabled: rerank.enabled,
625
623
  rerank_model: rerank.model,
626
624
  rerank_top_k: rerank.top_k,
627
- limit: options.limit ?? null,
625
+ limit: valueOrNull(options.limit),
628
626
  runtime_filters: runtimeFieldFilters
629
627
  };
630
628
  }
629
+ function valueOrNull(value) {
630
+ return value ?? null;
631
+ }
631
632
  function collectErrorCauseCodes(error) {
632
633
  const codes = [];
633
634
  let current = error;
@@ -652,16 +653,6 @@ function classifyImplicitSemanticFallbackReason(error) {
652
653
  }
653
654
  return "error";
654
655
  }
655
- function buildImplicitSemanticFallbackWarning(error) {
656
- const reason = classifyImplicitSemanticFallbackReason(error);
657
- if (reason === "timeout") {
658
- return "search_implicit_semantic_fallback:timeout:using_keyword_mode";
659
- }
660
- if (reason === "connection") {
661
- return "search_implicit_semantic_fallback:connection:using_keyword_mode";
662
- }
663
- return "search_implicit_semantic_fallback:error:using_keyword_mode";
664
- }
665
656
  function buildExplicitSemanticFallbackWarning(requestedMode, error) {
666
657
  const reason = classifyImplicitSemanticFallbackReason(error);
667
658
  return `search_${requestedMode}_fallback:${reason}:using_keyword_mode`;
@@ -793,7 +784,6 @@ var _testOnlySearchCommand = {
793
784
  buildExplicitSemanticFallbackWarning,
794
785
  buildCompactSearchFilterSummary,
795
786
  buildHybridLexicalScore,
796
- buildImplicitSemanticFallbackWarning,
797
787
  buildRerankCorpus,
798
788
  buildSemanticHits,
799
789
  classifyImplicitSemanticFallbackReason,
@@ -968,6 +958,9 @@ function resolveSearchMetadataFilterSet(options, typeRegistry, statusFilter) {
968
958
  };
969
959
  }
970
960
  function matchesScalarSearchFilters(item, filters) {
961
+ return matchesIdentitySearchFilters(item, filters) && matchesTimestampSearchFilters(item, filters) && matchesOwnerSearchFilters(item, filters);
962
+ }
963
+ function matchesIdentitySearchFilters(item, filters) {
971
964
  if (filters.statusSet && !filters.statusSet.has(item.status))
972
965
  return false;
973
966
  if (filters.typeFilter && item.type !== filters.typeFilter)
@@ -976,6 +969,9 @@ function matchesScalarSearchFilters(item, filters) {
976
969
  return false;
977
970
  if (filters.priorityFilter !== void 0 && item.priority !== filters.priorityFilter)
978
971
  return false;
972
+ return true;
973
+ }
974
+ function matchesTimestampSearchFilters(item, filters) {
979
975
  if (filters.deadlineBefore && (!item.deadline || compareTimestampStrings(item.deadline, filters.deadlineBefore) > 0))
980
976
  return false;
981
977
  if (filters.deadlineAfter && (!item.deadline || compareTimestampStrings(item.deadline, filters.deadlineAfter) < 0))
@@ -988,6 +984,9 @@ function matchesScalarSearchFilters(item, filters) {
988
984
  return false;
989
985
  if (filters.createdBefore && compareTimestampStrings(item.created_at, filters.createdBefore) > 0)
990
986
  return false;
987
+ return true;
988
+ }
989
+ function matchesOwnerSearchFilters(item, filters) {
991
990
  if (filters.assigneeFilter !== void 0 && item.assignee !== filters.assigneeFilter)
992
991
  return false;
993
992
  if (filters.sprintFilter !== void 0 && item.sprint !== filters.sprintFilter)
@@ -1192,26 +1191,8 @@ function buildHitHighlights(document, matchedFields, tokens) {
1192
1191
  }
1193
1192
  return highlights;
1194
1193
  }
1195
- function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning, idPrefix, applyCoverageBonus = false) {
1196
- const item = document.metadata;
1197
- const normalizedId = normalizeSearchPhrase(item.id);
1198
- const normalizedIdPrefix = typeof idPrefix === "string" ? idPrefix.trim().toLowerCase() : "";
1199
- const normalizedIdPrefixPhrase = normalizeSearchPhrase(normalizedIdPrefix);
1200
- const normalizedShortId = normalizedIdPrefixPhrase.length > 0 && normalizedId.startsWith(normalizedIdPrefixPhrase) ? normalizedId.slice(normalizedIdPrefixPhrase.length).trim() : normalizedId;
1201
- if (normalizedQuery === normalizedId || normalizedQuery === normalizedShortId) {
1202
- return {
1203
- item,
1204
- score: normalizedQuery === normalizedId ? EXACT_ID_MATCH_SCORE : SHORT_ID_MATCH_SCORE,
1205
- matched_fields: ["id"],
1206
- matched_all_terms: true,
1207
- exact_id_match: true
1208
- };
1209
- }
1210
- const titleTokenCounts = /* @__PURE__ */ new Map();
1211
- for (const token of tokenizeForExactTokenMatch(item.title)) {
1212
- titleTokenCounts.set(token, (titleTokenCounts.get(token) ?? 0) + 1);
1213
- }
1214
- const searchableFields = [
1194
+ function buildSearchableScoringFields(document, linkedCorpus, tuning) {
1195
+ return [
1215
1196
  ...SEARCHABLE_FIELD_BUILDERS.map((builder) => ({
1216
1197
  name: builder.name,
1217
1198
  value: builder.value(document),
@@ -1219,54 +1200,84 @@ function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning,
1219
1200
  })),
1220
1201
  { name: "linked_content", value: linkedCorpus, weight: tuning.linked_content_weight }
1221
1202
  ];
1222
- let score = 0;
1223
- const matched = /* @__PURE__ */ new Set();
1224
- const matchedTokens = /* @__PURE__ */ new Set();
1203
+ }
1204
+ function buildExactIdSearchHit(item, normalizedQuery, idPrefix) {
1205
+ const normalizedId = normalizeSearchPhrase(item.id);
1206
+ const normalizedIdPrefix = typeof idPrefix === "string" ? idPrefix.trim().toLowerCase() : "";
1207
+ const normalizedIdPrefixPhrase = normalizeSearchPhrase(normalizedIdPrefix);
1208
+ const normalizedShortId = normalizedIdPrefixPhrase.length > 0 && normalizedId.startsWith(normalizedIdPrefixPhrase) ? normalizedId.slice(normalizedIdPrefixPhrase.length).trim() : normalizedId;
1209
+ if (normalizedQuery !== normalizedId && normalizedQuery !== normalizedShortId) {
1210
+ return null;
1211
+ }
1212
+ return {
1213
+ item,
1214
+ score: normalizedQuery === normalizedId ? EXACT_ID_MATCH_SCORE : SHORT_ID_MATCH_SCORE,
1215
+ matched_fields: ["id"],
1216
+ matched_all_terms: true,
1217
+ exact_id_match: true
1218
+ };
1219
+ }
1220
+ function scoreTokenMatches(tokens, titleTokenCounts, searchableFields, tuning, state) {
1225
1221
  for (const token of tokens) {
1226
1222
  const exactTitleMatches = titleTokenCounts.get(token) ?? 0;
1227
1223
  if (exactTitleMatches > 0) {
1228
- score += exactTitleMatches * tuning.title_exact_bonus;
1229
- matched.add("title");
1230
- matchedTokens.add(token);
1224
+ state.score += exactTitleMatches * tuning.title_exact_bonus;
1225
+ state.matched.add("title");
1226
+ state.matchedTokens.add(token);
1231
1227
  }
1232
1228
  for (const field of searchableFields) {
1233
- const fieldValue = field.value.toLowerCase();
1234
- const occurrences = countOccurrences(fieldValue, token);
1229
+ const occurrences = countOccurrences(field.value.toLowerCase(), token);
1235
1230
  if (occurrences > 0) {
1236
- score += occurrences * field.weight;
1237
- matched.add(field.name);
1238
- matchedTokens.add(token);
1231
+ state.score += occurrences * field.weight;
1232
+ state.matched.add(field.name);
1233
+ state.matchedTokens.add(token);
1239
1234
  }
1240
1235
  }
1241
1236
  }
1237
+ }
1238
+ function scorePhraseMatches(item, normalizedQuery, searchableFields, state) {
1239
+ const normalizedTitle = normalizeSearchPhrase(item.title);
1240
+ if (normalizedTitle === normalizedQuery) {
1241
+ state.score += LONG_QUERY_TITLE_EXACT_BONUS;
1242
+ state.matched.add("title");
1243
+ }
1244
+ for (const field of searchableFields) {
1245
+ const phraseOccurrences = countOccurrences(normalizeSearchPhrase(field.value), normalizedQuery);
1246
+ if (phraseOccurrences > 0) {
1247
+ state.score += phraseOccurrences * field.weight * LONG_QUERY_PHRASE_MULTIPLIER;
1248
+ state.matched.add(field.name);
1249
+ }
1250
+ }
1251
+ }
1252
+ function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning, idPrefix, applyCoverageBonus = false) {
1253
+ const item = document.metadata;
1254
+ const exactIdHit = buildExactIdSearchHit(item, normalizedQuery, idPrefix);
1255
+ if (exactIdHit) {
1256
+ return exactIdHit;
1257
+ }
1258
+ const titleTokenCounts = /* @__PURE__ */ new Map();
1259
+ for (const token of tokenizeForExactTokenMatch(item.title)) {
1260
+ titleTokenCounts.set(token, (titleTokenCounts.get(token) ?? 0) + 1);
1261
+ }
1262
+ const searchableFields = buildSearchableScoringFields(document, linkedCorpus, tuning);
1263
+ const state = { score: 0, matched: /* @__PURE__ */ new Set(), matchedTokens: /* @__PURE__ */ new Set() };
1264
+ scoreTokenMatches(tokens, titleTokenCounts, searchableFields, tuning, state);
1242
1265
  const distinctTokens = new Set(tokens);
1243
- const matchedAllTerms = distinctTokens.size > 0 && matchedTokens.size === distinctTokens.size;
1266
+ const matchedAllTerms = distinctTokens.size > 0 && state.matchedTokens.size === distinctTokens.size;
1244
1267
  if (applyCoverageBonus && distinctTokens.size > 1 && matchedAllTerms) {
1245
- score += ALL_TERMS_COVERAGE_BONUS;
1268
+ state.score += ALL_TERMS_COVERAGE_BONUS;
1246
1269
  }
1247
1270
  const isLongPhraseQuery = tokens.length >= LONG_QUERY_TOKEN_THRESHOLD && normalizedQuery.includes(" ");
1248
1271
  if (isLongPhraseQuery) {
1249
- const normalizedTitle = normalizeSearchPhrase(item.title);
1250
- if (normalizedTitle === normalizedQuery) {
1251
- score += LONG_QUERY_TITLE_EXACT_BONUS;
1252
- matched.add("title");
1253
- }
1254
- for (const field of searchableFields) {
1255
- const normalizedField = normalizeSearchPhrase(field.value);
1256
- const phraseOccurrences = countOccurrences(normalizedField, normalizedQuery);
1257
- if (phraseOccurrences > 0) {
1258
- score += phraseOccurrences * field.weight * LONG_QUERY_PHRASE_MULTIPLIER;
1259
- matched.add(field.name);
1260
- }
1261
- }
1272
+ scorePhraseMatches(item, normalizedQuery, searchableFields, state);
1262
1273
  }
1263
- if (score <= 0) {
1274
+ if (state.score <= 0) {
1264
1275
  return null;
1265
1276
  }
1266
1277
  return {
1267
1278
  item,
1268
- score,
1269
- matched_fields: [...matched].sort((a, b) => a.localeCompare(b)),
1279
+ score: state.score,
1280
+ matched_fields: [...state.matched].sort((a, b) => a.localeCompare(b)),
1270
1281
  matched_all_terms: matchedAllTerms
1271
1282
  };
1272
1283
  }
@@ -1484,8 +1495,12 @@ function resolveExtensionVectorAdapter(settings) {
1484
1495
  if (typeof query !== "function") {
1485
1496
  return null;
1486
1497
  }
1498
+ const upsert = runtimeDefinition.upsert;
1499
+ const runtimeAdapterName = toOptionalNonEmptyString(runtimeDefinition.name) ?? toOptionalNonEmptyString(resolved.definition.name) ?? adapterName ?? "extension";
1487
1500
  return {
1488
- query
1501
+ adapterName: runtimeAdapterName,
1502
+ query,
1503
+ ...typeof upsert === "function" ? { upsert } : {}
1489
1504
  };
1490
1505
  }
1491
1506
  function normalizeExtensionProviderHits(providerName, raw, filteredById) {
@@ -1652,52 +1667,151 @@ function buildRerankCorpus(document) {
1652
1667
  document.body
1653
1668
  ].map((entry) => typeof entry === "string" ? entry.trim() : "").filter((entry) => entry.length > 0).join("\n");
1654
1669
  }
1655
- async function computeSemanticOrHybridHits(context) {
1656
- const semanticLimit = context.limit ?? context.maxResults;
1657
- const embeddingOptions = context.embeddingTimeoutMs !== void 0 ? { timeout_ms: context.embeddingTimeoutMs } : {};
1658
- const vectorQueryOptions = context.vectorQueryTimeoutMs !== void 0 ? { timeout_ms: context.vectorQueryTimeoutMs } : {};
1659
- const queryTrimmed = context.query.trim();
1670
+ async function resolveExpandedSemanticQueries(context, queryTrimmed) {
1660
1671
  const baseExpandedQueries = context.queryExpansion.enabled ? buildDeterministicQueryExpansions(queryTrimmed, context.queryExpansion.max_queries) : [queryTrimmed];
1661
- let expandedQueries = baseExpandedQueries.length > 0 ? baseExpandedQueries : [queryTrimmed];
1662
- if (context.queryExpansion.enabled) {
1663
- if (context.queryExpansionExtension?.expand) {
1664
- try {
1665
- const rawExpansion = await Promise.resolve(context.queryExpansionExtension.expand({
1666
- query: queryTrimmed,
1667
- mode: context.requestedMode,
1668
- settings: context.settings
1669
- }));
1670
- const extensionExpansion = normalizeQueryExpansionOutput(rawExpansion);
1671
- expandedQueries = mergeQueryExpansions(expandedQueries, extensionExpansion, context.queryExpansion.max_queries);
1672
- } catch {
1673
- context.warnings.push(`search_query_expansion_provider_failed:${context.queryExpansionExtension.providerName}:using_builtin`);
1674
- }
1675
- } else if (context.queryExpansion.provider && context.queryExpansion.provider !== "openai" && context.queryExpansion.provider !== "ollama") {
1676
- 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;
1677
1687
  }
1678
1688
  }
1679
- const queryVectors = await executeEmbeddingRequest(context.provider, expandedQueries, embeddingOptions);
1680
- const executeVectorQueryWithFallback = async (semanticVector) => {
1681
- if (context.extensionVectorAdapter?.query) {
1682
- try {
1683
- return await Promise.resolve(context.extensionVectorAdapter.query({
1684
- vector: semanticVector,
1685
- limit: semanticLimit,
1686
- settings: context.settings
1687
- }));
1688
- } catch (error) {
1689
- if (!context.vectorStore) {
1690
- 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);
1691
- }
1692
- 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);
1693
1705
  }
1694
- }
1695
- if (context.vectorStore) {
1706
+ context.warnings.push(`search_vector_adapter_failed:${context.extensionVectorAdapter.adapterName}:using_builtin`);
1696
1707
  return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);
1697
1708
  }
1698
- throw new PmCliError("Semantic search requires either a configured vector store or an extension vector adapter query handler", EXIT_CODE.USAGE);
1699
- };
1700
- 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)));
1701
1815
  const vectorHits = mergeVectorHitsById(queryVectorGroups);
1702
1816
  const filteredById = new Map(context.filteredDocuments.map((document) => [document.metadata.id, document]));
1703
1817
  const { semanticHits, semanticScores } = buildSemanticHits(vectorHits, filteredById);
@@ -1705,86 +1819,7 @@ async function computeSemanticOrHybridHits(context) {
1705
1819
  if (context.requestedMode === "semantic") {
1706
1820
  return { hits: forceExactIdHitsToTop(semanticHits, context.keywordHits), vectorMatchCount };
1707
1821
  }
1708
- let hybridHits = combineHybridHits(filteredById, semanticScores, context.keywordHits, context.hybridSemanticWeight);
1709
- if (context.rerank.enabled && hybridHits.length > 1) {
1710
- const sortedForCandidates = [...hybridHits].sort((left, right) => {
1711
- if (left.score !== right.score) {
1712
- return right.score - left.score;
1713
- }
1714
- return left.item.id.localeCompare(right.item.id);
1715
- });
1716
- const candidateHits = sortedForCandidates.slice(0, context.rerank.top_k);
1717
- const candidateContexts = candidateHits.map((hit) => {
1718
- const document = filteredById.get(hit.item.id);
1719
- if (!document) {
1720
- return null;
1721
- }
1722
- return { hit, text: buildRerankCorpus(document) };
1723
- }).filter((entry) => entry !== null);
1724
- const rerankCandidates = candidateContexts.map((entry) => ({
1725
- id: entry.hit.item.id,
1726
- text: entry.text
1727
- }));
1728
- let rerankScores = null;
1729
- if (context.rerankExtension?.rerank) {
1730
- try {
1731
- const rawRerank = await Promise.resolve(context.rerankExtension.rerank({
1732
- query: queryTrimmed,
1733
- mode: "hybrid",
1734
- model: context.rerank.model,
1735
- top_k: context.rerank.top_k,
1736
- settings: context.settings,
1737
- candidates: candidateContexts.map((entry) => ({
1738
- id: entry.hit.item.id,
1739
- text: entry.text,
1740
- score: entry.hit.score
1741
- }))
1742
- }));
1743
- const normalizedRerank = normalizeRerankOutput(rawRerank);
1744
- if (normalizedRerank.length > 0) {
1745
- rerankScores = new Map(normalizedRerank.map((entry) => [entry.id, entry.score]));
1746
- } else {
1747
- context.warnings.push(`search_rerank_provider_invalid_response:${context.rerankExtension.providerName}:using_builtin`);
1748
- }
1749
- } catch {
1750
- context.warnings.push(`search_rerank_provider_failed:${context.rerankExtension.providerName}:using_builtin`);
1751
- }
1752
- }
1753
- if (!rerankScores) {
1754
- try {
1755
- rerankScores = await rerankCandidatesWithEmbeddings(context.provider, context.rerank.model, queryTrimmed, rerankCandidates, context.embeddingTimeoutMs);
1756
- } catch {
1757
- context.warnings.push("search_rerank_failed:using_hybrid_scores");
1758
- }
1759
- }
1760
- if (rerankScores && rerankScores.size > 0) {
1761
- const rerankedIds = new Set(rerankScores.keys());
1762
- hybridHits = hybridHits.map((hit) => {
1763
- const rerankScore = rerankScores.get(hit.item.id);
1764
- if (rerankScore === void 0) {
1765
- return hit;
1766
- }
1767
- const matchedFields = new Set(hit.matched_fields);
1768
- matchedFields.add("rerank");
1769
- return {
1770
- ...hit,
1771
- score: rerankScore,
1772
- matched_fields: [...matchedFields].sort((left, right) => left.localeCompare(right))
1773
- };
1774
- });
1775
- hybridHits.sort((left, right) => {
1776
- const leftWasReranked = rerankedIds.has(left.item.id);
1777
- const rightWasReranked = rerankedIds.has(right.item.id);
1778
- if (leftWasReranked !== rightWasReranked) {
1779
- return leftWasReranked ? -1 : 1;
1780
- }
1781
- if (left.score !== right.score) {
1782
- return right.score - left.score;
1783
- }
1784
- return left.item.id.localeCompare(right.item.id);
1785
- });
1786
- }
1787
- }
1822
+ const hybridHits = await applyHybridRerank(context, queryTrimmed, combineHybridHits(filteredById, semanticScores, context.keywordHits, context.hybridSemanticWeight), filteredById);
1788
1823
  return {
1789
1824
  // GH-281: applied LAST (after any rerank reordering) so an exact full-ID /
1790
1825
  // short-ID keyword match always ranks #1 in hybrid mode regardless of the
@@ -1895,7 +1930,15 @@ function projectSearchHits(hits, projection) {
1895
1930
  return projected;
1896
1931
  });
1897
1932
  }
1898
- 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) {
1899
1942
  const inlineWarnings = [];
1900
1943
  const inlineParse = parseInlineQueryFilters(rawQuery);
1901
1944
  const hasInlineFilters = Object.keys(inlineParse.inlineFilters).length > 0;
@@ -1909,311 +1952,381 @@ async function runSearch(rawQuery, rawOptions, global2) {
1909
1952
  }
1910
1953
  const query = hasInlineFilters ? inlineParse.residualQuery : rawQuery;
1911
1954
  const options = applyInlineQueryFilters(rawOptions, inlineParse.inlineFilters, inlineWarnings);
1912
- const highlight = options.highlight === true;
1913
- const includeLinked = parseIncludeLinked(options.includeLinked);
1914
- const titleExact = parseTitleExact(options.titleExact);
1915
- const phraseExact = parsePhraseExact(options.phraseExact);
1916
- const matchMode = parseMatchMode(typeof options.matchMode === "string" ? options.matchMode : void 0);
1917
- const minScoreOverride = parseMinScoreOverride(options.minScore);
1918
- const countOnly = options.count === true;
1919
- const tokens = parseTokens(query);
1920
- const normalizedQuery = normalizeSearchPhrase(query);
1921
- const limit = parseLimit(options.limit);
1922
- const projection = parseProjectionConfig(options);
1923
- 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) {
1924
1974
  const pmRoot = resolvePmRoot(process.cwd(), global2.path);
1925
1975
  if (!await pathExists(getSettingsPath(pmRoot))) {
1926
1976
  throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
1927
1977
  }
1928
1978
  const storedSettings = await readSettings(pmRoot);
1929
- const runtimeDefaultsResolution = resolveSettingsWithSemanticRuntimeDefaults(storedSettings);
1930
- const settings = runtimeDefaultsResolution.settings;
1979
+ const settings = resolveSettingsWithSemanticRuntimeDefaults(storedSettings).settings;
1931
1980
  const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
1932
1981
  const runtimeFieldRegistry = resolveRuntimeFieldRegistry(settings.schema);
1933
- validateSearchProjectionFields(projection, runtimeFieldRegistry);
1934
- const runtimeFieldFilters = collectRuntimeFilterValues(options, runtimeFieldRegistry, "search");
1935
- 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");
1936
1984
  const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
1937
- const maxResults = resolveSearchMaxResults(settings);
1938
- const scoreThreshold = minScoreOverride ?? resolveSearchScoreThreshold(settings);
1939
- const semanticWeightProvided = options.semanticWeight !== void 0;
1940
- const semanticWeightOverride = parseSemanticWeightOverride(options.semanticWeight);
1941
- const hybridSemanticWeight = semanticWeightOverride ?? resolveHybridSemanticWeight(settings);
1942
- const tuning = resolveSearchTuning(settings);
1943
1985
  const providerResolution = resolveEmbeddingProviders(settings);
1944
1986
  const vectorResolution = resolveVectorStores(settings);
1945
1987
  const extensionSearchProvider = resolveExtensionSearchProvider(settings);
1946
1988
  const extensionVectorAdapter = resolveExtensionVectorAdapter(settings);
1947
- const bm25Mode = resolveBuiltInBm25Mode({
1948
- configuredProvider: toOptionalNonEmptyString(settings.search?.provider),
1949
- hasEmbeddingProvider: providerResolution.active !== null,
1950
- hasExtensionSearchProvider: extensionSearchProvider !== null
1951
- });
1989
+ const semanticWeightOverride = parseSemanticWeightOverride(prepared.options.semanticWeight);
1952
1990
  const queryExpansion = resolveQueryExpansionConfig(settings, providerResolution.active?.name ?? null);
1953
1991
  const rerank = resolveRerankConfig(settings, providerResolution.active?.model ?? toOptionalNonEmptyString(settings.search?.embedding_model) ?? "text-embedding-3-small");
1954
- const queryExpansionProvider = resolveExtensionSearchProviderByName(queryExpansion.provider ?? void 0);
1955
- const queryExpansionExtension = queryExpansionProvider?.queryExpansion ? { providerName: queryExpansionProvider.providerName, expand: queryExpansionProvider.queryExpansion } : null;
1956
- const rerankProvider = resolveExtensionSearchProviderByName(toOptionalNonEmptyString(settings.search?.provider));
1957
- const rerankExtension = rerankProvider?.rerank ? { providerName: rerankProvider.providerName, rerank: rerankProvider.rerank } : null;
1958
- let effectiveMode = parseMode(options.mode, {
1959
- hasProvider: providerResolution.active !== null || extensionSearchProvider !== null,
1960
- hasVectorStore: vectorResolution.active !== null || extensionVectorAdapter !== null
1961
- });
1962
- const loadedDocuments = await loadDocuments(pmRoot, settings.item_format ?? "toon", typeRegistry.type_to_folder, settings.schema);
1963
- const warnings = loadedDocuments.warnings;
1964
- if (inlineWarnings.length > 0) {
1965
- 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;
1966
2042
  }
1967
- if (effectiveMode === "hybrid" && semanticWeightProvided && semanticWeightOverride === void 0) {
1968
- 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;
1969
2062
  }
1970
- const allDocuments = loadedDocuments.documents;
1971
- const lifecycleClassifier = lifecycleClassifierFromStatusRegistry(statusRegistry);
1972
- const metadataFilteredDocuments = applyFilters(allDocuments, options, typeRegistry, runtimeFieldFilters, statusFilter, lifecycleClassifier);
1973
- const filteredDocuments = applyExactQueryFilters(metadataFilteredDocuments, normalizedQuery, {
1974
- titleExact,
1975
- // --match-mode exact reuses the exact-phrase containment logic so the whole
1976
- // normalized query must appear as a contiguous phrase in some searchable field.
1977
- 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
1978
2071
  });
1979
- if (effectiveMode === "keyword" && (filteredDocuments.length === 0 || limit === 0)) {
1980
- 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`);
1981
2074
  }
1982
- const projectRoot = process.cwd();
1983
- const globalRoot = resolveGlobalPmRoot(projectRoot);
1984
- const linkedCorpusById = /* @__PURE__ */ new Map();
1985
- if (includeLinked && (effectiveMode === "keyword" || effectiveMode === "hybrid")) {
1986
- const linkedCorpusRoots = await resolveLinkedCorpusRoots(projectRoot, globalRoot);
1987
- const linkedCorpusEntries = await Promise.all(filteredDocuments.map(async (document) => [document.metadata.id, await loadLinkedCorpus(document, linkedCorpusRoots)]));
1988
- for (const [id, corpus] of linkedCorpusEntries) {
1989
- linkedCorpusById.set(id, corpus);
1990
- }
2075
+ return hits;
2076
+ }
2077
+ async function executeExtensionSearchProvider(prepared, runtime, filteredDocuments, filteredById) {
2078
+ if (!runtime.extensionSearchProvider) {
2079
+ return null;
1991
2080
  }
1992
- const applyCoverageBonus = matchMode === "or";
1993
- const keywordHits = filteredDocuments.map((document) => buildHybridLexicalScore(
1994
- document,
1995
- tokens,
1996
- normalizedQuery,
1997
- // Linked corpus is only collected into linkedCorpusById when the user
1998
- // passed --include-linked (and mode is keyword/hybrid), so pass the
1999
- // parsed flag directly rather than re-deriving it from the mode.
2000
- includeLinked,
2001
- linkedCorpusById,
2002
- tuning,
2003
- settings.id_prefix,
2004
- applyCoverageBonus
2005
- )).filter((entry) => entry !== null).filter((entry) => matchMode !== "and" || entry.matched_all_terms === true);
2006
- let hits = keywordHits;
2007
- const useBuiltInBm25 = bm25Mode !== null && effectiveMode !== "keyword";
2008
- if (bm25Mode !== null && effectiveMode !== "keyword") {
2009
- hits = computeBuiltInBm25Hits({
2010
- requestedMode: effectiveMode,
2011
- query,
2012
- filteredDocuments,
2013
- keywordHits,
2014
- corpusFields: resolveSearchCorpusFields(settings),
2015
- bm25Params: resolveBm25Params(settings),
2016
- hybridSemanticWeight
2017
- });
2018
- if (bm25Mode === "auto-fallback") {
2019
- 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);
2020
2095
  }
2096
+ return null;
2021
2097
  }
2022
- if (effectiveMode !== "keyword" && !useBuiltInBm25) {
2023
- const builtInSemanticWillRun = !extensionSearchProvider && providerResolution.active !== null && (vectorResolution.active !== null || extensionVectorAdapter !== null);
2024
- if (modeWasExplicit && builtInSemanticWillRun) {
2025
- await maybeEmitVectorIndexStaleWarning(pmRoot, filteredDocuments, warnings);
2026
- }
2027
- try {
2028
- if (!extensionSearchProvider) {
2029
- requireSemanticDependencies(effectiveMode, providerResolution, vectorResolution, extensionVectorAdapter !== null);
2030
- }
2031
- if (filteredDocuments.length === 0 || limit === 0) {
2032
- return emptySearchResult(query, effectiveMode, matchMode, options, includeLinked, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, projection, warnings, runtimeFieldFilters, countOnly);
2033
- }
2034
- const filteredById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
2035
- const canUseBuiltInSemantic = providerResolution.active !== null && (vectorResolution.active !== null || extensionVectorAdapter !== null);
2036
- if (extensionSearchProvider) {
2037
- try {
2038
- const providerResponse = await Promise.resolve(extensionSearchProvider.query({
2039
- query,
2040
- mode: effectiveMode,
2041
- tokens,
2042
- options,
2043
- settings,
2044
- documents: filteredDocuments
2045
- }));
2046
- hits = normalizeExtensionProviderHits(extensionSearchProvider.providerName, providerResponse, filteredById);
2047
- } catch (error) {
2048
- if (!canUseBuiltInSemantic) {
2049
- throw new PmCliError(`Extension search provider "${extensionSearchProvider.providerName}" failed: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
2050
- }
2051
- }
2052
- }
2053
- if (hits === keywordHits) {
2054
- const implicitHybridMode = !modeWasExplicit && effectiveMode === "hybrid";
2055
- const { provider, vectorStore } = requireSemanticDependencies(effectiveMode, providerResolution, vectorResolution, extensionVectorAdapter !== null);
2056
- const semanticResult = await computeSemanticOrHybridHits({
2057
- requestedMode: effectiveMode,
2058
- query,
2059
- filteredDocuments,
2060
- keywordHits,
2061
- hybridSemanticWeight,
2062
- limit,
2063
- maxResults,
2064
- provider,
2065
- vectorStore,
2066
- extensionVectorAdapter,
2067
- queryExpansion,
2068
- queryExpansionExtension,
2069
- rerank,
2070
- rerankExtension,
2071
- warnings,
2072
- settings,
2073
- /* c8 ignore next 5 -- reserved for future implicit-hybrid auto-mode; current parseMode defaults keyword when mode is omitted */
2074
- ...implicitHybridMode ? {
2075
- embeddingTimeoutMs: IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS,
2076
- vectorQueryTimeoutMs: IMPLICIT_HYBRID_VECTOR_TIMEOUT_MS
2077
- } : {}
2078
- });
2079
- hits = semanticResult.hits;
2080
- if (semanticResult.vectorMatchCount === 0) {
2081
- if (effectiveMode === "semantic") {
2082
- hits = keywordHits;
2083
- }
2084
- warnings.push(`search_${effectiveMode}_degraded:no_vector_matches:results_are_lexical`);
2085
- }
2086
- }
2087
- } catch (error) {
2088
- const fallbackWarning = modeWasExplicit ? buildExplicitSemanticFallbackWarning(effectiveMode, error) : buildImplicitSemanticFallbackWarning(error);
2089
- effectiveMode = "keyword";
2090
- hits = keywordHits;
2091
- warnings.push(fallbackWarning);
2092
- }
2098
+ }
2099
+ function maybeApplyNoVectorFallback(effectiveMode, semanticResult, keywordHits, warnings) {
2100
+ if (semanticResult.vectorMatchCount > 0) {
2101
+ return semanticResult.hits;
2093
2102
  }
2094
- const thresholded = hits.filter((entry) => entry.exact_id_match === true || entry.score >= scoreThreshold);
2095
- const sorted = sortHits(thresholded, statusRegistry);
2096
- const total = sorted.length;
2097
- const resolvedLimit = limit ?? maxResults;
2098
- const limited = sorted.slice(0, resolvedLimit);
2099
- const projectionFields = projection.mode === "full" ? null : [...projection.fields];
2100
- const compactSummaryMode = projection.mode === "compact" && options.compact === true;
2101
- if (countOnly) {
2102
- if (compactSummaryMode) {
2103
- const compactFilters = buildCompactSearchFilterSummary({
2104
- mode: effectiveMode,
2105
- matchMode,
2106
- options,
2107
- includeLinked,
2108
- titleExact,
2109
- phraseExact,
2110
- scoreThreshold,
2111
- hybridSemanticWeight,
2112
- 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
2113
2149
  });
2114
- return {
2115
- query: query.trim(),
2116
- mode: effectiveMode,
2117
- items: [],
2118
- count: total,
2119
- total,
2120
- count_only: true,
2121
- filters: compactFilters,
2122
- ...warnings.length > 0 ? { warnings } : {}
2123
- };
2150
+ hits = maybeApplyNoVectorFallback(semanticMode, semanticResult, keywordHits, warnings);
2124
2151
  }
2125
- return {
2126
- query: query.trim(),
2127
- 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,
2128
2163
  items: [],
2129
2164
  count: total,
2130
2165
  total,
2131
2166
  count_only: true,
2132
- filters: buildVerboseSearchFilters({
2133
- effectiveMode,
2134
- matchMode,
2135
- options,
2136
- includeLinked,
2137
- titleExact,
2138
- phraseExact,
2139
- scoreThreshold,
2140
- hybridSemanticWeight,
2141
- queryExpansion,
2142
- rerank,
2143
- runtimeFieldFilters
2144
- }),
2145
- projection: {
2146
- mode: projection.mode,
2147
- fields: projectionFields
2148
- },
2149
- now: nowIso(),
2150
- ...warnings.length > 0 ? { warnings } : {}
2151
- };
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;
2152
2211
  }
2153
- let projectedHits = limited;
2154
- let effectiveProjection = projection;
2155
- if (highlight) {
2156
- const documentById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
2157
- projectedHits = limited.map((hit) => ({
2158
- ...hit,
2159
- highlights: buildHitHighlights(documentById.get(hit.item.id), hit.matched_fields, tokens)
2160
- }));
2161
- if (projection.mode !== "full" && !projection.fields.includes("highlights")) {
2162
- effectiveProjection = { mode: projection.mode, fields: [...projection.fields, "highlights"] };
2163
- }
2212
+ return { ...result, warnings };
2213
+ }
2214
+ function attachSearchHighlights(prepared, filteredDocuments, limited) {
2215
+ if (!prepared.highlight) {
2216
+ return { hits: limited, projection: prepared.projection };
2164
2217
  }
2165
- const projectedItems = projectSearchHits(projectedHits, effectiveProjection);
2166
- const finalProjectionFields = effectiveProjection.mode === "full" ? null : [...effectiveProjection.fields];
2167
- const truncationExtras = limited.length < total ? { total } : {};
2168
- if (compactSummaryMode) {
2169
- const compactFilters = buildCompactSearchFilterSummary({
2170
- mode: effectiveMode,
2171
- matchMode,
2172
- options,
2173
- includeLinked,
2174
- titleExact,
2175
- phraseExact,
2176
- scoreThreshold,
2177
- hybridSemanticWeight,
2178
- runtimeFieldFilters
2179
- });
2180
- return {
2181
- query: query.trim(),
2182
- 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,
2183
2234
  items: projectedItems,
2184
2235
  count: projectedItems.length,
2185
2236
  ...truncationExtras,
2186
- filters: compactFilters,
2187
- ...warnings.length > 0 ? { warnings } : {}
2188
- };
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);
2189
2249
  }
2250
+ const finalProjectionFields = effectiveProjection.mode === "full" ? null : [...effectiveProjection.fields];
2190
2251
  return {
2191
- query: query.trim(),
2192
- mode: effectiveMode,
2252
+ query: response.query.trim(),
2253
+ mode: response.effectiveMode,
2193
2254
  items: projectedItems,
2194
2255
  count: projectedItems.length,
2195
2256
  ...truncationExtras,
2196
2257
  filters: buildVerboseSearchFilters({
2197
- effectiveMode,
2198
- matchMode,
2199
- options,
2200
- includeLinked,
2201
- titleExact,
2202
- phraseExact,
2203
- scoreThreshold,
2204
- hybridSemanticWeight,
2205
- queryExpansion,
2206
- rerank,
2207
- 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
2208
2269
  }),
2209
2270
  projection: {
2210
2271
  mode: effectiveProjection.mode,
2211
2272
  fields: finalProjectionFields
2212
2273
  },
2213
2274
  now: nowIso(),
2214
- ...warnings.length > 0 ? { warnings } : {}
2275
+ ...response.warnings.length > 0 ? { warnings: response.warnings } : {}
2215
2276
  };
2216
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
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);
2329
+ }
2217
2330
 
2218
2331
  export {
2219
2332
  collectErrorCauseCodes,
@@ -2225,4 +2338,4 @@ export {
2225
2338
  resolveSearchTuning,
2226
2339
  runSearch
2227
2340
  };
2228
- //# sourceMappingURL=chunk-RM6MHL6A.js.map
2341
+ //# sourceMappingURL=chunk-6ZMBJRDJ.js.map