@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
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a6961487-a640-50e7-980d-b3a9c0cc9651")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="02364b53-8625-5d05-90d9-1234e6d63964")}catch(e){}}();
3
3
  import {
4
4
  collectStaleVectorizationIds
5
5
  } from "./chunk-ROGZTCCB.js";
@@ -15,7 +15,7 @@ import {
15
15
  resolveSearchCorpusFields,
16
16
  resolveSettingsWithSemanticRuntimeDefaults,
17
17
  resolveVectorStores
18
- } from "./chunk-D5LYZVGB.js";
18
+ } from "./chunk-TPOFWBMY.js";
19
19
  import {
20
20
  applyFilterValueEcho,
21
21
  buildContentFilterEcho,
@@ -26,7 +26,7 @@ import {
26
26
  parseStatusFilterCsv,
27
27
  resolveContentFieldFilters,
28
28
  resolveMissingMetadataFilters
29
- } from "./chunk-ZIE6WXJ2.js";
29
+ } from "./chunk-Q6K2OACU.js";
30
30
  import {
31
31
  hasContentFieldFilter,
32
32
  itemMatchesContentFilters
@@ -35,27 +35,27 @@ import {
35
35
  hasMissingMetadataFilter,
36
36
  itemMatchesMissingMetadata,
37
37
  lifecycleClassifierFromStatusRegistry
38
- } from "./chunk-FDEVKXC4.js";
38
+ } from "./chunk-EMPGXBUF.js";
39
39
  import {
40
40
  parseLimit,
41
41
  parsePriority,
42
42
  parseType
43
- } from "./chunk-JVQ7UOYC.js";
43
+ } from "./chunk-2CHRYUXL.js";
44
44
  import {
45
45
  collectRegisteredItemFieldNames,
46
46
  listAllDocumentCandidatesCached,
47
47
  listAllFrontMatter,
48
48
  toItemRecord
49
- } from "./chunk-KGQ3W65B.js";
49
+ } from "./chunk-NRZS637N.js";
50
50
  import {
51
51
  isTerminalStatus,
52
52
  parseItemDocument
53
- } from "./chunk-V3KLX7U7.js";
53
+ } from "./chunk-KN3URLKS.js";
54
54
  import {
55
55
  compareTimestampStrings,
56
56
  nowIso,
57
57
  resolveIsoOrRelative
58
- } from "./chunk-KRASIL6M.js";
58
+ } from "./chunk-K2VYLVX4.js";
59
59
  import {
60
60
  EXIT_CODE,
61
61
  PmCliError,
@@ -75,7 +75,7 @@ import {
75
75
  runActiveOnReadHooks,
76
76
  toNonEmptyString,
77
77
  toNonEmptyStringOrUndefined
78
- } from "./chunk-CY5IJMUM.js";
78
+ } from "./chunk-I66WE2HE.js";
79
79
 
80
80
  // dist/cli/commands/search.js
81
81
  import fs from "node:fs/promises";
@@ -499,8 +499,6 @@ var LONG_QUERY_PHRASE_MULTIPLIER = 6;
499
499
  var ALL_TERMS_COVERAGE_BONUS = 40;
500
500
  var EXACT_ID_MATCH_SCORE = 1e3;
501
501
  var SHORT_ID_MATCH_SCORE = 900;
502
- var IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS = 8e3;
503
- var IMPLICIT_HYBRID_VECTOR_TIMEOUT_MS = 8e3;
504
502
  var HIGHLIGHT_OPEN = "\xAB";
505
503
  var HIGHLIGHT_CLOSE = "\xBB";
506
504
  var HIGHLIGHT_SNIPPET_RADIUS = 60;
@@ -565,20 +563,20 @@ function buildVerboseSearchFilters(params) {
565
563
  return {
566
564
  mode: effectiveMode,
567
565
  match_mode: matchMode,
568
- status: isStatusAllFilterInput(options.status) ? "all" : options.status ?? null,
569
- type: options.type ?? null,
570
- tag: options.tag ?? null,
571
- priority: options.priority ?? null,
572
- deadline_before: options.deadlineBefore ?? null,
573
- deadline_after: options.deadlineAfter ?? null,
574
- updated_after: options.updatedAfter ?? null,
575
- updated_before: options.updatedBefore ?? null,
576
- created_after: options.createdAfter ?? null,
577
- created_before: options.createdBefore ?? null,
578
- assignee: options.assignee ?? null,
579
- sprint: options.sprint ?? null,
580
- release: options.release ?? null,
581
- parent: options.parent ?? null,
566
+ status: isStatusAllFilterInput(options.status) ? "all" : valueOrNull(options.status),
567
+ type: valueOrNull(options.type),
568
+ tag: valueOrNull(options.tag),
569
+ priority: valueOrNull(options.priority),
570
+ deadline_before: valueOrNull(options.deadlineBefore),
571
+ deadline_after: valueOrNull(options.deadlineAfter),
572
+ updated_after: valueOrNull(options.updatedAfter),
573
+ updated_before: valueOrNull(options.updatedBefore),
574
+ created_after: valueOrNull(options.createdAfter),
575
+ created_before: valueOrNull(options.createdBefore),
576
+ assignee: valueOrNull(options.assignee),
577
+ sprint: valueOrNull(options.sprint),
578
+ release: valueOrNull(options.release),
579
+ parent: valueOrNull(options.parent),
582
580
  ...buildGovernanceMissingFilterEcho(options),
583
581
  ...buildContentFilterEcho(options),
584
582
  include_linked: includeLinked,
@@ -591,10 +589,13 @@ function buildVerboseSearchFilters(params) {
591
589
  rerank_enabled: rerank.enabled,
592
590
  rerank_model: rerank.model,
593
591
  rerank_top_k: rerank.top_k,
594
- limit: options.limit ?? null,
592
+ limit: valueOrNull(options.limit),
595
593
  runtime_filters: runtimeFieldFilters
596
594
  };
597
595
  }
596
+ function valueOrNull(value) {
597
+ return value ?? null;
598
+ }
598
599
  function collectErrorCauseCodes(error) {
599
600
  const codes = [];
600
601
  let current = error;
@@ -619,16 +620,6 @@ function classifyImplicitSemanticFallbackReason(error) {
619
620
  }
620
621
  return "error";
621
622
  }
622
- function buildImplicitSemanticFallbackWarning(error) {
623
- const reason = classifyImplicitSemanticFallbackReason(error);
624
- if (reason === "timeout") {
625
- return "search_implicit_semantic_fallback:timeout:using_keyword_mode";
626
- }
627
- if (reason === "connection") {
628
- return "search_implicit_semantic_fallback:connection:using_keyword_mode";
629
- }
630
- return "search_implicit_semantic_fallback:error:using_keyword_mode";
631
- }
632
623
  function buildExplicitSemanticFallbackWarning(requestedMode, error) {
633
624
  const reason = classifyImplicitSemanticFallbackReason(error);
634
625
  return `search_${requestedMode}_fallback:${reason}:using_keyword_mode`;
@@ -760,7 +751,6 @@ var _testOnlySearchCommand = {
760
751
  buildExplicitSemanticFallbackWarning,
761
752
  buildCompactSearchFilterSummary,
762
753
  buildHybridLexicalScore,
763
- buildImplicitSemanticFallbackWarning,
764
754
  buildRerankCorpus,
765
755
  buildSemanticHits,
766
756
  classifyImplicitSemanticFallbackReason,
@@ -935,6 +925,9 @@ function resolveSearchMetadataFilterSet(options, typeRegistry, statusFilter) {
935
925
  };
936
926
  }
937
927
  function matchesScalarSearchFilters(item, filters) {
928
+ return matchesIdentitySearchFilters(item, filters) && matchesTimestampSearchFilters(item, filters) && matchesOwnerSearchFilters(item, filters);
929
+ }
930
+ function matchesIdentitySearchFilters(item, filters) {
938
931
  if (filters.statusSet && !filters.statusSet.has(item.status))
939
932
  return false;
940
933
  if (filters.typeFilter && item.type !== filters.typeFilter)
@@ -943,6 +936,9 @@ function matchesScalarSearchFilters(item, filters) {
943
936
  return false;
944
937
  if (filters.priorityFilter !== void 0 && item.priority !== filters.priorityFilter)
945
938
  return false;
939
+ return true;
940
+ }
941
+ function matchesTimestampSearchFilters(item, filters) {
946
942
  if (filters.deadlineBefore && (!item.deadline || compareTimestampStrings(item.deadline, filters.deadlineBefore) > 0))
947
943
  return false;
948
944
  if (filters.deadlineAfter && (!item.deadline || compareTimestampStrings(item.deadline, filters.deadlineAfter) < 0))
@@ -955,6 +951,9 @@ function matchesScalarSearchFilters(item, filters) {
955
951
  return false;
956
952
  if (filters.createdBefore && compareTimestampStrings(item.created_at, filters.createdBefore) > 0)
957
953
  return false;
954
+ return true;
955
+ }
956
+ function matchesOwnerSearchFilters(item, filters) {
958
957
  if (filters.assigneeFilter !== void 0 && item.assignee !== filters.assigneeFilter)
959
958
  return false;
960
959
  if (filters.sprintFilter !== void 0 && item.sprint !== filters.sprintFilter)
@@ -1159,26 +1158,8 @@ function buildHitHighlights(document, matchedFields, tokens) {
1159
1158
  }
1160
1159
  return highlights;
1161
1160
  }
1162
- function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning, idPrefix, applyCoverageBonus = false) {
1163
- const item = document.metadata;
1164
- const normalizedId = normalizeSearchPhrase(item.id);
1165
- const normalizedIdPrefix = typeof idPrefix === "string" ? idPrefix.trim().toLowerCase() : "";
1166
- const normalizedIdPrefixPhrase = normalizeSearchPhrase(normalizedIdPrefix);
1167
- const normalizedShortId = normalizedIdPrefixPhrase.length > 0 && normalizedId.startsWith(normalizedIdPrefixPhrase) ? normalizedId.slice(normalizedIdPrefixPhrase.length).trim() : normalizedId;
1168
- if (normalizedQuery === normalizedId || normalizedQuery === normalizedShortId) {
1169
- return {
1170
- item,
1171
- score: normalizedQuery === normalizedId ? EXACT_ID_MATCH_SCORE : SHORT_ID_MATCH_SCORE,
1172
- matched_fields: ["id"],
1173
- matched_all_terms: true,
1174
- exact_id_match: true
1175
- };
1176
- }
1177
- const titleTokenCounts = /* @__PURE__ */ new Map();
1178
- for (const token of tokenizeForExactTokenMatch(item.title)) {
1179
- titleTokenCounts.set(token, (titleTokenCounts.get(token) ?? 0) + 1);
1180
- }
1181
- const searchableFields = [
1161
+ function buildSearchableScoringFields(document, linkedCorpus, tuning) {
1162
+ return [
1182
1163
  ...SEARCHABLE_FIELD_BUILDERS.map((builder) => ({
1183
1164
  name: builder.name,
1184
1165
  value: builder.value(document),
@@ -1186,54 +1167,84 @@ function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning,
1186
1167
  })),
1187
1168
  { name: "linked_content", value: linkedCorpus, weight: tuning.linked_content_weight }
1188
1169
  ];
1189
- let score = 0;
1190
- const matched = /* @__PURE__ */ new Set();
1191
- const matchedTokens = /* @__PURE__ */ new Set();
1170
+ }
1171
+ function buildExactIdSearchHit(item, normalizedQuery, idPrefix) {
1172
+ const normalizedId = normalizeSearchPhrase(item.id);
1173
+ const normalizedIdPrefix = typeof idPrefix === "string" ? idPrefix.trim().toLowerCase() : "";
1174
+ const normalizedIdPrefixPhrase = normalizeSearchPhrase(normalizedIdPrefix);
1175
+ const normalizedShortId = normalizedIdPrefixPhrase.length > 0 && normalizedId.startsWith(normalizedIdPrefixPhrase) ? normalizedId.slice(normalizedIdPrefixPhrase.length).trim() : normalizedId;
1176
+ if (normalizedQuery !== normalizedId && normalizedQuery !== normalizedShortId) {
1177
+ return null;
1178
+ }
1179
+ return {
1180
+ item,
1181
+ score: normalizedQuery === normalizedId ? EXACT_ID_MATCH_SCORE : SHORT_ID_MATCH_SCORE,
1182
+ matched_fields: ["id"],
1183
+ matched_all_terms: true,
1184
+ exact_id_match: true
1185
+ };
1186
+ }
1187
+ function scoreTokenMatches(tokens, titleTokenCounts, searchableFields, tuning, state) {
1192
1188
  for (const token of tokens) {
1193
1189
  const exactTitleMatches = titleTokenCounts.get(token) ?? 0;
1194
1190
  if (exactTitleMatches > 0) {
1195
- score += exactTitleMatches * tuning.title_exact_bonus;
1196
- matched.add("title");
1197
- matchedTokens.add(token);
1191
+ state.score += exactTitleMatches * tuning.title_exact_bonus;
1192
+ state.matched.add("title");
1193
+ state.matchedTokens.add(token);
1198
1194
  }
1199
1195
  for (const field of searchableFields) {
1200
- const fieldValue = field.value.toLowerCase();
1201
- const occurrences = countOccurrences(fieldValue, token);
1196
+ const occurrences = countOccurrences(field.value.toLowerCase(), token);
1202
1197
  if (occurrences > 0) {
1203
- score += occurrences * field.weight;
1204
- matched.add(field.name);
1205
- matchedTokens.add(token);
1198
+ state.score += occurrences * field.weight;
1199
+ state.matched.add(field.name);
1200
+ state.matchedTokens.add(token);
1206
1201
  }
1207
1202
  }
1208
1203
  }
1204
+ }
1205
+ function scorePhraseMatches(item, normalizedQuery, searchableFields, state) {
1206
+ const normalizedTitle = normalizeSearchPhrase(item.title);
1207
+ if (normalizedTitle === normalizedQuery) {
1208
+ state.score += LONG_QUERY_TITLE_EXACT_BONUS;
1209
+ state.matched.add("title");
1210
+ }
1211
+ for (const field of searchableFields) {
1212
+ const phraseOccurrences = countOccurrences(normalizeSearchPhrase(field.value), normalizedQuery);
1213
+ if (phraseOccurrences > 0) {
1214
+ state.score += phraseOccurrences * field.weight * LONG_QUERY_PHRASE_MULTIPLIER;
1215
+ state.matched.add(field.name);
1216
+ }
1217
+ }
1218
+ }
1219
+ function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning, idPrefix, applyCoverageBonus = false) {
1220
+ const item = document.metadata;
1221
+ const exactIdHit = buildExactIdSearchHit(item, normalizedQuery, idPrefix);
1222
+ if (exactIdHit) {
1223
+ return exactIdHit;
1224
+ }
1225
+ const titleTokenCounts = /* @__PURE__ */ new Map();
1226
+ for (const token of tokenizeForExactTokenMatch(item.title)) {
1227
+ titleTokenCounts.set(token, (titleTokenCounts.get(token) ?? 0) + 1);
1228
+ }
1229
+ const searchableFields = buildSearchableScoringFields(document, linkedCorpus, tuning);
1230
+ const state = { score: 0, matched: /* @__PURE__ */ new Set(), matchedTokens: /* @__PURE__ */ new Set() };
1231
+ scoreTokenMatches(tokens, titleTokenCounts, searchableFields, tuning, state);
1209
1232
  const distinctTokens = new Set(tokens);
1210
- const matchedAllTerms = distinctTokens.size > 0 && matchedTokens.size === distinctTokens.size;
1233
+ const matchedAllTerms = distinctTokens.size > 0 && state.matchedTokens.size === distinctTokens.size;
1211
1234
  if (applyCoverageBonus && distinctTokens.size > 1 && matchedAllTerms) {
1212
- score += ALL_TERMS_COVERAGE_BONUS;
1235
+ state.score += ALL_TERMS_COVERAGE_BONUS;
1213
1236
  }
1214
1237
  const isLongPhraseQuery = tokens.length >= LONG_QUERY_TOKEN_THRESHOLD && normalizedQuery.includes(" ");
1215
1238
  if (isLongPhraseQuery) {
1216
- const normalizedTitle = normalizeSearchPhrase(item.title);
1217
- if (normalizedTitle === normalizedQuery) {
1218
- score += LONG_QUERY_TITLE_EXACT_BONUS;
1219
- matched.add("title");
1220
- }
1221
- for (const field of searchableFields) {
1222
- const normalizedField = normalizeSearchPhrase(field.value);
1223
- const phraseOccurrences = countOccurrences(normalizedField, normalizedQuery);
1224
- if (phraseOccurrences > 0) {
1225
- score += phraseOccurrences * field.weight * LONG_QUERY_PHRASE_MULTIPLIER;
1226
- matched.add(field.name);
1227
- }
1228
- }
1239
+ scorePhraseMatches(item, normalizedQuery, searchableFields, state);
1229
1240
  }
1230
- if (score <= 0) {
1241
+ if (state.score <= 0) {
1231
1242
  return null;
1232
1243
  }
1233
1244
  return {
1234
1245
  item,
1235
- score,
1236
- matched_fields: [...matched].sort((a, b) => a.localeCompare(b)),
1246
+ score: state.score,
1247
+ matched_fields: [...state.matched].sort((a, b) => a.localeCompare(b)),
1237
1248
  matched_all_terms: matchedAllTerms
1238
1249
  };
1239
1250
  }
@@ -1451,8 +1462,12 @@ function resolveExtensionVectorAdapter(settings) {
1451
1462
  if (typeof query !== "function") {
1452
1463
  return null;
1453
1464
  }
1465
+ const upsert = runtimeDefinition.upsert;
1466
+ const runtimeAdapterName = toOptionalNonEmptyString(runtimeDefinition.name) ?? toOptionalNonEmptyString(resolved.definition.name) ?? adapterName ?? "extension";
1454
1467
  return {
1455
- query
1468
+ adapterName: runtimeAdapterName,
1469
+ query,
1470
+ ...typeof upsert === "function" ? { upsert } : {}
1456
1471
  };
1457
1472
  }
1458
1473
  function normalizeExtensionProviderHits(providerName, raw, filteredById) {
@@ -1619,52 +1634,151 @@ function buildRerankCorpus(document) {
1619
1634
  document.body
1620
1635
  ].map((entry) => typeof entry === "string" ? entry.trim() : "").filter((entry) => entry.length > 0).join("\n");
1621
1636
  }
1622
- async function computeSemanticOrHybridHits(context) {
1623
- const semanticLimit = context.limit ?? context.maxResults;
1624
- const embeddingOptions = context.embeddingTimeoutMs !== void 0 ? { timeout_ms: context.embeddingTimeoutMs } : {};
1625
- const vectorQueryOptions = context.vectorQueryTimeoutMs !== void 0 ? { timeout_ms: context.vectorQueryTimeoutMs } : {};
1626
- const queryTrimmed = context.query.trim();
1637
+ async function resolveExpandedSemanticQueries(context, queryTrimmed) {
1627
1638
  const baseExpandedQueries = context.queryExpansion.enabled ? buildDeterministicQueryExpansions(queryTrimmed, context.queryExpansion.max_queries) : [queryTrimmed];
1628
- let expandedQueries = baseExpandedQueries.length > 0 ? baseExpandedQueries : [queryTrimmed];
1629
- if (context.queryExpansion.enabled) {
1630
- if (context.queryExpansionExtension?.expand) {
1631
- try {
1632
- const rawExpansion = await Promise.resolve(context.queryExpansionExtension.expand({
1633
- query: queryTrimmed,
1634
- mode: context.requestedMode,
1635
- settings: context.settings
1636
- }));
1637
- const extensionExpansion = normalizeQueryExpansionOutput(rawExpansion);
1638
- expandedQueries = mergeQueryExpansions(expandedQueries, extensionExpansion, context.queryExpansion.max_queries);
1639
- } catch {
1640
- context.warnings.push(`search_query_expansion_provider_failed:${context.queryExpansionExtension.providerName}:using_builtin`);
1641
- }
1642
- } else if (context.queryExpansion.provider && context.queryExpansion.provider !== "openai" && context.queryExpansion.provider !== "ollama") {
1643
- context.warnings.push(`search_query_expansion_provider_unavailable:${context.queryExpansion.provider}:using_builtin`);
1639
+ const expandedQueries = baseExpandedQueries.length > 0 ? baseExpandedQueries : [queryTrimmed];
1640
+ if (!context.queryExpansion.enabled) {
1641
+ return expandedQueries;
1642
+ }
1643
+ if (context.queryExpansionExtension?.expand) {
1644
+ try {
1645
+ const rawExpansion = await Promise.resolve(context.queryExpansionExtension.expand({
1646
+ query: queryTrimmed,
1647
+ mode: context.requestedMode,
1648
+ settings: context.settings
1649
+ }));
1650
+ return mergeQueryExpansions(expandedQueries, normalizeQueryExpansionOutput(rawExpansion), context.queryExpansion.max_queries);
1651
+ } catch {
1652
+ context.warnings.push(`search_query_expansion_provider_failed:${context.queryExpansionExtension.providerName}:using_builtin`);
1653
+ return expandedQueries;
1644
1654
  }
1645
1655
  }
1646
- const queryVectors = await executeEmbeddingRequest(context.provider, expandedQueries, embeddingOptions);
1647
- const executeVectorQueryWithFallback = async (semanticVector) => {
1648
- if (context.extensionVectorAdapter?.query) {
1649
- try {
1650
- return await Promise.resolve(context.extensionVectorAdapter.query({
1651
- vector: semanticVector,
1652
- limit: semanticLimit,
1653
- settings: context.settings
1654
- }));
1655
- } catch (error) {
1656
- if (!context.vectorStore) {
1657
- 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);
1658
- }
1659
- return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);
1656
+ if (context.queryExpansion.provider && context.queryExpansion.provider !== "openai" && context.queryExpansion.provider !== "ollama") {
1657
+ context.warnings.push(`search_query_expansion_provider_unavailable:${context.queryExpansion.provider}:using_builtin`);
1658
+ }
1659
+ return expandedQueries;
1660
+ }
1661
+ async function executeSemanticVectorQuery(context, semanticVector, semanticLimit, vectorQueryOptions) {
1662
+ if (context.extensionVectorAdapter?.query) {
1663
+ try {
1664
+ return await Promise.resolve(context.extensionVectorAdapter.query({
1665
+ vector: semanticVector,
1666
+ limit: semanticLimit,
1667
+ settings: context.settings
1668
+ }));
1669
+ } catch (error) {
1670
+ if (!context.vectorStore) {
1671
+ 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);
1660
1672
  }
1661
- }
1662
- if (context.vectorStore) {
1673
+ context.warnings.push(`search_vector_adapter_failed:${context.extensionVectorAdapter.adapterName}:using_builtin`);
1663
1674
  return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);
1664
1675
  }
1665
- throw new PmCliError("Semantic search requires either a configured vector store or an extension vector adapter query handler", EXIT_CODE.USAGE);
1666
- };
1667
- const queryVectorGroups = await Promise.all(queryVectors.map(async (semanticVector) => await executeVectorQueryWithFallback(semanticVector)));
1676
+ }
1677
+ if (context.vectorStore) {
1678
+ return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);
1679
+ }
1680
+ throw new PmCliError("Semantic search requires either a configured vector store or an extension vector adapter query handler", EXIT_CODE.USAGE);
1681
+ }
1682
+ function buildRerankCandidateContexts(hybridHits, filteredById, topK) {
1683
+ const sortedForCandidates = [...hybridHits].sort((left, right) => {
1684
+ if (left.score !== right.score) {
1685
+ return right.score - left.score;
1686
+ }
1687
+ return left.item.id.localeCompare(right.item.id);
1688
+ });
1689
+ return sortedForCandidates.slice(0, topK).map((hit) => {
1690
+ const document = filteredById.get(hit.item.id);
1691
+ return document ? { hit, text: buildRerankCorpus(document) } : null;
1692
+ }).filter((entry) => entry !== null);
1693
+ }
1694
+ async function resolveExtensionRerankScores(context, queryTrimmed, candidateContexts) {
1695
+ if (!context.rerankExtension?.rerank) {
1696
+ return null;
1697
+ }
1698
+ try {
1699
+ const rawRerank = await Promise.resolve(context.rerankExtension.rerank({
1700
+ query: queryTrimmed,
1701
+ mode: "hybrid",
1702
+ model: context.rerank.model,
1703
+ top_k: context.rerank.top_k,
1704
+ settings: context.settings,
1705
+ candidates: candidateContexts.map((entry) => ({
1706
+ id: entry.hit.item.id,
1707
+ text: entry.text,
1708
+ score: entry.hit.score
1709
+ }))
1710
+ }));
1711
+ const normalizedRerank = normalizeRerankOutput(rawRerank);
1712
+ if (normalizedRerank.length > 0) {
1713
+ return new Map(normalizedRerank.map((entry) => [entry.id, entry.score]));
1714
+ }
1715
+ context.warnings.push(`search_rerank_provider_invalid_response:${context.rerankExtension.providerName}:using_builtin`);
1716
+ return null;
1717
+ } catch {
1718
+ context.warnings.push(`search_rerank_provider_failed:${context.rerankExtension.providerName}:using_builtin`);
1719
+ return null;
1720
+ }
1721
+ }
1722
+ async function resolveRerankScores(context, queryTrimmed, candidateContexts) {
1723
+ const extensionScores = await resolveExtensionRerankScores(context, queryTrimmed, candidateContexts);
1724
+ if (extensionScores) {
1725
+ return extensionScores;
1726
+ }
1727
+ const rerankCandidates = candidateContexts.map((entry) => ({
1728
+ id: entry.hit.item.id,
1729
+ text: entry.text
1730
+ }));
1731
+ try {
1732
+ return await rerankCandidatesWithEmbeddings(context.provider, context.rerank.model, queryTrimmed, rerankCandidates, context.embeddingTimeoutMs);
1733
+ } catch {
1734
+ context.warnings.push("search_rerank_failed:using_hybrid_scores");
1735
+ return null;
1736
+ }
1737
+ }
1738
+ function applyRerankScores(hybridHits, rerankScores) {
1739
+ const rerankedIds = new Set(rerankScores.keys());
1740
+ const rerankedHits = hybridHits.map((hit) => {
1741
+ const rerankScore = rerankScores.get(hit.item.id);
1742
+ if (rerankScore === void 0) {
1743
+ return hit;
1744
+ }
1745
+ const matchedFields = new Set(hit.matched_fields);
1746
+ matchedFields.add("rerank");
1747
+ return {
1748
+ ...hit,
1749
+ score: rerankScore,
1750
+ matched_fields: [...matchedFields].sort((left, right) => left.localeCompare(right))
1751
+ };
1752
+ });
1753
+ rerankedHits.sort((left, right) => {
1754
+ const leftWasReranked = rerankedIds.has(left.item.id);
1755
+ const rightWasReranked = rerankedIds.has(right.item.id);
1756
+ if (leftWasReranked !== rightWasReranked) {
1757
+ return leftWasReranked ? -1 : 1;
1758
+ }
1759
+ if (left.score !== right.score) {
1760
+ return right.score - left.score;
1761
+ }
1762
+ return left.item.id.localeCompare(right.item.id);
1763
+ });
1764
+ return rerankedHits;
1765
+ }
1766
+ async function applyHybridRerank(context, queryTrimmed, hybridHits, filteredById) {
1767
+ if (!context.rerank.enabled || hybridHits.length <= 1) {
1768
+ return hybridHits;
1769
+ }
1770
+ const candidateContexts = buildRerankCandidateContexts(hybridHits, filteredById, context.rerank.top_k);
1771
+ const rerankScores = await resolveRerankScores(context, queryTrimmed, candidateContexts);
1772
+ return rerankScores && rerankScores.size > 0 ? applyRerankScores(hybridHits, rerankScores) : hybridHits;
1773
+ }
1774
+ async function computeSemanticOrHybridHits(context) {
1775
+ const semanticLimit = context.limit ?? context.maxResults;
1776
+ const embeddingOptions = context.embeddingTimeoutMs !== void 0 ? { timeout_ms: context.embeddingTimeoutMs } : {};
1777
+ const vectorQueryOptions = context.vectorQueryTimeoutMs !== void 0 ? { timeout_ms: context.vectorQueryTimeoutMs } : {};
1778
+ const queryTrimmed = context.query.trim();
1779
+ const expandedQueries = await resolveExpandedSemanticQueries(context, queryTrimmed);
1780
+ const queryVectors = await executeEmbeddingRequest(context.provider, expandedQueries, embeddingOptions);
1781
+ const queryVectorGroups = await Promise.all(queryVectors.map(async (semanticVector) => await executeSemanticVectorQuery(context, semanticVector, semanticLimit, vectorQueryOptions)));
1668
1782
  const vectorHits = mergeVectorHitsById(queryVectorGroups);
1669
1783
  const filteredById = new Map(context.filteredDocuments.map((document) => [document.metadata.id, document]));
1670
1784
  const { semanticHits, semanticScores } = buildSemanticHits(vectorHits, filteredById);
@@ -1672,86 +1786,7 @@ async function computeSemanticOrHybridHits(context) {
1672
1786
  if (context.requestedMode === "semantic") {
1673
1787
  return { hits: forceExactIdHitsToTop(semanticHits, context.keywordHits), vectorMatchCount };
1674
1788
  }
1675
- let hybridHits = combineHybridHits(filteredById, semanticScores, context.keywordHits, context.hybridSemanticWeight);
1676
- if (context.rerank.enabled && hybridHits.length > 1) {
1677
- const sortedForCandidates = [...hybridHits].sort((left, right) => {
1678
- if (left.score !== right.score) {
1679
- return right.score - left.score;
1680
- }
1681
- return left.item.id.localeCompare(right.item.id);
1682
- });
1683
- const candidateHits = sortedForCandidates.slice(0, context.rerank.top_k);
1684
- const candidateContexts = candidateHits.map((hit) => {
1685
- const document = filteredById.get(hit.item.id);
1686
- if (!document) {
1687
- return null;
1688
- }
1689
- return { hit, text: buildRerankCorpus(document) };
1690
- }).filter((entry) => entry !== null);
1691
- const rerankCandidates = candidateContexts.map((entry) => ({
1692
- id: entry.hit.item.id,
1693
- text: entry.text
1694
- }));
1695
- let rerankScores = null;
1696
- if (context.rerankExtension?.rerank) {
1697
- try {
1698
- const rawRerank = await Promise.resolve(context.rerankExtension.rerank({
1699
- query: queryTrimmed,
1700
- mode: "hybrid",
1701
- model: context.rerank.model,
1702
- top_k: context.rerank.top_k,
1703
- settings: context.settings,
1704
- candidates: candidateContexts.map((entry) => ({
1705
- id: entry.hit.item.id,
1706
- text: entry.text,
1707
- score: entry.hit.score
1708
- }))
1709
- }));
1710
- const normalizedRerank = normalizeRerankOutput(rawRerank);
1711
- if (normalizedRerank.length > 0) {
1712
- rerankScores = new Map(normalizedRerank.map((entry) => [entry.id, entry.score]));
1713
- } else {
1714
- context.warnings.push(`search_rerank_provider_invalid_response:${context.rerankExtension.providerName}:using_builtin`);
1715
- }
1716
- } catch {
1717
- context.warnings.push(`search_rerank_provider_failed:${context.rerankExtension.providerName}:using_builtin`);
1718
- }
1719
- }
1720
- if (!rerankScores) {
1721
- try {
1722
- rerankScores = await rerankCandidatesWithEmbeddings(context.provider, context.rerank.model, queryTrimmed, rerankCandidates, context.embeddingTimeoutMs);
1723
- } catch {
1724
- context.warnings.push("search_rerank_failed:using_hybrid_scores");
1725
- }
1726
- }
1727
- if (rerankScores && rerankScores.size > 0) {
1728
- const rerankedIds = new Set(rerankScores.keys());
1729
- hybridHits = hybridHits.map((hit) => {
1730
- const rerankScore = rerankScores.get(hit.item.id);
1731
- if (rerankScore === void 0) {
1732
- return hit;
1733
- }
1734
- const matchedFields = new Set(hit.matched_fields);
1735
- matchedFields.add("rerank");
1736
- return {
1737
- ...hit,
1738
- score: rerankScore,
1739
- matched_fields: [...matchedFields].sort((left, right) => left.localeCompare(right))
1740
- };
1741
- });
1742
- hybridHits.sort((left, right) => {
1743
- const leftWasReranked = rerankedIds.has(left.item.id);
1744
- const rightWasReranked = rerankedIds.has(right.item.id);
1745
- if (leftWasReranked !== rightWasReranked) {
1746
- return leftWasReranked ? -1 : 1;
1747
- }
1748
- if (left.score !== right.score) {
1749
- return right.score - left.score;
1750
- }
1751
- return left.item.id.localeCompare(right.item.id);
1752
- });
1753
- }
1754
- }
1789
+ const hybridHits = await applyHybridRerank(context, queryTrimmed, combineHybridHits(filteredById, semanticScores, context.keywordHits, context.hybridSemanticWeight), filteredById);
1755
1790
  return {
1756
1791
  // GH-281: applied LAST (after any rerank reordering) so an exact full-ID /
1757
1792
  // short-ID keyword match always ranks #1 in hybrid mode regardless of the
@@ -1862,7 +1897,15 @@ function projectSearchHits(hits, projection) {
1862
1897
  return projected;
1863
1898
  });
1864
1899
  }
1865
- async function runSearch(rawQuery, rawOptions, global) {
1900
+ function resolveQueryExpansionExtension(queryExpansion) {
1901
+ const provider = resolveExtensionSearchProviderByName(queryExpansion.provider ?? void 0);
1902
+ return provider?.queryExpansion ? { providerName: provider.providerName, expand: provider.queryExpansion } : null;
1903
+ }
1904
+ function resolveRerankExtension(settings) {
1905
+ const provider = resolveExtensionSearchProviderByName(toOptionalNonEmptyString(settings.search?.provider));
1906
+ return provider?.rerank ? { providerName: provider.providerName, rerank: provider.rerank } : null;
1907
+ }
1908
+ function prepareSearchInput(rawQuery, rawOptions) {
1866
1909
  const inlineWarnings = [];
1867
1910
  const inlineParse = parseInlineQueryFilters(rawQuery);
1868
1911
  const hasInlineFilters = Object.keys(inlineParse.inlineFilters).length > 0;
@@ -1876,311 +1919,381 @@ async function runSearch(rawQuery, rawOptions, global) {
1876
1919
  }
1877
1920
  const query = hasInlineFilters ? inlineParse.residualQuery : rawQuery;
1878
1921
  const options = applyInlineQueryFilters(rawOptions, inlineParse.inlineFilters, inlineWarnings);
1879
- const highlight = options.highlight === true;
1880
- const includeLinked = parseIncludeLinked(options.includeLinked);
1881
- const titleExact = parseTitleExact(options.titleExact);
1882
- const phraseExact = parsePhraseExact(options.phraseExact);
1883
- const matchMode = parseMatchMode(typeof options.matchMode === "string" ? options.matchMode : void 0);
1884
- const minScoreOverride = parseMinScoreOverride(options.minScore);
1885
- const countOnly = options.count === true;
1886
- const tokens = parseTokens(query);
1887
- const normalizedQuery = normalizeSearchPhrase(query);
1888
- const limit = parseLimit(options.limit);
1889
- const projection = parseProjectionConfig(options);
1890
- const modeWasExplicit = typeof options.mode === "string" && options.mode.trim().length > 0;
1922
+ return {
1923
+ query,
1924
+ options,
1925
+ inlineWarnings,
1926
+ highlight: options.highlight === true,
1927
+ includeLinked: parseIncludeLinked(options.includeLinked),
1928
+ titleExact: parseTitleExact(options.titleExact),
1929
+ phraseExact: parsePhraseExact(options.phraseExact),
1930
+ matchMode: parseMatchMode(typeof options.matchMode === "string" ? options.matchMode : void 0),
1931
+ minScoreOverride: parseMinScoreOverride(options.minScore),
1932
+ countOnly: options.count === true,
1933
+ tokens: parseTokens(query),
1934
+ normalizedQuery: normalizeSearchPhrase(query),
1935
+ limit: parseLimit(options.limit),
1936
+ projection: parseProjectionConfig(options),
1937
+ modeWasExplicit: typeof options.mode === "string" && options.mode.trim().length > 0
1938
+ };
1939
+ }
1940
+ async function resolveSearchRuntimeContext(prepared, global) {
1891
1941
  const pmRoot = resolvePmRoot(process.cwd(), global.path);
1892
1942
  if (!await pathExists(getSettingsPath(pmRoot))) {
1893
1943
  throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
1894
1944
  }
1895
1945
  const storedSettings = await readSettings(pmRoot);
1896
- const runtimeDefaultsResolution = resolveSettingsWithSemanticRuntimeDefaults(storedSettings);
1897
- const settings = runtimeDefaultsResolution.settings;
1946
+ const settings = resolveSettingsWithSemanticRuntimeDefaults(storedSettings).settings;
1898
1947
  const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
1899
1948
  const runtimeFieldRegistry = resolveRuntimeFieldRegistry(settings.schema);
1900
- validateSearchProjectionFields(projection, runtimeFieldRegistry);
1901
- const runtimeFieldFilters = collectRuntimeFilterValues(options, runtimeFieldRegistry, "search");
1902
- const statusFilter = parseStatusFilterCsv(typeof options.status === "string" ? options.status : void 0, statusRegistry, { strict: true });
1949
+ validateSearchProjectionFields(prepared.projection, runtimeFieldRegistry);
1950
+ const runtimeFieldFilters = collectRuntimeFilterValues(prepared.options, runtimeFieldRegistry, "search");
1903
1951
  const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
1904
- const maxResults = resolveSearchMaxResults(settings);
1905
- const scoreThreshold = minScoreOverride ?? resolveSearchScoreThreshold(settings);
1906
- const semanticWeightProvided = options.semanticWeight !== void 0;
1907
- const semanticWeightOverride = parseSemanticWeightOverride(options.semanticWeight);
1908
- const hybridSemanticWeight = semanticWeightOverride ?? resolveHybridSemanticWeight(settings);
1909
- const tuning = resolveSearchTuning(settings);
1910
1952
  const providerResolution = resolveEmbeddingProviders(settings);
1911
1953
  const vectorResolution = resolveVectorStores(settings);
1912
1954
  const extensionSearchProvider = resolveExtensionSearchProvider(settings);
1913
1955
  const extensionVectorAdapter = resolveExtensionVectorAdapter(settings);
1914
- const bm25Mode = resolveBuiltInBm25Mode({
1915
- configuredProvider: toOptionalNonEmptyString(settings.search?.provider),
1916
- hasEmbeddingProvider: providerResolution.active !== null,
1917
- hasExtensionSearchProvider: extensionSearchProvider !== null
1918
- });
1956
+ const semanticWeightOverride = parseSemanticWeightOverride(prepared.options.semanticWeight);
1919
1957
  const queryExpansion = resolveQueryExpansionConfig(settings, providerResolution.active?.name ?? null);
1920
1958
  const rerank = resolveRerankConfig(settings, providerResolution.active?.model ?? toOptionalNonEmptyString(settings.search?.embedding_model) ?? "text-embedding-3-small");
1921
- const queryExpansionProvider = resolveExtensionSearchProviderByName(queryExpansion.provider ?? void 0);
1922
- const queryExpansionExtension = queryExpansionProvider?.queryExpansion ? { providerName: queryExpansionProvider.providerName, expand: queryExpansionProvider.queryExpansion } : null;
1923
- const rerankProvider = resolveExtensionSearchProviderByName(toOptionalNonEmptyString(settings.search?.provider));
1924
- const rerankExtension = rerankProvider?.rerank ? { providerName: rerankProvider.providerName, rerank: rerankProvider.rerank } : null;
1925
- let effectiveMode = parseMode(options.mode, {
1926
- hasProvider: providerResolution.active !== null || extensionSearchProvider !== null,
1927
- hasVectorStore: vectorResolution.active !== null || extensionVectorAdapter !== null
1928
- });
1929
- const loadedDocuments = await loadDocuments(pmRoot, settings.item_format ?? "toon", typeRegistry.type_to_folder, settings.schema);
1930
- const warnings = loadedDocuments.warnings;
1931
- if (inlineWarnings.length > 0) {
1932
- warnings.push(...inlineWarnings);
1959
+ return {
1960
+ pmRoot,
1961
+ settings,
1962
+ statusRegistry,
1963
+ runtimeFieldRegistry,
1964
+ runtimeFieldFilters,
1965
+ typeRegistry,
1966
+ maxResults: resolveSearchMaxResults(settings),
1967
+ scoreThreshold: prepared.minScoreOverride ?? resolveSearchScoreThreshold(settings),
1968
+ semanticWeightProvided: prepared.options.semanticWeight !== void 0,
1969
+ semanticWeightOverride,
1970
+ hybridSemanticWeight: semanticWeightOverride ?? resolveHybridSemanticWeight(settings),
1971
+ tuning: resolveSearchTuning(settings),
1972
+ providerResolution,
1973
+ vectorResolution,
1974
+ extensionSearchProvider,
1975
+ extensionVectorAdapter,
1976
+ bm25Mode: resolveBuiltInBm25Mode({
1977
+ configuredProvider: toOptionalNonEmptyString(settings.search?.provider),
1978
+ hasEmbeddingProvider: providerResolution.active !== null,
1979
+ hasExtensionSearchProvider: extensionSearchProvider !== null
1980
+ }),
1981
+ queryExpansion,
1982
+ queryExpansionExtension: resolveQueryExpansionExtension(queryExpansion),
1983
+ rerank,
1984
+ rerankExtension: resolveRerankExtension(settings),
1985
+ effectiveMode: parseMode(prepared.options.mode, {
1986
+ hasProvider: providerResolution.active !== null || extensionSearchProvider !== null,
1987
+ hasVectorStore: vectorResolution.active !== null || extensionVectorAdapter !== null
1988
+ })
1989
+ };
1990
+ }
1991
+ async function loadFilteredSearchCorpus(prepared, runtime) {
1992
+ const loadedDocuments = await loadDocuments(runtime.pmRoot, runtime.settings.item_format ?? "toon", runtime.typeRegistry.type_to_folder, runtime.settings.schema);
1993
+ const statusFilter = parseStatusFilterCsv(typeof prepared.options.status === "string" ? prepared.options.status : void 0, runtime.statusRegistry, { strict: true });
1994
+ const lifecycleClassifier = lifecycleClassifierFromStatusRegistry(runtime.statusRegistry);
1995
+ const metadataFilteredDocuments = applyFilters(loadedDocuments.documents, prepared.options, runtime.typeRegistry, runtime.runtimeFieldFilters, statusFilter, lifecycleClassifier);
1996
+ return {
1997
+ warnings: loadedDocuments.warnings,
1998
+ allDocuments: loadedDocuments.documents,
1999
+ filteredDocuments: applyExactQueryFilters(metadataFilteredDocuments, prepared.normalizedQuery, {
2000
+ titleExact: prepared.titleExact,
2001
+ phraseExact: prepared.phraseExact || prepared.matchMode === "exact"
2002
+ })
2003
+ };
2004
+ }
2005
+ async function collectLinkedCorpusById(includeLinked, effectiveMode, filteredDocuments) {
2006
+ const linkedCorpusById = /* @__PURE__ */ new Map();
2007
+ if (!includeLinked || effectiveMode !== "keyword" && effectiveMode !== "hybrid") {
2008
+ return linkedCorpusById;
1933
2009
  }
1934
- if (effectiveMode === "hybrid" && semanticWeightProvided && semanticWeightOverride === void 0) {
1935
- warnings.push("search_hybrid_semantic_weight_override_invalid:using_settings_default");
2010
+ const projectRoot = process.cwd();
2011
+ const linkedCorpusRoots = await resolveLinkedCorpusRoots(projectRoot, resolveGlobalPmRoot(projectRoot));
2012
+ const linkedCorpusEntries = await Promise.all(filteredDocuments.map(async (document) => [document.metadata.id, await loadLinkedCorpus(document, linkedCorpusRoots)]));
2013
+ for (const [id, corpus] of linkedCorpusEntries) {
2014
+ linkedCorpusById.set(id, corpus);
2015
+ }
2016
+ return linkedCorpusById;
2017
+ }
2018
+ async function computeKeywordSearchHits(prepared, runtime, filteredDocuments) {
2019
+ const linkedCorpusById = await collectLinkedCorpusById(prepared.includeLinked, runtime.effectiveMode, filteredDocuments);
2020
+ const applyCoverageBonus = prepared.matchMode === "or";
2021
+ 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);
2022
+ }
2023
+ function buildEmptySearchResultFromContext(response, countOnly) {
2024
+ 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);
2025
+ }
2026
+ async function executeBuiltInBm25Search(prepared, runtime, filteredDocuments, keywordHits, warnings) {
2027
+ if (runtime.bm25Mode === null || runtime.effectiveMode === "keyword") {
2028
+ return null;
1936
2029
  }
1937
- const allDocuments = loadedDocuments.documents;
1938
- const lifecycleClassifier = lifecycleClassifierFromStatusRegistry(statusRegistry);
1939
- const metadataFilteredDocuments = applyFilters(allDocuments, options, typeRegistry, runtimeFieldFilters, statusFilter, lifecycleClassifier);
1940
- const filteredDocuments = applyExactQueryFilters(metadataFilteredDocuments, normalizedQuery, {
1941
- titleExact,
1942
- // --match-mode exact reuses the exact-phrase containment logic so the whole
1943
- // normalized query must appear as a contiguous phrase in some searchable field.
1944
- phraseExact: phraseExact || matchMode === "exact"
2030
+ const hits = computeBuiltInBm25Hits({
2031
+ requestedMode: runtime.effectiveMode,
2032
+ query: prepared.query,
2033
+ filteredDocuments,
2034
+ keywordHits,
2035
+ corpusFields: resolveSearchCorpusFields(runtime.settings),
2036
+ bm25Params: resolveBm25Params(runtime.settings),
2037
+ hybridSemanticWeight: runtime.hybridSemanticWeight
1945
2038
  });
1946
- if (effectiveMode === "keyword" && (filteredDocuments.length === 0 || limit === 0)) {
1947
- return emptySearchResult(query, effectiveMode, matchMode, options, includeLinked, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, projection, warnings, runtimeFieldFilters, countOnly);
2039
+ if (runtime.bm25Mode === "auto-fallback") {
2040
+ warnings.push(`search_${runtime.effectiveMode}_offline_bm25:no_embedding_provider:using_lexical_bm25`);
1948
2041
  }
1949
- const projectRoot = process.cwd();
1950
- const globalRoot = resolveGlobalPmRoot(projectRoot);
1951
- const linkedCorpusById = /* @__PURE__ */ new Map();
1952
- if (includeLinked && (effectiveMode === "keyword" || effectiveMode === "hybrid")) {
1953
- const linkedCorpusRoots = await resolveLinkedCorpusRoots(projectRoot, globalRoot);
1954
- const linkedCorpusEntries = await Promise.all(filteredDocuments.map(async (document) => [document.metadata.id, await loadLinkedCorpus(document, linkedCorpusRoots)]));
1955
- for (const [id, corpus] of linkedCorpusEntries) {
1956
- linkedCorpusById.set(id, corpus);
1957
- }
2042
+ return hits;
2043
+ }
2044
+ async function executeExtensionSearchProvider(prepared, runtime, filteredDocuments, filteredById) {
2045
+ if (!runtime.extensionSearchProvider) {
2046
+ return null;
1958
2047
  }
1959
- const applyCoverageBonus = matchMode === "or";
1960
- const keywordHits = filteredDocuments.map((document) => buildHybridLexicalScore(
1961
- document,
1962
- tokens,
1963
- normalizedQuery,
1964
- // Linked corpus is only collected into linkedCorpusById when the user
1965
- // passed --include-linked (and mode is keyword/hybrid), so pass the
1966
- // parsed flag directly rather than re-deriving it from the mode.
1967
- includeLinked,
1968
- linkedCorpusById,
1969
- tuning,
1970
- settings.id_prefix,
1971
- applyCoverageBonus
1972
- )).filter((entry) => entry !== null).filter((entry) => matchMode !== "and" || entry.matched_all_terms === true);
1973
- let hits = keywordHits;
1974
- const useBuiltInBm25 = bm25Mode !== null && effectiveMode !== "keyword";
1975
- if (bm25Mode !== null && effectiveMode !== "keyword") {
1976
- hits = computeBuiltInBm25Hits({
1977
- requestedMode: effectiveMode,
1978
- query,
1979
- filteredDocuments,
1980
- keywordHits,
1981
- corpusFields: resolveSearchCorpusFields(settings),
1982
- bm25Params: resolveBm25Params(settings),
1983
- hybridSemanticWeight
1984
- });
1985
- if (bm25Mode === "auto-fallback") {
1986
- warnings.push(`search_${effectiveMode}_offline_bm25:no_embedding_provider:using_lexical_bm25`);
2048
+ const canUseBuiltInSemantic = runtime.providerResolution.active !== null && (runtime.vectorResolution.active !== null || runtime.extensionVectorAdapter !== null);
2049
+ try {
2050
+ const providerResponse = await Promise.resolve(runtime.extensionSearchProvider.query({
2051
+ query: prepared.query,
2052
+ mode: runtime.effectiveMode,
2053
+ tokens: prepared.tokens,
2054
+ options: prepared.options,
2055
+ settings: runtime.settings,
2056
+ documents: filteredDocuments
2057
+ }));
2058
+ return normalizeExtensionProviderHits(runtime.extensionSearchProvider.providerName, providerResponse, filteredById);
2059
+ } catch (error) {
2060
+ if (!canUseBuiltInSemantic) {
2061
+ throw new PmCliError(`Extension search provider "${runtime.extensionSearchProvider.providerName}" failed: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
1987
2062
  }
2063
+ return null;
1988
2064
  }
1989
- if (effectiveMode !== "keyword" && !useBuiltInBm25) {
1990
- const builtInSemanticWillRun = !extensionSearchProvider && providerResolution.active !== null && (vectorResolution.active !== null || extensionVectorAdapter !== null);
1991
- if (modeWasExplicit && builtInSemanticWillRun) {
1992
- await maybeEmitVectorIndexStaleWarning(pmRoot, filteredDocuments, warnings);
1993
- }
1994
- try {
1995
- if (!extensionSearchProvider) {
1996
- requireSemanticDependencies(effectiveMode, providerResolution, vectorResolution, extensionVectorAdapter !== null);
1997
- }
1998
- if (filteredDocuments.length === 0 || limit === 0) {
1999
- return emptySearchResult(query, effectiveMode, matchMode, options, includeLinked, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, projection, warnings, runtimeFieldFilters, countOnly);
2000
- }
2001
- const filteredById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
2002
- const canUseBuiltInSemantic = providerResolution.active !== null && (vectorResolution.active !== null || extensionVectorAdapter !== null);
2003
- if (extensionSearchProvider) {
2004
- try {
2005
- const providerResponse = await Promise.resolve(extensionSearchProvider.query({
2006
- query,
2007
- mode: effectiveMode,
2008
- tokens,
2009
- options,
2010
- settings,
2011
- documents: filteredDocuments
2012
- }));
2013
- hits = normalizeExtensionProviderHits(extensionSearchProvider.providerName, providerResponse, filteredById);
2014
- } catch (error) {
2015
- if (!canUseBuiltInSemantic) {
2016
- throw new PmCliError(`Extension search provider "${extensionSearchProvider.providerName}" failed: ${error instanceof Error ? error.message : String(error)}`, EXIT_CODE.GENERIC_FAILURE);
2017
- }
2018
- }
2019
- }
2020
- if (hits === keywordHits) {
2021
- const implicitHybridMode = !modeWasExplicit && effectiveMode === "hybrid";
2022
- const { provider, vectorStore } = requireSemanticDependencies(effectiveMode, providerResolution, vectorResolution, extensionVectorAdapter !== null);
2023
- const semanticResult = await computeSemanticOrHybridHits({
2024
- requestedMode: effectiveMode,
2025
- query,
2026
- filteredDocuments,
2027
- keywordHits,
2028
- hybridSemanticWeight,
2029
- limit,
2030
- maxResults,
2031
- provider,
2032
- vectorStore,
2033
- extensionVectorAdapter,
2034
- queryExpansion,
2035
- queryExpansionExtension,
2036
- rerank,
2037
- rerankExtension,
2038
- warnings,
2039
- settings,
2040
- /* c8 ignore next 5 -- reserved for future implicit-hybrid auto-mode; current parseMode defaults keyword when mode is omitted */
2041
- ...implicitHybridMode ? {
2042
- embeddingTimeoutMs: IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS,
2043
- vectorQueryTimeoutMs: IMPLICIT_HYBRID_VECTOR_TIMEOUT_MS
2044
- } : {}
2045
- });
2046
- hits = semanticResult.hits;
2047
- if (semanticResult.vectorMatchCount === 0) {
2048
- if (effectiveMode === "semantic") {
2049
- hits = keywordHits;
2050
- }
2051
- warnings.push(`search_${effectiveMode}_degraded:no_vector_matches:results_are_lexical`);
2052
- }
2053
- }
2054
- } catch (error) {
2055
- const fallbackWarning = modeWasExplicit ? buildExplicitSemanticFallbackWarning(effectiveMode, error) : buildImplicitSemanticFallbackWarning(error);
2056
- effectiveMode = "keyword";
2057
- hits = keywordHits;
2058
- warnings.push(fallbackWarning);
2059
- }
2065
+ }
2066
+ function maybeApplyNoVectorFallback(effectiveMode, semanticResult, keywordHits, warnings) {
2067
+ if (semanticResult.vectorMatchCount > 0) {
2068
+ return semanticResult.hits;
2060
2069
  }
2061
- const thresholded = hits.filter((entry) => entry.exact_id_match === true || entry.score >= scoreThreshold);
2062
- const sorted = sortHits(thresholded, statusRegistry);
2063
- const total = sorted.length;
2064
- const resolvedLimit = limit ?? maxResults;
2065
- const limited = sorted.slice(0, resolvedLimit);
2066
- const projectionFields = projection.mode === "full" ? null : [...projection.fields];
2067
- const compactSummaryMode = projection.mode === "compact" && options.compact === true;
2068
- if (countOnly) {
2069
- if (compactSummaryMode) {
2070
- const compactFilters = buildCompactSearchFilterSummary({
2071
- mode: effectiveMode,
2072
- matchMode,
2073
- options,
2074
- includeLinked,
2075
- titleExact,
2076
- phraseExact,
2077
- scoreThreshold,
2078
- hybridSemanticWeight,
2079
- runtimeFieldFilters
2070
+ warnings.push(`search_${effectiveMode}_degraded:no_vector_matches:results_are_lexical`);
2071
+ return effectiveMode === "semantic" ? keywordHits : semanticResult.hits;
2072
+ }
2073
+ async function prepareBuiltInSemanticSearch(runtime, effectiveMode, filteredDocuments, warnings, modeWasExplicit) {
2074
+ const builtInSemanticWillRun = !runtime.extensionSearchProvider && runtime.providerResolution.active !== null && (runtime.vectorResolution.active !== null || runtime.extensionVectorAdapter !== null);
2075
+ if (modeWasExplicit && builtInSemanticWillRun) {
2076
+ await maybeEmitVectorIndexStaleWarning(runtime.pmRoot, filteredDocuments, warnings);
2077
+ }
2078
+ if (!runtime.extensionSearchProvider) {
2079
+ requireSemanticDependencies(effectiveMode, runtime.providerResolution, runtime.vectorResolution, runtime.extensionVectorAdapter !== null);
2080
+ }
2081
+ }
2082
+ async function executeSemanticSearch(input) {
2083
+ const { prepared, runtime, filteredDocuments, keywordHits, warnings, modeWasExplicit } = input;
2084
+ let hits = keywordHits;
2085
+ const bm25Hits = await executeBuiltInBm25Search(prepared, runtime, filteredDocuments, keywordHits, warnings);
2086
+ const semanticMode = runtime.effectiveMode;
2087
+ if (bm25Hits !== null || semanticMode === "keyword") {
2088
+ return { effectiveMode: runtime.effectiveMode, hits: bm25Hits ?? hits };
2089
+ }
2090
+ try {
2091
+ await prepareBuiltInSemanticSearch(runtime, semanticMode, filteredDocuments, warnings, modeWasExplicit);
2092
+ if (filteredDocuments.length === 0 || prepared.limit === 0) {
2093
+ return { effectiveMode: runtime.effectiveMode, hits: [] };
2094
+ }
2095
+ const filteredById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
2096
+ hits = await executeExtensionSearchProvider(prepared, runtime, filteredDocuments, filteredById) ?? hits;
2097
+ if (hits === keywordHits) {
2098
+ const { provider, vectorStore } = requireSemanticDependencies(semanticMode, runtime.providerResolution, runtime.vectorResolution, runtime.extensionVectorAdapter !== null);
2099
+ const semanticResult = await computeSemanticOrHybridHits({
2100
+ requestedMode: semanticMode,
2101
+ query: prepared.query,
2102
+ filteredDocuments,
2103
+ keywordHits,
2104
+ hybridSemanticWeight: runtime.hybridSemanticWeight,
2105
+ limit: prepared.limit,
2106
+ maxResults: runtime.maxResults,
2107
+ provider,
2108
+ vectorStore,
2109
+ extensionVectorAdapter: runtime.extensionVectorAdapter,
2110
+ queryExpansion: runtime.queryExpansion,
2111
+ queryExpansionExtension: runtime.queryExpansionExtension,
2112
+ rerank: runtime.rerank,
2113
+ rerankExtension: runtime.rerankExtension,
2114
+ warnings,
2115
+ settings: runtime.settings
2080
2116
  });
2081
- return {
2082
- query: query.trim(),
2083
- mode: effectiveMode,
2084
- items: [],
2085
- count: total,
2086
- total,
2087
- count_only: true,
2088
- filters: compactFilters,
2089
- ...warnings.length > 0 ? { warnings } : {}
2090
- };
2117
+ hits = maybeApplyNoVectorFallback(semanticMode, semanticResult, keywordHits, warnings);
2091
2118
  }
2092
- return {
2093
- query: query.trim(),
2094
- mode: effectiveMode,
2119
+ return { effectiveMode: runtime.effectiveMode, hits };
2120
+ } catch (error) {
2121
+ warnings.push(buildExplicitSemanticFallbackWarning(runtime.effectiveMode, error));
2122
+ return { effectiveMode: "keyword", hits: keywordHits };
2123
+ }
2124
+ }
2125
+ function buildCountOnlySearchResult(response, total) {
2126
+ if (response.projection.mode === "compact" && response.options.compact === true) {
2127
+ return withSearchWarnings({
2128
+ query: response.query.trim(),
2129
+ mode: response.effectiveMode,
2095
2130
  items: [],
2096
2131
  count: total,
2097
2132
  total,
2098
2133
  count_only: true,
2099
- filters: buildVerboseSearchFilters({
2100
- effectiveMode,
2101
- matchMode,
2102
- options,
2103
- includeLinked,
2104
- titleExact,
2105
- phraseExact,
2106
- scoreThreshold,
2107
- hybridSemanticWeight,
2108
- queryExpansion,
2109
- rerank,
2110
- runtimeFieldFilters
2111
- }),
2112
- projection: {
2113
- mode: projection.mode,
2114
- fields: projectionFields
2115
- },
2116
- now: nowIso(),
2117
- ...warnings.length > 0 ? { warnings } : {}
2118
- };
2134
+ filters: buildCompactSearchFilterSummary({
2135
+ mode: response.effectiveMode,
2136
+ matchMode: response.matchMode,
2137
+ options: response.options,
2138
+ includeLinked: response.includeLinked,
2139
+ titleExact: response.titleExact,
2140
+ phraseExact: response.phraseExact,
2141
+ scoreThreshold: response.scoreThreshold,
2142
+ hybridSemanticWeight: response.hybridSemanticWeight,
2143
+ runtimeFieldFilters: response.runtimeFieldFilters
2144
+ })
2145
+ }, response.warnings);
2146
+ }
2147
+ const projectionFields = response.projection.mode === "full" ? null : [...response.projection.fields];
2148
+ return withSearchWarnings({
2149
+ query: response.query.trim(),
2150
+ mode: response.effectiveMode,
2151
+ items: [],
2152
+ count: total,
2153
+ total,
2154
+ count_only: true,
2155
+ filters: buildVerboseSearchFilters({
2156
+ effectiveMode: response.effectiveMode,
2157
+ matchMode: response.matchMode,
2158
+ options: response.options,
2159
+ includeLinked: response.includeLinked,
2160
+ titleExact: response.titleExact,
2161
+ phraseExact: response.phraseExact,
2162
+ scoreThreshold: response.scoreThreshold,
2163
+ hybridSemanticWeight: response.hybridSemanticWeight,
2164
+ queryExpansion: response.queryExpansion,
2165
+ rerank: response.rerank,
2166
+ runtimeFieldFilters: response.runtimeFieldFilters
2167
+ }),
2168
+ projection: {
2169
+ mode: response.projection.mode,
2170
+ fields: projectionFields
2171
+ },
2172
+ now: nowIso()
2173
+ }, response.warnings);
2174
+ }
2175
+ function withSearchWarnings(result, warnings) {
2176
+ if (warnings.length === 0) {
2177
+ return result;
2119
2178
  }
2120
- let projectedHits = limited;
2121
- let effectiveProjection = projection;
2122
- if (highlight) {
2123
- const documentById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
2124
- projectedHits = limited.map((hit) => ({
2125
- ...hit,
2126
- highlights: buildHitHighlights(documentById.get(hit.item.id), hit.matched_fields, tokens)
2127
- }));
2128
- if (projection.mode !== "full" && !projection.fields.includes("highlights")) {
2129
- effectiveProjection = { mode: projection.mode, fields: [...projection.fields, "highlights"] };
2130
- }
2179
+ return { ...result, warnings };
2180
+ }
2181
+ function attachSearchHighlights(prepared, filteredDocuments, limited) {
2182
+ if (!prepared.highlight) {
2183
+ return { hits: limited, projection: prepared.projection };
2131
2184
  }
2132
- const projectedItems = projectSearchHits(projectedHits, effectiveProjection);
2133
- const finalProjectionFields = effectiveProjection.mode === "full" ? null : [...effectiveProjection.fields];
2134
- const truncationExtras = limited.length < total ? { total } : {};
2135
- if (compactSummaryMode) {
2136
- const compactFilters = buildCompactSearchFilterSummary({
2137
- mode: effectiveMode,
2138
- matchMode,
2139
- options,
2140
- includeLinked,
2141
- titleExact,
2142
- phraseExact,
2143
- scoreThreshold,
2144
- hybridSemanticWeight,
2145
- runtimeFieldFilters
2146
- });
2147
- return {
2148
- query: query.trim(),
2149
- mode: effectiveMode,
2185
+ const documentById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
2186
+ const hits = limited.map((hit) => ({
2187
+ ...hit,
2188
+ highlights: buildHitHighlights(documentById.get(hit.item.id), hit.matched_fields, prepared.tokens)
2189
+ }));
2190
+ if (prepared.projection.mode === "full" || prepared.projection.fields.includes("highlights")) {
2191
+ return { hits, projection: prepared.projection };
2192
+ }
2193
+ return { hits, projection: { mode: prepared.projection.mode, fields: [...prepared.projection.fields, "highlights"] } };
2194
+ }
2195
+ function buildSearchResultForHits(response, projectedItems, total, limitedCount, effectiveProjection) {
2196
+ const truncationExtras = limitedCount < total ? { total } : {};
2197
+ if (response.projection.mode === "compact" && response.options.compact === true) {
2198
+ return withSearchWarnings({
2199
+ query: response.query.trim(),
2200
+ mode: response.effectiveMode,
2150
2201
  items: projectedItems,
2151
2202
  count: projectedItems.length,
2152
2203
  ...truncationExtras,
2153
- filters: compactFilters,
2154
- ...warnings.length > 0 ? { warnings } : {}
2155
- };
2204
+ filters: buildCompactSearchFilterSummary({
2205
+ mode: response.effectiveMode,
2206
+ matchMode: response.matchMode,
2207
+ options: response.options,
2208
+ includeLinked: response.includeLinked,
2209
+ titleExact: response.titleExact,
2210
+ phraseExact: response.phraseExact,
2211
+ scoreThreshold: response.scoreThreshold,
2212
+ hybridSemanticWeight: response.hybridSemanticWeight,
2213
+ runtimeFieldFilters: response.runtimeFieldFilters
2214
+ })
2215
+ }, response.warnings);
2156
2216
  }
2217
+ const finalProjectionFields = effectiveProjection.mode === "full" ? null : [...effectiveProjection.fields];
2157
2218
  return {
2158
- query: query.trim(),
2159
- mode: effectiveMode,
2219
+ query: response.query.trim(),
2220
+ mode: response.effectiveMode,
2160
2221
  items: projectedItems,
2161
2222
  count: projectedItems.length,
2162
2223
  ...truncationExtras,
2163
2224
  filters: buildVerboseSearchFilters({
2164
- effectiveMode,
2165
- matchMode,
2166
- options,
2167
- includeLinked,
2168
- titleExact,
2169
- phraseExact,
2170
- scoreThreshold,
2171
- hybridSemanticWeight,
2172
- queryExpansion,
2173
- rerank,
2174
- runtimeFieldFilters
2225
+ effectiveMode: response.effectiveMode,
2226
+ matchMode: response.matchMode,
2227
+ options: response.options,
2228
+ includeLinked: response.includeLinked,
2229
+ titleExact: response.titleExact,
2230
+ phraseExact: response.phraseExact,
2231
+ scoreThreshold: response.scoreThreshold,
2232
+ hybridSemanticWeight: response.hybridSemanticWeight,
2233
+ queryExpansion: response.queryExpansion,
2234
+ rerank: response.rerank,
2235
+ runtimeFieldFilters: response.runtimeFieldFilters
2175
2236
  }),
2176
2237
  projection: {
2177
2238
  mode: effectiveProjection.mode,
2178
2239
  fields: finalProjectionFields
2179
2240
  },
2180
2241
  now: nowIso(),
2181
- ...warnings.length > 0 ? { warnings } : {}
2242
+ ...response.warnings.length > 0 ? { warnings: response.warnings } : {}
2182
2243
  };
2183
2244
  }
2245
+ async function runSearch(rawQuery, rawOptions, global) {
2246
+ const prepared = prepareSearchInput(rawQuery, rawOptions);
2247
+ const runtime = await resolveSearchRuntimeContext(prepared, global);
2248
+ const corpus = await loadFilteredSearchCorpus(prepared, runtime);
2249
+ const warnings = corpus.warnings;
2250
+ warnings.push(...prepared.inlineWarnings);
2251
+ if (runtime.effectiveMode === "hybrid" && runtime.semanticWeightProvided && runtime.semanticWeightOverride === void 0) {
2252
+ warnings.push("search_hybrid_semantic_weight_override_invalid:using_settings_default");
2253
+ }
2254
+ const responseBase = {
2255
+ query: prepared.query,
2256
+ matchMode: prepared.matchMode,
2257
+ options: prepared.options,
2258
+ includeLinked: prepared.includeLinked,
2259
+ titleExact: prepared.titleExact,
2260
+ phraseExact: prepared.phraseExact,
2261
+ scoreThreshold: runtime.scoreThreshold,
2262
+ hybridSemanticWeight: runtime.hybridSemanticWeight,
2263
+ queryExpansion: runtime.queryExpansion,
2264
+ rerank: runtime.rerank,
2265
+ projection: prepared.projection,
2266
+ warnings,
2267
+ runtimeFieldFilters: runtime.runtimeFieldFilters
2268
+ };
2269
+ if (runtime.effectiveMode === "keyword" && (corpus.filteredDocuments.length === 0 || prepared.limit === 0)) {
2270
+ return buildEmptySearchResultFromContext({ ...responseBase, effectiveMode: runtime.effectiveMode }, prepared.countOnly);
2271
+ }
2272
+ const keywordHits = await computeKeywordSearchHits(prepared, runtime, corpus.filteredDocuments);
2273
+ const modeResult = await executeSemanticSearch({
2274
+ prepared,
2275
+ runtime,
2276
+ filteredDocuments: corpus.filteredDocuments,
2277
+ keywordHits,
2278
+ warnings,
2279
+ modeWasExplicit: prepared.modeWasExplicit
2280
+ });
2281
+ if (modeResult.effectiveMode !== "keyword" && modeResult.hits.length === 0 && (corpus.filteredDocuments.length === 0 || prepared.limit === 0)) {
2282
+ return buildEmptySearchResultFromContext({ ...responseBase, effectiveMode: modeResult.effectiveMode }, prepared.countOnly);
2283
+ }
2284
+ const thresholded = modeResult.hits.filter((entry) => entry.exact_id_match === true || entry.score >= runtime.scoreThreshold);
2285
+ const sorted = sortHits(thresholded, runtime.statusRegistry);
2286
+ const total = sorted.length;
2287
+ const resolvedLimit = prepared.limit ?? runtime.maxResults;
2288
+ const limited = sorted.slice(0, resolvedLimit);
2289
+ const response = { ...responseBase, effectiveMode: modeResult.effectiveMode };
2290
+ if (prepared.countOnly) {
2291
+ return buildCountOnlySearchResult(response, total);
2292
+ }
2293
+ const { hits: projectedHits, projection: effectiveProjection } = attachSearchHighlights(prepared, corpus.filteredDocuments, limited);
2294
+ const projectedItems = projectSearchHits(projectedHits, effectiveProjection);
2295
+ return buildSearchResultForHits(response, projectedItems, total, limited.length, effectiveProjection);
2296
+ }
2184
2297
 
2185
2298
  export {
2186
2299
  collectErrorCauseCodes,
@@ -2192,6 +2305,6 @@ export {
2192
2305
  resolveSearchTuning,
2193
2306
  runSearch
2194
2307
  };
2195
- //# sourceMappingURL=chunk-6YRAMXRS.js.map
2308
+ //# sourceMappingURL=chunk-SYVUU7EK.js.map
2196
2309
 
2197
- //# debugId=a6961487-a640-50e7-980d-b3a9c0cc9651
2310
+ //# debugId=02364b53-8625-5d05-90d9-1234e6d63964