@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.
- package/AGENTS.md +2 -0
- package/CHANGELOG.md +26 -0
- package/dist/cli/bootstrap-args.js +89 -79
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commander-usage.d.ts +2 -0
- package/dist/cli/commander-usage.js +58 -47
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/aggregate.js +102 -79
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/calendar.js +339 -303
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/close-many.js +89 -68
- package/dist/cli/commands/close-many.js.map +1 -1
- package/dist/cli/commands/close.js +157 -129
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments-audit.js +50 -42
- package/dist/cli/commands/comments-audit.js.map +1 -1
- package/dist/cli/commands/config.d.ts +2 -0
- package/dist/cli/commands/config.js +443 -879
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context.js +365 -287
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.js +352 -238
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +483 -434
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.js +46 -39
- package/dist/cli/commands/dedupe-audit.js.map +1 -1
- package/dist/cli/commands/dedupe-merge.js +88 -69
- package/dist/cli/commands/dedupe-merge.js.map +1 -1
- package/dist/cli/commands/extension/bundled-catalog.js +59 -46
- package/dist/cli/commands/extension/bundled-catalog.js.map +1 -1
- package/dist/cli/commands/extension/doctor.js +129 -78
- package/dist/cli/commands/extension/doctor.js.map +1 -1
- package/dist/cli/commands/extension/managed-state.js +101 -57
- package/dist/cli/commands/extension/managed-state.js.map +1 -1
- package/dist/cli/commands/extension/scaffold.d.ts +7 -0
- package/dist/cli/commands/extension/scaffold.js +214 -186
- package/dist/cli/commands/extension/scaffold.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +6 -1
- package/dist/cli/commands/extension.js +1034 -902
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/get.js +114 -81
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.d.ts +17 -0
- package/dist/cli/commands/health.js +446 -307
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-compact.js +209 -140
- package/dist/cli/commands/history-compact.js.map +1 -1
- package/dist/cli/commands/history-redact.js +162 -119
- package/dist/cli/commands/history-redact.js.map +1 -1
- package/dist/cli/commands/history-repair.js +120 -85
- package/dist/cli/commands/history-repair.js.map +1 -1
- package/dist/cli/commands/init.d.ts +8 -2
- package/dist/cli/commands/init.js +263 -162
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/list-filter-shared.js +55 -48
- package/dist/cli/commands/list-filter-shared.js.map +1 -1
- package/dist/cli/commands/list.js +152 -102
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/next.js +49 -32
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/plan.js +373 -298
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/recurrence-parsers.js +43 -25
- package/dist/cli/commands/recurrence-parsers.js.map +1 -1
- package/dist/cli/commands/reindex.d.ts +21 -5
- package/dist/cli/commands/reindex.js +345 -205
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/restore.d.ts +8 -7
- package/dist/cli/commands/restore.js +105 -69
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/schema.js +33 -30
- package/dist/cli/commands/schema.js.map +1 -1
- package/dist/cli/commands/search.d.ts +10 -2
- package/dist/cli/commands/search.js +595 -536
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/telemetry.js +98 -87
- package/dist/cli/commands/telemetry.js.map +1 -1
- package/dist/cli/commands/test-all.js +237 -168
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test.d.ts +6 -5
- package/dist/cli/commands/test.js +530 -464
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +57 -42
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.d.ts +1 -1
- package/dist/cli/commands/update.js +764 -747
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +18 -1
- package/dist/cli/commands/validate.js +466 -343
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.js +399 -357
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-options.js +48 -21
- package/dist/cli/extension-command-options.js.map +1 -1
- package/dist/cli/main.d.ts +47 -0
- package/dist/cli/main.js +428 -341
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/migration-gates.js +22 -45
- package/dist/cli/migration-gates.js.map +1 -1
- package/dist/cli/register-list-query.js +94 -105
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +400 -416
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +86 -66
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +120 -101
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.js +117 -122
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli-bundle/chunks/{activity-MVSEND6D.js → activity-CUC4JY3U.js} +9 -9
- package/dist/cli-bundle/chunks/activity-WEIEMM73.js +16 -0
- package/dist/cli-bundle/chunks/{aggregate-MOC4TR2G.js → aggregate-DKUTRY6R.js} +109 -85
- package/dist/cli-bundle/chunks/aggregate-DKUTRY6R.js.map +1 -0
- package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js → aggregate-SW5PNGCS.js} +108 -84
- package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js.map → aggregate-SW5PNGCS.js.map} +2 -2
- package/dist/cli-bundle/chunks/{append-KDHT4GHI.js → append-H32VOR2Y.js} +6 -6
- package/dist/cli-bundle/chunks/{append-LEDBAM3K.js → append-UBM632FK.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-Z55WX4IQ.js → chunk-2227673O.js} +158 -114
- package/dist/cli-bundle/chunks/chunk-2227673O.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js → chunk-2ASNV4DH.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js → chunk-2CHRYUXL.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QE5UFCCO.js → chunk-2KWL5NPW.js} +42 -27
- package/dist/cli-bundle/chunks/chunk-2KWL5NPW.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ZEATCVAC.js → chunk-36UGKF4O.js} +21 -29
- package/dist/cli-bundle/chunks/chunk-36UGKF4O.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-JZG5ADVE.js → chunk-3AZUFQK6.js} +1103 -963
- package/dist/cli-bundle/chunks/chunk-3AZUFQK6.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-DRPF274X.js → chunk-3LCUASYG.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js → chunk-3Q2HBMTI.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-4BU75MF4.js +87 -0
- package/dist/cli-bundle/chunks/chunk-4BU75MF4.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GF7EAR22.js → chunk-4NUOWFBT.js} +109 -72
- package/dist/cli-bundle/chunks/chunk-4NUOWFBT.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js → chunk-55XRYWEG.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-5IRVSKPS.js → chunk-5GVTFFTC.js} +150 -224
- package/dist/cli-bundle/chunks/chunk-5GVTFFTC.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-CHRNYKNI.js → chunk-5PGBHRY3.js} +41 -26
- package/dist/cli-bundle/chunks/chunk-5PGBHRY3.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-53ARXF2O.js → chunk-66Z3X7ZG.js} +261 -161
- package/dist/cli-bundle/chunks/chunk-66Z3X7ZG.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-A3UNLXNJ.js → chunk-6ITZLD4T.js} +738 -688
- package/dist/cli-bundle/chunks/chunk-6ITZLD4T.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-JTRKME24.js → chunk-6YCYF2AI.js} +262 -162
- package/dist/cli-bundle/chunks/chunk-6YCYF2AI.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-RM6MHL6A.js → chunk-6ZMBJRDJ.js} +580 -467
- package/dist/cli-bundle/chunks/chunk-6ZMBJRDJ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-RPRW26NG.js → chunk-7MYWF4ZX.js} +110 -73
- package/dist/cli-bundle/chunks/chunk-7MYWF4ZX.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-SNUK7H5J.js → chunk-7NSPKJUS.js} +716 -606
- package/dist/cli-bundle/chunks/chunk-7NSPKJUS.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-KYDYQMNW.js → chunk-7TH5NMVB.js} +95 -53
- package/dist/cli-bundle/chunks/chunk-7TH5NMVB.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-VD3LKZFX.js → chunk-7W4H4K26.js} +739 -689
- package/dist/cli-bundle/chunks/chunk-7W4H4K26.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js → chunk-A6VOGKBA.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js → chunk-AIAIXG7I.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-NIBP3I7A.js → chunk-AJEBCRIY.js} +128 -126
- package/dist/cli-bundle/chunks/chunk-AJEBCRIY.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js → chunk-B4O5S7I3.js} +79 -57
- package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js.map → chunk-B4O5S7I3.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js → chunk-BTX5MIQF.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-BVZZN2LH.js +809 -0
- package/dist/cli-bundle/chunks/chunk-BVZZN2LH.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js → chunk-CYBDUHNO.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js → chunk-CZPVDLD2.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-FDEVKXC4.js → chunk-EMPGXBUF.js} +22 -30
- package/dist/cli-bundle/chunks/chunk-EMPGXBUF.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js → chunk-EUKTMRN3.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js → chunk-FFOQHGNH.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js → chunk-GFMSLORL.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-IZQOJR2B.js → chunk-GRRG3MCT.js} +198 -189
- package/dist/cli-bundle/chunks/chunk-GRRG3MCT.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js → chunk-H4GRLYJS.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js → chunk-HQTPRV4D.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-CY5IJMUM.js → chunk-I66WE2HE.js} +712 -602
- package/dist/cli-bundle/chunks/chunk-I66WE2HE.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ZFIEEDTJ.js → chunk-IEEJQCZ4.js} +509 -363
- package/dist/cli-bundle/chunks/chunk-IEEJQCZ4.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-DU66JUGT.js → chunk-IG5JYZGU.js} +488 -420
- package/dist/cli-bundle/chunks/chunk-IG5JYZGU.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js → chunk-JMK5GCK2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js → chunk-JXAUVO6X.js} +258 -169
- package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js.map → chunk-JXAUVO6X.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js → chunk-K2VYLVX4.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js → chunk-KCO2EAN5.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-T7ZMQI4J.js → chunk-KIYCOJ63.js} +198 -189
- package/dist/cli-bundle/chunks/chunk-KIYCOJ63.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js → chunk-KLXF7NCC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-V3KLX7U7.js → chunk-KN3URLKS.js} +510 -364
- package/dist/cli-bundle/chunks/chunk-KN3URLKS.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js → chunk-LRKMWUUV.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js → chunk-LTRAF2D7.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-5T6WPLRO.js → chunk-MNBPX5JS.js} +394 -354
- package/dist/cli-bundle/chunks/chunk-MNBPX5JS.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js → chunk-MRD4T5LF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js → chunk-N2JSWVWG.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-7WDETKGP.js → chunk-N3QCJS4M.js} +1105 -965
- package/dist/cli-bundle/chunks/chunk-N3QCJS4M.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-KGQ3W65B.js → chunk-NRZS637N.js} +258 -169
- package/dist/cli-bundle/chunks/chunk-NRZS637N.js.map +1 -0
- package/dist/cli-bundle/chunks/chunk-OTUJZKGI.js +799 -0
- package/dist/cli-bundle/chunks/chunk-OTUJZKGI.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ZIE6WXJ2.js → chunk-Q6K2OACU.js} +153 -90
- package/dist/cli-bundle/chunks/chunk-Q6K2OACU.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-K46GQ265.js → chunk-Q6NXOHS6.js} +489 -421
- package/dist/cli-bundle/chunks/chunk-Q6NXOHS6.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js → chunk-QH3FSKRJ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-UB3V5WUI.js → chunk-RM37OPYK.js} +394 -354
- package/dist/cli-bundle/chunks/chunk-RM37OPYK.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js → chunk-S62UANU7.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NO6Y6FB2.js → chunk-SPM2XLWI.js} +37 -28
- package/dist/cli-bundle/chunks/chunk-SPM2XLWI.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-DORJSBGJ.js → chunk-SYNKD3ZG.js} +127 -125
- package/dist/cli-bundle/chunks/chunk-SYNKD3ZG.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-6YRAMXRS.js → chunk-SYVUU7EK.js} +581 -468
- package/dist/cli-bundle/chunks/chunk-SYVUU7EK.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-D5LYZVGB.js → chunk-TPOFWBMY.js} +95 -53
- package/dist/cli-bundle/chunks/chunk-TPOFWBMY.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-IHXXUIXS.js → chunk-TTHCEV5Q.js} +92 -77
- package/dist/cli-bundle/chunks/chunk-TTHCEV5Q.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js → chunk-U2BEEM2X.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-Z5BM2FKQ.js → chunk-UGLU6Q2I.js} +91 -76
- package/dist/cli-bundle/chunks/chunk-UGLU6Q2I.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js → chunk-UT73HUPC.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js → chunk-UTSH5GWX.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-AWN4PPH5.js → chunk-UWKEJMZU.js} +157 -113
- package/dist/cli-bundle/chunks/chunk-UWKEJMZU.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js +84 -0
- package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KTMMTOIP.js → chunk-W47SML5B.js} +152 -89
- package/dist/cli-bundle/chunks/chunk-W47SML5B.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-UFKNF23C.js → chunk-WJAMWAHZ.js} +157 -118
- package/dist/cli-bundle/chunks/chunk-WJAMWAHZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-HIBK6H4S.js → chunk-XCHUVHKU.js} +685 -544
- package/dist/cli-bundle/chunks/chunk-XCHUVHKU.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-DJDXAU74.js → chunk-XEWQKDYZ.js} +685 -544
- package/dist/cli-bundle/chunks/chunk-XEWQKDYZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-BOWQWXLI.js → chunk-XTHQWXVC.js} +158 -119
- package/dist/cli-bundle/chunks/chunk-XTHQWXVC.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-6T5ZIWBS.js → chunk-XWGEMNBR.js} +150 -224
- package/dist/cli-bundle/chunks/chunk-XWGEMNBR.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js → chunk-Y4NRKBFW.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-WTRUDJ3R.js → chunk-YLZZ6T54.js} +38 -29
- package/dist/cli-bundle/chunks/chunk-YLZZ6T54.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js → chunk-YPKFV2JR.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js → chunk-Z4DGFQDH.js} +80 -58
- package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js.map → chunk-Z4DGFQDH.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js → chunk-ZNHEYCDD.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js → chunk-ZNT7KEWE.js} +2 -2
- package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js → claim-SENTPZBN.js} +8 -8
- package/dist/cli-bundle/chunks/{claim-6NINZYB3.js → claim-Z7MEQCBT.js} +8 -8
- package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js → close-424MX4CU.js} +7 -7
- package/dist/cli-bundle/chunks/close-YCWQQPDS.js +14 -0
- package/dist/cli-bundle/chunks/{close-many-CXJBOWWY.js → close-many-2IV4J2TR.js} +103 -82
- package/dist/cli-bundle/chunks/close-many-2IV4J2TR.js.map +1 -0
- package/dist/cli-bundle/chunks/{close-many-BFMP6HHK.js → close-many-SWY34BII.js} +102 -81
- package/dist/cli-bundle/chunks/close-many-SWY34BII.js.map +7 -0
- package/dist/cli-bundle/chunks/{comments-ETHABIY6.js → comments-4FGNTSNV.js} +8 -8
- package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js → comments-7YS5MY5X.js} +8 -8
- package/dist/cli-bundle/chunks/config-BZJKK7FZ.js +1062 -0
- package/dist/cli-bundle/chunks/config-BZJKK7FZ.js.map +1 -0
- package/dist/cli-bundle/chunks/config-G74GISC4.js +1072 -0
- package/dist/cli-bundle/chunks/config-G74GISC4.js.map +7 -0
- package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js → context-LHVKJSPJ.js} +12 -12
- package/dist/cli-bundle/chunks/{context-XDI4DKKT.js → context-ZQY54JNS.js} +12 -12
- package/dist/cli-bundle/chunks/{contracts-SMOAN5NF.js → contracts-CP2EZJC7.js} +320 -199
- package/dist/cli-bundle/chunks/contracts-CP2EZJC7.js.map +7 -0
- package/dist/cli-bundle/chunks/{contracts-KP4QAGVW.js → contracts-FIZLMP7O.js} +321 -200
- package/dist/cli-bundle/chunks/contracts-FIZLMP7O.js.map +1 -0
- package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js → copy-GYNQQPW2.js} +5 -5
- package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js → copy-TLW7JTQT.js} +5 -5
- package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js → create-VSKYSOCD.js} +12 -12
- package/dist/cli-bundle/chunks/create-XTMAPS7I.js +28 -0
- package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js → delete-4W5JYCEG.js} +5 -5
- package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js → delete-ANTOTI2I.js} +5 -5
- package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js → deps-HPPE6MJN.js} +5 -5
- package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js → deps-ZQZN54EZ.js} +5 -5
- package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js → docs-RPOVFMP3.js} +7 -7
- package/dist/cli-bundle/chunks/{docs-2TIFR62T.js → docs-XJNYBJGE.js} +7 -7
- package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js → eval-DM6JBZTS.js} +10 -10
- package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js → eval-RFBI5FGS.js} +10 -10
- package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js → extension-B3YY4WY5.js} +11 -10
- package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js → extension-TTSEFQTS.js} +11 -10
- package/dist/cli-bundle/chunks/{files-DF3HO6XK.js → files-5D65CHGE.js} +7 -7
- package/dist/cli-bundle/chunks/{files-T5ODMETM.js → files-GPIG77EN.js} +7 -7
- package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js → focus-C3PEJV2C.js} +6 -6
- package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js → focus-ZHN7WIGX.js} +6 -6
- package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js → gc-D4JQ6OWN.js} +3 -3
- package/dist/cli-bundle/chunks/{gc-FULIVYR4.js → gc-VZIXDL32.js} +3 -3
- package/dist/cli-bundle/chunks/{get-VYPIICPC.js → get-GIBRUUOP.js} +121 -81
- package/dist/cli-bundle/chunks/get-GIBRUUOP.js.map +1 -0
- package/dist/cli-bundle/chunks/{get-AWK324RS.js → get-IOVAN6RU.js} +120 -80
- package/dist/cli-bundle/chunks/get-IOVAN6RU.js.map +7 -0
- package/dist/cli-bundle/chunks/{health-Q66C43GN.js → health-L2U3AFKV.js} +437 -264
- package/dist/cli-bundle/chunks/health-L2U3AFKV.js.map +1 -0
- package/dist/cli-bundle/chunks/{health-FBCVZGSX.js → health-MM7AWXYF.js} +436 -263
- package/dist/cli-bundle/chunks/health-MM7AWXYF.js.map +7 -0
- package/dist/cli-bundle/chunks/history-DD7L7BNL.js +18 -0
- package/dist/cli-bundle/chunks/{history-X4OSES6K.js → history-IL7XCEX2.js} +8 -8
- package/dist/cli-bundle/chunks/{history-compact-2GHT32UX.js → history-compact-HALOTOU7.js} +214 -135
- package/dist/cli-bundle/chunks/history-compact-HALOTOU7.js.map +1 -0
- package/dist/cli-bundle/chunks/{history-compact-WLCQEKXS.js → history-compact-MV25P7DM.js} +213 -134
- package/dist/cli-bundle/chunks/history-compact-MV25P7DM.js.map +7 -0
- package/dist/cli-bundle/chunks/history-redact-IX4YEWMY.js +19 -0
- package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js → history-redact-VYCWQFK7.js} +9 -9
- package/dist/cli-bundle/chunks/{history-repair-FY75IC26.js → history-repair-44MODPQF.js} +124 -84
- package/dist/cli-bundle/chunks/history-repair-44MODPQF.js.map +1 -0
- package/dist/cli-bundle/chunks/{history-repair-GABSDSVD.js → history-repair-CPNAOCNF.js} +123 -83
- package/dist/cli-bundle/chunks/history-repair-CPNAOCNF.js.map +7 -0
- package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js → init-F27NHENZ.js} +12 -11
- package/dist/cli-bundle/chunks/init-HHVQQP6C.js +22 -0
- package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js → learnings-HJVDQIGY.js} +8 -8
- package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js → learnings-XSFSUUWK.js} +8 -8
- package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js → list-HPMEKCAA.js} +8 -8
- package/dist/cli-bundle/chunks/{list-ROT7JF62.js → list-VMPWTURB.js} +8 -8
- package/dist/cli-bundle/chunks/{next-66BJB4N2.js → next-ETXF2ZCN.js} +59 -37
- package/dist/cli-bundle/chunks/next-ETXF2ZCN.js.map +7 -0
- package/dist/cli-bundle/chunks/{next-N5MWJTBY.js → next-QM6YJIIS.js} +60 -38
- package/dist/cli-bundle/chunks/next-QM6YJIIS.js.map +1 -0
- package/dist/cli-bundle/chunks/{notes-FW6YFLND.js → notes-GDZIKGR6.js} +8 -8
- package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js → notes-WDDBPC4D.js} +8 -8
- package/dist/cli-bundle/chunks/{plan-ZHKZ7JVF.js → plan-BGDR73Z6.js} +373 -279
- package/dist/cli-bundle/chunks/plan-BGDR73Z6.js.map +1 -0
- package/dist/cli-bundle/chunks/{plan-DQ7G4EDC.js → plan-C5IMM335.js} +372 -278
- package/dist/cli-bundle/chunks/plan-C5IMM335.js.map +7 -0
- package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js → profile-CCOKZ2IQ.js} +9 -9
- package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js → profile-HUCENIEQ.js} +9 -9
- package/dist/cli-bundle/chunks/{register-list-query-Y2VRHPCL.js → register-list-query-ROSNIL52.js} +80 -83
- package/dist/cli-bundle/chunks/register-list-query-ROSNIL52.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-list-query-KY6Z6WV7.js → register-list-query-XN4ZRHSV.js} +79 -82
- package/dist/cli-bundle/chunks/register-list-query-XN4ZRHSV.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-PCARIGZS.js → register-mutation-CFSB2MS3.js} +406 -385
- package/dist/cli-bundle/chunks/register-mutation-CFSB2MS3.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-mutation-N6AYSKPM.js → register-mutation-KRLAHEL2.js} +405 -384
- package/dist/cli-bundle/chunks/register-mutation-KRLAHEL2.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-operations-L6CYTOIH.js → register-operations-4PASGJDB.js} +112 -93
- package/dist/cli-bundle/chunks/register-operations-4PASGJDB.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-operations-YAT6FUUB.js → register-operations-MBN4KGUM.js} +113 -94
- package/dist/cli-bundle/chunks/register-operations-MBN4KGUM.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-setup-N7UGXYJC.js → register-setup-VIAWYFP5.js} +129 -104
- package/dist/cli-bundle/chunks/register-setup-VIAWYFP5.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-setup-MPANILQF.js → register-setup-ZCGKHDKL.js} +128 -103
- package/dist/cli-bundle/chunks/register-setup-ZCGKHDKL.js.map +7 -0
- package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js → restore-4CBWUMCX.js} +9 -9
- package/dist/cli-bundle/chunks/restore-5UEAGG3W.js +17 -0
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js → scheduling-shortcuts-6VFKNKCM.js} +12 -12
- package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js → scheduling-shortcuts-ERHCVTEM.js} +12 -12
- package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js → schema-TDGK6N3I.js} +7 -7
- package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js → schema-UE5KKAUX.js} +7 -7
- package/dist/cli-bundle/chunks/{search-KP6H7COV.js → search-FP7MEU4S.js} +10 -10
- package/dist/cli-bundle/chunks/{search-CX5UMV4H.js → search-K4CFLQ5S.js} +10 -10
- package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js → stats-NJJCALEZ.js} +6 -6
- package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js → stats-XT6QRKQY.js} +6 -6
- package/dist/cli-bundle/chunks/{telemetry-DIFPXCAT.js → telemetry-5SQ5UDXC.js} +84 -70
- package/dist/cli-bundle/chunks/telemetry-5SQ5UDXC.js.map +7 -0
- package/dist/cli-bundle/chunks/{telemetry-WTYFUPRL.js → telemetry-HVXFZA2U.js} +85 -71
- package/dist/cli-bundle/chunks/telemetry-HVXFZA2U.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-QNDXZQCW.js → test-UFSJ5YIO.js} +15 -14
- package/dist/cli-bundle/chunks/{test-HU2BS7EY.js → test-YCDAUBWF.js} +15 -14
- package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js +427 -0
- package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js.map +1 -0
- package/dist/cli-bundle/chunks/test-all-PM7UYN42.js +430 -0
- package/dist/cli-bundle/chunks/test-all-PM7UYN42.js.map +7 -0
- package/dist/cli-bundle/chunks/{test-runs-CA6K32RD.js → test-runs-FK5E75AA.js} +185 -147
- package/dist/cli-bundle/chunks/test-runs-FK5E75AA.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-runs-LANLLPVO.js → test-runs-H4TGWGRN.js} +184 -146
- package/dist/cli-bundle/chunks/test-runs-H4TGWGRN.js.map +7 -0
- package/dist/cli-bundle/chunks/update-MTCFES6X.js +24 -0
- package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js → update-Y5WQVT5O.js} +15 -15
- package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js → update-many-6YAYYRLE.js} +83 -68
- package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js.map → update-many-6YAYYRLE.js.map} +2 -2
- package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js → update-many-JTKKSA7Y.js} +84 -69
- package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js.map → update-many-JTKKSA7Y.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js → upgrade-DTAHZ236.js} +11 -10
- package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js.map → upgrade-DTAHZ236.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js → upgrade-JUDU7YL4.js} +13 -12
- package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js.map → upgrade-JUDU7YL4.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-2G566PKQ.js → validate-732RWS5W.js} +440 -319
- package/dist/cli-bundle/chunks/validate-732RWS5W.js.map +7 -0
- package/dist/cli-bundle/chunks/{validate-BDPVXHHH.js → validate-W7H5TEDC.js} +441 -320
- package/dist/cli-bundle/chunks/validate-W7H5TEDC.js.map +1 -0
- package/dist/cli-bundle/main.js +986 -1500
- package/dist/cli-bundle/main.js.map +4 -4
- package/dist/core/config/nested-settings.js +89 -67
- package/dist/core/config/nested-settings.js.map +1 -1
- package/dist/core/extensions/activation-summary-markdown.js +23 -12
- package/dist/core/extensions/activation-summary-markdown.js.map +1 -1
- package/dist/core/extensions/extension-policy.d.ts +18 -3
- package/dist/core/extensions/extension-policy.js +116 -106
- package/dist/core/extensions/extension-policy.js.map +1 -1
- package/dist/core/extensions/loader.js +310 -232
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/governance/metadata-coverage.js +20 -28
- package/dist/core/governance/metadata-coverage.js.map +1 -1
- package/dist/core/history/drift-scan.js +93 -81
- package/dist/core/history/drift-scan.js.map +1 -1
- package/dist/core/item/item-format.js +523 -410
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/item-type-definition.js +14 -14
- package/dist/core/item/item-type-definition.js.map +1 -1
- package/dist/core/item/type-registry.js +87 -82
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/output/mutation-projection.js +42 -26
- package/dist/core/output/mutation-projection.js.map +1 -1
- package/dist/core/schema/runtime-schema.js +34 -28
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/search/semantic-defaults.js +64 -37
- package/dist/core/search/semantic-defaults.js.map +1 -1
- package/dist/core/search/vector-stores.js +32 -17
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/sentry/helpers.js +31 -28
- package/dist/core/sentry/helpers.js.map +1 -1
- package/dist/core/sentry/instrument.js +54 -43
- package/dist/core/sentry/instrument.js.map +1 -1
- package/dist/core/store/front-matter-cache.js +239 -153
- package/dist/core/store/front-matter-cache.js.map +1 -1
- package/dist/core/store/item-store.js +33 -26
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/settings.js +247 -203
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/test/background-runs.js +189 -160
- package/dist/core/test/background-runs.js.map +1 -1
- package/dist/mcp/server.js +387 -367
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.js +111 -180
- package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +76 -45
- package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
- package/dist/sdk/compose.d.ts +4 -1
- package/dist/sdk/compose.js +181 -115
- package/dist/sdk/compose.js.map +1 -1
- package/docs/RELEASING.md +2 -3
- package/package.json +2 -2
- package/packages/pm-beads/extensions/beads/runtime.ts +240 -167
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +65 -58
- package/packages/pm-todos/extensions/todos/runtime.ts +65 -42
- package/dist/cli-bundle/chunks/activity-EJBMXUBH.js +0 -16
- package/dist/cli-bundle/chunks/aggregate-MOC4TR2G.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-53ARXF2O.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-5IRVSKPS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-5T6WPLRO.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-6T5ZIWBS.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-6YRAMXRS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7WDETKGP.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-A3UNLXNJ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-AWN4PPH5.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-BOWQWXLI.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js +0 -115
- package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-CHRNYKNI.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-CY5IJMUM.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-D5LYZVGB.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-DJDXAU74.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-DORJSBGJ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-DU66JUGT.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js +0 -118
- package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-FDEVKXC4.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-GF7EAR22.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HIBK6H4S.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-IHXXUIXS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-ISEKN64V.js +0 -35
- package/dist/cli-bundle/chunks/chunk-ISEKN64V.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-IZQOJR2B.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-JTRKME24.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-JZG5ADVE.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-K46GQ265.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-KGQ3W65B.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-KTMMTOIP.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-KYDYQMNW.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-NIBP3I7A.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-NO6Y6FB2.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-QE5UFCCO.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RM6MHL6A.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-RPRW26NG.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-SNUK7H5J.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-T7ZMQI4J.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-UB3V5WUI.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-UFKNF23C.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-V3KLX7U7.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-VD3LKZFX.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js +0 -32
- package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-WTRUDJ3R.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-Z55WX4IQ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-Z5BM2FKQ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZEATCVAC.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZFIEEDTJ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZIE6WXJ2.js.map +0 -1
- package/dist/cli-bundle/chunks/close-37KEHLYM.js +0 -14
- package/dist/cli-bundle/chunks/close-many-BFMP6HHK.js.map +0 -7
- package/dist/cli-bundle/chunks/close-many-CXJBOWWY.js.map +0 -1
- package/dist/cli-bundle/chunks/config-FIXJZEQK.js +0 -1541
- package/dist/cli-bundle/chunks/config-FIXJZEQK.js.map +0 -7
- package/dist/cli-bundle/chunks/config-X3ZVCUUG.js +0 -1531
- package/dist/cli-bundle/chunks/config-X3ZVCUUG.js.map +0 -1
- package/dist/cli-bundle/chunks/contracts-KP4QAGVW.js.map +0 -1
- package/dist/cli-bundle/chunks/contracts-SMOAN5NF.js.map +0 -7
- package/dist/cli-bundle/chunks/create-DFMNBKBS.js +0 -28
- package/dist/cli-bundle/chunks/get-AWK324RS.js.map +0 -7
- package/dist/cli-bundle/chunks/get-VYPIICPC.js.map +0 -1
- package/dist/cli-bundle/chunks/health-FBCVZGSX.js.map +0 -7
- package/dist/cli-bundle/chunks/health-Q66C43GN.js.map +0 -1
- package/dist/cli-bundle/chunks/history-5XUSLAJA.js +0 -18
- package/dist/cli-bundle/chunks/history-compact-2GHT32UX.js.map +0 -1
- package/dist/cli-bundle/chunks/history-compact-WLCQEKXS.js.map +0 -7
- package/dist/cli-bundle/chunks/history-redact-BVHWDXPR.js +0 -19
- package/dist/cli-bundle/chunks/history-repair-FY75IC26.js.map +0 -1
- package/dist/cli-bundle/chunks/history-repair-GABSDSVD.js.map +0 -7
- package/dist/cli-bundle/chunks/init-TRYJELH4.js +0 -21
- package/dist/cli-bundle/chunks/next-66BJB4N2.js.map +0 -7
- package/dist/cli-bundle/chunks/next-N5MWJTBY.js.map +0 -1
- package/dist/cli-bundle/chunks/plan-DQ7G4EDC.js.map +0 -7
- package/dist/cli-bundle/chunks/plan-ZHKZ7JVF.js.map +0 -1
- package/dist/cli-bundle/chunks/register-list-query-KY6Z6WV7.js.map +0 -7
- package/dist/cli-bundle/chunks/register-list-query-Y2VRHPCL.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-N6AYSKPM.js.map +0 -7
- package/dist/cli-bundle/chunks/register-mutation-PCARIGZS.js.map +0 -1
- package/dist/cli-bundle/chunks/register-operations-L6CYTOIH.js.map +0 -7
- package/dist/cli-bundle/chunks/register-operations-YAT6FUUB.js.map +0 -1
- package/dist/cli-bundle/chunks/register-setup-MPANILQF.js.map +0 -7
- package/dist/cli-bundle/chunks/register-setup-N7UGXYJC.js.map +0 -1
- package/dist/cli-bundle/chunks/restore-IRAKSWIW.js +0 -17
- package/dist/cli-bundle/chunks/telemetry-DIFPXCAT.js.map +0 -7
- package/dist/cli-bundle/chunks/telemetry-WTYFUPRL.js.map +0 -1
- package/dist/cli-bundle/chunks/test-all-PZTBLLQ6.js +0 -360
- package/dist/cli-bundle/chunks/test-all-PZTBLLQ6.js.map +0 -7
- package/dist/cli-bundle/chunks/test-all-XLPI4USF.js +0 -357
- package/dist/cli-bundle/chunks/test-all-XLPI4USF.js.map +0 -1
- package/dist/cli-bundle/chunks/test-runs-CA6K32RD.js.map +0 -1
- package/dist/cli-bundle/chunks/test-runs-LANLLPVO.js.map +0 -7
- package/dist/cli-bundle/chunks/update-UXDLTEOZ.js +0 -24
- package/dist/cli-bundle/chunks/validate-2G566PKQ.js.map +0 -7
- package/dist/cli-bundle/chunks/validate-BDPVXHHH.js.map +0 -1
- /package/dist/cli-bundle/chunks/{activity-MVSEND6D.js.map → activity-CUC4JY3U.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-EJBMXUBH.js.map → activity-WEIEMM73.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-KDHT4GHI.js.map → append-H32VOR2Y.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-LEDBAM3K.js.map → append-UBM632FK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js.map → chunk-2ASNV4DH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js.map → chunk-2CHRYUXL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DRPF274X.js.map → chunk-3LCUASYG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js.map → chunk-3Q2HBMTI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js.map → chunk-55XRYWEG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js.map → chunk-A6VOGKBA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js.map → chunk-AIAIXG7I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js.map → chunk-BTX5MIQF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js.map → chunk-CYBDUHNO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js.map → chunk-CZPVDLD2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js.map → chunk-EUKTMRN3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js.map → chunk-FFOQHGNH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js.map → chunk-GFMSLORL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js.map → chunk-H4GRLYJS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js.map → chunk-HQTPRV4D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js.map → chunk-JMK5GCK2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js.map → chunk-K2VYLVX4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js.map → chunk-KCO2EAN5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js.map → chunk-KLXF7NCC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js.map → chunk-LRKMWUUV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js.map → chunk-LTRAF2D7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js.map → chunk-MRD4T5LF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js.map → chunk-N2JSWVWG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js.map → chunk-QH3FSKRJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js.map → chunk-S62UANU7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js.map → chunk-U2BEEM2X.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js.map → chunk-UT73HUPC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js.map → chunk-UTSH5GWX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js.map → chunk-Y4NRKBFW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js.map → chunk-YPKFV2JR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js.map → chunk-ZNHEYCDD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js.map → chunk-ZNT7KEWE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js.map → claim-SENTPZBN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-6NINZYB3.js.map → claim-Z7MEQCBT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js.map → close-424MX4CU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-37KEHLYM.js.map → close-YCWQQPDS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-ETHABIY6.js.map → comments-4FGNTSNV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js.map → comments-7YS5MY5X.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js.map → context-LHVKJSPJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{context-XDI4DKKT.js.map → context-ZQY54JNS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js.map → copy-GYNQQPW2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js.map → copy-TLW7JTQT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js.map → create-VSKYSOCD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-DFMNBKBS.js.map → create-XTMAPS7I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js.map → delete-4W5JYCEG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js.map → delete-ANTOTI2I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js.map → deps-HPPE6MJN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js.map → deps-ZQZN54EZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js.map → docs-RPOVFMP3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-2TIFR62T.js.map → docs-XJNYBJGE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js.map → eval-DM6JBZTS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js.map → eval-RFBI5FGS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js.map → extension-B3YY4WY5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js.map → extension-TTSEFQTS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-DF3HO6XK.js.map → files-5D65CHGE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-T5ODMETM.js.map → files-GPIG77EN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js.map → focus-C3PEJV2C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js.map → focus-ZHN7WIGX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js.map → gc-D4JQ6OWN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-FULIVYR4.js.map → gc-VZIXDL32.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-5XUSLAJA.js.map → history-DD7L7BNL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-X4OSES6K.js.map → history-IL7XCEX2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-BVHWDXPR.js.map → history-redact-IX4YEWMY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js.map → history-redact-VYCWQFK7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js.map → init-F27NHENZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-TRYJELH4.js.map → init-HHVQQP6C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js.map → learnings-HJVDQIGY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js.map → learnings-XSFSUUWK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js.map → list-HPMEKCAA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-ROT7JF62.js.map → list-VMPWTURB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-FW6YFLND.js.map → notes-GDZIKGR6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js.map → notes-WDDBPC4D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js.map → profile-CCOKZ2IQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js.map → profile-HUCENIEQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js.map → restore-4CBWUMCX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-IRAKSWIW.js.map → restore-5UEAGG3W.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js.map → scheduling-shortcuts-6VFKNKCM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js.map → scheduling-shortcuts-ERHCVTEM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js.map → schema-TDGK6N3I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js.map → schema-UE5KKAUX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-KP6H7COV.js.map → search-FP7MEU4S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{search-CX5UMV4H.js.map → search-K4CFLQ5S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js.map → stats-NJJCALEZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js.map → stats-XT6QRKQY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-QNDXZQCW.js.map → test-UFSJ5YIO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-HU2BS7EY.js.map → test-YCDAUBWF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-UXDLTEOZ.js.map → update-MTCFES6X.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js.map → update-Y5WQVT5O.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../cli/commands/search.ts","../../../../../../../../core/extensions/runtime-registrations.ts","../../../../../../../../core/shared/text-normalization.ts","../../../../../../../../core/search/relevance.ts","../../../../../../../../core/search/bm25.ts"],"sourcesContent":["/**\n * @module cli/commands/search\n *\n * Implements the pm search command surface and its agent-facing runtime behavior.\n */\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { coerceNumberInRange, toNonEmptyStringOrUndefined } from \"../../core/shared/primitives.js\";\nimport { isPathWithinDirectory } from \"../../core/fs/path-utils.js\";\nimport { getActiveExtensionRegistrations, runActiveOnReadHooks } from \"../../core/extensions/index.js\";\nimport { collectRegisteredItemFieldNames } from \"../../core/extensions/item-fields.js\";\nimport {\n resolveRegisteredSearchProvider,\n resolveRegisteredVectorStoreAdapter,\n} from \"../../core/extensions/runtime-registrations.js\";\nimport { resolveItemTypeRegistry, type ItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { parseLimit, parsePriority, parseType } from \"../shared-parsers.js\";\nimport {\n executeEmbeddingRequest,\n resolveEmbeddingProviders,\n type EmbeddingProviderConfig,\n type EmbeddingProviderResolution,\n} from \"../../core/search/providers.js\";\nimport {\n buildDeterministicQueryExpansions,\n mergeQueryExpansions,\n normalizeQueryExpansionOutput,\n normalizeRerankOutput,\n rerankCandidatesWithEmbeddings,\n resolveQueryExpansionConfig,\n resolveRerankConfig,\n type QueryExpansionConfig,\n type RerankCandidate,\n type RerankConfig,\n} from \"../../core/search/relevance.js\";\nimport { resolveSettingsWithSemanticRuntimeDefaults } from \"../../core/search/semantic-defaults.js\";\nimport {\n executeVectorQuery,\n resolveVectorStores,\n type VectorQueryHit,\n type VectorStoreConfig,\n type VectorStoreResolution,\n} from \"../../core/search/vector-stores.js\";\nimport { readVectorizationStatusLedger } from \"../../core/search/cache.js\";\nimport {\n buildEventCorpus,\n buildPlanFlatCorpus,\n buildReminderCorpus,\n buildSearchCorpus,\n resolveSearchCorpusFields,\n} from \"../../core/search/corpus.js\";\nimport {\n buildBm25Index,\n flattenSearchCorpusText,\n resolveBm25Params,\n scoreBm25Query,\n tokenizeBm25,\n type Bm25Params,\n} from \"../../core/search/bm25.js\";\nimport { collectStaleVectorizationIds } from \"../../core/search/staleness.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { parseItemDocument } from \"../../core/item/item-format.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { isTerminalStatus } from \"../../core/item/status.js\";\nimport { isStatusAllFilterInput, parseStatusFilterCsv } from \"../../core/item/status-filter.js\";\nimport { collectRuntimeFilterValues, matchesRuntimeFilters } from \"../../core/schema/runtime-field-filters.js\";\nimport {\n hasMissingMetadataFilter,\n itemMatchesMissingMetadata,\n lifecycleClassifierFromStatusRegistry,\n type LifecycleClassifier,\n} from \"../../core/governance/metadata-coverage.js\";\nimport {\n hasContentFieldFilter,\n itemMatchesContentFilters,\n} from \"../../core/governance/content-fields.js\";\nimport {\n applyFilterValueEcho,\n buildContentFilterEcho,\n buildGovernanceMissingFilterEcho,\n resolveContentFieldFilters,\n resolveMissingMetadataFilters,\n} from \"./list.js\";\nimport {\n resolveRuntimeFieldRegistry,\n resolveRuntimeStatusRegistry,\n type RuntimeFieldRegistry,\n type RuntimeStatusRegistry,\n} from \"../../core/schema/runtime-schema.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { tokenizeAlphaNumeric } from \"../../core/shared/text-normalization.js\";\nimport { compareTimestampStrings, nowIso, resolveIsoOrRelative } from \"../../core/shared/time.js\";\nimport { listAllDocumentCandidatesCached } from \"../../core/store/front-matter-cache.js\";\nimport { listAllFrontMatter } from \"../../core/store/item-store.js\";\nimport { getItemPath, getSettingsPath, resolveGlobalPmRoot, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemDocument, ItemFormat, ItemFrontMatter, ItemStatus, ItemType, PmSettings } from \"../../types/index.js\";\nimport type { SharedItemFilterOptions } from \"./item-filter-options.js\";\n\n/**\n * Documents the search options payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchOptions extends SharedItemFilterOptions {\n mode?: string;\n matchMode?: string;\n minScore?: string | number;\n count?: boolean;\n semanticWeight?: string | number;\n includeLinked?: boolean;\n titleExact?: boolean;\n phraseExact?: boolean;\n limit?: string;\n compact?: boolean;\n full?: boolean;\n fields?: string;\n // GH-157: emit per-field matched-text snippets on each hit (off by default for\n // token efficiency). Highlighted spans are wrapped with the «…» markers.\n highlight?: boolean;\n}\n\n/**\n * Restricts search match mode values accepted by command, SDK, and storage contracts.\n */\nexport type SearchMatchMode = \"and\" | \"or\" | \"exact\";\n\ntype SearchMode = \"keyword\" | \"semantic\" | \"hybrid\";\ntype SearchProjectionMode = \"compact\" | \"full\" | \"fields\";\n\ninterface SearchProjectionConfig {\n mode: SearchProjectionMode;\n fields: string[];\n}\n\nconst DEFAULT_COMPACT_SEARCH_FIELDS = [\n \"id\",\n \"title\",\n \"status\",\n \"type\",\n \"priority\",\n \"updated_at\",\n \"score\",\n \"matched_fields\",\n] as const;\n\nconst SEARCH_HIT_FIELD_KEYS = new Set([\"score\", \"matched_fields\", \"highlights\"]);\nconst SEARCH_ITEM_FIELD_KEYS = new Set([\n \"id\",\n \"title\",\n \"description\",\n \"type\",\n \"status\",\n \"priority\",\n \"tags\",\n \"created_at\",\n \"updated_at\",\n \"deadline\",\n \"assignee\",\n \"author\",\n \"estimated_minutes\",\n \"acceptance_criteria\",\n \"dependencies\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"reminders\",\n \"events\",\n \"files\",\n \"tests\",\n \"docs\",\n \"close_reason\",\n \"parent\",\n \"reviewer\",\n \"risk\",\n \"confidence\",\n \"sprint\",\n \"release\",\n \"blocked_by\",\n \"blocked_reason\",\n \"reporter\",\n \"severity\",\n \"environment\",\n \"repro_steps\",\n \"resolution\",\n \"expected_result\",\n \"actual_result\",\n \"affected_version\",\n \"fixed_version\",\n \"component\",\n \"regression\",\n \"customer_impact\",\n \"definition_of_ready\",\n \"order\",\n \"rank\",\n \"goal\",\n \"objective\",\n \"value\",\n \"impact\",\n \"outcome\",\n \"why_now\",\n \"plan\",\n]);\n\nconst LONG_QUERY_TOKEN_THRESHOLD = 2;\nconst LONG_QUERY_TITLE_EXACT_BONUS = 120;\nconst LONG_QUERY_PHRASE_MULTIPLIER = 6;\n// GH-181: in default (OR) match mode, multi-token queries that match EVERY\n// distinct query token in some searchable field get an additive ranking bonus so\n// items covering all terms outrank items matching only a subset. This is a\n// RANKING preference, not a hard filter (use --match-mode and for that).\nconst ALL_TERMS_COVERAGE_BONUS = 40;\nconst EXACT_ID_MATCH_SCORE = 1_000;\nconst SHORT_ID_MATCH_SCORE = 900;\n\n// GH-157 matched-text highlighting (--highlight): markers wrapping each matching\n// token run, and the number of characters of surrounding context retained on\n// each side of the first match in a field. The «…» guillemets are single\n// characters with negligible collision risk against item text, keeping the\n// snippet token-cheap while staying visually unambiguous for agents.\nconst HIGHLIGHT_OPEN = \"«\";\nconst HIGHLIGHT_CLOSE = \"»\";\nconst HIGHLIGHT_SNIPPET_RADIUS = 60;\n\n// GH-157 inline query syntax: bare `field:value` tokens parsed out of the query\n// string and applied as the equivalent filter. The value may itself contain\n// colons (e.g. `tag:area:search`), so only the FIRST colon delimits field from\n// value. Explicit --field flags take precedence over an inline token (see\n// resolveInlineQueryFilters).\nconst INLINE_QUERY_FILTER_FIELDS = [\"tag\", \"status\", \"type\", \"priority\"] as const;\ntype InlineQueryFilterField = (typeof INLINE_QUERY_FILTER_FIELDS)[number];\n\nconst COMPACT_SEARCH_VALUE_FILTER_ECHO_ENTRIES = [\n {\n optionKey: \"status\",\n summaryKey: \"status\",\n normalize: (value: unknown) => (isStatusAllFilterInput(value) ? \"all\" : value),\n },\n { optionKey: \"type\", summaryKey: \"type\" },\n { optionKey: \"tag\", summaryKey: \"tag\" },\n { optionKey: \"priority\", summaryKey: \"priority\" },\n { optionKey: \"deadlineBefore\", summaryKey: \"deadline_before\" },\n { optionKey: \"deadlineAfter\", summaryKey: \"deadline_after\" },\n { optionKey: \"updatedAfter\", summaryKey: \"updated_after\" },\n { optionKey: \"updatedBefore\", summaryKey: \"updated_before\" },\n { optionKey: \"createdAfter\", summaryKey: \"created_after\" },\n { optionKey: \"createdBefore\", summaryKey: \"created_before\" },\n { optionKey: \"assignee\", summaryKey: \"assignee\" },\n { optionKey: \"sprint\", summaryKey: \"sprint\" },\n { optionKey: \"release\", summaryKey: \"release\" },\n { optionKey: \"parent\", summaryKey: \"parent\" },\n] as const;\n\n/**\n * Documents the search hit payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchHit {\n item: ItemFrontMatter;\n score: number;\n matched_fields: string[];\n // GH-181: whether every distinct query token matched some searchable field.\n // Used by --match-mode and (hard filter) and the default all-terms ranking\n // bonus. Not projected into output rows.\n matched_all_terms?: boolean;\n // GH-281: marks the keyword hit produced by the exact full-ID / short-ID\n // early-return in scoreDocument(). The semantic & hybrid ranking paths use it\n // to guarantee the exact-ID target ALWAYS ranks #1 (and is exempt from the\n // score threshold / limit), so the keyword-mode exact-ID guarantee is never\n // lost once vector blending is active. SHORT_ID matches keep score=900 and\n // full-ID matches keep score=1000, so sortHits still orders full above short.\n // Not projected into output rows.\n exact_id_match?: boolean;\n // GH-157: per-field matched-text snippets, populated only when the caller\n // passes --highlight. Each entry pairs a matched field name with a snippet of\n // its text where the matching token runs are wrapped in the «…» markers.\n highlights?: SearchHitHighlight[];\n}\n\n/**\n * Pairs a matched field name with a snippet of its text where every matching\n * token run is wrapped in the {@link HIGHLIGHT_OPEN}/{@link HIGHLIGHT_CLOSE}\n * markers. Emitted on {@link SearchHit.highlights} when `--highlight` is set.\n */\nexport interface SearchHitHighlight {\n field: string;\n snippet: string;\n}\n\n/**\n * Restricts search result item values accepted by command, SDK, and storage contracts.\n */\nexport type SearchResultItem = SearchHit | Record<string, unknown>;\n\ninterface SearchResultBase {\n query: string;\n mode: SearchMode;\n items: SearchResultItem[];\n count: number;\n // GH-181: total matched hits after filters/threshold but BEFORE the limit\n // truncation. Lets callers see how many matched before the (now-default)\n // keyword limit dropped rows. Only emitted when it differs from count.\n total?: number;\n // --count mode: count-only response carries the matched total and skips the\n // hit rows entirely (items is empty). `count` reflects the same total.\n count_only?: boolean;\n warnings?: string[];\n}\n\n/**\n * Documents the search compact result payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchCompactResult extends SearchResultBase {\n filters: Record<string, unknown>;\n projection?: undefined;\n now?: undefined;\n}\n\n/**\n * Documents the search verbose result payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchVerboseResult extends SearchResultBase {\n filters: Record<string, unknown>;\n projection: {\n mode: SearchProjectionMode;\n fields: string[] | null;\n };\n now: string;\n}\n\n/**\n * Restricts search result values accepted by command, SDK, and storage contracts.\n */\nexport type SearchResult = SearchCompactResult | SearchVerboseResult;\n\nfunction isNonEmptyRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && Object.keys(value).length > 0;\n}\n\nfunction buildCompactSearchFilterSummary(params: {\n mode: SearchMode;\n matchMode: SearchMatchMode;\n options: SearchOptions;\n includeLinked: boolean;\n titleExact: boolean;\n phraseExact: boolean;\n scoreThreshold: number;\n hybridSemanticWeight: number;\n runtimeFieldFilters?: Record<string, unknown>;\n}): Record<string, unknown> {\n const {\n mode,\n matchMode,\n options,\n includeLinked,\n titleExact,\n phraseExact,\n scoreThreshold,\n hybridSemanticWeight,\n runtimeFieldFilters,\n } = params;\n const filters: Record<string, unknown> = {};\n applyFilterValueEcho(filters, options, COMPACT_SEARCH_VALUE_FILTER_ECHO_ENTRIES);\n Object.assign(filters, buildGovernanceMissingFilterEcho(options as Record<string, unknown>));\n Object.assign(filters, buildContentFilterEcho(options as Record<string, unknown>));\n if (matchMode !== \"or\") {\n filters.match_mode = matchMode;\n }\n if (includeLinked) {\n filters.include_linked = true;\n }\n if (titleExact) {\n filters.title_exact = true;\n }\n if (phraseExact) {\n filters.phrase_exact = true;\n }\n if (scoreThreshold > 0) {\n filters.score_threshold = scoreThreshold;\n }\n if (mode === \"hybrid\" && options.semanticWeight !== undefined) {\n filters.hybrid_semantic_weight = hybridSemanticWeight;\n }\n if (options.limit !== undefined) {\n filters.limit = options.limit;\n }\n if (isNonEmptyRecord(runtimeFieldFilters)) {\n filters.runtime_filters = runtimeFieldFilters;\n }\n return filters;\n}\n\n// Shared verbose (non-compact) filters echo. Keeps the count-only, empty-result,\n// and primary return paths emitting an identical filter shape (GH-181/pm-13nx).\nfunction buildVerboseSearchFilters(params: {\n effectiveMode: SearchMode;\n matchMode: SearchMatchMode;\n options: SearchOptions;\n includeLinked: boolean;\n titleExact: boolean;\n phraseExact: boolean;\n scoreThreshold: number;\n hybridSemanticWeight: number;\n queryExpansion: QueryExpansionConfig;\n rerank: RerankConfig;\n runtimeFieldFilters: Record<string, unknown>;\n}): Record<string, unknown> {\n const {\n effectiveMode,\n matchMode,\n options,\n includeLinked,\n titleExact,\n phraseExact,\n scoreThreshold,\n hybridSemanticWeight,\n queryExpansion,\n rerank,\n runtimeFieldFilters,\n } = params;\n return {\n mode: effectiveMode,\n match_mode: matchMode,\n status: isStatusAllFilterInput(options.status) ? \"all\" : valueOrNull(options.status),\n type: valueOrNull(options.type),\n tag: valueOrNull(options.tag),\n priority: valueOrNull(options.priority),\n deadline_before: valueOrNull(options.deadlineBefore),\n deadline_after: valueOrNull(options.deadlineAfter),\n updated_after: valueOrNull(options.updatedAfter),\n updated_before: valueOrNull(options.updatedBefore),\n created_after: valueOrNull(options.createdAfter),\n created_before: valueOrNull(options.createdBefore),\n assignee: valueOrNull(options.assignee),\n sprint: valueOrNull(options.sprint),\n release: valueOrNull(options.release),\n parent: valueOrNull(options.parent),\n ...buildGovernanceMissingFilterEcho(options as Record<string, unknown>),\n ...buildContentFilterEcho(options as Record<string, unknown>),\n include_linked: includeLinked,\n title_exact: titleExact,\n phrase_exact: phraseExact,\n score_threshold: scoreThreshold,\n hybrid_semantic_weight: effectiveMode === \"hybrid\" ? hybridSemanticWeight : null,\n query_expansion_enabled: queryExpansion.enabled,\n query_expansion_provider: queryExpansion.provider,\n rerank_enabled: rerank.enabled,\n rerank_model: rerank.model,\n rerank_top_k: rerank.top_k,\n limit: valueOrNull(options.limit),\n runtime_filters: runtimeFieldFilters,\n };\n}\n\nfunction valueOrNull(value: unknown): unknown {\n return value ?? null;\n}\n\ninterface ExtensionSearchProviderContext {\n query: string;\n mode: SearchMode;\n tokens: string[];\n options: SearchOptions;\n settings: PmSettings;\n documents: ItemDocument[];\n}\n\ninterface ExtensionSearchProviderHit {\n id: string;\n score: number;\n matched_fields?: string[];\n}\n\ntype ExtensionSearchProviderQuery = (\n context: ExtensionSearchProviderContext,\n) => Promise<ExtensionSearchProviderHit[] | { hits?: ExtensionSearchProviderHit[] }> | ExtensionSearchProviderHit[] | { hits?: ExtensionSearchProviderHit[] };\n\ninterface ExtensionSearchProviderQueryExpansionContext {\n query: string;\n mode: Exclude<SearchMode, \"keyword\">;\n settings: PmSettings;\n}\n\ntype ExtensionSearchProviderQueryExpansion = (\n context: ExtensionSearchProviderQueryExpansionContext,\n) => Promise<string[] | { queries?: string[] }> | string[] | { queries?: string[] };\n\ninterface ExtensionSearchProviderRerankCandidate {\n id: string;\n text: string;\n score: number;\n}\n\ninterface ExtensionSearchProviderRerankContext {\n query: string;\n mode: \"hybrid\";\n model: string;\n top_k: number;\n settings: PmSettings;\n candidates: ExtensionSearchProviderRerankCandidate[];\n}\n\ntype ExtensionSearchProviderRerank = (\n context: ExtensionSearchProviderRerankContext,\n) => Promise<Array<{ id?: unknown; score?: unknown }> | { hits?: Array<{ id?: unknown; score?: unknown }> }>\n | Array<{ id?: unknown; score?: unknown }>\n | { hits?: Array<{ id?: unknown; score?: unknown }> };\n\ntype ExtensionVectorQuery = (\n context: {\n vector: number[];\n limit: number;\n settings: PmSettings;\n },\n) => Promise<VectorQueryHit[]> | VectorQueryHit[];\n\ntype ExtensionVectorUpsert = (context: {\n points: Array<{\n id: string;\n vector: number[];\n payload: Record<string, unknown>;\n }>;\n settings: PmSettings;\n}) => Promise<void> | void;\n\ntype ExtensionVectorAdapter = {\n adapterName: string;\n query?: ExtensionVectorQuery;\n upsert?: ExtensionVectorUpsert;\n};\n\n\n\ninterface SearchModeContext {\n hasProvider: boolean;\n hasVectorStore: boolean;\n}\n\ntype ImplicitSemanticFallbackReason = \"timeout\" | \"connection\" | \"error\";\n\n/**\n * Aggregate the `code` strings found along an error's `cause` chain.\n *\n * undici (Node's fetch) collapses connection errors to the generic message\n * \"fetch failed\" and stashes the real syscall code (e.g. `ECONNREFUSED`) on\n * `error.cause.code`. Walking the chain (bounded depth) lets the fallback\n * classifier label a downed/unreachable Ollama backend as \"connection\" rather\n * than the catch-all \"error\".\n */\nexport function collectErrorCauseCodes(error: unknown): string {\n const codes: string[] = [];\n let current: unknown = error;\n for (let depth = 0; depth < 5 && current && typeof current === \"object\"; depth += 1) {\n const code = (current as { code?: unknown }).code;\n if (typeof code === \"string\") {\n codes.push(code.toLowerCase());\n }\n current = (current as { cause?: unknown }).cause;\n }\n return codes.join(\" \");\n}\n\n/**\n * Classify why an implicit/explicit semantic search degraded to keyword mode,\n * inspecting both the error message and the {@link collectErrorCauseCodes} chain\n * so undici's generic \"fetch failed\" is recognised as a connection failure.\n */\nexport function classifyImplicitSemanticFallbackReason(error: unknown): ImplicitSemanticFallbackReason {\n const message = (error instanceof Error ? error.message : String(error)).toLowerCase();\n const causeCodes = collectErrorCauseCodes(error);\n const haystack = `${message} ${causeCodes}`;\n if (haystack.includes(\"timed out\") || haystack.includes(\"timeout\") || haystack.includes(\"etimedout\")) {\n return \"timeout\";\n }\n if (\n haystack.includes(\"econnrefused\") ||\n haystack.includes(\"connection refused\") ||\n haystack.includes(\"connect \") ||\n haystack.includes(\"enotfound\") ||\n haystack.includes(\"eai_again\") ||\n haystack.includes(\"econnreset\") ||\n haystack.includes(\"fetch failed\")\n ) {\n return \"connection\";\n }\n return \"error\";\n}\n\n// Explicit --semantic/--hybrid searches must never hard-fail an agent when the\n// embedding/vector backend is unreachable or unconfigured: degrade to keyword\n// search and surface a machine-readable warning instead of an unknown_error.\nfunction buildExplicitSemanticFallbackWarning(requestedMode: SearchMode, error: unknown): string {\n const reason = classifyImplicitSemanticFallbackReason(error);\n return `search_${requestedMode}_fallback:${reason}:using_keyword_mode`;\n}\n\n/**\n * Compare the vectorization-status ledger against the filtered corpus and, when\n * the vector index is behind, emit a one-line stderr warning plus a structured\n * `vector_index_stale:N` entry in the JSON warnings array. Best-effort: ledger\n * read failures fall through silently — the existing semantic/hybrid fallback\n * paths cover backend errors.\n */\nasync function maybeEmitVectorIndexStaleWarning(\n pmRoot: string,\n filteredDocuments: ItemDocument[],\n warnings: string[],\n): Promise<void> {\n try {\n const ledger = await readVectorizationStatusLedger(pmRoot);\n if (ledger.warnings.length > 0) {\n warnings.push(...ledger.warnings);\n }\n const staleIds = collectStaleVectorizationIds(\n filteredDocuments.map((document) => ({\n id: document.metadata.id,\n updated_at: document.metadata.updated_at,\n })),\n ledger.entries,\n );\n if (staleIds.length === 0) {\n return;\n }\n warnings.push(`vector_index_stale:${staleIds.length}`);\n /* c8 ignore start -- singular/plural warning text branches are cosmetic and validated in integration UX tests */\n process.stderr.write(\n `[pm] warning: ${staleIds.length} item${staleIds.length === 1 ? \" is\" : \"s are\"} new or modified since the last reindex and ${staleIds.length === 1 ? \"is\" : \"are\"} NOT in the semantic index yet — they will be missing from semantic/hybrid results until you run 'pm reindex --mode hybrid'. (Write-time embedding is governed by search.mutation_refresh_policy; staleness means the embed was skipped, failed, or the backend was unreachable.)\\n`,\n );\n /* c8 ignore stop */\n } catch {\n // Best-effort: missing/unreadable ledger is not a query-blocking concern.\n }\n}\n\nfunction parseMode(raw: string | undefined, _context: SearchModeContext): SearchMode {\n if (raw === undefined) {\n return \"keyword\";\n }\n const normalized = raw.trim().toLowerCase();\n if (normalized !== \"keyword\" && normalized !== \"semantic\" && normalized !== \"hybrid\") {\n throw new PmCliError(\"Search mode must be one of keyword|semantic|hybrid\", EXIT_CODE.USAGE);\n }\n return normalized;\n}\n\nfunction parseIncludeLinked(raw: boolean | undefined): boolean {\n return raw === true;\n}\n\nfunction parseTitleExact(raw: boolean | undefined): boolean {\n return raw === true;\n}\n\nfunction parsePhraseExact(raw: boolean | undefined): boolean {\n return raw === true;\n}\n\nfunction parseSemanticWeightOverride(raw: unknown): number | undefined {\n return coerceNumberInRange(raw, 0, 1) ?? undefined;\n}\n\nfunction parseMatchMode(raw: string | undefined): SearchMatchMode {\n if (raw === undefined) {\n return \"or\";\n }\n const normalized = raw.trim().toLowerCase();\n if (normalized !== \"and\" && normalized !== \"or\" && normalized !== \"exact\") {\n throw new PmCliError(\"Search --match-mode must be one of and|or|exact\", EXIT_CODE.USAGE);\n }\n return normalized;\n}\n\n// Per-query --min-score overrides the persistent search.score_threshold for this\n// query only. Accepts a finite number >= 0; anything else is a usage error.\nfunction parseMinScoreOverride(raw: unknown): number | undefined {\n if (raw === undefined || raw === null || raw === \"\") {\n return undefined;\n }\n /* c8 ignore start -- numeric-vs-string coercion branch is exercised via integration CLI parsing */\n const parsed = typeof raw === \"number\" ? raw : Number(String(raw).trim());\n /* c8 ignore stop */\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new PmCliError(\"Search --min-score must be a finite number >= 0\", EXIT_CODE.USAGE);\n }\n return parsed;\n}\n\n// updated/created date-window filters share the deadline ISO+relative resolver\n// so `pm search` matches `pm list` semantics exactly: pass an ISO timestamp or a\n// SIGNED relative offset (\"-2h\"/\"-7d\" reach into the past, \"+1d\" the future;\n// units h/d/w/m, m = months — there is no minutes unit).\nfunction parseTimestampWindow(raw: unknown, fieldLabel: string): string | undefined {\n if (raw == null) return undefined;\n const value = String(raw).trim();\n if (value.length === 0) return undefined;\n return resolveIsoOrRelative(value, new Date(), fieldLabel);\n}\n\nfunction normalizeSearchPhrase(value: string): string {\n return value\n .toLowerCase()\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction parseDeadline(raw: string | undefined, fieldLabel: string): string | undefined {\n if (raw === undefined) return undefined;\n return resolveIsoOrRelative(raw, new Date(), fieldLabel);\n}\n\nfunction parseFieldSelectors(raw: string | undefined): string[] | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const selectors = raw\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n if (selectors.length === 0) {\n throw new PmCliError(\"Search --fields requires a comma-separated list of field names\", EXIT_CODE.USAGE);\n }\n return [...new Set(selectors)];\n}\n\nfunction parseProjectionConfig(options: SearchOptions): SearchProjectionConfig {\n const compactRequested = options.compact === true;\n const fullRequested = options.full === true;\n const fieldSelectors = parseFieldSelectors(options.fields);\n const enabledModes = Number(compactRequested) + Number(fullRequested) + Number(fieldSelectors !== undefined);\n if (enabledModes > 1) {\n throw new PmCliError(\n \"Search projection options are mutually exclusive. Use one of --compact, --full, or --fields.\",\n EXIT_CODE.USAGE,\n );\n }\n if (compactRequested) {\n return {\n mode: \"compact\",\n fields: [...DEFAULT_COMPACT_SEARCH_FIELDS],\n };\n }\n if (fullRequested) {\n return {\n mode: \"full\",\n fields: [],\n };\n }\n if (fieldSelectors) {\n return {\n mode: \"fields\",\n fields: fieldSelectors,\n };\n }\n return {\n mode: \"full\",\n fields: [],\n };\n}\n\nexport const _testOnlySearchCommand = {\n applyFilters,\n applyExactQueryFilters,\n applyInlineQueryFilters,\n buildHitHighlights,\n buildVerboseSearchFilters,\n buildExplicitSemanticFallbackWarning,\n buildCompactSearchFilterSummary,\n buildHybridLexicalScore,\n buildRerankCorpus,\n buildSemanticHits,\n classifyImplicitSemanticFallbackReason,\n collectErrorCauseCodes,\n collectExactPhraseFields,\n collectLinkedPaths,\n combineHybridHits,\n computeBuiltInBm25Hits,\n computeSemanticOrHybridHits,\n resolveBuiltInBm25Mode,\n countOccurrences,\n dependencyEntries,\n documentContainsExactPhrase,\n emptySearchResult,\n highlightFieldSnippet,\n loadDocuments,\n markTokenRuns,\n parseInlineQueryFilters,\n maybeEmitVectorIndexStaleWarning,\n loadLinkedCorpus,\n mergeVectorHitsById,\n normalizeExtensionProviderHits,\n normalizeScoreMap,\n parseProjectionConfig,\n parseTimestampWindow,\n parseTokens,\n readSearchFieldValue,\n requireSemanticDependencies,\n resolveExtensionSearchProvider,\n resolveExtensionSearchProviderByName,\n resolveExtensionVectorAdapter,\n resolveLinkedCorpusRoots,\n scoreDocument,\n sortHits,\n stringArray,\n textEntries,\n validateSearchProjectionFields,\n};\n\n/* c8 ignore start -- projection/runtime-field validation edge permutations are covered by integration query-contract tests */\nfunction validateSearchProjectionFields(projection: SearchProjectionConfig, runtimeFieldRegistry: RuntimeFieldRegistry): void {\n if (projection.mode !== \"fields\") {\n return;\n }\n const runtimeKeys = new Set(runtimeFieldRegistry.definitions.flatMap((field) => [field.key, field.metadata_key]));\n const unknown = projection.fields.filter((field) => {\n const normalized = field.trim();\n const itemKey = normalized.startsWith(\"item.\") ? normalized.slice(\"item.\".length) : normalized;\n return !SEARCH_HIT_FIELD_KEYS.has(normalized) && !SEARCH_ITEM_FIELD_KEYS.has(itemKey) && !runtimeKeys.has(itemKey);\n });\n if (unknown.length > 0) {\n throw new PmCliError(`Unknown search --fields value(s): ${unknown.join(\", \")}`, EXIT_CODE.USAGE, {\n examples: [\n \"pm search <query> --fields id,title,status,score\",\n \"pm search <query> --fields id,title,item.description,matched_fields\",\n ],\n nextSteps: [\"Use item.<field> for explicit item metadata fields, or run pm search --help for projection examples.\"],\n });\n }\n}\n/* c8 ignore stop */\n\nfunction parseTokens(query: string): string[] {\n const normalized = normalizeSearchPhrase(query);\n if (!normalized) {\n throw new PmCliError(\"Search query must not be empty\", EXIT_CODE.USAGE);\n }\n return normalized.split(/\\s+/).filter(Boolean);\n}\n\n/**\n * Result of extracting inline `field:value` tokens from a raw search query.\n */\ninterface InlineQueryParse {\n /** The query with all recognized inline filter tokens removed. */\n residualQuery: string;\n /** Recognized inline filters keyed by field name; first occurrence per field wins. */\n inlineFilters: Partial<Record<InlineQueryFilterField, string>>;\n}\n\n/**\n * Split a raw search query into its residual keyword text and any inline\n * `field:value` filter tokens (GH-157). Recognized fields are\n * {@link INLINE_QUERY_FILTER_FIELDS}; the value runs to the end of the token so\n * colon-bearing values like `tag:area:search` parse as `{ tag: \"area:search\" }`.\n * Only the first occurrence of each field is captured — later duplicates are left\n * in the residual query so they are never silently dropped. Tokens whose prefix\n * is not a recognized field (`foo:bar`) stay in the residual query verbatim.\n */\nfunction parseInlineQueryFilters(query: string): InlineQueryParse {\n const inlineFilters: Partial<Record<InlineQueryFilterField, string>> = {};\n const residualTokens: string[] = [];\n for (const token of query.split(/\\s+/).filter((entry) => entry.length > 0)) {\n const separatorIndex = token.indexOf(\":\");\n const field = separatorIndex > 0 ? token.slice(0, separatorIndex).toLowerCase() : \"\";\n const value = separatorIndex > 0 ? token.slice(separatorIndex + 1) : \"\";\n const matchedField = (INLINE_QUERY_FILTER_FIELDS as ReadonlyArray<string>).includes(field)\n ? (field as InlineQueryFilterField)\n : undefined;\n if (matchedField && value.length > 0 && inlineFilters[matchedField] === undefined) {\n inlineFilters[matchedField] = value;\n continue;\n }\n residualTokens.push(token);\n }\n return {\n residualQuery: residualTokens.join(\" \"),\n inlineFilters,\n };\n}\n\n/**\n * Merge inline `field:value` filters into a search options object (GH-157).\n * Explicit `--field` flags always win: an inline token is applied only when the\n * corresponding option is not already set, and a conflicting inline token is\n * recorded as a `search_inline_filter_ignored:<field>:flag_takes_precedence`\n * warning so the override is observable rather than silent. Returns a fresh\n * options object — the caller's input is never mutated.\n */\nfunction applyInlineQueryFilters(\n options: SearchOptions,\n inlineFilters: Partial<Record<InlineQueryFilterField, string>>,\n warnings: string[],\n): SearchOptions {\n const merged: SearchOptions = { ...options };\n for (const field of INLINE_QUERY_FILTER_FIELDS) {\n const inlineValue = inlineFilters[field];\n if (inlineValue === undefined) {\n continue;\n }\n if (toNonEmptyStringOrUndefined(merged[field]) !== undefined) {\n warnings.push(`search_inline_filter_ignored:${field}:flag_takes_precedence`);\n continue;\n }\n merged[field] = inlineValue;\n }\n return merged;\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === \"string\") : [];\n}\n\nfunction textEntries(value: unknown): Array<{ text: string }> {\n return Array.isArray(value)\n ? value.filter((entry): entry is { text: string } =>\n typeof entry === \"object\" && entry !== null && typeof (entry as { text?: unknown }).text === \"string\",\n )\n : [];\n}\n\nfunction dependencyEntries(value: unknown): Array<{ id: string; kind: string }> {\n return Array.isArray(value)\n ? value.filter((entry): entry is { id: string; kind: string } =>\n typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as { id?: unknown }).id === \"string\" &&\n typeof (entry as { kind?: unknown }).kind === \"string\",\n )\n : [];\n}\n\nfunction collectExactPhraseFields(document: ItemDocument): string[] {\n const item = document.metadata;\n return [\n item.title,\n item.description,\n item.status,\n stringArray(item.tags).join(\" \"),\n document.body,\n textEntries(item.comments).map((entry) => entry.text).join(\" \"),\n textEntries(item.notes).map((entry) => entry.text).join(\" \"),\n textEntries(item.learnings).map((entry) => entry.text).join(\" \"),\n buildReminderCorpus(item).join(\" \"),\n buildEventCorpus(item).join(\" \"),\n dependencyEntries(item.dependencies).map((entry) => `${entry.id} ${entry.kind}`).join(\" \"),\n buildPlanFlatCorpus(item),\n ];\n}\n\nfunction documentContainsExactPhrase(document: ItemDocument, normalizedQuery: string): boolean {\n return collectExactPhraseFields(document).some((fieldValue) =>\n normalizeSearchPhrase(fieldValue).includes(normalizedQuery),\n );\n}\n\nfunction applyExactQueryFilters(\n items: ItemDocument[],\n normalizedQuery: string,\n options: { titleExact: boolean; phraseExact: boolean },\n): ItemDocument[] {\n if (!options.titleExact && !options.phraseExact) {\n return items;\n }\n return items.filter((document) => {\n if (options.titleExact && normalizeSearchPhrase(document.metadata.title) !== normalizedQuery) {\n return false;\n }\n if (options.phraseExact && !documentContainsExactPhrase(document, normalizedQuery)) {\n return false;\n }\n return true;\n });\n}\n\ntype SearchMissingMetadataFilters = ReturnType<typeof resolveMissingMetadataFilters>;\ntype SearchContentFieldFilters = ReturnType<typeof resolveContentFieldFilters>;\n\ninterface SearchMetadataFilterSet {\n typeFilter: ItemType | undefined;\n tagFilter: string | undefined;\n priorityFilter: number | undefined;\n deadlineBefore: string | undefined;\n deadlineAfter: string | undefined;\n updatedAfter: string | undefined;\n updatedBefore: string | undefined;\n createdAfter: string | undefined;\n createdBefore: string | undefined;\n assigneeFilter: string | undefined;\n sprintFilter: string | undefined;\n releaseFilter: string | undefined;\n parentFilter: string | undefined;\n statusSet: Set<ItemStatus> | undefined;\n missingMetadataFilters: SearchMissingMetadataFilters;\n missingMetadataActive: boolean;\n contentFieldFilters: SearchContentFieldFilters;\n contentFiltersActive: boolean;\n}\n\nfunction assertSearchAssigneeFilter(assigneeFilter: string | undefined): void {\n // Match pm list: --assignee no longer accepts none/null (unassigned filtering\n // belongs to a dedicated flag there; pm search has no presence flag so reject\n // the sentinel values explicitly rather than silently matching a literal).\n if (assigneeFilter && (assigneeFilter.toLowerCase() === \"none\" || assigneeFilter.toLowerCase() === \"null\")) {\n throw new PmCliError('--assignee no longer accepts \"none\" or \"null\".', EXIT_CODE.USAGE);\n }\n}\n\nfunction resolveSearchMetadataFilterSet(\n options: SearchOptions,\n typeRegistry: ItemTypeRegistry,\n statusFilter: ItemStatus[] | undefined,\n): SearchMetadataFilterSet {\n const assigneeFilter = options.assignee?.trim();\n assertSearchAssigneeFilter(assigneeFilter);\n const missingMetadataFilters = resolveMissingMetadataFilters(options);\n const contentFieldFilters = resolveContentFieldFilters(options as Record<string, unknown>);\n return {\n typeFilter: parseType(options.type, typeRegistry),\n tagFilter: options.tag?.trim().toLowerCase(),\n priorityFilter: parsePriority(options.priority),\n deadlineBefore: parseDeadline(options.deadlineBefore, \"deadline-before\"),\n deadlineAfter: parseDeadline(options.deadlineAfter, \"deadline-after\"),\n updatedAfter: parseTimestampWindow(options.updatedAfter, \"updated-after\"),\n updatedBefore: parseTimestampWindow(options.updatedBefore, \"updated-before\"),\n createdAfter: parseTimestampWindow(options.createdAfter, \"created-after\"),\n createdBefore: parseTimestampWindow(options.createdBefore, \"created-before\"),\n assigneeFilter,\n sprintFilter: options.sprint?.trim(),\n releaseFilter: options.release?.trim(),\n parentFilter: options.parent?.trim(),\n statusSet: statusFilter && statusFilter.length > 0 ? new Set<ItemStatus>(statusFilter) : undefined,\n missingMetadataFilters,\n missingMetadataActive: hasMissingMetadataFilter(missingMetadataFilters),\n contentFieldFilters,\n contentFiltersActive: hasContentFieldFilter(contentFieldFilters),\n };\n}\n\nfunction matchesScalarSearchFilters(item: ItemFrontMatter, filters: SearchMetadataFilterSet): boolean {\n return (\n matchesIdentitySearchFilters(item, filters) &&\n matchesTimestampSearchFilters(item, filters) &&\n matchesOwnerSearchFilters(item, filters)\n );\n}\n\nfunction matchesIdentitySearchFilters(item: ItemFrontMatter, filters: SearchMetadataFilterSet): boolean {\n if (filters.statusSet && !filters.statusSet.has(item.status)) return false;\n if (filters.typeFilter && item.type !== filters.typeFilter) return false;\n if (filters.tagFilter && !stringArray(item.tags).includes(filters.tagFilter)) return false;\n if (filters.priorityFilter !== undefined && item.priority !== filters.priorityFilter) return false;\n return true;\n}\n\nfunction matchesTimestampSearchFilters(item: ItemFrontMatter, filters: SearchMetadataFilterSet): boolean {\n if (filters.deadlineBefore && (!item.deadline || compareTimestampStrings(item.deadline, filters.deadlineBefore) > 0)) return false;\n if (filters.deadlineAfter && (!item.deadline || compareTimestampStrings(item.deadline, filters.deadlineAfter) < 0)) return false;\n if (filters.updatedAfter && compareTimestampStrings(item.updated_at, filters.updatedAfter) < 0) return false;\n if (filters.updatedBefore && compareTimestampStrings(item.updated_at, filters.updatedBefore) > 0) return false;\n if (filters.createdAfter && compareTimestampStrings(item.created_at, filters.createdAfter) < 0) return false;\n if (filters.createdBefore && compareTimestampStrings(item.created_at, filters.createdBefore) > 0) return false;\n return true;\n}\n\nfunction matchesOwnerSearchFilters(item: ItemFrontMatter, filters: SearchMetadataFilterSet): boolean {\n if (filters.assigneeFilter !== undefined && item.assignee !== filters.assigneeFilter) return false;\n if (filters.sprintFilter !== undefined && item.sprint !== filters.sprintFilter) return false;\n /* c8 ignore start -- release/parent metadata filter combinations are covered by integration search fixtures */\n if (filters.releaseFilter !== undefined && item.release !== filters.releaseFilter) return false;\n if (filters.parentFilter !== undefined && item.parent !== filters.parentFilter) return false;\n /* c8 ignore stop */\n return true;\n}\n\nfunction matchesSearchMetadataFilters(\n document: ItemDocument,\n filters: SearchMetadataFilterSet,\n runtimeFieldFilters: Record<string, unknown>,\n lifecycleClassifier: LifecycleClassifier,\n): boolean {\n const item = document.metadata;\n if (!matchesScalarSearchFilters(item, filters)) {\n return false;\n }\n if (!matchesRuntimeFilters(item as Record<string, unknown>, runtimeFieldFilters)) {\n return false;\n }\n if (filters.missingMetadataActive && !itemMatchesMissingMetadata(item, filters.missingMetadataFilters, lifecycleClassifier)) {\n return false;\n }\n if (filters.contentFiltersActive && !itemMatchesContentFilters(item, filters.contentFieldFilters)) {\n return false;\n }\n return true;\n}\n\nfunction applyFilters(\n items: ItemDocument[],\n options: SearchOptions,\n typeRegistry: ItemTypeRegistry,\n runtimeFieldFilters: Record<string, unknown>,\n statusFilter: ItemStatus[] | undefined,\n lifecycleClassifier: LifecycleClassifier,\n): ItemDocument[] {\n const filters = resolveSearchMetadataFilterSet(options, typeRegistry, statusFilter);\n return items.filter((document) =>\n matchesSearchMetadataFilters(document, filters, runtimeFieldFilters, lifecycleClassifier),\n );\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n let count = 0;\n let index = 0;\n while (true) {\n const foundAt = haystack.indexOf(needle, index);\n if (foundAt < 0) {\n return count;\n }\n count += 1;\n index = foundAt + needle.length;\n }\n}\n\nfunction tokenizeForExactTokenMatch(value: string): string[] {\n return tokenizeAlphaNumeric(value);\n}\n\nfunction collectLinkedPaths(item: ItemFrontMatter): Array<{ scope: \"project\" | \"global\"; path: string }> {\n const fromFiles = (item.files ?? []).map((entry) => ({\n scope: entry.scope,\n path: entry.path.trim(),\n }));\n const fromDocs = (item.docs ?? []).map((entry) => ({\n scope: entry.scope,\n path: entry.path.trim(),\n }));\n const fromTests = (item.tests ?? [])\n .filter((entry): entry is typeof entry & { path: string } => typeof entry.path === \"string\" && entry.path.trim().length > 0)\n .map((entry) => ({\n scope: entry.scope,\n path: entry.path.trim(),\n }));\n const sorted = [...fromFiles, ...fromDocs, ...fromTests]\n .filter((entry) => entry.path.length > 0)\n .sort((a, b) => a.scope.localeCompare(b.scope) || a.path.localeCompare(b.path));\n const deduped = new Map<string, { scope: \"project\" | \"global\"; path: string }>();\n for (const entry of sorted) {\n deduped.set(`${entry.scope}:${entry.path}`, entry);\n }\n return [...deduped.values()];\n}\n\ninterface ContainmentRoot {\n resolved: string;\n realpath: string;\n}\n\ninterface LinkedCorpusRoots {\n projectContainmentRoot: ContainmentRoot | null;\n globalContainmentRoot: ContainmentRoot | null;\n}\n\nasync function resolveContainmentRoot(root: string): Promise<ContainmentRoot | null> {\n const resolved = path.resolve(root);\n try {\n const realpathRoot = await fs.realpath(resolved);\n return {\n resolved,\n realpath: realpathRoot,\n };\n } catch {\n return null;\n }\n}\n\nasync function resolveLinkedCorpusRoots(projectRoot: string, globalRoot: string): Promise<LinkedCorpusRoots> {\n const [projectContainmentRoot, globalContainmentRoot] = await Promise.all([\n resolveContainmentRoot(projectRoot),\n resolveContainmentRoot(globalRoot),\n ]);\n return {\n projectContainmentRoot,\n globalContainmentRoot,\n };\n}\n\nasync function loadLinkedCorpus(\n document: ItemDocument,\n roots: LinkedCorpusRoots,\n): Promise<string> {\n const linkedPaths = collectLinkedPaths(document.metadata);\n const chunks: string[] = [];\n for (const linkedPath of linkedPaths) {\n const containmentRoot = linkedPath.scope === \"global\" ? roots.globalContainmentRoot : roots.projectContainmentRoot;\n if (!containmentRoot) {\n continue;\n }\n const resolved = path.resolve(containmentRoot.resolved, linkedPath.path);\n if (!isPathWithinDirectory(containmentRoot.resolved, resolved)) {\n continue;\n }\n let linkedRealpath: string;\n try {\n linkedRealpath = await fs.realpath(resolved);\n } catch {\n continue;\n }\n if (!isPathWithinDirectory(containmentRoot.realpath, linkedRealpath)) {\n continue;\n }\n try {\n await runActiveOnReadHooks({\n path: resolved,\n scope: linkedPath.scope,\n });\n chunks.push(await fs.readFile(resolved, \"utf8\"));\n } catch {\n // Best-effort linked-content indexing: unreadable paths are ignored.\n }\n }\n return chunks.join(\"\\n\");\n}\n\n/**\n * Documents the search tuning payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchTuning {\n title_exact_bonus: number;\n title_weight: number;\n description_weight: number;\n tags_weight: number;\n status_weight: number;\n body_weight: number;\n comments_weight: number;\n notes_weight: number;\n learnings_weight: number;\n reminders_weight: number;\n events_weight: number;\n dependencies_weight: number;\n linked_content_weight: number;\n}\n\n/**\n * Canonical definition of the document-derived searchable fields shared by the\n * lexical scorer ({@link scoreDocument}) and the matched-text highlighter\n * ({@link buildHitHighlights}). Keeping a single source of field name → text\n * extractor → tuning weight guarantees the highlighter can only ever produce\n * snippets for fields the scorer actually inspected. The `linked_content` field\n * is appended separately by the scorer because its text is supplied per-query\n * rather than derived from the document.\n */\nconst SEARCHABLE_FIELD_BUILDERS: ReadonlyArray<{\n name: string;\n weightKey: keyof SearchTuning;\n value: (document: ItemDocument) => string;\n}> = [\n { name: \"title\", weightKey: \"title_weight\", value: (document) => document.metadata.title },\n { name: \"description\", weightKey: \"description_weight\", value: (document) => document.metadata.description },\n { name: \"tags\", weightKey: \"tags_weight\", value: (document) => stringArray(document.metadata.tags).join(\" \") },\n {\n name: \"status\",\n weightKey: \"status_weight\",\n value: (document) => (typeof document.metadata.status === \"string\" ? document.metadata.status : \"\"),\n },\n { name: \"body\", weightKey: \"body_weight\", value: (document) => document.body },\n {\n name: \"comments\",\n weightKey: \"comments_weight\",\n value: (document) => textEntries(document.metadata.comments).map((entry) => entry.text).join(\" \"),\n },\n {\n name: \"notes\",\n weightKey: \"notes_weight\",\n value: (document) => textEntries(document.metadata.notes).map((entry) => entry.text).join(\" \"),\n },\n {\n name: \"learnings\",\n weightKey: \"learnings_weight\",\n value: (document) => textEntries(document.metadata.learnings).map((entry) => entry.text).join(\" \"),\n },\n { name: \"reminders\", weightKey: \"reminders_weight\", value: (document) => buildReminderCorpus(document.metadata).join(\" \") },\n { name: \"events\", weightKey: \"events_weight\", value: (document) => buildEventCorpus(document.metadata).join(\" \") },\n {\n name: \"dependencies\",\n weightKey: \"dependencies_weight\",\n value: (document) => dependencyEntries(document.metadata.dependencies).map((entry) => `${entry.id} ${entry.kind}`).join(\" \"),\n },\n { name: \"plan\", weightKey: \"body_weight\", value: (document) => buildPlanFlatCorpus(document.metadata) },\n];\n\n// Name → builder index so the highlighter can resolve a matched field to its\n// text extractor in O(1) and evaluate ONLY the matched fields' values, instead\n// of materializing all twelve (several of which join/build corpora) per hit.\nconst SEARCHABLE_FIELD_BUILDER_BY_NAME = new Map(SEARCHABLE_FIELD_BUILDERS.map((builder) => [builder.name, builder]));\n\nfunction escapeRegExpLiteral(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Wrap every case-insensitive occurrence of any query token in `text` with the\n * {@link HIGHLIGHT_OPEN}/{@link HIGHLIGHT_CLOSE} markers. Token boundaries follow\n * the same substring semantics as the lexical scorer (a token highlights inside\n * longer words, matching how it scored), and overlapping matches are coalesced\n * by the single combined alternation so markers never nest.\n */\nfunction markTokenRuns(text: string, tokens: string[]): string {\n // Sort by length descending before building the alternation so a longer token\n // wins over a shorter token that is its prefix (regex alternation is greedy\n // left-to-right, so `auth|authority` would mark «auth»ority instead of\n // «authority»). `.filter` already returns a fresh array, so the in-place sort\n // never mutates the caller's token list.\n const escaped = tokens\n .filter((token) => token.length > 0)\n .sort((left, right) => right.length - left.length)\n .map(escapeRegExpLiteral);\n if (escaped.length === 0) {\n return text;\n }\n const pattern = new RegExp(escaped.join(\"|\"), \"gi\");\n return text.replace(pattern, (match) => `${HIGHLIGHT_OPEN}${match}${HIGHLIGHT_CLOSE}`);\n}\n\n/**\n * Build a single highlighted snippet for one field value (GH-157), or null when\n * no token matches. The snippet is a window of {@link HIGHLIGHT_SNIPPET_RADIUS}\n * characters on each side of the first match with the matching token runs\n * wrapped in markers, prefixed/suffixed with an ellipsis when the field text was\n * trimmed. Returning null lets the caller skip fields with no concrete textual\n * match (e.g. a field flagged purely by the phrase-coverage bonus).\n */\nfunction highlightFieldSnippet(text: string, tokens: string[]): string | null {\n if (text.length === 0) {\n return null;\n }\n const lowerText = text.toLowerCase();\n let firstMatchIndex = -1;\n for (const token of tokens) {\n if (token.length === 0) {\n continue;\n }\n const index = lowerText.indexOf(token);\n if (index >= 0 && (firstMatchIndex < 0 || index < firstMatchIndex)) {\n firstMatchIndex = index;\n }\n }\n if (firstMatchIndex < 0) {\n return null;\n }\n const windowStart = Math.max(0, firstMatchIndex - HIGHLIGHT_SNIPPET_RADIUS);\n const windowEnd = Math.min(text.length, firstMatchIndex + HIGHLIGHT_SNIPPET_RADIUS);\n const marked = markTokenRuns(text.slice(windowStart, windowEnd), tokens);\n const prefix = windowStart > 0 ? \"…\" : \"\";\n const suffix = windowEnd < text.length ? \"…\" : \"\";\n return `${prefix}${marked}${suffix}`;\n}\n\n/**\n * Produce per-field matched-text snippets for a hit (GH-157, `--highlight`).\n * Iterates the hit's already-sorted `matched_fields`, retains only the\n * document-derived searchable fields (skipping synthetic markers like `id`,\n * `semantic`, `rerank`, and `linked_content`), and emits a snippet for each\n * field that still contains a concrete token match.\n */\nfunction buildHitHighlights(document: ItemDocument, matchedFields: string[], tokens: string[]): SearchHitHighlight[] {\n const highlights: SearchHitHighlight[] = [];\n for (const field of matchedFields) {\n const builder = SEARCHABLE_FIELD_BUILDER_BY_NAME.get(field);\n if (builder === undefined) {\n continue;\n }\n const snippet = highlightFieldSnippet(builder.value(document), tokens);\n if (snippet !== null) {\n highlights.push({ field, snippet });\n }\n }\n return highlights;\n}\n\ninterface SearchableScoringField {\n name: string;\n value: string;\n weight: number;\n}\n\ninterface SearchScoreState {\n score: number;\n matched: Set<string>;\n matchedTokens: Set<string>;\n}\n\nfunction buildSearchableScoringFields(document: ItemDocument, linkedCorpus: string, tuning: SearchTuning): SearchableScoringField[] {\n return [\n ...SEARCHABLE_FIELD_BUILDERS.map((builder) => ({\n name: builder.name,\n value: builder.value(document),\n weight: tuning[builder.weightKey],\n })),\n { name: \"linked_content\", value: linkedCorpus, weight: tuning.linked_content_weight },\n ];\n}\n\nfunction buildExactIdSearchHit(item: ItemFrontMatter, normalizedQuery: string, idPrefix: string): SearchHit | null {\n const normalizedId = normalizeSearchPhrase(item.id);\n const normalizedIdPrefix = typeof idPrefix === \"string\" ? idPrefix.trim().toLowerCase() : \"\";\n const normalizedIdPrefixPhrase = normalizeSearchPhrase(normalizedIdPrefix);\n const normalizedShortId =\n normalizedIdPrefixPhrase.length > 0 && normalizedId.startsWith(normalizedIdPrefixPhrase)\n ? normalizedId.slice(normalizedIdPrefixPhrase.length).trim()\n : normalizedId;\n if (normalizedQuery !== normalizedId && normalizedQuery !== normalizedShortId) {\n return null;\n }\n return {\n item,\n score: normalizedQuery === normalizedId ? EXACT_ID_MATCH_SCORE : SHORT_ID_MATCH_SCORE,\n matched_fields: [\"id\"],\n matched_all_terms: true,\n exact_id_match: true,\n };\n}\n\nfunction scoreTokenMatches(\n tokens: string[],\n titleTokenCounts: Map<string, number>,\n searchableFields: SearchableScoringField[],\n tuning: SearchTuning,\n state: SearchScoreState,\n): void {\n for (const token of tokens) {\n const exactTitleMatches = titleTokenCounts.get(token) ?? 0;\n if (exactTitleMatches > 0) {\n state.score += exactTitleMatches * tuning.title_exact_bonus;\n state.matched.add(\"title\");\n state.matchedTokens.add(token);\n }\n for (const field of searchableFields) {\n const occurrences = countOccurrences(field.value.toLowerCase(), token);\n if (occurrences > 0) {\n state.score += occurrences * field.weight;\n state.matched.add(field.name);\n state.matchedTokens.add(token);\n }\n }\n }\n}\n\nfunction scorePhraseMatches(\n item: ItemFrontMatter,\n normalizedQuery: string,\n searchableFields: SearchableScoringField[],\n state: SearchScoreState,\n): void {\n const normalizedTitle = normalizeSearchPhrase(item.title);\n if (normalizedTitle === normalizedQuery) {\n state.score += LONG_QUERY_TITLE_EXACT_BONUS;\n state.matched.add(\"title\");\n }\n for (const field of searchableFields) {\n const phraseOccurrences = countOccurrences(normalizeSearchPhrase(field.value), normalizedQuery);\n if (phraseOccurrences > 0) {\n state.score += phraseOccurrences * field.weight * LONG_QUERY_PHRASE_MULTIPLIER;\n state.matched.add(field.name);\n }\n }\n}\n\nfunction scoreDocument(\n document: ItemDocument,\n tokens: string[],\n normalizedQuery: string,\n linkedCorpus: string,\n tuning: SearchTuning,\n idPrefix: string,\n applyCoverageBonus = false,\n): SearchHit | null {\n const item = document.metadata;\n const exactIdHit = buildExactIdSearchHit(item, normalizedQuery, idPrefix);\n if (exactIdHit) {\n return exactIdHit;\n }\n const titleTokenCounts = new Map<string, number>();\n for (const token of tokenizeForExactTokenMatch(item.title)) {\n titleTokenCounts.set(token, (titleTokenCounts.get(token) ?? 0) + 1);\n }\n const searchableFields = buildSearchableScoringFields(document, linkedCorpus, tuning);\n const state: SearchScoreState = { score: 0, matched: new Set(), matchedTokens: new Set() };\n scoreTokenMatches(tokens, titleTokenCounts, searchableFields, tuning, state);\n const distinctTokens = new Set(tokens);\n // matchedTokens only ever holds entries drawn from `tokens`, so it is always a\n // subset of distinctTokens — exact size equality means every distinct term matched.\n const matchedAllTerms = distinctTokens.size > 0 && state.matchedTokens.size === distinctTokens.size;\n // GH-181 default-mode all-terms ranking bonus: only meaningful for multi-token\n // queries where every distinct token matched somewhere.\n if (applyCoverageBonus && distinctTokens.size > 1 && matchedAllTerms) {\n state.score += ALL_TERMS_COVERAGE_BONUS;\n }\n\n const isLongPhraseQuery = tokens.length >= LONG_QUERY_TOKEN_THRESHOLD && normalizedQuery.includes(\" \");\n if (isLongPhraseQuery) {\n scorePhraseMatches(item, normalizedQuery, searchableFields, state);\n }\n\n if (state.score <= 0) {\n return null;\n }\n\n return {\n item,\n score: state.score,\n matched_fields: [...state.matched].sort((a, b) => a.localeCompare(b)),\n matched_all_terms: matchedAllTerms,\n };\n}\n\nfunction sortHits(items: SearchHit[], statusRegistry: RuntimeStatusRegistry): SearchHit[] {\n return [...items].sort((a, b) => {\n const byScore = b.score - a.score;\n if (byScore !== 0) return byScore;\n const aTerminal = isTerminalStatus(a.item.status, statusRegistry);\n const bTerminal = isTerminalStatus(b.item.status, statusRegistry);\n if (aTerminal !== bTerminal) {\n return aTerminal ? 1 : -1;\n }\n const byPriority = a.item.priority - b.item.priority;\n if (byPriority !== 0) return byPriority;\n const byUpdated = compareTimestampStrings(b.item.updated_at, a.item.updated_at);\n if (byUpdated !== 0) return byUpdated;\n return a.item.id.localeCompare(b.item.id);\n });\n}\n\nfunction buildHybridLexicalScore(\n document: ItemDocument,\n tokens: string[],\n normalizedQuery: string,\n includeLinked: boolean,\n linkedCorpusById: Map<string, string>,\n tuning: SearchTuning,\n idPrefix: string,\n applyCoverageBonus = false,\n): SearchHit | null {\n /* c8 ignore start -- linked corpus presence branch is covered by keyword/hybrid integration query tests */\n return scoreDocument(\n document,\n tokens,\n normalizedQuery,\n includeLinked ? linkedCorpusById.get(document.metadata.id) ?? \"\" : \"\",\n tuning,\n idPrefix,\n applyCoverageBonus,\n );\n /* c8 ignore stop */\n}\n\nfunction normalizeScoreMap(scoreById: Map<string, number>): Map<string, number> {\n if (scoreById.size === 0) {\n return new Map();\n }\n const values = [...scoreById.values()];\n const minScore = Math.min(...values);\n const maxScore = Math.max(...values);\n if (maxScore === minScore) {\n return new Map([...scoreById.keys()].map((id) => [id, 1]));\n }\n const normalized = new Map<string, number>();\n for (const [id, score] of scoreById) {\n normalized.set(id, (score - minScore) / (maxScore - minScore));\n }\n return normalized;\n}\n\n/**\n * Implements resolve search max results for the public runtime surface of this module.\n */\nexport function resolveSearchMaxResults(settings: unknown): number {\n const candidate = (settings as { search?: { max_results?: unknown } }).search?.max_results;\n if (typeof candidate === \"number\" && Number.isFinite(candidate) && candidate > 0) {\n return Math.floor(candidate);\n }\n return 50;\n}\n\n/**\n * Implements resolve search score threshold for the public runtime surface of this module.\n */\nexport function resolveSearchScoreThreshold(settings: unknown): number {\n const candidate = (settings as { search?: { score_threshold?: unknown } }).search?.score_threshold;\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n return 0;\n}\n\n/**\n * Implements resolve hybrid semantic weight for the public runtime surface of this module.\n */\nexport function resolveHybridSemanticWeight(settings: unknown): number {\n const candidate = (settings as { search?: { hybrid_semantic_weight?: unknown } }).search?.hybrid_semantic_weight;\n if (typeof candidate === \"number\" && Number.isFinite(candidate) && candidate >= 0 && candidate <= 1) {\n return candidate;\n }\n return 0.7;\n}\n\n/**\n * Implements resolve search tuning for the public runtime surface of this module.\n */\nexport function resolveSearchTuning(settings: unknown): SearchTuning {\n const defaults: SearchTuning = {\n title_exact_bonus: 10,\n title_weight: 8,\n description_weight: 5,\n tags_weight: 6,\n status_weight: 2,\n body_weight: 1,\n comments_weight: 1,\n notes_weight: 1,\n learnings_weight: 1,\n reminders_weight: 2,\n events_weight: 2,\n dependencies_weight: 3,\n linked_content_weight: 1,\n };\n const tuning = (settings as { search?: { tuning?: Partial<SearchTuning> } }).search?.tuning;\n if (!tuning) return defaults;\n\n const resolveWeight = (candidate: unknown, fallback: number) => {\n if (typeof candidate === \"number\" && Number.isFinite(candidate) && candidate >= 0) {\n return candidate;\n }\n return fallback;\n };\n\n return {\n title_exact_bonus: resolveWeight(tuning.title_exact_bonus, defaults.title_exact_bonus),\n title_weight: resolveWeight(tuning.title_weight, defaults.title_weight),\n description_weight: resolveWeight(tuning.description_weight, defaults.description_weight),\n tags_weight: resolveWeight(tuning.tags_weight, defaults.tags_weight),\n status_weight: resolveWeight(tuning.status_weight, defaults.status_weight),\n body_weight: resolveWeight(tuning.body_weight, defaults.body_weight),\n comments_weight: resolveWeight(tuning.comments_weight, defaults.comments_weight),\n notes_weight: resolveWeight(tuning.notes_weight, defaults.notes_weight),\n learnings_weight: resolveWeight(tuning.learnings_weight, defaults.learnings_weight),\n reminders_weight: resolveWeight(tuning.reminders_weight, defaults.reminders_weight),\n events_weight: resolveWeight(tuning.events_weight, defaults.events_weight),\n dependencies_weight: resolveWeight(tuning.dependencies_weight, defaults.dependencies_weight),\n linked_content_weight: resolveWeight(tuning.linked_content_weight, defaults.linked_content_weight),\n };\n}\n\n/* c8 ignore start -- empty-result projection/count/warnings shape matrix is validated by integration response-contract tests */\nfunction emptySearchResult(\n query: string,\n mode: SearchMode,\n matchMode: SearchMatchMode,\n options: SearchOptions,\n includeLinked: boolean,\n scoreThreshold: number,\n hybridSemanticWeight: number,\n queryExpansion: QueryExpansionConfig,\n rerank: RerankConfig,\n projection: SearchProjectionConfig,\n warnings: string[],\n runtimeFieldFilters?: Record<string, unknown>,\n countOnly = false,\n): SearchResult {\n // --count consistency: a count-only query that matches nothing must still\n // carry the same { count_only: true, total } shape as the non-empty path.\n const countExtras = countOnly ? { total: 0, count_only: true } : {};\n const compactSummaryMode = projection.mode === \"compact\" && options.compact === true;\n if (compactSummaryMode) {\n const compactFilters = buildCompactSearchFilterSummary({\n mode,\n matchMode,\n options,\n includeLinked,\n titleExact: options.titleExact === true,\n phraseExact: options.phraseExact === true,\n scoreThreshold,\n hybridSemanticWeight,\n runtimeFieldFilters,\n });\n return {\n query: query.trim(),\n mode,\n items: [],\n count: 0,\n ...countExtras,\n filters: compactFilters,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n }\n const projectionFields = projection.mode === \"full\" ? null : [...projection.fields];\n return {\n query: query.trim(),\n mode,\n items: [],\n count: 0,\n ...countExtras,\n filters: buildVerboseSearchFilters({\n effectiveMode: mode,\n matchMode,\n options,\n includeLinked,\n titleExact: options.titleExact === true,\n phraseExact: options.phraseExact === true,\n scoreThreshold,\n hybridSemanticWeight,\n queryExpansion,\n rerank,\n runtimeFieldFilters: runtimeFieldFilters ?? {},\n }),\n projection: {\n mode: projection.mode,\n fields: projectionFields,\n },\n now: nowIso(),\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n}\n/* c8 ignore stop */\n\nfunction requireSemanticDependencies(\n requestedMode: Exclude<SearchMode, \"keyword\">,\n providerResolution: EmbeddingProviderResolution,\n vectorResolution: VectorStoreResolution,\n hasExtensionVectorQuery: boolean,\n): { provider: EmbeddingProviderConfig; vectorStore: VectorStoreConfig | null } {\n if (!providerResolution.active) {\n throw new PmCliError(\n `Search mode '${requestedMode}' requires a configured embedding provider in settings.providers.openai or settings.providers.ollama`,\n EXIT_CODE.USAGE,\n );\n }\n if (!vectorResolution.active && !hasExtensionVectorQuery) {\n throw new PmCliError(\n `Search mode '${requestedMode}' requires a configured vector store in settings.vector_store.qdrant/settings.vector_store.lancedb or an extension adapter selected by settings.vector_store.adapter`,\n EXIT_CODE.USAGE,\n );\n }\n return {\n provider: providerResolution.active,\n vectorStore: vectorResolution.active ?? null,\n };\n}\n\nconst toOptionalNonEmptyString = toNonEmptyStringOrUndefined;\n\ninterface ExtensionSearchProviderHooks {\n providerName: string;\n query?: ExtensionSearchProviderQuery;\n queryExpansion?: ExtensionSearchProviderQueryExpansion;\n rerank?: ExtensionSearchProviderRerank;\n}\n\n/* c8 ignore start -- extension search-provider registration permutations are covered by extension integration suites */\nfunction resolveExtensionSearchProviderByName(providerName: string | undefined): ExtensionSearchProviderHooks | null {\n const registrations = getActiveExtensionRegistrations();\n const resolved = resolveRegisteredSearchProvider(registrations, providerName);\n if (!resolved) {\n return null;\n }\n const runtimeDefinition = resolved.runtime_definition ?? resolved.definition;\n const query = (runtimeDefinition as { query?: unknown }).query;\n const queryExpansion =\n (runtimeDefinition as { queryExpansion?: unknown; query_expansion?: unknown }).queryExpansion ??\n (runtimeDefinition as { queryExpansion?: unknown; query_expansion?: unknown }).query_expansion;\n const rerank = (runtimeDefinition as { rerank?: unknown }).rerank;\n const registeredName =\n toOptionalNonEmptyString((runtimeDefinition as { name?: unknown }).name) ??\n toOptionalNonEmptyString((resolved.definition as { name?: unknown }).name) ??\n providerName;\n /* c8 ignore next 2 -- providerName is required for lookup and remains a non-empty fallback */\n if (!registeredName) {\n return null;\n }\n const hooks: ExtensionSearchProviderHooks = {\n providerName: registeredName,\n ...(typeof query === \"function\" ? { query: query as ExtensionSearchProviderQuery } : {}),\n ...(typeof queryExpansion === \"function\"\n ? { queryExpansion: queryExpansion as ExtensionSearchProviderQueryExpansion }\n : {}),\n ...(typeof rerank === \"function\" ? { rerank: rerank as ExtensionSearchProviderRerank } : {}),\n };\n if (!hooks.query && !hooks.queryExpansion && !hooks.rerank) {\n return null;\n }\n return hooks;\n}\n/* c8 ignore stop */\n\nfunction resolveExtensionSearchProvider(settings: PmSettings): { providerName: string; query: ExtensionSearchProviderQuery } | null {\n const providerName = toOptionalNonEmptyString((settings.search as { provider?: unknown } | undefined)?.provider);\n const resolved = resolveExtensionSearchProviderByName(providerName);\n if (!resolved?.query) {\n return null;\n }\n return {\n providerName: resolved.providerName,\n query: resolved.query,\n };\n}\n\n/* c8 ignore start -- vector adapter runtime definition permutations are covered by extension integration suites */\nfunction resolveExtensionVectorAdapter(settings: PmSettings): ExtensionVectorAdapter | null {\n const registrations = getActiveExtensionRegistrations();\n const adapterName = toOptionalNonEmptyString((settings.vector_store as { adapter?: unknown } | undefined)?.adapter);\n const resolved = resolveRegisteredVectorStoreAdapter(registrations, adapterName);\n if (!resolved) {\n return null;\n }\n const runtimeDefinition = resolved.runtime_definition ?? resolved.definition;\n const query = (runtimeDefinition as { query?: unknown }).query;\n if (typeof query !== \"function\") {\n return null;\n }\n const upsert = (runtimeDefinition as { upsert?: unknown }).upsert;\n const runtimeAdapterName =\n toOptionalNonEmptyString((runtimeDefinition as { name?: unknown }).name) ??\n toOptionalNonEmptyString((resolved.definition as { name?: unknown }).name) ??\n adapterName ??\n \"extension\";\n return {\n adapterName: runtimeAdapterName,\n query: query as ExtensionVectorQuery,\n ...(typeof upsert === \"function\" ? { upsert: upsert as ExtensionVectorUpsert } : {}),\n };\n}\n/* c8 ignore stop */\n\nfunction normalizeExtensionProviderHits(\n providerName: string,\n raw: unknown,\n filteredById: Map<string, ItemDocument>,\n): SearchHit[] {\n const rawHits = Array.isArray(raw)\n ? raw\n : (raw as { hits?: unknown } | null | undefined)?.hits;\n if (!Array.isArray(rawHits)) {\n throw new PmCliError(\n `Extension search provider \"${providerName}\" must return an array of hits or { hits: [...] }`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n\n const seen = new Set<string>();\n const hits: SearchHit[] = [];\n for (const rawHit of rawHits) {\n if (typeof rawHit !== \"object\" || rawHit === null) {\n continue;\n }\n const id = toOptionalNonEmptyString((rawHit as { id?: unknown }).id);\n const score = (rawHit as { score?: unknown }).score;\n if (!id || typeof score !== \"number\" || !Number.isFinite(score) || seen.has(id)) {\n continue;\n }\n const document = filteredById.get(id);\n if (!document) {\n continue;\n }\n const matchedFieldsRaw = (rawHit as { matched_fields?: unknown }).matched_fields;\n const matchedFields =\n Array.isArray(matchedFieldsRaw) && matchedFieldsRaw.every((entry) => typeof entry === \"string\")\n ? [...new Set((matchedFieldsRaw as string[]).map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) =>\n a.localeCompare(b),\n )\n : [`provider:${providerName}`];\n seen.add(id);\n hits.push({\n item: document.metadata,\n score,\n matched_fields: matchedFields,\n });\n }\n return hits;\n}\n\nfunction buildSemanticHits(\n vectorHits: VectorQueryHit[],\n filteredById: Map<string, ItemDocument>,\n): { semanticHits: SearchHit[]; semanticScores: Map<string, number> } {\n const semanticHits: SearchHit[] = [];\n const semanticScores = new Map<string, number>();\n for (const vectorHit of vectorHits) {\n if (semanticScores.has(vectorHit.id)) {\n continue;\n }\n const document = filteredById.get(vectorHit.id);\n if (!document) {\n continue;\n }\n semanticScores.set(vectorHit.id, vectorHit.score);\n semanticHits.push({\n item: document.metadata,\n score: vectorHit.score,\n matched_fields: [\"semantic\"],\n });\n }\n return {\n semanticHits,\n semanticScores,\n };\n}\n\n// GH-281: in semantic & hybrid mode the blended/vector scores live on an\n// arbitrary scale (blended hybrid scores are [0,1]; raw vector similarities are\n// provider-defined), so an exact full-ID or short-ID keyword match can be\n// out-ranked by a high-semantic body mention. This reattaches the exact-ID\n// keyword hit(s) to the top of the ranked set in a reserved band ABOVE every\n// other hit, preserving matched_fields:[\"id\"] and keeping full-ID above\n// short-ID. The reserved scores are derived from the current max so the\n// guarantee holds no matter what scale the backend returns, and the hit is\n// re-inserted even if it was dropped from `rankedHits` (e.g. it had no semantic\n// vector match) so it is never lost to the threshold or the result-limit slice.\nfunction forceExactIdHitsToTop(rankedHits: SearchHit[], keywordHits: SearchHit[]): SearchHit[] {\n const exactIdHits = keywordHits.filter((hit) => hit.exact_id_match === true);\n if (exactIdHits.length === 0) {\n return rankedHits;\n }\n const exactIdIds = new Set(exactIdHits.map((hit) => hit.item.id));\n const remaining = rankedHits.filter((hit) => !exactIdIds.has(hit.item.id));\n // reduce (not Math.max(...spread)) so a very large pre-truncation candidate\n // set can never overflow the call stack.\n const maxRemainingScore = remaining.reduce((max, hit) => Math.max(max, hit.score), 0);\n // Full-ID hits (score 1000) must rank above short-ID hits (score 900): rank\n // within the exact-ID band by the original keyword score (descending) so a\n // full-ID match always precedes a short-ID match for the same query, then\n // offset the whole band above every remaining hit. ids are unique, so two\n // exact-ID hits can never tie on score — sorting on score alone is total.\n // exactIdHits is already a fresh array from keywordHits.filter(...), so sort\n // it in place — no defensive copy needed.\n const orderedExactHits = exactIdHits.sort((left, right) => right.score - left.score);\n const bandBase = maxRemainingScore + orderedExactHits.length + 1;\n const promoted = orderedExactHits.map((hit, index) => ({\n // Spread the original keyword hit so flags like matched_all_terms /\n // exact_id_match are preserved; only the band-slot score and the id-only\n // matched_fields are overridden.\n ...hit,\n // Higher band slot for earlier (higher original keyword score) hits.\n score: bandBase - index,\n matched_fields: [\"id\"],\n }));\n return [...promoted, ...remaining];\n}\n\nfunction combineHybridHits(\n filteredById: Map<string, ItemDocument>,\n semanticScores: Map<string, number>,\n keywordHits: SearchHit[],\n hybridSemanticWeight: number,\n // Matched-field label for the dense-ranking component. Defaults to \"semantic\"\n // (vector retrieval); the offline BM25 hybrid path passes \"bm25\" so hits carry\n // an honest provenance marker instead of implying a vector match (pm-75k9).\n semanticFieldLabel = \"semantic\",\n): SearchHit[] {\n const keywordScores = new Map(keywordHits.map((entry) => [entry.item.id, entry.score]));\n const keywordMatches = new Map(keywordHits.map((entry) => [entry.item.id, entry.matched_fields]));\n const normalizedSemantic = normalizeScoreMap(semanticScores);\n const normalizedKeyword = normalizeScoreMap(keywordScores);\n const candidateIds = new Set<string>([...semanticScores.keys(), ...keywordScores.keys()]);\n const keywordWeight = 1 - hybridSemanticWeight;\n return [...candidateIds]\n .map((id) => {\n const document = filteredById.get(id)!;\n const semanticScore = normalizedSemantic.get(id) ?? 0;\n const keywordScore = normalizedKeyword.get(id) ?? 0;\n const combinedScore = (semanticScore * hybridSemanticWeight) + (keywordScore * keywordWeight);\n if (combinedScore <= 0) {\n return null;\n }\n const matchedFields = new Set<string>();\n if (semanticScores.has(id)) {\n matchedFields.add(semanticFieldLabel);\n }\n for (const field of keywordMatches.get(id) ?? []) {\n matchedFields.add(field);\n }\n return {\n item: document.metadata,\n score: combinedScore,\n matched_fields: [...matchedFields].sort((a, b) => a.localeCompare(b)),\n };\n })\n .filter((entry): entry is SearchHit => entry !== null);\n}\n\n/**\n * Built-in BM25 activation outcome for semantic/hybrid search (pm-75k9):\n * - `\"explicit\"`: `search.provider` is `bm25` — the user opted into offline\n * lexical ranking, so it is used even if an embedding provider is configured.\n * - `\"auto-fallback\"`: `search.provider` is `auto` and neither an embedding\n * provider nor an extension search provider is available — BM25 is used in\n * place of degrading to the naive field-weighted keyword scorer.\n * - `null`: BM25 does not apply; the existing embedding/extension path runs.\n */\ntype BuiltInBm25Mode = \"explicit\" | \"auto-fallback\";\n\nfunction resolveBuiltInBm25Mode(params: {\n configuredProvider: string | undefined;\n hasEmbeddingProvider: boolean;\n hasExtensionSearchProvider: boolean;\n}): BuiltInBm25Mode | null {\n const normalized = params.configuredProvider?.trim().toLowerCase();\n if (normalized === \"bm25\") {\n return \"explicit\";\n }\n if (normalized === \"auto\" && !params.hasEmbeddingProvider && !params.hasExtensionSearchProvider) {\n return \"auto-fallback\";\n }\n return null;\n}\n\n/**\n * Rank the filtered corpus with the offline BM25 provider (pm-75k9). Builds a\n * BM25 index over each document's resolved search corpus (honoring\n * `search.corpus_fields`), scores the query, and shapes hits for the requested\n * mode: semantic mode returns pure BM25-ranked hits tagged\n * `matched_fields: [\"bm25\"]`, while hybrid mode blends the BM25 scores with the\n * locally computed keyword scores via {@link combineHybridHits}. The exact\n * full-ID / short-ID guarantee is preserved in both modes via\n * {@link forceExactIdHitsToTop}. No network, embedding service, or vector store\n * is involved, so this path cannot fail on a backend error.\n */\nfunction computeBuiltInBm25Hits(params: {\n requestedMode: Exclude<SearchMode, \"keyword\">;\n query: string;\n filteredDocuments: ItemDocument[];\n keywordHits: SearchHit[];\n corpusFields: string[];\n bm25Params: Bm25Params;\n hybridSemanticWeight: number;\n}): SearchHit[] {\n const bm25Documents = params.filteredDocuments.map((document) => ({\n id: document.metadata.id,\n text: flattenSearchCorpusText(buildSearchCorpus(document, { fields: params.corpusFields })),\n }));\n const index = buildBm25Index(bm25Documents);\n const bm25Scores = scoreBm25Query(index, tokenizeBm25(params.query), params.bm25Params);\n const filteredById = new Map(params.filteredDocuments.map((document) => [document.metadata.id, document]));\n if (params.requestedMode === \"semantic\") {\n const semanticHits: SearchHit[] = [...bm25Scores].map(([id, score]) => ({\n item: filteredById.get(id)!.metadata,\n score,\n matched_fields: [\"bm25\"],\n }));\n return forceExactIdHitsToTop(semanticHits, params.keywordHits);\n }\n const hybridHits = combineHybridHits(\n filteredById,\n bm25Scores,\n params.keywordHits,\n params.hybridSemanticWeight,\n \"bm25\",\n );\n return forceExactIdHitsToTop(hybridHits, params.keywordHits);\n}\n\ninterface SemanticQueryContext {\n requestedMode: Exclude<SearchMode, \"keyword\">;\n query: string;\n filteredDocuments: ItemDocument[];\n keywordHits: SearchHit[];\n hybridSemanticWeight: number;\n limit: number | undefined;\n maxResults: number;\n provider: EmbeddingProviderConfig;\n vectorStore: VectorStoreConfig | null;\n extensionVectorAdapter: ExtensionVectorAdapter | null;\n queryExpansion: QueryExpansionConfig;\n queryExpansionExtension: { providerName: string; expand: ExtensionSearchProviderQueryExpansion } | null;\n rerank: RerankConfig;\n rerankExtension: { providerName: string; rerank: ExtensionSearchProviderRerank } | null;\n warnings: string[];\n settings: PmSettings;\n embeddingTimeoutMs?: number;\n vectorQueryTimeoutMs?: number;\n}\n\ninterface SemanticQueryResult {\n hits: SearchHit[];\n // Number of documents returned by the vector stage for this query after the\n // current metadata filters. When this is 0 the semantic/hybrid query ran\n // successfully, but vector ranking contributed nothing to the returned hits.\n vectorMatchCount: number;\n}\n\nfunction mergeVectorHitsById(vectorHitGroups: VectorQueryHit[][]): VectorQueryHit[] {\n const bestById = new Map<string, VectorQueryHit>();\n for (const group of vectorHitGroups) {\n for (const hit of group) {\n const existing = bestById.get(hit.id);\n if (!existing || hit.score > existing.score) {\n bestById.set(hit.id, hit);\n }\n }\n }\n const merged = [...bestById.values()];\n merged.sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.id.localeCompare(right.id);\n });\n return merged;\n}\n\n/* c8 ignore start -- rerank corpus metadata-shape permutations are covered by semantic integration tests */\nfunction buildRerankCorpus(document: ItemDocument): string {\n const metadata = (document as { metadata?: ItemDocument[\"metadata\"] | null }).metadata;\n const tags = Array.isArray(metadata?.tags) ? metadata.tags.join(\" \") : \"\";\n return [\n metadata?.title,\n metadata?.description,\n metadata?.type,\n metadata?.status,\n tags,\n document.body,\n ]\n .map((entry) => (typeof entry === \"string\" ? entry.trim() : \"\"))\n .filter((entry) => entry.length > 0)\n .join(\"\\n\");\n}\n/* c8 ignore stop */\n\n/* c8 ignore start -- semantic expansion/rerank fallback matrices are covered by end-to-end semantic search tests */\nasync function resolveExpandedSemanticQueries(context: SemanticQueryContext, queryTrimmed: string): Promise<string[]> {\n const baseExpandedQueries = context.queryExpansion.enabled\n ? buildDeterministicQueryExpansions(queryTrimmed, context.queryExpansion.max_queries)\n : [queryTrimmed];\n const expandedQueries = baseExpandedQueries.length > 0 ? baseExpandedQueries : [queryTrimmed];\n if (!context.queryExpansion.enabled) {\n return expandedQueries;\n }\n if (context.queryExpansionExtension?.expand) {\n try {\n const rawExpansion = await Promise.resolve(\n context.queryExpansionExtension.expand({\n query: queryTrimmed,\n mode: context.requestedMode,\n settings: context.settings,\n }),\n );\n return mergeQueryExpansions(\n expandedQueries,\n normalizeQueryExpansionOutput(rawExpansion),\n context.queryExpansion.max_queries,\n );\n } catch {\n context.warnings.push(\n `search_query_expansion_provider_failed:${context.queryExpansionExtension.providerName}:using_builtin`,\n );\n return expandedQueries;\n }\n }\n if (\n context.queryExpansion.provider &&\n context.queryExpansion.provider !== \"openai\" &&\n context.queryExpansion.provider !== \"ollama\"\n ) {\n context.warnings.push(`search_query_expansion_provider_unavailable:${context.queryExpansion.provider}:using_builtin`);\n }\n return expandedQueries;\n}\n\nasync function executeSemanticVectorQuery(\n context: SemanticQueryContext,\n semanticVector: number[],\n semanticLimit: number,\n vectorQueryOptions: { timeout_ms?: number },\n): Promise<VectorQueryHit[]> {\n if (context.extensionVectorAdapter?.query) {\n try {\n return await Promise.resolve(\n context.extensionVectorAdapter.query({\n vector: semanticVector,\n limit: semanticLimit,\n settings: context.settings,\n }),\n );\n } catch (error: unknown) {\n if (!context.vectorStore) {\n throw new PmCliError(\n `Extension vector adapter query failed and no built-in fallback store is configured (${error instanceof Error ? error.message : String(error)})`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n context.warnings.push(`search_vector_adapter_failed:${context.extensionVectorAdapter.adapterName}:using_builtin`);\n return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);\n }\n }\n if (context.vectorStore) {\n return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);\n }\n throw new PmCliError(\n \"Semantic search requires either a configured vector store or an extension vector adapter query handler\",\n EXIT_CODE.USAGE,\n );\n}\n\nfunction buildRerankCandidateContexts(\n hybridHits: SearchHit[],\n filteredById: Map<string, ItemDocument>,\n topK: number,\n): Array<{ hit: SearchHit; text: string }> {\n const sortedForCandidates = [...hybridHits].sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.item.id.localeCompare(right.item.id);\n });\n return sortedForCandidates\n .slice(0, topK)\n .map((hit) => {\n const document = filteredById.get(hit.item.id);\n return document ? { hit, text: buildRerankCorpus(document) } : null;\n })\n .filter((entry): entry is { hit: SearchHit; text: string } => entry !== null);\n}\n\nasync function resolveExtensionRerankScores(\n context: SemanticQueryContext,\n queryTrimmed: string,\n candidateContexts: Array<{ hit: SearchHit; text: string }>,\n): Promise<Map<string, number> | null> {\n if (!context.rerankExtension?.rerank) {\n return null;\n }\n try {\n const rawRerank = await Promise.resolve(\n context.rerankExtension.rerank({\n query: queryTrimmed,\n mode: \"hybrid\",\n model: context.rerank.model,\n top_k: context.rerank.top_k,\n settings: context.settings,\n candidates: candidateContexts.map((entry) => ({\n id: entry.hit.item.id,\n text: entry.text,\n score: entry.hit.score,\n })),\n }),\n );\n const normalizedRerank = normalizeRerankOutput(rawRerank);\n if (normalizedRerank.length > 0) {\n return new Map(normalizedRerank.map((entry) => [entry.id, entry.score]));\n }\n context.warnings.push(\n `search_rerank_provider_invalid_response:${context.rerankExtension.providerName}:using_builtin`,\n );\n return null;\n } catch {\n context.warnings.push(`search_rerank_provider_failed:${context.rerankExtension.providerName}:using_builtin`);\n return null;\n }\n}\n\nasync function resolveRerankScores(\n context: SemanticQueryContext,\n queryTrimmed: string,\n candidateContexts: Array<{ hit: SearchHit; text: string }>,\n): Promise<Map<string, number> | null> {\n const extensionScores = await resolveExtensionRerankScores(context, queryTrimmed, candidateContexts);\n if (extensionScores) {\n return extensionScores;\n }\n const rerankCandidates: RerankCandidate[] = candidateContexts.map((entry) => ({\n id: entry.hit.item.id,\n text: entry.text,\n }));\n try {\n return await rerankCandidatesWithEmbeddings(\n context.provider,\n context.rerank.model,\n queryTrimmed,\n rerankCandidates,\n context.embeddingTimeoutMs,\n );\n } catch {\n context.warnings.push(\"search_rerank_failed:using_hybrid_scores\");\n return null;\n }\n}\n\nfunction applyRerankScores(hybridHits: SearchHit[], rerankScores: Map<string, number>): SearchHit[] {\n const rerankedIds = new Set(rerankScores.keys());\n const rerankedHits = hybridHits.map((hit) => {\n const rerankScore = rerankScores.get(hit.item.id);\n if (rerankScore === undefined) {\n return hit;\n }\n const matchedFields = new Set(hit.matched_fields);\n matchedFields.add(\"rerank\");\n return {\n ...hit,\n score: rerankScore,\n matched_fields: [...matchedFields].sort((left, right) => left.localeCompare(right)),\n };\n });\n rerankedHits.sort((left, right) => {\n const leftWasReranked = rerankedIds.has(left.item.id);\n const rightWasReranked = rerankedIds.has(right.item.id);\n if (leftWasReranked !== rightWasReranked) {\n return leftWasReranked ? -1 : 1;\n }\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.item.id.localeCompare(right.item.id);\n });\n return rerankedHits;\n}\n\nasync function applyHybridRerank(\n context: SemanticQueryContext,\n queryTrimmed: string,\n hybridHits: SearchHit[],\n filteredById: Map<string, ItemDocument>,\n): Promise<SearchHit[]> {\n if (!context.rerank.enabled || hybridHits.length <= 1) {\n return hybridHits;\n }\n const candidateContexts = buildRerankCandidateContexts(hybridHits, filteredById, context.rerank.top_k);\n const rerankScores = await resolveRerankScores(context, queryTrimmed, candidateContexts);\n return rerankScores && rerankScores.size > 0 ? applyRerankScores(hybridHits, rerankScores) : hybridHits;\n}\n\nasync function computeSemanticOrHybridHits(context: SemanticQueryContext): Promise<SemanticQueryResult> {\n const semanticLimit = context.limit ?? context.maxResults;\n const embeddingOptions = context.embeddingTimeoutMs !== undefined ? { timeout_ms: context.embeddingTimeoutMs } : {};\n const vectorQueryOptions = context.vectorQueryTimeoutMs !== undefined ? { timeout_ms: context.vectorQueryTimeoutMs } : {};\n const queryTrimmed = context.query.trim();\n const expandedQueries = await resolveExpandedSemanticQueries(context, queryTrimmed);\n const queryVectors = await executeEmbeddingRequest(context.provider, expandedQueries, embeddingOptions);\n const queryVectorGroups = await Promise.all(\n queryVectors.map(async (semanticVector) =>\n await executeSemanticVectorQuery(context, semanticVector, semanticLimit, vectorQueryOptions)),\n );\n const vectorHits = mergeVectorHitsById(queryVectorGroups);\n const filteredById = new Map(context.filteredDocuments.map((document) => [document.metadata.id, document]));\n const { semanticHits, semanticScores } = buildSemanticHits(vectorHits, filteredById);\n const vectorMatchCount = semanticScores.size;\n if (context.requestedMode === \"semantic\") {\n // GH-281: guarantee an exact full-ID / short-ID match ranks #1 even in pure\n // semantic mode, where it otherwise carries no vector hit at all.\n return { hits: forceExactIdHitsToTop(semanticHits, context.keywordHits), vectorMatchCount };\n }\n const hybridHits = await applyHybridRerank(\n context,\n queryTrimmed,\n combineHybridHits(filteredById, semanticScores, context.keywordHits, context.hybridSemanticWeight),\n filteredById,\n );\n return {\n // GH-281: applied LAST (after any rerank reordering) so an exact full-ID /\n // short-ID keyword match always ranks #1 in hybrid mode regardless of the\n // semantic blend weight or rerank scores.\n hits: forceExactIdHitsToTop(hybridHits, context.keywordHits),\n vectorMatchCount,\n };\n}\n/* c8 ignore stop */\n\n/* c8 ignore start -- item body fallback read-path combinations are covered by document-cache integration tests */\nasync function loadDocuments(\n pmRoot: string,\n itemFormat: ItemFormat,\n typeToFolder: Record<string, string>,\n schema: PmSettings[\"schema\"],\n): Promise<{ documents: ItemDocument[]; warnings: string[] }> {\n const extensionFieldNames = collectRegisteredItemFieldNames(getActiveExtensionRegistrations());\n const readDocumentBody = async (\n metadata: ItemFrontMatter,\n preferredPath: string,\n preferredFormat: ItemFormat,\n ): Promise<string> => {\n const tryRead = async (targetPath: string, format: ItemFormat): Promise<string> => {\n await runActiveOnReadHooks({ path: targetPath, scope: \"project\" });\n const raw = await fs.readFile(targetPath, \"utf8\");\n const parsed = parseItemDocument(raw, {\n format,\n schema,\n extensionFieldNames,\n onWarning: (warning) => listWarnings.push(warning),\n });\n return parsed.body;\n };\n\n try {\n return await tryRead(preferredPath, preferredFormat);\n } catch {\n const alternateFormat: ItemFormat = preferredFormat === \"toon\" ? \"json_markdown\" : \"toon\";\n const alternatePath = getItemPath(pmRoot, metadata.type as ItemType, metadata.id, alternateFormat, typeToFolder);\n try {\n return await tryRead(alternatePath, alternateFormat);\n } catch {\n listWarnings.push(`item_list_item_read_failed:${path.relative(pmRoot, alternatePath)}`);\n return \"\";\n }\n }\n };\n\n const listWarnings: string[] = [];\n const cachedDocuments = await listAllDocumentCandidatesCached(pmRoot, itemFormat, typeToFolder, listWarnings, schema);\n const documents: ItemDocument[] = [];\n if (cachedDocuments.length === 0) {\n const frontMatterDocuments = await listAllFrontMatter(pmRoot, itemFormat, typeToFolder, listWarnings, schema);\n for (const metadata of frontMatterDocuments) {\n const preferredPath = getItemPath(pmRoot, metadata.type as ItemType, metadata.id, itemFormat, typeToFolder);\n const body = await readDocumentBody(metadata, preferredPath, itemFormat);\n documents.push({ metadata, body });\n }\n return {\n documents,\n warnings: [...new Set(listWarnings)].sort((left, right) => left.localeCompare(right)),\n };\n }\n\n for (const cachedDocument of cachedDocuments) {\n if (typeof cachedDocument.body === \"string\") {\n documents.push({\n metadata: cachedDocument.metadata,\n body: cachedDocument.body,\n });\n continue;\n }\n const body = await readDocumentBody(cachedDocument.metadata, cachedDocument.item_path, cachedDocument.item_format);\n documents.push({\n metadata: cachedDocument.metadata,\n body,\n });\n }\n return {\n documents,\n warnings: [...new Set(listWarnings)].sort((left, right) => left.localeCompare(right)),\n };\n}\n/* c8 ignore stop */\n\n/* c8 ignore start -- field projection lookup precedence is validated by output-shaping integration tests */\nfunction readSearchFieldValue(hit: SearchHit, field: string): unknown {\n const normalized = field.trim();\n if (normalized.length === 0) {\n return null;\n }\n if (normalized === \"score\") {\n return hit.score;\n }\n if (normalized === \"matched_fields\") {\n return hit.matched_fields;\n }\n if (normalized.startsWith(\"item.\")) {\n const itemKey = normalized.slice(\"item.\".length);\n if (itemKey.length === 0) {\n return null;\n }\n const itemRecord = toItemRecord(hit.item);\n return itemRecord[itemKey] ?? null;\n }\n const hitRecord = hit as unknown as Record<string, unknown>;\n const itemRecord = toItemRecord(hit.item);\n if (Object.prototype.hasOwnProperty.call(itemRecord, normalized)) {\n return itemRecord[normalized] ?? null;\n }\n if (Object.prototype.hasOwnProperty.call(hitRecord, normalized)) {\n return hitRecord[normalized] ?? null;\n }\n return null;\n}\n/* c8 ignore stop */\n\nfunction projectSearchHits(hits: SearchHit[], projection: SearchProjectionConfig): SearchResultItem[] {\n if (projection.mode === \"full\") {\n // matched_all_terms is an internal ranking signal (GH-181); strip it from\n // full-mode output rows so the public hit shape stays { item, score, matched_fields }.\n return hits.map(({ matched_all_terms: _matchedAllTerms, ...hit }) => hit);\n }\n return hits.map((hit) => {\n const projected: Record<string, unknown> = {};\n for (const field of projection.fields) {\n projected[field] = readSearchFieldValue(hit, field);\n }\n return projected;\n });\n}\n\ninterface PreparedSearchInput {\n query: string;\n options: SearchOptions;\n inlineWarnings: string[];\n highlight: boolean;\n includeLinked: boolean;\n titleExact: boolean;\n phraseExact: boolean;\n matchMode: SearchMatchMode;\n minScoreOverride: number | undefined;\n countOnly: boolean;\n tokens: string[];\n normalizedQuery: string;\n limit: number | undefined;\n projection: SearchProjectionConfig;\n modeWasExplicit: boolean;\n}\n\ninterface SearchRuntimeContext {\n pmRoot: string;\n settings: PmSettings;\n statusRegistry: RuntimeStatusRegistry;\n runtimeFieldRegistry: RuntimeFieldRegistry;\n runtimeFieldFilters: Record<string, unknown>;\n typeRegistry: ItemTypeRegistry;\n maxResults: number;\n scoreThreshold: number;\n semanticWeightProvided: boolean;\n semanticWeightOverride: number | undefined;\n hybridSemanticWeight: number;\n tuning: SearchTuning;\n providerResolution: EmbeddingProviderResolution;\n vectorResolution: VectorStoreResolution;\n extensionSearchProvider: ReturnType<typeof resolveExtensionSearchProvider>;\n extensionVectorAdapter: ReturnType<typeof resolveExtensionVectorAdapter>;\n bm25Mode: BuiltInBm25Mode | null;\n queryExpansion: QueryExpansionConfig;\n queryExpansionExtension: { providerName: string; expand: ExtensionSearchProviderQueryExpansion } | null;\n rerank: RerankConfig;\n rerankExtension: { providerName: string; rerank: ExtensionSearchProviderRerank } | null;\n effectiveMode: SearchMode;\n}\n\ninterface FilteredSearchCorpus {\n warnings: string[];\n allDocuments: ItemDocument[];\n filteredDocuments: ItemDocument[];\n}\n\ninterface SearchResponseContext {\n query: string;\n effectiveMode: SearchMode;\n matchMode: SearchMatchMode;\n options: SearchOptions;\n includeLinked: boolean;\n titleExact: boolean;\n phraseExact: boolean;\n scoreThreshold: number;\n hybridSemanticWeight: number;\n queryExpansion: QueryExpansionConfig;\n rerank: RerankConfig;\n projection: SearchProjectionConfig;\n warnings: string[];\n runtimeFieldFilters: Record<string, unknown>;\n}\n\ninterface SearchModeExecutionInput {\n prepared: PreparedSearchInput;\n runtime: SearchRuntimeContext;\n filteredDocuments: ItemDocument[];\n keywordHits: SearchHit[];\n warnings: string[];\n modeWasExplicit: boolean;\n}\n\ninterface SearchModeExecutionResult {\n effectiveMode: SearchMode;\n hits: SearchHit[];\n}\n\nfunction resolveQueryExpansionExtension(\n queryExpansion: QueryExpansionConfig,\n): { providerName: string; expand: ExtensionSearchProviderQueryExpansion } | null {\n const provider = resolveExtensionSearchProviderByName(queryExpansion.provider ?? undefined);\n return provider?.queryExpansion ? { providerName: provider.providerName, expand: provider.queryExpansion } : null;\n}\n\nfunction resolveRerankExtension(settings: PmSettings): { providerName: string; rerank: ExtensionSearchProviderRerank } | null {\n const provider = resolveExtensionSearchProviderByName(toOptionalNonEmptyString(settings.search?.provider));\n return provider?.rerank ? { providerName: provider.providerName, rerank: provider.rerank } : null;\n}\n\nfunction prepareSearchInput(rawQuery: string, rawOptions: SearchOptions): PreparedSearchInput {\n const inlineWarnings: string[] = [];\n const inlineParse = parseInlineQueryFilters(rawQuery);\n const hasInlineFilters = Object.keys(inlineParse.inlineFilters).length > 0;\n if (hasInlineFilters && inlineParse.residualQuery.trim().length === 0) {\n throw new PmCliError(\n \"Inline field:value tokens consumed the entire query, leaving no search terms.\",\n EXIT_CODE.USAGE,\n {\n examples: [\"pm search auth tag:area:search\", \"pm list --tag area:search --status open\"],\n nextSteps: [\n \"Add keyword terms alongside the inline filters, or use pm list for pure tag/status/type/priority filtering.\",\n ],\n },\n );\n }\n const query = hasInlineFilters ? inlineParse.residualQuery : rawQuery;\n const options = applyInlineQueryFilters(rawOptions, inlineParse.inlineFilters, inlineWarnings);\n return {\n query,\n options,\n inlineWarnings,\n highlight: options.highlight === true,\n includeLinked: parseIncludeLinked(options.includeLinked),\n titleExact: parseTitleExact(options.titleExact),\n phraseExact: parsePhraseExact(options.phraseExact),\n matchMode: parseMatchMode(typeof options.matchMode === \"string\" ? options.matchMode : undefined),\n minScoreOverride: parseMinScoreOverride(options.minScore),\n countOnly: options.count === true,\n tokens: parseTokens(query),\n normalizedQuery: normalizeSearchPhrase(query),\n limit: parseLimit(options.limit),\n projection: parseProjectionConfig(options),\n modeWasExplicit: typeof options.mode === \"string\" && options.mode.trim().length > 0,\n };\n}\n\nasync function resolveSearchRuntimeContext(\n prepared: PreparedSearchInput,\n global: GlobalOptions,\n): Promise<SearchRuntimeContext> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const storedSettings = await readSettings(pmRoot);\n const settings = resolveSettingsWithSemanticRuntimeDefaults(storedSettings).settings;\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const runtimeFieldRegistry = resolveRuntimeFieldRegistry(settings.schema);\n validateSearchProjectionFields(prepared.projection, runtimeFieldRegistry);\n const runtimeFieldFilters = collectRuntimeFilterValues(\n prepared.options as Record<string, unknown>,\n runtimeFieldRegistry,\n \"search\",\n );\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const providerResolution = resolveEmbeddingProviders(settings);\n const vectorResolution = resolveVectorStores(settings);\n const extensionSearchProvider = resolveExtensionSearchProvider(settings);\n const extensionVectorAdapter = resolveExtensionVectorAdapter(settings);\n const semanticWeightOverride = parseSemanticWeightOverride(prepared.options.semanticWeight);\n const queryExpansion = resolveQueryExpansionConfig(settings, providerResolution.active?.name ?? null);\n const rerank = resolveRerankConfig(\n settings,\n providerResolution.active?.model ?? toOptionalNonEmptyString(settings.search?.embedding_model) ?? \"text-embedding-3-small\",\n );\n return {\n pmRoot,\n settings,\n statusRegistry,\n runtimeFieldRegistry,\n runtimeFieldFilters,\n typeRegistry,\n maxResults: resolveSearchMaxResults(settings),\n scoreThreshold: prepared.minScoreOverride ?? resolveSearchScoreThreshold(settings),\n semanticWeightProvided: prepared.options.semanticWeight !== undefined,\n semanticWeightOverride,\n hybridSemanticWeight: semanticWeightOverride ?? resolveHybridSemanticWeight(settings),\n tuning: resolveSearchTuning(settings),\n providerResolution,\n vectorResolution,\n extensionSearchProvider,\n extensionVectorAdapter,\n bm25Mode: resolveBuiltInBm25Mode({\n configuredProvider: toOptionalNonEmptyString(settings.search?.provider),\n hasEmbeddingProvider: providerResolution.active !== null,\n hasExtensionSearchProvider: extensionSearchProvider !== null,\n }),\n queryExpansion,\n queryExpansionExtension: resolveQueryExpansionExtension(queryExpansion),\n rerank,\n rerankExtension: resolveRerankExtension(settings),\n effectiveMode: parseMode(prepared.options.mode, {\n hasProvider: providerResolution.active !== null || extensionSearchProvider !== null,\n hasVectorStore: vectorResolution.active !== null || extensionVectorAdapter !== null,\n }),\n };\n}\n\nasync function loadFilteredSearchCorpus(\n prepared: PreparedSearchInput,\n runtime: SearchRuntimeContext,\n): Promise<FilteredSearchCorpus> {\n const loadedDocuments = await loadDocuments(\n runtime.pmRoot,\n runtime.settings.item_format ?? \"toon\",\n runtime.typeRegistry.type_to_folder,\n runtime.settings.schema,\n );\n const statusFilter = parseStatusFilterCsv(\n typeof prepared.options.status === \"string\" ? prepared.options.status : undefined,\n runtime.statusRegistry,\n { strict: true },\n );\n const lifecycleClassifier = lifecycleClassifierFromStatusRegistry(runtime.statusRegistry);\n const metadataFilteredDocuments = applyFilters(\n loadedDocuments.documents,\n prepared.options,\n runtime.typeRegistry,\n runtime.runtimeFieldFilters,\n statusFilter,\n lifecycleClassifier,\n );\n return {\n warnings: loadedDocuments.warnings,\n allDocuments: loadedDocuments.documents,\n filteredDocuments: applyExactQueryFilters(metadataFilteredDocuments, prepared.normalizedQuery, {\n titleExact: prepared.titleExact,\n phraseExact: prepared.phraseExact || prepared.matchMode === \"exact\",\n }),\n };\n}\n\nasync function collectLinkedCorpusById(\n includeLinked: boolean,\n effectiveMode: SearchMode,\n filteredDocuments: ItemDocument[],\n): Promise<Map<string, string>> {\n const linkedCorpusById = new Map<string, string>();\n if (!includeLinked || (effectiveMode !== \"keyword\" && effectiveMode !== \"hybrid\")) {\n return linkedCorpusById;\n }\n const projectRoot = process.cwd();\n const linkedCorpusRoots = await resolveLinkedCorpusRoots(projectRoot, resolveGlobalPmRoot(projectRoot));\n const linkedCorpusEntries = await Promise.all(\n filteredDocuments.map(async (document) => [document.metadata.id, await loadLinkedCorpus(document, linkedCorpusRoots)] as const),\n );\n for (const [id, corpus] of linkedCorpusEntries) {\n linkedCorpusById.set(id, corpus);\n }\n return linkedCorpusById;\n}\n\nasync function computeKeywordSearchHits(\n prepared: PreparedSearchInput,\n runtime: SearchRuntimeContext,\n filteredDocuments: ItemDocument[],\n): Promise<SearchHit[]> {\n const linkedCorpusById = await collectLinkedCorpusById(prepared.includeLinked, runtime.effectiveMode, filteredDocuments);\n const applyCoverageBonus = prepared.matchMode === \"or\";\n return filteredDocuments\n .map((document) =>\n buildHybridLexicalScore(\n document,\n prepared.tokens,\n prepared.normalizedQuery,\n prepared.includeLinked,\n linkedCorpusById,\n runtime.tuning,\n runtime.settings.id_prefix,\n applyCoverageBonus,\n ),\n )\n .filter((entry): entry is SearchHit => entry !== null)\n .filter((entry) => prepared.matchMode !== \"and\" || entry.matched_all_terms === true);\n}\n\nfunction buildEmptySearchResultFromContext(\n response: SearchResponseContext,\n countOnly: boolean,\n): SearchResult {\n return emptySearchResult(\n response.query,\n response.effectiveMode,\n response.matchMode,\n response.options,\n response.includeLinked,\n response.scoreThreshold,\n response.hybridSemanticWeight,\n response.queryExpansion,\n response.rerank,\n response.projection,\n response.warnings,\n response.runtimeFieldFilters,\n countOnly,\n );\n}\n\nasync function executeBuiltInBm25Search(\n prepared: PreparedSearchInput,\n runtime: SearchRuntimeContext,\n filteredDocuments: ItemDocument[],\n keywordHits: SearchHit[],\n warnings: string[],\n): Promise<SearchHit[] | null> {\n if (runtime.bm25Mode === null || runtime.effectiveMode === \"keyword\") {\n return null;\n }\n const hits = computeBuiltInBm25Hits({\n requestedMode: runtime.effectiveMode,\n query: prepared.query,\n filteredDocuments,\n keywordHits,\n corpusFields: resolveSearchCorpusFields(runtime.settings),\n bm25Params: resolveBm25Params(runtime.settings),\n hybridSemanticWeight: runtime.hybridSemanticWeight,\n });\n if (runtime.bm25Mode === \"auto-fallback\") {\n warnings.push(`search_${runtime.effectiveMode}_offline_bm25:no_embedding_provider:using_lexical_bm25`);\n }\n return hits;\n}\n\nasync function executeExtensionSearchProvider(\n prepared: PreparedSearchInput,\n runtime: SearchRuntimeContext,\n filteredDocuments: ItemDocument[],\n filteredById: Map<string, ItemDocument>,\n): Promise<SearchHit[] | null> {\n if (!runtime.extensionSearchProvider) {\n return null;\n }\n const canUseBuiltInSemantic =\n runtime.providerResolution.active !== null &&\n (runtime.vectorResolution.active !== null || runtime.extensionVectorAdapter !== null);\n try {\n const providerResponse = await Promise.resolve(\n runtime.extensionSearchProvider.query({\n query: prepared.query,\n mode: runtime.effectiveMode,\n tokens: prepared.tokens,\n options: prepared.options,\n settings: runtime.settings,\n documents: filteredDocuments,\n }),\n );\n return normalizeExtensionProviderHits(runtime.extensionSearchProvider.providerName, providerResponse, filteredById);\n } catch (error: unknown) {\n if (!canUseBuiltInSemantic) {\n throw new PmCliError(\n `Extension search provider \"${runtime.extensionSearchProvider.providerName}\" failed: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n return null;\n }\n}\n\nfunction maybeApplyNoVectorFallback(\n effectiveMode: Exclude<SearchMode, \"keyword\">,\n semanticResult: Awaited<ReturnType<typeof computeSemanticOrHybridHits>>,\n keywordHits: SearchHit[],\n warnings: string[],\n): SearchHit[] {\n if (semanticResult.vectorMatchCount > 0) {\n return semanticResult.hits;\n }\n warnings.push(`search_${effectiveMode}_degraded:no_vector_matches:results_are_lexical`);\n return effectiveMode === \"semantic\" ? keywordHits : semanticResult.hits;\n}\n\nasync function prepareBuiltInSemanticSearch(\n runtime: SearchRuntimeContext,\n effectiveMode: Exclude<SearchMode, \"keyword\">,\n filteredDocuments: ItemDocument[],\n warnings: string[],\n modeWasExplicit: boolean,\n): Promise<void> {\n const builtInSemanticWillRun =\n !runtime.extensionSearchProvider &&\n runtime.providerResolution.active !== null &&\n (runtime.vectorResolution.active !== null || runtime.extensionVectorAdapter !== null);\n if (modeWasExplicit && builtInSemanticWillRun) {\n await maybeEmitVectorIndexStaleWarning(runtime.pmRoot, filteredDocuments, warnings);\n }\n if (!runtime.extensionSearchProvider) {\n requireSemanticDependencies(\n effectiveMode,\n runtime.providerResolution,\n runtime.vectorResolution,\n runtime.extensionVectorAdapter !== null,\n );\n }\n}\n\nasync function executeSemanticSearch(input: SearchModeExecutionInput): Promise<SearchModeExecutionResult> {\n const { prepared, runtime, filteredDocuments, keywordHits, warnings, modeWasExplicit } = input;\n let hits = keywordHits;\n const bm25Hits = await executeBuiltInBm25Search(prepared, runtime, filteredDocuments, keywordHits, warnings);\n const semanticMode = runtime.effectiveMode;\n if (bm25Hits !== null || semanticMode === \"keyword\") {\n return { effectiveMode: runtime.effectiveMode, hits: bm25Hits ?? hits };\n }\n try {\n await prepareBuiltInSemanticSearch(runtime, semanticMode, filteredDocuments, warnings, modeWasExplicit);\n if (filteredDocuments.length === 0 || prepared.limit === 0) {\n return { effectiveMode: runtime.effectiveMode, hits: [] };\n }\n const filteredById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));\n hits = await executeExtensionSearchProvider(prepared, runtime, filteredDocuments, filteredById) ?? hits;\n if (hits === keywordHits) {\n const { provider, vectorStore } = requireSemanticDependencies(\n semanticMode,\n runtime.providerResolution,\n runtime.vectorResolution,\n runtime.extensionVectorAdapter !== null,\n );\n const semanticResult = await computeSemanticOrHybridHits({\n requestedMode: semanticMode,\n query: prepared.query,\n filteredDocuments,\n keywordHits,\n hybridSemanticWeight: runtime.hybridSemanticWeight,\n limit: prepared.limit,\n maxResults: runtime.maxResults,\n provider,\n vectorStore,\n extensionVectorAdapter: runtime.extensionVectorAdapter,\n queryExpansion: runtime.queryExpansion,\n queryExpansionExtension: runtime.queryExpansionExtension,\n rerank: runtime.rerank,\n rerankExtension: runtime.rerankExtension,\n warnings,\n settings: runtime.settings,\n });\n hits = maybeApplyNoVectorFallback(semanticMode, semanticResult, keywordHits, warnings);\n }\n return { effectiveMode: runtime.effectiveMode, hits };\n } catch (error: unknown) {\n warnings.push(buildExplicitSemanticFallbackWarning(runtime.effectiveMode, error));\n return { effectiveMode: \"keyword\", hits: keywordHits };\n }\n}\n\nfunction buildCountOnlySearchResult(response: SearchResponseContext, total: number): SearchResult {\n if (response.projection.mode === \"compact\" && response.options.compact === true) {\n return withSearchWarnings({\n query: response.query.trim(),\n mode: response.effectiveMode,\n items: [],\n count: total,\n total,\n count_only: true,\n filters: buildCompactSearchFilterSummary({\n mode: response.effectiveMode,\n matchMode: response.matchMode,\n options: response.options,\n includeLinked: response.includeLinked,\n titleExact: response.titleExact,\n phraseExact: response.phraseExact,\n scoreThreshold: response.scoreThreshold,\n hybridSemanticWeight: response.hybridSemanticWeight,\n runtimeFieldFilters: response.runtimeFieldFilters,\n }),\n }, response.warnings);\n }\n const projectionFields = response.projection.mode === \"full\" ? null : [...response.projection.fields];\n return withSearchWarnings({\n query: response.query.trim(),\n mode: response.effectiveMode,\n items: [],\n count: total,\n total,\n count_only: true,\n filters: buildVerboseSearchFilters({\n effectiveMode: response.effectiveMode,\n matchMode: response.matchMode,\n options: response.options,\n includeLinked: response.includeLinked,\n titleExact: response.titleExact,\n phraseExact: response.phraseExact,\n scoreThreshold: response.scoreThreshold,\n hybridSemanticWeight: response.hybridSemanticWeight,\n queryExpansion: response.queryExpansion,\n rerank: response.rerank,\n runtimeFieldFilters: response.runtimeFieldFilters,\n }),\n projection: {\n mode: response.projection.mode,\n fields: projectionFields,\n },\n now: nowIso(),\n }, response.warnings);\n}\n\nfunction withSearchWarnings(result: SearchResult, warnings: string[]): SearchResult {\n if (warnings.length === 0) {\n return result;\n }\n return { ...result, warnings };\n}\n\nfunction attachSearchHighlights(\n prepared: PreparedSearchInput,\n filteredDocuments: ItemDocument[],\n limited: SearchHit[],\n): { hits: SearchHit[]; projection: SearchProjectionConfig } {\n if (!prepared.highlight) {\n return { hits: limited, projection: prepared.projection };\n }\n const documentById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));\n const hits = limited.map((hit) => ({\n ...hit,\n highlights: buildHitHighlights(documentById.get(hit.item.id)!, hit.matched_fields, prepared.tokens),\n }));\n if (prepared.projection.mode === \"full\" || prepared.projection.fields.includes(\"highlights\")) {\n return { hits, projection: prepared.projection };\n }\n return { hits, projection: { mode: prepared.projection.mode, fields: [...prepared.projection.fields, \"highlights\"] } };\n}\n\nfunction buildSearchResultForHits(\n response: SearchResponseContext,\n projectedItems: SearchResultItem[],\n total: number,\n limitedCount: number,\n effectiveProjection: SearchProjectionConfig,\n): SearchResult {\n const truncationExtras = limitedCount < total ? { total } : {};\n if (response.projection.mode === \"compact\" && response.options.compact === true) {\n return withSearchWarnings({\n query: response.query.trim(),\n mode: response.effectiveMode,\n items: projectedItems,\n count: projectedItems.length,\n ...truncationExtras,\n filters: buildCompactSearchFilterSummary({\n mode: response.effectiveMode,\n matchMode: response.matchMode,\n options: response.options,\n includeLinked: response.includeLinked,\n titleExact: response.titleExact,\n phraseExact: response.phraseExact,\n scoreThreshold: response.scoreThreshold,\n hybridSemanticWeight: response.hybridSemanticWeight,\n runtimeFieldFilters: response.runtimeFieldFilters,\n }),\n }, response.warnings);\n }\n const finalProjectionFields = effectiveProjection.mode === \"full\" ? null : [...effectiveProjection.fields];\n return {\n query: response.query.trim(),\n mode: response.effectiveMode,\n items: projectedItems,\n count: projectedItems.length,\n ...truncationExtras,\n filters: buildVerboseSearchFilters({\n effectiveMode: response.effectiveMode,\n matchMode: response.matchMode,\n options: response.options,\n includeLinked: response.includeLinked,\n titleExact: response.titleExact,\n phraseExact: response.phraseExact,\n scoreThreshold: response.scoreThreshold,\n hybridSemanticWeight: response.hybridSemanticWeight,\n queryExpansion: response.queryExpansion,\n rerank: response.rerank,\n runtimeFieldFilters: response.runtimeFieldFilters,\n }),\n projection: {\n mode: effectiveProjection.mode,\n fields: finalProjectionFields,\n },\n now: nowIso(),\n ...(response.warnings.length > 0 ? { warnings: response.warnings } : {}),\n };\n}\n\n/**\n * Implements run search for the public runtime surface of this module.\n */\nexport async function runSearch(rawQuery: string, rawOptions: SearchOptions, global: GlobalOptions): Promise<SearchResult> {\n const prepared = prepareSearchInput(rawQuery, rawOptions);\n const runtime = await resolveSearchRuntimeContext(prepared, global);\n const corpus = await loadFilteredSearchCorpus(prepared, runtime);\n const warnings = corpus.warnings;\n warnings.push(...prepared.inlineWarnings);\n if (runtime.effectiveMode === \"hybrid\" && runtime.semanticWeightProvided && runtime.semanticWeightOverride === undefined) {\n warnings.push(\"search_hybrid_semantic_weight_override_invalid:using_settings_default\");\n }\n const responseBase = {\n query: prepared.query,\n matchMode: prepared.matchMode,\n options: prepared.options,\n includeLinked: prepared.includeLinked,\n titleExact: prepared.titleExact,\n phraseExact: prepared.phraseExact,\n scoreThreshold: runtime.scoreThreshold,\n hybridSemanticWeight: runtime.hybridSemanticWeight,\n queryExpansion: runtime.queryExpansion,\n rerank: runtime.rerank,\n projection: prepared.projection,\n warnings,\n runtimeFieldFilters: runtime.runtimeFieldFilters,\n };\n if (runtime.effectiveMode === \"keyword\" && (corpus.filteredDocuments.length === 0 || prepared.limit === 0)) {\n return buildEmptySearchResultFromContext(\n { ...responseBase, effectiveMode: runtime.effectiveMode },\n prepared.countOnly,\n );\n }\n const keywordHits = await computeKeywordSearchHits(prepared, runtime, corpus.filteredDocuments);\n const modeResult = await executeSemanticSearch({\n prepared,\n runtime,\n filteredDocuments: corpus.filteredDocuments,\n keywordHits,\n warnings,\n modeWasExplicit: prepared.modeWasExplicit,\n });\n if (modeResult.effectiveMode !== \"keyword\" && modeResult.hits.length === 0 && (corpus.filteredDocuments.length === 0 || prepared.limit === 0)) {\n return buildEmptySearchResultFromContext(\n { ...responseBase, effectiveMode: modeResult.effectiveMode },\n prepared.countOnly,\n );\n }\n const thresholded = modeResult.hits.filter((entry) => entry.exact_id_match === true || entry.score >= runtime.scoreThreshold);\n const sorted = sortHits(thresholded, runtime.statusRegistry);\n const total = sorted.length;\n const resolvedLimit = prepared.limit ?? runtime.maxResults;\n const limited = sorted.slice(0, resolvedLimit);\n const response = { ...responseBase, effectiveMode: modeResult.effectiveMode };\n if (prepared.countOnly) {\n return buildCountOnlySearchResult(response, total);\n }\n const { hits: projectedHits, projection: effectiveProjection } = attachSearchHighlights(\n prepared,\n corpus.filteredDocuments,\n limited,\n );\n const projectedItems = projectSearchHits(projectedHits, effectiveProjection);\n return buildSearchResultForHits(response, projectedItems, total, limited.length, effectiveProjection);\n}\n","/**\n * @module core/extensions/runtime-registrations\n *\n * Implements extension runtime contracts and governance for Runtime Registrations.\n */\nimport type {\n ExtensionRegistrationRegistry,\n RegisteredExtensionSchemaMigrationDefinition,\n RegisteredExtensionSearchProvider,\n RegisteredExtensionVectorStoreAdapter,\n} from \"./loader.js\";\n\nfunction normalizeRegistrationName(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n return normalized.length > 0 ? normalized : null;\n}\n\n/**\n * Implements collect registered item fields for the public runtime surface of this module.\n */\nexport function collectRegisteredItemFields(registrations: ExtensionRegistrationRegistry | null): Array<Record<string, unknown>> {\n if (!registrations) {\n return [];\n }\n const fields: Array<Record<string, unknown>> = [];\n for (const registration of registrations.item_fields) {\n for (const field of registration.fields) {\n fields.push(field);\n }\n }\n return fields;\n}\n\n/**\n * Implements resolve registered search provider for the public runtime surface of this module.\n */\nexport function resolveRegisteredSearchProvider(\n registrations: ExtensionRegistrationRegistry | null,\n configuredProvider: string | undefined,\n): RegisteredExtensionSearchProvider | null {\n const providerName = normalizeRegistrationName(configuredProvider);\n if (!registrations || !providerName) {\n return null;\n }\n const matched = [...registrations.search_providers]\n .reverse()\n .find((registration) => {\n const definitionName =\n normalizeRegistrationName(registration.runtime_definition?.name) ??\n normalizeRegistrationName(registration.definition?.name);\n return definitionName === providerName;\n });\n return matched ?? null;\n}\n\n/**\n * Implements resolve registered vector store adapter for the public runtime surface of this module.\n */\nexport function resolveRegisteredVectorStoreAdapter(\n registrations: ExtensionRegistrationRegistry | null,\n configuredAdapter: string | undefined,\n): RegisteredExtensionVectorStoreAdapter | null {\n const adapterName = normalizeRegistrationName(configuredAdapter);\n if (!registrations || !adapterName) {\n return null;\n }\n const matched = [...registrations.vector_store_adapters]\n .reverse()\n .find((registration) => {\n const definitionName =\n normalizeRegistrationName(registration.runtime_definition?.name) ??\n normalizeRegistrationName(registration.definition?.name);\n return definitionName === adapterName;\n });\n return matched ?? null;\n}\n\n/**\n * Implements get migration runtime definition for the public runtime surface of this module.\n */\nexport function getMigrationRuntimeDefinition(\n migration: RegisteredExtensionSchemaMigrationDefinition,\n): Record<string, unknown> {\n return migration.runtime_definition ?? migration.definition;\n}\n","/**\n * @module core/shared/text-normalization\n *\n * Provides shared primitives and utilities for Text Normalization.\n */\n/**\n * Normalizes text to lowercase whitespace-collapsed form for stable matching and comparison.\n */\nexport function normalizeLowercaseWhitespace(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \" \");\n}\n\n/**\n * Implements tokenize alpha numeric for the public runtime surface of this module.\n */\nexport function tokenizeAlphaNumeric(value: string): string[] {\n return normalizeLowercaseWhitespace(value)\n .split(/[^a-z0-9]+/)\n .filter((token) => token.length > 0);\n}\n\n/**\n * Implements jaccard similarity for the public runtime surface of this module.\n */\nexport function jaccardSimilarity(leftTokens: string[], rightTokens: string[]): number {\n if (leftTokens.length === 0 && rightTokens.length === 0) {\n return 1;\n }\n if (leftTokens.length === 0 || rightTokens.length === 0) {\n return 0;\n }\n const leftSet = new Set(leftTokens);\n const rightSet = new Set(rightTokens);\n let intersection = 0;\n for (const token of leftSet) {\n if (rightSet.has(token)) {\n intersection += 1;\n }\n }\n // Both token sets are non-empty here (guarded above), so union is always >= 1.\n const union = new Set([...leftSet, ...rightSet]).size;\n return intersection / union;\n}\n","/**\n * @module core/search/relevance\n *\n * Powers search, embeddings, and semantic retrieval behavior for Relevance.\n */\nimport type { PmSettings } from \"../../types.js\";\nimport { coercePositiveInteger, toNonEmptyString } from \"../shared/primitives.js\";\nimport { tokenizeAlphaNumeric } from \"../shared/text-normalization.js\";\nimport { executeEmbeddingRequest, type EmbeddingProviderConfig } from \"./providers.js\";\n\nexport const DEFAULT_QUERY_EXPANSION_MAX_QUERIES = 4;\nexport const DEFAULT_RERANK_TOP_K = 20;\nconst MAX_RERANK_TOP_K = 200;\n\nconst QUERY_EXPANSION_STOP_WORDS = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"for\",\n \"from\",\n \"in\",\n \"into\",\n \"of\",\n \"on\",\n \"or\",\n \"the\",\n \"to\",\n \"with\",\n]);\n\n/**\n * Documents the query expansion config payload exchanged by command, SDK, and package integrations.\n */\nexport interface QueryExpansionConfig {\n enabled: boolean;\n provider: string | null;\n max_queries: number;\n}\n\n/**\n * Documents the rerank config payload exchanged by command, SDK, and package integrations.\n */\nexport interface RerankConfig {\n enabled: boolean;\n model: string;\n top_k: number;\n}\n\n/**\n * Documents the rerank candidate payload exchanged by command, SDK, and package integrations.\n */\nexport interface RerankCandidate {\n id: string;\n text: string;\n}\n\n/**\n * Documents the rerank scored hit payload exchanged by command, SDK, and package integrations.\n */\nexport interface RerankScoredHit {\n id: string;\n score: number;\n}\n\nfunction dedupeQueries(values: string[], limit: number): string[] {\n const deduped: string[] = [];\n const seen = new Set<string>();\n for (const entry of values) {\n const normalized = entry.trim().replaceAll(/\\s+/g, \" \");\n if (normalized.length === 0) {\n continue;\n }\n const dedupeKey = normalized.toLowerCase();\n if (seen.has(dedupeKey)) {\n continue;\n }\n seen.add(dedupeKey);\n deduped.push(normalized);\n if (deduped.length >= limit) {\n break;\n }\n }\n return deduped;\n}\n\nfunction singularizeSimple(token: string): string {\n const normalizedToken = token.toLowerCase();\n if (normalizedToken.length > 4 && normalizedToken.endsWith(\"ies\")) {\n return `${normalizedToken.slice(0, -3)}y`;\n }\n if (\n normalizedToken.length > 4 &&\n (normalizedToken.endsWith(\"ches\") ||\n normalizedToken.endsWith(\"shes\") ||\n normalizedToken.endsWith(\"xes\") ||\n normalizedToken.endsWith(\"zes\") ||\n normalizedToken.endsWith(\"sses\"))\n ) {\n return normalizedToken.slice(0, -2);\n }\n if (\n normalizedToken.length > 3 &&\n normalizedToken.endsWith(\"s\") &&\n !normalizedToken.endsWith(\"ss\") &&\n !normalizedToken.endsWith(\"us\") &&\n !normalizedToken.endsWith(\"is\") &&\n !normalizedToken.endsWith(\"as\")\n ) {\n return normalizedToken.slice(0, -1);\n }\n return normalizedToken;\n}\n\nfunction pluralizeSimple(token: string): string {\n const normalizedToken = token.toLowerCase();\n if (normalizedToken.length > 2 && (!normalizedToken.endsWith(\"s\") || normalizedToken.endsWith(\"ss\"))) {\n if (normalizedToken.endsWith(\"y\") && !/[aeiou]y$/u.test(normalizedToken)) {\n return `${normalizedToken.slice(0, -1)}ies`;\n }\n if (\n normalizedToken.endsWith(\"ch\") ||\n normalizedToken.endsWith(\"sh\") ||\n normalizedToken.endsWith(\"x\") ||\n normalizedToken.endsWith(\"z\") ||\n normalizedToken.endsWith(\"ss\")\n ) {\n return `${normalizedToken}es`;\n }\n return `${normalizedToken}s`;\n }\n return normalizedToken;\n}\n\n/**\n * Implements build deterministic query expansions for the public runtime surface of this module.\n */\nexport function buildDeterministicQueryExpansions(\n query: string,\n maxQueries = DEFAULT_QUERY_EXPANSION_MAX_QUERIES,\n): string[] {\n const normalizedQuery = query.trim().replaceAll(/\\s+/g, \" \");\n if (normalizedQuery.length === 0) {\n return [];\n }\n const tokens = tokenizeAlphaNumeric(normalizedQuery);\n if (tokens.length === 0) {\n return [normalizedQuery];\n }\n const contentTokens = tokens.filter((token) => !QUERY_EXPANSION_STOP_WORDS.has(token.toLowerCase()));\n const singularized = tokens.map((token) => singularizeSimple(token));\n const pluralized = contentTokens.map((token) => pluralizeSimple(token));\n return dedupeQueries(\n [\n normalizedQuery,\n tokens.join(\" \"),\n contentTokens.join(\" \"),\n singularized.join(\" \"),\n pluralized.join(\" \"),\n ],\n Math.max(1, maxQueries),\n );\n}\n\n/**\n * Implements normalize query expansion output for the public runtime surface of this module.\n */\nexport function normalizeQueryExpansionOutput(raw: unknown): string[] {\n const rawQueries = Array.isArray(raw)\n ? raw\n : (raw as { queries?: unknown } | null | undefined)?.queries;\n if (!Array.isArray(rawQueries)) {\n return [];\n }\n return dedupeQueries(\n rawQueries.filter((entry): entry is string => typeof entry === \"string\"),\n DEFAULT_QUERY_EXPANSION_MAX_QUERIES,\n );\n}\n\n/**\n * Implements merge query expansions for the public runtime surface of this module.\n */\nexport function mergeQueryExpansions(base: string[], extra: string[], maxQueries: number): string[] {\n return dedupeQueries([...base, ...extra], Math.max(1, maxQueries));\n}\n\n/**\n * Implements resolve query expansion config for the public runtime surface of this module.\n */\nexport function resolveQueryExpansionConfig(\n settings: PmSettings,\n fallbackProviderName: string | null,\n): QueryExpansionConfig {\n const search = (settings as { search?: { query_expansion?: { enabled?: unknown; provider?: unknown } } }).search;\n const queryExpansion = search?.query_expansion;\n const configuredProvider = toNonEmptyString(queryExpansion?.provider);\n return {\n enabled: queryExpansion?.enabled === true,\n provider: configuredProvider ?? fallbackProviderName,\n max_queries: DEFAULT_QUERY_EXPANSION_MAX_QUERIES,\n };\n}\n\n/**\n * Implements resolve rerank config for the public runtime surface of this module.\n */\nexport function resolveRerankConfig(settings: PmSettings, fallbackModel: string): RerankConfig {\n const search = (settings as { search?: { rerank?: { enabled?: unknown; model?: unknown; top_k?: unknown } } }).search;\n const rerank = search?.rerank;\n const configuredModel = toNonEmptyString(rerank?.model);\n const configuredTopK = coercePositiveInteger(rerank?.top_k);\n const normalizedTopK = configuredTopK ?? DEFAULT_RERANK_TOP_K;\n return {\n enabled: rerank?.enabled === true,\n model: configuredModel ?? fallbackModel,\n top_k: Math.min(MAX_RERANK_TOP_K, normalizedTopK),\n };\n}\n\n/**\n * Implements normalize rerank output for the public runtime surface of this module.\n */\nexport function normalizeRerankOutput(raw: unknown): RerankScoredHit[] {\n const rawHits = Array.isArray(raw)\n ? raw\n : (raw as { hits?: unknown } | null | undefined)?.hits;\n if (!Array.isArray(rawHits)) {\n return [];\n }\n const bestById = new Map<string, number>();\n for (const entry of rawHits) {\n if (typeof entry !== \"object\" || entry === null) {\n continue;\n }\n const id = toNonEmptyString((entry as { id?: unknown }).id);\n const score = (entry as { score?: unknown }).score;\n if (!id || typeof score !== \"number\" || !Number.isFinite(score)) {\n continue;\n }\n const existing = bestById.get(id);\n if (existing === undefined || score > existing) {\n bestById.set(id, score);\n }\n }\n const normalized = [...bestById.entries()].map(([id, score]) => ({ id, score }));\n normalized.sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.id.localeCompare(right.id);\n });\n return normalized;\n}\n\nfunction dotProduct(left: number[], right: number[]): number {\n const size = left.length;\n let result = 0;\n for (let index = 0; index < size; index += 1) {\n result += left[index] * right[index];\n }\n return result;\n}\n\nfunction l2Norm(vector: number[]): number {\n let sumSquares = 0;\n for (let index = 0; index < vector.length; index += 1) {\n sumSquares += vector[index] * vector[index];\n }\n return Math.sqrt(sumSquares);\n}\n\nfunction cosineSimilarityWithKnownLeftNorm(\n left: number[] | null | undefined,\n right: number[] | null | undefined,\n leftNorm: number,\n): number {\n if (!left || !right || left.length === 0 || right.length === 0 || left.length !== right.length) {\n return 0;\n }\n const numerator = dotProduct(left, right);\n const rightNorm = l2Norm(right);\n const denominator = leftNorm * rightNorm;\n if (\n !Number.isFinite(numerator) ||\n !Number.isFinite(leftNorm) ||\n !Number.isFinite(rightNorm) ||\n !Number.isFinite(denominator) ||\n denominator === 0\n ) {\n return 0;\n }\n return Math.max(-1, Math.min(1, numerator / denominator));\n}\n\n/**\n * Implements rerank candidates with embeddings for the public runtime surface of this module.\n */\nexport async function rerankCandidatesWithEmbeddings(\n provider: EmbeddingProviderConfig,\n model: string,\n query: string,\n candidates: RerankCandidate[],\n timeoutMs?: number,\n): Promise<Map<string, number>> {\n if (candidates.length === 0) {\n return new Map();\n }\n const effectiveModel = toNonEmptyString(model) ?? provider.model;\n const rerankProvider: EmbeddingProviderConfig =\n effectiveModel === provider.model ? provider : { ...provider, model: effectiveModel };\n const payload = [query.trim(), ...candidates.map((entry) => entry.text)];\n const vectors = await executeEmbeddingRequest(rerankProvider, payload, timeoutMs ? { timeout_ms: timeoutMs } : {});\n const queryVector = vectors[0];\n if (!queryVector) {\n return new Map();\n }\n const queryNorm = l2Norm(queryVector);\n const scoreById = new Map<string, number>();\n for (let index = 0; index < candidates.length; index += 1) {\n const candidate = candidates[index];\n const candidateVector = vectors[index + 1];\n if (!candidateVector) {\n continue;\n }\n const similarity = cosineSimilarityWithKnownLeftNorm(queryVector, candidateVector, queryNorm);\n scoreById.set(candidate.id, Math.max(0, Math.min(1, (similarity + 1) / 2)));\n }\n return scoreById;\n}\n","/**\n * @module core/search/bm25\n *\n * Offline BM25 lexical retrieval (pm-75k9). Provides an Okapi BM25 ranker that\n * scores the in-memory item corpus with no embedding service, vector store, or\n * network dependency, so semantic/hybrid search degrades to a dense-quality\n * lexical ranker — rather than the naive field-weighted scorer — in air-gapped,\n * CI, and zero-setup environments.\n *\n * BM25 improves on raw term-frequency counting in three ways the legacy keyword\n * scorer cannot: inverse document frequency down-weights terms common across the\n * whole corpus, term-frequency saturation (`k1`) caps the contribution of a term\n * repeated many times in one document, and length normalization (`b`) prevents\n * long documents from dominating purely by size.\n */\nimport type { PmSettings } from \"../../types/index.js\";\nimport { tokenizeAlphaNumeric } from \"../shared/text-normalization.js\";\n\n/**\n * Default Okapi BM25 term-frequency saturation parameter. `1.2` is the widely\n * used Lucene/Elasticsearch default: higher values reduce the diminishing\n * returns of repeated terms more slowly (terms keep accruing weight), lower\n * values saturate sooner.\n */\nexport const DEFAULT_BM25_K1 = 1.2;\n\n/**\n * Default Okapi BM25 length-normalization parameter. `0.75` is the Lucene\n * default: `0` disables length normalization entirely, `1` fully normalizes a\n * document's score by its length relative to the corpus average.\n */\nexport const DEFAULT_BM25_B = 0.75;\n\n/**\n * Resolved BM25 tuning parameters. Both are clamped to sane ranges by\n * {@link resolveBm25Params} before scoring.\n */\nexport interface Bm25Params {\n /** Term-frequency saturation (`k1`); finite and `>= 0`. */\n k1: number;\n /** Length normalization (`b`); finite and within `[0, 1]`. */\n b: number;\n}\n\n/**\n * One corpus document supplied to {@link buildBm25Index}: a stable id and the\n * already-concatenated searchable text. Callers build the text from whichever\n * fields they want indexed (typically the resolved `search.corpus_fields`).\n */\nexport interface Bm25Document {\n id: string;\n text: string;\n}\n\n/**\n * Per-document statistics retained in a {@link Bm25Index}: the term-frequency\n * map and the document length (total token count) used for length\n * normalization.\n */\ninterface Bm25DocumentStats {\n id: string;\n termFrequencies: Map<string, number>;\n length: number;\n}\n\n/**\n * An immutable BM25 index built from a document set. Carries the per-document\n * term frequencies, per-term document frequencies, corpus size, and average\n * document length needed to score any query. Build once per query batch with\n * {@link buildBm25Index}, then score with {@link scoreBm25Query}.\n */\nexport interface Bm25Index {\n documents: Bm25DocumentStats[];\n documentFrequency: Map<string, number>;\n documentCount: number;\n averageDocumentLength: number;\n}\n\n/**\n * Tokenize a document/query string into BM25 terms. Shares\n * {@link tokenizeAlphaNumeric} with the lexical scorer so the BM25 vocabulary is\n * identical to the rest of search: lowercase, alphanumeric runs, no stop-word\n * removal or stemming (kept deliberately simple and language-agnostic).\n */\nexport function tokenizeBm25(text: string): string[] {\n return tokenizeAlphaNumeric(text);\n}\n\n/**\n * Count occurrences of each token in a token list.\n */\nfunction buildTermFrequencies(tokens: string[]): Map<string, number> {\n const frequencies = new Map<string, number>();\n for (const token of tokens) {\n frequencies.set(token, (frequencies.get(token) ?? 0) + 1);\n }\n return frequencies;\n}\n\n/**\n * Build a BM25 index from a corpus. Computes each document's term frequencies\n * and length, the per-term document frequency, the corpus size, and the average\n * document length. Empty documents (no tokens) are retained with length `0` so\n * they can still be scored (they simply never match a query term). An empty\n * corpus yields an index with `averageDocumentLength` `0`, which\n * {@link scoreBm25Query} handles without dividing by zero.\n */\nexport function buildBm25Index(documents: Bm25Document[]): Bm25Index {\n const stats: Bm25DocumentStats[] = [];\n const documentFrequency = new Map<string, number>();\n let totalLength = 0;\n for (const document of documents) {\n const tokens = tokenizeBm25(document.text);\n const termFrequencies = buildTermFrequencies(tokens);\n totalLength += tokens.length;\n for (const term of termFrequencies.keys()) {\n documentFrequency.set(term, (documentFrequency.get(term) ?? 0) + 1);\n }\n stats.push({ id: document.id, termFrequencies, length: tokens.length });\n }\n const documentCount = stats.length;\n return {\n documents: stats,\n documentFrequency,\n documentCount,\n averageDocumentLength: documentCount > 0 ? totalLength / documentCount : 0,\n };\n}\n\n/**\n * Inverse document frequency for one term using the BM25 \"plus-one\" variant\n * (`ln(1 + (N - n + 0.5) / (n + 0.5))`) used by Lucene. The `1 +` inside the\n * logarithm keeps the IDF strictly non-negative even for a term that appears in\n * every document, so a common term can never subtract from a document's score.\n */\nfunction inverseDocumentFrequency(documentCount: number, termDocumentFrequency: number): number {\n return Math.log(1 + (documentCount - termDocumentFrequency + 0.5) / (termDocumentFrequency + 0.5));\n}\n\n/**\n * Score every document in the index against a query and return an id → score\n * map containing only documents with a strictly positive score (a document that\n * matches no query term is omitted, mirroring the lexical scorer's \"no match →\n * no hit\" contract). Query tokens are de-duplicated so a token repeated in the\n * query does not multiply its own contribution. Returns an empty map for an\n * empty index, an empty query, or a query whose terms appear in no document.\n */\nexport function scoreBm25Query(index: Bm25Index, queryTokens: string[], params: Bm25Params): Map<string, number> {\n const scores = new Map<string, number>();\n // Empty corpus, or a corpus where every document is empty (avgdl 0): no term\n // can match, so return early. Guarding here also guarantees a non-zero\n // average document length below, keeping the length-normalization division\n // safe without an unreachable fallback branch.\n if (index.documentCount === 0 || index.averageDocumentLength === 0) {\n return scores;\n }\n const distinctQueryTerms = [...new Set(queryTokens.filter((token) => token.length > 0))];\n if (distinctQueryTerms.length === 0) {\n return scores;\n }\n // Precompute the IDF for each query term once rather than per document.\n const idfByTerm = new Map<string, number>();\n for (const term of distinctQueryTerms) {\n const termDocumentFrequency = index.documentFrequency.get(term);\n if (termDocumentFrequency === undefined) {\n continue;\n }\n idfByTerm.set(term, inverseDocumentFrequency(index.documentCount, termDocumentFrequency));\n }\n if (idfByTerm.size === 0) {\n return scores;\n }\n for (const document of index.documents) {\n let score = 0;\n for (const [term, idf] of idfByTerm) {\n const termFrequency = document.termFrequencies.get(term);\n if (termFrequency === undefined) {\n continue;\n }\n const lengthNormalization =\n 1 - params.b + (params.b * document.length) / index.averageDocumentLength;\n const denominator = termFrequency + params.k1 * lengthNormalization;\n score += idf * ((termFrequency * (params.k1 + 1)) / denominator);\n }\n if (score > 0) {\n scores.set(document.id, score);\n }\n }\n return scores;\n}\n\n/**\n * Coerce one persisted BM25 parameter to a finite number within `[min, max]`.\n * A finite number is clamped to the range (preserving user intent — e.g.\n * `k1=5000` becomes `1000` rather than being silently ignored); any non-number\n * or non-finite value (string, `NaN`, `Infinity`, missing) falls back to\n * `fallback` so a malformed `settings.json` can never crash or skew scoring.\n */\nfunction resolveClampedParam(candidate: unknown, fallback: number, min: number, max: number): number {\n if (typeof candidate !== \"number\" || !Number.isFinite(candidate)) {\n return fallback;\n }\n return Math.min(max, Math.max(min, candidate));\n}\n\n/**\n * Flatten a structured search-corpus record (the shape produced by\n * `buildSearchCorpus`) into a single whitespace-joined string of its *values*\n * only — field names/object keys are deliberately excluded so corpus-wide keys\n * (`title`, `description`, …) never enter the BM25 vocabulary and skew IDF.\n * Strings and numbers contribute their text; arrays and nested objects (tags,\n * dependencies, the plan corpus) are walked recursively; everything else is\n * dropped.\n */\nexport function flattenSearchCorpusText(corpus: Record<string, unknown>): string {\n const collectValueText = (value: unknown): string[] => {\n if (typeof value === \"string\") {\n return [value];\n }\n if (typeof value === \"number\") {\n return [String(value)];\n }\n if (Array.isArray(value)) {\n return value.flatMap(collectValueText);\n }\n if (typeof value === \"object\" && value !== null) {\n return Object.values(value).flatMap(collectValueText);\n }\n return [];\n };\n return collectValueText(Object.values(corpus)).join(\" \");\n}\n\n/**\n * Resolve the effective BM25 parameters from `settings.search.bm25`, applying\n * {@link DEFAULT_BM25_K1}/{@link DEFAULT_BM25_B} when unset and clamping `k1` to\n * `[0, 1000]` and `b` to `[0, 1]`. Tolerant of partial/invalid config: each\n * knob is resolved independently so one bad value does not discard the other.\n */\nexport function resolveBm25Params(settings: Pick<PmSettings, \"search\"> | undefined): Bm25Params {\n const bm25 = (settings?.search as { bm25?: { k1?: unknown; b?: unknown } } | undefined)?.bm25;\n return {\n k1: resolveClampedParam(bm25?.k1, DEFAULT_BM25_K1, 0, 1_000),\n b: resolveClampedParam(bm25?.b, DEFAULT_BM25_B, 0, 1),\n };\n}\n"],"names":["itemRecord"],"mappings":"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","debugId":"02364b53-8625-5d05-90d9-1234e6d63964"}
|