@unbrained/pm-cli 2026.6.5 → 2026.6.7
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/CHANGELOG.md +77 -0
- package/CONTRIBUTING.md +1 -0
- package/README.md +17 -5
- package/dist/cli/commander-usage.js +74 -4
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/aggregate.d.ts +8 -0
- package/dist/cli/commands/aggregate.js +84 -7
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/calendar.js +10 -3
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/close-many.js +13 -10
- package/dist/cli/commands/close-many.js.map +1 -1
- package/dist/cli/commands/close.d.ts +1 -1
- package/dist/cli/commands/close.js +20 -10
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/completion.js +87 -18
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.d.ts +5 -4
- package/dist/cli/commands/config.js +50 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/contracts.js +6 -3
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/copy.d.ts +14 -0
- package/dist/cli/commands/copy.js +153 -0
- package/dist/cli/commands/copy.js.map +1 -0
- package/dist/cli/commands/extension/doctor.js +62 -2
- package/dist/cli/commands/extension/doctor.js.map +1 -1
- package/dist/cli/commands/extension/install-sources.d.ts +8 -0
- package/dist/cli/commands/extension/install-sources.js +82 -2
- package/dist/cli/commands/extension/install-sources.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +29 -0
- package/dist/cli/commands/extension.js +61 -2
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/gc.d.ts +8 -1
- package/dist/cli/commands/gc.js +26 -3
- package/dist/cli/commands/gc.js.map +1 -1
- package/dist/cli/commands/get.d.ts +9 -0
- package/dist/cli/commands/get.js +23 -2
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.js +15 -2
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-compact.d.ts +39 -0
- package/dist/cli/commands/history-compact.js +262 -0
- package/dist/cli/commands/history-compact.js.map +1 -0
- package/dist/cli/commands/history.d.ts +4 -1
- package/dist/cli/commands/history.js +12 -24
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +3 -0
- package/dist/cli/commands/index.js +5 -2
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/list.d.ts +2 -0
- package/dist/cli/commands/list.js +87 -9
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/reindex.js +8 -4
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/search.d.ts +1 -0
- package/dist/cli/commands/search.js +232 -35
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/stats.d.ts +8 -1
- package/dist/cli/commands/stats.js +18 -17
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/telemetry.d.ts +8 -0
- package/dist/cli/commands/telemetry.js +253 -0
- package/dist/cli/commands/telemetry.js.map +1 -0
- package/dist/cli/error-guidance.js +26 -2
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.d.ts +1 -0
- package/dist/cli/extension-command-help.js +3 -2
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/help-content.js +19 -2
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.js +13 -21
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.js +24 -6
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +52 -17
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +55 -8
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +5 -5
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.js +21 -3
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli-bundle/chunks/activity-5UROHJ3D.js +16 -0
- package/dist/cli-bundle/chunks/{activity-3RWRRNOW.js → activity-YVB3QRTE.js} +11 -11
- package/dist/cli-bundle/chunks/{aggregate-OOAGKWRG.js → aggregate-LH66F75F.js} +87 -17
- package/dist/cli-bundle/chunks/aggregate-LH66F75F.js.map +7 -0
- package/dist/cli-bundle/chunks/{aggregate-J35K7WZB.js → aggregate-OHSWFQJM.js} +88 -18
- package/dist/cli-bundle/chunks/aggregate-OHSWFQJM.js.map +1 -0
- package/dist/cli-bundle/chunks/{append-PNN6UIBZ.js → append-2PPYFAG5.js} +8 -8
- package/dist/cli-bundle/chunks/{append-5JE3YGXU.js → append-AUGT5W6J.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-26KTVXJW.js → chunk-2IF7WLB7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KA24HME7.js → chunk-2IXCHCLM.js} +5 -6
- package/dist/cli-bundle/chunks/chunk-2IXCHCLM.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-XX5LRINW.js → chunk-2OJHLWBZ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ASQM3IF5.js → chunk-3A2CMEM7.js} +5 -4
- package/dist/cli-bundle/chunks/{chunk-S3CV7JGJ.js → chunk-3EOBJOF4.js} +5 -4
- package/dist/cli-bundle/chunks/{chunk-N5YF3VFN.js → chunk-42LOFGJS.js} +91 -16
- package/dist/cli-bundle/chunks/chunk-42LOFGJS.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-WIKR7KFL.js → chunk-4CHEG6UK.js} +108 -21
- package/dist/cli-bundle/chunks/chunk-4CHEG6UK.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-4QCR4QW3.js → chunk-4GHZR3BA.js} +56 -28
- package/dist/cli-bundle/chunks/chunk-4GHZR3BA.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-B3N4TKNL.js → chunk-5AXMRKN5.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-JQI2HE55.js → chunk-6J4K6JLA.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-V3JQ4IPL.js → chunk-6RZXO5M2.js} +102 -22
- package/dist/cli-bundle/chunks/chunk-6RZXO5M2.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-BNL6S7QH.js → chunk-AVJD6VTA.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NQP3ECKF.js → chunk-B2KZGPM2.js} +39 -8
- package/dist/cli-bundle/chunks/chunk-B2KZGPM2.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-RQAWLSUU.js → chunk-B5RF3IP7.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UFCG3SWR.js → chunk-C5W2UH56.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-3OH4DAEB.js → chunk-CKLBZHS7.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-GNHVV4SY.js → chunk-CLD3XNCH.js} +124 -20
- package/dist/cli-bundle/chunks/chunk-CLD3XNCH.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-RANZIID5.js → chunk-FHHBD7PN.js} +38 -7
- package/dist/cli-bundle/chunks/chunk-FHHBD7PN.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GFWHHMVV.js → chunk-FY6Z3FYY.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-CCUFLH4J.js → chunk-GNIUOLZ2.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-ZRVSMOMR.js → chunk-GPXQBR3H.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-SZQCER6S.js → chunk-GUZBNB3G.js} +27 -5
- package/dist/cli-bundle/chunks/chunk-GUZBNB3G.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-GPGAYASV.js → chunk-H7EO3QA3.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-MISYRLEP.js → chunk-HLC3KTLP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KK6YPGH3.js → chunk-HMMMWBK2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4PJQSECJ.js → chunk-HRMHZ4RV.js} +26 -4
- package/dist/cli-bundle/chunks/chunk-HRMHZ4RV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-CJDQB2ED.js → chunk-HV5SSZXF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ATBVS6WW.js → chunk-IMCJBN2Q.js} +23 -14
- package/dist/cli-bundle/chunks/chunk-IMCJBN2Q.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-FVXM3GKS.js → chunk-KNGVP5WJ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-OIQIXTNB.js → chunk-KR6R465K.js} +304 -215
- package/dist/cli-bundle/chunks/chunk-KR6R465K.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-UOVLWB47.js → chunk-LI65XLJR.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-AXXKLVTW.js → chunk-LIN2BPJ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-LMTOY5HE.js +112 -0
- package/dist/cli-bundle/chunks/chunk-LMTOY5HE.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-Y2AKE2HS.js → chunk-LQHBENVW.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-D5X7N6FI.js → chunk-LXO6V66E.js} +14 -14
- package/dist/cli-bundle/chunks/{chunk-TK633IVD.js → chunk-M2PW7EZU.js} +26 -7
- package/dist/cli-bundle/chunks/chunk-M2PW7EZU.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-DFIZGAI5.js → chunk-MOYM2C3J.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-ZQ4F6EC4.js → chunk-MWRS7Z4P.js} +127 -23
- package/dist/cli-bundle/chunks/chunk-MWRS7Z4P.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-5PAOPUZX.js → chunk-NHR2QXXZ.js} +24 -15
- package/dist/cli-bundle/chunks/chunk-NHR2QXXZ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-OUF3ARDX.js → chunk-NQL32HQ5.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-TBQVUNVH.js → chunk-O7HSSFCC.js} +65 -16
- package/dist/cli-bundle/chunks/chunk-O7HSSFCC.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GCAVRLGE.js → chunk-OKSKJKHX.js} +9 -9
- package/dist/cli-bundle/chunks/chunk-QQL5QSTZ.js +1572 -0
- package/dist/cli-bundle/chunks/chunk-QQL5QSTZ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-A6PEXMYN.js → chunk-R3V3YCMH.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-T2ORWB6D.js → chunk-RVPTZKBC.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-K47WAYQV.js → chunk-SFFVGNHC.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-DFUSXJDE.js → chunk-SQPKRA54.js} +14 -14
- package/dist/cli-bundle/chunks/chunk-THDEID2Z.js +115 -0
- package/dist/cli-bundle/chunks/chunk-THDEID2Z.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-G5BACLYH.js → chunk-TINUJMWN.js} +92 -17
- package/dist/cli-bundle/chunks/chunk-TINUJMWN.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-JB4RGL4V.js → chunk-TNPBPNII.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-XG7RJYHV.js → chunk-TP4DDY27.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-ORTLYVA4.js → chunk-TYJJOTUA.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-HZOS2UG5.js → chunk-UAQOQ7IE.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-D3WUNETC.js → chunk-UEWA73ZZ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-O5IBJE6S.js → chunk-UIIQC5YO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SRVKTWPR.js → chunk-UJUT6AHZ.js} +314 -39
- package/dist/cli-bundle/chunks/chunk-UJUT6AHZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-SSFMJCPF.js → chunk-UT6WFXW2.js} +6 -7
- package/dist/cli-bundle/chunks/chunk-UT6WFXW2.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KBG47ZOY.js → chunk-UYQ7HXH4.js} +10 -6
- package/dist/cli-bundle/chunks/chunk-UYQ7HXH4.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-LDJK7SHN.js → chunk-V6EYFTRL.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-5IRA6IYD.js → chunk-WAA7UI6M.js} +58 -30
- package/dist/cli-bundle/chunks/chunk-WAA7UI6M.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-HPH6X4ZZ.js → chunk-WCQZBDDH.js} +10 -6
- package/dist/cli-bundle/chunks/{chunk-HPH6X4ZZ.js.map → chunk-WCQZBDDH.js.map} +2 -2
- package/dist/cli-bundle/chunks/chunk-WR5567FH.js +1582 -0
- package/dist/cli-bundle/chunks/chunk-WR5567FH.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-TQ3ZK6VD.js → chunk-WYEXLDDY.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-4LTBNUYT.js → chunk-X4IZKYHP.js} +307 -32
- package/dist/cli-bundle/chunks/chunk-X4IZKYHP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KCMIYKTA.js → chunk-X7UHMKPE.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-7K24QB23.js → chunk-XS3O2TFJ.js} +27 -8
- package/dist/cli-bundle/chunks/chunk-XS3O2TFJ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-EHXPIKKP.js → chunk-XYNT7UFP.js} +303 -207
- package/dist/cli-bundle/chunks/chunk-XYNT7UFP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-CWT53EYT.js → chunk-YBZW2QQ7.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-VGO2T3TY.js → chunk-YO3THIJF.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-5KB4X7YY.js → chunk-YPH4ESA2.js} +66 -17
- package/dist/cli-bundle/chunks/chunk-YPH4ESA2.js.map +1 -0
- package/dist/cli-bundle/chunks/{claim-ZFA7HKU4.js → claim-BJ4QMPJC.js} +10 -10
- package/dist/cli-bundle/chunks/{claim-AZLP7YFO.js → claim-KW743OSW.js} +10 -10
- package/dist/cli-bundle/chunks/close-P4ZBKODL.js +13 -0
- package/dist/cli-bundle/chunks/{close-65DFYAVS.js → close-SYHSRZDC.js} +8 -8
- package/dist/cli-bundle/chunks/{close-many-UKZSQGM7.js → close-many-DBLEYFOY.js} +29 -26
- package/dist/cli-bundle/chunks/close-many-DBLEYFOY.js.map +7 -0
- package/dist/cli-bundle/chunks/{close-many-AKPZNSGI.js → close-many-LAC5VR4G.js} +30 -27
- package/dist/cli-bundle/chunks/close-many-LAC5VR4G.js.map +1 -0
- package/dist/cli-bundle/chunks/{comments-AGBNSJJH.js → comments-JEO6HHVM.js} +10 -10
- package/dist/cli-bundle/chunks/{comments-CJWXQI7X.js → comments-YT2PQ5DD.js} +10 -10
- package/dist/cli-bundle/chunks/{config-DDPYIA6J.js → config-RZRVS3ZV.js} +127 -11
- package/dist/cli-bundle/chunks/config-RZRVS3ZV.js.map +1 -0
- package/dist/cli-bundle/chunks/{config-5ON3ADRH.js → config-YJSAAADD.js} +128 -12
- package/dist/cli-bundle/chunks/config-YJSAAADD.js.map +7 -0
- package/dist/cli-bundle/chunks/{context-E6U3DWVM.js → context-LGYEEKAW.js} +14 -14
- package/dist/cli-bundle/chunks/{context-E6U3DWVM.js.map → context-LGYEEKAW.js.map} +2 -2
- package/dist/cli-bundle/chunks/{context-ZOJEN5VT.js → context-ZUH5IOOI.js} +15 -15
- package/dist/cli-bundle/chunks/context-ZUH5IOOI.js.map +1 -0
- package/dist/cli-bundle/chunks/{contracts-CXSFM45B.js → contracts-YXJ6NXKH.js} +11 -5
- package/dist/cli-bundle/chunks/contracts-YXJ6NXKH.js.map +7 -0
- package/dist/cli-bundle/chunks/{contracts-LCSX5R53.js → contracts-ZIBXROPE.js} +12 -6
- package/dist/cli-bundle/chunks/contracts-ZIBXROPE.js.map +1 -0
- package/dist/cli-bundle/chunks/copy-BZALX5MQ.js +182 -0
- package/dist/cli-bundle/chunks/copy-BZALX5MQ.js.map +1 -0
- package/dist/cli-bundle/chunks/copy-YPWEIAPD.js +185 -0
- package/dist/cli-bundle/chunks/copy-YPWEIAPD.js.map +7 -0
- package/dist/cli-bundle/chunks/create-4DS2QWQC.js +27 -0
- package/dist/cli-bundle/chunks/{create-WYFKN2U4.js → create-CF7EVRX7.js} +13 -13
- package/dist/cli-bundle/chunks/{delete-ZXWC56WO.js → delete-KR4VBWVE.js} +7 -7
- package/dist/cli-bundle/chunks/{delete-RONNH4F4.js → delete-XLZRTRKR.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-WII3O4HB.js → deps-2YTXD3VM.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-EHXIFOZR.js → deps-GZMFMTGS.js} +7 -7
- package/dist/cli-bundle/chunks/{docs-PDREIMLS.js → docs-SLROFEQ4.js} +9 -9
- package/dist/cli-bundle/chunks/{docs-JMVCFNHH.js → docs-ZHISRR2D.js} +9 -9
- package/dist/cli-bundle/chunks/{extension-G6UXSM5S.js → extension-3C7OOI4F.js} +8 -6
- package/dist/cli-bundle/chunks/{extension-B4ROVWJD.js → extension-XYCUXICD.js} +8 -6
- package/dist/cli-bundle/chunks/{files-2PN7UM2D.js → files-FUWF2FYJ.js} +9 -9
- package/dist/cli-bundle/chunks/{files-MXYS5W4M.js → files-J4I5IU4O.js} +9 -9
- package/dist/cli-bundle/chunks/gc-34NXSNSN.js +362 -0
- package/dist/cli-bundle/chunks/gc-34NXSNSN.js.map +1 -0
- package/dist/cli-bundle/chunks/gc-SPIIZX3A.js +372 -0
- package/dist/cli-bundle/chunks/gc-SPIIZX3A.js.map +7 -0
- package/dist/cli-bundle/chunks/{get-WXMLRG7M.js → get-SZKNRHMA.js} +34 -12
- package/dist/cli-bundle/chunks/get-SZKNRHMA.js.map +1 -0
- package/dist/cli-bundle/chunks/{get-CINFEUIY.js → get-VITKYP6S.js} +33 -11
- package/dist/cli-bundle/chunks/get-VITKYP6S.js.map +7 -0
- package/dist/cli-bundle/chunks/{health-IT5DBPRJ.js → health-4SNTA2TF.js} +27 -13
- package/dist/cli-bundle/chunks/health-4SNTA2TF.js.map +7 -0
- package/dist/cli-bundle/chunks/{health-5VPOJQ53.js → health-7G3EPM57.js} +28 -14
- package/dist/cli-bundle/chunks/health-7G3EPM57.js.map +1 -0
- package/dist/cli-bundle/chunks/{history-FLZIP7PM.js → history-SDAWYZR3.js} +10 -10
- package/dist/cli-bundle/chunks/history-YDUEILKP.js +20 -0
- package/dist/cli-bundle/chunks/history-compact-DMW536VH.js +287 -0
- package/dist/cli-bundle/chunks/history-compact-DMW536VH.js.map +1 -0
- package/dist/cli-bundle/chunks/history-compact-POTZGG7K.js +290 -0
- package/dist/cli-bundle/chunks/history-compact-POTZGG7K.js.map +7 -0
- package/dist/cli-bundle/chunks/{history-redact-SSZBAD76.js → history-redact-EPJ7GENL.js} +11 -11
- package/dist/cli-bundle/chunks/history-redact-KASLLPE7.js +19 -0
- package/dist/cli-bundle/chunks/{history-repair-X7CO5JJZ.js → history-repair-IJ7LLBET.js} +11 -11
- package/dist/cli-bundle/chunks/{history-repair-KC5ZOJRZ.js → history-repair-YNESJRT6.js} +11 -11
- package/dist/cli-bundle/chunks/init-IGSS4GNH.js +17 -0
- package/dist/cli-bundle/chunks/{init-6MRFVOLH.js → init-YHVBTEET.js} +9 -8
- package/dist/cli-bundle/chunks/{learnings-DCX55BNX.js → learnings-4YBMIVCZ.js} +10 -10
- package/dist/cli-bundle/chunks/{learnings-A3CLB5CO.js → learnings-T4PF24YN.js} +10 -10
- package/dist/cli-bundle/chunks/{list-DBRECOG4.js → list-3KEVBOYW.js} +10 -10
- package/dist/cli-bundle/chunks/list-E44O2K64.js +20 -0
- package/dist/cli-bundle/chunks/{notes-42LIC3UE.js → notes-FLUCNJSH.js} +10 -10
- package/dist/cli-bundle/chunks/{notes-P5O3VMQ3.js → notes-GJKALVZM.js} +10 -10
- package/dist/cli-bundle/chunks/{plan-HDQXEUKD.js → plan-T5MMZLI3.js} +13 -13
- package/dist/cli-bundle/chunks/{plan-IGTE3WOJ.js → plan-YYMIL3HV.js} +13 -13
- package/dist/cli-bundle/chunks/{register-list-query-EMNSIUO4.js → register-list-query-I65EZ3HB.js} +33 -27
- package/dist/cli-bundle/chunks/register-list-query-I65EZ3HB.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-list-query-AG3XKXWL.js → register-list-query-OECMHO4G.js} +32 -26
- package/dist/cli-bundle/chunks/register-list-query-OECMHO4G.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-M3YS6XDO.js → register-mutation-2FLXORLR.js} +65 -47
- package/dist/cli-bundle/chunks/register-mutation-2FLXORLR.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-mutation-RSMT6DPK.js → register-mutation-5GPDEKHR.js} +64 -46
- package/dist/cli-bundle/chunks/register-mutation-5GPDEKHR.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-operations-KYUOOOOD.js → register-operations-BNGAUMGK.js} +71 -35
- package/dist/cli-bundle/chunks/register-operations-BNGAUMGK.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-operations-Q54JQZUN.js → register-operations-GQKT35H5.js} +70 -34
- package/dist/cli-bundle/chunks/register-operations-GQKT35H5.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-setup-DI6P7X75.js → register-setup-DNDCGZ4O.js} +18 -18
- package/dist/cli-bundle/chunks/{register-setup-DI6P7X75.js.map → register-setup-DNDCGZ4O.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-setup-YJKIQRKA.js → register-setup-EJY44FPH.js} +17 -17
- package/dist/cli-bundle/chunks/{register-setup-YJKIQRKA.js.map → register-setup-EJY44FPH.js.map} +2 -2
- package/dist/cli-bundle/chunks/{restore-2XVTBLKQ.js → restore-DDJGVZIN.js} +11 -11
- package/dist/cli-bundle/chunks/restore-SJSASGZP.js +17 -0
- package/dist/cli-bundle/chunks/{schema-V6BX65Q2.js → schema-B7NQ6XVP.js} +8 -8
- package/dist/cli-bundle/chunks/{schema-LVXZWFGY.js → schema-HEGYH6CE.js} +8 -8
- package/dist/cli-bundle/chunks/{search-C7NPB7G7.js → search-DVVQ4UO2.js} +421 -42
- package/dist/cli-bundle/chunks/search-DVVQ4UO2.js.map +1 -0
- package/dist/cli-bundle/chunks/{search-5A3BMFA7.js → search-JNEZJV7H.js} +427 -41
- package/dist/cli-bundle/chunks/search-JNEZJV7H.js.map +7 -0
- package/dist/cli-bundle/chunks/stats-7JDIJRDH.js +202 -0
- package/dist/cli-bundle/chunks/stats-7JDIJRDH.js.map +1 -0
- package/dist/cli-bundle/chunks/stats-SYTJRR4Z.js +212 -0
- package/dist/cli-bundle/chunks/stats-SYTJRR4Z.js.map +7 -0
- package/dist/cli-bundle/chunks/telemetry-4HHWD5Y7.js +251 -0
- package/dist/cli-bundle/chunks/telemetry-4HHWD5Y7.js.map +7 -0
- package/dist/cli-bundle/chunks/telemetry-EGWP7ZUX.js +248 -0
- package/dist/cli-bundle/chunks/telemetry-EGWP7ZUX.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-OFYONO3C.js → test-IIELLSZX.js} +14 -13
- package/dist/cli-bundle/chunks/test-ML5RLWXE.js +32 -0
- package/dist/cli-bundle/chunks/{test-all-EEMKNTGU.js → test-all-7DNCMML7.js} +14 -13
- package/dist/cli-bundle/chunks/{test-all-EEMKNTGU.js.map → test-all-7DNCMML7.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-all-OJE6CIO7.js → test-all-IHTUJRRC.js} +16 -15
- package/dist/cli-bundle/chunks/{test-all-OJE6CIO7.js.map → test-all-IHTUJRRC.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-runs-IPOPFOAF.js → test-runs-5FEMBV3A.js} +5 -5
- package/dist/cli-bundle/chunks/{test-runs-L2M7WKH7.js → test-runs-RNKZ37PS.js} +5 -5
- package/dist/cli-bundle/chunks/update-6C67X4KS.js +21 -0
- package/dist/cli-bundle/chunks/update-VF26YPT3.js +25 -0
- package/dist/cli-bundle/chunks/{update-many-322CCH2L.js → update-many-BSZZZYXY.js} +22 -22
- package/dist/cli-bundle/chunks/{update-many-DYWGW57M.js → update-many-BWKJJEBF.js} +22 -22
- package/dist/cli-bundle/chunks/{upgrade-3W3RVSNM.js → upgrade-RSE5PC44.js} +7 -6
- package/dist/cli-bundle/chunks/{upgrade-3W3RVSNM.js.map → upgrade-RSE5PC44.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-2U727SAM.js → upgrade-YWI5DJFA.js} +5 -4
- package/dist/cli-bundle/chunks/{upgrade-2U727SAM.js.map → upgrade-YWI5DJFA.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-ZFVWPEEN.js → validate-NK3WKB7C.js} +18 -17
- package/dist/cli-bundle/chunks/{validate-ZFVWPEEN.js.map → validate-NK3WKB7C.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-GZ24NYHO.js → validate-UCEOB7S6.js} +20 -19
- package/dist/cli-bundle/chunks/{validate-GZ24NYHO.js.map → validate-UCEOB7S6.js.map} +1 -1
- package/dist/cli-bundle/main.js +198 -1523
- package/dist/cli-bundle/main.js.map +4 -4
- package/dist/core/config/nested-settings.d.ts +8 -6
- package/dist/core/config/nested-settings.js +71 -5
- package/dist/core/config/nested-settings.js.map +1 -1
- package/dist/core/config/positional-value.js +4 -2
- package/dist/core/config/positional-value.js.map +1 -1
- package/dist/core/extensions/extension-types.d.ts +36 -0
- package/dist/core/extensions/extension-types.js +2 -2
- package/dist/core/extensions/extension-types.js.map +1 -1
- package/dist/core/extensions/loader.js +46 -5
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/history/drift-scan.d.ts +3 -4
- package/dist/core/history/drift-scan.js +71 -18
- package/dist/core/history/drift-scan.js.map +1 -1
- package/dist/core/history/history-diff.d.ts +47 -0
- package/dist/core/history/history-diff.js +152 -0
- package/dist/core/history/history-diff.js.map +1 -0
- package/dist/core/history/history-storage-stats.d.ts +31 -0
- package/dist/core/history/history-storage-stats.js +101 -0
- package/dist/core/history/history-storage-stats.js.map +1 -0
- package/dist/core/item/id.js +4 -5
- package/dist/core/item/id.js.map +1 -1
- package/dist/core/item/item-format.js +7 -3
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/toon-decode.d.ts +7 -0
- package/dist/core/item/toon-decode.js +11 -2
- package/dist/core/item/toon-decode.js.map +1 -1
- package/dist/core/item/type-registry.js +25 -7
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/lock/lock-gc.d.ts +46 -0
- package/dist/core/lock/lock-gc.js +194 -0
- package/dist/core/lock/lock-gc.js.map +1 -0
- package/dist/core/search/cache.js +5 -3
- package/dist/core/search/cache.js.map +1 -1
- package/dist/core/search/corpus.d.ts +6 -0
- package/dist/core/search/corpus.js +22 -9
- package/dist/core/search/corpus.js.map +1 -1
- package/dist/core/search/embedding-batches.js +10 -7
- package/dist/core/search/embedding-batches.js.map +1 -1
- package/dist/core/search/relevance.d.ts +29 -0
- package/dist/core/search/relevance.js +226 -0
- package/dist/core/search/relevance.js.map +1 -0
- package/dist/core/search/vector-stores.d.ts +3 -0
- package/dist/core/search/vector-stores.js +23 -10
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/shared/constants.js +15 -2
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/shared/errors.d.ts +6 -0
- package/dist/core/shared/errors.js +2 -2
- package/dist/core/shared/errors.js.map +1 -1
- package/dist/core/shared/primitives.d.ts +8 -0
- package/dist/core/shared/primitives.js +29 -2
- package/dist/core/shared/primitives.js.map +1 -1
- package/dist/core/shared/serial-queue.d.ts +12 -0
- package/dist/core/shared/serial-queue.js +43 -0
- package/dist/core/shared/serial-queue.js.map +1 -0
- package/dist/core/shared/time.js +42 -6
- package/dist/core/shared/time.js.map +1 -1
- package/dist/core/store/paths.js +25 -7
- package/dist/core/store/paths.js.map +1 -1
- package/dist/core/store/settings-validator.d.ts +11 -0
- package/dist/core/store/settings-validator.js +14 -2
- package/dist/core/store/settings-validator.js.map +1 -1
- package/dist/core/store/settings.d.ts +19 -1
- package/dist/core/store/settings.js +199 -17
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/observability.js +3 -3
- package/dist/core/telemetry/observability.js.map +1 -1
- package/dist/core/telemetry/runtime.js +99 -6
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +187 -42
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts/commander-types.d.ts +1 -0
- package/dist/sdk/cli-contracts/commander-types.js +13 -2
- package/dist/sdk/cli-contracts/commander-types.js.map +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +2 -2
- package/dist/sdk/cli-contracts/enum-contracts.js +8 -2
- package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.js +7 -2
- package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +39 -7
- package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +26 -1
- package/dist/sdk/cli-contracts.js +75 -11
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/index.d.ts +2 -2
- package/dist/sdk/index.js +3 -3
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/testing.d.ts +51 -1
- package/dist/sdk/testing.js +93 -2
- package/dist/sdk/testing.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/ARCHITECTURE.md +11 -1
- package/docs/CLAUDE_CODE_PLUGIN.md +4 -4
- package/docs/CODEX_PLUGIN.md +1 -1
- package/docs/COMMANDS.md +42 -4
- package/docs/CONFIGURATION.md +31 -2
- package/docs/EXTENSIONS.md +28 -8
- package/docs/EXTENSION_AUTHOR_CONTRACTS.md +73 -0
- package/docs/ONBOARDING.md +165 -0
- package/docs/QUICKSTART.md +2 -2
- package/docs/README.md +12 -4
- package/docs/RELEASING.md +36 -1
- package/docs/SDK.md +66 -0
- package/docs/TESTING.md +33 -1
- package/package.json +6 -2
- package/packages/pm-governance-audit/README.md +14 -0
- package/packages/pm-governance-audit/extensions/governance-audit/index.js +39 -1
- package/packages/pm-governance-audit/extensions/governance-audit/index.ts +40 -2
- package/packages/pm-governance-audit/extensions/governance-audit/manifest.json +1 -1
- package/packages/pm-governance-audit/package.json +4 -2
- package/packages/pm-lifecycle-hooks/README.md +21 -0
- package/packages/pm-search-advanced/README.md +38 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +17 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +17 -0
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +216 -1
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +271 -2
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/README.md +11 -8
- package/plugins/pm-claude/agents/pm-coordinator.md +1 -1
- package/plugins/pm-claude/commands/pm-init.md +1 -1
- package/plugins/pm-codex/README.md +1 -1
- package/dist/cli-bundle/chunks/activity-P5BUMWP3.js +0 -16
- package/dist/cli-bundle/chunks/aggregate-J35K7WZB.js.map +0 -1
- package/dist/cli-bundle/chunks/aggregate-OOAGKWRG.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-4LTBNUYT.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-4PJQSECJ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-4QCR4QW3.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-5IRA6IYD.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-5KB4X7YY.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-5PAOPUZX.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7K24QB23.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-ATBVS6WW.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-EHXPIKKP.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-G5BACLYH.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-GNHVV4SY.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-KA24HME7.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-KBG47ZOY.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-N5YF3VFN.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-NQP3ECKF.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-OIQIXTNB.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-RANZIID5.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-SRVKTWPR.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-SSFMJCPF.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-SZQCER6S.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-TBQVUNVH.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-TK633IVD.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-V3JQ4IPL.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-WIKR7KFL.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZQ4F6EC4.js.map +0 -7
- package/dist/cli-bundle/chunks/close-RMHQ3KWH.js +0 -13
- package/dist/cli-bundle/chunks/close-many-AKPZNSGI.js.map +0 -1
- package/dist/cli-bundle/chunks/close-many-UKZSQGM7.js.map +0 -7
- package/dist/cli-bundle/chunks/config-5ON3ADRH.js.map +0 -7
- package/dist/cli-bundle/chunks/config-DDPYIA6J.js.map +0 -1
- package/dist/cli-bundle/chunks/context-ZOJEN5VT.js.map +0 -1
- package/dist/cli-bundle/chunks/contracts-CXSFM45B.js.map +0 -7
- package/dist/cli-bundle/chunks/contracts-LCSX5R53.js.map +0 -1
- package/dist/cli-bundle/chunks/create-ATONSAZW.js +0 -27
- package/dist/cli-bundle/chunks/gc-GT552UJH.js +0 -178
- package/dist/cli-bundle/chunks/gc-GT552UJH.js.map +0 -1
- package/dist/cli-bundle/chunks/gc-QNBRJG6H.js +0 -181
- package/dist/cli-bundle/chunks/gc-QNBRJG6H.js.map +0 -7
- package/dist/cli-bundle/chunks/get-CINFEUIY.js.map +0 -7
- package/dist/cli-bundle/chunks/get-WXMLRG7M.js.map +0 -1
- package/dist/cli-bundle/chunks/health-5VPOJQ53.js.map +0 -1
- package/dist/cli-bundle/chunks/health-IT5DBPRJ.js.map +0 -7
- package/dist/cli-bundle/chunks/history-6FC4H6HI.js +0 -20
- package/dist/cli-bundle/chunks/history-redact-XKYEZDBL.js +0 -19
- package/dist/cli-bundle/chunks/init-KHX3FEEM.js +0 -16
- package/dist/cli-bundle/chunks/list-53LZ2AEO.js +0 -20
- package/dist/cli-bundle/chunks/register-list-query-AG3XKXWL.js.map +0 -7
- package/dist/cli-bundle/chunks/register-list-query-EMNSIUO4.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-M3YS6XDO.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-RSMT6DPK.js.map +0 -7
- package/dist/cli-bundle/chunks/register-operations-KYUOOOOD.js.map +0 -1
- package/dist/cli-bundle/chunks/register-operations-Q54JQZUN.js.map +0 -7
- package/dist/cli-bundle/chunks/restore-JL5QIH7H.js +0 -17
- package/dist/cli-bundle/chunks/search-5A3BMFA7.js.map +0 -7
- package/dist/cli-bundle/chunks/search-C7NPB7G7.js.map +0 -1
- package/dist/cli-bundle/chunks/stats-FNLYVXTB.js +0 -120
- package/dist/cli-bundle/chunks/stats-FNLYVXTB.js.map +0 -1
- package/dist/cli-bundle/chunks/stats-Y2CBTZSL.js +0 -123
- package/dist/cli-bundle/chunks/stats-Y2CBTZSL.js.map +0 -7
- package/dist/cli-bundle/chunks/test-RJ4ZF35X.js +0 -31
- package/dist/cli-bundle/chunks/update-6YEHPVXH.js +0 -25
- package/dist/cli-bundle/chunks/update-PYLVHMRD.js +0 -21
- /package/dist/cli-bundle/chunks/{activity-P5BUMWP3.js.map → activity-5UROHJ3D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-3RWRRNOW.js.map → activity-YVB3QRTE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-PNN6UIBZ.js.map → append-2PPYFAG5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-5JE3YGXU.js.map → append-AUGT5W6J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-26KTVXJW.js.map → chunk-2IF7WLB7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XX5LRINW.js.map → chunk-2OJHLWBZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ASQM3IF5.js.map → chunk-3A2CMEM7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-S3CV7JGJ.js.map → chunk-3EOBJOF4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-B3N4TKNL.js.map → chunk-5AXMRKN5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JQI2HE55.js.map → chunk-6J4K6JLA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BNL6S7QH.js.map → chunk-AVJD6VTA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RQAWLSUU.js.map → chunk-B5RF3IP7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UFCG3SWR.js.map → chunk-C5W2UH56.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3OH4DAEB.js.map → chunk-CKLBZHS7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GFWHHMVV.js.map → chunk-FY6Z3FYY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CCUFLH4J.js.map → chunk-GNIUOLZ2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ZRVSMOMR.js.map → chunk-GPXQBR3H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GPGAYASV.js.map → chunk-H7EO3QA3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MISYRLEP.js.map → chunk-HLC3KTLP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KK6YPGH3.js.map → chunk-HMMMWBK2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CJDQB2ED.js.map → chunk-HV5SSZXF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FVXM3GKS.js.map → chunk-KNGVP5WJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UOVLWB47.js.map → chunk-LI65XLJR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AXXKLVTW.js.map → chunk-LIN2BPJ7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Y2AKE2HS.js.map → chunk-LQHBENVW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D5X7N6FI.js.map → chunk-LXO6V66E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DFIZGAI5.js.map → chunk-MOYM2C3J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OUF3ARDX.js.map → chunk-NQL32HQ5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GCAVRLGE.js.map → chunk-OKSKJKHX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-A6PEXMYN.js.map → chunk-R3V3YCMH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-T2ORWB6D.js.map → chunk-RVPTZKBC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-K47WAYQV.js.map → chunk-SFFVGNHC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DFUSXJDE.js.map → chunk-SQPKRA54.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JB4RGL4V.js.map → chunk-TNPBPNII.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XG7RJYHV.js.map → chunk-TP4DDY27.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ORTLYVA4.js.map → chunk-TYJJOTUA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HZOS2UG5.js.map → chunk-UAQOQ7IE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D3WUNETC.js.map → chunk-UEWA73ZZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-O5IBJE6S.js.map → chunk-UIIQC5YO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LDJK7SHN.js.map → chunk-V6EYFTRL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TQ3ZK6VD.js.map → chunk-WYEXLDDY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KCMIYKTA.js.map → chunk-X7UHMKPE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CWT53EYT.js.map → chunk-YBZW2QQ7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VGO2T3TY.js.map → chunk-YO3THIJF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-ZFA7HKU4.js.map → claim-BJ4QMPJC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-AZLP7YFO.js.map → claim-KW743OSW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-RMHQ3KWH.js.map → close-P4ZBKODL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-65DFYAVS.js.map → close-SYHSRZDC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-AGBNSJJH.js.map → comments-JEO6HHVM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-CJWXQI7X.js.map → comments-YT2PQ5DD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-ATONSAZW.js.map → create-4DS2QWQC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-WYFKN2U4.js.map → create-CF7EVRX7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-ZXWC56WO.js.map → delete-KR4VBWVE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-RONNH4F4.js.map → delete-XLZRTRKR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-WII3O4HB.js.map → deps-2YTXD3VM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-EHXIFOZR.js.map → deps-GZMFMTGS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-PDREIMLS.js.map → docs-SLROFEQ4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-JMVCFNHH.js.map → docs-ZHISRR2D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-G6UXSM5S.js.map → extension-3C7OOI4F.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-B4ROVWJD.js.map → extension-XYCUXICD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-2PN7UM2D.js.map → files-FUWF2FYJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-MXYS5W4M.js.map → files-J4I5IU4O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-FLZIP7PM.js.map → history-SDAWYZR3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-6FC4H6HI.js.map → history-YDUEILKP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-SSZBAD76.js.map → history-redact-EPJ7GENL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-XKYEZDBL.js.map → history-redact-KASLLPE7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-X7CO5JJZ.js.map → history-repair-IJ7LLBET.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-KC5ZOJRZ.js.map → history-repair-YNESJRT6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-KHX3FEEM.js.map → init-IGSS4GNH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-6MRFVOLH.js.map → init-YHVBTEET.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-DCX55BNX.js.map → learnings-4YBMIVCZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-A3CLB5CO.js.map → learnings-T4PF24YN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-DBRECOG4.js.map → list-3KEVBOYW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-53LZ2AEO.js.map → list-E44O2K64.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-42LIC3UE.js.map → notes-FLUCNJSH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-P5O3VMQ3.js.map → notes-GJKALVZM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-HDQXEUKD.js.map → plan-T5MMZLI3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-IGTE3WOJ.js.map → plan-YYMIL3HV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-2XVTBLKQ.js.map → restore-DDJGVZIN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-JL5QIH7H.js.map → restore-SJSASGZP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-V6BX65Q2.js.map → schema-B7NQ6XVP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-LVXZWFGY.js.map → schema-HEGYH6CE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-OFYONO3C.js.map → test-IIELLSZX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-RJ4ZF35X.js.map → test-ML5RLWXE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-IPOPFOAF.js.map → test-runs-5FEMBV3A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-L2M7WKH7.js.map → test-runs-RNKZ37PS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-PYLVHMRD.js.map → update-6C67X4KS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-6YEHPVXH.js.map → update-VF26YPT3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-322CCH2L.js.map → update-many-BSZZZYXY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-DYWGW57M.js.map → update-many-BWKJJEBF.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../cli/commands/search.ts", "../../../../../../../../core/extensions/runtime-registrations.ts", "../../../../../../../../core/shared/text-normalization.ts", "../../../../../../../../core/search/relevance.ts"],
|
|
4
|
+
"sourcesContent": ["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { coerceNumberInRange, toNonEmptyStringOrUndefined } from \"../../core/shared/primitives.js\";\nimport { isPathWithinDirectory } from \"../../core/fs/path-utils.js\";\nimport { getActiveExtensionRegistrations, runActiveOnReadHooks } from \"../../core/extensions/index.js\";\nimport { collectRegisteredItemFieldNames } from \"../../core/extensions/item-fields.js\";\nimport {\n resolveRegisteredSearchProvider,\n resolveRegisteredVectorStoreAdapter,\n} from \"../../core/extensions/runtime-registrations.js\";\nimport { resolveItemTypeRegistry, type ItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { parseLimit, parsePriority, parseType } from \"../shared-parsers.js\";\nimport {\n executeEmbeddingRequest,\n resolveEmbeddingProviders,\n type EmbeddingProviderConfig,\n type EmbeddingProviderResolution,\n} from \"../../core/search/providers.js\";\nimport {\n buildDeterministicQueryExpansions,\n mergeQueryExpansions,\n normalizeQueryExpansionOutput,\n normalizeRerankOutput,\n rerankCandidatesWithEmbeddings,\n resolveQueryExpansionConfig,\n resolveRerankConfig,\n type QueryExpansionConfig,\n type RerankCandidate,\n type RerankConfig,\n} from \"../../core/search/relevance.js\";\nimport { resolveSettingsWithSemanticRuntimeDefaults } from \"../../core/search/semantic-defaults.js\";\nimport {\n executeVectorQuery,\n resolveVectorStores,\n type VectorQueryHit,\n type VectorStoreConfig,\n type VectorStoreResolution,\n} from \"../../core/search/vector-stores.js\";\nimport { readVectorizationStatusLedger } from \"../../core/search/cache.js\";\nimport { buildEventCorpus, buildPlanFlatCorpus, buildReminderCorpus } from \"../../core/search/corpus.js\";\nimport { collectStaleVectorizationIds } from \"../../core/search/staleness.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { parseItemDocument } from \"../../core/item/item-format.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { isTerminalStatus } from \"../../core/item/status.js\";\nimport { parseStatusFilterCsv } from \"../../core/item/status-filter.js\";\nimport { collectRuntimeFilterValues, matchesRuntimeFilters } from \"../../core/schema/runtime-field-filters.js\";\nimport {\n resolveRuntimeFieldRegistry,\n resolveRuntimeStatusRegistry,\n type RuntimeFieldRegistry,\n type RuntimeStatusRegistry,\n} from \"../../core/schema/runtime-schema.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { tokenizeAlphaNumeric } from \"../../core/shared/text-normalization.js\";\nimport { compareTimestampStrings, nowIso, resolveIsoOrRelative } from \"../../core/shared/time.js\";\nimport { listAllDocumentCandidatesCached } from \"../../core/store/front-matter-cache.js\";\nimport { listAllFrontMatter } from \"../../core/store/item-store.js\";\nimport { getItemPath, getSettingsPath, resolveGlobalPmRoot, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemDocument, ItemFormat, ItemFrontMatter, ItemStatus, ItemType, PmSettings } from \"../../types/index.js\";\n\nexport interface SearchOptions {\n mode?: string;\n semanticWeight?: string | number;\n includeLinked?: boolean;\n titleExact?: boolean;\n phraseExact?: boolean;\n status?: string;\n type?: string;\n tag?: string;\n priority?: string;\n deadlineBefore?: string;\n deadlineAfter?: string;\n limit?: string;\n compact?: boolean;\n full?: boolean;\n fields?: string;\n [key: string]: unknown;\n}\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\"]);\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;\nconst IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS = 8_000;\nconst IMPLICIT_HYBRID_VECTOR_TIMEOUT_MS = 8_000;\n\nexport interface SearchHit {\n item: ItemFrontMatter;\n score: number;\n matched_fields: string[];\n}\n\nexport type SearchResultItem = SearchHit | Record<string, unknown>;\n\nexport interface SearchResult {\n query: string;\n mode: SearchMode;\n items: SearchResultItem[];\n count: number;\n filters: Record<string, unknown>;\n projection: {\n mode: SearchProjectionMode;\n fields: string[] | null;\n };\n now: string;\n warnings?: string[];\n}\n\ninterface ExtensionSearchProviderContext {\n query: string;\n mode: SearchMode;\n tokens: string[];\n options: SearchOptions;\n settings: PmSettings;\n documents: ItemDocument[];\n}\n\ninterface ExtensionSearchProviderHit {\n id: string;\n score: number;\n matched_fields?: string[];\n}\n\ntype ExtensionSearchProviderQuery = (\n context: ExtensionSearchProviderContext,\n) => Promise<ExtensionSearchProviderHit[] | { hits?: ExtensionSearchProviderHit[] }> | ExtensionSearchProviderHit[] | { hits?: ExtensionSearchProviderHit[] };\n\ninterface ExtensionSearchProviderQueryExpansionContext {\n query: string;\n mode: Exclude<SearchMode, \"keyword\">;\n settings: PmSettings;\n}\n\ntype ExtensionSearchProviderQueryExpansion = (\n context: ExtensionSearchProviderQueryExpansionContext,\n) => Promise<string[] | { queries?: string[] }> | string[] | { queries?: string[] };\n\ninterface ExtensionSearchProviderRerankCandidate {\n id: string;\n text: string;\n score: number;\n}\n\ninterface ExtensionSearchProviderRerankContext {\n query: string;\n mode: \"hybrid\";\n model: string;\n top_k: number;\n settings: PmSettings;\n candidates: ExtensionSearchProviderRerankCandidate[];\n}\n\ntype ExtensionSearchProviderRerank = (\n context: ExtensionSearchProviderRerankContext,\n) => Promise<Array<{ id?: unknown; score?: unknown }> | { hits?: Array<{ id?: unknown; score?: unknown }> }>\n | Array<{ id?: unknown; score?: unknown }>\n | { hits?: Array<{ id?: unknown; score?: unknown }> };\n\ntype ExtensionVectorQuery = (\n context: {\n vector: number[];\n limit: number;\n settings: PmSettings;\n },\n) => Promise<VectorQueryHit[]> | VectorQueryHit[];\n\ntype ExtensionVectorAdapter = {\n query?: ExtensionVectorQuery;\n};\n\n\n\ninterface SearchModeContext {\n hasProvider: boolean;\n hasVectorStore: boolean;\n}\n\ntype ImplicitSemanticFallbackReason = \"timeout\" | \"connection\" | \"error\";\n\n/**\n * Aggregate the `code` strings found along an error's `cause` chain.\n *\n * undici (Node's fetch) collapses connection errors to the generic message\n * \"fetch failed\" and stashes the real syscall code (e.g. `ECONNREFUSED`) on\n * `error.cause.code`. Walking the chain (bounded depth) lets the fallback\n * classifier label a downed/unreachable Ollama backend as \"connection\" rather\n * than the catch-all \"error\".\n */\nexport function collectErrorCauseCodes(error: unknown): string {\n const codes: string[] = [];\n let current: unknown = error;\n for (let depth = 0; depth < 5 && current && typeof current === \"object\"; depth += 1) {\n const code = (current as { code?: unknown }).code;\n if (typeof code === \"string\") {\n codes.push(code.toLowerCase());\n }\n current = (current as { cause?: unknown }).cause;\n }\n return codes.join(\" \");\n}\n\n/**\n * Classify why an implicit/explicit semantic search degraded to keyword mode,\n * inspecting both the error message and the {@link collectErrorCauseCodes} chain\n * so undici's generic \"fetch failed\" is recognised as a connection failure.\n */\nexport function classifyImplicitSemanticFallbackReason(error: unknown): ImplicitSemanticFallbackReason {\n const message = (error instanceof Error ? error.message : String(error)).toLowerCase();\n const causeCodes = collectErrorCauseCodes(error);\n const haystack = `${message} ${causeCodes}`;\n if (haystack.includes(\"timed out\") || haystack.includes(\"timeout\") || haystack.includes(\"etimedout\")) {\n return \"timeout\";\n }\n if (\n haystack.includes(\"econnrefused\") ||\n haystack.includes(\"connection refused\") ||\n haystack.includes(\"connect \") ||\n haystack.includes(\"enotfound\") ||\n haystack.includes(\"eai_again\") ||\n haystack.includes(\"econnreset\") ||\n haystack.includes(\"fetch failed\")\n ) {\n return \"connection\";\n }\n return \"error\";\n}\n\nfunction buildImplicitSemanticFallbackWarning(error: unknown): string {\n const reason = classifyImplicitSemanticFallbackReason(error);\n if (reason === \"timeout\") {\n return \"search_implicit_semantic_fallback:timeout:using_keyword_mode\";\n }\n if (reason === \"connection\") {\n return \"search_implicit_semantic_fallback:connection:using_keyword_mode\";\n }\n return \"search_implicit_semantic_fallback:error:using_keyword_mode\";\n}\n\n// Explicit --semantic/--hybrid searches must never hard-fail an agent when the\n// embedding/vector backend is unreachable or unconfigured: degrade to keyword\n// search and surface a machine-readable warning instead of an unknown_error.\nfunction buildExplicitSemanticFallbackWarning(requestedMode: SearchMode, error: unknown): string {\n const reason = classifyImplicitSemanticFallbackReason(error);\n return `search_${requestedMode}_fallback:${reason}:using_keyword_mode`;\n}\n\n/**\n * Compare the vectorization-status ledger against the filtered corpus and, when\n * the vector index is behind, emit a one-line stderr warning plus a structured\n * `vector_index_stale:N` entry in the JSON warnings array. Best-effort: ledger\n * read failures fall through silently — the existing semantic/hybrid fallback\n * paths cover backend errors.\n */\nasync function maybeEmitVectorIndexStaleWarning(\n pmRoot: string,\n filteredDocuments: ItemDocument[],\n warnings: string[],\n): Promise<void> {\n try {\n const ledger = await readVectorizationStatusLedger(pmRoot);\n if (ledger.warnings.length > 0) {\n warnings.push(...ledger.warnings);\n }\n const staleIds = collectStaleVectorizationIds(\n filteredDocuments.map((document) => ({\n id: document.metadata.id,\n updated_at: document.metadata.updated_at,\n })),\n ledger.entries,\n );\n if (staleIds.length === 0) {\n return;\n }\n warnings.push(`vector_index_stale:${staleIds.length}`);\n 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 } 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 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\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\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\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === \"string\") : [];\n}\n\nfunction textEntries(value: unknown): Array<{ text: string }> {\n return Array.isArray(value)\n ? value.filter((entry): entry is { text: string } =>\n typeof entry === \"object\" && entry !== null && typeof (entry as { text?: unknown }).text === \"string\",\n )\n : [];\n}\n\nfunction dependencyEntries(value: unknown): Array<{ id: string; kind: string }> {\n return Array.isArray(value)\n ? value.filter((entry): entry is { id: string; kind: string } =>\n typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as { id?: unknown }).id === \"string\" &&\n typeof (entry as { kind?: unknown }).kind === \"string\",\n )\n : [];\n}\n\nfunction collectExactPhraseFields(document: ItemDocument): string[] {\n const item = document.metadata;\n return [\n item.title,\n item.description,\n item.status,\n stringArray(item.tags).join(\" \"),\n document.body,\n textEntries(item.comments).map((entry) => entry.text).join(\" \"),\n textEntries(item.notes).map((entry) => entry.text).join(\" \"),\n textEntries(item.learnings).map((entry) => entry.text).join(\" \"),\n buildReminderCorpus(item).join(\" \"),\n buildEventCorpus(item).join(\" \"),\n dependencyEntries(item.dependencies).map((entry) => `${entry.id} ${entry.kind}`).join(\" \"),\n buildPlanFlatCorpus(item),\n ];\n}\n\nfunction documentContainsExactPhrase(document: ItemDocument, normalizedQuery: string): boolean {\n return collectExactPhraseFields(document).some((fieldValue) =>\n normalizeSearchPhrase(fieldValue).includes(normalizedQuery),\n );\n}\n\nfunction applyExactQueryFilters(\n items: ItemDocument[],\n normalizedQuery: string,\n options: { titleExact: boolean; phraseExact: boolean },\n): ItemDocument[] {\n if (!options.titleExact && !options.phraseExact) {\n return items;\n }\n return items.filter((document) => {\n if (options.titleExact && normalizeSearchPhrase(document.metadata.title) !== normalizedQuery) {\n return false;\n }\n if (options.phraseExact && !documentContainsExactPhrase(document, normalizedQuery)) {\n return false;\n }\n return true;\n });\n}\n\nfunction applyFilters(\n items: ItemDocument[],\n options: SearchOptions,\n typeRegistry: ItemTypeRegistry,\n runtimeFieldFilters: Record<string, unknown>,\n statusFilter: ItemStatus[] | undefined,\n): ItemDocument[] {\n const typeFilter = parseType(options.type, typeRegistry);\n const tagFilter = options.tag?.trim().toLowerCase();\n const priorityFilter = parsePriority(options.priority);\n const deadlineBefore = parseDeadline(options.deadlineBefore, \"deadline-before\");\n const deadlineAfter = parseDeadline(options.deadlineAfter, \"deadline-after\");\n const statusSet = statusFilter && statusFilter.length > 0 ? new Set<ItemStatus>(statusFilter) : undefined;\n\n return items.filter((document) => {\n const item = document.metadata;\n if (statusSet && !statusSet.has(item.status)) return false;\n if (typeFilter && item.type !== typeFilter) return false;\n if (tagFilter && !stringArray(item.tags).includes(tagFilter)) return false;\n if (priorityFilter !== undefined && item.priority !== priorityFilter) return false;\n if (deadlineBefore && (!item.deadline || compareTimestampStrings(item.deadline, deadlineBefore) > 0)) return false;\n if (deadlineAfter && (!item.deadline || compareTimestampStrings(item.deadline, deadlineAfter) < 0)) return false;\n if (!matchesRuntimeFilters(item as Record<string, unknown>, runtimeFieldFilters)) return false;\n return true;\n });\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n let count = 0;\n let index = 0;\n while (true) {\n const foundAt = haystack.indexOf(needle, index);\n if (foundAt < 0) {\n return count;\n }\n count += 1;\n index = foundAt + needle.length;\n }\n}\n\nfunction tokenizeForExactTokenMatch(value: string): string[] {\n return tokenizeAlphaNumeric(value);\n}\n\nfunction collectLinkedPaths(item: ItemFrontMatter): Array<{ scope: \"project\" | \"global\"; path: string }> {\n const fromFiles = (item.files ?? []).map((entry) => ({\n scope: entry.scope,\n path: entry.path.trim(),\n }));\n const fromDocs = (item.docs ?? []).map((entry) => ({\n scope: entry.scope,\n path: entry.path.trim(),\n }));\n const fromTests = (item.tests ?? [])\n .filter((entry): entry is typeof entry & { path: string } => typeof entry.path === \"string\" && entry.path.trim().length > 0)\n .map((entry) => ({\n scope: entry.scope,\n path: entry.path.trim(),\n }));\n const sorted = [...fromFiles, ...fromDocs, ...fromTests]\n .filter((entry) => entry.path.length > 0)\n .sort((a, b) => a.scope.localeCompare(b.scope) || a.path.localeCompare(b.path));\n const deduped = new Map<string, { scope: \"project\" | \"global\"; path: string }>();\n for (const entry of sorted) {\n deduped.set(`${entry.scope}:${entry.path}`, entry);\n }\n return [...deduped.values()];\n}\n\ninterface ContainmentRoot {\n resolved: string;\n realpath: string;\n}\n\ninterface LinkedCorpusRoots {\n projectContainmentRoot: ContainmentRoot | null;\n globalContainmentRoot: ContainmentRoot | null;\n}\n\nasync function resolveContainmentRoot(root: string): Promise<ContainmentRoot | null> {\n const resolved = path.resolve(root);\n try {\n const realpathRoot = await fs.realpath(resolved);\n return {\n resolved,\n realpath: realpathRoot,\n };\n } catch {\n return null;\n }\n}\n\nasync function resolveLinkedCorpusRoots(projectRoot: string, globalRoot: string): Promise<LinkedCorpusRoots> {\n const [projectContainmentRoot, globalContainmentRoot] = await Promise.all([\n resolveContainmentRoot(projectRoot),\n resolveContainmentRoot(globalRoot),\n ]);\n return {\n projectContainmentRoot,\n globalContainmentRoot,\n };\n}\n\nasync function loadLinkedCorpus(\n document: ItemDocument,\n roots: LinkedCorpusRoots,\n): Promise<string> {\n const linkedPaths = collectLinkedPaths(document.metadata);\n const chunks: string[] = [];\n for (const linkedPath of linkedPaths) {\n const containmentRoot = linkedPath.scope === \"global\" ? roots.globalContainmentRoot : roots.projectContainmentRoot;\n if (!containmentRoot) {\n continue;\n }\n const resolved = path.resolve(containmentRoot.resolved, linkedPath.path);\n if (!isPathWithinDirectory(containmentRoot.resolved, resolved)) {\n continue;\n }\n let linkedRealpath: string;\n try {\n linkedRealpath = await fs.realpath(resolved);\n } catch {\n continue;\n }\n if (!isPathWithinDirectory(containmentRoot.realpath, linkedRealpath)) {\n continue;\n }\n try {\n await runActiveOnReadHooks({\n path: resolved,\n scope: linkedPath.scope,\n });\n chunks.push(await fs.readFile(resolved, \"utf8\"));\n } catch {\n // Best-effort linked-content indexing: unreadable paths are ignored.\n }\n }\n return chunks.join(\"\\n\");\n}\n\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\nfunction scoreDocument(\n document: ItemDocument,\n tokens: string[],\n normalizedQuery: string,\n linkedCorpus: string,\n tuning: SearchTuning,\n): SearchHit | null {\n const item = document.metadata;\n const titleTokenCounts = new Map<string, number>();\n for (const token of tokenizeForExactTokenMatch(item.title)) {\n titleTokenCounts.set(token, (titleTokenCounts.get(token) ?? 0) + 1);\n }\n const searchableFields: Array<{ name: string; value: string; weight: number }> = [\n { name: \"title\", value: item.title, weight: tuning.title_weight },\n { name: \"description\", value: item.description, weight: tuning.description_weight },\n { name: \"tags\", value: stringArray(item.tags).join(\" \"), weight: tuning.tags_weight },\n { name: \"status\", value: typeof item.status === \"string\" ? item.status : \"\", weight: tuning.status_weight },\n { name: \"body\", value: document.body, weight: tuning.body_weight },\n { name: \"comments\", value: textEntries(item.comments).map((entry) => entry.text).join(\" \"), weight: tuning.comments_weight },\n { name: \"notes\", value: textEntries(item.notes).map((entry) => entry.text).join(\" \"), weight: tuning.notes_weight },\n { name: \"learnings\", value: textEntries(item.learnings).map((entry) => entry.text).join(\" \"), weight: tuning.learnings_weight },\n { name: \"reminders\", value: buildReminderCorpus(item).join(\" \"), weight: tuning.reminders_weight },\n { name: \"events\", value: buildEventCorpus(item).join(\" \"), weight: tuning.events_weight },\n {\n name: \"dependencies\",\n value: dependencyEntries(item.dependencies).map((entry) => `${entry.id} ${entry.kind}`).join(\" \"),\n weight: tuning.dependencies_weight,\n },\n { name: \"plan\", value: buildPlanFlatCorpus(item), weight: tuning.body_weight },\n { name: \"linked_content\", value: linkedCorpus, weight: tuning.linked_content_weight },\n ];\n\n let score = 0;\n const matched = new Set<string>();\n for (const token of tokens) {\n const exactTitleMatches = titleTokenCounts.get(token) ?? 0;\n if (exactTitleMatches > 0) {\n score += exactTitleMatches * tuning.title_exact_bonus;\n matched.add(\"title\");\n }\n for (const field of searchableFields) {\n const fieldValue = field.value.toLowerCase();\n const occurrences = countOccurrences(fieldValue, token);\n if (occurrences > 0) {\n score += occurrences * field.weight;\n matched.add(field.name);\n }\n }\n }\n\n const isLongPhraseQuery = tokens.length >= LONG_QUERY_TOKEN_THRESHOLD && normalizedQuery.includes(\" \");\n if (isLongPhraseQuery) {\n const normalizedTitle = normalizeSearchPhrase(item.title);\n if (normalizedTitle === normalizedQuery) {\n score += LONG_QUERY_TITLE_EXACT_BONUS;\n matched.add(\"title\");\n }\n for (const field of searchableFields) {\n const normalizedField = normalizeSearchPhrase(field.value);\n const phraseOccurrences = countOccurrences(normalizedField, normalizedQuery);\n if (phraseOccurrences > 0) {\n score += phraseOccurrences * field.weight * LONG_QUERY_PHRASE_MULTIPLIER;\n matched.add(field.name);\n }\n }\n }\n\n if (score <= 0) {\n return null;\n }\n\n return {\n item,\n score,\n matched_fields: [...matched].sort((a, b) => a.localeCompare(b)),\n };\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): SearchHit | null {\n return scoreDocument(\n document,\n tokens,\n normalizedQuery,\n includeLinked ? linkedCorpusById.get(document.metadata.id) ?? \"\" : \"\",\n tuning,\n );\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\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\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\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\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\nfunction emptySearchResult(\n query: string,\n mode: SearchMode,\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): SearchResult {\n const projectionFields = projection.mode === \"full\" ? null : [...projection.fields];\n return {\n query: query.trim(),\n mode,\n items: [],\n count: 0,\n filters: {\n mode,\n status: options.status ?? null,\n type: options.type ?? null,\n tag: options.tag ?? null,\n priority: options.priority ?? null,\n deadline_before: options.deadlineBefore ?? null,\n deadline_after: options.deadlineAfter ?? null,\n include_linked: includeLinked,\n title_exact: options.titleExact === true,\n phrase_exact: options.phraseExact === true,\n score_threshold: scoreThreshold,\n hybrid_semantic_weight: mode === \"hybrid\" ? hybridSemanticWeight : null,\n query_expansion_enabled: queryExpansion.enabled,\n query_expansion_provider: queryExpansion.provider,\n rerank_enabled: rerank.enabled,\n rerank_model: rerank.model,\n rerank_top_k: rerank.top_k,\n limit: options.limit ?? null,\n },\n projection: {\n mode: projection.mode,\n fields: projectionFields,\n },\n now: nowIso(),\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n}\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\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 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\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\nfunction resolveExtensionVectorAdapter(settings: PmSettings): ExtensionVectorAdapter | null {\n const registrations = getActiveExtensionRegistrations();\n const adapterName = toOptionalNonEmptyString((settings.vector_store as { adapter?: unknown } | undefined)?.adapter);\n const resolved = resolveRegisteredVectorStoreAdapter(registrations, adapterName);\n if (!resolved) {\n return null;\n }\n const runtimeDefinition = resolved.runtime_definition ?? resolved.definition;\n const query = (runtimeDefinition as { query?: unknown }).query;\n if (typeof query !== \"function\") {\n return null;\n }\n return {\n query: query as ExtensionVectorQuery,\n };\n}\n\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\nfunction combineHybridHits(\n filteredById: Map<string, ItemDocument>,\n semanticScores: Map<string, number>,\n keywordHits: SearchHit[],\n hybridSemanticWeight: number,\n): SearchHit[] {\n const keywordScores = new Map(keywordHits.map((entry) => [entry.item.id, entry.score]));\n const keywordMatches = new Map(keywordHits.map((entry) => [entry.item.id, entry.matched_fields]));\n const normalizedSemantic = normalizeScoreMap(semanticScores);\n const normalizedKeyword = normalizeScoreMap(keywordScores);\n const candidateIds = new Set<string>([...semanticScores.keys(), ...keywordScores.keys()]);\n const keywordWeight = 1 - hybridSemanticWeight;\n return [...candidateIds]\n .map((id) => {\n const document = filteredById.get(id)!;\n const semanticScore = normalizedSemantic.get(id) ?? 0;\n const keywordScore = normalizedKeyword.get(id) ?? 0;\n const combinedScore = (semanticScore * hybridSemanticWeight) + (keywordScore * keywordWeight);\n if (combinedScore <= 0) {\n return null;\n }\n const matchedFields = new Set<string>();\n if (semanticScores.has(id)) {\n matchedFields.add(\"semantic\");\n }\n for (const field of keywordMatches.get(id) ?? []) {\n matchedFields.add(field);\n }\n return {\n item: document.metadata,\n score: combinedScore,\n matched_fields: [...matchedFields].sort((a, b) => a.localeCompare(b)),\n };\n })\n .filter((entry): entry is SearchHit => entry !== null);\n}\n\ninterface SemanticQueryContext {\n requestedMode: Exclude<SearchMode, \"keyword\">;\n query: string;\n filteredDocuments: ItemDocument[];\n keywordHits: SearchHit[];\n hybridSemanticWeight: number;\n limit: number | undefined;\n maxResults: number;\n provider: EmbeddingProviderConfig;\n vectorStore: VectorStoreConfig | null;\n extensionVectorAdapter: ExtensionVectorAdapter | null;\n queryExpansion: QueryExpansionConfig;\n queryExpansionExtension: { providerName: string; expand: ExtensionSearchProviderQueryExpansion } | null;\n rerank: RerankConfig;\n rerankExtension: { providerName: string; rerank: ExtensionSearchProviderRerank } | null;\n warnings: string[];\n settings: PmSettings;\n embeddingTimeoutMs?: number;\n vectorQueryTimeoutMs?: number;\n}\n\ninterface SemanticQueryResult {\n hits: SearchHit[];\n // Number of documents returned by the vector stage for this query after the\n // current metadata filters. When this is 0 the semantic/hybrid query ran\n // successfully, but vector ranking contributed nothing to the returned hits.\n vectorMatchCount: number;\n}\n\nfunction mergeVectorHitsById(vectorHitGroups: VectorQueryHit[][]): VectorQueryHit[] {\n const bestById = new Map<string, VectorQueryHit>();\n for (const group of vectorHitGroups) {\n for (const hit of group) {\n const existing = bestById.get(hit.id);\n if (!existing || hit.score > existing.score) {\n bestById.set(hit.id, hit);\n }\n }\n }\n const merged = [...bestById.values()];\n merged.sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.id.localeCompare(right.id);\n });\n return merged;\n}\n\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\nasync function computeSemanticOrHybridHits(context: SemanticQueryContext): Promise<SemanticQueryResult> {\n const semanticLimit = context.limit ?? context.maxResults;\n const embeddingOptions = context.embeddingTimeoutMs !== undefined ? { timeout_ms: context.embeddingTimeoutMs } : {};\n const vectorQueryOptions = context.vectorQueryTimeoutMs !== undefined ? { timeout_ms: context.vectorQueryTimeoutMs } : {};\n const queryTrimmed = context.query.trim();\n const baseExpandedQueries = context.queryExpansion.enabled\n ? buildDeterministicQueryExpansions(queryTrimmed, context.queryExpansion.max_queries)\n : [queryTrimmed];\n let expandedQueries = baseExpandedQueries.length > 0 ? baseExpandedQueries : [queryTrimmed];\n if (context.queryExpansion.enabled) {\n if (context.queryExpansionExtension?.expand) {\n try {\n const rawExpansion = await Promise.resolve(\n context.queryExpansionExtension.expand({\n query: queryTrimmed,\n mode: context.requestedMode,\n settings: context.settings,\n }),\n );\n const extensionExpansion = normalizeQueryExpansionOutput(rawExpansion);\n expandedQueries = mergeQueryExpansions(expandedQueries, extensionExpansion, context.queryExpansion.max_queries);\n } catch {\n context.warnings.push(\n `search_query_expansion_provider_failed:${context.queryExpansionExtension.providerName}:using_builtin`,\n );\n }\n } else if (\n context.queryExpansion.provider &&\n context.queryExpansion.provider !== \"openai\" &&\n context.queryExpansion.provider !== \"ollama\"\n ) {\n context.warnings.push(\n `search_query_expansion_provider_unavailable:${context.queryExpansion.provider}:using_builtin`,\n );\n }\n }\n\n const queryVectors = await executeEmbeddingRequest(context.provider, expandedQueries, embeddingOptions);\n\n const executeVectorQueryWithFallback = async (semanticVector: number[]): Promise<VectorQueryHit[]> => {\n if (context.extensionVectorAdapter?.query) {\n try {\n return await Promise.resolve(\n context.extensionVectorAdapter.query({\n vector: semanticVector,\n limit: semanticLimit,\n settings: context.settings,\n }),\n );\n } catch (error: unknown) {\n if (!context.vectorStore) {\n throw new PmCliError(\n `Extension vector adapter query failed and no built-in fallback store is configured (${error instanceof Error ? error.message : String(error)})`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);\n }\n }\n if (context.vectorStore) {\n return await executeVectorQuery(context.vectorStore, semanticVector, semanticLimit, vectorQueryOptions);\n }\n throw new PmCliError(\n \"Semantic search requires either a configured vector store or an extension vector adapter query handler\",\n EXIT_CODE.USAGE,\n );\n };\n\n const queryVectorGroups = await Promise.all(\n queryVectors.map(async (semanticVector) => await executeVectorQueryWithFallback(semanticVector)),\n );\n const vectorHits = mergeVectorHitsById(queryVectorGroups);\n const filteredById = new Map(context.filteredDocuments.map((document) => [document.metadata.id, document]));\n const { semanticHits, semanticScores } = buildSemanticHits(vectorHits, filteredById);\n const vectorMatchCount = semanticScores.size;\n if (context.requestedMode === \"semantic\") {\n return { hits: semanticHits, vectorMatchCount };\n }\n let hybridHits = combineHybridHits(filteredById, semanticScores, context.keywordHits, context.hybridSemanticWeight);\n if (context.rerank.enabled && hybridHits.length > 1) {\n const sortedForCandidates = [...hybridHits].sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.item.id.localeCompare(right.item.id);\n });\n const candidateHits = sortedForCandidates.slice(0, context.rerank.top_k);\n const candidateContexts = candidateHits\n .map((hit) => {\n const document = filteredById.get(hit.item.id);\n if (!document) {\n return null;\n }\n return { hit, text: buildRerankCorpus(document) };\n })\n .filter((entry): entry is { hit: SearchHit; text: string } => entry !== null);\n const rerankCandidates: RerankCandidate[] = candidateContexts.map((entry) => ({\n id: entry.hit.item.id,\n text: entry.text,\n }));\n let rerankScores: Map<string, number> | null = null;\n if (context.rerankExtension?.rerank) {\n try {\n const rawRerank = await Promise.resolve(\n context.rerankExtension.rerank({\n query: queryTrimmed,\n mode: \"hybrid\",\n model: context.rerank.model,\n top_k: context.rerank.top_k,\n settings: context.settings,\n candidates: candidateContexts.map((entry) => ({\n id: entry.hit.item.id,\n text: entry.text,\n score: entry.hit.score,\n })),\n }),\n );\n const normalizedRerank = normalizeRerankOutput(rawRerank);\n if (normalizedRerank.length > 0) {\n rerankScores = new Map(normalizedRerank.map((entry) => [entry.id, entry.score]));\n } else {\n context.warnings.push(\n `search_rerank_provider_invalid_response:${context.rerankExtension.providerName}:using_builtin`,\n );\n }\n } catch {\n context.warnings.push(`search_rerank_provider_failed:${context.rerankExtension.providerName}:using_builtin`);\n }\n }\n if (!rerankScores) {\n try {\n rerankScores = await rerankCandidatesWithEmbeddings(\n context.provider,\n context.rerank.model,\n queryTrimmed,\n rerankCandidates,\n context.embeddingTimeoutMs,\n );\n } catch {\n context.warnings.push(\"search_rerank_failed:using_hybrid_scores\");\n }\n }\n if (rerankScores && rerankScores.size > 0) {\n const rerankedIds = new Set(rerankScores.keys());\n hybridHits = hybridHits.map((hit) => {\n const rerankScore = rerankScores.get(hit.item.id);\n if (rerankScore === undefined) {\n return hit;\n }\n const matchedFields = new Set(hit.matched_fields);\n matchedFields.add(\"rerank\");\n return {\n ...hit,\n score: rerankScore,\n matched_fields: [...matchedFields].sort((left, right) => left.localeCompare(right)),\n };\n });\n hybridHits.sort((left, right) => {\n const leftWasReranked = rerankedIds.has(left.item.id);\n const rightWasReranked = rerankedIds.has(right.item.id);\n if (leftWasReranked !== rightWasReranked) {\n return leftWasReranked ? -1 : 1;\n }\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.item.id.localeCompare(right.item.id);\n });\n }\n }\n return {\n hits: hybridHits,\n vectorMatchCount,\n };\n}\n\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\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\nfunction projectSearchHits(hits: SearchHit[], projection: SearchProjectionConfig): SearchResultItem[] {\n if (projection.mode === \"full\") {\n return hits;\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\nexport async function runSearch(query: string, options: SearchOptions, global: GlobalOptions): Promise<SearchResult> {\n const includeLinked = parseIncludeLinked(options.includeLinked);\n const titleExact = parseTitleExact(options.titleExact);\n const phraseExact = parsePhraseExact(options.phraseExact);\n const tokens = parseTokens(query);\n const normalizedQuery = normalizeSearchPhrase(query);\n const limit = parseLimit(options.limit);\n const projection = parseProjectionConfig(options);\n const modeWasExplicit = typeof options.mode === \"string\" && options.mode.trim().length > 0;\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const storedSettings = await readSettings(pmRoot);\n const runtimeDefaultsResolution = resolveSettingsWithSemanticRuntimeDefaults(storedSettings);\n const settings = runtimeDefaultsResolution.settings;\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const runtimeFieldRegistry = resolveRuntimeFieldRegistry(settings.schema);\n validateSearchProjectionFields(projection, runtimeFieldRegistry);\n const runtimeFieldFilters = collectRuntimeFilterValues(options as Record<string, unknown>, runtimeFieldRegistry, \"search\");\n // `pm search --status` resolves strictly (a typo'd status surfaces a\n // did-you-mean hint) so agents can scope retrieval to open work and drop\n // closed-history noise without re-listing. Resolved before the corpus scan so\n // an invalid value fails fast.\n const statusFilter = parseStatusFilterCsv(\n typeof options.status === \"string\" ? options.status : undefined,\n statusRegistry,\n { strict: true },\n );\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const maxResults = resolveSearchMaxResults(settings);\n const scoreThreshold = resolveSearchScoreThreshold(settings);\n const semanticWeightProvided = options.semanticWeight !== undefined;\n const semanticWeightOverride = parseSemanticWeightOverride(options.semanticWeight);\n const hybridSemanticWeight = semanticWeightOverride ?? resolveHybridSemanticWeight(settings);\n const tuning = resolveSearchTuning(settings);\n const providerResolution = resolveEmbeddingProviders(settings);\n const vectorResolution = resolveVectorStores(settings);\n const extensionSearchProvider = resolveExtensionSearchProvider(settings);\n const extensionVectorAdapter = resolveExtensionVectorAdapter(settings);\n const queryExpansion = resolveQueryExpansionConfig(settings, providerResolution.active?.name ?? null);\n const rerank = resolveRerankConfig(\n settings,\n providerResolution.active?.model ?? toOptionalNonEmptyString(settings.search?.embedding_model) ?? \"text-embedding-3-small\",\n );\n const queryExpansionProvider = resolveExtensionSearchProviderByName(queryExpansion.provider ?? undefined);\n const queryExpansionExtension = queryExpansionProvider?.queryExpansion\n ? { providerName: queryExpansionProvider.providerName, expand: queryExpansionProvider.queryExpansion }\n : null;\n const rerankProvider = resolveExtensionSearchProviderByName(toOptionalNonEmptyString(settings.search?.provider));\n const rerankExtension = rerankProvider?.rerank\n ? { providerName: rerankProvider.providerName, rerank: rerankProvider.rerank }\n : null;\n let effectiveMode = parseMode(options.mode, {\n hasProvider: providerResolution.active !== null || extensionSearchProvider !== null,\n hasVectorStore: vectorResolution.active !== null || extensionVectorAdapter !== null,\n });\n const loadedDocuments = await loadDocuments(\n pmRoot,\n settings.item_format ?? \"toon\",\n typeRegistry.type_to_folder,\n settings.schema,\n );\n const warnings = loadedDocuments.warnings;\n if (effectiveMode === \"hybrid\" && semanticWeightProvided && semanticWeightOverride === undefined) {\n warnings.push(\"search_hybrid_semantic_weight_override_invalid:using_settings_default\");\n }\n const allDocuments = loadedDocuments.documents;\n const metadataFilteredDocuments = applyFilters(allDocuments, options, typeRegistry, runtimeFieldFilters, statusFilter);\n const filteredDocuments = applyExactQueryFilters(metadataFilteredDocuments, normalizedQuery, {\n titleExact,\n phraseExact,\n });\n if (effectiveMode === \"keyword\" && (filteredDocuments.length === 0 || limit === 0)) {\n return emptySearchResult(\n query,\n effectiveMode,\n options,\n includeLinked,\n scoreThreshold,\n hybridSemanticWeight,\n queryExpansion,\n rerank,\n projection,\n warnings,\n );\n }\n\n const projectRoot = process.cwd();\n const globalRoot = resolveGlobalPmRoot(projectRoot);\n const linkedCorpusById = new Map<string, string>();\n if (includeLinked && (effectiveMode === \"keyword\" || effectiveMode === \"hybrid\")) {\n const linkedCorpusRoots = await resolveLinkedCorpusRoots(projectRoot, globalRoot);\n const linkedCorpusEntries = await Promise.all(\n filteredDocuments.map(async (document) => [document.metadata.id, await loadLinkedCorpus(document, linkedCorpusRoots)] as const),\n );\n for (const [id, corpus] of linkedCorpusEntries) {\n linkedCorpusById.set(id, corpus);\n }\n }\n\n const keywordHits = filteredDocuments\n .map((document) => buildHybridLexicalScore(document, tokens, normalizedQuery, effectiveMode !== \"semantic\", linkedCorpusById, tuning))\n .filter((entry): entry is SearchHit => entry !== null);\n\n let hits = keywordHits;\n if (effectiveMode !== \"keyword\") {\n // Surface vector-index staleness once per query so agents notice when a\n // refresh is overdue. Only emitted when:\n // (1) the user explicitly asked for semantic/hybrid mode (implicit\n // upgrades fall back silently to keyword on any failure path below\n // and shouldn't carry noise), AND\n // (2) the BUILT-IN semantic path is what will run — an extension search\n // provider has its own indexing lifecycle and the local ledger we\n // read is irrelevant to it.\n const builtInSemanticWillRun =\n !extensionSearchProvider &&\n providerResolution.active !== null &&\n (vectorResolution.active !== null || extensionVectorAdapter !== null);\n if (modeWasExplicit && builtInSemanticWillRun) {\n await maybeEmitVectorIndexStaleWarning(pmRoot, filteredDocuments, warnings);\n }\n try {\n if (!extensionSearchProvider) {\n requireSemanticDependencies(effectiveMode, providerResolution, vectorResolution, extensionVectorAdapter !== null);\n }\n if (filteredDocuments.length === 0 || limit === 0) {\n return emptySearchResult(\n query,\n effectiveMode,\n options,\n includeLinked,\n scoreThreshold,\n hybridSemanticWeight,\n queryExpansion,\n rerank,\n projection,\n warnings,\n );\n }\n const filteredById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));\n const canUseBuiltInSemantic =\n providerResolution.active !== null && (vectorResolution.active !== null || extensionVectorAdapter !== null);\n if (extensionSearchProvider) {\n try {\n const providerResponse = await Promise.resolve(\n extensionSearchProvider.query({\n query,\n mode: effectiveMode,\n tokens,\n options,\n settings,\n documents: filteredDocuments,\n }),\n );\n hits = normalizeExtensionProviderHits(extensionSearchProvider.providerName, providerResponse, filteredById);\n } catch (error: unknown) {\n if (!canUseBuiltInSemantic) {\n throw new PmCliError(\n `Extension search provider \"${extensionSearchProvider.providerName}\" failed: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODE.GENERIC_FAILURE,\n );\n }\n }\n }\n if (hits === keywordHits) {\n const implicitHybridMode = !modeWasExplicit && effectiveMode === \"hybrid\";\n const { provider, vectorStore } = requireSemanticDependencies(\n effectiveMode,\n providerResolution,\n vectorResolution,\n extensionVectorAdapter !== null,\n );\n const semanticResult = await computeSemanticOrHybridHits({\n requestedMode: effectiveMode,\n query,\n filteredDocuments,\n keywordHits,\n hybridSemanticWeight,\n limit,\n maxResults,\n provider,\n vectorStore,\n extensionVectorAdapter,\n queryExpansion,\n queryExpansionExtension,\n rerank,\n rerankExtension,\n warnings,\n settings,\n ...(implicitHybridMode\n ? {\n embeddingTimeoutMs: IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS,\n vectorQueryTimeoutMs: IMPLICIT_HYBRID_VECTOR_TIMEOUT_MS,\n }\n : {}),\n });\n hits = semanticResult.hits;\n // The semantic/hybrid query ran without error, but vector ranking\n // contributed no hits for this query/filter set. Pure semantic mode would\n // otherwise return an empty set, so degrade to the locally computed\n // keyword hits (hybrid already blends them in) and warn so agents do not\n // mistake them for true vector ranking. The reported mode is left\n // unchanged; the warning is the signal.\n if (semanticResult.vectorMatchCount === 0) {\n if (effectiveMode === \"semantic\") {\n hits = keywordHits;\n }\n warnings.push(`search_${effectiveMode}_degraded:no_vector_matches:results_are_lexical`);\n }\n }\n } catch (error: unknown) {\n // Any semantic/hybrid attempt that fails (backend down, timeout, or the\n // project is not configured for semantic search) degrades to keyword mode\n // so agents are never blocked. Keyword hits are always computed locally\n // before this point, so the fallback is guaranteed to succeed.\n const fallbackWarning = modeWasExplicit\n ? buildExplicitSemanticFallbackWarning(effectiveMode, error)\n : buildImplicitSemanticFallbackWarning(error);\n effectiveMode = \"keyword\";\n hits = keywordHits;\n warnings.push(fallbackWarning);\n }\n }\n\n const thresholded = hits.filter((entry) => entry.score >= scoreThreshold);\n const sorted = sortHits(thresholded, statusRegistry);\n const resolvedLimit = effectiveMode === \"keyword\" ? limit : (limit ?? maxResults);\n const limited = resolvedLimit === undefined ? sorted : sorted.slice(0, resolvedLimit);\n const projectedItems = projectSearchHits(limited, projection);\n const projectionFields = projection.mode === \"full\" ? null : [...projection.fields];\n\n return {\n query: query.trim(),\n mode: effectiveMode,\n items: projectedItems,\n count: projectedItems.length,\n filters: {\n mode: effectiveMode,\n status: options.status ?? null,\n type: options.type ?? null,\n tag: options.tag ?? null,\n priority: options.priority ?? null,\n deadline_before: options.deadlineBefore ?? null,\n deadline_after: options.deadlineAfter ?? null,\n include_linked: includeLinked,\n title_exact: titleExact,\n phrase_exact: phraseExact,\n score_threshold: scoreThreshold,\n hybrid_semantic_weight: effectiveMode === \"hybrid\" ? hybridSemanticWeight : null,\n query_expansion_enabled: queryExpansion.enabled,\n query_expansion_provider: queryExpansion.provider,\n rerank_enabled: rerank.enabled,\n rerank_model: rerank.model,\n rerank_top_k: rerank.top_k,\n limit: options.limit ?? null,\n runtime_filters: runtimeFieldFilters,\n },\n projection: {\n mode: projection.mode,\n fields: projectionFields,\n },\n now: nowIso(),\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n}\n", "import 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\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\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\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\nexport function getMigrationRuntimeDefinition(\n migration: RegisteredExtensionSchemaMigrationDefinition,\n): Record<string, unknown> {\n return migration.runtime_definition ?? migration.definition;\n}\n", "export function normalizeLowercaseWhitespace(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \" \");\n}\n\nexport function tokenizeAlphaNumeric(value: string): string[] {\n return normalizeLowercaseWhitespace(value)\n .split(/[^a-z0-9]+/)\n .filter((token) => token.length > 0);\n}\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 const union = new Set([...leftSet, ...rightSet]).size;\n return union === 0 ? 0 : intersection / union;\n}\n", "import 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\nexport interface QueryExpansionConfig {\n enabled: boolean;\n provider: string | null;\n max_queries: number;\n}\n\nexport interface RerankConfig {\n enabled: boolean;\n model: string;\n top_k: number;\n}\n\nexport interface RerankCandidate {\n id: string;\n text: string;\n}\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\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\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\nexport function mergeQueryExpansions(base: string[], extra: string[], maxQueries: number): string[] {\n return dedupeQueries([...base, ...extra], Math.max(1, maxQueries));\n}\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\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\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\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["itemRecord", "global"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="39b4bc2e-0797-52cf-9728-a0d97705462f")}catch(e){}}();
|
|
3
|
+
import {
|
|
4
|
+
enforceHistoryStreamPolicyForItems,
|
|
5
|
+
listAllFrontMatterLight
|
|
6
|
+
} from "./chunk-YBZW2QQ7.js";
|
|
7
|
+
import "./chunk-UT6WFXW2.js";
|
|
8
|
+
import "./chunk-UYQ7HXH4.js";
|
|
9
|
+
import {
|
|
10
|
+
resolveItemTypeRegistry
|
|
11
|
+
} from "./chunk-GUZBNB3G.js";
|
|
12
|
+
import {
|
|
13
|
+
nowIso
|
|
14
|
+
} from "./chunk-B2KZGPM2.js";
|
|
15
|
+
import {
|
|
16
|
+
EXIT_CODE,
|
|
17
|
+
PmCliError,
|
|
18
|
+
getActiveExtensionRegistrations,
|
|
19
|
+
getSettingsPath,
|
|
20
|
+
pathExists,
|
|
21
|
+
readSettings,
|
|
22
|
+
resolvePmRoot,
|
|
23
|
+
resolveRuntimeStatusRegistry,
|
|
24
|
+
runActiveOnReadHooks
|
|
25
|
+
} from "./chunk-X4IZKYHP.js";
|
|
26
|
+
|
|
27
|
+
// dist/cli/commands/stats.js
|
|
28
|
+
import fs from "node:fs/promises";
|
|
29
|
+
import path from "node:path";
|
|
30
|
+
|
|
31
|
+
// dist/core/history/history-storage-stats.js
|
|
32
|
+
function parseStreamStat(id, raw) {
|
|
33
|
+
const bytes = Buffer.byteLength(raw, "utf8");
|
|
34
|
+
let lines = 0;
|
|
35
|
+
let oldestTs = null;
|
|
36
|
+
let newestTs = null;
|
|
37
|
+
let oldestMs = Number.POSITIVE_INFINITY;
|
|
38
|
+
let newestMs = Number.NEGATIVE_INFINITY;
|
|
39
|
+
for (const rawLine of raw.split(/\r?\n/)) {
|
|
40
|
+
const trimmed = rawLine.trim();
|
|
41
|
+
if (trimmed === "") {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
lines += 1;
|
|
45
|
+
let parsed;
|
|
46
|
+
try {
|
|
47
|
+
parsed = JSON.parse(trimmed);
|
|
48
|
+
} catch {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (parsed === null || typeof parsed !== "object" || !("ts" in parsed) || typeof parsed["ts"] !== "string") {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const ts = parsed["ts"];
|
|
55
|
+
const ms = Date.parse(ts);
|
|
56
|
+
if (Number.isNaN(ms)) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (ms < oldestMs || ms === oldestMs && oldestTs !== null && ts < oldestTs) {
|
|
60
|
+
oldestMs = ms;
|
|
61
|
+
oldestTs = ts;
|
|
62
|
+
}
|
|
63
|
+
if (ms > newestMs || ms === newestMs && newestTs !== null && ts > newestTs) {
|
|
64
|
+
newestMs = ms;
|
|
65
|
+
newestTs = ts;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { id, bytes, lines, oldest_ts: oldestTs, newest_ts: newestTs };
|
|
69
|
+
}
|
|
70
|
+
function computeHistoryStorageStats(streams, options) {
|
|
71
|
+
const rawTopN = options?.topN ?? 5;
|
|
72
|
+
const topN = Math.max(0, Math.floor(rawTopN));
|
|
73
|
+
const stats = streams.map(({ id, raw }) => parseStreamStat(id, raw));
|
|
74
|
+
let totalLines = 0;
|
|
75
|
+
let totalBytes = 0;
|
|
76
|
+
let oldestEntry = null;
|
|
77
|
+
let newestEntry = null;
|
|
78
|
+
let globalOldestMs = Number.POSITIVE_INFINITY;
|
|
79
|
+
let globalNewestMs = Number.NEGATIVE_INFINITY;
|
|
80
|
+
for (const stat of stats) {
|
|
81
|
+
totalLines += stat.lines;
|
|
82
|
+
totalBytes += stat.bytes;
|
|
83
|
+
if (stat.oldest_ts !== null) {
|
|
84
|
+
const ms = Date.parse(stat.oldest_ts);
|
|
85
|
+
if (ms < globalOldestMs || ms === globalOldestMs && oldestEntry !== null && stat.id < oldestEntry.id) {
|
|
86
|
+
globalOldestMs = ms;
|
|
87
|
+
oldestEntry = { id: stat.id, ts: stat.oldest_ts };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (stat.newest_ts !== null) {
|
|
91
|
+
const ms = Date.parse(stat.newest_ts);
|
|
92
|
+
if (ms > globalNewestMs || ms === globalNewestMs && newestEntry !== null && stat.id < newestEntry.id) {
|
|
93
|
+
globalNewestMs = ms;
|
|
94
|
+
newestEntry = { id: stat.id, ts: stat.newest_ts };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const largestByBytes = topN === 0 ? [] : [...stats].sort((a, b) => b.bytes - a.bytes || a.id.localeCompare(b.id)).slice(0, topN);
|
|
99
|
+
const deepestByLines = topN === 0 ? [] : [...stats].sort((a, b) => b.lines - a.lines || a.id.localeCompare(b.id)).slice(0, topN);
|
|
100
|
+
return {
|
|
101
|
+
total_streams: streams.length,
|
|
102
|
+
total_lines: totalLines,
|
|
103
|
+
total_bytes: totalBytes,
|
|
104
|
+
largest_by_bytes: largestByBytes,
|
|
105
|
+
deepest_by_lines: deepestByLines,
|
|
106
|
+
oldest_entry: oldestEntry,
|
|
107
|
+
newest_entry: newestEntry
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// dist/cli/commands/stats.js
|
|
112
|
+
function zeroByType(itemTypes) {
|
|
113
|
+
return itemTypes.reduce((acc, value) => {
|
|
114
|
+
acc[value] = 0;
|
|
115
|
+
return acc;
|
|
116
|
+
}, {});
|
|
117
|
+
}
|
|
118
|
+
function zeroByStatus(statuses) {
|
|
119
|
+
return statuses.reduce((acc, value) => {
|
|
120
|
+
acc[value] = 0;
|
|
121
|
+
return acc;
|
|
122
|
+
}, {});
|
|
123
|
+
}
|
|
124
|
+
function countNonEmptyLines(raw) {
|
|
125
|
+
if (raw.trim().length === 0) {
|
|
126
|
+
return 0;
|
|
127
|
+
}
|
|
128
|
+
return raw.split(/\r?\n/u).filter((line) => line.trim().length > 0).length;
|
|
129
|
+
}
|
|
130
|
+
async function readHistoryStreamContents(pmRoot) {
|
|
131
|
+
const historyDir = path.join(pmRoot, "history");
|
|
132
|
+
if (!await pathExists(historyDir)) {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
await runActiveOnReadHooks({
|
|
136
|
+
path: historyDir,
|
|
137
|
+
scope: "project"
|
|
138
|
+
});
|
|
139
|
+
const historyFiles = (await fs.readdir(historyDir)).filter((entry) => entry.endsWith(".jsonl")).sort((a, b) => a.localeCompare(b));
|
|
140
|
+
const streams = [];
|
|
141
|
+
for (const file of historyFiles) {
|
|
142
|
+
const historyPath = path.join(historyDir, file);
|
|
143
|
+
const raw = await fs.readFile(historyPath, "utf8");
|
|
144
|
+
await runActiveOnReadHooks({
|
|
145
|
+
path: historyPath,
|
|
146
|
+
scope: "project"
|
|
147
|
+
});
|
|
148
|
+
streams.push({ id: file.slice(0, -".jsonl".length), raw });
|
|
149
|
+
}
|
|
150
|
+
return streams;
|
|
151
|
+
}
|
|
152
|
+
async function runStats(global, options = {}) {
|
|
153
|
+
const pmRoot = resolvePmRoot(process.cwd(), global.path);
|
|
154
|
+
if (!await pathExists(getSettingsPath(pmRoot))) {
|
|
155
|
+
throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
|
|
156
|
+
}
|
|
157
|
+
const settings = await readSettings(pmRoot);
|
|
158
|
+
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
159
|
+
const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);
|
|
160
|
+
const items = await listAllFrontMatterLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, void 0, settings.schema);
|
|
161
|
+
await enforceHistoryStreamPolicyForItems({
|
|
162
|
+
pmRoot,
|
|
163
|
+
settings,
|
|
164
|
+
itemIds: items.map((item) => item.id),
|
|
165
|
+
commandLabel: "stats"
|
|
166
|
+
});
|
|
167
|
+
const byType = zeroByType(typeRegistry.types);
|
|
168
|
+
const byStatus = zeroByStatus(statusRegistry.definitions.map((definition) => definition.id));
|
|
169
|
+
for (const item of items) {
|
|
170
|
+
if (byType[item.type] === void 0) {
|
|
171
|
+
byType[item.type] = 0;
|
|
172
|
+
}
|
|
173
|
+
byType[item.type] += 1;
|
|
174
|
+
if (byStatus[item.status] === void 0) {
|
|
175
|
+
byStatus[item.status] = 0;
|
|
176
|
+
}
|
|
177
|
+
byStatus[item.status] += 1;
|
|
178
|
+
}
|
|
179
|
+
const streams = await readHistoryStreamContents(pmRoot);
|
|
180
|
+
let historyEntries = 0;
|
|
181
|
+
for (const stream of streams) {
|
|
182
|
+
historyEntries += countNonEmptyLines(stream.raw);
|
|
183
|
+
}
|
|
184
|
+
const storage = options.storage ? computeHistoryStorageStats(streams) : void 0;
|
|
185
|
+
return {
|
|
186
|
+
totals: {
|
|
187
|
+
items: items.length,
|
|
188
|
+
history_streams: streams.length,
|
|
189
|
+
history_entries: historyEntries
|
|
190
|
+
},
|
|
191
|
+
by_type: byType,
|
|
192
|
+
by_status: byStatus,
|
|
193
|
+
...storage ? { storage } : {},
|
|
194
|
+
generated_at: nowIso()
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
export {
|
|
198
|
+
runStats
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=stats-7JDIJRDH.js.map
|
|
201
|
+
|
|
202
|
+
//# debugId=39b4bc2e-0797-52cf-9728-a0d97705462f
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../cli/commands/stats.ts","../../../../../../../../core/history/history-storage-stats.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getActiveExtensionRegistrations, runActiveOnReadHooks } from \"../../core/extensions/index.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { enforceHistoryStreamPolicyForItems } from \"../../core/history/history-stream-policy.js\";\nimport { computeHistoryStorageStats, type HistoryStorageStats } from \"../../core/history/history-storage-stats.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { resolveRuntimeStatusRegistry } 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 { nowIso } from \"../../core/shared/time.js\";\nimport { listAllFrontMatterLight } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemStatus, ItemType } from \"../../types/index.js\";\n\nexport interface StatsCommandOptions {\n /** Include aggregate per-stream history storage metrics (sizes, depth, oldest/newest). */\n storage?: boolean;\n}\n\nexport interface StatsResult {\n totals: {\n items: number;\n history_streams: number;\n history_entries: number;\n };\n by_type: Record<ItemType, number>;\n by_status: Record<ItemStatus, number>;\n /** Present only with --storage: aggregate history-stream metrics for compaction/planning. */\n storage?: HistoryStorageStats;\n generated_at: string;\n}\n\nfunction zeroByType(itemTypes: string[]): Record<ItemType, number> {\n return itemTypes.reduce(\n (acc, value) => {\n acc[value] = 0;\n return acc;\n },\n {} as Record<ItemType, number>,\n );\n}\n\nfunction zeroByStatus(statuses: string[]): Record<ItemStatus, number> {\n return statuses.reduce(\n (acc, value) => {\n acc[value] = 0;\n return acc;\n },\n {} as Record<ItemStatus, number>,\n );\n}\n\nfunction countNonEmptyLines(raw: string): number {\n if (raw.trim().length === 0) {\n return 0;\n }\n return raw\n .split(/\\r?\\n/u)\n .filter((line) => line.trim().length > 0)\n .length;\n}\n\nasync function readHistoryStreamContents(pmRoot: string): Promise<Array<{ id: string; raw: string }>> {\n const historyDir = path.join(pmRoot, \"history\");\n if (!(await pathExists(historyDir))) {\n return [];\n }\n\n await runActiveOnReadHooks({\n path: historyDir,\n scope: \"project\",\n });\n const historyFiles = (await fs.readdir(historyDir))\n .filter((entry) => entry.endsWith(\".jsonl\"))\n .sort((a, b) => a.localeCompare(b));\n\n const streams: Array<{ id: string; raw: string }> = [];\n for (const file of historyFiles) {\n const historyPath = path.join(historyDir, file);\n const raw = await fs.readFile(historyPath, \"utf8\");\n await runActiveOnReadHooks({\n path: historyPath,\n scope: \"project\",\n });\n streams.push({ id: file.slice(0, -\".jsonl\".length), raw });\n }\n\n return streams;\n}\n\nexport async function runStats(global: GlobalOptions, options: StatsCommandOptions = {}): Promise<StatsResult> {\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\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const items = await listAllFrontMatterLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, undefined, settings.schema);\n await enforceHistoryStreamPolicyForItems({\n pmRoot,\n settings,\n itemIds: items.map((item) => item.id),\n commandLabel: \"stats\",\n });\n\n const byType = zeroByType(typeRegistry.types);\n const byStatus = zeroByStatus(statusRegistry.definitions.map((definition) => definition.id));\n for (const item of items) {\n if (byType[item.type] === undefined) {\n byType[item.type] = 0;\n }\n byType[item.type] += 1;\n if (byStatus[item.status] === undefined) {\n byStatus[item.status] = 0;\n }\n byStatus[item.status] += 1;\n }\n\n const streams = await readHistoryStreamContents(pmRoot);\n let historyEntries = 0;\n for (const stream of streams) {\n historyEntries += countNonEmptyLines(stream.raw);\n }\n const storage = options.storage ? computeHistoryStorageStats(streams) : undefined;\n\n return {\n totals: {\n items: items.length,\n history_streams: streams.length,\n history_entries: historyEntries,\n },\n by_type: byType,\n by_status: byStatus,\n ...(storage ? { storage } : {}),\n generated_at: nowIso(),\n };\n}\n","/**\n * Pure aggregate metrics for history streams (JSONL files).\n * No filesystem access — callers read raw stream contents and pass them in.\n * This module has no Node imports; Buffer is available as a global.\n */\n\nexport interface HistoryStreamStat {\n id: string;\n bytes: number;\n lines: number; // non-empty JSONL entry count\n oldest_ts: string | null; // min parseable ts in this stream, else null\n newest_ts: string | null; // max parseable ts in this stream, else null\n}\n\nexport interface HistoryStorageEntryRef {\n id: string;\n ts: string;\n}\n\nexport interface HistoryStorageStats {\n total_streams: number;\n total_lines: number;\n total_bytes: number;\n largest_by_bytes: HistoryStreamStat[]; // top-N desc by bytes, tie-break id asc\n deepest_by_lines: HistoryStreamStat[]; // top-N desc by lines, tie-break id asc\n oldest_entry: HistoryStorageEntryRef | null; // global min ts across all streams\n newest_entry: HistoryStorageEntryRef | null; // global max ts across all streams\n}\n\nfunction parseStreamStat(id: string, raw: string): HistoryStreamStat {\n const bytes = Buffer.byteLength(raw, \"utf8\");\n\n let lines = 0;\n let oldestTs: string | null = null;\n let newestTs: string | null = null;\n let oldestMs = Number.POSITIVE_INFINITY;\n let newestMs = Number.NEGATIVE_INFINITY;\n\n for (const rawLine of raw.split(/\\r?\\n/)) {\n const trimmed = rawLine.trim();\n if (trimmed === \"\") {\n continue;\n }\n lines += 1;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n continue;\n }\n\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n !(\"ts\" in (parsed as object)) ||\n typeof (parsed as Record<string, unknown>)[\"ts\"] !== \"string\"\n ) {\n continue;\n }\n\n const ts = (parsed as Record<string, unknown>)[\"ts\"] as string;\n const ms = Date.parse(ts);\n if (Number.isNaN(ms)) {\n continue;\n }\n\n if (ms < oldestMs || (ms === oldestMs && oldestTs !== null && ts < oldestTs)) {\n oldestMs = ms;\n oldestTs = ts;\n }\n if (ms > newestMs || (ms === newestMs && newestTs !== null && ts > newestTs)) {\n newestMs = ms;\n newestTs = ts;\n }\n }\n\n return { id, bytes, lines, oldest_ts: oldestTs, newest_ts: newestTs };\n}\n\nexport function computeHistoryStorageStats(\n streams: Array<{ id: string; raw: string }>,\n options?: { topN?: number },\n): HistoryStorageStats {\n const rawTopN = options?.topN ?? 5;\n const topN = Math.max(0, Math.floor(rawTopN));\n\n const stats: HistoryStreamStat[] = streams.map(({ id, raw }) => parseStreamStat(id, raw));\n\n let totalLines = 0;\n let totalBytes = 0;\n let oldestEntry: HistoryStorageEntryRef | null = null;\n let newestEntry: HistoryStorageEntryRef | null = null;\n let globalOldestMs = Number.POSITIVE_INFINITY;\n let globalNewestMs = Number.NEGATIVE_INFINITY;\n\n for (const stat of stats) {\n totalLines += stat.lines;\n totalBytes += stat.bytes;\n\n if (stat.oldest_ts !== null) {\n const ms = Date.parse(stat.oldest_ts);\n if (\n ms < globalOldestMs ||\n (ms === globalOldestMs && oldestEntry !== null && stat.id < oldestEntry.id)\n ) {\n globalOldestMs = ms;\n oldestEntry = { id: stat.id, ts: stat.oldest_ts };\n }\n }\n\n if (stat.newest_ts !== null) {\n const ms = Date.parse(stat.newest_ts);\n if (\n ms > globalNewestMs ||\n (ms === globalNewestMs && newestEntry !== null && stat.id < newestEntry.id)\n ) {\n globalNewestMs = ms;\n newestEntry = { id: stat.id, ts: stat.newest_ts };\n }\n }\n }\n\n const largestByBytes =\n topN === 0\n ? []\n : [...stats]\n .sort((a, b) => b.bytes - a.bytes || a.id.localeCompare(b.id))\n .slice(0, topN);\n\n const deepestByLines =\n topN === 0\n ? []\n : [...stats]\n .sort((a, b) => b.lines - a.lines || a.id.localeCompare(b.id))\n .slice(0, topN);\n\n return {\n total_streams: streams.length,\n total_lines: totalLines,\n total_bytes: totalBytes,\n largest_by_bytes: largestByBytes,\n deepest_by_lines: deepestByLines,\n oldest_entry: oldestEntry,\n newest_entry: newestEntry,\n };\n}\n"],"names":[],"mappings":"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","debugId":"39b4bc2e-0797-52cf-9728-a0d97705462f"}
|