@unbrained/pm-cli 2026.6.12 → 2026.6.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (777) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.md +2 -2
  3. package/dist/cli/bootstrap-args.d.ts +29 -0
  4. package/dist/cli/bootstrap-args.js +11 -4
  5. package/dist/cli/bootstrap-args.js.map +1 -1
  6. package/dist/cli/commander-usage.d.ts +12 -0
  7. package/dist/cli/commander-usage.js +18 -7
  8. package/dist/cli/commander-usage.js.map +1 -1
  9. package/dist/cli/commands/activity.d.ts +19 -0
  10. package/dist/cli/commands/activity.js +12 -2
  11. package/dist/cli/commands/activity.js.map +1 -1
  12. package/dist/cli/commands/aggregate.d.ts +58 -0
  13. package/dist/cli/commands/aggregate.js +48 -15
  14. package/dist/cli/commands/aggregate.js.map +1 -1
  15. package/dist/cli/commands/annotation-command.d.ts +6 -1
  16. package/dist/cli/commands/annotation-command.js +72 -2
  17. package/dist/cli/commands/annotation-command.js.map +1 -1
  18. package/dist/cli/commands/append.js +4 -3
  19. package/dist/cli/commands/append.js.map +1 -1
  20. package/dist/cli/commands/close-many.d.ts +20 -0
  21. package/dist/cli/commands/close-many.js +14 -23
  22. package/dist/cli/commands/close-many.js.map +1 -1
  23. package/dist/cli/commands/close.js +37 -4
  24. package/dist/cli/commands/close.js.map +1 -1
  25. package/dist/cli/commands/comments-audit.js +3 -2
  26. package/dist/cli/commands/comments-audit.js.map +1 -1
  27. package/dist/cli/commands/comments.d.ts +2 -0
  28. package/dist/cli/commands/comments.js +49 -23
  29. package/dist/cli/commands/comments.js.map +1 -1
  30. package/dist/cli/commands/completion.js +269 -8
  31. package/dist/cli/commands/completion.js.map +1 -1
  32. package/dist/cli/commands/config.d.ts +51 -1
  33. package/dist/cli/commands/config.js +50 -12
  34. package/dist/cli/commands/config.js.map +1 -1
  35. package/dist/cli/commands/context.d.ts +79 -1
  36. package/dist/cli/commands/context.js +151 -25
  37. package/dist/cli/commands/context.js.map +1 -1
  38. package/dist/cli/commands/contracts.d.ts +80 -1
  39. package/dist/cli/commands/contracts.js +54 -4
  40. package/dist/cli/commands/contracts.js.map +1 -1
  41. package/dist/cli/commands/create.d.ts +49 -0
  42. package/dist/cli/commands/create.js +112 -7
  43. package/dist/cli/commands/create.js.map +1 -1
  44. package/dist/cli/commands/dedupe-audit.d.ts +33 -0
  45. package/dist/cli/commands/dedupe-audit.js +18 -14
  46. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  47. package/dist/cli/commands/deps.js +7 -4
  48. package/dist/cli/commands/deps.js.map +1 -1
  49. package/dist/cli/commands/event-validation-messages.js +3 -3
  50. package/dist/cli/commands/event-validation-messages.js.map +1 -1
  51. package/dist/cli/commands/extension/bundled-catalog.d.ts +7 -0
  52. package/dist/cli/commands/extension/bundled-catalog.js +19 -15
  53. package/dist/cli/commands/extension/bundled-catalog.js.map +1 -1
  54. package/dist/cli/commands/extension/install-sources.d.ts +41 -1
  55. package/dist/cli/commands/extension/install-sources.js +26 -8
  56. package/dist/cli/commands/extension/install-sources.js.map +1 -1
  57. package/dist/cli/commands/extension/shared.d.ts +5 -0
  58. package/dist/cli/commands/extension/shared.js +9 -3
  59. package/dist/cli/commands/extension/shared.js.map +1 -1
  60. package/dist/cli/commands/extension.d.ts +133 -1
  61. package/dist/cli/commands/extension.js +127 -9
  62. package/dist/cli/commands/extension.js.map +1 -1
  63. package/dist/cli/commands/files.d.ts +30 -1
  64. package/dist/cli/commands/files.js +21 -2
  65. package/dist/cli/commands/files.js.map +1 -1
  66. package/dist/cli/commands/focus.d.ts +11 -0
  67. package/dist/cli/commands/focus.js +86 -0
  68. package/dist/cli/commands/focus.js.map +1 -0
  69. package/dist/cli/commands/get.d.ts +9 -2
  70. package/dist/cli/commands/get.js +34 -6
  71. package/dist/cli/commands/get.js.map +1 -1
  72. package/dist/cli/commands/guide.d.ts +5 -0
  73. package/dist/cli/commands/guide.js +6 -3
  74. package/dist/cli/commands/guide.js.map +1 -1
  75. package/dist/cli/commands/health.d.ts +109 -0
  76. package/dist/cli/commands/health.js +87 -35
  77. package/dist/cli/commands/health.js.map +1 -1
  78. package/dist/cli/commands/history-compact.js +27 -36
  79. package/dist/cli/commands/history-compact.js.map +1 -1
  80. package/dist/cli/commands/history-redact.d.ts +46 -0
  81. package/dist/cli/commands/history-redact.js +99 -67
  82. package/dist/cli/commands/history-redact.js.map +1 -1
  83. package/dist/cli/commands/history-repair.js +34 -37
  84. package/dist/cli/commands/history-repair.js.map +1 -1
  85. package/dist/cli/commands/history.js +6 -2
  86. package/dist/cli/commands/history.js.map +1 -1
  87. package/dist/cli/commands/index.d.ts +1 -0
  88. package/dist/cli/commands/index.js +3 -2
  89. package/dist/cli/commands/index.js.map +1 -1
  90. package/dist/cli/commands/init-agent-guidance.d.ts +54 -0
  91. package/dist/cli/commands/init-agent-guidance.js +31 -4
  92. package/dist/cli/commands/init-agent-guidance.js.map +1 -1
  93. package/dist/cli/commands/init.d.ts +36 -1
  94. package/dist/cli/commands/init.js +38 -5
  95. package/dist/cli/commands/init.js.map +1 -1
  96. package/dist/cli/commands/learnings.js +4 -3
  97. package/dist/cli/commands/learnings.js.map +1 -1
  98. package/dist/cli/commands/linked-test-parsers.d.ts +5 -0
  99. package/dist/cli/commands/linked-test-parsers.js +5 -2
  100. package/dist/cli/commands/linked-test-parsers.js.map +1 -1
  101. package/dist/cli/commands/list-filter-shared.d.ts +8 -0
  102. package/dist/cli/commands/list-filter-shared.js +70 -0
  103. package/dist/cli/commands/list-filter-shared.js.map +1 -0
  104. package/dist/cli/commands/list.d.ts +116 -0
  105. package/dist/cli/commands/list.js +194 -6
  106. package/dist/cli/commands/list.js.map +1 -1
  107. package/dist/cli/commands/normalize.js +16 -2
  108. package/dist/cli/commands/normalize.js.map +1 -1
  109. package/dist/cli/commands/notes.js +4 -3
  110. package/dist/cli/commands/notes.js.map +1 -1
  111. package/dist/cli/commands/plan.js +3 -2
  112. package/dist/cli/commands/plan.js.map +1 -1
  113. package/dist/cli/commands/reindex.d.ts +83 -0
  114. package/dist/cli/commands/reindex.js +45 -10
  115. package/dist/cli/commands/reindex.js.map +1 -1
  116. package/dist/cli/commands/restore.d.ts +40 -1
  117. package/dist/cli/commands/restore.js +27 -2
  118. package/dist/cli/commands/restore.js.map +1 -1
  119. package/dist/cli/commands/schema.d.ts +18 -0
  120. package/dist/cli/commands/schema.js +30 -3
  121. package/dist/cli/commands/schema.js.map +1 -1
  122. package/dist/cli/commands/search.d.ts +289 -1
  123. package/dist/cli/commands/search.js +367 -60
  124. package/dist/cli/commands/search.js.map +1 -1
  125. package/dist/cli/commands/stats.d.ts +38 -0
  126. package/dist/cli/commands/stats.js +38 -10
  127. package/dist/cli/commands/stats.js.map +1 -1
  128. package/dist/cli/commands/telemetry.js +5 -3
  129. package/dist/cli/commands/telemetry.js.map +1 -1
  130. package/dist/cli/commands/templates.d.ts +18 -0
  131. package/dist/cli/commands/templates.js +9 -2
  132. package/dist/cli/commands/templates.js.map +1 -1
  133. package/dist/cli/commands/test-all.d.ts +5 -0
  134. package/dist/cli/commands/test-all.js +9 -3
  135. package/dist/cli/commands/test-all.js.map +1 -1
  136. package/dist/cli/commands/test.d.ts +70 -1
  137. package/dist/cli/commands/test.js +84 -3
  138. package/dist/cli/commands/test.js.map +1 -1
  139. package/dist/cli/commands/update-many.d.ts +34 -1
  140. package/dist/cli/commands/update-many.js +60 -31
  141. package/dist/cli/commands/update-many.js.map +1 -1
  142. package/dist/cli/commands/update.d.ts +71 -0
  143. package/dist/cli/commands/update.js +74 -8
  144. package/dist/cli/commands/update.js.map +1 -1
  145. package/dist/cli/commands/upgrade.d.ts +28 -1
  146. package/dist/cli/commands/upgrade.js +17 -4
  147. package/dist/cli/commands/upgrade.js.map +1 -1
  148. package/dist/cli/commands/validate.d.ts +114 -0
  149. package/dist/cli/commands/validate.js +154 -9
  150. package/dist/cli/commands/validate.js.map +1 -1
  151. package/dist/cli/error-guidance.d.ts +30 -0
  152. package/dist/cli/error-guidance.js +68 -6
  153. package/dist/cli/error-guidance.js.map +1 -1
  154. package/dist/cli/extension-command-options.js +9 -7
  155. package/dist/cli/extension-command-options.js.map +1 -1
  156. package/dist/cli/help-content.d.ts +8 -0
  157. package/dist/cli/help-content.js +30 -6
  158. package/dist/cli/help-content.js.map +1 -1
  159. package/dist/cli/help-json-payload.d.ts +19 -1
  160. package/dist/cli/help-json-payload.js +16 -7
  161. package/dist/cli/help-json-payload.js.map +1 -1
  162. package/dist/cli/main.d.ts +223 -0
  163. package/dist/cli/main.js +214 -46
  164. package/dist/cli/main.js.map +1 -1
  165. package/dist/cli/register-list-query.js +62 -5
  166. package/dist/cli/register-list-query.js.map +1 -1
  167. package/dist/cli/register-mutation.d.ts +16 -0
  168. package/dist/cli/register-mutation.js +210 -40
  169. package/dist/cli/register-mutation.js.map +1 -1
  170. package/dist/cli/register-operations.d.ts +8 -0
  171. package/dist/cli/register-operations.js +33 -11
  172. package/dist/cli/register-operations.js.map +1 -1
  173. package/dist/cli/register-setup.js +9 -6
  174. package/dist/cli/register-setup.js.map +1 -1
  175. package/dist/cli/registration-helpers.d.ts +4 -0
  176. package/dist/cli/registration-helpers.js +124 -38
  177. package/dist/cli/registration-helpers.js.map +1 -1
  178. package/dist/cli-bundle/chunks/activity-5P2KQCTH.js +18 -0
  179. package/dist/cli-bundle/chunks/{activity-XADJOG6G.js → activity-MJGTX4LO.js} +13 -11
  180. package/dist/cli-bundle/chunks/{aggregate-OD36DJU5.js → aggregate-MH3GROKB.js} +54 -25
  181. package/dist/cli-bundle/chunks/aggregate-MH3GROKB.js.map +7 -0
  182. package/dist/cli-bundle/chunks/{aggregate-6OTS3AOO.js → aggregate-OUGCDFNC.js} +55 -26
  183. package/dist/cli-bundle/chunks/aggregate-OUGCDFNC.js.map +1 -0
  184. package/dist/cli-bundle/chunks/{append-JYWO4P7W.js → append-2Q4BPUBW.js} +10 -10
  185. package/dist/cli-bundle/chunks/{append-JYWO4P7W.js.map → append-2Q4BPUBW.js.map} +2 -2
  186. package/dist/cli-bundle/chunks/{append-KG55G7S3.js → append-VCRUG2W6.js} +11 -11
  187. package/dist/cli-bundle/chunks/append-VCRUG2W6.js.map +1 -0
  188. package/dist/cli-bundle/chunks/{chunk-IGVJRZ6H.js → chunk-2IUJBMKS.js} +10 -9
  189. package/dist/cli-bundle/chunks/{chunk-IGVJRZ6H.js.map → chunk-2IUJBMKS.js.map} +2 -2
  190. package/dist/cli-bundle/chunks/{chunk-ATEES5SX.js → chunk-2JEGCDYT.js} +2 -2
  191. package/dist/cli-bundle/chunks/{chunk-XUC4C4PT.js → chunk-3WAULYOY.js} +3 -3
  192. package/dist/cli-bundle/chunks/{chunk-UIG4TW2H.js → chunk-3XOXWOGA.js} +359 -19
  193. package/dist/cli-bundle/chunks/chunk-3XOXWOGA.js.map +1 -0
  194. package/dist/cli-bundle/chunks/{chunk-3KLPFWZ4.js → chunk-4KBK4BA3.js} +16 -34
  195. package/dist/cli-bundle/chunks/chunk-4KBK4BA3.js.map +7 -0
  196. package/dist/cli-bundle/chunks/{chunk-OLKBSY4N.js → chunk-4VLB4JH2.js} +51 -8
  197. package/dist/cli-bundle/chunks/chunk-4VLB4JH2.js.map +7 -0
  198. package/dist/cli-bundle/chunks/{chunk-ZMW77VWV.js → chunk-656HPQPO.js} +27 -12
  199. package/dist/cli-bundle/chunks/chunk-656HPQPO.js.map +1 -0
  200. package/dist/cli-bundle/chunks/{chunk-CW6E4NAT.js → chunk-667XI4UJ.js} +309 -20
  201. package/dist/cli-bundle/chunks/chunk-667XI4UJ.js.map +1 -0
  202. package/dist/cli-bundle/chunks/{chunk-5SCT2JCT.js → chunk-6BV7ENQL.js} +9 -8
  203. package/dist/cli-bundle/chunks/chunk-6BV7ENQL.js.map +7 -0
  204. package/dist/cli-bundle/chunks/chunk-6EFCFPNE.js +35 -0
  205. package/dist/cli-bundle/chunks/chunk-6EFCFPNE.js.map +7 -0
  206. package/dist/cli-bundle/chunks/{chunk-VFUZV5EB.js → chunk-6NQXMGYU.js} +19 -8
  207. package/dist/cli-bundle/chunks/chunk-6NQXMGYU.js.map +7 -0
  208. package/dist/cli-bundle/chunks/{chunk-GKIZW7SM.js → chunk-764O7EUA.js} +223 -50
  209. package/dist/cli-bundle/chunks/chunk-764O7EUA.js.map +7 -0
  210. package/dist/cli-bundle/chunks/{chunk-QJMGRZO2.js → chunk-7AGIXLNK.js} +3 -3
  211. package/dist/cli-bundle/chunks/chunk-7EILPFMA.js +404 -0
  212. package/dist/cli-bundle/chunks/chunk-7EILPFMA.js.map +7 -0
  213. package/dist/cli-bundle/chunks/{chunk-HI7STVF2.js → chunk-7K2MXFMX.js} +14 -32
  214. package/dist/cli-bundle/chunks/chunk-7K2MXFMX.js.map +1 -0
  215. package/dist/cli-bundle/chunks/{chunk-TNAP7EJX.js → chunk-7L5VOUYP.js} +6 -17
  216. package/dist/cli-bundle/chunks/chunk-7L5VOUYP.js.map +7 -0
  217. package/dist/cli-bundle/chunks/chunk-7ZGKNHUL.js +61 -0
  218. package/dist/cli-bundle/chunks/chunk-7ZGKNHUL.js.map +7 -0
  219. package/dist/cli-bundle/chunks/{chunk-7IYFN5R7.js → chunk-A576QZDL.js} +223 -50
  220. package/dist/cli-bundle/chunks/chunk-A576QZDL.js.map +1 -0
  221. package/dist/cli-bundle/chunks/{chunk-KBPQHXWG.js → chunk-AERT7KT3.js} +5 -5
  222. package/dist/cli-bundle/chunks/chunk-ASM4DVRW.js +58 -0
  223. package/dist/cli-bundle/chunks/chunk-ASM4DVRW.js.map +1 -0
  224. package/dist/cli-bundle/chunks/{chunk-KWAXVAXX.js → chunk-B5Q7XC4K.js} +117 -37
  225. package/dist/cli-bundle/chunks/chunk-B5Q7XC4K.js.map +7 -0
  226. package/dist/cli-bundle/chunks/{chunk-EWFY7SLA.js → chunk-BJWTFOZM.js} +74 -14
  227. package/dist/cli-bundle/chunks/chunk-BJWTFOZM.js.map +1 -0
  228. package/dist/cli-bundle/chunks/{chunk-XJDGS74Y.js → chunk-CBMETQ2U.js} +105 -31
  229. package/dist/cli-bundle/chunks/chunk-CBMETQ2U.js.map +1 -0
  230. package/dist/cli-bundle/chunks/{chunk-ESANVZF4.js → chunk-E6J2PEK6.js} +3 -3
  231. package/dist/cli-bundle/chunks/{chunk-VSRZRLG3.js → chunk-F2GC6L3N.js} +3 -3
  232. package/dist/cli-bundle/chunks/{chunk-I7NYDZDV.js → chunk-F7WSO5UX.js} +7 -18
  233. package/dist/cli-bundle/chunks/chunk-F7WSO5UX.js.map +1 -0
  234. package/dist/cli-bundle/chunks/{chunk-VAOUX6TK.js → chunk-FTAZLAR7.js} +8 -5
  235. package/dist/cli-bundle/chunks/{chunk-VAOUX6TK.js.map → chunk-FTAZLAR7.js.map} +1 -1
  236. package/dist/cli-bundle/chunks/{chunk-OASDW5UI.js → chunk-FXNT5LPX.js} +77 -9
  237. package/dist/cli-bundle/chunks/chunk-FXNT5LPX.js.map +1 -0
  238. package/dist/cli-bundle/chunks/{chunk-WUNFKP7M.js → chunk-G2YVUY7I.js} +14 -9
  239. package/dist/cli-bundle/chunks/chunk-G2YVUY7I.js.map +1 -0
  240. package/dist/cli-bundle/chunks/{chunk-L5EPZQIC.js → chunk-G3CEIXTV.js} +68 -19
  241. package/dist/cli-bundle/chunks/chunk-G3CEIXTV.js.map +7 -0
  242. package/dist/cli-bundle/chunks/{chunk-UUWGCWBU.js → chunk-GAVE4MYM.js} +37 -63
  243. package/dist/cli-bundle/chunks/chunk-GAVE4MYM.js.map +1 -0
  244. package/dist/cli-bundle/chunks/{chunk-SXKNJPQ7.js → chunk-GQ4JKNMV.js} +4 -4
  245. package/dist/cli-bundle/chunks/{chunk-SXKNJPQ7.js.map → chunk-GQ4JKNMV.js.map} +1 -1
  246. package/dist/cli-bundle/chunks/{chunk-73ZPG2I3.js → chunk-GYMG7AG6.js} +36 -62
  247. package/dist/cli-bundle/chunks/chunk-GYMG7AG6.js.map +7 -0
  248. package/dist/cli-bundle/chunks/{chunk-35P4GT6E.js → chunk-H6EH6ENJ.js} +362 -22
  249. package/dist/cli-bundle/chunks/chunk-H6EH6ENJ.js.map +7 -0
  250. package/dist/cli-bundle/chunks/{chunk-F75JSIOZ.js → chunk-HDIDUME4.js} +45 -13
  251. package/dist/cli-bundle/chunks/chunk-HDIDUME4.js.map +1 -0
  252. package/dist/cli-bundle/chunks/{chunk-XWMF3POR.js → chunk-HPELHUTG.js} +122 -45
  253. package/dist/cli-bundle/chunks/chunk-HPELHUTG.js.map +1 -0
  254. package/dist/cli-bundle/chunks/{chunk-QKW5D45B.js → chunk-II7OGE3V.js} +20 -9
  255. package/dist/cli-bundle/chunks/chunk-II7OGE3V.js.map +1 -0
  256. package/dist/cli-bundle/chunks/{chunk-4HFU4UO2.js → chunk-ILHLIA47.js} +5 -5
  257. package/dist/cli-bundle/chunks/{chunk-4HFU4UO2.js.map → chunk-ILHLIA47.js.map} +1 -1
  258. package/dist/cli-bundle/chunks/{chunk-P5BJOMBB.js → chunk-IMQG4VR3.js} +118 -74
  259. package/dist/cli-bundle/chunks/chunk-IMQG4VR3.js.map +1 -0
  260. package/dist/cli-bundle/chunks/{chunk-AX4GEVQC.js → chunk-IQVB3YDD.js} +88 -22
  261. package/dist/cli-bundle/chunks/chunk-IQVB3YDD.js.map +7 -0
  262. package/dist/cli-bundle/chunks/{chunk-I53JBTJW.js → chunk-KQ3LAMDO.js} +45 -13
  263. package/dist/cli-bundle/chunks/chunk-KQ3LAMDO.js.map +7 -0
  264. package/dist/cli-bundle/chunks/{chunk-A6LXQFO7.js → chunk-KTVETP66.js} +334 -253
  265. package/dist/cli-bundle/chunks/chunk-KTVETP66.js.map +1 -0
  266. package/dist/cli-bundle/chunks/{chunk-DY6C42S6.js → chunk-KZYVTOG5.js} +26 -11
  267. package/dist/cli-bundle/chunks/chunk-KZYVTOG5.js.map +7 -0
  268. package/dist/cli-bundle/chunks/{chunk-HGLC63AU.js → chunk-L6FJPOT4.js} +11 -10
  269. package/dist/cli-bundle/chunks/{chunk-HGLC63AU.js.map → chunk-L6FJPOT4.js.map} +1 -1
  270. package/dist/cli-bundle/chunks/{chunk-FY4SPXSC.js → chunk-LV5FFQ7M.js} +354 -266
  271. package/dist/cli-bundle/chunks/chunk-LV5FFQ7M.js.map +7 -0
  272. package/dist/cli-bundle/chunks/{chunk-PNYAAB4S.js → chunk-LWGMDLQ6.js} +8 -3
  273. package/dist/cli-bundle/chunks/chunk-LWGMDLQ6.js.map +1 -0
  274. package/dist/cli-bundle/chunks/{chunk-XTKJSVWH.js → chunk-M23HXJL3.js} +2 -2
  275. package/dist/cli-bundle/chunks/{chunk-S26FESD4.js → chunk-MJZUZ2QE.js} +3 -3
  276. package/dist/cli-bundle/chunks/{chunk-I2IJY2NL.js → chunk-NCIBNERT.js} +4 -4
  277. package/dist/cli-bundle/chunks/{chunk-I2IJY2NL.js.map → chunk-NCIBNERT.js.map} +1 -1
  278. package/dist/cli-bundle/chunks/{chunk-TK5VZFHY.js → chunk-NIQHNDBZ.js} +76 -8
  279. package/dist/cli-bundle/chunks/chunk-NIQHNDBZ.js.map +7 -0
  280. package/dist/cli-bundle/chunks/{chunk-C6SAP27O.js → chunk-O46LTCXQ.js} +4 -4
  281. package/dist/cli-bundle/chunks/{chunk-YW6Q3RYZ.js → chunk-OCTQJP42.js} +19 -8
  282. package/dist/cli-bundle/chunks/{chunk-YW6Q3RYZ.js.map → chunk-OCTQJP42.js.map} +2 -2
  283. package/dist/cli-bundle/chunks/{chunk-WPDMBIX6.js → chunk-OLTYNVJR.js} +5 -5
  284. package/dist/cli-bundle/chunks/{chunk-IUKD4W6Z.js → chunk-OY3P2I6B.js} +13 -8
  285. package/dist/cli-bundle/chunks/chunk-OY3P2I6B.js.map +7 -0
  286. package/dist/cli-bundle/chunks/{chunk-SO55HRA5.js → chunk-PZD7WPUC.js} +69 -20
  287. package/dist/cli-bundle/chunks/chunk-PZD7WPUC.js.map +1 -0
  288. package/dist/cli-bundle/chunks/{chunk-HHHJ2GI3.js → chunk-Q5RLUCP3.js} +74 -14
  289. package/dist/cli-bundle/chunks/chunk-Q5RLUCP3.js.map +7 -0
  290. package/dist/cli-bundle/chunks/{chunk-S2ZLDYGS.js → chunk-RKKIH2ZQ.js} +116 -36
  291. package/dist/cli-bundle/chunks/chunk-RKKIH2ZQ.js.map +1 -0
  292. package/dist/cli-bundle/chunks/{chunk-GWZSYR6X.js → chunk-SPYPC5CB.js} +3 -3
  293. package/dist/cli-bundle/chunks/{chunk-GWZSYR6X.js.map → chunk-SPYPC5CB.js.map} +1 -1
  294. package/dist/cli-bundle/chunks/{chunk-7AMK6DOW.js → chunk-SY4GKIWT.js} +88 -22
  295. package/dist/cli-bundle/chunks/chunk-SY4GKIWT.js.map +1 -0
  296. package/dist/cli-bundle/chunks/{chunk-ZLMIWZUG.js → chunk-SY4PZWIZ.js} +7 -4
  297. package/dist/cli-bundle/chunks/{chunk-ZLMIWZUG.js.map → chunk-SY4PZWIZ.js.map} +2 -2
  298. package/dist/cli-bundle/chunks/{chunk-R2OUQVBK.js → chunk-T5VU7ROQ.js} +4 -4
  299. package/dist/cli-bundle/chunks/{chunk-37CYVF73.js → chunk-TIRZIQRP.js} +121 -44
  300. package/dist/cli-bundle/chunks/chunk-TIRZIQRP.js.map +7 -0
  301. package/dist/cli-bundle/chunks/{chunk-7UGSRQCL.js → chunk-TUB3DZAZ.js} +107 -33
  302. package/dist/cli-bundle/chunks/chunk-TUB3DZAZ.js.map +7 -0
  303. package/dist/cli-bundle/chunks/chunk-UAR2VNCK.js +394 -0
  304. package/dist/cli-bundle/chunks/chunk-UAR2VNCK.js.map +1 -0
  305. package/dist/cli-bundle/chunks/{chunk-P5U5EOMA.js → chunk-UBMCSJXX.js} +3 -3
  306. package/dist/cli-bundle/chunks/{chunk-ZYNJNPYD.js → chunk-UUKORJSN.js} +4 -4
  307. package/dist/cli-bundle/chunks/{chunk-R4VWYWRN.js → chunk-W3HFLORZ.js} +7 -2
  308. package/dist/cli-bundle/chunks/chunk-W3HFLORZ.js.map +7 -0
  309. package/dist/cli-bundle/chunks/{chunk-VPEAS7PS.js → chunk-WZCQVABQ.js} +2 -2
  310. package/dist/cli-bundle/chunks/chunk-X3W5ESZQ.js +32 -0
  311. package/dist/cli-bundle/chunks/chunk-X3W5ESZQ.js.map +1 -0
  312. package/dist/cli-bundle/chunks/{chunk-4YFAGDRH.js → chunk-XLNNCKTN.js} +322 -19
  313. package/dist/cli-bundle/chunks/chunk-XLNNCKTN.js.map +7 -0
  314. package/dist/cli-bundle/chunks/{chunk-RXAP6JL5.js → chunk-XNOY7TCB.js} +118 -74
  315. package/dist/cli-bundle/chunks/chunk-XNOY7TCB.js.map +7 -0
  316. package/dist/cli-bundle/chunks/{chunk-Y3YKK7CY.js → chunk-YGRPBFMA.js} +2 -2
  317. package/dist/cli-bundle/chunks/{chunk-QNJSITCX.js → chunk-YXTLI4XP.js} +20 -9
  318. package/dist/cli-bundle/chunks/chunk-YXTLI4XP.js.map +1 -0
  319. package/dist/cli-bundle/chunks/{chunk-FDH2X65L.js → chunk-Z3MUNQRV.js} +52 -9
  320. package/dist/cli-bundle/chunks/chunk-Z3MUNQRV.js.map +1 -0
  321. package/dist/cli-bundle/chunks/{chunk-XMBI6TNW.js → chunk-ZJRDVYZI.js} +4 -4
  322. package/dist/cli-bundle/chunks/{chunk-CCX4RSYZ.js → chunk-ZONXMSVB.js} +10 -9
  323. package/dist/cli-bundle/chunks/chunk-ZONXMSVB.js.map +1 -0
  324. package/dist/cli-bundle/chunks/{claim-2RDYMCTP.js → claim-4APLUXJW.js} +10 -10
  325. package/dist/cli-bundle/chunks/{claim-MJ7DZFC3.js → claim-NEO7AGWH.js} +10 -10
  326. package/dist/cli-bundle/chunks/{close-XLEKIQSW.js → close-3QABBNGU.js} +8 -8
  327. package/dist/cli-bundle/chunks/close-ILMZR3D7.js +13 -0
  328. package/dist/cli-bundle/chunks/{close-many-AOD4HSAZ.js → close-many-MIZLTYGL.js} +32 -20
  329. package/dist/cli-bundle/chunks/close-many-MIZLTYGL.js.map +1 -0
  330. package/dist/cli-bundle/chunks/{close-many-XKAQY5CQ.js → close-many-Q7Y5AHQI.js} +31 -19
  331. package/dist/cli-bundle/chunks/close-many-Q7Y5AHQI.js.map +7 -0
  332. package/dist/cli-bundle/chunks/{comments-RN5TG4ZN.js → comments-DAIQPOMU.js} +55 -31
  333. package/dist/cli-bundle/chunks/comments-DAIQPOMU.js.map +1 -0
  334. package/dist/cli-bundle/chunks/{comments-B4RWWDJT.js → comments-IWFSVM4P.js} +54 -30
  335. package/dist/cli-bundle/chunks/comments-IWFSVM4P.js.map +7 -0
  336. package/dist/cli-bundle/chunks/{config-3JXJ3XZ7.js → config-IOJELD6O.js} +45 -19
  337. package/dist/cli-bundle/chunks/config-IOJELD6O.js.map +1 -0
  338. package/dist/cli-bundle/chunks/{config-FZ4UDC4B.js → config-PXTMAYV3.js} +44 -18
  339. package/dist/cli-bundle/chunks/config-PXTMAYV3.js.map +7 -0
  340. package/dist/cli-bundle/chunks/{context-QBPO3BFM.js → context-QHJSCJW4.js} +128 -39
  341. package/dist/cli-bundle/chunks/context-QHJSCJW4.js.map +1 -0
  342. package/dist/cli-bundle/chunks/{context-L36PIN35.js → context-XZS2VFKU.js} +127 -38
  343. package/dist/cli-bundle/chunks/context-XZS2VFKU.js.map +7 -0
  344. package/dist/cli-bundle/chunks/{contracts-2G66IGIA.js → contracts-B7U4OJTV.js} +54 -10
  345. package/dist/cli-bundle/chunks/contracts-B7U4OJTV.js.map +1 -0
  346. package/dist/cli-bundle/chunks/{contracts-PJCHYSO5.js → contracts-NSBVLXQ3.js} +54 -10
  347. package/dist/cli-bundle/chunks/contracts-NSBVLXQ3.js.map +7 -0
  348. package/dist/cli-bundle/chunks/{copy-FWIVTLBO.js → copy-Q64T5FD4.js} +7 -7
  349. package/dist/cli-bundle/chunks/{copy-ALU5WMHA.js → copy-SG34LCMU.js} +7 -7
  350. package/dist/cli-bundle/chunks/create-F5HZX2S4.js +30 -0
  351. package/dist/cli-bundle/chunks/{create-5433DP3G.js → create-IPAX2SNL.js} +16 -13
  352. package/dist/cli-bundle/chunks/{delete-Y2SGJBGY.js → delete-TLXR7LJ2.js} +7 -7
  353. package/dist/cli-bundle/chunks/{delete-IYTIYAJS.js → delete-VH3L7DZ6.js} +7 -7
  354. package/dist/cli-bundle/chunks/{deps-CZ4PTVXU.js → deps-J3HBBLDB.js} +9 -10
  355. package/dist/cli-bundle/chunks/{deps-CZ4PTVXU.js.map → deps-J3HBBLDB.js.map} +2 -2
  356. package/dist/cli-bundle/chunks/{deps-6TSPOSGU.js → deps-XV6JJ6IN.js} +10 -11
  357. package/dist/cli-bundle/chunks/deps-XV6JJ6IN.js.map +1 -0
  358. package/dist/cli-bundle/chunks/{docs-MXLGZUIT.js → docs-GWDEB7JH.js} +9 -9
  359. package/dist/cli-bundle/chunks/{docs-I3BAF5WH.js → docs-RCLNSKID.js} +9 -9
  360. package/dist/cli-bundle/chunks/{extension-Q34OEWO5.js → extension-5RN65LHT.js} +7 -5
  361. package/dist/cli-bundle/chunks/{extension-WH2FOIOZ.js → extension-7KO2NX2A.js} +7 -5
  362. package/dist/cli-bundle/chunks/{files-GUXUM2MB.js → files-3TCQHUHA.js} +25 -11
  363. package/dist/cli-bundle/chunks/files-3TCQHUHA.js.map +1 -0
  364. package/dist/cli-bundle/chunks/{files-FYP3MDPX.js → files-5FDUPSEA.js} +24 -10
  365. package/dist/cli-bundle/chunks/files-5FDUPSEA.js.map +7 -0
  366. package/dist/cli-bundle/chunks/focus-7AQMNRSU.js +109 -0
  367. package/dist/cli-bundle/chunks/focus-7AQMNRSU.js.map +7 -0
  368. package/dist/cli-bundle/chunks/focus-HQXBYPKM.js +106 -0
  369. package/dist/cli-bundle/chunks/focus-HQXBYPKM.js.map +1 -0
  370. package/dist/cli-bundle/chunks/{gc-KGQG66SA.js → gc-2FGKYRJ4.js} +3 -3
  371. package/dist/cli-bundle/chunks/{gc-FENB2ESG.js → gc-5B6ABL3Z.js} +3 -3
  372. package/dist/cli-bundle/chunks/{get-PCHS7RA6.js → get-FUMVOJQD.js} +43 -16
  373. package/dist/cli-bundle/chunks/get-FUMVOJQD.js.map +1 -0
  374. package/dist/cli-bundle/chunks/{get-QARTE6BL.js → get-H5BZTW4A.js} +42 -15
  375. package/dist/cli-bundle/chunks/get-H5BZTW4A.js.map +7 -0
  376. package/dist/cli-bundle/chunks/{health-E4D7KGHD.js → health-JSVOR6B4.js} +75 -49
  377. package/dist/cli-bundle/chunks/health-JSVOR6B4.js.map +1 -0
  378. package/dist/cli-bundle/chunks/{health-7MTXAVR2.js → health-LE2ZQGSM.js} +74 -48
  379. package/dist/cli-bundle/chunks/health-LE2ZQGSM.js.map +7 -0
  380. package/dist/cli-bundle/chunks/{history-7WUAEWHW.js → history-QO4JVJJP.js} +10 -10
  381. package/dist/cli-bundle/chunks/history-SSXGGTVZ.js +20 -0
  382. package/dist/cli-bundle/chunks/{history-compact-LW27IPFK.js → history-compact-ID74DOUI.js} +37 -46
  383. package/dist/cli-bundle/chunks/history-compact-ID74DOUI.js.map +7 -0
  384. package/dist/cli-bundle/chunks/{history-compact-3EJ3L2O7.js → history-compact-SDFRPZ4V.js} +38 -47
  385. package/dist/cli-bundle/chunks/history-compact-SDFRPZ4V.js.map +1 -0
  386. package/dist/cli-bundle/chunks/history-redact-VBH44Y7F.js +21 -0
  387. package/dist/cli-bundle/chunks/{history-redact-G72A4EJ4.js → history-redact-Z4P5MM3G.js} +13 -11
  388. package/dist/cli-bundle/chunks/{history-repair-OSQOKJ3E.js → history-repair-ANHEYWKF.js} +43 -48
  389. package/dist/cli-bundle/chunks/history-repair-ANHEYWKF.js.map +7 -0
  390. package/dist/cli-bundle/chunks/{history-repair-SBK7P34V.js → history-repair-CKE7GLZR.js} +44 -49
  391. package/dist/cli-bundle/chunks/history-repair-CKE7GLZR.js.map +1 -0
  392. package/dist/cli-bundle/chunks/init-7FBQO77A.js +19 -0
  393. package/dist/cli-bundle/chunks/{init-S5WEGUJY.js → init-K6MSMB37.js} +11 -9
  394. package/dist/cli-bundle/chunks/{learnings-XK3P4ZDR.js → learnings-VIS3NOQV.js} +13 -12
  395. package/dist/cli-bundle/chunks/learnings-VIS3NOQV.js.map +7 -0
  396. package/dist/cli-bundle/chunks/{learnings-HQXSSKZ5.js → learnings-YYNB64GN.js} +14 -13
  397. package/dist/cli-bundle/chunks/learnings-YYNB64GN.js.map +1 -0
  398. package/dist/cli-bundle/chunks/list-7UE44A2R.js +29 -0
  399. package/dist/cli-bundle/chunks/list-UHMA3N2K.js +33 -0
  400. package/dist/cli-bundle/chunks/{notes-5T6P7C5V.js → notes-2HRMV67I.js} +14 -13
  401. package/dist/cli-bundle/chunks/notes-2HRMV67I.js.map +1 -0
  402. package/dist/cli-bundle/chunks/{notes-U5FZCSBT.js → notes-IN3UMA7W.js} +13 -12
  403. package/dist/cli-bundle/chunks/notes-IN3UMA7W.js.map +7 -0
  404. package/dist/cli-bundle/chunks/{plan-2YTQYWGM.js → plan-I3SVH7FV.js} +16 -15
  405. package/dist/cli-bundle/chunks/plan-I3SVH7FV.js.map +1 -0
  406. package/dist/cli-bundle/chunks/{plan-7IVSICR6.js → plan-PAWCCAPW.js} +15 -14
  407. package/dist/cli-bundle/chunks/plan-PAWCCAPW.js.map +7 -0
  408. package/dist/cli-bundle/chunks/{register-list-query-4UPMHONX.js → register-list-query-N7Z7RTDM.js} +31 -22
  409. package/dist/cli-bundle/chunks/register-list-query-N7Z7RTDM.js.map +7 -0
  410. package/dist/cli-bundle/chunks/{register-list-query-7VOW2C3W.js → register-list-query-OTIK4DVA.js} +32 -23
  411. package/dist/cli-bundle/chunks/register-list-query-OTIK4DVA.js.map +1 -0
  412. package/dist/cli-bundle/chunks/{register-mutation-FARSGYRD.js → register-mutation-UFZK6Q57.js} +216 -66
  413. package/dist/cli-bundle/chunks/register-mutation-UFZK6Q57.js.map +7 -0
  414. package/dist/cli-bundle/chunks/{register-mutation-LJDNVREU.js → register-mutation-XFORLS6D.js} +210 -67
  415. package/dist/cli-bundle/chunks/register-mutation-XFORLS6D.js.map +1 -0
  416. package/dist/cli-bundle/chunks/{register-operations-HCJKDUA6.js → register-operations-6ZCLKRBG.js} +53 -39
  417. package/dist/cli-bundle/chunks/register-operations-6ZCLKRBG.js.map +7 -0
  418. package/dist/cli-bundle/chunks/{register-operations-FFTYAL42.js → register-operations-ITE7JTH3.js} +54 -40
  419. package/dist/cli-bundle/chunks/register-operations-ITE7JTH3.js.map +1 -0
  420. package/dist/cli-bundle/chunks/{register-setup-6AVIUOCC.js → register-setup-7RKGE4BQ.js} +18 -21
  421. package/dist/cli-bundle/chunks/register-setup-7RKGE4BQ.js.map +1 -0
  422. package/dist/cli-bundle/chunks/{register-setup-KVNLO5OJ.js → register-setup-7UKEFKT6.js} +17 -20
  423. package/dist/cli-bundle/chunks/register-setup-7UKEFKT6.js.map +7 -0
  424. package/dist/cli-bundle/chunks/{restore-M6AFHMV4.js → restore-NNVPBBVJ.js} +13 -11
  425. package/dist/cli-bundle/chunks/restore-XXXLQ2XC.js +19 -0
  426. package/dist/cli-bundle/chunks/{schema-AINZ2IMM.js → schema-3HCLXCFX.js} +27 -9
  427. package/dist/cli-bundle/chunks/schema-3HCLXCFX.js.map +7 -0
  428. package/dist/cli-bundle/chunks/{schema-76HDZJCC.js → schema-3YKCQ3VO.js} +28 -10
  429. package/dist/cli-bundle/chunks/schema-3YKCQ3VO.js.map +1 -0
  430. package/dist/cli-bundle/chunks/{search-JMLFQEPJ.js → search-NQ42NC6A.js} +328 -71
  431. package/dist/cli-bundle/chunks/search-NQ42NC6A.js.map +7 -0
  432. package/dist/cli-bundle/chunks/{search-NL3TSCYB.js → search-V7PZ2ICH.js} +328 -71
  433. package/dist/cli-bundle/chunks/search-V7PZ2ICH.js.map +1 -0
  434. package/dist/cli-bundle/chunks/{stats-BKXCBIGT.js → stats-7KD4PJC5.js} +41 -16
  435. package/dist/cli-bundle/chunks/stats-7KD4PJC5.js.map +7 -0
  436. package/dist/cli-bundle/chunks/{stats-UBD56TGK.js → stats-GRHO6RFB.js} +42 -17
  437. package/dist/cli-bundle/chunks/stats-GRHO6RFB.js.map +1 -0
  438. package/dist/cli-bundle/chunks/{telemetry-ZJXK3H7X.js → telemetry-H5GLXNG5.js} +6 -6
  439. package/dist/cli-bundle/chunks/telemetry-H5GLXNG5.js.map +7 -0
  440. package/dist/cli-bundle/chunks/{telemetry-N454RHG5.js → telemetry-TRRYZXWT.js} +7 -7
  441. package/dist/cli-bundle/chunks/telemetry-TRRYZXWT.js.map +1 -0
  442. package/dist/cli-bundle/chunks/test-6CZNIIGA.js +34 -0
  443. package/dist/cli-bundle/chunks/{test-BQAKIXAT.js → test-7GVQ3VMN.js} +16 -14
  444. package/dist/cli-bundle/chunks/{test-all-7LV3I6S5.js → test-all-3LF2OZD2.js} +23 -16
  445. package/dist/cli-bundle/chunks/test-all-3LF2OZD2.js.map +7 -0
  446. package/dist/cli-bundle/chunks/{test-all-TDYCCBA4.js → test-all-ODVADHV6.js} +24 -17
  447. package/dist/cli-bundle/chunks/test-all-ODVADHV6.js.map +1 -0
  448. package/dist/cli-bundle/chunks/{test-runs-E64M6XS3.js → test-runs-LYT6ZTNQ.js} +62 -65
  449. package/dist/cli-bundle/chunks/test-runs-LYT6ZTNQ.js.map +1 -0
  450. package/dist/cli-bundle/chunks/{test-runs-LXZLULCI.js → test-runs-RVP6VWN7.js} +61 -64
  451. package/dist/cli-bundle/chunks/test-runs-RVP6VWN7.js.map +7 -0
  452. package/dist/cli-bundle/chunks/update-MPGM6SBE.js +28 -0
  453. package/dist/cli-bundle/chunks/update-UN75XW3C.js +24 -0
  454. package/dist/cli-bundle/chunks/{update-many-F4IKDWZB.js → update-many-FCU6RKTO.js} +80 -34
  455. package/dist/cli-bundle/chunks/update-many-FCU6RKTO.js.map +1 -0
  456. package/dist/cli-bundle/chunks/{update-many-NTWZ5YT3.js → update-many-XSEQJ24X.js} +79 -33
  457. package/dist/cli-bundle/chunks/update-many-XSEQJ24X.js.map +7 -0
  458. package/dist/cli-bundle/chunks/{upgrade-37F7JKES.js → upgrade-A6TL3INC.js} +22 -8
  459. package/dist/cli-bundle/chunks/upgrade-A6TL3INC.js.map +7 -0
  460. package/dist/cli-bundle/chunks/{upgrade-L32JA4TZ.js → upgrade-FOB5LHO5.js} +23 -9
  461. package/dist/cli-bundle/chunks/upgrade-FOB5LHO5.js.map +1 -0
  462. package/dist/cli-bundle/chunks/{validate-46KCRHL7.js → validate-7BLDG3AT.js} +222 -31
  463. package/dist/cli-bundle/chunks/validate-7BLDG3AT.js.map +1 -0
  464. package/dist/cli-bundle/chunks/{validate-CRFMPTYD.js → validate-EHL3MI2V.js} +236 -31
  465. package/dist/cli-bundle/chunks/validate-EHL3MI2V.js.map +7 -0
  466. package/dist/cli-bundle/main.js +305 -140
  467. package/dist/cli-bundle/main.js.map +3 -3
  468. package/dist/cli.d.ts +10 -0
  469. package/dist/cli.js +21 -8
  470. package/dist/cli.js.map +1 -1
  471. package/dist/core/diagnostics/remediation.js +7 -2
  472. package/dist/core/diagnostics/remediation.js.map +1 -1
  473. package/dist/core/extensions/extension-capability-aliases.js +7 -33
  474. package/dist/core/extensions/extension-capability-aliases.js.map +1 -1
  475. package/dist/core/extensions/extension-policy.js +14 -15
  476. package/dist/core/extensions/extension-policy.js.map +1 -1
  477. package/dist/core/extensions/item-fields.js +4 -5
  478. package/dist/core/extensions/item-fields.js.map +1 -1
  479. package/dist/core/extensions/loader.d.ts +75 -1
  480. package/dist/core/extensions/loader.js +56 -32
  481. package/dist/core/extensions/loader.js.map +1 -1
  482. package/dist/core/governance/content-fields.d.ts +84 -0
  483. package/dist/core/governance/content-fields.js +182 -0
  484. package/dist/core/governance/content-fields.js.map +1 -0
  485. package/dist/core/governance/issue-codes.d.ts +51 -0
  486. package/dist/core/governance/issue-codes.js +95 -0
  487. package/dist/core/governance/issue-codes.js.map +1 -0
  488. package/dist/core/governance/metadata-coverage.d.ts +168 -0
  489. package/dist/core/governance/metadata-coverage.js +362 -0
  490. package/dist/core/governance/metadata-coverage.js.map +1 -0
  491. package/dist/core/history/history-rewrite.d.ts +22 -0
  492. package/dist/core/history/history-rewrite.js +38 -2
  493. package/dist/core/history/history-rewrite.js.map +1 -1
  494. package/dist/core/history/history.d.ts +7 -0
  495. package/dist/core/history/history.js +6 -2
  496. package/dist/core/history/history.js.map +1 -1
  497. package/dist/core/io/body-file.d.ts +14 -0
  498. package/dist/core/io/body-file.js +47 -0
  499. package/dist/core/io/body-file.js.map +1 -0
  500. package/dist/core/item/item-format.d.ts +46 -1
  501. package/dist/core/item/item-format.js +51 -60
  502. package/dist/core/item/item-format.js.map +1 -1
  503. package/dist/core/item/parse.d.ts +9 -0
  504. package/dist/core/item/parse.js +10 -16
  505. package/dist/core/item/parse.js.map +1 -1
  506. package/dist/core/item/type-registry.d.ts +1 -0
  507. package/dist/core/item/type-registry.js +8 -10
  508. package/dist/core/item/type-registry.js.map +1 -1
  509. package/dist/core/lock/lock.d.ts +26 -0
  510. package/dist/core/lock/lock.js +10 -2
  511. package/dist/core/lock/lock.js.map +1 -1
  512. package/dist/core/output/output.d.ts +7 -0
  513. package/dist/core/output/output.js +6 -2
  514. package/dist/core/output/output.js.map +1 -1
  515. package/dist/core/schema/item-types-file.d.ts +25 -2
  516. package/dist/core/schema/item-types-file.js +78 -6
  517. package/dist/core/schema/item-types-file.js.map +1 -1
  518. package/dist/core/schema/runtime-schema.d.ts +7 -0
  519. package/dist/core/schema/runtime-schema.js +23 -16
  520. package/dist/core/schema/runtime-schema.js.map +1 -1
  521. package/dist/core/search/background-refresh.js +3 -3
  522. package/dist/core/search/background-refresh.js.map +1 -1
  523. package/dist/core/search/cache.d.ts +19 -1
  524. package/dist/core/search/cache.js +11 -3
  525. package/dist/core/search/cache.js.map +1 -1
  526. package/dist/core/search/corpus.d.ts +36 -2
  527. package/dist/core/search/corpus.js +120 -24
  528. package/dist/core/search/corpus.js.map +1 -1
  529. package/dist/core/search/providers.d.ts +19 -0
  530. package/dist/core/search/providers.js +19 -2
  531. package/dist/core/search/providers.js.map +1 -1
  532. package/dist/core/sentry/instrument.d.ts +1 -0
  533. package/dist/core/sentry/instrument.js +6 -2
  534. package/dist/core/sentry/instrument.js.map +1 -1
  535. package/dist/core/session/session-state.d.ts +16 -0
  536. package/dist/core/session/session-state.js +48 -0
  537. package/dist/core/session/session-state.js.map +1 -0
  538. package/dist/core/shared/constants.d.ts +8 -0
  539. package/dist/core/shared/constants.js +11 -2
  540. package/dist/core/shared/constants.js.map +1 -1
  541. package/dist/core/shared/errors.d.ts +3 -0
  542. package/dist/core/shared/errors.js +2 -2
  543. package/dist/core/shared/errors.js.map +1 -1
  544. package/dist/core/shared/text-normalization.js +4 -3
  545. package/dist/core/shared/text-normalization.js.map +1 -1
  546. package/dist/core/shared/time.d.ts +13 -0
  547. package/dist/core/shared/time.js +19 -7
  548. package/dist/core/shared/time.js.map +1 -1
  549. package/dist/core/store/item-store.d.ts +11 -0
  550. package/dist/core/store/item-store.js +16 -23
  551. package/dist/core/store/item-store.js.map +1 -1
  552. package/dist/core/store/settings-validator.d.ts +2 -0
  553. package/dist/core/store/settings-validator.js +25 -2
  554. package/dist/core/store/settings-validator.js.map +1 -1
  555. package/dist/core/store/settings.d.ts +60 -1
  556. package/dist/core/store/settings.js +100 -46
  557. package/dist/core/store/settings.js.map +1 -1
  558. package/dist/core/telemetry/observability.js +10 -8
  559. package/dist/core/telemetry/observability.js.map +1 -1
  560. package/dist/core/telemetry/runtime.d.ts +272 -1
  561. package/dist/core/telemetry/runtime.js +358 -37
  562. package/dist/core/telemetry/runtime.js.map +1 -1
  563. package/dist/core/test/background-runs.d.ts +35 -0
  564. package/dist/core/test/background-runs.js +72 -61
  565. package/dist/core/test/background-runs.js.map +1 -1
  566. package/dist/core/test/run-selectors.js +5 -4
  567. package/dist/core/test/run-selectors.js.map +1 -1
  568. package/dist/core/validate/estimate-defaults.d.ts +39 -0
  569. package/dist/core/validate/estimate-defaults.js +117 -0
  570. package/dist/core/validate/estimate-defaults.js.map +1 -0
  571. package/dist/core/validate/fix-planning.d.ts +21 -3
  572. package/dist/core/validate/fix-planning.js +31 -4
  573. package/dist/core/validate/fix-planning.js.map +1 -1
  574. package/dist/core/validate/missing-link-owners.d.ts +64 -0
  575. package/dist/core/validate/missing-link-owners.js +98 -0
  576. package/dist/core/validate/missing-link-owners.js.map +1 -0
  577. package/dist/mcp/server.d.ts +62 -0
  578. package/dist/mcp/server.js +71 -8
  579. package/dist/mcp/server.js.map +1 -1
  580. package/dist/mcp/tool-definitions.js +17 -4
  581. package/dist/mcp/tool-definitions.js.map +1 -1
  582. package/dist/sdk/cli-contracts/commander-types.js +13 -2
  583. package/dist/sdk/cli-contracts/commander-types.js.map +1 -1
  584. package/dist/sdk/cli-contracts/enum-contracts.d.ts +2 -2
  585. package/dist/sdk/cli-contracts/enum-contracts.js +4 -2
  586. package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
  587. package/dist/sdk/cli-contracts/tool-option-contracts.js +110 -2
  588. package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
  589. package/dist/sdk/cli-contracts/tool-parameter-tables.js +83 -8
  590. package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
  591. package/dist/sdk/cli-contracts.d.ts +28 -0
  592. package/dist/sdk/cli-contracts.js +164 -11
  593. package/dist/sdk/cli-contracts.js.map +1 -1
  594. package/dist/types.d.ts +17 -1
  595. package/dist/types.js +3 -3
  596. package/dist/types.js.map +1 -1
  597. package/docs/AGENT_GUIDE.md +15 -3
  598. package/docs/CLAUDE_CODE_PLUGIN.md +2 -2
  599. package/docs/COMMANDS.md +136 -7
  600. package/docs/CONFIGURATION.md +52 -0
  601. package/docs/TESTING.md +6 -4
  602. package/package.json +6 -4
  603. package/packages/pm-calendar/extensions/calendar/runtime.js +6 -0
  604. package/packages/pm-calendar/extensions/calendar/runtime.ts +12 -0
  605. package/packages/pm-todos/extensions/todos/runtime.ts +5 -0
  606. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  607. package/plugins/pm-claude/README.md +6 -14
  608. package/plugins/pm-claude/commands/pm-init.md +1 -1
  609. package/plugins/pm-codex/README.md +1 -1
  610. package/scripts/bundle-cli.mjs +46 -37
  611. package/scripts/finalize-build.mjs +20 -9
  612. package/scripts/prepare-build-cache.mjs +27 -16
  613. package/dist/cli-bundle/chunks/activity-XZIUPGZH.js +0 -16
  614. package/dist/cli-bundle/chunks/aggregate-6OTS3AOO.js.map +0 -1
  615. package/dist/cli-bundle/chunks/aggregate-OD36DJU5.js.map +0 -7
  616. package/dist/cli-bundle/chunks/append-KG55G7S3.js.map +0 -1
  617. package/dist/cli-bundle/chunks/chunk-35P4GT6E.js.map +0 -7
  618. package/dist/cli-bundle/chunks/chunk-37CYVF73.js.map +0 -7
  619. package/dist/cli-bundle/chunks/chunk-3KLPFWZ4.js.map +0 -7
  620. package/dist/cli-bundle/chunks/chunk-4JCSYR6F.js +0 -138
  621. package/dist/cli-bundle/chunks/chunk-4JCSYR6F.js.map +0 -7
  622. package/dist/cli-bundle/chunks/chunk-4YFAGDRH.js.map +0 -7
  623. package/dist/cli-bundle/chunks/chunk-5SCT2JCT.js.map +0 -7
  624. package/dist/cli-bundle/chunks/chunk-73ZPG2I3.js.map +0 -7
  625. package/dist/cli-bundle/chunks/chunk-7AMK6DOW.js.map +0 -1
  626. package/dist/cli-bundle/chunks/chunk-7IYFN5R7.js.map +0 -1
  627. package/dist/cli-bundle/chunks/chunk-7UGSRQCL.js.map +0 -7
  628. package/dist/cli-bundle/chunks/chunk-A6LXQFO7.js.map +0 -1
  629. package/dist/cli-bundle/chunks/chunk-AVGHVVF7.js +0 -128
  630. package/dist/cli-bundle/chunks/chunk-AVGHVVF7.js.map +0 -1
  631. package/dist/cli-bundle/chunks/chunk-AX4GEVQC.js.map +0 -7
  632. package/dist/cli-bundle/chunks/chunk-CCX4RSYZ.js.map +0 -1
  633. package/dist/cli-bundle/chunks/chunk-CW6E4NAT.js.map +0 -1
  634. package/dist/cli-bundle/chunks/chunk-DY6C42S6.js.map +0 -7
  635. package/dist/cli-bundle/chunks/chunk-EWFY7SLA.js.map +0 -1
  636. package/dist/cli-bundle/chunks/chunk-F75JSIOZ.js.map +0 -1
  637. package/dist/cli-bundle/chunks/chunk-FDH2X65L.js.map +0 -1
  638. package/dist/cli-bundle/chunks/chunk-FY4SPXSC.js.map +0 -7
  639. package/dist/cli-bundle/chunks/chunk-GKIZW7SM.js.map +0 -7
  640. package/dist/cli-bundle/chunks/chunk-HHHJ2GI3.js.map +0 -7
  641. package/dist/cli-bundle/chunks/chunk-HI7STVF2.js.map +0 -1
  642. package/dist/cli-bundle/chunks/chunk-I53JBTJW.js.map +0 -7
  643. package/dist/cli-bundle/chunks/chunk-I7NYDZDV.js.map +0 -1
  644. package/dist/cli-bundle/chunks/chunk-IUKD4W6Z.js.map +0 -7
  645. package/dist/cli-bundle/chunks/chunk-KWAXVAXX.js.map +0 -7
  646. package/dist/cli-bundle/chunks/chunk-L5EPZQIC.js.map +0 -7
  647. package/dist/cli-bundle/chunks/chunk-OASDW5UI.js.map +0 -1
  648. package/dist/cli-bundle/chunks/chunk-OLKBSY4N.js.map +0 -7
  649. package/dist/cli-bundle/chunks/chunk-P5BJOMBB.js.map +0 -1
  650. package/dist/cli-bundle/chunks/chunk-PNYAAB4S.js.map +0 -1
  651. package/dist/cli-bundle/chunks/chunk-QKW5D45B.js.map +0 -1
  652. package/dist/cli-bundle/chunks/chunk-QNJSITCX.js.map +0 -1
  653. package/dist/cli-bundle/chunks/chunk-R4VWYWRN.js.map +0 -7
  654. package/dist/cli-bundle/chunks/chunk-RXAP6JL5.js.map +0 -7
  655. package/dist/cli-bundle/chunks/chunk-S2ZLDYGS.js.map +0 -1
  656. package/dist/cli-bundle/chunks/chunk-SO55HRA5.js.map +0 -1
  657. package/dist/cli-bundle/chunks/chunk-TK5VZFHY.js.map +0 -7
  658. package/dist/cli-bundle/chunks/chunk-TNAP7EJX.js.map +0 -7
  659. package/dist/cli-bundle/chunks/chunk-UIG4TW2H.js.map +0 -1
  660. package/dist/cli-bundle/chunks/chunk-UUWGCWBU.js.map +0 -1
  661. package/dist/cli-bundle/chunks/chunk-VFUZV5EB.js.map +0 -7
  662. package/dist/cli-bundle/chunks/chunk-WUNFKP7M.js.map +0 -1
  663. package/dist/cli-bundle/chunks/chunk-XJDGS74Y.js.map +0 -1
  664. package/dist/cli-bundle/chunks/chunk-XWMF3POR.js.map +0 -1
  665. package/dist/cli-bundle/chunks/chunk-ZMW77VWV.js.map +0 -1
  666. package/dist/cli-bundle/chunks/close-4FMAPEMY.js +0 -13
  667. package/dist/cli-bundle/chunks/close-many-AOD4HSAZ.js.map +0 -1
  668. package/dist/cli-bundle/chunks/close-many-XKAQY5CQ.js.map +0 -7
  669. package/dist/cli-bundle/chunks/comments-B4RWWDJT.js.map +0 -7
  670. package/dist/cli-bundle/chunks/comments-RN5TG4ZN.js.map +0 -1
  671. package/dist/cli-bundle/chunks/config-3JXJ3XZ7.js.map +0 -1
  672. package/dist/cli-bundle/chunks/config-FZ4UDC4B.js.map +0 -7
  673. package/dist/cli-bundle/chunks/context-L36PIN35.js.map +0 -7
  674. package/dist/cli-bundle/chunks/context-QBPO3BFM.js.map +0 -1
  675. package/dist/cli-bundle/chunks/contracts-2G66IGIA.js.map +0 -1
  676. package/dist/cli-bundle/chunks/contracts-PJCHYSO5.js.map +0 -7
  677. package/dist/cli-bundle/chunks/create-VWLWS34Z.js +0 -27
  678. package/dist/cli-bundle/chunks/deps-6TSPOSGU.js.map +0 -1
  679. package/dist/cli-bundle/chunks/files-FYP3MDPX.js.map +0 -7
  680. package/dist/cli-bundle/chunks/files-GUXUM2MB.js.map +0 -1
  681. package/dist/cli-bundle/chunks/get-PCHS7RA6.js.map +0 -1
  682. package/dist/cli-bundle/chunks/get-QARTE6BL.js.map +0 -7
  683. package/dist/cli-bundle/chunks/health-7MTXAVR2.js.map +0 -7
  684. package/dist/cli-bundle/chunks/health-E4D7KGHD.js.map +0 -1
  685. package/dist/cli-bundle/chunks/history-L2FQFRTU.js +0 -20
  686. package/dist/cli-bundle/chunks/history-compact-3EJ3L2O7.js.map +0 -1
  687. package/dist/cli-bundle/chunks/history-compact-LW27IPFK.js.map +0 -7
  688. package/dist/cli-bundle/chunks/history-redact-QWQCX5DZ.js +0 -19
  689. package/dist/cli-bundle/chunks/history-repair-OSQOKJ3E.js.map +0 -7
  690. package/dist/cli-bundle/chunks/history-repair-SBK7P34V.js.map +0 -1
  691. package/dist/cli-bundle/chunks/init-4BKRHGWW.js +0 -17
  692. package/dist/cli-bundle/chunks/learnings-HQXSSKZ5.js.map +0 -1
  693. package/dist/cli-bundle/chunks/learnings-XK3P4ZDR.js.map +0 -7
  694. package/dist/cli-bundle/chunks/list-6CL3XFT6.js +0 -23
  695. package/dist/cli-bundle/chunks/list-BYNN4ZEO.js +0 -19
  696. package/dist/cli-bundle/chunks/notes-5T6P7C5V.js.map +0 -1
  697. package/dist/cli-bundle/chunks/notes-U5FZCSBT.js.map +0 -7
  698. package/dist/cli-bundle/chunks/plan-2YTQYWGM.js.map +0 -1
  699. package/dist/cli-bundle/chunks/plan-7IVSICR6.js.map +0 -7
  700. package/dist/cli-bundle/chunks/register-list-query-4UPMHONX.js.map +0 -7
  701. package/dist/cli-bundle/chunks/register-list-query-7VOW2C3W.js.map +0 -1
  702. package/dist/cli-bundle/chunks/register-mutation-FARSGYRD.js.map +0 -7
  703. package/dist/cli-bundle/chunks/register-mutation-LJDNVREU.js.map +0 -1
  704. package/dist/cli-bundle/chunks/register-operations-FFTYAL42.js.map +0 -1
  705. package/dist/cli-bundle/chunks/register-operations-HCJKDUA6.js.map +0 -7
  706. package/dist/cli-bundle/chunks/register-setup-6AVIUOCC.js.map +0 -1
  707. package/dist/cli-bundle/chunks/register-setup-KVNLO5OJ.js.map +0 -7
  708. package/dist/cli-bundle/chunks/restore-CHIOQAQL.js +0 -17
  709. package/dist/cli-bundle/chunks/schema-76HDZJCC.js.map +0 -1
  710. package/dist/cli-bundle/chunks/schema-AINZ2IMM.js.map +0 -7
  711. package/dist/cli-bundle/chunks/search-JMLFQEPJ.js.map +0 -7
  712. package/dist/cli-bundle/chunks/search-NL3TSCYB.js.map +0 -1
  713. package/dist/cli-bundle/chunks/stats-BKXCBIGT.js.map +0 -7
  714. package/dist/cli-bundle/chunks/stats-UBD56TGK.js.map +0 -1
  715. package/dist/cli-bundle/chunks/telemetry-N454RHG5.js.map +0 -1
  716. package/dist/cli-bundle/chunks/telemetry-ZJXK3H7X.js.map +0 -7
  717. package/dist/cli-bundle/chunks/test-O74JFUH5.js +0 -32
  718. package/dist/cli-bundle/chunks/test-all-7LV3I6S5.js.map +0 -7
  719. package/dist/cli-bundle/chunks/test-all-TDYCCBA4.js.map +0 -1
  720. package/dist/cli-bundle/chunks/test-runs-E64M6XS3.js.map +0 -1
  721. package/dist/cli-bundle/chunks/test-runs-LXZLULCI.js.map +0 -7
  722. package/dist/cli-bundle/chunks/update-36JM7YZT.js +0 -21
  723. package/dist/cli-bundle/chunks/update-I246PCLO.js +0 -25
  724. package/dist/cli-bundle/chunks/update-many-F4IKDWZB.js.map +0 -1
  725. package/dist/cli-bundle/chunks/update-many-NTWZ5YT3.js.map +0 -7
  726. package/dist/cli-bundle/chunks/upgrade-37F7JKES.js.map +0 -7
  727. package/dist/cli-bundle/chunks/upgrade-L32JA4TZ.js.map +0 -1
  728. package/dist/cli-bundle/chunks/validate-46KCRHL7.js.map +0 -1
  729. package/dist/cli-bundle/chunks/validate-CRFMPTYD.js.map +0 -7
  730. /package/dist/cli-bundle/chunks/{activity-XZIUPGZH.js.map → activity-5P2KQCTH.js.map} +0 -0
  731. /package/dist/cli-bundle/chunks/{activity-XADJOG6G.js.map → activity-MJGTX4LO.js.map} +0 -0
  732. /package/dist/cli-bundle/chunks/{chunk-ATEES5SX.js.map → chunk-2JEGCDYT.js.map} +0 -0
  733. /package/dist/cli-bundle/chunks/{chunk-XUC4C4PT.js.map → chunk-3WAULYOY.js.map} +0 -0
  734. /package/dist/cli-bundle/chunks/{chunk-QJMGRZO2.js.map → chunk-7AGIXLNK.js.map} +0 -0
  735. /package/dist/cli-bundle/chunks/{chunk-KBPQHXWG.js.map → chunk-AERT7KT3.js.map} +0 -0
  736. /package/dist/cli-bundle/chunks/{chunk-ESANVZF4.js.map → chunk-E6J2PEK6.js.map} +0 -0
  737. /package/dist/cli-bundle/chunks/{chunk-VSRZRLG3.js.map → chunk-F2GC6L3N.js.map} +0 -0
  738. /package/dist/cli-bundle/chunks/{chunk-XTKJSVWH.js.map → chunk-M23HXJL3.js.map} +0 -0
  739. /package/dist/cli-bundle/chunks/{chunk-S26FESD4.js.map → chunk-MJZUZ2QE.js.map} +0 -0
  740. /package/dist/cli-bundle/chunks/{chunk-C6SAP27O.js.map → chunk-O46LTCXQ.js.map} +0 -0
  741. /package/dist/cli-bundle/chunks/{chunk-WPDMBIX6.js.map → chunk-OLTYNVJR.js.map} +0 -0
  742. /package/dist/cli-bundle/chunks/{chunk-R2OUQVBK.js.map → chunk-T5VU7ROQ.js.map} +0 -0
  743. /package/dist/cli-bundle/chunks/{chunk-P5U5EOMA.js.map → chunk-UBMCSJXX.js.map} +0 -0
  744. /package/dist/cli-bundle/chunks/{chunk-ZYNJNPYD.js.map → chunk-UUKORJSN.js.map} +0 -0
  745. /package/dist/cli-bundle/chunks/{chunk-VPEAS7PS.js.map → chunk-WZCQVABQ.js.map} +0 -0
  746. /package/dist/cli-bundle/chunks/{chunk-Y3YKK7CY.js.map → chunk-YGRPBFMA.js.map} +0 -0
  747. /package/dist/cli-bundle/chunks/{chunk-XMBI6TNW.js.map → chunk-ZJRDVYZI.js.map} +0 -0
  748. /package/dist/cli-bundle/chunks/{claim-2RDYMCTP.js.map → claim-4APLUXJW.js.map} +0 -0
  749. /package/dist/cli-bundle/chunks/{claim-MJ7DZFC3.js.map → claim-NEO7AGWH.js.map} +0 -0
  750. /package/dist/cli-bundle/chunks/{close-XLEKIQSW.js.map → close-3QABBNGU.js.map} +0 -0
  751. /package/dist/cli-bundle/chunks/{close-4FMAPEMY.js.map → close-ILMZR3D7.js.map} +0 -0
  752. /package/dist/cli-bundle/chunks/{copy-FWIVTLBO.js.map → copy-Q64T5FD4.js.map} +0 -0
  753. /package/dist/cli-bundle/chunks/{copy-ALU5WMHA.js.map → copy-SG34LCMU.js.map} +0 -0
  754. /package/dist/cli-bundle/chunks/{create-VWLWS34Z.js.map → create-F5HZX2S4.js.map} +0 -0
  755. /package/dist/cli-bundle/chunks/{create-5433DP3G.js.map → create-IPAX2SNL.js.map} +0 -0
  756. /package/dist/cli-bundle/chunks/{delete-Y2SGJBGY.js.map → delete-TLXR7LJ2.js.map} +0 -0
  757. /package/dist/cli-bundle/chunks/{delete-IYTIYAJS.js.map → delete-VH3L7DZ6.js.map} +0 -0
  758. /package/dist/cli-bundle/chunks/{docs-MXLGZUIT.js.map → docs-GWDEB7JH.js.map} +0 -0
  759. /package/dist/cli-bundle/chunks/{docs-I3BAF5WH.js.map → docs-RCLNSKID.js.map} +0 -0
  760. /package/dist/cli-bundle/chunks/{extension-Q34OEWO5.js.map → extension-5RN65LHT.js.map} +0 -0
  761. /package/dist/cli-bundle/chunks/{extension-WH2FOIOZ.js.map → extension-7KO2NX2A.js.map} +0 -0
  762. /package/dist/cli-bundle/chunks/{gc-KGQG66SA.js.map → gc-2FGKYRJ4.js.map} +0 -0
  763. /package/dist/cli-bundle/chunks/{gc-FENB2ESG.js.map → gc-5B6ABL3Z.js.map} +0 -0
  764. /package/dist/cli-bundle/chunks/{history-7WUAEWHW.js.map → history-QO4JVJJP.js.map} +0 -0
  765. /package/dist/cli-bundle/chunks/{history-L2FQFRTU.js.map → history-SSXGGTVZ.js.map} +0 -0
  766. /package/dist/cli-bundle/chunks/{history-redact-QWQCX5DZ.js.map → history-redact-VBH44Y7F.js.map} +0 -0
  767. /package/dist/cli-bundle/chunks/{history-redact-G72A4EJ4.js.map → history-redact-Z4P5MM3G.js.map} +0 -0
  768. /package/dist/cli-bundle/chunks/{init-4BKRHGWW.js.map → init-7FBQO77A.js.map} +0 -0
  769. /package/dist/cli-bundle/chunks/{init-S5WEGUJY.js.map → init-K6MSMB37.js.map} +0 -0
  770. /package/dist/cli-bundle/chunks/{list-BYNN4ZEO.js.map → list-7UE44A2R.js.map} +0 -0
  771. /package/dist/cli-bundle/chunks/{list-6CL3XFT6.js.map → list-UHMA3N2K.js.map} +0 -0
  772. /package/dist/cli-bundle/chunks/{restore-M6AFHMV4.js.map → restore-NNVPBBVJ.js.map} +0 -0
  773. /package/dist/cli-bundle/chunks/{restore-CHIOQAQL.js.map → restore-XXXLQ2XC.js.map} +0 -0
  774. /package/dist/cli-bundle/chunks/{test-O74JFUH5.js.map → test-6CZNIIGA.js.map} +0 -0
  775. /package/dist/cli-bundle/chunks/{test-BQAKIXAT.js.map → test-7GVQ3VMN.js.map} +0 -0
  776. /package/dist/cli-bundle/chunks/{update-I246PCLO.js.map → update-MPGM6SBE.js.map} +0 -0
  777. /package/dist/cli-bundle/chunks/{update-36JM7YZT.js.map → update-UN75XW3C.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../../../../../core/telemetry/observability.ts","../../../../../../../../core/telemetry/runtime.ts"],"sourcesContent":["import { EXIT_CODE, type TelemetryErrorCategory } from \"../shared/constants.js\";\n\nexport type TelemetryResolutionStage = \"parse\" | \"preflight\" | \"execute\" | \"unknown\";\n\nexport type TelemetryCommandResolution =\n | \"success\"\n | \"nonexistent_command\"\n | \"invalid_option\"\n | \"missing_required_option\"\n | \"missing_required_argument\"\n | \"invalid_usage\"\n | \"validation_failed\"\n | \"health_findings\"\n | \"validation_findings\"\n | \"conflict\"\n | \"runtime_failed\"\n | \"unknown_failed\";\n\nexport interface TelemetryCommandTaxonomy {\n command_path: string;\n command_root: string;\n command_leaf: string;\n command_depth: number;\n command_family: \"setup\" | \"query\" | \"mutation\" | \"testing\" | \"extension\" | \"diagnostics\" | \"other\";\n}\n\ninterface InferTelemetryErrorCodeParams {\n ok: boolean;\n errorCode?: string;\n errorMessage?: string;\n exitCode?: number;\n}\n\nconst SETUP_ROOT_COMMANDS = new Set([\"init\", \"config\", \"completion\", \"completion-statuses\", \"completion-tags\", \"completion-types\"]);\nconst QUERY_ROOT_COMMANDS = new Set([\n \"list\",\n \"list-all\",\n \"list-open\",\n \"list-in-progress\",\n \"list-blocked\",\n \"list-closed\",\n \"list-canceled\",\n \"list-draft\",\n \"search\",\n \"get\",\n \"context\",\n \"calendar\",\n \"history\",\n \"activity\",\n \"aggregate\",\n \"deps\",\n \"contracts\",\n \"stats\",\n \"dedupe-audit\",\n]);\nconst MUTATION_ROOT_COMMANDS = new Set([\n \"create\",\n \"update\",\n \"update-many\",\n \"close-many\",\n \"append\",\n \"close\",\n \"delete\",\n \"restore\",\n \"claim\",\n \"release\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"files\",\n \"docs\",\n \"start-task\",\n \"pause-task\",\n \"close-task\",\n]);\nconst TESTING_ROOT_COMMANDS = new Set([\"test\", \"test-all\", \"test-runs\", \"test-verify\", \"trace-test\", \"test-ping\"]);\nconst DIAGNOSTICS_ROOT_COMMANDS = new Set([\"health\", \"validate\", \"normalize\", \"reindex\", \"gc\", \"telemetry\", \"extension-doctor\"]);\n\nfunction normalizeCommandPath(commandPath: string): string {\n return commandPath\n .trim()\n .replaceAll(/\\s+/g, \" \")\n .toLowerCase();\n}\n\nfunction normalizeErrorCode(errorCode: string | undefined): string | undefined {\n const normalized = errorCode?.trim().toLowerCase();\n return normalized && normalized.length > 0 ? normalized : undefined;\n}\n\nexport function deriveTelemetryCommandTaxonomy(commandPath: string): TelemetryCommandTaxonomy {\n const normalizedPath = normalizeCommandPath(commandPath);\n const tokens = normalizedPath.length > 0 ? normalizedPath.split(\" \") : [\"<unknown>\"];\n const root = tokens[0] ?? \"<unknown>\";\n const leaf = tokens[tokens.length - 1] ?? root;\n\n let family: TelemetryCommandTaxonomy[\"command_family\"] = \"other\";\n if (SETUP_ROOT_COMMANDS.has(root)) {\n family = \"setup\";\n } else if (QUERY_ROOT_COMMANDS.has(root)) {\n family = \"query\";\n } else if (MUTATION_ROOT_COMMANDS.has(root)) {\n family = \"mutation\";\n } else if (TESTING_ROOT_COMMANDS.has(root)) {\n family = \"testing\";\n } else if (root === \"extension\") {\n family = \"extension\";\n } else if (DIAGNOSTICS_ROOT_COMMANDS.has(root)) {\n family = \"diagnostics\";\n }\n\n return {\n command_path: normalizedPath.length > 0 ? normalizedPath : \"<unknown>\",\n command_root: root,\n command_leaf: leaf,\n command_depth: tokens.length,\n command_family: family,\n };\n}\n\nexport function inferTelemetryErrorCode(params: InferTelemetryErrorCodeParams): string | undefined {\n if (params.ok) {\n return undefined;\n }\n\n const explicit = normalizeErrorCode(params.errorCode);\n if (explicit) {\n return explicit;\n }\n\n const message = (params.errorMessage ?? \"\").trim().toLowerCase();\n if (message.includes(\"unknown command\")) {\n return \"unknown_command\";\n }\n if (message.includes(\"unknown option\")) {\n return \"unknown_option\";\n }\n if (message.includes(\"missing required options\") || message.includes(\"missing required option\")) {\n return \"missing_required_option\";\n }\n if (message.includes(\"missing required argument\")) {\n return \"missing_required_argument\";\n }\n if (message.includes(\"no update flags provided\")) {\n return \"no_update_fields\";\n }\n if (message.includes(\"is assigned to\") && message.includes(\"use --force\")) {\n return \"ownership_conflict\";\n }\n if (message.includes(\"is locked\")) {\n return \"lock_conflict\";\n }\n if (message.includes(\"already terminal\") && message.includes(\"use --force\")) {\n return \"terminal_state_conflict\";\n }\n if (message.includes(\"tracker is not initialized\")) {\n return \"tracker_not_initialized\";\n }\n if (message.includes(\" not found\")) {\n return \"item_not_found\";\n }\n if (\n message.includes(\"use \\\"pm close <id> <text>\\\" to close an item\") ||\n (message.includes(\"invalid --status value\") && message.includes(\"\\\"closed\\\"\"))\n ) {\n return \"close_through_update\";\n }\n if (message.startsWith(\"invalid \") || message.includes(\" must be \") || message.includes(\" requires \")) {\n return \"invalid_argument_value\";\n }\n if (message.includes(\"strict create mode requires concrete values for --\")) {\n return \"missing_required_option\";\n }\n if (message.includes(\"either as positional\") && message.includes(\"not both\")) {\n return \"invalid_command_usage\";\n }\n\n const exitCode = Number.isFinite(params.exitCode) ? Math.max(0, Math.trunc(params.exitCode ?? 0)) : undefined;\n if (exitCode === EXIT_CODE.USAGE) {\n return \"invalid_command_usage\";\n }\n if (exitCode === EXIT_CODE.NOT_FOUND) {\n return \"item_not_found\";\n }\n if (exitCode === EXIT_CODE.CONFLICT) {\n return \"lock_conflict\";\n }\n if (exitCode === EXIT_CODE.DEPENDENCY_FAILED) {\n return \"dependency_failed\";\n }\n return \"command_failed\";\n}\n\nexport function deriveTelemetryCommandResolution(params: {\n ok: boolean;\n errorCode?: string;\n errorCategory?: TelemetryErrorCategory;\n}): TelemetryCommandResolution {\n if (params.ok) {\n return \"success\";\n }\n\n const normalizedCode = normalizeErrorCode(params.errorCode);\n if (normalizedCode === \"unknown_command\") {\n return \"nonexistent_command\";\n }\n if (normalizedCode === \"unknown_option\") {\n return \"invalid_option\";\n }\n if (normalizedCode === \"missing_required_option\") {\n return \"missing_required_option\";\n }\n if (normalizedCode === \"missing_required_argument\") {\n return \"missing_required_argument\";\n }\n if (normalizedCode === \"health_findings\") {\n return \"health_findings\";\n }\n if (normalizedCode === \"validation_findings\") {\n return \"validation_findings\";\n }\n\n if (params.errorCategory === \"usage\") {\n return \"invalid_usage\";\n }\n if (params.errorCategory === \"validation\") {\n return \"validation_failed\";\n }\n if (params.errorCategory === \"conflict\") {\n return \"conflict\";\n }\n if (params.errorCategory === \"runtime\") {\n return \"runtime_failed\";\n }\n return \"unknown_failed\";\n}\n","import crypto from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { mkdirSync, rmSync, statSync } from \"node:fs\";\nimport { mkdir, readdir, rm, stat } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { GlobalOptions } from \"../shared/command-types.js\";\nimport { resolvePmPackageRootFromModule } from \"../packages/root.js\";\nimport { appendLineAtomic, readFileIfExists, writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { resolveTelemetryErrorCategory, type TelemetryErrorCategory } from \"../shared/constants.js\";\nimport { nowIso } from \"../shared/time.js\";\nimport { resolveGlobalPmRoot } from \"../store/paths.js\";\nimport { readSettings, writeSettings } from \"../store/settings.js\";\nimport {\n deriveTelemetryCommandResolution,\n deriveTelemetryCommandTaxonomy,\n inferTelemetryErrorCode,\n type TelemetryCommandResolution,\n type TelemetryCommandTaxonomy,\n type TelemetryResolutionStage,\n} from \"./observability.js\";\n\nconst TELEMETRY_QUEUE_RELATIVE_PATH = path.join(\"runtime\", \"telemetry\", \"events.jsonl\");\nconst TELEMETRY_STATE_RELATIVE_PATH = path.join(\"runtime\", \"telemetry\", \"state.json\");\nexport const TELEMETRY_SCHEMA_VERSION = 1;\nconst TELEMETRY_CLIENT_SCHEMA_VERSION = 1;\nconst TELEMETRY_FLUSH_BATCH_SIZE = 100;\nconst TELEMETRY_MAX_RETRY_DELAY_MS = 3_600_000;\nconst TELEMETRY_RETRY_BASE_DELAY_MS = 30_000;\nconst TELEMETRY_HTTP_TIMEOUT_MS = 5_000;\nconst MILLISECONDS_PER_DAY = 86_400_000;\nconst TELEMETRY_MAX_EVENT_BYTES = 65_536;\nconst TELEMETRY_SANITIZE_MAX_DEPTH = 6;\nconst TELEMETRY_SANITIZE_MAX_ARRAY_ITEMS = 20;\nexport const TELEMETRY_MAX_QUEUE_ENTRY_ATTEMPTS = 15;\nconst TELEMETRY_RESULT_PREVIEW_MAX_BYTES = 8_192;\nconst TELEMETRY_QUEUE_REWRITE_RETRY_DELAYS_MS = [25, 50, 100, 200] as const;\nconst TELEMETRY_QUEUE_TMP_ORPHAN_MAX_AGE_MS = 60 * 60 * 1000;\nconst TELEMETRY_FLUSH_LOCK_STALE_MS = 60_000;\nconst TELEMETRY_FLUSH_SPAWN_LOCK_STALE_MS = 60_000;\nconst OTEL_TRACES_ENDPOINT_ENV = \"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\";\nconst OTEL_BASE_ENDPOINT_ENV = \"OTEL_EXPORTER_OTLP_ENDPOINT\";\nconst OTEL_SERVICE_NAME_ENV = \"OTEL_SERVICE_NAME\";\nconst PM_TELEMETRY_DISABLED_ENV = \"PM_TELEMETRY_DISABLED\";\nconst PM_NO_TELEMETRY_ENV = \"PM_NO_TELEMETRY\";\nconst PM_TELEMETRY_DISABLED_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\nconst PM_TELEMETRY_OTEL_DISABLED_ENV = \"PM_TELEMETRY_OTEL_DISABLED\";\nconst PM_TELEMETRY_OTEL_DISABLED_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\nconst PM_TELEMETRY_INLINE_FLUSH_ENV = \"PM_TELEMETRY_INLINE_FLUSH\";\nconst PM_TELEMETRY_FLUSH_CHILD_ENV = \"PM_TELEMETRY_FLUSH_CHILD\";\nconst PM_TELEMETRY_SOURCE_CONTEXT_ENV = \"PM_TELEMETRY_SOURCE_CONTEXT\";\nconst PM_TELEMETRY_SOURCE_CONTEXT_VALUES = [\"user\", \"automation\", \"test\", \"dogfood\", \"audit_smoke\"] as const;\n\nlet _lastFlushPromise: Promise<void> = Promise.resolve();\nlet _queueMutationPromise: Promise<unknown> = Promise.resolve();\n\n/** Wait for the most recent background flush to settle. Test-only helper. */\nexport async function waitForPendingFlush(): Promise<void> {\n await _lastFlushPromise;\n await _queueMutationPromise;\n}\nconst PM_TELEMETRY_SOURCE_CONTEXT_SET = new Set<string>(PM_TELEMETRY_SOURCE_CONTEXT_VALUES);\nconst BOOLEAN_TRUE_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\nconst PROCESS_SESSION_ID = crypto.randomUUID();\n\nconst SENSITIVE_KEYWORDS = [\n \"token\",\n \"secret\",\n \"password\",\n \"passwd\",\n \"api_key\",\n \"apikey\",\n \"authorization\",\n \"cookie\",\n \"session\",\n \"credentials\",\n \"bearer\",\n] as const;\nconst SENSITIVE_INLINE_KEY_PATTERN =\n \"(?:token|secret|password|passwd|api[_-]?key|apikey|authorization|cookie|session|credentials|bearer)\";\nconst INLINE_SENSITIVE_ASSIGNMENT_PATTERN = new RegExp(\n `\\\\b(${SENSITIVE_INLINE_KEY_PATTERN})\\\\s*([:=])\\\\s*([^\\\\s,;]+)`,\n \"giu\",\n);\nconst INLINE_SENSITIVE_FLAG_PATTERN = new RegExp(\n `(--${SENSITIVE_INLINE_KEY_PATTERN})(=|\\\\s+)([^\\\\s,;]+)`,\n \"giu\",\n);\nconst ABSOLUTE_PATH_TOKEN_PATTERN = /(^|[\\s\"'`(=])\\/(?:[^\\s\"'`),;]+)/g;\nconst BEARER_TOKEN_PATTERN = /bearer\\s+[a-z0-9._=-]+/giu;\nconst PRIVATE_IP_PATTERN =\n /\\b(?:10\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)|172\\.(?:1[6-9]|2\\d|3[01])\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)|192\\.168\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))\\b/g;\n\ninterface TelemetryEvent {\n schema_version: number;\n event_id: string;\n event_type: \"command_start\" | \"command_finish\" | \"command_error\";\n occurred_at: string;\n installation_id: string;\n session_id: string;\n command: string;\n payload: Record<string, unknown>;\n}\n\ninterface QueuedTelemetryEvent {\n client_schema_version?: number;\n event: TelemetryEvent;\n attempts: number;\n last_attempt_at?: string;\n next_attempt_after?: string;\n}\n\ninterface TelemetryRuntimeState {\n last_attempted_flush_at?: string;\n last_successful_flush_at?: string;\n last_failed_flush_at?: string;\n last_failed_flush_error?: string;\n endpoint?: string;\n queue_entries?: number;\n}\n\ntype TelemetryCaptureLevel = \"minimal\" | \"redacted\" | \"max\";\ntype TelemetrySourceContext = (typeof PM_TELEMETRY_SOURCE_CONTEXT_VALUES)[number];\ntype TelemetrySourceContextSource = \"inferred\" | \"env_override\";\n\ninterface ResolvedTelemetrySourceContext {\n source_context: TelemetrySourceContext;\n source_context_source: TelemetrySourceContextSource;\n}\n\nexport interface ActiveTelemetryCommand {\n started_at: string;\n started_at_ms: number;\n command: string;\n command_taxonomy: TelemetryCommandTaxonomy;\n pm_version: string;\n source_context: TelemetrySourceContext;\n source_context_source: TelemetrySourceContextSource;\n installation_id: string;\n pm_root_hash: string;\n cwd_hash: string;\n endpoint: string;\n retention_days: number;\n global_pm_root: string;\n capture_level: TelemetryCaptureLevel;\n otel_traces_endpoint?: string;\n otel_trace_id?: string;\n otel_span_id?: string;\n}\n\nexport interface TelemetryCommandContext {\n command: string;\n pm_version: string;\n args: string[];\n options: Record<string, unknown>;\n global: GlobalOptions;\n pm_root: string;\n}\n\nexport interface TelemetryCommandOutcome {\n ok: boolean;\n error?: string;\n result?: unknown;\n exit_code?: number;\n error_code?: string;\n error_category?: TelemetryErrorCategory;\n command_resolution?: TelemetryCommandResolution;\n resolution_stage?: TelemetryResolutionStage;\n}\n\nexport interface TelemetryErrorEventContext {\n command: string;\n args: string[];\n options: Record<string, unknown>;\n global: GlobalOptions;\n pm_version: string;\n pm_root: string;\n error_code: string;\n error_message: string;\n exit_code: number;\n error_category?: TelemetryErrorCategory;\n command_resolution?: TelemetryCommandResolution;\n resolution_stage?: TelemetryResolutionStage;\n}\n\n\nfunction queuePath(globalPmRoot: string): string {\n return path.join(globalPmRoot, TELEMETRY_QUEUE_RELATIVE_PATH);\n}\n\nfunction telemetryRuntimeDirectory(globalPmRoot: string): string {\n return path.dirname(queuePath(globalPmRoot));\n}\n\nfunction runtimeStatePath(globalPmRoot: string): string {\n return path.join(globalPmRoot, TELEMETRY_STATE_RELATIVE_PATH);\n}\n\nfunction flushLockPath(globalPmRoot: string): string {\n return path.join(globalPmRoot, \"runtime\", \"telemetry\", \"flush.lock\");\n}\n\nfunction flushSpawnLockPath(globalPmRoot: string): string {\n return path.join(globalPmRoot, \"runtime\", \"telemetry\", \"flush.spawn.lock\");\n}\n\nfunction telemetryFlushRunnerPath(): string {\n return path.join(resolvePmPackageRootFromModule(import.meta.url, [\"../../..\"]), \"dist\", \"cli\", \"telemetry-flush.js\");\n}\n\nfunction shouldFlushInline(): boolean {\n if (parseBooleanTrueLike(process.env[PM_TELEMETRY_INLINE_FLUSH_ENV])) {\n return true;\n }\n if (parseBooleanTrueLike(process.env[PM_TELEMETRY_FLUSH_CHILD_ENV])) {\n return true;\n }\n const nodeEnv = (process.env.NODE_ENV ?? \"\").trim().toLowerCase();\n return typeof process.env.VITEST === \"string\" || typeof process.env.VITEST_WORKER_ID === \"string\" || nodeEnv === \"test\";\n}\n\nasync function readRuntimeState(globalPmRoot: string): Promise<TelemetryRuntimeState> {\n const raw = await readFileIfExists(runtimeStatePath(globalPmRoot));\n if (!raw || raw.trim().length === 0) {\n return {};\n }\n try {\n const parsed = JSON.parse(raw) as TelemetryRuntimeState;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return {};\n }\n return parsed;\n } catch {\n return {};\n }\n}\n\nasync function writeRuntimeState(globalPmRoot: string, patch: TelemetryRuntimeState): Promise<void> {\n try {\n const current = await readRuntimeState(globalPmRoot);\n const next: TelemetryRuntimeState = {\n ...current,\n ...patch,\n };\n const normalized = Object.fromEntries(\n Object.entries(next)\n .filter(([, value]) => value !== undefined)\n .sort((left, right) => left[0].localeCompare(right[0])),\n );\n await writeFileAtomic(runtimeStatePath(globalPmRoot), `${JSON.stringify(normalized, null, 2)}\\n`);\n } catch {\n // Runtime state persistence is best effort and must not block command execution.\n }\n}\n\nfunction isSensitiveKey(key: string): boolean {\n const normalized = key.trim().toLowerCase().replaceAll(\"-\", \"_\").replaceAll(/[^a-z0-9_]+/g, \"_\");\n const tokens = normalized.split(\"_\").filter((token) => token.length > 0);\n return SENSITIVE_KEYWORDS.some(\n (keyword) => normalized === keyword || normalized.endsWith(`_${keyword}`) || tokens.includes(keyword),\n );\n}\n\nfunction redactInlineSensitiveAssignments(input: string): string {\n const withoutAssignments = input.replaceAll(\n INLINE_SENSITIVE_ASSIGNMENT_PATTERN,\n (_match: string, key: string, delimiter: string): string => `${key}${delimiter}[redacted]`,\n );\n return withoutAssignments.replaceAll(\n INLINE_SENSITIVE_FLAG_PATTERN,\n (_match: string, flag: string, delimiter: string): string => `${flag}${delimiter}[redacted]`,\n );\n}\n\nfunction redactAbsolutePathTokens(input: string): string {\n return input.replaceAll(\n ABSOLUTE_PATH_TOKEN_PATTERN,\n (_match: string, prefix: string): string => `${prefix}[redacted_path]`,\n );\n}\n\nfunction isAsciiLetterOrDigitCode(code: number): boolean {\n const isUpper = code >= 65 && code <= 90;\n const isLower = code >= 97 && code <= 122;\n const isDigit = code >= 48 && code <= 57;\n return isUpper || isLower || isDigit;\n}\n\nfunction isEmailLocalCharacter(character: string | undefined): boolean {\n if (!character) {\n return false;\n }\n const code = character.charCodeAt(0);\n if (isAsciiLetterOrDigitCode(code)) {\n return true;\n }\n return character === \".\" || character === \"_\" || character === \"%\" || character === \"+\" || character === \"-\";\n}\n\nfunction isEmailDomainCharacter(character: string | undefined): boolean {\n if (!character) {\n return false;\n }\n const code = character.charCodeAt(0);\n if (isAsciiLetterOrDigitCode(code)) {\n return true;\n }\n return character === \".\" || character === \"-\";\n}\n\nfunction looksLikeEmailToken(token: string): boolean {\n const atIndex = token.indexOf(\"@\");\n if (atIndex <= 0 || atIndex !== token.lastIndexOf(\"@\") || atIndex === token.length - 1) {\n return false;\n }\n const localPart = token.slice(0, atIndex);\n const domainPart = token.slice(atIndex + 1);\n const lastDot = domainPart.lastIndexOf(\".\");\n if (lastDot <= 0 || lastDot === domainPart.length - 1) {\n return false;\n }\n if (domainPart.length - (lastDot + 1) < 2) {\n return false;\n }\n for (const character of localPart) {\n if (!isEmailLocalCharacter(character)) {\n return false;\n }\n }\n for (const character of domainPart) {\n if (!isEmailDomainCharacter(character)) {\n return false;\n }\n }\n return true;\n}\n\nfunction redactEmailTokens(input: string): string {\n let redacted = \"\";\n let cursor = 0;\n while (cursor < input.length) {\n const atIndex = input.indexOf(\"@\", cursor);\n if (atIndex < 0) {\n redacted += input.slice(cursor);\n break;\n }\n let start = atIndex - 1;\n while (start >= cursor && isEmailLocalCharacter(input[start])) {\n start -= 1;\n }\n start += 1;\n let end = atIndex + 1;\n while (end < input.length && isEmailDomainCharacter(input[end])) {\n end += 1;\n }\n const candidate = input.slice(start, end);\n if (looksLikeEmailToken(candidate)) {\n redacted += input.slice(cursor, start);\n redacted += \"[redacted_email]\";\n cursor = end;\n continue;\n }\n redacted += input.slice(cursor, atIndex + 1);\n cursor = atIndex + 1;\n }\n return redacted;\n}\n\nfunction sanitizeCommonSensitiveTokens(input: string): string {\n const withoutEmails = redactEmailTokens(input);\n const withoutBearer = withoutEmails.replaceAll(BEARER_TOKEN_PATTERN, \"bearer [redacted_token]\");\n return withoutBearer.replaceAll(PRIVATE_IP_PATTERN, \"[redacted_ip]\");\n}\n\nfunction sanitizeStringRedacted(input: string): string {\n const withoutCommonSensitiveTokens = sanitizeCommonSensitiveTokens(input);\n const withoutInlineSecrets = redactInlineSensitiveAssignments(withoutCommonSensitiveTokens);\n const withoutAbsolutePaths = redactAbsolutePathTokens(withoutInlineSecrets);\n const trimmed = withoutAbsolutePaths.trim();\n if (trimmed.startsWith(\"/\") && trimmed.length > 1) {\n return \"[redacted_path]\";\n }\n if (withoutAbsolutePaths.length > 512) {\n return `${withoutAbsolutePaths.slice(0, 509)}...`;\n }\n return withoutAbsolutePaths;\n}\n\nfunction sanitizeStringMax(input: string): string {\n const withoutCommonSensitiveTokens = sanitizeCommonSensitiveTokens(input);\n const withoutInlineSecrets = redactInlineSensitiveAssignments(withoutCommonSensitiveTokens);\n const withoutAbsolutePaths = redactAbsolutePathTokens(withoutInlineSecrets);\n const trimmed = withoutAbsolutePaths.trim();\n if (trimmed.startsWith(\"/\") && trimmed.length > 1) {\n return \"[redacted_path]\";\n }\n if (withoutAbsolutePaths.length > 2048) {\n return `${withoutAbsolutePaths.slice(0, 2045)}...`;\n }\n return withoutAbsolutePaths;\n}\n\nfunction sanitizeString(input: string, captureLevel: Exclude<TelemetryCaptureLevel, \"minimal\"> = \"redacted\"): string {\n if (captureLevel === \"max\") {\n return sanitizeStringMax(input);\n }\n return sanitizeStringRedacted(input);\n}\n\nfunction sanitizeValue(\n value: unknown,\n keyHint?: string,\n captureLevel: Exclude<TelemetryCaptureLevel, \"minimal\"> = \"redacted\",\n depth = 0,\n): unknown {\n if (keyHint && isSensitiveKey(keyHint)) {\n return \"[redacted]\";\n }\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value === \"string\") {\n return sanitizeString(value, captureLevel);\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n if (depth >= TELEMETRY_SANITIZE_MAX_DEPTH) {\n return \"[depth_truncated]\";\n }\n if (Array.isArray(value)) {\n return value.slice(0, TELEMETRY_SANITIZE_MAX_ARRAY_ITEMS).map((entry) => sanitizeValue(entry, undefined, captureLevel, depth + 1));\n }\n if (typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n const sanitized: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(record)) {\n sanitized[key] = sanitizeValue(nested, key, captureLevel, depth + 1);\n }\n return sanitized;\n }\n return String(value);\n}\n\nfunction sanitizeCommandArgs(\n args: string[],\n captureLevel: Exclude<TelemetryCaptureLevel, \"minimal\"> = \"redacted\",\n): string[] {\n const sanitized: string[] = [];\n let nextIsSensitiveValue = false;\n for (const rawArg of args) {\n const arg = sanitizeString(rawArg, captureLevel);\n if (nextIsSensitiveValue) {\n sanitized.push(\"[redacted]\");\n nextIsSensitiveValue = false;\n continue;\n }\n if (arg.startsWith(\"--\")) {\n const withoutPrefix = arg.slice(2);\n const delimiterIndex = withoutPrefix.indexOf(\"=\");\n if (delimiterIndex >= 0) {\n const key = withoutPrefix.slice(0, delimiterIndex);\n const value = withoutPrefix.slice(delimiterIndex + 1);\n if (isSensitiveKey(key)) {\n sanitized.push(`--${key}=[redacted]`);\n } else {\n sanitized.push(`--${key}=${sanitizeString(value, captureLevel)}`);\n }\n continue;\n }\n if (isSensitiveKey(withoutPrefix)) {\n sanitized.push(`--${withoutPrefix}`);\n nextIsSensitiveValue = true;\n continue;\n }\n }\n sanitized.push(arg);\n }\n return sanitized;\n}\n\nfunction normalizeCaptureLevel(value: string | undefined): TelemetryCaptureLevel {\n const normalized = value?.trim().toLowerCase();\n if (normalized === \"minimal\" || normalized === \"redacted\" || normalized === \"max\") {\n return normalized;\n }\n return \"redacted\";\n}\n\nfunction parseBooleanTrueLike(value: string | undefined): boolean {\n return BOOLEAN_TRUE_VALUES.has((value ?? \"\").trim().toLowerCase());\n}\n\nfunction normalizePmVersion(value: string | undefined): string {\n const trimmed = value?.trim() ?? \"\";\n return trimmed.length > 0 ? trimmed : \"0.0.0\";\n}\n\nfunction normalizeTelemetryErrorCode(value: string | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized && normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeTelemetryExitCode(exitCode: number | undefined, ok: boolean): number {\n if (Number.isFinite(exitCode)) {\n return Math.max(0, Math.trunc(exitCode ?? 0));\n }\n return ok ? 0 : 1;\n}\n\nfunction normalizeTelemetryErrorCategory(params: {\n ok: boolean;\n errorCode?: string;\n errorCategory?: TelemetryErrorCategory;\n}): TelemetryErrorCategory | undefined {\n if (params.ok) {\n return undefined;\n }\n if (typeof params.errorCategory === \"string\" && params.errorCategory.trim().length > 0) {\n return params.errorCategory;\n }\n if (typeof params.errorCode === \"string\" && params.errorCode.trim().length > 0) {\n return resolveTelemetryErrorCategory(params.errorCode);\n }\n return \"unknown\";\n}\n\nfunction resolveTelemetrySourceContext(globalOptions: GlobalOptions): ResolvedTelemetrySourceContext {\n const override = (process.env[PM_TELEMETRY_SOURCE_CONTEXT_ENV] ?? \"\").trim().toLowerCase();\n if (PM_TELEMETRY_SOURCE_CONTEXT_SET.has(override)) {\n return {\n source_context: override as TelemetrySourceContext,\n source_context_source: \"env_override\",\n };\n }\n const nodeEnv = (process.env.NODE_ENV ?? \"\").trim().toLowerCase();\n if (typeof process.env.VITEST === \"string\" || typeof process.env.VITEST_WORKER_ID === \"string\" || nodeEnv === \"test\") {\n return {\n source_context: \"test\",\n source_context_source: \"inferred\",\n };\n }\n const nonTty = process.stdin.isTTY !== true || process.stdout.isTTY !== true;\n const ci = parseBooleanTrueLike(process.env.CI);\n const scriptLikeMode = globalOptions.json === true || globalOptions.quiet === true;\n if (nonTty || ci || scriptLikeMode) {\n return {\n source_context: \"automation\",\n source_context_source: \"inferred\",\n };\n }\n return {\n source_context: \"user\",\n source_context_source: \"inferred\",\n };\n}\n\nfunction hashWithInstallationId(installationId: string, value: string): string {\n return crypto.createHash(\"sha256\").update(`${installationId}:${value}`).digest(\"hex\");\n}\n\nfunction normalizeForHash(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n if (depth >= TELEMETRY_SANITIZE_MAX_DEPTH) {\n return \"[depth_truncated]\";\n }\n if (Array.isArray(value)) {\n return value.slice(0, TELEMETRY_SANITIZE_MAX_ARRAY_ITEMS).map((entry) => normalizeForHash(entry, depth + 1));\n }\n if (typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n const normalized: Record<string, unknown> = {};\n const sortedKeys = Object.keys(record).sort((left, right) => left.localeCompare(right));\n for (const key of sortedKeys) {\n normalized[key] = normalizeForHash(record[key], depth + 1);\n }\n return normalized;\n }\n return String(value);\n}\n\nfunction hashTelemetryValue(installationId: string, value: unknown): string {\n return hashWithInstallationId(installationId, JSON.stringify(normalizeForHash(value)));\n}\n\nfunction hashCommandArgs(installationId: string, args: string[]): { hashes: string[]; digest: string } {\n return {\n hashes: args.map((arg) => hashWithInstallationId(installationId, arg)),\n digest: hashWithInstallationId(installationId, args.join(\"\\u0000\")),\n };\n}\n\nfunction hashTelemetryErrorFingerprint(\n installationId: string,\n command: string,\n errorCode: string | undefined,\n errorMessage: string | undefined,\n): string {\n const normalizedMessage = sanitizeString(errorMessage ?? \"\", \"redacted\");\n const fingerprintSource = `${command}\\u0000${errorCode ?? \"unknown_error\"}\\u0000${normalizedMessage}`;\n return hashWithInstallationId(installationId, fingerprintSource);\n}\n\nfunction telemetryDisabledByEnvironment(): boolean {\n return (\n PM_TELEMETRY_DISABLED_VALUES.has((process.env[PM_TELEMETRY_DISABLED_ENV] ?? \"\").trim().toLowerCase()) ||\n PM_TELEMETRY_DISABLED_VALUES.has((process.env[PM_NO_TELEMETRY_ENV] ?? \"\").trim().toLowerCase())\n );\n}\n\nfunction resolveOtelTracesEndpoint(): string | null {\n if (PM_TELEMETRY_OTEL_DISABLED_VALUES.has((process.env[PM_TELEMETRY_OTEL_DISABLED_ENV] ?? \"\").trim().toLowerCase())) {\n return null;\n }\n\n const directEndpoint = (process.env[OTEL_TRACES_ENDPOINT_ENV] ?? \"\").trim();\n if (directEndpoint.length > 0) {\n try {\n return new URL(directEndpoint).toString();\n } catch {\n return null;\n }\n }\n\n const baseEndpoint = (process.env[OTEL_BASE_ENDPOINT_ENV] ?? \"\").trim();\n if (baseEndpoint.length === 0) {\n return null;\n }\n\n try {\n const url = new URL(baseEndpoint);\n const normalizedPath = url.pathname.replace(/\\/+$/, \"\");\n if (!normalizedPath.endsWith(\"/v1/traces\")) {\n url.pathname = `${normalizedPath.length === 0 ? \"\" : normalizedPath}/v1/traces`;\n }\n return url.toString();\n } catch {\n return null;\n }\n}\n\nfunction isoToUnixNano(iso: string): string {\n const parsedMs = Date.parse(iso);\n const epochMs = Number.isNaN(parsedMs) ? Date.now() : parsedMs;\n return `${BigInt(epochMs) * 1_000_000n}`;\n}\n\nfunction otlpStringAttribute(key: string, value: string): { key: string; value: { stringValue: string } } {\n return {\n key,\n value: { stringValue: value },\n };\n}\n\nfunction otlpBoolAttribute(key: string, value: boolean): { key: string; value: { boolValue: boolean } } {\n return {\n key,\n value: { boolValue: value },\n };\n}\n\nfunction otlpIntAttribute(key: string, value: number): { key: string; value: { intValue: string } } {\n return {\n key,\n value: { intValue: String(Math.max(0, Math.trunc(value))) },\n };\n}\n\nasync function exportLocalOtelSpan(\n activeCommand: ActiveTelemetryCommand,\n outcome: { ok: boolean; error?: string; exit_code?: number; error_code?: string; error_category?: TelemetryErrorCategory },\n finishedAtIso: string,\n durationMs: number,\n): Promise<void> {\n if (\n typeof activeCommand.otel_traces_endpoint !== \"string\" ||\n activeCommand.otel_traces_endpoint.trim().length === 0 ||\n typeof activeCommand.otel_trace_id !== \"string\" ||\n activeCommand.otel_trace_id.length === 0 ||\n typeof activeCommand.otel_span_id !== \"string\" ||\n activeCommand.otel_span_id.length === 0\n ) {\n return;\n }\n\n const serviceNameCandidate = sanitizeString((process.env[OTEL_SERVICE_NAME_ENV] ?? \"\").trim());\n const serviceName = serviceNameCandidate.length > 0 ? serviceNameCandidate : \"pm-cli\";\n const normalizedExitCode = normalizeTelemetryExitCode(outcome.exit_code, outcome.ok);\n const normalizedErrorCode = normalizeTelemetryErrorCode(outcome.error_code);\n const normalizedErrorCategory = normalizeTelemetryErrorCategory({\n ok: outcome.ok,\n errorCode: normalizedErrorCode,\n errorCategory: outcome.error_category,\n });\n const attributes: Array<\n | ReturnType<typeof otlpStringAttribute>\n | ReturnType<typeof otlpBoolAttribute>\n | ReturnType<typeof otlpIntAttribute>\n > = [\n otlpStringAttribute(\"pm.command\", sanitizeString(activeCommand.command)),\n otlpStringAttribute(\"pm.version\", activeCommand.pm_version),\n otlpStringAttribute(\"pm.source_context\", activeCommand.source_context),\n otlpStringAttribute(\"pm.source_context_source\", activeCommand.source_context_source),\n otlpStringAttribute(\"pm.installation_id\", activeCommand.installation_id),\n otlpStringAttribute(\"pm.session_id\", PROCESS_SESSION_ID),\n otlpStringAttribute(\"pm.pm_root_hash\", activeCommand.pm_root_hash),\n otlpStringAttribute(\"pm.cwd_hash\", activeCommand.cwd_hash),\n otlpBoolAttribute(\"pm.ok\", outcome.ok),\n otlpIntAttribute(\"pm.exit_code\", normalizedExitCode),\n otlpIntAttribute(\"pm.duration_ms\", durationMs),\n ];\n if (typeof normalizedErrorCode === \"string\") {\n attributes.push(otlpStringAttribute(\"pm.error_code\", normalizedErrorCode));\n }\n if (typeof normalizedErrorCategory === \"string\") {\n attributes.push(otlpStringAttribute(\"pm.error_category\", normalizedErrorCategory));\n }\n if (typeof outcome.error === \"string\" && outcome.error.trim().length > 0) {\n attributes.push(otlpStringAttribute(\"pm.error\", sanitizeString(outcome.error)));\n }\n\n const payload = {\n resourceSpans: [\n {\n resource: {\n attributes: [otlpStringAttribute(\"service.name\", serviceName)],\n },\n scopeSpans: [\n {\n scope: {\n name: \"pm-cli.telemetry\",\n version: \"1\",\n },\n spans: [\n {\n traceId: activeCommand.otel_trace_id,\n spanId: activeCommand.otel_span_id,\n name: `pm.command.${sanitizeString(activeCommand.command)}`,\n kind: 1,\n startTimeUnixNano: isoToUnixNano(activeCommand.started_at),\n endTimeUnixNano: isoToUnixNano(finishedAtIso),\n attributes,\n status: {\n code: outcome.ok ? 1 : 2,\n message: outcome.ok ? \"\" : sanitizeString(outcome.error ?? \"command_failed\"),\n },\n },\n ],\n },\n ],\n },\n ],\n };\n\n const response = await fetch(activeCommand.otel_traces_endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(TELEMETRY_HTTP_TIMEOUT_MS),\n });\n if (!response.ok) {\n throw new Error(`local_otel_export_http_${response.status}`);\n }\n}\n\nfunction summarizeResult(\n result: unknown,\n captureLevel: Exclude<TelemetryCaptureLevel, \"minimal\"> = \"redacted\",\n): Record<string, unknown> {\n if (result === null || result === undefined) {\n return { type: \"nullish\" };\n }\n if (typeof result === \"string\") {\n return { type: \"string\", value: sanitizeString(result, captureLevel) };\n }\n if (typeof result === \"number\" || typeof result === \"boolean\") {\n return { type: typeof result, value: result };\n }\n if (Array.isArray(result)) {\n return {\n type: \"array\",\n length: result.length,\n sample: result.slice(0, 5).map((entry) => sanitizeValue(entry, undefined, captureLevel)),\n };\n }\n if (typeof result === \"object\") {\n const record = result as Record<string, unknown>;\n const keys = Object.keys(record).sort((left, right) => left.localeCompare(right));\n const sanitized: Record<string, unknown> = {};\n let previewBytes = 0;\n for (const key of keys.slice(0, 25)) {\n const sanitizedValue = sanitizeValue(record[key], key, captureLevel);\n const entrySize = JSON.stringify(sanitizedValue)?.length ?? 0;\n if (previewBytes + entrySize > TELEMETRY_RESULT_PREVIEW_MAX_BYTES) {\n sanitized[key] = \"[preview_truncated]\";\n break;\n }\n previewBytes += entrySize;\n sanitized[key] = sanitizedValue;\n }\n return {\n type: \"object\",\n key_count: keys.length,\n keys_preview: keys.slice(0, 50),\n preview: sanitized,\n };\n }\n return { type: typeof result, value: String(result) };\n}\n\nfunction buildCommandStartPayload(params: {\n captureLevel: TelemetryCaptureLevel;\n context: TelemetryCommandContext;\n pmVersion: string;\n sourceContext: ResolvedTelemetrySourceContext;\n pmRootHash: string;\n cwdHash: string;\n installationId: string;\n}): Record<string, unknown> {\n const { captureLevel, context, pmVersion, sourceContext, pmRootHash, cwdHash, installationId } = params;\n const commandTaxonomy = deriveTelemetryCommandTaxonomy(context.command);\n const hashedArgs = hashCommandArgs(installationId, context.args);\n const commandInvocationDigest = hashWithInstallationId(installationId, `${context.command}\\u0000${context.args.join(\"\\u0000\")}`);\n const commandOptionsDigest = hashTelemetryValue(installationId, context.options);\n const globalOptionsDigest = hashTelemetryValue(installationId, context.global);\n if (captureLevel === \"minimal\") {\n return {\n capture_level: captureLevel,\n pm_version: pmVersion,\n source_context: sourceContext.source_context,\n source_context_source: sourceContext.source_context_source,\n command_taxonomy: commandTaxonomy,\n command_args_digest: hashedArgs.digest,\n command_invocation_digest: commandInvocationDigest,\n command_options_digest: commandOptionsDigest,\n global_options_digest: globalOptionsDigest,\n };\n }\n return {\n pm_version: pmVersion,\n source_context: sourceContext.source_context,\n source_context_source: sourceContext.source_context_source,\n command_taxonomy: commandTaxonomy,\n command_args: sanitizeCommandArgs(context.args, captureLevel),\n command_args_hashes: hashedArgs.hashes,\n command_args_digest: hashedArgs.digest,\n command_invocation_digest: commandInvocationDigest,\n command_options: sanitizeValue(context.options, undefined, captureLevel) as Record<string, unknown>,\n command_options_digest: commandOptionsDigest,\n global_options: sanitizeValue(context.global, undefined, captureLevel) as Record<string, unknown>,\n global_options_digest: globalOptionsDigest,\n pm_root_hash: pmRootHash,\n cwd_hash: cwdHash,\n capture_level: captureLevel,\n runtime: {\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n hostname_hash: hashWithInstallationId(installationId, os.hostname()),\n stdin_tty: process.stdin.isTTY === true,\n stdout_tty: process.stdout.isTTY === true,\n },\n };\n}\n\nfunction buildCommandFinishPayload(params: {\n captureLevel: TelemetryCaptureLevel;\n pmVersion: string;\n sourceContext: ResolvedTelemetrySourceContext;\n outcome: TelemetryCommandOutcome;\n durationMs: number;\n startedAt: string;\n command: string;\n installationId: string;\n commandTaxonomy: TelemetryCommandTaxonomy;\n exitCode: number;\n errorCode?: string;\n errorCategory?: TelemetryErrorCategory;\n commandResolution: TelemetryCommandResolution;\n resolutionStage: TelemetryResolutionStage;\n}): Record<string, unknown> {\n const {\n captureLevel,\n pmVersion,\n sourceContext,\n outcome,\n durationMs,\n startedAt,\n command,\n installationId,\n commandTaxonomy,\n exitCode,\n errorCode,\n errorCategory,\n commandResolution,\n resolutionStage,\n } = params;\n const errorFingerprint =\n outcome.ok === false\n ? hashTelemetryErrorFingerprint(installationId, command, errorCode, outcome.error)\n : undefined;\n if (captureLevel === \"minimal\") {\n return {\n capture_level: captureLevel,\n pm_version: pmVersion,\n source_context: sourceContext.source_context,\n source_context_source: sourceContext.source_context_source,\n command_taxonomy: commandTaxonomy,\n command_resolution: commandResolution,\n resolution_stage: resolutionStage,\n ok: outcome.ok,\n exit_code: exitCode,\n error_code: errorCode,\n error_category: errorCategory,\n error: outcome.error ? sanitizeString(outcome.error, \"redacted\") : undefined,\n error_fingerprint: errorFingerprint,\n duration_ms: durationMs,\n };\n }\n return {\n capture_level: captureLevel,\n pm_version: pmVersion,\n source_context: sourceContext.source_context,\n source_context_source: sourceContext.source_context_source,\n command_taxonomy: commandTaxonomy,\n command_resolution: commandResolution,\n resolution_stage: resolutionStage,\n ok: outcome.ok,\n exit_code: exitCode,\n error_code: errorCode,\n error_category: errorCategory,\n error: outcome.error ? sanitizeString(outcome.error, captureLevel) : undefined,\n error_fingerprint: errorFingerprint,\n duration_ms: durationMs,\n started_at: startedAt,\n result_summary: summarizeResult(outcome.result, captureLevel),\n };\n}\n\nfunction buildCommandErrorPayload(params: {\n captureLevel: TelemetryCaptureLevel;\n pmVersion: string;\n sourceContext: ResolvedTelemetrySourceContext;\n command: string;\n commandTaxonomy: TelemetryCommandTaxonomy;\n commandResolution: TelemetryCommandResolution;\n resolutionStage: TelemetryResolutionStage;\n args: string[];\n options: Record<string, unknown>;\n pmRootHash: string;\n cwdHash: string;\n installationId: string;\n errorCode: string;\n errorMessage: string;\n errorCategory: TelemetryErrorCategory;\n exitCode: number;\n}): Record<string, unknown> {\n const {\n captureLevel,\n pmVersion,\n sourceContext,\n command,\n commandTaxonomy,\n commandResolution,\n resolutionStage,\n args,\n options,\n pmRootHash,\n cwdHash,\n installationId,\n errorCode,\n errorMessage,\n errorCategory,\n exitCode,\n } = params;\n const attemptedArgHashes = hashCommandArgs(installationId, args);\n const attemptedCommandDigest = hashWithInstallationId(installationId, command);\n const attemptedOptionsDigest = hashTelemetryValue(installationId, options);\n const errorFingerprint = hashTelemetryErrorFingerprint(installationId, command, errorCode, errorMessage);\n if (captureLevel === \"minimal\") {\n return {\n capture_level: captureLevel,\n pm_version: pmVersion,\n source_context: sourceContext.source_context,\n source_context_source: sourceContext.source_context_source,\n command_taxonomy: commandTaxonomy,\n command_resolution: commandResolution,\n resolution_stage: resolutionStage,\n attempted_command_digest: attemptedCommandDigest,\n attempted_args_digest: attemptedArgHashes.digest,\n attempted_options_digest: attemptedOptionsDigest,\n error_code: errorCode,\n error_category: errorCategory,\n exit_code: exitCode,\n error: sanitizeString(errorMessage, \"redacted\"),\n error_fingerprint: errorFingerprint,\n };\n }\n\n return {\n capture_level: captureLevel,\n pm_version: pmVersion,\n source_context: sourceContext.source_context,\n source_context_source: sourceContext.source_context_source,\n command_taxonomy: commandTaxonomy,\n command_resolution: commandResolution,\n resolution_stage: resolutionStage,\n attempted_command: sanitizeString(command, captureLevel),\n attempted_command_digest: attemptedCommandDigest,\n attempted_args: sanitizeCommandArgs(args, captureLevel),\n attempted_args_hashes: attemptedArgHashes.hashes,\n attempted_args_digest: attemptedArgHashes.digest,\n attempted_options: sanitizeValue(options, undefined, captureLevel) as Record<string, unknown>,\n attempted_options_digest: attemptedOptionsDigest,\n error_code: errorCode,\n error_category: errorCategory,\n exit_code: exitCode,\n error: sanitizeString(errorMessage, captureLevel),\n error_fingerprint: errorFingerprint,\n pm_root_hash: pmRootHash,\n cwd_hash: cwdHash,\n runtime: {\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n hostname_hash: hashWithInstallationId(installationId, os.hostname()),\n stdin_tty: process.stdin.isTTY === true,\n stdout_tty: process.stdout.isTTY === true,\n },\n };\n}\n\nasync function ensureInstallationId(\n globalPmRoot: string,\n): Promise<{ installationId: string; endpoint: string; retentionDays: number }> {\n const settings = await readSettings(globalPmRoot);\n let changed = false;\n if (settings.telemetry.installation_id.trim().length === 0) {\n settings.telemetry.installation_id = crypto.randomUUID();\n changed = true;\n }\n if (changed) {\n await writeSettings(globalPmRoot, settings, \"telemetry:install_id\");\n }\n return {\n installationId: settings.telemetry.installation_id,\n endpoint: settings.telemetry.endpoint,\n retentionDays: Math.max(1, Math.trunc(settings.telemetry.retention_days)),\n };\n}\n\nasync function enqueueTelemetryEvent(globalPmRoot: string, event: TelemetryEvent): Promise<void> {\n const queued: QueuedTelemetryEvent = {\n client_schema_version: TELEMETRY_CLIENT_SCHEMA_VERSION,\n event,\n attempts: 0,\n };\n let serialized = JSON.stringify(queued);\n if (serialized.length > TELEMETRY_MAX_EVENT_BYTES) {\n const trimmed = { ...event, payload: { ...event.payload, result_summary: { truncated: true, reason: \"payload_size_exceeded\", original_bytes: serialized.length } } };\n const trimmedQueued: QueuedTelemetryEvent = {\n client_schema_version: TELEMETRY_CLIENT_SCHEMA_VERSION,\n event: trimmed,\n attempts: 0,\n };\n serialized = JSON.stringify(trimmedQueued);\n }\n await withQueueMutation(async () => {\n await appendLineAtomic(queuePath(globalPmRoot), serialized);\n });\n}\n\nfunction parseQueueLines(raw: string): QueuedTelemetryEvent[] {\n const entries: QueuedTelemetryEvent[] = [];\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n continue;\n }\n try {\n const parsed = JSON.parse(trimmed) as QueuedTelemetryEvent;\n if (\n parsed &&\n typeof parsed === \"object\" &&\n parsed.event &&\n typeof parsed.event === \"object\" &&\n typeof parsed.attempts === \"number\" &&\n (\n parsed.client_schema_version === undefined ||\n (typeof parsed.client_schema_version === \"number\" && Number.isFinite(parsed.client_schema_version))\n )\n ) {\n entries.push(parsed);\n }\n } catch {\n // Drop malformed lines to preserve queue forward progress.\n }\n }\n return entries;\n}\n\nfunction nextRetryIso(attempts: number): string {\n const delay = Math.min(TELEMETRY_RETRY_BASE_DELAY_MS * 2 ** Math.max(attempts - 1, 0), TELEMETRY_MAX_RETRY_DELAY_MS);\n return new Date(Date.now() + delay).toISOString();\n}\n\nfunction isDueForRetry(entry: QueuedTelemetryEvent): boolean {\n if (typeof entry.next_attempt_after !== \"string\" || entry.next_attempt_after.trim().length === 0) {\n return true;\n }\n const dueAtMs = Date.parse(entry.next_attempt_after);\n if (Number.isNaN(dueAtMs)) {\n return true;\n }\n return dueAtMs <= Date.now();\n}\n\nfunction retentionCutoffMs(retentionDays: number): number {\n const normalizedDays = Number.isFinite(retentionDays) ? Math.max(1, Math.trunc(retentionDays)) : 1;\n return Date.now() - normalizedDays * MILLISECONDS_PER_DAY;\n}\n\nfunction isExpiredQueueEntry(entry: QueuedTelemetryEvent, cutoffMs: number): boolean {\n const occurredAt = entry.event?.occurred_at;\n if (typeof occurredAt !== \"string\" || occurredAt.trim().length === 0) {\n return false;\n }\n const occurredAtMs = Date.parse(occurredAt);\n if (Number.isNaN(occurredAtMs)) {\n return false;\n }\n return occurredAtMs < cutoffMs;\n}\n\nfunction pruneExpiredQueueEntries(\n entries: QueuedTelemetryEvent[],\n retentionDays: number,\n): { entries: QueuedTelemetryEvent[]; prunedCount: number } {\n const cutoffMs = retentionCutoffMs(retentionDays);\n const retained: QueuedTelemetryEvent[] = [];\n let prunedCount = 0;\n for (const entry of entries) {\n const serializedSize = JSON.stringify(entry).length;\n const oversized = serializedSize > TELEMETRY_MAX_EVENT_BYTES;\n if (oversized || isExpiredQueueEntry(entry, cutoffMs) || entry.attempts >= TELEMETRY_MAX_QUEUE_ENTRY_ATTEMPTS) {\n prunedCount += 1;\n continue;\n }\n retained.push(entry);\n }\n return { entries: retained, prunedCount };\n}\n\nasync function rewriteQueue(globalPmRoot: string, entries: QueuedTelemetryEvent[]): Promise<void> {\n const serialized = entries.map((entry) => JSON.stringify(entry)).join(\"\\n\");\n const contents = serialized.length > 0 ? `${serialized}\\n` : \"\";\n for (let attempt = 0; ; attempt += 1) {\n try {\n await writeFileAtomic(queuePath(globalPmRoot), contents);\n return;\n } catch (error: unknown) {\n const retryDelay = TELEMETRY_QUEUE_REWRITE_RETRY_DELAYS_MS[attempt];\n if (retryDelay === undefined || !isRetryableQueueRewriteError(error)) {\n throw error;\n }\n await sleep(retryDelay);\n }\n }\n}\n\nfunction isRetryableQueueRewriteError(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null || !(\"code\" in error)) {\n return false;\n }\n const code = (error as { code?: unknown }).code;\n return code === \"EACCES\" || code === \"EBUSY\" || code === \"EPERM\";\n}\n\nfunction sleep(milliseconds: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, milliseconds);\n });\n}\n\nasync function cleanupTelemetryQueueTempOrphans(\n globalPmRoot: string,\n maxAgeMs = TELEMETRY_QUEUE_TMP_ORPHAN_MAX_AGE_MS,\n): Promise<void> {\n try {\n const dirPath = telemetryRuntimeDirectory(globalPmRoot);\n const entries = await readdir(dirPath, { withFileTypes: true });\n const cutoffMs = Date.now() - Math.max(0, maxAgeMs);\n await Promise.all(\n entries\n .filter((entry) => entry.isFile() && /^\\.events\\.jsonl\\.\\d+\\.\\d+\\.[a-f0-9]+\\.tmp$/.test(entry.name))\n .map(async (entry) => {\n const candidate = path.join(dirPath, entry.name);\n const candidateStats = await stat(candidate);\n if (candidateStats.mtimeMs < cutoffMs) {\n await rm(candidate, { force: true });\n }\n }),\n );\n } catch {\n // Telemetry cleanup is best-effort and must not affect command execution.\n }\n}\n\nasync function withQueueMutation<T>(operation: () => Promise<T>): Promise<T> {\n const run = _queueMutationPromise.catch(() => {}).then(operation);\n _queueMutationPromise = run.catch(() => {});\n return run;\n}\n\nasync function readCurrentQueueEntries(globalPmRoot: string): Promise<QueuedTelemetryEvent[]> {\n const raw = await readFileIfExists(queuePath(globalPmRoot));\n if (raw === null || raw.trim().length === 0) {\n return [];\n }\n return parseQueueLines(raw);\n}\n\nasync function removeFlushedEntriesFromCurrentQueue(\n globalPmRoot: string,\n flushedIds: ReadonlySet<string>,\n retentionDays: number,\n): Promise<QueuedTelemetryEvent[]> {\n return withQueueMutation(async () => {\n const currentEntries = await readCurrentQueueEntries(globalPmRoot);\n const { entries: retainedEntries } = pruneExpiredQueueEntries(currentEntries, retentionDays);\n const remaining = retainedEntries.filter((entry) => !flushedIds.has(entry.event.event_id));\n await rewriteQueue(globalPmRoot, remaining);\n return remaining;\n });\n}\n\nasync function markFailedEntriesInCurrentQueue(\n globalPmRoot: string,\n failedIds: ReadonlySet<string>,\n attemptTime: string,\n retentionDays: number,\n): Promise<QueuedTelemetryEvent[]> {\n return withQueueMutation(async () => {\n const currentEntries = await readCurrentQueueEntries(globalPmRoot);\n const { entries: retainedEntries } = pruneExpiredQueueEntries(currentEntries, retentionDays);\n const retried = retainedEntries.map((entry) => {\n if (!failedIds.has(entry.event.event_id)) {\n return entry;\n }\n const attempts = entry.attempts + 1;\n return {\n ...entry,\n attempts,\n last_attempt_at: attemptTime,\n next_attempt_after: nextRetryIso(attempts),\n };\n });\n await rewriteQueue(globalPmRoot, retried);\n return retried;\n });\n}\n\nasync function flushQueue(globalPmRoot: string, endpoint: string, retentionDays: number): Promise<void> {\n await cleanupTelemetryQueueTempOrphans(globalPmRoot);\n const normalizedEndpoint = endpoint.trim();\n if (normalizedEndpoint.length === 0) {\n return;\n }\n const raw = await readFileIfExists(queuePath(globalPmRoot));\n if (raw === null || raw.trim().length === 0) {\n await writeRuntimeState(globalPmRoot, {\n endpoint: normalizedEndpoint,\n queue_entries: 0,\n });\n return;\n }\n const queueEntries = parseQueueLines(raw);\n if (queueEntries.length === 0) {\n await writeRuntimeState(globalPmRoot, {\n endpoint: normalizedEndpoint,\n queue_entries: 0,\n });\n return;\n }\n const { entries: retainedEntries, prunedCount } = pruneExpiredQueueEntries(queueEntries, retentionDays);\n if (retainedEntries.length === 0) {\n if (prunedCount > 0) {\n await rewriteQueue(globalPmRoot, []);\n }\n await writeRuntimeState(globalPmRoot, {\n endpoint: normalizedEndpoint,\n queue_entries: 0,\n });\n return;\n }\n const dueEntries = retainedEntries.filter((entry) => isDueForRetry(entry)).slice(0, TELEMETRY_FLUSH_BATCH_SIZE);\n if (dueEntries.length === 0) {\n if (prunedCount > 0) {\n await rewriteQueue(globalPmRoot, retainedEntries);\n }\n await writeRuntimeState(globalPmRoot, {\n endpoint: normalizedEndpoint,\n queue_entries: retainedEntries.length,\n });\n return;\n }\n const dueIds = new Set(dueEntries.map((entry) => entry.event.event_id));\n const attemptTime = nowIso();\n const requestHeaders: Record<string, string> = {\n \"content-type\": \"application/json\",\n };\n const ingestKey = process.env.PM_TELEMETRY_INGEST_KEY?.trim();\n if (ingestKey) {\n requestHeaders[\"x-pm-telemetry-key\"] = ingestKey;\n }\n\n try {\n const response = await fetch(normalizedEndpoint, {\n method: \"POST\",\n headers: requestHeaders,\n body: JSON.stringify({\n schema_version: TELEMETRY_SCHEMA_VERSION,\n events: dueEntries.map((entry) => entry.event),\n }),\n signal: AbortSignal.timeout(TELEMETRY_HTTP_TIMEOUT_MS),\n });\n if (!response.ok) {\n throw new Error(`telemetry_flush_http_${response.status}`);\n }\n } catch (error: unknown) {\n const retried = await markFailedEntriesInCurrentQueue(globalPmRoot, dueIds, attemptTime, retentionDays);\n const errorMessage = (() => {\n if (error instanceof Error) {\n return sanitizeString(error.message, \"redacted\");\n }\n return \"telemetry_flush_failed\";\n })();\n await writeRuntimeState(globalPmRoot, {\n endpoint: normalizedEndpoint,\n queue_entries: retried.length,\n last_attempted_flush_at: attemptTime,\n last_failed_flush_at: attemptTime,\n last_failed_flush_error: errorMessage,\n });\n return;\n }\n\n try {\n const remaining = await removeFlushedEntriesFromCurrentQueue(globalPmRoot, dueIds, retentionDays);\n await writeRuntimeState(globalPmRoot, {\n endpoint: normalizedEndpoint,\n queue_entries: remaining.length,\n last_attempted_flush_at: attemptTime,\n last_successful_flush_at: attemptTime,\n last_failed_flush_at: undefined,\n last_failed_flush_error: undefined,\n });\n } catch (error: unknown) {\n const errorMessage = (() => {\n if (error instanceof Error) {\n return sanitizeString(error.message, \"redacted\");\n }\n return \"telemetry_flush_failed\";\n })();\n const currentEntries = await readCurrentQueueEntries(globalPmRoot).catch(() => retainedEntries);\n await writeRuntimeState(globalPmRoot, {\n endpoint: normalizedEndpoint,\n queue_entries: currentEntries.length,\n last_attempted_flush_at: attemptTime,\n last_failed_flush_at: attemptTime,\n last_failed_flush_error: errorMessage,\n });\n }\n}\n\nasync function acquireTelemetryFlushLock(globalPmRoot: string): Promise<boolean> {\n const lockPath = flushLockPath(globalPmRoot);\n await mkdir(path.dirname(lockPath), { recursive: true });\n try {\n await mkdir(lockPath);\n return true;\n } catch (error: unknown) {\n if (typeof error !== \"object\" || error === null || !(\"code\" in error) || (error as { code?: unknown }).code !== \"EEXIST\") {\n throw error;\n }\n }\n\n try {\n const lockStats = await stat(lockPath);\n if (Date.now() - lockStats.mtimeMs < TELEMETRY_FLUSH_LOCK_STALE_MS) {\n return false;\n }\n await rm(lockPath, { recursive: true, force: true });\n await mkdir(lockPath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isFreshDirectoryLock(lockPath: string, staleMs: number): boolean {\n try {\n return Date.now() - statSync(lockPath).mtimeMs < staleMs;\n } catch {\n return false;\n }\n}\n\nfunction removeDirectoryLockBestEffort(lockPath: string): void {\n try {\n rmSync(lockPath, { recursive: true, force: true });\n } catch {\n // Flush scheduling is best effort and must never fail user commands.\n }\n}\n\nfunction errorCode(error: unknown): string | undefined {\n if (typeof error !== \"object\" || error === null || !(\"code\" in error)) {\n return undefined;\n }\n const code = (error as { code?: unknown }).code;\n return typeof code === \"string\" ? code : undefined;\n}\n\nfunction createDirectoryLock(lockPath: string): boolean {\n try {\n mkdirSync(lockPath);\n return true;\n } catch (error: unknown) {\n const code = errorCode(error);\n if (code === \"EEXIST\") {\n return false;\n }\n if (code !== \"ENOENT\") {\n return false;\n }\n }\n\n try {\n mkdirSync(path.dirname(lockPath), { recursive: true });\n mkdirSync(lockPath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction acquireTelemetryFlushSpawnGate(globalPmRoot: string): boolean {\n if (isFreshDirectoryLock(flushLockPath(globalPmRoot), TELEMETRY_FLUSH_LOCK_STALE_MS)) {\n return false;\n }\n\n const lockPath = flushSpawnLockPath(globalPmRoot);\n try {\n if (Date.now() - statSync(lockPath).mtimeMs < TELEMETRY_FLUSH_SPAWN_LOCK_STALE_MS) {\n return false;\n }\n removeDirectoryLockBestEffort(lockPath);\n } catch (error: unknown) {\n if (errorCode(error) !== \"ENOENT\") {\n return false;\n }\n }\n\n return createDirectoryLock(lockPath);\n}\n\nfunction releaseTelemetryFlushSpawnGate(globalPmRoot: string): void {\n removeDirectoryLockBestEffort(flushSpawnLockPath(globalPmRoot));\n}\n\nexport const _testOnly = {\n acquireTelemetryFlushSpawnGate,\n releaseTelemetryFlushSpawnGate,\n flushLockPath,\n flushSpawnLockPath,\n};\n\nasync function flushQueueWithProcessLock(globalPmRoot: string, endpoint: string, retentionDays: number): Promise<void> {\n const acquired = await acquireTelemetryFlushLock(globalPmRoot);\n releaseTelemetryFlushSpawnGate(globalPmRoot);\n if (!acquired) {\n return;\n }\n try {\n await flushQueue(globalPmRoot, endpoint, retentionDays);\n } finally {\n await rm(flushLockPath(globalPmRoot), { recursive: true, force: true }).catch(() => {});\n }\n}\n\nfunction scheduleTelemetryFlush(globalPmRoot: string, endpoint: string, retentionDays: number): void {\n if (shouldFlushInline()) {\n const previousFlush = _lastFlushPromise;\n const nextFlush = flushQueue(globalPmRoot, endpoint, retentionDays).catch(() => {});\n _lastFlushPromise = Promise.allSettled([previousFlush, nextFlush]).then(() => {});\n return;\n }\n\n try {\n const acquiredSpawnGate = acquireTelemetryFlushSpawnGate(globalPmRoot);\n if (!acquiredSpawnGate) {\n return;\n }\n const child = spawn(process.execPath, [telemetryFlushRunnerPath()], {\n detached: true,\n stdio: \"ignore\",\n env: {\n ...process.env,\n PM_GLOBAL_PATH: globalPmRoot,\n [PM_TELEMETRY_FLUSH_CHILD_ENV]: \"1\",\n },\n });\n child.unref();\n } catch {\n releaseTelemetryFlushSpawnGate(globalPmRoot);\n // Flush scheduling is best effort and must not keep the CLI alive.\n }\n}\n\nexport async function flushTelemetryQueueNow(globalPmRoot = resolveGlobalPmRoot(process.cwd())): Promise<void> {\n if (telemetryDisabledByEnvironment()) {\n return;\n }\n try {\n const settings = await readSettings(globalPmRoot);\n if (!settings.telemetry.enabled) {\n return;\n }\n const { endpoint, retentionDays } = await ensureInstallationId(globalPmRoot);\n await flushQueueWithProcessLock(globalPmRoot, endpoint, retentionDays);\n } catch {\n // Telemetry workers are best effort and must never fail user commands.\n }\n}\n\nexport async function startTelemetryCommand(context: TelemetryCommandContext): Promise<ActiveTelemetryCommand | null> {\n if (telemetryDisabledByEnvironment()) {\n return null;\n }\n if (\n context.command === \"telemetry\" &&\n context.args.some((token) => token.trim().toLowerCase() === \"clear\")\n ) {\n return null;\n }\n try {\n const globalPmRoot = resolveGlobalPmRoot(process.cwd());\n const settings = await readSettings(globalPmRoot);\n if (!settings.telemetry.enabled) {\n return null;\n }\n const captureLevel = normalizeCaptureLevel(settings.telemetry.capture_level);\n const { installationId, endpoint, retentionDays } = await ensureInstallationId(globalPmRoot);\n const pmVersion = normalizePmVersion(context.pm_version);\n const sourceContext = resolveTelemetrySourceContext(context.global);\n const pmRootHash = hashWithInstallationId(installationId, context.pm_root);\n const cwdHash = hashWithInstallationId(installationId, process.cwd());\n const otelTracesEndpoint = resolveOtelTracesEndpoint();\n const occurredAt = nowIso();\n const event: TelemetryEvent = {\n schema_version: TELEMETRY_SCHEMA_VERSION,\n event_id: crypto.randomUUID(),\n event_type: \"command_start\",\n occurred_at: occurredAt,\n installation_id: installationId,\n session_id: PROCESS_SESSION_ID,\n command: context.command,\n payload: buildCommandStartPayload({\n captureLevel,\n context,\n pmVersion,\n sourceContext,\n pmRootHash,\n cwdHash,\n installationId,\n }),\n };\n await enqueueTelemetryEvent(globalPmRoot, event);\n scheduleTelemetryFlush(globalPmRoot, endpoint, retentionDays);\n const commandTaxonomy = deriveTelemetryCommandTaxonomy(context.command);\n return {\n started_at: occurredAt,\n started_at_ms: Date.now(),\n command: context.command,\n command_taxonomy: commandTaxonomy,\n pm_version: pmVersion,\n source_context: sourceContext.source_context,\n source_context_source: sourceContext.source_context_source,\n installation_id: installationId,\n pm_root_hash: pmRootHash,\n cwd_hash: cwdHash,\n endpoint,\n retention_days: retentionDays,\n global_pm_root: globalPmRoot,\n capture_level: captureLevel,\n otel_traces_endpoint: otelTracesEndpoint ?? undefined,\n otel_trace_id: otelTracesEndpoint ? crypto.randomBytes(16).toString(\"hex\") : undefined,\n otel_span_id: otelTracesEndpoint ? crypto.randomBytes(8).toString(\"hex\") : undefined,\n };\n } catch {\n // Telemetry must never block command execution.\n return null;\n }\n}\n\nexport async function finishTelemetryCommand(\n activeCommand: ActiveTelemetryCommand | null,\n outcome: TelemetryCommandOutcome,\n): Promise<void> {\n if (!activeCommand) {\n return;\n }\n try {\n const finishedAt = nowIso();\n const durationMs = Math.max(0, Date.now() - activeCommand.started_at_ms);\n const normalizedErrorCode = normalizeTelemetryErrorCode(\n inferTelemetryErrorCode({\n ok: outcome.ok,\n errorCode: outcome.error_code,\n errorMessage: outcome.error,\n exitCode: outcome.exit_code,\n }),\n );\n const normalizedErrorCategory = normalizeTelemetryErrorCategory({\n ok: outcome.ok,\n errorCode: normalizedErrorCode,\n errorCategory: outcome.error_category,\n });\n const normalizedExitCode = normalizeTelemetryExitCode(outcome.exit_code, outcome.ok);\n const commandResolution =\n outcome.command_resolution ??\n deriveTelemetryCommandResolution({\n ok: outcome.ok,\n errorCode: normalizedErrorCode,\n errorCategory: normalizedErrorCategory,\n });\n const resolutionStage = outcome.resolution_stage ?? \"execute\";\n const event: TelemetryEvent = {\n schema_version: TELEMETRY_SCHEMA_VERSION,\n event_id: crypto.randomUUID(),\n event_type: \"command_finish\",\n occurred_at: finishedAt,\n installation_id: activeCommand.installation_id,\n session_id: PROCESS_SESSION_ID,\n command: activeCommand.command,\n payload: buildCommandFinishPayload({\n captureLevel: activeCommand.capture_level,\n pmVersion: activeCommand.pm_version,\n sourceContext: {\n source_context: activeCommand.source_context,\n source_context_source: activeCommand.source_context_source,\n },\n outcome,\n durationMs,\n startedAt: activeCommand.started_at,\n command: activeCommand.command,\n installationId: activeCommand.installation_id,\n commandTaxonomy: activeCommand.command_taxonomy,\n exitCode: normalizedExitCode,\n errorCode: normalizedErrorCode,\n errorCategory: normalizedErrorCategory,\n commandResolution,\n resolutionStage,\n }),\n };\n await enqueueTelemetryEvent(activeCommand.global_pm_root, event);\n scheduleTelemetryFlush(activeCommand.global_pm_root, activeCommand.endpoint, activeCommand.retention_days);\n void exportLocalOtelSpan(\n activeCommand,\n {\n ...outcome,\n exit_code: normalizedExitCode,\n error_code: normalizedErrorCode,\n error_category: normalizedErrorCategory,\n },\n finishedAt,\n durationMs,\n ).catch(() => {});\n } catch {\n // Telemetry must never block command execution.\n }\n}\n\nexport async function emitTelemetryErrorEvent(context: TelemetryErrorEventContext): Promise<void> {\n if (telemetryDisabledByEnvironment()) {\n return;\n }\n try {\n const globalPmRoot = resolveGlobalPmRoot(process.cwd());\n const settings = await readSettings(globalPmRoot);\n if (!settings.telemetry.enabled) {\n return;\n }\n const captureLevel = normalizeCaptureLevel(settings.telemetry.capture_level);\n const { installationId, endpoint, retentionDays } = await ensureInstallationId(globalPmRoot);\n const pmVersion = normalizePmVersion(context.pm_version);\n const sourceContext = resolveTelemetrySourceContext(context.global);\n const pmRootHash = hashWithInstallationId(installationId, context.pm_root);\n const cwdHash = hashWithInstallationId(installationId, process.cwd());\n const occurredAt = nowIso();\n const normalizedErrorCode =\n normalizeTelemetryErrorCode(\n inferTelemetryErrorCode({\n ok: false,\n errorCode: context.error_code,\n errorMessage: context.error_message,\n exitCode: context.exit_code,\n }),\n ) ?? \"unknown_error\";\n const normalizedErrorCategory =\n context.error_category ?? resolveTelemetryErrorCategory(normalizedErrorCode);\n const normalizedExitCode = normalizeTelemetryExitCode(context.exit_code, false);\n const normalizedCommand = context.command.trim().length > 0 ? context.command : \"<unknown>\";\n const commandTaxonomy = deriveTelemetryCommandTaxonomy(normalizedCommand);\n const commandResolution =\n context.command_resolution ??\n deriveTelemetryCommandResolution({\n ok: false,\n errorCode: normalizedErrorCode,\n errorCategory: normalizedErrorCategory,\n });\n const resolutionStage = context.resolution_stage ?? \"unknown\";\n\n const event: TelemetryEvent = {\n schema_version: TELEMETRY_SCHEMA_VERSION,\n event_id: crypto.randomUUID(),\n event_type: \"command_error\",\n occurred_at: occurredAt,\n installation_id: installationId,\n session_id: PROCESS_SESSION_ID,\n command: sanitizeString(normalizedCommand, \"redacted\"),\n payload: buildCommandErrorPayload({\n captureLevel,\n pmVersion,\n sourceContext,\n command: normalizedCommand,\n commandTaxonomy,\n commandResolution,\n resolutionStage,\n args: context.args,\n options: context.options,\n pmRootHash,\n cwdHash,\n installationId,\n errorCode: normalizedErrorCode,\n errorCategory: normalizedErrorCategory,\n exitCode: normalizedExitCode,\n errorMessage: context.error_message,\n }),\n };\n await enqueueTelemetryEvent(globalPmRoot, event);\n scheduleTelemetryFlush(globalPmRoot, endpoint, retentionDays);\n } catch {\n // Telemetry must never block command execution.\n }\n}\n"],"names":["errorCode","errorCode"],"mappings":"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","debugId":"2bdbccd7-0a20-51af-bd55-4dcbb4a3c215"}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../../core/search/http-client.ts", "../../../../../../../../core/search/providers.ts", "../../../../../../../../core/search/corpus.ts", "../../../../../../../../core/search/semantic-defaults.ts", "../../../../../../../../core/search/vector-stores.ts", "../../../../../../../../core/search/vectorization-metadata.ts", "../../../../../../../../core/search/cache.ts", "../../../../../../../../core/search/embedding-batches.ts", "../../../../../../../../core/search/background-refresh.ts"],
4
- "sourcesContent": ["import { toErrorMessage } from \"../shared/primitives.js\";\n\nexport const DEFAULT_SEARCH_HTTP_TIMEOUT_MS = 30_000;\n\nexport interface SearchHttpResponse {\n ok: boolean;\n status: number;\n statusText: string;\n json(): Promise<unknown>;\n text(): Promise<string>;\n}\n\nexport interface SearchHttpRequestInit {\n method: \"DELETE\" | \"POST\" | \"PUT\";\n headers: Record<string, string>;\n body: string;\n signal: AbortSignal;\n}\n\nexport type SearchHttpFetcher<ResponseType extends SearchHttpResponse = SearchHttpResponse> = (\n url: string,\n init: SearchHttpRequestInit,\n) => Promise<ResponseType>;\n\nexport interface ExecuteSearchJsonRequestOptions<ResponseType extends SearchHttpResponse = SearchHttpResponse> {\n endpoint: string;\n method: \"DELETE\" | \"POST\" | \"PUT\";\n headers: Record<string, string>;\n body: Record<string, unknown>;\n timeoutMs: number;\n fetcher: SearchHttpFetcher<ResponseType>;\n requestLabel: string;\n responseLabel: string;\n}\n\nexport function normalizeSearchHttpTimeoutMs(\n timeoutMs: number | undefined,\n requestLabel: string,\n defaultTimeoutMs = DEFAULT_SEARCH_HTTP_TIMEOUT_MS,\n): number {\n const resolved = timeoutMs ?? defaultTimeoutMs;\n if (!Number.isFinite(resolved) || resolved <= 0) {\n throw new Error(`${requestLabel} timeout must be a positive finite number`);\n }\n return Math.floor(resolved);\n}\n\nexport function resolveSearchHttpFetcher<ResponseType extends SearchHttpResponse>(\n fetcher: SearchHttpFetcher<ResponseType> | undefined,\n requestLabel: string,\n): SearchHttpFetcher<ResponseType> {\n if (fetcher) {\n return fetcher;\n }\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch.bind(globalThis) as unknown as SearchHttpFetcher<ResponseType>;\n }\n throw new Error(`${requestLabel} execution requires a fetch implementation`);\n}\n\nexport async function readFailedSearchHttpResponseBody(response: SearchHttpResponse): Promise<string> {\n try {\n return (await response.text()).replaceAll(/\\s+/g, \" \").trim();\n } catch (error) {\n return `(failed to read response body: ${toErrorMessage(error)})`;\n }\n}\n\nexport async function executeSearchJsonRequest<ResponseType extends SearchHttpResponse>(\n options: ExecuteSearchJsonRequestOptions<ResponseType>,\n): Promise<unknown> {\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => {\n controller.abort();\n }, options.timeoutMs);\n\n try {\n let response: ResponseType;\n try {\n response = await options.fetcher(options.endpoint, {\n method: options.method,\n headers: options.headers,\n body: JSON.stringify(options.body),\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(`${options.requestLabel} timed out after ${options.timeoutMs}ms`);\n }\n throw new Error(`${options.requestLabel} execution failed: ${toErrorMessage(error)}`);\n }\n\n if (!response.ok) {\n const responseBody = await readFailedSearchHttpResponseBody(response);\n const detail = responseBody.length > 0 ? `: ${responseBody}` : \"\";\n throw new Error(`${options.requestLabel} failed with status ${response.status} ${response.statusText}${detail}`);\n }\n\n try {\n return await response.json();\n } catch (error) {\n throw new Error(`${options.responseLabel} JSON parse failed: ${toErrorMessage(error)}`);\n }\n } finally {\n clearTimeout(timeoutHandle);\n }\n}\n", "import type { PmSettings } from \"../../types/index.js\";\nimport {\n executeSearchJsonRequest,\n normalizeSearchHttpTimeoutMs,\n resolveSearchHttpFetcher,\n} from \"./http-client.js\";\nimport type { SearchHttpFetcher, SearchHttpResponse } from \"./http-client.js\";\nimport {\n isFiniteNumberArray,\n toNonEmptyString,\n trimTrailingSlashes,\n} from \"../shared/primitives.js\";\n\nexport type EmbeddingProviderName = \"openai\" | \"ollama\";\n\nexport interface EmbeddingProviderConfig {\n name: EmbeddingProviderName;\n base_url: string;\n model: string;\n api_key?: string;\n}\n\nexport interface EmbeddingProviderResolution {\n active: EmbeddingProviderConfig | null;\n available: EmbeddingProviderConfig[];\n}\n\nexport interface EmbeddingRequestTarget {\n provider: EmbeddingProviderName;\n endpoint: string;\n model: string;\n}\n\nexport interface EmbeddingRequestPlan {\n target: EmbeddingRequestTarget;\n method: \"POST\";\n headers: Record<string, string>;\n body: Record<string, unknown>;\n}\n\nexport type EmbeddingHttpResponse = SearchHttpResponse;\n\nexport type EmbeddingRequestFetcher = SearchHttpFetcher<EmbeddingHttpResponse>;\n\nexport interface ExecuteEmbeddingRequestOptions {\n timeout_ms?: number;\n fetcher?: EmbeddingRequestFetcher;\n}\n\ntype ProviderSettingsInput = {\n providers?: {\n openai?: {\n base_url?: string;\n api_key?: string;\n model?: string;\n };\n ollama?: {\n base_url?: string;\n model?: string;\n };\n };\n};\n\nfunction normalizeOpenAiEmbeddingsEndpoint(baseUrl: string): string {\n const normalizedBaseUrl = trimTrailingSlashes(baseUrl);\n const normalizedLower = normalizedBaseUrl.toLowerCase();\n if (normalizedLower.endsWith(\"/embeddings\")) {\n return normalizedBaseUrl;\n }\n if (normalizedLower.endsWith(\"/v1\")) {\n return `${normalizedBaseUrl}/embeddings`;\n }\n return `${normalizedBaseUrl}/v1/embeddings`;\n}\n\nfunction resolveSearchEmbeddingModelOverride(settings: ProviderSettingsInput): string | null {\n // `settings.search.embedding_model` is documented as overriding the\n // provider-specific model when set (see CONFIG_KEY_ALIASES for\n // `search_embedding_model` in src/core/config/nested-settings.ts). Each\n // provider resolver picks this up after its own model is read so the\n // override applies to whichever built-in is selected.\n const candidate = (settings as { search?: { embedding_model?: unknown } }).search?.embedding_model;\n return toNonEmptyString(candidate) || null;\n}\n\nfunction resolveOpenAiProvider(settings: ProviderSettingsInput): EmbeddingProviderConfig | null {\n const baseUrl = toNonEmptyString(settings.providers?.openai?.base_url);\n const model = toNonEmptyString(settings.providers?.openai?.model);\n if (!baseUrl || !model) {\n return null;\n }\n const override = resolveSearchEmbeddingModelOverride(settings);\n const apiKey = toNonEmptyString(settings.providers?.openai?.api_key);\n return {\n name: \"openai\",\n base_url: baseUrl,\n model: override ?? model,\n ...(apiKey ? { api_key: apiKey } : {}),\n };\n}\n\nfunction resolveOllamaProvider(settings: ProviderSettingsInput): EmbeddingProviderConfig | null {\n const baseUrl = toNonEmptyString(settings.providers?.ollama?.base_url);\n const model = toNonEmptyString(settings.providers?.ollama?.model);\n if (!baseUrl || !model) {\n return null;\n }\n const override = resolveSearchEmbeddingModelOverride(settings);\n return {\n name: \"ollama\",\n base_url: baseUrl,\n model: override ?? model,\n };\n}\n\nfunction normalizeEmbeddingInputs(input: string | string[]): string[] {\n const inputs = (Array.isArray(input) ? input : [input])\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n if (inputs.length === 0) {\n throw new Error(\"Embedding input must include at least one non-empty string\");\n }\n return inputs;\n}\n\ninterface DedupedEmbeddingInputs {\n uniqueInputs: string[];\n originalToUniqueIndex: number[];\n}\n\nfunction dedupeEmbeddingInputs(inputs: string[]): DedupedEmbeddingInputs {\n const uniqueInputs: string[] = [];\n const originalToUniqueIndex: number[] = [];\n const uniqueIndexByInput = new Map<string, number>();\n for (const entry of inputs) {\n const existingUniqueIndex = uniqueIndexByInput.get(entry);\n if (existingUniqueIndex === undefined) {\n const nextUniqueIndex = uniqueInputs.length;\n uniqueInputs.push(entry);\n uniqueIndexByInput.set(entry, nextUniqueIndex);\n originalToUniqueIndex.push(nextUniqueIndex);\n continue;\n }\n originalToUniqueIndex.push(existingUniqueIndex);\n }\n return {\n uniqueInputs,\n originalToUniqueIndex,\n };\n}\n\ninterface OpenAiEmbeddingResponseEntry {\n embedding: unknown;\n index: unknown;\n position: number;\n}\n\nfunction buildOrderedOpenAiEntries(data: unknown[]): OpenAiEmbeddingResponseEntry[] {\n const openAiEntries = data.map((entry, position) => ({\n embedding: (entry as { embedding?: unknown }).embedding,\n index: (entry as { index?: unknown }).index,\n position,\n }));\n const hasExplicitIndex = openAiEntries.some((entry) => entry.index !== undefined);\n if (hasExplicitIndex) {\n for (const entry of openAiEntries) {\n if (!Number.isInteger(entry.index)) {\n throw new TypeError(`OpenAI embedding response entry at position ${entry.position} is missing a valid integer index`);\n }\n }\n return [...openAiEntries].sort((a, b) => {\n const byIndex = (a.index as number) - (b.index as number);\n if (byIndex !== 0) {\n return byIndex;\n }\n return a.position - b.position;\n });\n }\n return openAiEntries;\n}\n\nexport function resolveEmbeddingProviders(settings: PmSettings | ProviderSettingsInput): EmbeddingProviderResolution {\n const openAi = resolveOpenAiProvider(settings);\n const ollama = resolveOllamaProvider(settings);\n const available = [openAi, ollama].filter((entry): entry is EmbeddingProviderConfig => entry !== null);\n // Honor `settings.search.provider` when set: if both built-in providers are\n // configured, the preferred name wins; otherwise fall back to the first\n // available entry (preserves the previous tie-break: openai > ollama).\n // Match case-insensitively so \"OpenAI\" / \"Ollama\" / \"OLLAMA\" all work.\n const preferredName = toNonEmptyString(\n (settings as { search?: { provider?: unknown } }).search?.provider,\n );\n const preferredKey = preferredName ? preferredName.toLowerCase() : null;\n const preferred = preferredKey\n ? available.find((entry) => entry.name === preferredKey)\n : undefined;\n return {\n active: preferred ?? available[0] ?? null,\n available,\n };\n}\n\nexport function resolveEmbeddingRequestTarget(provider: EmbeddingProviderConfig): EmbeddingRequestTarget {\n const baseUrl = trimTrailingSlashes(provider.base_url);\n if (provider.name === \"openai\") {\n return {\n provider: \"openai\",\n endpoint: normalizeOpenAiEmbeddingsEndpoint(baseUrl),\n model: provider.model,\n };\n }\n return {\n provider: \"ollama\",\n endpoint: `${baseUrl}/api/embed`,\n model: provider.model,\n };\n}\n\nexport function buildEmbeddingRequestPlan(provider: EmbeddingProviderConfig, input: string | string[]): EmbeddingRequestPlan {\n const normalizedInputs = normalizeEmbeddingInputs(input);\n if (provider.name === \"openai\") {\n return {\n target: resolveEmbeddingRequestTarget(provider),\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(provider.api_key ? { authorization: `Bearer ${provider.api_key}` } : {}),\n },\n body: {\n model: provider.model,\n input: normalizedInputs.length === 1 ? normalizedInputs[0] : normalizedInputs,\n },\n };\n }\n return {\n target: resolveEmbeddingRequestTarget(provider),\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: {\n model: provider.model,\n input: normalizedInputs,\n },\n };\n}\n\nexport function normalizeEmbeddingResponse(provider: EmbeddingProviderConfig, response: unknown): number[][] {\n if (provider.name === \"openai\") {\n const data = (response as { data?: unknown }).data;\n if (!Array.isArray(data) || data.length === 0) {\n throw new Error(\"OpenAI embedding response must include a non-empty data array\");\n }\n const orderedEntries = buildOrderedOpenAiEntries(data);\n\n return orderedEntries.map((entry, index) => {\n const embedding = entry.embedding;\n if (!isFiniteNumberArray(embedding)) {\n throw new Error(`OpenAI embedding response entry at index ${index} is missing a numeric embedding vector`);\n }\n return [...embedding];\n });\n }\n\n const singleEmbedding = (response as { embedding?: unknown }).embedding;\n if (isFiniteNumberArray(singleEmbedding)) {\n return [[...singleEmbedding]];\n }\n\n const multipleEmbeddings = (response as { embeddings?: unknown }).embeddings;\n if (Array.isArray(multipleEmbeddings) && multipleEmbeddings.length > 0) {\n return multipleEmbeddings.map((entry, index) => {\n if (!isFiniteNumberArray(entry)) {\n throw new Error(`Ollama embedding response entry at index ${index} is missing a numeric embedding vector`);\n }\n return [...entry];\n });\n }\n\n throw new Error(\"Ollama embedding response must include embedding or embeddings vectors\");\n}\n\nexport async function executeEmbeddingRequest(\n provider: EmbeddingProviderConfig,\n input: string | string[],\n options: ExecuteEmbeddingRequestOptions = {},\n): Promise<number[][]> {\n const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, \"Embedding request\");\n const fetcher = resolveSearchHttpFetcher(options.fetcher, \"Embedding request\");\n const normalizedInputs = normalizeEmbeddingInputs(input);\n const dedupedInputs = dedupeEmbeddingInputs(normalizedInputs);\n const requestPlan = buildEmbeddingRequestPlan(provider, dedupedInputs.uniqueInputs);\n const payload = await executeSearchJsonRequest({\n endpoint: requestPlan.target.endpoint,\n method: requestPlan.method,\n headers: requestPlan.headers,\n body: requestPlan.body,\n timeoutMs,\n fetcher,\n requestLabel: \"Embedding request\",\n responseLabel: \"Embedding response\",\n });\n const vectors = normalizeEmbeddingResponse(provider, payload);\n if (vectors.length !== dedupedInputs.uniqueInputs.length) {\n throw new Error(\n `Embedding response cardinality mismatch: expected ${dedupedInputs.uniqueInputs.length} vector(s), received ${vectors.length}`,\n );\n }\n return dedupedInputs.originalToUniqueIndex.map((uniqueIndex) => [...vectors[uniqueIndex]]);\n}\n", "import type { ItemDocument, ItemMetadata } from \"../../types/index.js\";\nimport { coercePositiveInteger } from \"../shared/primitives.js\";\n\nexport const DEFAULT_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS = 8_000;\nexport const OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS = 3_200;\nexport const SEMANTIC_CORPUS_TRUNCATION_SUFFIX = \"...[semantic corpus truncated]\";\nexport const SEARCH_EMBEDDING_CORPUS_MAX_CHARACTERS_INVALID_WARNING =\n \"search_embedding_corpus_max_characters_invalid:using_provider_default\";\n\nfunction compactParts(parts: Array<string | boolean | number | null | undefined>): string {\n return parts\n .map((part) => (part === undefined || part === null ? \"\" : String(part).trim()))\n .filter((part) => part.length > 0)\n .join(\" \");\n}\n\nexport function buildReminderCorpus(item: ItemMetadata): string[] {\n return (item.reminders ?? []).map((reminder) => compactParts([reminder.at, reminder.text]));\n}\n\nexport function buildEventCorpus(item: ItemMetadata): string[] {\n return (item.events ?? []).map((event) =>\n compactParts([\n event.start_at,\n event.end_at,\n event.title,\n event.description,\n event.location,\n event.all_day === true ? \"all day\" : undefined,\n event.timezone,\n event.recurrence?.freq,\n event.recurrence?.interval,\n event.recurrence?.count,\n event.recurrence?.until,\n event.recurrence?.by_weekday?.join(\" \"),\n event.recurrence?.by_month_day?.join(\" \"),\n event.recurrence?.exdates?.join(\" \"),\n ]),\n );\n}\n\nexport function buildPlanFlatCorpus(item: ItemMetadata): string {\n const segments: Array<string | undefined> = [];\n segments.push(item.plan_mode, item.plan_scope, item.plan_harness, item.plan_resume_context);\n for (const step of item.plan_steps ?? []) {\n segments.push(step.title, step.body, step.status, step.owner, step.evidence, step.blocked_reason, step.superseded_by);\n for (const link of step.linked_items ?? []) {\n segments.push(`${link.kind} ${link.id}`, link.note);\n }\n for (const file of step.files ?? []) segments.push(file.path, file.note);\n for (const test of step.tests ?? []) segments.push(test.command, test.path, test.note);\n for (const doc of step.docs ?? []) segments.push(doc.path, doc.note);\n }\n for (const decision of item.plan_decisions ?? []) {\n segments.push(decision.decision, decision.rationale, decision.evidence);\n }\n for (const discovery of item.plan_discoveries ?? []) {\n segments.push(discovery.text);\n }\n for (const check of item.plan_validation ?? []) {\n segments.push(check.text, check.command, check.expected);\n }\n return segments.filter((segment): segment is string => typeof segment === \"string\" && segment.length > 0).join(\" \");\n}\n\nexport function buildPlanCorpus(item: ItemMetadata): Record<string, unknown> | undefined {\n const steps = (item.plan_steps ?? []).map((step) =>\n compactParts([\n step.order,\n step.id,\n step.title,\n step.body,\n step.status,\n step.owner,\n step.evidence,\n step.blocked_reason,\n step.superseded_by,\n (step.linked_items ?? []).map((link) => compactParts([link.kind, link.id, link.note])).join(\" \"),\n (step.files ?? []).map((file) => compactParts([file.path, file.note])).join(\" \"),\n (step.tests ?? []).map((test) => compactParts([test.command, test.path, test.note])).join(\" \"),\n (step.docs ?? []).map((doc) => compactParts([doc.path, doc.note])).join(\" \"),\n ]),\n );\n const decisions = (item.plan_decisions ?? []).map((entry) =>\n compactParts([entry.decision, entry.rationale, entry.evidence, entry.step_id]),\n );\n const discoveries = (item.plan_discoveries ?? []).map((entry) => compactParts([entry.text, entry.step_id]));\n const validation = (item.plan_validation ?? []).map((entry) =>\n compactParts([entry.text, entry.command, entry.expected]),\n );\n const hasPlanContent =\n item.plan_mode !== undefined ||\n item.plan_scope !== undefined ||\n item.plan_harness !== undefined ||\n item.plan_resume_context !== undefined ||\n steps.length > 0 ||\n decisions.length > 0 ||\n discoveries.length > 0 ||\n validation.length > 0;\n if (!hasPlanContent) {\n return undefined;\n }\n return {\n mode: item.plan_mode,\n scope: item.plan_scope,\n harness: item.plan_harness,\n resume_context: item.plan_resume_context,\n steps,\n decisions,\n discoveries,\n validation,\n };\n}\n\nexport function buildSearchCorpus(document: ItemDocument): Record<string, unknown> {\n const item = document.metadata;\n const plan = buildPlanCorpus(item);\n const corpus: Record<string, unknown> = {\n title: item.title,\n description: item.description,\n tags: item.tags,\n status: item.status,\n body: document.body,\n comments: (item.comments ?? []).map((entry) => entry.text),\n notes: (item.notes ?? []).map((entry) => entry.text),\n learnings: (item.learnings ?? []).map((entry) => entry.text),\n reminders: buildReminderCorpus(item),\n events: buildEventCorpus(item),\n dependencies: (item.dependencies ?? []).map((entry) => ({\n id: entry.id,\n kind: entry.kind,\n })),\n };\n if (plan) {\n corpus.plan = plan;\n }\n return corpus;\n}\n\nexport function resolveSemanticCorpusInputCharacterLimit(providerName: string | undefined): number {\n if (providerName?.trim().toLowerCase() === \"ollama\") {\n return OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS;\n }\n return DEFAULT_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS;\n}\n\nexport interface SemanticCorpusCharacterLimitResolution {\n maxCharacters: number;\n warning: string | null;\n}\n\nexport function resolveSemanticCorpusCharacterLimit(\n providerName: string | undefined,\n configuredMaxCharacters: unknown,\n): SemanticCorpusCharacterLimitResolution {\n const providerDefaultLimit = resolveSemanticCorpusInputCharacterLimit(providerName);\n const parsed = coercePositiveInteger(configuredMaxCharacters);\n if (parsed !== null) {\n return {\n maxCharacters: parsed,\n warning: null,\n };\n }\n return {\n maxCharacters: providerDefaultLimit,\n warning:\n configuredMaxCharacters === undefined || configuredMaxCharacters === null\n ? null\n : SEARCH_EMBEDDING_CORPUS_MAX_CHARACTERS_INVALID_WARNING,\n };\n}\n\nexport interface SemanticCorpusInputOptions {\n providerName?: string;\n maxCharacters?: number;\n}\n\nexport function buildSemanticCorpusInput(document: ItemDocument, options: SemanticCorpusInputOptions = {}): string {\n const serialized = JSON.stringify(buildSearchCorpus(document));\n const maxCharacters = resolveSemanticCorpusCharacterLimit(options.providerName, options.maxCharacters)\n .maxCharacters;\n if (serialized.length <= maxCharacters) {\n return serialized;\n }\n if (maxCharacters <= SEMANTIC_CORPUS_TRUNCATION_SUFFIX.length) {\n return SEMANTIC_CORPUS_TRUNCATION_SUFFIX.slice(0, maxCharacters);\n }\n const keepLength = Math.max(0, maxCharacters - SEMANTIC_CORPUS_TRUNCATION_SUFFIX.length);\n return `${serialized.slice(0, keepLength)}${SEMANTIC_CORPUS_TRUNCATION_SUFFIX}`;\n}\n", "import { spawnSync } from \"node:child_process\";\nimport type { PmSettings } from \"../../types/index.js\";\nimport { toNonEmptyString } from \"../shared/primitives.js\";\n\nconst DISABLE_AUTO_DEFAULTS_ENV = \"PM_DISABLE_OLLAMA_AUTO_DEFAULTS\";\nconst OLLAMA_MODEL_ENV = \"PM_OLLAMA_MODEL\";\nconst DEFAULT_OLLAMA_BASE_URL = \"http://localhost:11434\";\nconst DEFAULT_OLLAMA_MODEL = \"qwen3-embedding:0.6b\";\nconst DEFAULT_LANCEDB_PATH = \".agents/pm/search/lancedb/\";\nconst OLLAMA_VERSION_TIMEOUT_MS = 1_500;\nconst OLLAMA_LIST_TIMEOUT_MS = 2_500;\nconst QWEN_EMBEDDING_MODEL_PATTERN = /qwen.*(?:embed|embedding)|(?:embed|embedding).*qwen/i;\nconst EMBEDDING_MODEL_PATTERN = /embed|embedding/i;\n\nexport interface SemanticRuntimeDefaultsResolution {\n settings: PmSettings;\n auto_ollama_defaults_applied: boolean;\n}\n\nconst toOptionalNonEmptyString = toNonEmptyString;\n\nfunction isAutoDefaultsDisabled(): boolean {\n const raw = toOptionalNonEmptyString(process.env[DISABLE_AUTO_DEFAULTS_ENV]);\n if (!raw) {\n return false;\n }\n const normalized = raw.toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\";\n}\n\n/**\n * True only when the user has opted into a provider/store that COMPETES with the\n * Ollama + LanceDB auto-default stack: an explicit non-Ollama search provider, a\n * non-LanceDB vector adapter, or any OpenAI/Qdrant credentials. A partial Ollama\n * setup (e.g. only `ollama.base_url`) is NOT competing — its missing leaves are\n * filled per-field below so a single config write can never silently disable\n * semantic search and then hard-error `pm reindex`.\n */\nfunction hasCompetingSemanticConfiguration(settings: PmSettings): boolean {\n const provider = toOptionalNonEmptyString(settings.search?.provider);\n if (provider && provider.toLowerCase() !== \"ollama\") {\n return true;\n }\n const adapter = toOptionalNonEmptyString(settings.vector_store?.adapter);\n if (adapter && adapter.toLowerCase() !== \"lancedb\") {\n return true;\n }\n const openaiConfigured = [\n settings.providers?.openai?.base_url,\n settings.providers?.openai?.model,\n settings.providers?.openai?.api_key,\n ].some((entry) => toOptionalNonEmptyString(entry) !== null);\n if (openaiConfigured) {\n return true;\n }\n const qdrantConfigured = [\n settings.vector_store?.qdrant?.url,\n settings.vector_store?.qdrant?.api_key,\n ].some((entry) => toOptionalNonEmptyString(entry) !== null);\n return qdrantConfigured;\n}\n\nfunction isOllamaInstalled(): boolean {\n const result = spawnSync(\"ollama\", [\"--version\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_VERSION_TIMEOUT_MS,\n });\n if (result.error) {\n return false;\n }\n return result.status === 0;\n}\n\nfunction parseOllamaModelList(output: string): string | null {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length === 0) {\n return null;\n }\n const models = lines\n .map((line) => line.split(/\\s+/)[0]?.trim())\n .filter((entry): entry is string => Boolean(entry && entry.length > 0))\n .filter((entry) => entry.toUpperCase() !== \"NAME\");\n if (models.length === 0) {\n return null;\n }\n const preferredQwenEmbeddingModel = models.find((entry) => QWEN_EMBEDDING_MODEL_PATTERN.test(entry));\n if (preferredQwenEmbeddingModel) {\n return preferredQwenEmbeddingModel;\n }\n const embeddingModel = models.find((entry) => EMBEDDING_MODEL_PATTERN.test(entry));\n return embeddingModel ?? null;\n}\n\nfunction resolveAutoOllamaModel(settings: PmSettings): string {\n const settingsModel = toOptionalNonEmptyString(settings.providers?.ollama?.model);\n if (settingsModel) {\n return settingsModel;\n }\n const envModel = toOptionalNonEmptyString(process.env[OLLAMA_MODEL_ENV]);\n if (envModel) {\n return envModel;\n }\n const listed = spawnSync(\"ollama\", [\"list\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_LIST_TIMEOUT_MS,\n });\n if (!listed.error && listed.status === 0) {\n const listedModel = parseOllamaModelList(typeof listed.stdout === \"string\" ? listed.stdout : \"\");\n if (listedModel) {\n return listedModel;\n }\n }\n return DEFAULT_OLLAMA_MODEL;\n}\n\nexport function resolveSettingsWithSemanticRuntimeDefaults(settings: PmSettings): SemanticRuntimeDefaultsResolution {\n const unchanged: SemanticRuntimeDefaultsResolution = {\n settings,\n auto_ollama_defaults_applied: false,\n };\n if (isAutoDefaultsDisabled()) {\n return unchanged;\n }\n if (hasCompetingSemanticConfiguration(settings)) {\n return unchanged;\n }\n\n const needsBaseUrl = toOptionalNonEmptyString(settings.providers?.ollama?.base_url) === null;\n const needsModel = toOptionalNonEmptyString(settings.providers?.ollama?.model) === null;\n const needsLancedbPath = toOptionalNonEmptyString(settings.vector_store?.lancedb?.path) === null;\n const needsEmbeddingModel = toOptionalNonEmptyString(settings.search?.embedding_model) === null;\n if (!needsBaseUrl && !needsModel && !needsLancedbPath && !needsEmbeddingModel) {\n // A fully-configured Ollama/LanceDB stack — nothing to fill, and no need to\n // probe for Ollama at all.\n return unchanged;\n }\n\n // Auto-discovering the embedding model (via `ollama list`) is the only step that\n // requires Ollama to be installed. When a model is already configured we mirror it\n // into the remaining leaves without forcing an Ollama probe; when it is missing we\n // require Ollama to actually be present rather than writing an unusable default.\n if (needsModel && !isOllamaInstalled()) {\n return unchanged;\n }\n\n const nextSettings = structuredClone(settings);\n const resolvedModel = resolveAutoOllamaModel(nextSettings);\n // `readSettings` always normalizes these nested objects, but this function is\n // exported and runs on the search hot path with caller-supplied settings, so a\n // partial object (e.g. providers/vector_store set but no `search` block) must\n // fill the missing leaf rather than throwing on an undefined parent.\n if (needsBaseUrl || needsModel) {\n const providers = (nextSettings.providers ??= {} as PmSettings[\"providers\"]);\n const ollama = (providers.ollama ??= {} as PmSettings[\"providers\"][\"ollama\"]);\n if (needsBaseUrl) {\n ollama.base_url = DEFAULT_OLLAMA_BASE_URL;\n }\n if (needsModel) {\n ollama.model = resolvedModel;\n }\n }\n if (needsLancedbPath) {\n const vectorStore = (nextSettings.vector_store ??= {} as PmSettings[\"vector_store\"]);\n const lancedb = (vectorStore.lancedb ??= {} as PmSettings[\"vector_store\"][\"lancedb\"]);\n lancedb.path = DEFAULT_LANCEDB_PATH;\n }\n if (needsEmbeddingModel) {\n const search = (nextSettings.search ??= {} as PmSettings[\"search\"]);\n search.embedding_model = resolvedModel;\n }\n return {\n settings: nextSettings,\n auto_ollama_defaults_applied: true,\n };\n}\n", "import type { PmSettings } from \"../../types/index.js\";\nimport { mkdir, readFile, stat, unlink } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n executeSearchJsonRequest,\n normalizeSearchHttpTimeoutMs,\n resolveSearchHttpFetcher,\n} from \"./http-client.js\";\nimport type { SearchHttpFetcher, SearchHttpResponse } from \"./http-client.js\";\nimport {\n isFiniteNumberArray,\n toErrorMessage,\n toNonEmptyString,\n trimTrailingSlashes,\n} from \"../shared/primitives.js\";\nimport { writeFileAtomic } from \"../fs/fs-utils.js\";\n\nexport type VectorStoreName = \"qdrant\" | \"lancedb\";\n\nexport interface QdrantVectorStoreConfig {\n name: \"qdrant\";\n url: string;\n collection_name?: string;\n api_key?: string;\n}\n\nexport interface LanceDbVectorStoreConfig {\n name: \"lancedb\";\n path: string;\n collection_name?: string;\n}\n\nexport type VectorStoreConfig = QdrantVectorStoreConfig | LanceDbVectorStoreConfig;\n\nexport interface VectorStoreResolution {\n active: VectorStoreConfig | null;\n available: VectorStoreConfig[];\n}\n\nexport interface VectorStoreRequestTarget {\n store: VectorStoreName;\n query_target: string;\n upsert_target: string;\n}\n\nexport interface VectorQueryPlan {\n target: VectorStoreRequestTarget;\n method: \"POST\" | \"LOCAL\";\n headers: Record<string, string>;\n body: Record<string, unknown>;\n}\n\nexport interface VectorRecord {\n id: string;\n vector: number[];\n payload?: Record<string, unknown>;\n}\n\nexport interface VectorUpsertPlan {\n target: VectorStoreRequestTarget;\n method: \"POST\" | \"LOCAL\";\n headers: Record<string, string>;\n body: Record<string, unknown>;\n}\n\nexport interface VectorDeletePlan {\n target: VectorStoreRequestTarget;\n method: \"POST\" | \"LOCAL\";\n headers: Record<string, string>;\n body: Record<string, unknown>;\n}\n\nexport interface VectorQueryHit {\n id: string;\n score: number;\n payload?: Record<string, unknown>;\n}\n\nexport interface VectorUpsertResult {\n status: string;\n}\n\nexport type VectorHttpResponse = SearchHttpResponse;\n\nexport type VectorRequestFetcher = SearchHttpFetcher<VectorHttpResponse>;\n\nexport interface ExecuteVectorRequestOptions {\n timeout_ms?: number;\n fetcher?: VectorRequestFetcher;\n warnings?: string[];\n}\n\ntype VectorSettingsInput = {\n vector_store?: {\n collection_name?: string;\n qdrant?: {\n url?: string;\n api_key?: string;\n };\n lancedb?: {\n path?: string;\n };\n };\n};\n\ntype RemoteVectorMethod = \"DELETE\" | \"POST\" | \"PUT\";\n\nconst DEFAULT_COLLECTION = \"pm_items\";\nconst COLLECTION_SANITIZE_PATTERN = /[^a-zA-Z0-9_-]/g;\nconst MAX_COLLECTION_NAME_LENGTH = 128;\nconst LANCE_DB_LOCAL_SNAPSHOT_DIR = \".pm-cli-local-vectors\";\nconst LANCE_DB_LOCAL_SNAPSHOT_VERSION = 1;\ninterface LanceDbLocalTableCacheEntry {\n records: Map<string, VectorRecord>;\n mtimeMs: number | null;\n size: number | null;\n}\n\nconst lanceDbLocalTables = new Map<string, LanceDbLocalTableCacheEntry>();\n\nfunction resolveStoreCollectionName(store: VectorStoreConfig): string {\n const candidate = toNonEmptyString(store.collection_name) ?? DEFAULT_COLLECTION;\n return candidate.replaceAll(COLLECTION_SANITIZE_PATTERN, \"_\").slice(0, MAX_COLLECTION_NAME_LENGTH);\n}\n\nfunction normalizeVector(value: unknown): number[] {\n if (!isFiniteNumberArray(value) || value.length === 0) {\n throw new Error(\"Vector values must be a non-empty numeric array\");\n }\n return [...value];\n}\n\nfunction normalizeLimit(value: number): number {\n if (!Number.isFinite(value) || value <= 0) {\n throw new Error(\"Vector query limit must be a positive number\");\n }\n return Math.floor(value);\n}\n\nfunction normalizeQdrantQueryResponse(payload: unknown): VectorQueryHit[] {\n const result = (payload as { result?: unknown }).result;\n if (!Array.isArray(result)) {\n throw new TypeError(\"Qdrant query response must include a result array\");\n }\n const hits = result.map((entry, index) => {\n const idValue = (entry as { id?: unknown }).id;\n const idCandidate = typeof idValue === \"number\" ? String(idValue) : idValue;\n const id = toNonEmptyString(idCandidate);\n if (!id) {\n throw new Error(`Qdrant query response entry at index ${index} is missing a non-empty id`);\n }\n\n const score = (entry as { score?: unknown }).score;\n if (typeof score !== \"number\" || !Number.isFinite(score)) {\n throw new TypeError(`Qdrant query response entry at index ${index} is missing a finite numeric score`);\n }\n\n const payloadValue = (entry as { payload?: unknown }).payload;\n if (\n payloadValue !== undefined &&\n (typeof payloadValue !== \"object\" || payloadValue === null || Array.isArray(payloadValue))\n ) {\n throw new Error(`Qdrant query response entry at index ${index} must provide payload as an object when set`);\n }\n\n return {\n id,\n score,\n ...(payloadValue ? { payload: payloadValue as Record<string, unknown> } : {}),\n };\n });\n hits.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 hits;\n}\n\nfunction normalizeQdrantUpsertResponse(payload: unknown): VectorUpsertResult {\n const nestedStatus = toNonEmptyString((payload as { result?: { status?: unknown } }).result?.status);\n if (nestedStatus) {\n return { status: nestedStatus };\n }\n const topLevelStatus = toNonEmptyString((payload as { status?: unknown }).status);\n if (topLevelStatus) {\n return { status: topLevelStatus };\n }\n throw new Error(\"Qdrant upsert response must include status metadata\");\n}\n\nasync function executeRemoteVectorPlan(\n endpoint: string,\n plan: {\n method: RemoteVectorMethod;\n headers: Record<string, string>;\n body: Record<string, unknown>;\n },\n timeoutMs: number,\n fetcher: VectorRequestFetcher,\n requestKind: \"query\" | \"upsert\" | \"delete\",\n): Promise<unknown> {\n return await executeSearchJsonRequest({\n endpoint,\n method: plan.method,\n headers: plan.headers,\n body: plan.body,\n timeoutMs,\n fetcher,\n requestLabel: `Vector ${requestKind} request`,\n responseLabel: `Vector ${requestKind} response`,\n });\n}\n\nfunction resolveQdrantStore(settings: VectorSettingsInput): QdrantVectorStoreConfig | null {\n const url = toNonEmptyString(settings.vector_store?.qdrant?.url);\n if (!url) {\n return null;\n }\n const collectionName = toNonEmptyString(settings.vector_store?.collection_name);\n const apiKey = toNonEmptyString(settings.vector_store?.qdrant?.api_key);\n return {\n name: \"qdrant\",\n url,\n ...(collectionName && collectionName !== DEFAULT_COLLECTION ? { collection_name: collectionName } : {}),\n ...(apiKey ? { api_key: apiKey } : {}),\n };\n}\n\nfunction resolveLanceDbStore(settings: VectorSettingsInput): LanceDbVectorStoreConfig | null {\n const lancedbPath = toNonEmptyString(settings.vector_store?.lancedb?.path);\n if (!lancedbPath) {\n return null;\n }\n const collectionName = toNonEmptyString(settings.vector_store?.collection_name);\n return {\n name: \"lancedb\",\n path: lancedbPath,\n ...(collectionName && collectionName !== DEFAULT_COLLECTION ? { collection_name: collectionName } : {}),\n };\n}\n\nfunction normalizeVectorRecords(records: VectorRecord[]): VectorRecord[] {\n if (!Array.isArray(records) || records.length === 0) {\n throw new Error(\"Vector upsert records must include at least one entry\");\n }\n return records.map((record, index) => {\n const id = toNonEmptyString(record.id);\n if (!id) {\n throw new Error(`Vector upsert record at index ${index} is missing a non-empty id`);\n }\n const vector = normalizeVector(record.vector);\n const payload = record.payload;\n if (payload !== undefined && (typeof payload !== \"object\" || payload === null || Array.isArray(payload))) {\n throw new Error(`Vector upsert record at index ${index} must provide payload as an object when set`);\n }\n return {\n id,\n vector,\n ...(payload ? { payload } : {}),\n };\n });\n}\n\nfunction normalizeVectorDeleteIds(ids: string[]): string[] {\n if (!Array.isArray(ids) || ids.length === 0) {\n throw new Error(\"Vector delete ids must include at least one entry\");\n }\n const normalizedIds = ids\n .map((id, index) => {\n const normalized = toNonEmptyString(id);\n if (!normalized) {\n throw new Error(`Vector delete id at index ${index} is missing a non-empty value`);\n }\n return normalized;\n })\n .sort((left, right) => left.localeCompare(right));\n const uniqueIds: string[] = [];\n for (const id of normalizedIds) {\n if (uniqueIds.at(-1) !== id) {\n uniqueIds.push(id);\n }\n }\n return uniqueIds;\n}\n\nfunction resolveQdrantDeleteTarget(upsertTarget: string): string {\n return upsertTarget.replace(/\\/points\\?wait=true$/, \"/points/delete?wait=true\");\n}\n\nfunction resolveQdrantCollectionTarget(upsertTarget: string): string {\n return upsertTarget.replace(/\\/points\\?wait=true$/, \"\");\n}\n\nfunction buildQdrantJsonHeaders(store: QdrantVectorStoreConfig): Record<string, string> {\n return {\n \"content-type\": \"application/json\",\n ...(store.api_key ? { \"api-key\": store.api_key } : {}),\n };\n}\n\nfunction getLanceDbLocalTableKey(storePath: string, table: string): string {\n return getLanceDbSnapshotPath(storePath, table);\n}\n\nfunction getLanceDbSnapshotPath(storePath: string, table: string): string {\n return join(resolve(storePath), LANCE_DB_LOCAL_SNAPSHOT_DIR, `${table}.json`);\n}\n\nfunction isNodeErrorWithCode(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && (error as { code?: unknown }).code === code;\n}\n\nfunction normalizeSnapshotRecord(entry: unknown, index: number, snapshotPath: string): VectorRecord {\n const id = toNonEmptyString((entry as { id?: unknown }).id);\n if (!id) {\n throw new Error(`LanceDB local snapshot '${snapshotPath}' record at index ${index} is missing a non-empty id`);\n }\n const vector = normalizeVector((entry as { vector?: unknown }).vector);\n const payload = (entry as { payload?: unknown }).payload;\n if (payload !== undefined && (typeof payload !== \"object\" || payload === null || Array.isArray(payload))) {\n throw new Error(\n `LanceDB local snapshot '${snapshotPath}' record '${id}' must provide payload as an object when set`,\n );\n }\n return {\n id,\n vector,\n ...(payload ? { payload: payload as Record<string, unknown> } : {}),\n };\n}\n\nfunction parseLanceDbSnapshot(snapshotPath: string, expectedTable: string, raw: string): Map<string, VectorRecord> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch (error) {\n throw new Error(`LanceDB local snapshot at '${snapshotPath}' is not valid JSON: ${toErrorMessage(error)}`);\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(`LanceDB local snapshot at '${snapshotPath}' must be a JSON object`);\n }\n\n const version = (parsed as { version?: unknown }).version;\n if (version !== LANCE_DB_LOCAL_SNAPSHOT_VERSION) {\n throw new Error(\n `LanceDB local snapshot at '${snapshotPath}' must include version=${LANCE_DB_LOCAL_SNAPSHOT_VERSION}`,\n );\n }\n\n const table = toNonEmptyString((parsed as { table?: unknown }).table);\n if (!table) {\n throw new Error(`LanceDB local snapshot at '${snapshotPath}' must include a non-empty table value`);\n }\n if (table !== expectedTable) {\n throw new Error(\n `LanceDB local snapshot at '${snapshotPath}' table mismatch: expected '${expectedTable}', received '${table}'`,\n );\n }\n\n const recordsValue = (parsed as { records?: unknown }).records;\n if (!Array.isArray(recordsValue)) {\n throw new TypeError(`LanceDB local snapshot at '${snapshotPath}' must include a records array`);\n }\n\n const tableRecords = new Map<string, VectorRecord>();\n for (let index = 0; index < recordsValue.length; index += 1) {\n const record = normalizeSnapshotRecord(recordsValue[index], index, snapshotPath);\n tableRecords.set(record.id, record);\n }\n return tableRecords;\n}\n\nasync function loadLanceDbLocalTable(storePath: string, table: string): Promise<Map<string, VectorRecord>> {\n const key = getLanceDbLocalTableKey(storePath, table);\n const snapshotPath = getLanceDbSnapshotPath(storePath, table);\n let snapshotStats: { mtimeMs: number; size: number } | null = null;\n try {\n const stats = await stat(snapshotPath);\n snapshotStats = { mtimeMs: stats.mtimeMs, size: stats.size };\n } catch (error) {\n if (!isNodeErrorWithCode(error, \"ENOENT\")) {\n throw error;\n }\n }\n\n const cached = lanceDbLocalTables.get(key);\n if (cached && !snapshotStats) {\n if (cached.mtimeMs === null && cached.size === null && cached.records.size === 0) {\n return cached.records;\n }\n const loaded = new Map<string, VectorRecord>();\n lanceDbLocalTables.set(key, { records: loaded, mtimeMs: null, size: null });\n return loaded;\n }\n if (\n cached &&\n snapshotStats &&\n cached.mtimeMs === snapshotStats.mtimeMs &&\n cached.size === snapshotStats.size\n ) {\n return cached.records;\n }\n\n let loaded = new Map<string, VectorRecord>();\n try {\n const raw = await readFile(snapshotPath, \"utf8\");\n loaded = parseLanceDbSnapshot(snapshotPath, table, raw);\n } catch (error) {\n if (!isNodeErrorWithCode(error, \"ENOENT\")) {\n throw error;\n }\n }\n lanceDbLocalTables.set(key, {\n records: loaded,\n mtimeMs: snapshotStats?.mtimeMs ?? null,\n size: snapshotStats?.size ?? null,\n });\n return loaded;\n}\n\nfunction buildSnapshotRecords(table: Map<string, VectorRecord>): VectorRecord[] {\n const records = [...table.values()];\n records.sort((left, right) => left.id.localeCompare(right.id));\n return records.map((record) => ({\n id: record.id,\n vector: [...record.vector],\n ...(record.payload ? { payload: record.payload } : {}),\n }));\n}\n\nasync function removeSnapshotFile(snapshotPath: string): Promise<void> {\n try {\n await unlink(snapshotPath);\n } catch (error) {\n if (!isNodeErrorWithCode(error, \"ENOENT\")) {\n throw new Error(`LanceDB local snapshot delete failed at '${snapshotPath}': ${toErrorMessage(error)}`);\n }\n }\n}\n\nasync function persistLanceDbLocalTable(storePath: string, tableName: string, table: Map<string, VectorRecord>): Promise<void> {\n const snapshotPath = getLanceDbSnapshotPath(storePath, tableName);\n if (table.size === 0) {\n await removeSnapshotFile(snapshotPath);\n return;\n }\n\n const snapshotDir = dirname(snapshotPath);\n try {\n await mkdir(snapshotDir, { recursive: true });\n } catch (error) {\n throw new Error(\n `LanceDB local snapshot directory create failed at '${snapshotDir}': ${toErrorMessage(error)}`,\n );\n }\n\n // Serialize compactly: the snapshot is an internal, gitignored cache re-read via\n // JSON.parse (whitespace-agnostic). Pretty-printing put every embedding float on its\n // own indented line, roughly doubling file size and parse/serialize cost — a real\n // per-mutation latency tax on large indexes. Compact JSON keeps it instant.\n const serialized = `${JSON.stringify({\n version: LANCE_DB_LOCAL_SNAPSHOT_VERSION,\n table: tableName,\n records: buildSnapshotRecords(table),\n })}\\n`;\n try {\n await writeFileAtomic(snapshotPath, serialized);\n } catch (error) {\n throw new Error(`LanceDB local snapshot write failed at '${snapshotPath}': ${toErrorMessage(error)}`);\n }\n}\n\nasync function resetLanceDbLocalTable(storePath: string, tableName: string): Promise<void> {\n const key = getLanceDbLocalTableKey(storePath, tableName);\n const snapshotPath = getLanceDbSnapshotPath(storePath, tableName);\n await removeSnapshotFile(snapshotPath);\n lanceDbLocalTables.delete(key);\n}\n\nfunction l2Norm(vector: number[]): number {\n let sumSq = 0;\n for (let index = 0; index < vector.length; index += 1) {\n sumSq += vector[index] * vector[index];\n }\n return Math.sqrt(sumSq);\n}\n\nfunction cosineSimilarity(left: number[], right: number[]): number {\n let dotProd = 0;\n for (let index = 0; index < left.length; index += 1) {\n dotProd += left[index] * right[index];\n }\n const leftNorm = l2Norm(left);\n const rightNorm = l2Norm(right);\n if (leftNorm === 0 || rightNorm === 0) {\n return 0;\n }\n return dotProd / (leftNorm * rightNorm);\n}\n\nexport function resolveVectorStores(settings: PmSettings | VectorSettingsInput): VectorStoreResolution {\n const qdrant = resolveQdrantStore(settings);\n const lancedb = resolveLanceDbStore(settings);\n const available = [qdrant, lancedb].filter((entry): entry is VectorStoreConfig => entry !== null);\n // Honor `settings.vector_store.adapter` when set: if both built-in stores\n // are configured, the preferred adapter wins; otherwise fall back to the\n // first available entry (preserves the previous tie-break: qdrant > lancedb).\n // Match case-insensitively so \"Qdrant\" / \"LanceDB\" / \"lancedb\" all work.\n const preferredName = toNonEmptyString(\n (settings as { vector_store?: { adapter?: unknown } }).vector_store?.adapter,\n );\n const preferredKey = preferredName ? preferredName.toLowerCase() : null;\n const preferred = preferredKey\n ? available.find((entry) => entry.name === preferredKey)\n : undefined;\n return {\n active: preferred ?? available[0] ?? null,\n available,\n };\n}\n\nexport function resolveVectorStoreRequestTarget(store: VectorStoreConfig): VectorStoreRequestTarget {\n const collectionName = resolveStoreCollectionName(store);\n if (store.name === \"qdrant\") {\n const baseUrl = trimTrailingSlashes(store.url);\n const encodedCollection = encodeURIComponent(collectionName);\n return {\n store: \"qdrant\",\n query_target: `${baseUrl}/collections/${encodedCollection}/points/search`,\n upsert_target: `${baseUrl}/collections/${encodedCollection}/points?wait=true`,\n };\n }\n const encodedPath = encodeURIComponent(store.path);\n const encodedCollection = encodeURIComponent(collectionName);\n return {\n store: \"lancedb\",\n query_target: `lancedb://${encodedPath}#${encodedCollection}`,\n upsert_target: `lancedb://${encodedPath}#${encodedCollection}`,\n };\n}\n\nexport function buildVectorQueryPlan(store: VectorStoreConfig, vector: number[], limit: number): VectorQueryPlan {\n const target = resolveVectorStoreRequestTarget(store);\n const normalizedVector = normalizeVector(vector);\n const normalizedLimit = normalizeLimit(limit);\n if (store.name === \"qdrant\") {\n return {\n target,\n method: \"POST\",\n headers: buildQdrantJsonHeaders(store),\n body: {\n vector: normalizedVector,\n limit: normalizedLimit,\n with_payload: true,\n },\n };\n }\n return {\n target,\n method: \"LOCAL\",\n headers: {},\n body: {\n table: resolveStoreCollectionName(store),\n vector: normalizedVector,\n limit: normalizedLimit,\n },\n };\n}\n\nexport function buildVectorUpsertPlan(store: VectorStoreConfig, records: VectorRecord[]): VectorUpsertPlan {\n const target = resolveVectorStoreRequestTarget(store);\n const normalizedRecords = normalizeVectorRecords(records);\n if (store.name === \"qdrant\") {\n return {\n target,\n method: \"POST\",\n headers: buildQdrantJsonHeaders(store),\n body: {\n points: normalizedRecords,\n },\n };\n }\n return {\n target,\n method: \"LOCAL\",\n headers: {},\n body: {\n table: resolveStoreCollectionName(store),\n records: normalizedRecords,\n },\n };\n}\n\nexport function buildVectorDeletePlan(store: VectorStoreConfig, ids: string[]): VectorDeletePlan {\n const target = resolveVectorStoreRequestTarget(store);\n const normalizedIds = normalizeVectorDeleteIds(ids);\n if (store.name === \"qdrant\") {\n return {\n target,\n method: \"POST\",\n headers: buildQdrantJsonHeaders(store),\n body: {\n points: normalizedIds,\n },\n };\n }\n return {\n target,\n method: \"LOCAL\",\n headers: {},\n body: {\n table: resolveStoreCollectionName(store),\n ids: normalizedIds,\n },\n };\n}\n\nexport async function executeVectorQuery(\n store: VectorStoreConfig,\n vector: number[],\n limit: number,\n options: ExecuteVectorRequestOptions = {},\n): Promise<VectorQueryHit[]> {\n const plan = buildVectorQueryPlan(store, vector, limit);\n if (plan.method === \"LOCAL\") {\n const lanceDbStore = store as LanceDbVectorStoreConfig;\n const queryBody = plan.body as {\n table: string;\n vector: number[];\n limit: number;\n };\n const table = await loadLanceDbLocalTable(lanceDbStore.path, queryBody.table);\n if (table.size === 0) {\n return [];\n }\n const queryVector = normalizeVector(queryBody.vector);\n const queryLimit = normalizeLimit(queryBody.limit);\n const hits: VectorQueryHit[] = [];\n let dimensionMismatchCount = 0;\n for (const record of table.values()) {\n if (record.vector.length !== queryVector.length) {\n dimensionMismatchCount++;\n continue;\n }\n hits.push({\n id: record.id,\n score: cosineSimilarity(queryVector, record.vector),\n ...(record.payload ? { payload: record.payload } : {}),\n });\n }\n if (dimensionMismatchCount > 0 && options.warnings) {\n options.warnings.push(\n `vector_dimension_mismatch:${dimensionMismatchCount} records skipped (expected ${queryVector.length} dimensions)`,\n );\n }\n hits.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 hits.slice(0, queryLimit);\n }\n const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, \"Vector request\");\n const fetcher = resolveSearchHttpFetcher(options.fetcher, \"Vector request\");\n const payload = await executeRemoteVectorPlan(\n plan.target.query_target,\n {\n method: \"POST\",\n headers: plan.headers,\n body: plan.body,\n },\n timeoutMs,\n fetcher,\n \"query\",\n );\n return normalizeQdrantQueryResponse(payload);\n}\n\nexport async function executeVectorUpsert(\n store: VectorStoreConfig,\n records: VectorRecord[],\n options: ExecuteVectorRequestOptions = {},\n): Promise<VectorUpsertResult> {\n const plan = buildVectorUpsertPlan(store, records);\n if (plan.method === \"LOCAL\") {\n const lanceDbStore = store as LanceDbVectorStoreConfig;\n const upsertBody = plan.body as {\n table: string;\n records: VectorRecord[];\n };\n const key = getLanceDbLocalTableKey(lanceDbStore.path, upsertBody.table);\n const table = await loadLanceDbLocalTable(lanceDbStore.path, upsertBody.table);\n for (const record of upsertBody.records) {\n table.set(record.id, record);\n }\n await persistLanceDbLocalTable(lanceDbStore.path, upsertBody.table, table);\n const snapshotPath = getLanceDbSnapshotPath(lanceDbStore.path, upsertBody.table);\n const snapshotStats = await stat(snapshotPath);\n lanceDbLocalTables.set(key, {\n records: table,\n mtimeMs: snapshotStats.mtimeMs,\n size: snapshotStats.size,\n });\n return { status: \"ok\" };\n }\n const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, \"Vector request\");\n const fetcher = resolveSearchHttpFetcher(options.fetcher, \"Vector request\");\n const payload = await executeRemoteVectorPlan(\n plan.target.upsert_target,\n {\n method: \"POST\",\n headers: plan.headers,\n body: plan.body,\n },\n timeoutMs,\n fetcher,\n \"upsert\",\n );\n return normalizeQdrantUpsertResponse(payload);\n}\n\nexport async function executeVectorDelete(\n store: VectorStoreConfig,\n ids: string[],\n options: ExecuteVectorRequestOptions = {},\n): Promise<VectorUpsertResult> {\n const plan = buildVectorDeletePlan(store, ids);\n if (plan.method === \"LOCAL\") {\n const lanceDbStore = store as LanceDbVectorStoreConfig;\n const deleteBody = plan.body as {\n table: string;\n ids: string[];\n };\n const key = getLanceDbLocalTableKey(lanceDbStore.path, deleteBody.table);\n const table = await loadLanceDbLocalTable(lanceDbStore.path, deleteBody.table);\n if (table.size === 0) {\n return { status: \"ok\" };\n }\n for (const id of deleteBody.ids) {\n table.delete(id);\n }\n await persistLanceDbLocalTable(lanceDbStore.path, deleteBody.table, table);\n if (table.size === 0) {\n lanceDbLocalTables.delete(key);\n } else {\n const snapshotPath = getLanceDbSnapshotPath(lanceDbStore.path, deleteBody.table);\n const snapshotStats = await stat(snapshotPath);\n lanceDbLocalTables.set(key, {\n records: table,\n mtimeMs: snapshotStats.mtimeMs,\n size: snapshotStats.size,\n });\n }\n return { status: \"ok\" };\n }\n const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, \"Vector request\");\n const fetcher = resolveSearchHttpFetcher(options.fetcher, \"Vector request\");\n const payload = await executeRemoteVectorPlan(\n resolveQdrantDeleteTarget(plan.target.upsert_target),\n {\n method: \"POST\",\n headers: plan.headers,\n body: plan.body,\n },\n timeoutMs,\n fetcher,\n \"delete\",\n );\n return normalizeQdrantUpsertResponse(payload);\n}\n\nexport async function executeVectorReset(\n store: VectorStoreConfig,\n knownIds: string[] = [],\n options: ExecuteVectorRequestOptions = {},\n vectorDimension?: number,\n): Promise<VectorUpsertResult> {\n if (store.name === \"lancedb\") {\n await resetLanceDbLocalTable(store.path, resolveStoreCollectionName(store));\n return { status: \"ok\" };\n }\n if (vectorDimension !== undefined) {\n if (!Number.isInteger(vectorDimension) || vectorDimension <= 0) {\n throw new Error(\"Vector reset dimension must be a positive integer when provided\");\n }\n const target = resolveVectorStoreRequestTarget(store);\n const collectionTarget = resolveQdrantCollectionTarget(target.upsert_target);\n const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, \"Vector request\");\n const fetcher = resolveSearchHttpFetcher(options.fetcher, \"Vector request\");\n const headers = buildQdrantJsonHeaders(store);\n try {\n await executeRemoteVectorPlan(\n collectionTarget,\n {\n method: \"DELETE\",\n headers,\n body: {},\n },\n timeoutMs,\n fetcher,\n \"delete\",\n );\n } catch (error: unknown) {\n if (!toErrorMessage(error).includes(\"failed with status 404\")) {\n throw error;\n }\n }\n const payload = await executeRemoteVectorPlan(\n collectionTarget,\n {\n method: \"PUT\",\n headers,\n body: {\n vectors: {\n size: vectorDimension,\n distance: \"Cosine\",\n },\n },\n },\n timeoutMs,\n fetcher,\n \"upsert\",\n );\n return normalizeQdrantUpsertResponse(payload);\n }\n const idsToDelete = knownIds.map((id) => id.trim()).filter((id) => id.length > 0);\n if (idsToDelete.length === 0) {\n return { status: \"ok\" };\n }\n return await executeVectorDelete(store, idsToDelete, options);\n}\n", "import { toNonEmptyString } from \"../shared/primitives.js\";\n\nexport interface VectorizationEmbeddingIdentity {\n provider: string;\n model: string;\n}\n\nexport interface VectorizationEmbeddingMetadata extends VectorizationEmbeddingIdentity {\n vector_dimension: number;\n}\n\nexport function buildVectorizationEmbeddingIdentity(\n provider: unknown,\n model: unknown,\n): VectorizationEmbeddingIdentity | null {\n const normalizedProvider = toNonEmptyString(provider);\n const normalizedModel = toNonEmptyString(model);\n if (!normalizedProvider || !normalizedModel) {\n return null;\n }\n return {\n provider: normalizedProvider,\n model: normalizedModel,\n };\n}\n\nexport function normalizeVectorizationEmbeddingMetadata(value: unknown): VectorizationEmbeddingMetadata | null {\n if (value === undefined || value === null) {\n return null;\n }\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Vectorization embedding metadata must be an object when set\");\n }\n const identity = buildVectorizationEmbeddingIdentity(\n (value as { provider?: unknown }).provider,\n (value as { model?: unknown }).model,\n );\n const vectorDimension = (value as { vector_dimension?: unknown }).vector_dimension;\n if (!identity || typeof vectorDimension !== \"number\" || !Number.isInteger(vectorDimension) || vectorDimension <= 0) {\n throw new Error(\"Vectorization embedding metadata must include provider, model, and positive vector_dimension\");\n }\n return {\n ...identity,\n vector_dimension: vectorDimension,\n };\n}\n\nexport function buildVectorizationEmbeddingMetadata(\n identity: VectorizationEmbeddingIdentity,\n vectorDimension: number,\n): VectorizationEmbeddingMetadata {\n if (!Number.isInteger(vectorDimension) || vectorDimension <= 0) {\n throw new Error(\"Vectorization embedding metadata requires a positive vector dimension\");\n }\n return {\n provider: identity.provider,\n model: identity.model,\n vector_dimension: vectorDimension,\n };\n}\n\nexport function hasVectorizationEmbeddingIdentityChanged(\n metadata: VectorizationEmbeddingMetadata | null | undefined,\n identity: VectorizationEmbeddingIdentity,\n): boolean {\n return !metadata || metadata.provider !== identity.provider || metadata.model !== identity.model;\n}\n\nexport function hasVectorizationVectorDimensionChanged(\n metadata: VectorizationEmbeddingMetadata | null | undefined,\n vectorDimension: number,\n): boolean {\n return Boolean(metadata && metadata.vector_dimension !== vectorDimension);\n}\n\nexport function inferConsistentVectorDimension(vectors: readonly number[][], context: string): number {\n if (vectors.length === 0) {\n throw new Error(`${context} returned no vectors`);\n }\n const firstVector = vectors[0] as number[];\n const dimension = firstVector.length;\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error(`${context} returned an empty vector`);\n }\n for (let index = 1; index < vectors.length; index += 1) {\n if (vectors[index]?.length !== dimension) {\n throw new Error(`${context} returned mixed vector dimensions`);\n }\n }\n return dimension;\n}\n", "import path from \"node:path\";\nimport { getActiveExtensionRegistrations } from \"../extensions/index.js\";\nimport { pathExists, readFileIfExists, removeFileIfExists, writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../item/type-registry.js\";\nimport { toErrorMessage } from \"../shared/primitives.js\";\nimport { locateItem, readLocatedItem } from \"../store/item-store.js\";\nimport { getSettingsPath } from \"../store/paths.js\";\nimport { readSettings } from \"../store/settings.js\";\nimport { executeEmbeddingBatchesWithRetry } from \"./embedding-batches.js\";\nimport {\n buildSemanticCorpusInput,\n resolveSemanticCorpusCharacterLimit,\n} from \"./corpus.js\";\nimport { resolveEmbeddingProviders } from \"./providers.js\";\nimport type { EmbeddingProviderConfig } from \"./providers.js\";\nimport { resolveSettingsWithSemanticRuntimeDefaults } from \"./semantic-defaults.js\";\nimport { scheduleBackgroundSemanticRefresh } from \"./background-refresh.js\";\nimport { executeVectorDelete, executeVectorReset, executeVectorUpsert, resolveVectorStores } from \"./vector-stores.js\";\nimport type { VectorStoreConfig } from \"./vector-stores.js\";\nimport {\n buildVectorizationEmbeddingIdentity,\n buildVectorizationEmbeddingMetadata,\n hasVectorizationEmbeddingIdentityChanged,\n hasVectorizationVectorDimensionChanged,\n inferConsistentVectorDimension,\n normalizeVectorizationEmbeddingMetadata,\n} from \"./vectorization-metadata.js\";\nimport type {\n VectorizationEmbeddingIdentity,\n VectorizationEmbeddingMetadata,\n} from \"./vectorization-metadata.js\";\nimport { nowIso } from \"../shared/time.js\";\nimport type { ItemDocument, ItemFrontMatter } from \"../../types/index.js\";\n\nexport const SEARCH_CACHE_ARTIFACT_PATHS = [\"index/manifest.json\", \"search/embeddings.jsonl\"] as const;\nexport const VECTORIZATION_STATUS_LEDGER_PATH = \"search/vectorization-status.json\";\n\nexport interface SearchCacheInvalidationResult {\n invalidated: string[];\n warnings: string[];\n}\n\nexport interface SemanticMutationRefreshResult {\n refreshed: string[];\n skipped: string[];\n warnings: string[];\n}\n\nexport interface SearchMutationArtifactRefreshResult extends SearchCacheInvalidationResult {\n refreshed: string[];\n skipped: string[];\n /** True when the semantic refresh was dispatched to a detached background worker. */\n scheduled?: boolean;\n}\n\nexport interface RefreshSearchArtifactsForMutationOptions {\n /**\n * When true and semantic search is active, the (slow) embedding refresh is\n * dispatched to a detached background worker instead of awaited inline so the\n * mutation returns immediately. The synchronous keyword-cache invalidation\n * still runs first. Callers pass this only outside test runners.\n */\n background?: boolean;\n}\n\nexport interface SemanticRefreshOptions {\n settings?: Awaited<ReturnType<typeof readSettings>>;\n apply_runtime_defaults?: boolean;\n}\n\nexport interface VectorizationStatusLedgerReadResult {\n entries: Record<string, string>;\n embedding: VectorizationEmbeddingMetadata | null;\n warnings: string[];\n}\n\nfunction formatInvalidationWarning(relativePath: string, error: unknown): string {\n return `search_cache_invalidation_failed:${relativePath}:${String(error)}`;\n}\n\n\nfunction toUniqueSorted(values: Iterable<string>): string[] {\n return [...new Set([...values].map((value) => value.trim()).filter((value) => value.length > 0))]\n .sort((left, right) => left.localeCompare(right));\n}\n\nfunction isValidUpdatedAt(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0 && Number.isFinite(Date.parse(value));\n}\n\nfunction normalizeVectorizationLedgerEntries(entries: Record<string, string>): Record<string, string> {\n const normalized = new Map<string, string>();\n for (const [rawId, rawUpdatedAt] of Object.entries(entries)) {\n const id = rawId.trim();\n if (id.length === 0 || !isValidUpdatedAt(rawUpdatedAt)) {\n continue;\n }\n normalized.set(id, rawUpdatedAt);\n }\n return Object.fromEntries([...normalized.entries()].sort((left, right) => left[0].localeCompare(right[0])));\n}\n\nexport async function readVectorizationStatusLedger(pmRoot: string): Promise<VectorizationStatusLedgerReadResult> {\n const ledgerPath = path.join(pmRoot, VECTORIZATION_STATUS_LEDGER_PATH);\n const raw = await readFileIfExists(ledgerPath);\n if (raw === null || raw.trim().length === 0) {\n return {\n entries: {},\n embedding: null,\n warnings: [],\n };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n return {\n entries: {},\n embedding: null,\n warnings: [\"search_vectorization_status_ledger_invalid\"],\n };\n }\n\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n (parsed as { version?: unknown }).version !== 1 ||\n !Array.isArray((parsed as { items?: unknown }).items)\n ) {\n return {\n entries: {},\n embedding: null,\n warnings: [\"search_vectorization_status_ledger_invalid\"],\n };\n }\n\n const mapped = new Map<string, string>();\n for (const entry of (parsed as { items: unknown[] }).items) {\n if (typeof entry !== \"object\" || entry === null) {\n return {\n entries: {},\n embedding: null,\n warnings: [\"search_vectorization_status_ledger_invalid\"],\n };\n }\n const id = (entry as { id?: unknown }).id;\n const updatedAt = (entry as { updated_at?: unknown }).updated_at;\n if (typeof id !== \"string\" || id.trim().length === 0 || !isValidUpdatedAt(updatedAt)) {\n return {\n entries: {},\n embedding: null,\n warnings: [\"search_vectorization_status_ledger_invalid\"],\n };\n }\n mapped.set(id.trim(), updatedAt);\n }\n\n let embedding: VectorizationEmbeddingMetadata | null = null;\n try {\n embedding = normalizeVectorizationEmbeddingMetadata((parsed as { embedding?: unknown }).embedding);\n } catch {\n return {\n entries: {},\n embedding: null,\n warnings: [\"search_vectorization_status_ledger_invalid\"],\n };\n }\n\n return {\n entries: Object.fromEntries([...mapped.entries()].sort((left, right) => left[0].localeCompare(right[0]))),\n embedding,\n warnings: [],\n };\n}\n\nexport async function writeVectorizationStatusLedger(\n pmRoot: string,\n entries: Record<string, string>,\n embedding?: VectorizationEmbeddingMetadata | null,\n): Promise<void> {\n const normalizedEntries = normalizeVectorizationLedgerEntries(entries);\n const ledgerPath = path.join(pmRoot, VECTORIZATION_STATUS_LEDGER_PATH);\n const serialized = `${JSON.stringify(\n {\n version: 1,\n generated_at: nowIso(),\n ...(embedding ? { embedding } : {}),\n items: Object.entries(normalizedEntries).map(([id, updated_at]) => ({\n id,\n updated_at,\n })),\n },\n null,\n 2,\n )}\\n`;\n await writeFileAtomic(ledgerPath, serialized);\n}\n\nfunction buildVectorPayload(item: ItemFrontMatter): Record<string, unknown> {\n return {\n id: item.id,\n type: item.type,\n status: item.status,\n priority: item.priority,\n updated_at: item.updated_at,\n };\n}\n\ninterface SemanticRefreshRuntimeContext {\n settings: Awaited<ReturnType<typeof readSettings>>;\n provider: EmbeddingProviderConfig;\n vectorStore: VectorStoreConfig;\n}\n\ninterface SemanticRefreshWorkload {\n documents: Array<{ id: string; document: ItemDocument }>;\n missingIds: string[];\n skippedIds: string[];\n warnings: string[];\n}\n\ninterface SemanticRefreshOperationResult {\n refreshed: string[];\n skipped: string[];\n warnings: string[];\n}\n\ninterface SemanticEmbeddingOperationResult {\n vectors: number[][];\n vector_dimension: number;\n warnings: string[];\n}\n\nfunction buildVectorizationIdentityForProvider(provider: EmbeddingProviderConfig): VectorizationEmbeddingIdentity {\n const identity = buildVectorizationEmbeddingIdentity(provider.name, provider.model);\n if (!identity) {\n throw new Error(\"Embedding provider must include a provider name and model\");\n }\n return identity;\n}\n\nfunction buildSkippedSemanticRefreshResult(itemIds: string[], warning: string): SemanticMutationRefreshResult {\n return {\n refreshed: [],\n skipped: itemIds,\n warnings: [warning],\n };\n}\n\nasync function resolveSemanticRefreshRuntimeContext(\n pmRoot: string,\n normalizedItemIds: string[],\n options: SemanticRefreshOptions,\n): Promise<SemanticRefreshRuntimeContext | SemanticMutationRefreshResult> {\n if (!options.settings && !(await pathExists(getSettingsPath(pmRoot)))) {\n return buildSkippedSemanticRefreshResult(normalizedItemIds, \"search_semantic_refresh_skipped:settings_not_initialized\");\n }\n\n let settings: Awaited<ReturnType<typeof readSettings>>;\n try {\n settings = options.settings ?? (await readSettings(pmRoot));\n } catch (error: unknown) {\n return buildSkippedSemanticRefreshResult(\n normalizedItemIds,\n `search_semantic_refresh_skipped:settings_read_failed:${toErrorMessage(error)}`,\n );\n }\n const effectiveSettings = options.apply_runtime_defaults\n ? resolveSettingsWithSemanticRuntimeDefaults(settings).settings\n : settings;\n\n const provider = resolveEmbeddingProviders(effectiveSettings).active;\n if (!provider) {\n return buildSkippedSemanticRefreshResult(normalizedItemIds, \"search_semantic_refresh_skipped:provider_unconfigured\");\n }\n const vectorStore = resolveVectorStores(effectiveSettings).active;\n if (!vectorStore) {\n return buildSkippedSemanticRefreshResult(normalizedItemIds, \"search_semantic_refresh_skipped:vector_store_unconfigured\");\n }\n\n return {\n settings: effectiveSettings,\n provider,\n vectorStore,\n };\n}\n\nasync function collectSemanticRefreshWorkload(\n pmRoot: string,\n idPrefix: string,\n preferredFormat: \"toon\" | \"json_markdown\",\n normalizedItemIds: string[],\n typeToFolder: Record<string, string>,\n schema: Awaited<ReturnType<typeof readSettings>>[\"schema\"],\n): Promise<SemanticRefreshWorkload> {\n const warnings: string[] = [];\n const skipped = new Set<string>();\n const missing = new Set<string>();\n const documents: Array<{ id: string; document: ItemDocument }> = [];\n\n for (const itemId of normalizedItemIds) {\n const located = await locateItem(pmRoot, itemId, idPrefix, preferredFormat, typeToFolder);\n if (!located) {\n missing.add(itemId);\n continue;\n }\n\n try {\n const loaded = await readLocatedItem(located, { schema });\n documents.push({\n id: loaded.document.metadata.id,\n document: loaded.document,\n });\n } catch (error: unknown) {\n skipped.add(located.id);\n warnings.push(`search_semantic_refresh_item_read_failed:${located.id}:${toErrorMessage(error)}`);\n }\n }\n\n documents.sort((left, right) => left.id.localeCompare(right.id));\n return {\n documents,\n missingIds: toUniqueSorted(missing),\n skippedIds: toUniqueSorted(skipped),\n warnings,\n };\n}\n\nasync function embedLocatedSemanticVectors(\n settings: Awaited<ReturnType<typeof readSettings>>,\n provider: EmbeddingProviderConfig,\n documents: Array<{ id: string; document: ItemDocument }>,\n): Promise<SemanticEmbeddingOperationResult> {\n const corpusCharacterLimit = resolveSemanticCorpusCharacterLimit(\n provider.name,\n settings.search.embedding_corpus_max_characters,\n ).maxCharacters;\n const corpusInputs = documents.map((entry) =>\n buildSemanticCorpusInput(entry.document, {\n providerName: provider.name,\n maxCharacters: corpusCharacterLimit,\n }),\n );\n const embeddingResult = await executeEmbeddingBatchesWithRetry(provider, settings, corpusInputs);\n return {\n vectors: embeddingResult.vectors,\n vector_dimension: inferConsistentVectorDimension(embeddingResult.vectors, \"Semantic refresh embedding\"),\n warnings: embeddingResult.warnings,\n };\n}\n\nasync function upsertLocatedSemanticVectors(\n vectorStore: VectorStoreConfig,\n documents: Array<{ id: string; document: ItemDocument }>,\n vectors: number[][],\n): Promise<SemanticRefreshOperationResult> {\n await executeVectorUpsert(\n vectorStore,\n documents.map((entry, index) => ({\n id: entry.id,\n vector: vectors[index],\n payload: buildVectorPayload(entry.document.metadata),\n })),\n );\n return {\n refreshed: documents.map((entry) => entry.id),\n skipped: [],\n warnings: [],\n };\n}\n\nasync function resetSemanticVectorStore(\n vectorStore: VectorStoreConfig,\n ledgerEntries: Record<string, string>,\n): Promise<SemanticRefreshOperationResult> {\n try {\n await executeVectorReset(vectorStore, Object.keys(ledgerEntries));\n return { refreshed: [], skipped: [], warnings: [] };\n } catch (error: unknown) {\n return {\n refreshed: [],\n skipped: [],\n warnings: [`search_semantic_refresh_reset_failed:${toErrorMessage(error)}`],\n };\n }\n}\n\nasync function pruneMissingSemanticVectors(\n vectorStore: VectorStoreConfig,\n missingIds: string[],\n): Promise<SemanticRefreshOperationResult> {\n if (missingIds.length === 0) {\n return { refreshed: [], skipped: [], warnings: [] };\n }\n try {\n await executeVectorDelete(vectorStore, missingIds);\n return {\n refreshed: [],\n skipped: [],\n warnings: [],\n };\n } catch (error: unknown) {\n return {\n refreshed: [],\n skipped: missingIds,\n warnings: [`search_semantic_refresh_delete_failed:${toErrorMessage(error)}`],\n };\n }\n}\n\nexport async function invalidateSearchCacheArtifacts(pmRoot: string): Promise<SearchCacheInvalidationResult> {\n const invalidated: string[] = [];\n const warnings: string[] = [];\n\n for (const relativePath of SEARCH_CACHE_ARTIFACT_PATHS) {\n const artifactPath = path.join(pmRoot, relativePath);\n try {\n if (!(await pathExists(artifactPath))) {\n continue;\n }\n await removeFileIfExists(artifactPath);\n invalidated.push(relativePath);\n } catch (error: unknown) {\n warnings.push(formatInvalidationWarning(relativePath, error));\n }\n }\n\n return {\n invalidated,\n warnings,\n };\n}\n\nexport async function refreshSemanticEmbeddingsForMutatedItems(\n pmRoot: string,\n itemIds: string[],\n options: SemanticRefreshOptions = {},\n): Promise<SemanticMutationRefreshResult> {\n const normalizedItemIds = toUniqueSorted(itemIds);\n if (normalizedItemIds.length === 0) {\n return {\n refreshed: [],\n skipped: [],\n warnings: [],\n };\n }\n\n const runtimeContext = await resolveSemanticRefreshRuntimeContext(pmRoot, normalizedItemIds, options);\n if (!(\"settings\" in runtimeContext)) {\n return runtimeContext;\n }\n const typeRegistry = resolveItemTypeRegistry(runtimeContext.settings, getActiveExtensionRegistrations());\n const workload = await collectSemanticRefreshWorkload(\n pmRoot,\n runtimeContext.settings.id_prefix,\n runtimeContext.settings.item_format,\n normalizedItemIds,\n typeRegistry.type_to_folder,\n runtimeContext.settings.schema,\n );\n const ledgerRead =\n workload.documents.length > 0 || workload.missingIds.length > 0\n ? await readVectorizationStatusLedger(pmRoot)\n : { entries: {}, embedding: null, warnings: [] };\n const embeddingIdentity = buildVectorizationIdentityForProvider(runtimeContext.provider);\n const nextLedgerBaseEntries = ledgerRead.entries;\n let refreshedResult: SemanticRefreshOperationResult = { refreshed: [], skipped: [], warnings: [] };\n let nextEmbeddingMetadata = ledgerRead.embedding;\n if (workload.documents.length > 0) {\n if (ledgerRead.embedding && hasVectorizationEmbeddingIdentityChanged(ledgerRead.embedding, embeddingIdentity)) {\n refreshedResult = {\n refreshed: [],\n skipped: workload.documents.map((entry) => entry.id),\n warnings: [\"search_semantic_refresh_requires_reindex:embedding_identity_changed\"],\n };\n } else {\n try {\n const embedded = await embedLocatedSemanticVectors(\n runtimeContext.settings,\n runtimeContext.provider,\n workload.documents,\n );\n if (hasVectorizationVectorDimensionChanged(ledgerRead.embedding, embedded.vector_dimension)) {\n refreshedResult = {\n refreshed: [],\n skipped: workload.documents.map((entry) => entry.id),\n warnings: [...embedded.warnings, \"search_semantic_refresh_requires_reindex:vector_dimension_changed\"],\n };\n } else {\n nextEmbeddingMetadata = buildVectorizationEmbeddingMetadata(embeddingIdentity, embedded.vector_dimension);\n const upserted = await upsertLocatedSemanticVectors(runtimeContext.vectorStore, workload.documents, embedded.vectors);\n refreshedResult = {\n refreshed: upserted.refreshed,\n skipped: upserted.skipped,\n warnings: [...embedded.warnings, ...upserted.warnings],\n };\n }\n } catch (error: unknown) {\n refreshedResult = {\n refreshed: [],\n skipped: workload.documents.map((entry) => entry.id),\n warnings: [`search_semantic_refresh_failed:${toErrorMessage(error)}`],\n };\n }\n }\n }\n const pruneResult = await pruneMissingSemanticVectors(runtimeContext.vectorStore, workload.missingIds);\n const refreshedIdSet = new Set(refreshedResult.refreshed);\n const refreshedEntries = Object.fromEntries(\n workload.documents\n .filter((entry) => refreshedIdSet.has(entry.id))\n .map((entry) => [entry.id, entry.document.metadata.updated_at]),\n );\n const ledgerWarnings: string[] = [];\n if (Object.keys(refreshedEntries).length > 0 || workload.missingIds.length > 0) {\n const nextEntries = {\n ...nextLedgerBaseEntries,\n ...normalizeVectorizationLedgerEntries(refreshedEntries),\n };\n for (const missingId of workload.missingIds) {\n delete nextEntries[missingId];\n }\n try {\n await writeVectorizationStatusLedger(pmRoot, nextEntries, nextEmbeddingMetadata);\n } catch (error: unknown) {\n ledgerWarnings.push(`search_vectorization_status_ledger_write_failed:${toErrorMessage(error)}`);\n }\n ledgerWarnings.push(...ledgerRead.warnings);\n }\n\n return {\n refreshed: toUniqueSorted([...refreshedResult.refreshed, ...pruneResult.refreshed]),\n skipped: toUniqueSorted([...workload.skippedIds, ...refreshedResult.skipped, ...pruneResult.skipped]),\n warnings: [...workload.warnings, ...refreshedResult.warnings, ...pruneResult.warnings, ...ledgerWarnings],\n };\n}\n\n/**\n * Returns true when a semantic embedding refresh would do real work for these\n * settings (an embedding provider AND a vector store both resolve). Used to\n * decide whether a mutation's refresh is worth dispatching to a background\n * worker — when semantic search is not configured the inline path is already a\n * fast no-op and no child is spawned.\n */\nexport function isSemanticRefreshActive(\n settings: Awaited<ReturnType<typeof readSettings>>,\n applyRuntimeDefaults: boolean,\n): boolean {\n const effectiveSettings = applyRuntimeDefaults\n ? resolveSettingsWithSemanticRuntimeDefaults(settings).settings\n : settings;\n return Boolean(resolveEmbeddingProviders(effectiveSettings).active && resolveVectorStores(effectiveSettings).active);\n}\n\nexport async function refreshSearchArtifactsForMutation(\n pmRoot: string,\n itemIds: string[],\n options: RefreshSearchArtifactsForMutationOptions = {},\n): Promise<SearchMutationArtifactRefreshResult> {\n const invalidation = await invalidateSearchCacheArtifacts(pmRoot);\n const normalizedItemIds = toUniqueSorted(itemIds);\n if (normalizedItemIds.length === 0) {\n return {\n invalidated: invalidation.invalidated,\n refreshed: [],\n skipped: [],\n warnings: invalidation.warnings,\n };\n }\n\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n const semanticRefresh = await refreshSemanticEmbeddingsForMutatedItems(pmRoot, normalizedItemIds);\n return {\n invalidated: invalidation.invalidated,\n refreshed: semanticRefresh.refreshed,\n skipped: semanticRefresh.skipped,\n warnings: [...invalidation.warnings, ...semanticRefresh.warnings],\n };\n }\n\n let settings: Awaited<ReturnType<typeof readSettings>>;\n try {\n settings = await readSettings(pmRoot);\n } catch (error: unknown) {\n return {\n invalidated: invalidation.invalidated,\n refreshed: [],\n skipped: normalizedItemIds,\n warnings: [\n ...invalidation.warnings,\n `search_semantic_refresh_skipped:settings_read_failed:${toErrorMessage(error)}`,\n ],\n };\n }\n\n if (settings.search.mutation_refresh_policy === \"cache_only\") {\n return {\n invalidated: invalidation.invalidated,\n refreshed: [],\n skipped: normalizedItemIds,\n warnings: invalidation.warnings,\n };\n }\n\n const applyRuntimeDefaults = settings.search.mutation_refresh_policy === \"semantic_auto\";\n\n // Keyword cache is already invalidated synchronously above (so keyword search\n // stays immediately correct). When requested, dispatch the slow embedding\n // refresh to a detached worker so the mutation returns instantly; the\n // vector_index_stale health/search warning covers the catch-up window.\n if (options.background && isSemanticRefreshActive(settings, applyRuntimeDefaults)) {\n await scheduleBackgroundSemanticRefresh(pmRoot, normalizedItemIds);\n return {\n invalidated: invalidation.invalidated,\n refreshed: [],\n skipped: [],\n warnings: [...invalidation.warnings, \"search_semantic_refresh_scheduled_background\"],\n scheduled: true,\n };\n }\n\n const semanticRefresh = await refreshSemanticEmbeddingsForMutatedItems(pmRoot, normalizedItemIds, {\n settings,\n apply_runtime_defaults: applyRuntimeDefaults,\n });\n return {\n invalidated: invalidation.invalidated,\n refreshed: semanticRefresh.refreshed,\n skipped: semanticRefresh.skipped,\n warnings: [...invalidation.warnings, ...semanticRefresh.warnings],\n };\n}\n", "import type { PmSettings } from \"../../types/index.js\";\nimport { executeEmbeddingRequest } from \"./providers.js\";\nimport type { EmbeddingProviderConfig } from \"./providers.js\";\nimport { toErrorMessage } from \"../shared/primitives.js\";\nimport {\n OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS,\n SEMANTIC_CORPUS_TRUNCATION_SUFFIX,\n resolveSemanticCorpusCharacterLimit,\n} from \"./corpus.js\";\n\nexport interface EmbeddingBatchExecutionResult {\n vectors: number[][];\n warnings: string[];\n}\n\nexport interface EmbeddingBatchProgressEvent {\n batch_index: number;\n batch_total: number;\n batch_size: number;\n completed_inputs: number;\n total_inputs: number;\n attempt?: number;\n phase: \"start\" | \"complete\";\n}\n\nexport interface EmbeddingBatchExecutionOptions {\n onProgress?: (event: EmbeddingBatchProgressEvent) => void;\n}\n\ninterface EmbeddingBatchRuntime {\n batchSize: number;\n timeoutMs: number;\n maxRetries: number;\n maxBatchInputCharacters: number;\n maxInputCharacters: number;\n}\n\nfunction resolveBatchRuntime(\n settings: PmSettings,\n maxInputCharacters: number,\n): EmbeddingBatchRuntime {\n const batchSizeCandidate = settings.search.embedding_batch_size;\n const timeoutMsCandidate = settings.search.embedding_timeout_ms;\n const maxRetriesCandidate = settings.search.scanner_max_batch_retries;\n const batchSize = Number.isFinite(batchSizeCandidate) && batchSizeCandidate > 0 ? Math.floor(batchSizeCandidate) : 1;\n const timeoutMs =\n Number.isFinite(timeoutMsCandidate) && timeoutMsCandidate > 0 ? Math.floor(timeoutMsCandidate) : 30_000;\n const maxRetries = Number.isFinite(maxRetriesCandidate) && maxRetriesCandidate >= 0 ? Math.floor(maxRetriesCandidate) : 0;\n return {\n batchSize,\n timeoutMs,\n maxRetries,\n maxBatchInputCharacters: Number.POSITIVE_INFINITY,\n maxInputCharacters,\n };\n}\n\nfunction createBatches(inputs: string[], batchSize: number, maxBatchInputCharacters: number): string[][] {\n const batches: string[][] = [];\n let currentBatch: string[] = [];\n let currentCharacters = 0;\n for (const input of inputs) {\n const wouldExceedCount = currentBatch.length >= batchSize;\n const wouldExceedCharacters =\n currentBatch.length > 0 &&\n Number.isFinite(maxBatchInputCharacters) &&\n currentCharacters + input.length > maxBatchInputCharacters;\n if (wouldExceedCount || wouldExceedCharacters) {\n batches.push(currentBatch);\n currentBatch = [];\n currentCharacters = 0;\n }\n currentBatch.push(input);\n currentCharacters += input.length;\n }\n batches.push(currentBatch);\n return batches;\n}\n\nfunction resolveProviderBatchRuntime(provider: EmbeddingProviderConfig, runtime: EmbeddingBatchRuntime): EmbeddingBatchRuntime {\n if (provider.name !== \"ollama\") {\n return runtime;\n }\n return {\n ...runtime,\n maxBatchInputCharacters: OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS,\n };\n}\n\nfunction truncateInputForRuntime(input: string, maxInputCharacters: number): string {\n if (!Number.isFinite(maxInputCharacters) || maxInputCharacters <= 0 || input.length <= maxInputCharacters) {\n return input;\n }\n const keepLength = Math.max(0, maxInputCharacters - SEMANTIC_CORPUS_TRUNCATION_SUFFIX.length);\n return `${input.slice(0, keepLength)}${SEMANTIC_CORPUS_TRUNCATION_SUFFIX}`.slice(0, maxInputCharacters);\n}\n\nfunction isEmbeddingTimeoutError(error: unknown): boolean {\n const message = toErrorMessage(error).toLowerCase();\n return message.includes(\"timed out\") || message.includes(\"timeout\");\n}\n\nfunction buildEmbeddingFailureMessage(\n provider: EmbeddingProviderConfig,\n batchLabel: string,\n batchSize: number,\n timeoutMs: number,\n attempts: number,\n error: unknown,\n): string {\n const base = `Embedding batch ${batchLabel} failed after ${attempts} attempt(s): ${toErrorMessage(error)}`;\n const details = `provider=${provider.name} model=${provider.model} batch_size=${batchSize} timeout_ms=${timeoutMs}`;\n if (!isEmbeddingTimeoutError(error)) {\n return `${base} (${details})`;\n }\n return `${base} (${details}; guidance=check provider availability or lower search.embedding_batch_size, raise search.embedding_timeout_ms, or run keyword search while semantic indexing catches up)`;\n}\n\nasync function executeBatchWithAdaptiveSplit(\n provider: EmbeddingProviderConfig,\n batch: string[],\n batchLabel: string,\n timeoutMs: number,\n maxRetries: number,\n warnings: string[],\n): Promise<number[][]> {\n let lastError: unknown = null;\n for (let attempt = 0; attempt <= maxRetries; attempt += 1) {\n try {\n const batchVectors = await executeEmbeddingRequest(provider, batch, { timeout_ms: timeoutMs });\n if (attempt > 0) {\n warnings.push(\n `search_embedding_batch_retry_succeeded:batch=${batchLabel}:attempt=${attempt + 1}:size=${batch.length}`,\n );\n }\n return batchVectors;\n } catch (error: unknown) {\n lastError = error;\n if (isEmbeddingTimeoutError(error) && batch.length > 1) {\n const midpoint = Math.ceil(batch.length / 2);\n const left = batch.slice(0, midpoint);\n const right = batch.slice(midpoint);\n warnings.push(\n `search_embedding_batch_split_after_timeout:batch=${batchLabel}:size=${batch.length}:parts=${left.length}|${right.length}`,\n );\n return [\n ...(await executeBatchWithAdaptiveSplit(provider, left, `${batchLabel}.1`, timeoutMs, maxRetries, warnings)),\n ...(await executeBatchWithAdaptiveSplit(provider, right, `${batchLabel}.2`, timeoutMs, maxRetries, warnings)),\n ];\n }\n if (attempt < maxRetries) {\n const delayMs = Math.min(1000 * 2 ** attempt, 8000);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n }\n throw new Error(buildEmbeddingFailureMessage(provider, batchLabel, batch.length, timeoutMs, maxRetries + 1, lastError));\n}\n\nexport async function executeEmbeddingBatchesWithRetry(\n provider: EmbeddingProviderConfig,\n settings: PmSettings,\n inputs: string[],\n options: EmbeddingBatchExecutionOptions = {},\n): Promise<EmbeddingBatchExecutionResult> {\n if (inputs.length === 0) {\n return {\n vectors: [],\n warnings: [],\n };\n }\n const warnings: string[] = [];\n const corpusLimitResolution = resolveSemanticCorpusCharacterLimit(\n provider.name,\n settings.search.embedding_corpus_max_characters,\n );\n if (corpusLimitResolution.warning) {\n warnings.push(corpusLimitResolution.warning);\n }\n const runtime = resolveProviderBatchRuntime(\n provider,\n resolveBatchRuntime(settings, corpusLimitResolution.maxCharacters),\n );\n let truncatedInputCount = 0;\n const normalizedInputs = inputs.map((input) => {\n const normalized = truncateInputForRuntime(input, runtime.maxInputCharacters);\n if (normalized.length < input.length) {\n truncatedInputCount += 1;\n }\n return normalized;\n });\n if (truncatedInputCount > 0) {\n warnings.push(`search_embedding_input_truncated:count=${truncatedInputCount}:max_characters=${runtime.maxInputCharacters}`);\n }\n const batches = createBatches(normalizedInputs, runtime.batchSize, runtime.maxBatchInputCharacters);\n const vectors: number[][] = [];\n let completedInputs = 0;\n for (let batchIndex = 0; batchIndex < batches.length; batchIndex += 1) {\n const batch = batches[batchIndex];\n options.onProgress?.({\n batch_index: batchIndex + 1,\n batch_total: batches.length,\n batch_size: batch.length,\n completed_inputs: completedInputs,\n total_inputs: normalizedInputs.length,\n phase: \"start\",\n });\n vectors.push(\n ...(await executeBatchWithAdaptiveSplit(\n provider,\n batch,\n String(batchIndex + 1),\n runtime.timeoutMs,\n runtime.maxRetries,\n warnings,\n )),\n );\n completedInputs += batch.length;\n options.onProgress?.({\n batch_index: batchIndex + 1,\n batch_total: batches.length,\n batch_size: batch.length,\n completed_inputs: completedInputs,\n total_inputs: normalizedInputs.length,\n phase: \"complete\",\n });\n }\n return {\n vectors,\n warnings,\n };\n}\n", "import { spawn } from \"node:child_process\";\nimport { mkdirSync, rmSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport { pathExists, readFileIfExists, writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { acquireLock } from \"../lock/lock.js\";\nimport { resolvePmPackageRootFromModule } from \"../packages/root.js\";\nimport { readSettings } from \"../store/settings.js\";\nimport { toErrorMessage } from \"../shared/primitives.js\";\nimport { resolveSettingsWithSemanticRuntimeDefaults } from \"./semantic-defaults.js\";\n\n/**\n * Shared lock id for any process that rewrites the local vector store. Reindex\n * and the background mutation-refresh worker both acquire this so they never\n * write concurrently and corrupt the store. Exported so `pm reindex` reuses the\n * same id rather than duplicating the literal.\n */\nexport const REINDEX_LOCK_ID = \"reindex\";\n\nconst PENDING_QUEUE_REL_PATH = \"search/pending-refresh.json\";\nconst PENDING_QUEUE_GATE_REL_PATH = \"search/pending-refresh.gate.lock\";\nconst PENDING_QUEUE_GATE_STALE_MS = 30_000;\n\n// Bounded reindex-lock retry for the background worker (~3.2s worst case).\nconst LOCK_ACQUIRE_ATTEMPTS = 8;\nconst LOCK_ACQUIRE_BACKOFF_MS = 400;\n\nconst SEARCH_REFRESH_INLINE_ENV = \"PM_SEARCH_REFRESH_INLINE\";\nconst SEARCH_REFRESH_CHILD_ENV = \"PM_SEARCH_REFRESH_CHILD\";\n\nfunction parseBooleanTrueLike(value: string | undefined): boolean {\n if (typeof value !== \"string\") {\n return false;\n }\n const normalized = value.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\n/**\n * Mutation search refresh runs inline (blocking) under test runners, inside the\n * background worker child itself, or when explicitly requested. Otherwise the\n * semantic refresh is dispatched to a detached child so mutations return without\n * waiting on embeddings. Mirrors the telemetry-flush inline gate so the full test\n * suite stays deterministic.\n */\nexport function shouldRunSearchRefreshInForeground(): boolean {\n if (parseBooleanTrueLike(process.env[SEARCH_REFRESH_INLINE_ENV])) {\n return true;\n }\n if (parseBooleanTrueLike(process.env[SEARCH_REFRESH_CHILD_ENV])) {\n return true;\n }\n const nodeEnv = (process.env.NODE_ENV ?? \"\").trim().toLowerCase();\n return (\n typeof process.env.VITEST === \"string\" ||\n typeof process.env.VITEST_WORKER_ID === \"string\" ||\n nodeEnv === \"test\"\n );\n}\n\nfunction pendingQueuePath(pmRoot: string): string {\n return path.join(pmRoot, PENDING_QUEUE_REL_PATH);\n}\n\nfunction pendingQueueGatePath(pmRoot: string): string {\n return path.join(pmRoot, PENDING_QUEUE_GATE_REL_PATH);\n}\n\nfunction acquireQueueGate(pmRoot: string): boolean {\n const gatePath = pendingQueueGatePath(pmRoot);\n try {\n if (Date.now() - statSync(gatePath).mtimeMs < PENDING_QUEUE_GATE_STALE_MS) {\n return false;\n }\n rmSync(gatePath, { recursive: true, force: true });\n } catch {\n // Missing gate is the common case; fall through to create it.\n }\n try {\n mkdirSync(path.dirname(gatePath), { recursive: true });\n mkdirSync(gatePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction releaseQueueGate(pmRoot: string): void {\n try {\n rmSync(pendingQueueGatePath(pmRoot), { recursive: true, force: true });\n } catch {\n // Best effort; a stale gate self-heals after PENDING_QUEUE_GATE_STALE_MS.\n }\n}\n\nasync function withQueueGate<T>(pmRoot: string, fn: () => Promise<T>, fallback: T): Promise<T> {\n // Briefly serialize read-modify-write access to the pending queue across the\n // mutation process and the worker child. Acquisition is best effort; if a\n // healthy gate is held we skip rather than risk a torn queue.\n for (let attempt = 0; attempt < 50; attempt += 1) {\n if (acquireQueueGate(pmRoot)) {\n try {\n return await fn();\n } finally {\n releaseQueueGate(pmRoot);\n }\n }\n await delay(20);\n }\n return fallback;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms).unref?.();\n });\n}\n\nasync function readPendingQueueIds(pmRoot: string): Promise<string[]> {\n const raw = await readFileIfExists(pendingQueuePath(pmRoot));\n if (!raw || raw.trim().length === 0) {\n return [];\n }\n try {\n const parsed = JSON.parse(raw) as { ids?: unknown };\n if (!Array.isArray(parsed.ids)) {\n return [];\n }\n return parsed.ids.filter((id): id is string => typeof id === \"string\" && id.length > 0);\n } catch {\n return [];\n }\n}\n\nasync function writePendingQueueIds(pmRoot: string, ids: string[]): Promise<void> {\n await writeFileAtomic(pendingQueuePath(pmRoot), `${JSON.stringify({ ids })}\\n`);\n}\n\n/** Merge mutated item ids into the persistent pending-refresh queue. */\nexport async function enqueuePendingRefreshIds(pmRoot: string, itemIds: string[]): Promise<void> {\n const incoming = itemIds.filter((id) => typeof id === \"string\" && id.trim().length > 0);\n if (incoming.length === 0) {\n return;\n }\n const mergeIncoming = async (): Promise<void> => {\n const existing = await readPendingQueueIds(pmRoot);\n const merged = [...new Set([...existing, ...incoming])].sort((left, right) => left.localeCompare(right));\n await writePendingQueueIds(pmRoot, merged);\n };\n const gated = await withQueueGate(\n pmRoot,\n async () => {\n await mergeIncoming();\n return true;\n },\n false,\n );\n if (!gated) {\n // The gate stayed contended past the retry budget. Never silently drop a\n // mutation's refresh work: fall back to a best-effort unguarded merge.\n // writeFileAtomic keeps the file valid; the only risk is losing a concurrent\n // writer's delta, which its own next dispatch and the vector_index_stale\n // warning both recover.\n await mergeIncoming();\n }\n}\n\n/** Atomically read and clear the pending-refresh queue, returning drained ids. */\nexport async function drainPendingRefreshIds(pmRoot: string): Promise<string[]> {\n return withQueueGate(\n pmRoot,\n async () => {\n const ids = await readPendingQueueIds(pmRoot);\n if (ids.length > 0) {\n await writePendingQueueIds(pmRoot, []);\n }\n return ids;\n },\n [],\n );\n}\n\nfunction searchRefreshRunnerPath(): string {\n return path.join(\n resolvePmPackageRootFromModule(import.meta.url, [\"../../..\"]),\n \"dist\",\n \"cli\",\n \"search-refresh.js\",\n );\n}\n\n/**\n * Spawn the detached refresh worker child for this pm root. Best effort: a\n * failed dispatch must never keep the CLI alive or fail a mutation; the next\n * mutation re-dispatches and `vector_index_stale` warns about the catch-up\n * window in the meantime.\n */\nfunction dispatchRefreshChild(pmRoot: string): void {\n try {\n const child = spawn(process.execPath, [searchRefreshRunnerPath()], {\n detached: true,\n stdio: \"ignore\",\n env: {\n ...process.env,\n PM_PATH: pmRoot,\n [SEARCH_REFRESH_CHILD_ENV]: \"1\",\n },\n });\n // A detached child can emit an async 'error' event (e.g. spawn EAGAIN/ENOENT,\n // resource limits). Swallow it so it never becomes an unhandled error that\n // crashes the parent CLI; dispatch is best effort.\n child.on(\"error\", () => {});\n child.unref();\n } catch {\n // Best effort — see doc comment above.\n }\n}\n\n/**\n * Enqueue mutated ids and dispatch a detached worker child to refresh semantic\n * embeddings without blocking the mutation. The reindex lock the worker acquires\n * serializes concurrent refreshes, so the spawn itself stays unconditional and\n * cheap; a worker that loses the lock exits and its ids are drained by the holder.\n */\nexport async function scheduleBackgroundSemanticRefresh(pmRoot: string, itemIds: string[]): Promise<void> {\n await enqueuePendingRefreshIds(pmRoot, itemIds);\n dispatchRefreshChild(pmRoot);\n}\n\nexport interface SemanticRefreshWorkerResult {\n processed: string[];\n rounds: number;\n warnings: string[];\n}\n\ntype SemanticRefreshFn = (\n pmRoot: string,\n itemIds: string[],\n) => Promise<{ refreshed: string[]; skipped: string[]; warnings: string[] }>;\n\n/**\n * Drain the pending queue and refresh semantic vectors under the reindex lock so\n * the local vector store is never rewritten concurrently. If the lock is held by\n * another worker we exit immediately — that holder drains our enqueued ids. After\n * releasing we re-check the queue once and re-dispatch if a sibling enqueued ids\n * during our final window, guaranteeing eventual processing.\n */\nexport async function runSemanticRefreshWorker(\n pmRoot: string,\n refresh: SemanticRefreshFn,\n): Promise<SemanticRefreshWorkerResult> {\n const warnings: string[] = [];\n const processed: string[] = [];\n if (!(await pathExists(pmRoot))) {\n return { processed, rounds: 0, warnings };\n }\n\n let settings: Awaited<ReturnType<typeof readSettings>>;\n try {\n settings = resolveSettingsWithSemanticRuntimeDefaults(await readSettings(pmRoot)).settings;\n } catch (error: unknown) {\n return { processed, rounds: 0, warnings: [`search_background_refresh_settings_read_failed:${toErrorMessage(error)}`] };\n }\n\n // Retry the reindex lock with backoff rather than exiting on the first\n // conflict: a sibling refresh worker holds it only briefly (~one embed), so a\n // few retries pick up the queued ids in this run instead of stranding them\n // until the next mutation. If a long `pm reindex` keeps it, we give up — that\n // full pass re-embeds everything anyway and the next dispatch retries.\n let release: (() => Promise<void>) | null = null;\n for (let attempt = 0; attempt < LOCK_ACQUIRE_ATTEMPTS && !release; attempt += 1) {\n try {\n release = await acquireLock(\n pmRoot,\n REINDEX_LOCK_ID,\n settings.locks.ttl_seconds,\n process.env.PM_AUTHOR ?? \"pm-search-refresh\",\n false,\n settings.governance.force_required_for_stale_lock,\n );\n } catch {\n if (attempt < LOCK_ACQUIRE_ATTEMPTS - 1) {\n await delay(LOCK_ACQUIRE_BACKOFF_MS);\n }\n }\n }\n if (!release) {\n return { processed, rounds: 0, warnings };\n }\n\n let rounds = 0;\n let failed = false;\n try {\n for (;;) {\n const ids = await drainPendingRefreshIds(pmRoot);\n if (ids.length === 0) {\n break;\n }\n rounds += 1;\n try {\n const result = await refresh(pmRoot, ids);\n processed.push(...result.refreshed);\n warnings.push(...result.warnings);\n } catch (error: unknown) {\n warnings.push(`search_background_refresh_failed:${toErrorMessage(error)}`);\n // Re-enqueue so the work is retried by a later dispatch rather than lost.\n await enqueuePendingRefreshIds(pmRoot, ids);\n failed = true;\n break;\n }\n }\n } finally {\n await release?.();\n }\n\n // Close the race where a sibling enqueued ids between our last empty drain and\n // releasing the lock: re-dispatch so those ids are eventually processed. Skip\n // this after a refresh failure — the failed ids were re-enqueued and an\n // immediate respawn would just fail again, spinning indefinitely. They wait\n // for the next mutation's dispatch instead.\n const remaining = failed ? [] : await readPendingQueueIds(pmRoot);\n if (remaining.length > 0) {\n dispatchRefreshChild(pmRoot);\n }\n\n return { processed: [...new Set(processed)].sort((a, b) => a.localeCompare(b)), rounds, warnings };\n}\n"],
5
- "mappings": "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",
6
- "names": ["loaded", "encodedCollection", "path", "resolve", "resolve", "path", "path", "semanticRefresh"]
7
- }