@chendpoc/pi-memory 0.1.12 → 0.2.0

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 (708) hide show
  1. package/README.md +67 -187
  2. package/UBIQUITOUS_LANGUAGE.md +81 -0
  3. package/dist/adapters/embed/factory.d.ts +7 -0
  4. package/dist/adapters/embed/factory.d.ts.map +1 -0
  5. package/dist/adapters/embed/factory.js +44 -0
  6. package/dist/adapters/embed/factory.js.map +1 -0
  7. package/dist/adapters/embed/hash.d.ts +3 -0
  8. package/dist/adapters/embed/hash.d.ts.map +1 -0
  9. package/dist/adapters/embed/hash.js +26 -0
  10. package/dist/adapters/embed/hash.js.map +1 -0
  11. package/dist/adapters/embed/normalize.d.ts +3 -0
  12. package/dist/adapters/embed/normalize.d.ts.map +1 -0
  13. package/dist/adapters/embed/normalize.js +15 -0
  14. package/dist/adapters/embed/normalize.js.map +1 -0
  15. package/dist/adapters/embed/ollama.d.ts +8 -0
  16. package/dist/adapters/embed/ollama.d.ts.map +1 -0
  17. package/dist/adapters/embed/ollama.js +31 -0
  18. package/dist/adapters/embed/ollama.js.map +1 -0
  19. package/dist/adapters/embed/openai.d.ts +8 -0
  20. package/dist/adapters/embed/openai.d.ts.map +1 -0
  21. package/dist/adapters/embed/openai.js +30 -0
  22. package/dist/adapters/embed/openai.js.map +1 -0
  23. package/dist/adapters/embed/types.d.ts +9 -0
  24. package/dist/adapters/embed/types.d.ts.map +1 -0
  25. package/dist/adapters/embed/types.js +2 -0
  26. package/dist/adapters/embed/types.js.map +1 -0
  27. package/dist/adapters/http.d.ts +13 -0
  28. package/dist/adapters/http.d.ts.map +1 -0
  29. package/dist/adapters/http.js +31 -0
  30. package/dist/adapters/http.js.map +1 -0
  31. package/dist/adapters/index.d.ts +4 -0
  32. package/dist/adapters/index.d.ts.map +1 -0
  33. package/dist/adapters/index.js +4 -0
  34. package/dist/adapters/index.js.map +1 -0
  35. package/dist/adapters/llm/extractText.d.ts +5 -0
  36. package/dist/adapters/llm/extractText.d.ts.map +1 -0
  37. package/dist/adapters/llm/extractText.js +7 -0
  38. package/dist/adapters/llm/extractText.js.map +1 -0
  39. package/dist/adapters/llm/factory.d.ts +11 -0
  40. package/dist/adapters/llm/factory.d.ts.map +1 -0
  41. package/dist/adapters/llm/factory.js +48 -0
  42. package/dist/adapters/llm/factory.js.map +1 -0
  43. package/dist/adapters/llm/index.d.ts +8 -0
  44. package/dist/adapters/llm/index.d.ts.map +1 -0
  45. package/dist/adapters/llm/index.js +7 -0
  46. package/dist/adapters/llm/index.js.map +1 -0
  47. package/dist/adapters/llm/modelSpec.d.ts +10 -0
  48. package/dist/adapters/llm/modelSpec.d.ts.map +1 -0
  49. package/dist/adapters/llm/modelSpec.js +21 -0
  50. package/dist/adapters/llm/modelSpec.js.map +1 -0
  51. package/dist/adapters/llm/ollama.d.ts +4 -0
  52. package/dist/adapters/llm/ollama.d.ts.map +1 -0
  53. package/dist/adapters/llm/ollama.js +32 -0
  54. package/dist/adapters/llm/ollama.js.map +1 -0
  55. package/dist/adapters/llm/openai-compat.d.ts +4 -0
  56. package/dist/adapters/llm/openai-compat.d.ts.map +1 -0
  57. package/dist/adapters/llm/openai-compat.js +36 -0
  58. package/dist/adapters/llm/openai-compat.js.map +1 -0
  59. package/dist/adapters/llm/pi-ai.d.ts +5 -0
  60. package/dist/adapters/llm/pi-ai.d.ts.map +1 -0
  61. package/dist/adapters/llm/pi-ai.js +60 -0
  62. package/dist/adapters/llm/pi-ai.js.map +1 -0
  63. package/dist/adapters/llm/standalone.d.ts +6 -0
  64. package/dist/adapters/llm/standalone.d.ts.map +1 -0
  65. package/dist/adapters/llm/standalone.js +44 -0
  66. package/dist/adapters/llm/standalone.js.map +1 -0
  67. package/dist/adapters/llm/types.d.ts +15 -0
  68. package/dist/adapters/llm/types.d.ts.map +1 -0
  69. package/dist/adapters/llm/types.js +2 -0
  70. package/dist/adapters/llm/types.js.map +1 -0
  71. package/dist/cli/init.d.ts +3 -0
  72. package/dist/cli/init.d.ts.map +1 -0
  73. package/dist/cli/init.js +13 -0
  74. package/dist/cli/init.js.map +1 -0
  75. package/dist/cli/jobs.d.ts +32 -0
  76. package/dist/cli/jobs.d.ts.map +1 -0
  77. package/dist/cli/jobs.js +100 -0
  78. package/dist/cli/jobs.js.map +1 -0
  79. package/dist/cli/log.d.ts +14 -0
  80. package/dist/cli/log.d.ts.map +1 -0
  81. package/dist/cli/log.js +32 -0
  82. package/dist/cli/log.js.map +1 -0
  83. package/dist/cli/parseArgs.d.ts +35 -0
  84. package/dist/cli/parseArgs.d.ts.map +1 -0
  85. package/dist/cli/parseArgs.js +127 -0
  86. package/dist/cli/parseArgs.js.map +1 -0
  87. package/dist/cli/status.d.ts +44 -0
  88. package/dist/cli/status.d.ts.map +1 -0
  89. package/dist/cli/status.js +238 -0
  90. package/dist/cli/status.js.map +1 -0
  91. package/dist/cli/theme.d.ts +14 -0
  92. package/dist/cli/theme.d.ts.map +1 -0
  93. package/dist/cli/theme.js +20 -0
  94. package/dist/cli/theme.js.map +1 -0
  95. package/dist/cli.js +68 -231
  96. package/dist/cli.js.map +1 -1
  97. package/dist/commands/index.d.ts +6 -0
  98. package/dist/commands/index.d.ts.map +1 -0
  99. package/dist/commands/index.js +14 -0
  100. package/dist/commands/index.js.map +1 -0
  101. package/dist/commands/parseMemoryStatusArgs.d.ts +3 -0
  102. package/dist/commands/parseMemoryStatusArgs.d.ts.map +1 -0
  103. package/dist/commands/parseMemoryStatusArgs.js +15 -0
  104. package/dist/commands/parseMemoryStatusArgs.js.map +1 -0
  105. package/dist/commands/parseRememberArgs.d.ts +10 -0
  106. package/dist/commands/parseRememberArgs.d.ts.map +1 -0
  107. package/dist/commands/parseRememberArgs.js +46 -0
  108. package/dist/commands/parseRememberArgs.js.map +1 -0
  109. package/dist/commands/remember.d.ts +8 -0
  110. package/dist/commands/remember.d.ts.map +1 -0
  111. package/dist/commands/remember.js +30 -0
  112. package/dist/commands/remember.js.map +1 -0
  113. package/dist/commands/status.d.ts +10 -0
  114. package/dist/commands/status.d.ts.map +1 -0
  115. package/dist/commands/status.js +81 -0
  116. package/dist/commands/status.js.map +1 -0
  117. package/dist/commands/types.d.ts +10 -0
  118. package/dist/commands/types.d.ts.map +1 -0
  119. package/dist/commands/types.js +2 -0
  120. package/dist/commands/types.js.map +1 -0
  121. package/dist/compact/index.d.ts +5 -0
  122. package/dist/compact/index.d.ts.map +1 -0
  123. package/dist/compact/index.js +5 -0
  124. package/dist/compact/index.js.map +1 -0
  125. package/dist/compact/parseMemoryExport.d.ts +6 -0
  126. package/dist/compact/parseMemoryExport.d.ts.map +1 -0
  127. package/dist/compact/parseMemoryExport.js +62 -0
  128. package/dist/compact/parseMemoryExport.js.map +1 -0
  129. package/dist/compact/register.d.ts +10 -0
  130. package/dist/compact/register.d.ts.map +1 -0
  131. package/dist/compact/register.js +47 -0
  132. package/dist/compact/register.js.map +1 -0
  133. package/dist/compact/runSummary.d.ts +6 -0
  134. package/dist/compact/runSummary.d.ts.map +1 -0
  135. package/dist/compact/runSummary.js +29 -0
  136. package/dist/compact/runSummary.js.map +1 -0
  137. package/dist/compact/subagentDelta.d.ts +6 -0
  138. package/dist/compact/subagentDelta.d.ts.map +1 -0
  139. package/dist/compact/subagentDelta.js +13 -0
  140. package/dist/compact/subagentDelta.js.map +1 -0
  141. package/dist/compact/summaryPrompt.d.ts +3 -0
  142. package/dist/compact/summaryPrompt.d.ts.map +1 -0
  143. package/dist/compact/summaryPrompt.js +41 -0
  144. package/dist/compact/summaryPrompt.js.map +1 -0
  145. package/dist/config/agentDir.d.ts +11 -0
  146. package/dist/config/agentDir.d.ts.map +1 -0
  147. package/dist/config/agentDir.js +21 -0
  148. package/dist/config/agentDir.js.map +1 -0
  149. package/dist/config/chunking.d.ts +7 -0
  150. package/dist/config/chunking.d.ts.map +1 -0
  151. package/dist/config/chunking.js +20 -0
  152. package/dist/config/chunking.js.map +1 -0
  153. package/dist/config/env.d.ts +28 -0
  154. package/dist/config/env.d.ts.map +1 -0
  155. package/dist/config/env.js +43 -0
  156. package/dist/config/env.js.map +1 -0
  157. package/dist/config/index.d.ts +7 -0
  158. package/dist/config/index.d.ts.map +1 -0
  159. package/dist/config/index.js +7 -0
  160. package/dist/config/index.js.map +1 -0
  161. package/dist/config/loadEnv.d.ts +10 -0
  162. package/dist/config/loadEnv.d.ts.map +1 -0
  163. package/dist/config/loadEnv.js +25 -0
  164. package/dist/config/loadEnv.js.map +1 -0
  165. package/dist/config/preflightBudget.d.ts +9 -0
  166. package/dist/config/preflightBudget.d.ts.map +1 -0
  167. package/dist/config/preflightBudget.js +16 -0
  168. package/dist/config/preflightBudget.js.map +1 -0
  169. package/dist/config/retrieval.d.ts +10 -0
  170. package/dist/config/retrieval.d.ts.map +1 -0
  171. package/dist/config/retrieval.js +31 -0
  172. package/dist/config/retrieval.js.map +1 -0
  173. package/dist/consolidate/entryKey.d.ts +6 -0
  174. package/dist/consolidate/entryKey.d.ts.map +1 -0
  175. package/dist/consolidate/entryKey.js +5 -0
  176. package/dist/consolidate/entryKey.js.map +1 -0
  177. package/dist/consolidate/index.d.ts +5 -0
  178. package/dist/consolidate/index.d.ts.map +1 -0
  179. package/dist/consolidate/index.js +5 -0
  180. package/dist/consolidate/index.js.map +1 -0
  181. package/dist/consolidate/mergeEntries.d.ts +4 -0
  182. package/dist/consolidate/mergeEntries.d.ts.map +1 -0
  183. package/dist/consolidate/mergeEntries.js +17 -0
  184. package/dist/consolidate/mergeEntries.js.map +1 -0
  185. package/dist/consolidate/mergePrompt.d.ts +4 -0
  186. package/dist/consolidate/mergePrompt.d.ts.map +1 -0
  187. package/dist/consolidate/mergePrompt.js +40 -0
  188. package/dist/consolidate/mergePrompt.js.map +1 -0
  189. package/dist/consolidate/mergeWithLlm.d.ts +4 -0
  190. package/dist/consolidate/mergeWithLlm.d.ts.map +1 -0
  191. package/dist/consolidate/mergeWithLlm.js +27 -0
  192. package/dist/consolidate/mergeWithLlm.js.map +1 -0
  193. package/dist/consolidate/runJob.d.ts +29 -0
  194. package/dist/consolidate/runJob.d.ts.map +1 -0
  195. package/dist/consolidate/runJob.js +48 -0
  196. package/dist/consolidate/runJob.js.map +1 -0
  197. package/dist/consolidate/scheduler.d.ts +18 -0
  198. package/dist/consolidate/scheduler.d.ts.map +1 -0
  199. package/dist/consolidate/scheduler.js +32 -0
  200. package/dist/consolidate/scheduler.js.map +1 -0
  201. package/dist/constants/chunking.d.ts +7 -0
  202. package/dist/constants/chunking.d.ts.map +1 -0
  203. package/dist/constants/chunking.js +7 -0
  204. package/dist/constants/chunking.js.map +1 -0
  205. package/dist/constants/env.d.ts +44 -0
  206. package/dist/constants/env.d.ts.map +1 -0
  207. package/dist/constants/env.js +49 -0
  208. package/dist/constants/env.js.map +1 -0
  209. package/dist/constants/index.d.ts +8 -0
  210. package/dist/constants/index.d.ts.map +1 -0
  211. package/dist/constants/index.js +8 -0
  212. package/dist/constants/index.js.map +1 -0
  213. package/dist/constants/memory.d.ts +17 -0
  214. package/dist/constants/memory.d.ts.map +1 -0
  215. package/dist/constants/memory.js +16 -0
  216. package/dist/constants/memory.js.map +1 -0
  217. package/dist/constants/paths.d.ts +23 -0
  218. package/dist/constants/paths.d.ts.map +1 -0
  219. package/dist/constants/paths.js +23 -0
  220. package/dist/constants/paths.js.map +1 -0
  221. package/dist/constants/preflight.d.ts +10 -0
  222. package/dist/constants/preflight.d.ts.map +1 -0
  223. package/dist/constants/preflight.js +10 -0
  224. package/dist/constants/preflight.js.map +1 -0
  225. package/dist/constants/retrieval.d.ts +10 -0
  226. package/dist/constants/retrieval.d.ts.map +1 -0
  227. package/dist/constants/retrieval.js +10 -0
  228. package/dist/constants/retrieval.js.map +1 -0
  229. package/dist/constants/security.d.ts +5 -0
  230. package/dist/constants/security.d.ts.map +1 -0
  231. package/dist/constants/security.js +5 -0
  232. package/dist/constants/security.js.map +1 -0
  233. package/dist/constants/timing.d.ts +36 -0
  234. package/dist/constants/timing.d.ts.map +1 -0
  235. package/dist/constants/timing.js +36 -0
  236. package/dist/constants/timing.js.map +1 -0
  237. package/dist/index.d.ts +11 -28
  238. package/dist/index.d.ts.map +1 -1
  239. package/dist/index.js +11 -27
  240. package/dist/index.js.map +1 -1
  241. package/dist/init/workspace.d.ts +15 -0
  242. package/dist/init/workspace.d.ts.map +1 -0
  243. package/dist/init/workspace.js +32 -0
  244. package/dist/init/workspace.js.map +1 -0
  245. package/dist/ipc/jsonlFramer.d.ts +9 -0
  246. package/dist/ipc/jsonlFramer.d.ts.map +1 -0
  247. package/dist/ipc/jsonlFramer.js +26 -0
  248. package/dist/ipc/jsonlFramer.js.map +1 -0
  249. package/dist/pi-extension.d.ts +0 -2
  250. package/dist/pi-extension.d.ts.map +1 -1
  251. package/dist/pi-extension.js +194 -219
  252. package/dist/pi-extension.js.map +1 -1
  253. package/dist/preflight/episodic.d.ts +20 -0
  254. package/dist/preflight/episodic.d.ts.map +1 -0
  255. package/dist/preflight/episodic.js +109 -0
  256. package/dist/preflight/episodic.js.map +1 -0
  257. package/dist/preflight/queryCache.d.ts +15 -0
  258. package/dist/preflight/queryCache.d.ts.map +1 -0
  259. package/dist/preflight/queryCache.js +46 -0
  260. package/dist/preflight/queryCache.js.map +1 -0
  261. package/dist/preflight/queryIntent.d.ts +20 -0
  262. package/dist/preflight/queryIntent.d.ts.map +1 -0
  263. package/dist/preflight/queryIntent.js +75 -0
  264. package/dist/preflight/queryIntent.js.map +1 -0
  265. package/dist/preflight/render.d.ts +8 -19
  266. package/dist/preflight/render.d.ts.map +1 -1
  267. package/dist/preflight/render.js +29 -106
  268. package/dist/preflight/render.js.map +1 -1
  269. package/dist/preflight/session.d.ts +3 -0
  270. package/dist/preflight/session.d.ts.map +1 -0
  271. package/dist/preflight/session.js +6 -0
  272. package/dist/preflight/session.js.map +1 -0
  273. package/dist/preflight/strip.d.ts +0 -8
  274. package/dist/preflight/strip.d.ts.map +1 -1
  275. package/dist/preflight/strip.js +2 -11
  276. package/dist/preflight/strip.js.map +1 -1
  277. package/dist/shutdown/enqueue.d.ts +12 -0
  278. package/dist/shutdown/enqueue.d.ts.map +1 -0
  279. package/dist/shutdown/enqueue.js +14 -0
  280. package/dist/shutdown/enqueue.js.map +1 -0
  281. package/dist/shutdown/extractPrompt.d.ts +4 -0
  282. package/dist/shutdown/extractPrompt.d.ts.map +1 -0
  283. package/dist/shutdown/extractPrompt.js +29 -0
  284. package/dist/shutdown/extractPrompt.js.map +1 -0
  285. package/dist/shutdown/processed.d.ts +9 -0
  286. package/dist/shutdown/processed.d.ts.map +1 -0
  287. package/dist/shutdown/processed.js +28 -0
  288. package/dist/shutdown/processed.js.map +1 -0
  289. package/dist/shutdown/readQueue.d.ts +4 -0
  290. package/dist/shutdown/readQueue.d.ts.map +1 -0
  291. package/dist/shutdown/readQueue.js +26 -0
  292. package/dist/shutdown/readQueue.js.map +1 -0
  293. package/dist/shutdown/runDrainJob.d.ts +26 -0
  294. package/dist/shutdown/runDrainJob.d.ts.map +1 -0
  295. package/dist/shutdown/runDrainJob.js +143 -0
  296. package/dist/shutdown/runDrainJob.js.map +1 -0
  297. package/dist/shutdown/sessionReader.d.ts +6 -0
  298. package/dist/shutdown/sessionReader.d.ts.map +1 -0
  299. package/dist/shutdown/sessionReader.js +44 -0
  300. package/dist/shutdown/sessionReader.js.map +1 -0
  301. package/dist/sidecar/client.d.ts +17 -16
  302. package/dist/sidecar/client.d.ts.map +1 -1
  303. package/dist/sidecar/client.js +64 -100
  304. package/dist/sidecar/client.js.map +1 -1
  305. package/dist/sidecar/paths.d.ts +8 -0
  306. package/dist/sidecar/paths.d.ts.map +1 -0
  307. package/dist/sidecar/paths.js +23 -0
  308. package/dist/sidecar/paths.js.map +1 -0
  309. package/dist/sidecar/protocol.d.ts +54 -0
  310. package/dist/sidecar/protocol.d.ts.map +1 -0
  311. package/dist/sidecar/protocol.js +4 -0
  312. package/dist/sidecar/protocol.js.map +1 -0
  313. package/dist/sidecar/reindexBridge.d.ts +13 -0
  314. package/dist/sidecar/reindexBridge.d.ts.map +1 -0
  315. package/dist/sidecar/reindexBridge.js +37 -0
  316. package/dist/sidecar/reindexBridge.js.map +1 -0
  317. package/dist/sidecar/server/process.d.ts +2 -0
  318. package/dist/sidecar/server/process.d.ts.map +1 -0
  319. package/dist/sidecar/server/process.js +22 -0
  320. package/dist/sidecar/server/process.js.map +1 -0
  321. package/dist/sidecar/server/query.d.ts +8 -0
  322. package/dist/sidecar/server/query.d.ts.map +1 -0
  323. package/dist/sidecar/server/query.js +7 -0
  324. package/dist/sidecar/server/query.js.map +1 -0
  325. package/dist/sidecar/server/reindex.d.ts +8 -0
  326. package/dist/sidecar/server/reindex.d.ts.map +1 -0
  327. package/dist/sidecar/server/reindex.js +12 -0
  328. package/dist/sidecar/server/reindex.js.map +1 -0
  329. package/dist/sidecar/server/server.d.ts +11 -0
  330. package/dist/sidecar/server/server.d.ts.map +1 -0
  331. package/dist/sidecar/server/server.js +76 -0
  332. package/dist/sidecar/server/server.js.map +1 -0
  333. package/dist/sidecar/server/stats.d.ts +8 -0
  334. package/dist/sidecar/server/stats.d.ts.map +1 -0
  335. package/dist/sidecar/server/stats.js +18 -0
  336. package/dist/sidecar/server/stats.js.map +1 -0
  337. package/dist/sidecar/server/vec/embedder.d.ts +2 -0
  338. package/dist/sidecar/server/vec/embedder.d.ts.map +1 -0
  339. package/dist/sidecar/server/vec/embedder.js +2 -0
  340. package/dist/sidecar/server/vec/embedder.js.map +1 -0
  341. package/dist/sidecar/server/vec/mmr.d.ts +13 -0
  342. package/dist/sidecar/server/vec/mmr.d.ts.map +1 -0
  343. package/dist/sidecar/server/vec/mmr.js +36 -0
  344. package/dist/sidecar/server/vec/mmr.js.map +1 -0
  345. package/dist/sidecar/server/vec/store.d.ts +30 -0
  346. package/dist/sidecar/server/vec/store.d.ts.map +1 -0
  347. package/dist/sidecar/server/vec/store.js +179 -0
  348. package/dist/sidecar/server/vec/store.js.map +1 -0
  349. package/dist/sidecar/sidecarManager.d.ts +10 -0
  350. package/dist/sidecar/sidecarManager.d.ts.map +1 -0
  351. package/dist/sidecar/sidecarManager.js +111 -0
  352. package/dist/sidecar/sidecarManager.js.map +1 -0
  353. package/dist/sidecar/utils.d.ts +3 -0
  354. package/dist/sidecar/utils.d.ts.map +1 -0
  355. package/dist/sidecar/utils.js +27 -0
  356. package/dist/sidecar/utils.js.map +1 -0
  357. package/dist/store/backend.d.ts +12 -0
  358. package/dist/store/backend.d.ts.map +1 -0
  359. package/dist/store/backend.js +47 -0
  360. package/dist/store/backend.js.map +1 -0
  361. package/dist/store/index.d.ts +6 -0
  362. package/dist/store/index.d.ts.map +1 -0
  363. package/dist/store/index.js +6 -0
  364. package/dist/store/index.js.map +1 -0
  365. package/dist/store/indexChunks.d.ts +9 -0
  366. package/dist/store/indexChunks.d.ts.map +1 -0
  367. package/dist/store/indexChunks.js +78 -0
  368. package/dist/store/indexChunks.js.map +1 -0
  369. package/dist/store/markdown/format.d.ts +5 -0
  370. package/dist/store/markdown/format.d.ts.map +1 -0
  371. package/dist/store/markdown/format.js +14 -0
  372. package/dist/store/markdown/format.js.map +1 -0
  373. package/dist/store/markdown/parse.d.ts +5 -0
  374. package/dist/store/markdown/parse.d.ts.map +1 -0
  375. package/dist/store/markdown/parse.js +57 -0
  376. package/dist/store/markdown/parse.js.map +1 -0
  377. package/dist/store/markdown/template.d.ts +3 -0
  378. package/dist/store/markdown/template.d.ts.map +1 -0
  379. package/dist/store/markdown/template.js +22 -0
  380. package/dist/store/markdown/template.js.map +1 -0
  381. package/dist/store/memoryStore.d.ts +69 -0
  382. package/dist/store/memoryStore.d.ts.map +1 -0
  383. package/dist/store/memoryStore.js +421 -0
  384. package/dist/store/memoryStore.js.map +1 -0
  385. package/dist/store/paths.d.ts +10 -0
  386. package/dist/store/paths.d.ts.map +1 -0
  387. package/dist/store/paths.js +19 -0
  388. package/dist/store/paths.js.map +1 -0
  389. package/dist/store/types.d.ts +38 -0
  390. package/dist/store/types.d.ts.map +1 -0
  391. package/dist/store/types.js +3 -0
  392. package/dist/store/types.js.map +1 -0
  393. package/dist/ui/memoryStatusWidget.d.ts +20 -0
  394. package/dist/ui/memoryStatusWidget.d.ts.map +1 -0
  395. package/dist/ui/memoryStatusWidget.js +51 -0
  396. package/dist/ui/memoryStatusWidget.js.map +1 -0
  397. package/dist/utils/debugLog.d.ts +4 -0
  398. package/dist/utils/debugLog.d.ts.map +1 -0
  399. package/dist/utils/debugLog.js +14 -0
  400. package/dist/utils/debugLog.js.map +1 -0
  401. package/dist/utils/fs.d.ts +26 -0
  402. package/dist/utils/fs.d.ts.map +1 -0
  403. package/dist/utils/fs.js +101 -0
  404. package/dist/utils/fs.js.map +1 -0
  405. package/dist/utils/index.d.ts +8 -0
  406. package/dist/utils/index.d.ts.map +1 -0
  407. package/dist/utils/index.js +8 -0
  408. package/dist/utils/index.js.map +1 -0
  409. package/dist/utils/paths.d.ts +22 -0
  410. package/dist/utils/paths.d.ts.map +1 -0
  411. package/dist/utils/paths.js +51 -0
  412. package/dist/utils/paths.js.map +1 -0
  413. package/dist/utils/platform.d.ts +7 -0
  414. package/dist/utils/platform.d.ts.map +1 -0
  415. package/dist/utils/platform.js +18 -0
  416. package/dist/utils/platform.js.map +1 -0
  417. package/dist/utils/scheduler.d.ts +33 -0
  418. package/dist/utils/scheduler.d.ts.map +1 -0
  419. package/dist/utils/scheduler.js +63 -0
  420. package/dist/utils/scheduler.js.map +1 -0
  421. package/dist/utils/socket.d.ts +7 -0
  422. package/dist/utils/socket.d.ts.map +1 -0
  423. package/dist/utils/socket.js +35 -0
  424. package/dist/utils/socket.js.map +1 -0
  425. package/dist/utils/time.d.ts +22 -0
  426. package/dist/utils/time.d.ts.map +1 -0
  427. package/dist/utils/time.js +42 -0
  428. package/dist/utils/time.js.map +1 -0
  429. package/package.json +40 -12
  430. package/scripts/init-memory-workspace.mjs +62 -0
  431. package/scripts/path-utils.mjs +12 -0
  432. package/scripts/platform-fs.mjs +65 -0
  433. package/scripts/postinstall.mjs +17 -0
  434. package/src/adapters/embed/factory.ts +50 -0
  435. package/src/adapters/embed/hash.ts +29 -0
  436. package/src/adapters/embed/normalize.ts +13 -0
  437. package/src/adapters/embed/ollama.ts +49 -0
  438. package/src/adapters/embed/openai.ts +46 -0
  439. package/src/adapters/embed/types.ts +9 -0
  440. package/src/adapters/http.ts +42 -0
  441. package/src/adapters/index.ts +16 -0
  442. package/src/adapters/llm/extractText.ts +6 -0
  443. package/src/adapters/llm/factory.ts +60 -0
  444. package/src/adapters/llm/index.ts +7 -0
  445. package/src/adapters/llm/modelSpec.ts +39 -0
  446. package/src/adapters/llm/ollama.ts +42 -0
  447. package/src/adapters/llm/openai-compat.ts +46 -0
  448. package/src/adapters/llm/pi-ai.ts +75 -0
  449. package/src/adapters/llm/standalone.ts +60 -0
  450. package/src/adapters/llm/types.ts +16 -0
  451. package/src/cli/init.ts +18 -0
  452. package/src/cli/jobs.ts +144 -0
  453. package/src/cli/log.ts +46 -0
  454. package/src/cli/parseArgs.ts +175 -0
  455. package/src/cli/status.ts +323 -0
  456. package/src/cli/theme.ts +26 -0
  457. package/src/cli.ts +82 -232
  458. package/src/commands/index.ts +20 -0
  459. package/src/commands/parseMemoryStatusArgs.ts +11 -0
  460. package/src/commands/parseRememberArgs.ts +55 -0
  461. package/src/commands/remember.ts +43 -0
  462. package/src/commands/status.ts +112 -0
  463. package/src/commands/types.ts +12 -0
  464. package/src/compact/index.ts +4 -0
  465. package/src/compact/parseMemoryExport.ts +71 -0
  466. package/src/compact/register.ts +57 -0
  467. package/src/compact/runSummary.ts +42 -0
  468. package/src/compact/subagentDelta.ts +22 -0
  469. package/src/compact/summaryPrompt.ts +45 -0
  470. package/src/config/agentDir.ts +24 -0
  471. package/src/config/chunking.ts +36 -0
  472. package/src/config/env.ts +97 -0
  473. package/src/config/index.ts +6 -0
  474. package/src/config/loadEnv.ts +26 -0
  475. package/src/config/preflightBudget.ts +33 -0
  476. package/src/config/retrieval.ts +50 -0
  477. package/src/consolidate/entryKey.ts +4 -0
  478. package/src/consolidate/index.ts +4 -0
  479. package/src/consolidate/mergeEntries.ts +22 -0
  480. package/src/consolidate/mergePrompt.ts +46 -0
  481. package/src/consolidate/mergeWithLlm.ts +39 -0
  482. package/src/consolidate/runJob.ts +81 -0
  483. package/src/consolidate/scheduler.ts +54 -0
  484. package/src/constants/chunking.ts +8 -0
  485. package/src/constants/env.ts +56 -0
  486. package/src/constants/index.ts +7 -0
  487. package/src/constants/memory.ts +22 -0
  488. package/src/constants/paths.ts +26 -0
  489. package/src/constants/preflight.ts +13 -0
  490. package/src/constants/retrieval.ts +10 -0
  491. package/src/constants/security.ts +5 -0
  492. package/src/constants/timing.ts +46 -0
  493. package/src/index.ts +11 -241
  494. package/src/init/workspace.ts +44 -0
  495. package/src/ipc/jsonlFramer.ts +29 -0
  496. package/src/pi-extension.ts +186 -316
  497. package/src/preflight/episodic.ts +159 -0
  498. package/src/preflight/queryCache.ts +59 -0
  499. package/src/preflight/queryIntent.ts +92 -0
  500. package/src/preflight/render.ts +34 -173
  501. package/src/preflight/session.ts +7 -0
  502. package/src/preflight/strip.ts +4 -11
  503. package/src/shutdown/enqueue.ts +29 -0
  504. package/src/shutdown/extractPrompt.ts +27 -0
  505. package/src/shutdown/processed.ts +45 -0
  506. package/src/shutdown/readQueue.ts +26 -0
  507. package/src/shutdown/runDrainJob.ts +202 -0
  508. package/src/shutdown/sessionReader.ts +61 -0
  509. package/src/sidecar/client.ts +98 -150
  510. package/src/sidecar/paths.ts +31 -0
  511. package/src/sidecar/protocol.ts +38 -0
  512. package/src/sidecar/reindexBridge.ts +52 -0
  513. package/src/sidecar/server/process.ts +27 -0
  514. package/src/sidecar/server/query.ts +16 -0
  515. package/src/sidecar/server/reindex.ts +21 -0
  516. package/src/sidecar/server/server.ts +105 -0
  517. package/src/sidecar/server/stats.ts +23 -0
  518. package/src/sidecar/server/vec/embedder.ts +1 -0
  519. package/src/sidecar/server/vec/mmr.ts +55 -0
  520. package/src/sidecar/server/vec/store.ts +232 -0
  521. package/src/sidecar/sidecarManager.ts +134 -0
  522. package/src/sidecar/utils.ts +28 -0
  523. package/src/store/backend.ts +66 -0
  524. package/src/store/index.ts +5 -0
  525. package/src/store/indexChunks.ts +89 -0
  526. package/src/store/markdown/format.ts +16 -0
  527. package/src/store/markdown/parse.ts +63 -0
  528. package/src/store/markdown/template.ts +24 -0
  529. package/src/store/memoryStore.ts +518 -0
  530. package/src/store/paths.ts +33 -0
  531. package/src/store/proper-lockfile.d.ts +3 -0
  532. package/src/store/types.ts +46 -0
  533. package/src/ui/memoryStatusWidget.ts +80 -0
  534. package/src/utils/debugLog.ts +22 -0
  535. package/src/utils/fs.ts +115 -0
  536. package/src/utils/index.ts +68 -0
  537. package/src/utils/paths.ts +67 -0
  538. package/src/utils/platform.ts +20 -0
  539. package/src/utils/scheduler.ts +98 -0
  540. package/src/utils/socket.ts +33 -0
  541. package/src/utils/time.ts +51 -0
  542. package/templates/MEMORY.md.example +22 -0
  543. package/dist/adapters/ollamaClient.d.ts +0 -11
  544. package/dist/adapters/ollamaClient.d.ts.map +0 -1
  545. package/dist/adapters/ollamaClient.js +0 -122
  546. package/dist/adapters/ollamaClient.js.map +0 -1
  547. package/dist/adapters/openaiCompatClient.d.ts +0 -11
  548. package/dist/adapters/openaiCompatClient.d.ts.map +0 -1
  549. package/dist/adapters/openaiCompatClient.js +0 -118
  550. package/dist/adapters/openaiCompatClient.js.map +0 -1
  551. package/dist/adapters/piComplete.d.ts +0 -17
  552. package/dist/adapters/piComplete.d.ts.map +0 -1
  553. package/dist/adapters/piComplete.js +0 -169
  554. package/dist/adapters/piComplete.js.map +0 -1
  555. package/dist/bundle/install.d.ts +0 -34
  556. package/dist/bundle/install.d.ts.map +0 -1
  557. package/dist/bundle/install.js +0 -183
  558. package/dist/bundle/install.js.map +0 -1
  559. package/dist/config.d.ts +0 -27
  560. package/dist/config.d.ts.map +0 -1
  561. package/dist/config.js +0 -49
  562. package/dist/config.js.map +0 -1
  563. package/dist/errclass.d.ts +0 -7
  564. package/dist/errclass.d.ts.map +0 -1
  565. package/dist/errclass.js +0 -32
  566. package/dist/errclass.js.map +0 -1
  567. package/dist/extension.d.ts +0 -24
  568. package/dist/extension.d.ts.map +0 -1
  569. package/dist/extension.js +0 -7
  570. package/dist/extension.js.map +0 -1
  571. package/dist/fallback/index.d.ts +0 -11
  572. package/dist/fallback/index.d.ts.map +0 -1
  573. package/dist/fallback/index.js +0 -16
  574. package/dist/fallback/index.js.map +0 -1
  575. package/dist/fallback/llmRerank.d.ts +0 -19
  576. package/dist/fallback/llmRerank.d.ts.map +0 -1
  577. package/dist/fallback/llmRerank.js +0 -60
  578. package/dist/fallback/llmRerank.js.map +0 -1
  579. package/dist/fallback/memoryMd.d.ts +0 -6
  580. package/dist/fallback/memoryMd.d.ts.map +0 -1
  581. package/dist/fallback/memoryMd.js +0 -35
  582. package/dist/fallback/memoryMd.js.map +0 -1
  583. package/dist/fallback/sessionIndex.d.ts +0 -35
  584. package/dist/fallback/sessionIndex.d.ts.map +0 -1
  585. package/dist/fallback/sessionIndex.js +0 -287
  586. package/dist/fallback/sessionIndex.js.map +0 -1
  587. package/dist/fallback/sessionSearch.d.ts +0 -18
  588. package/dist/fallback/sessionSearch.d.ts.map +0 -1
  589. package/dist/fallback/sessionSearch.js +0 -234
  590. package/dist/fallback/sessionSearch.js.map +0 -1
  591. package/dist/local/graphQuery.d.ts +0 -21
  592. package/dist/local/graphQuery.d.ts.map +0 -1
  593. package/dist/local/graphQuery.js +0 -170
  594. package/dist/local/graphQuery.js.map +0 -1
  595. package/dist/paths.d.ts +0 -7
  596. package/dist/paths.d.ts.map +0 -1
  597. package/dist/paths.js +0 -26
  598. package/dist/paths.js.map +0 -1
  599. package/dist/preflight/detectIntents.d.ts +0 -102
  600. package/dist/preflight/detectIntents.d.ts.map +0 -1
  601. package/dist/preflight/detectIntents.js +0 -624
  602. package/dist/preflight/detectIntents.js.map +0 -1
  603. package/dist/preflight/hook.d.ts +0 -58
  604. package/dist/preflight/hook.d.ts.map +0 -1
  605. package/dist/preflight/hook.js +0 -77
  606. package/dist/preflight/hook.js.map +0 -1
  607. package/dist/service.d.ts +0 -56
  608. package/dist/service.d.ts.map +0 -1
  609. package/dist/service.js +0 -200
  610. package/dist/service.js.map +0 -1
  611. package/dist/settings.d.ts +0 -38
  612. package/dist/settings.d.ts.map +0 -1
  613. package/dist/settings.js +0 -68
  614. package/dist/settings.js.map +0 -1
  615. package/dist/sidecar/bundle.d.ts +0 -19
  616. package/dist/sidecar/bundle.d.ts.map +0 -1
  617. package/dist/sidecar/bundle.js +0 -39
  618. package/dist/sidecar/bundle.js.map +0 -1
  619. package/dist/sidecar/process.d.ts +0 -14
  620. package/dist/sidecar/process.d.ts.map +0 -1
  621. package/dist/sidecar/process.js +0 -138
  622. package/dist/sidecar/process.js.map +0 -1
  623. package/dist/tools/memoryAppend.d.ts +0 -37
  624. package/dist/tools/memoryAppend.d.ts.map +0 -1
  625. package/dist/tools/memoryAppend.js +0 -99
  626. package/dist/tools/memoryAppend.js.map +0 -1
  627. package/dist/tools/memoryRecall.d.ts +0 -113
  628. package/dist/tools/memoryRecall.d.ts.map +0 -1
  629. package/dist/tools/memoryRecall.js +0 -325
  630. package/dist/tools/memoryRecall.js.map +0 -1
  631. package/dist/trainer/bundleBuilder.d.ts +0 -30
  632. package/dist/trainer/bundleBuilder.d.ts.map +0 -1
  633. package/dist/trainer/bundleBuilder.js +0 -106
  634. package/dist/trainer/bundleBuilder.js.map +0 -1
  635. package/dist/trainer/bundleLoader.d.ts +0 -12
  636. package/dist/trainer/bundleLoader.d.ts.map +0 -1
  637. package/dist/trainer/bundleLoader.js +0 -59
  638. package/dist/trainer/bundleLoader.js.map +0 -1
  639. package/dist/trainer/deltaMerge.d.ts +0 -38
  640. package/dist/trainer/deltaMerge.d.ts.map +0 -1
  641. package/dist/trainer/deltaMerge.js +0 -183
  642. package/dist/trainer/deltaMerge.js.map +0 -1
  643. package/dist/trainer/entityResolver.d.ts +0 -27
  644. package/dist/trainer/entityResolver.d.ts.map +0 -1
  645. package/dist/trainer/entityResolver.js +0 -92
  646. package/dist/trainer/entityResolver.js.map +0 -1
  647. package/dist/trainer/extractFacts.d.ts +0 -67
  648. package/dist/trainer/extractFacts.d.ts.map +0 -1
  649. package/dist/trainer/extractFacts.js +0 -213
  650. package/dist/trainer/extractFacts.js.map +0 -1
  651. package/dist/trainer/index.d.ts +0 -54
  652. package/dist/trainer/index.d.ts.map +0 -1
  653. package/dist/trainer/index.js +0 -82
  654. package/dist/trainer/index.js.map +0 -1
  655. package/dist/trainer/llmExtractor.d.ts +0 -16
  656. package/dist/trainer/llmExtractor.d.ts.map +0 -1
  657. package/dist/trainer/llmExtractor.js +0 -146
  658. package/dist/trainer/llmExtractor.js.map +0 -1
  659. package/dist/trainer/marker.d.ts +0 -10
  660. package/dist/trainer/marker.d.ts.map +0 -1
  661. package/dist/trainer/marker.js +0 -28
  662. package/dist/trainer/marker.js.map +0 -1
  663. package/dist/trainer/scheduler.d.ts +0 -31
  664. package/dist/trainer/scheduler.d.ts.map +0 -1
  665. package/dist/trainer/scheduler.js +0 -72
  666. package/dist/trainer/scheduler.js.map +0 -1
  667. package/dist/trainer/sessionLoader.d.ts +0 -23
  668. package/dist/trainer/sessionLoader.d.ts.map +0 -1
  669. package/dist/trainer/sessionLoader.js +0 -182
  670. package/dist/trainer/sessionLoader.js.map +0 -1
  671. package/dist/types.d.ts +0 -135
  672. package/dist/types.d.ts.map +0 -1
  673. package/dist/types.js +0 -8
  674. package/dist/types.js.map +0 -1
  675. package/src/adapters/ollamaClient.ts +0 -179
  676. package/src/adapters/openaiCompatClient.ts +0 -155
  677. package/src/adapters/piComplete.ts +0 -233
  678. package/src/bundle/install.ts +0 -206
  679. package/src/cache/memoryCaches.ts +0 -72
  680. package/src/config.ts +0 -92
  681. package/src/errclass.ts +0 -37
  682. package/src/extension.ts +0 -23
  683. package/src/fallback/index.ts +0 -24
  684. package/src/fallback/llmRerank.ts +0 -97
  685. package/src/fallback/memoryMd.ts +0 -36
  686. package/src/fallback/sessionIndex.ts +0 -327
  687. package/src/fallback/sessionSearch.ts +0 -261
  688. package/src/local/graphQuery.ts +0 -252
  689. package/src/paths.ts +0 -28
  690. package/src/preflight/detectIntents.ts +0 -660
  691. package/src/preflight/hook.ts +0 -199
  692. package/src/service.ts +0 -306
  693. package/src/settings.ts +0 -126
  694. package/src/sidecar/bundle.ts +0 -52
  695. package/src/sidecar/process.ts +0 -160
  696. package/src/tools/memoryAppend.ts +0 -113
  697. package/src/tools/memoryRecall.ts +0 -388
  698. package/src/trainer/bundleBuilder.ts +0 -192
  699. package/src/trainer/bundleLoader.ts +0 -105
  700. package/src/trainer/deltaMerge.ts +0 -221
  701. package/src/trainer/entityResolver.ts +0 -140
  702. package/src/trainer/extractFacts.ts +0 -312
  703. package/src/trainer/index.ts +0 -147
  704. package/src/trainer/llmExtractor.ts +0 -206
  705. package/src/trainer/marker.ts +0 -30
  706. package/src/trainer/scheduler.ts +0 -107
  707. package/src/trainer/sessionLoader.ts +0 -225
  708. package/src/types.ts +0 -168
@@ -0,0 +1,57 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+
3
+ import type { LlmClient } from "../adapters/llm/types.js";
4
+ import { isSubagentSession } from "../preflight/session.js";
5
+ import type { MemoryStore } from "../store/memoryStore.js";
6
+ import { runDualPurposeCompactionSummary } from "./runSummary.js";
7
+
8
+ export type CompactHandlerDeps = {
9
+ getMemoryStore(): MemoryStore | null;
10
+ getLlmClient(): LlmClient | null;
11
+ onCompactionIngested?(): Promise<void>;
12
+ };
13
+
14
+ export function registerCompactHandlers(pi: ExtensionAPI, deps: CompactHandlerDeps): void {
15
+ pi.on("session_before_compact", async (event, ctx) => {
16
+ const llm = deps.getLlmClient();
17
+ if (!llm) return;
18
+
19
+ const { preparation, signal } = event;
20
+ const workingUi = ctx.hasUI
21
+ ? {
22
+ show: () => ctx.ui.setWorkingMessage("Summarizing for memory…"),
23
+ clear: () => ctx.ui.setWorkingMessage(),
24
+ }
25
+ : null;
26
+
27
+ try {
28
+ workingUi?.show();
29
+ const summary = await runDualPurposeCompactionSummary(preparation, llm, signal);
30
+ if (!summary) return;
31
+
32
+ return {
33
+ compaction: {
34
+ summary,
35
+ firstKeptEntryId: preparation.firstKeptEntryId,
36
+ tokensBefore: preparation.tokensBefore,
37
+ },
38
+ };
39
+ } catch {
40
+ return;
41
+ } finally {
42
+ workingUi?.clear();
43
+ }
44
+ });
45
+
46
+ pi.on("session_compact", (event, ctx) => {
47
+ const store = deps.getMemoryStore();
48
+ if (!store) return;
49
+
50
+ store.appendFromCompaction({
51
+ compactionId: event.compactionEntry.id,
52
+ summary: event.compactionEntry.summary,
53
+ subagent: isSubagentSession(ctx),
54
+ onComplete: () => deps.onCompactionIngested?.(),
55
+ });
56
+ });
57
+ }
@@ -0,0 +1,42 @@
1
+ import type { AgentMessage } from "@earendil-works/pi-agent-core";
2
+ import type { SessionBeforeCompactEvent } from "@earendil-works/pi-coding-agent";
3
+ import { convertToLlm, serializeConversation } from "@earendil-works/pi-coding-agent";
4
+
5
+ import type { LlmClient } from "../adapters/llm/types.js";
6
+ import { stripPrivateMemory } from "../preflight/strip.js";
7
+ import { buildCompactionSummaryPrompt } from "./summaryPrompt.js";
8
+
9
+ type CompactionPreparation = SessionBeforeCompactEvent["preparation"];
10
+
11
+ function stripPrivateMemoryFromMessages(messages: AgentMessage[]): AgentMessage[] {
12
+ return messages.map((message) => {
13
+ if (message.role !== "user") return message;
14
+ if (typeof message.content === "string") {
15
+ return { ...message, content: stripPrivateMemory(message.content) };
16
+ }
17
+ return {
18
+ ...message,
19
+ content: message.content.map((block) =>
20
+ block.type === "text"
21
+ ? { ...block, text: stripPrivateMemory(block.text) }
22
+ : block,
23
+ ),
24
+ } as AgentMessage;
25
+ });
26
+ }
27
+
28
+ export async function runDualPurposeCompactionSummary(
29
+ preparation: CompactionPreparation,
30
+ llm: LlmClient,
31
+ signal?: AbortSignal,
32
+ ): Promise<string | null> {
33
+ const allMessages = stripPrivateMemoryFromMessages([
34
+ ...preparation.messagesToSummarize,
35
+ ...preparation.turnPrefixMessages,
36
+ ]);
37
+
38
+ const conversationText = serializeConversation(convertToLlm(allMessages));
39
+ const prompt = buildCompactionSummaryPrompt(conversationText, preparation.previousSummary);
40
+ const summary = await llm.complete(prompt, signal);
41
+ return summary.trim() || null;
42
+ }
@@ -0,0 +1,22 @@
1
+ import type { ParsedEntry, StoreMemoryEntry } from "../store/types.js";
2
+
3
+ function entryKey(entry: { section: string; content: string }): string {
4
+ return `${entry.section}\0${entry.content.trim()}`;
5
+ }
6
+
7
+ /** Keep only Memory Export facts not already present in MEMORY (parent/root dedup). */
8
+ export function filterCompactionDelta(
9
+ entries: StoreMemoryEntry[],
10
+ existing: ParsedEntry[],
11
+ ): StoreMemoryEntry[] {
12
+ const known = new Set(existing.map(entryKey));
13
+ return entries.filter((entry) => !known.has(entryKey(entry)));
14
+ }
15
+
16
+ /** Subagent clone: summary had export bullets but nothing new vs parent memory. */
17
+ export function shouldSkipSubagentCompactionIngest(
18
+ parsed: StoreMemoryEntry[],
19
+ delta: StoreMemoryEntry[],
20
+ ): boolean {
21
+ return parsed.length > 0 && delta.length === 0;
22
+ }
@@ -0,0 +1,45 @@
1
+ export const DUAL_PURPOSE_SUMMARY_TEMPLATE = `## Session Context
2
+ <!-- Goal / Progress / Next Actions / key file changes for continuing THIS session -->
3
+
4
+ ## Memory Export
5
+ <!-- Cross-session durable facts only; omit this entire section if nothing worth keeping -->
6
+
7
+ ### Preferences
8
+
9
+ ### Conventions
10
+
11
+ ### Findings
12
+
13
+ ### Todos
14
+ `;
15
+
16
+ export function buildCompactionSummaryPrompt(
17
+ conversationText: string,
18
+ previousSummary?: string,
19
+ ): string {
20
+ const previousContext = previousSummary
21
+ ? `\n\nPrevious compaction summary for context:\n${previousSummary.trim()}`
22
+ : "";
23
+
24
+ return `You are summarizing a coding-agent conversation for two purposes at once.
25
+
26
+ 1. **Session Context** — everything needed to continue THIS session after context compaction.
27
+ 2. **Memory Export** — only durable facts that should persist across NEW sessions (preferences, conventions, findings, todos).
28
+
29
+ Rules:
30
+ - Output markdown ONLY, following the exact section structure below.
31
+ - Session Context: goals, progress, decisions, blockers, next actions, important file paths.
32
+ - Memory Export: bullet lists under ### Preferences / Conventions / Findings / Todos.
33
+ - Each Memory Export bullet is one standalone fact (no pronouns like "we" without context).
34
+ - Skip Memory Export subsections that have nothing new; omit the whole Memory Export section if empty.
35
+ - Do NOT include <private_memory> blocks or ephemeral tool noise in Memory Export.
36
+ ${previousContext}
37
+
38
+ Required format:
39
+
40
+ ${DUAL_PURPOSE_SUMMARY_TEMPLATE}
41
+
42
+ <conversation>
43
+ ${conversationText}
44
+ </conversation>`;
45
+ }
@@ -0,0 +1,24 @@
1
+ import { defaultMemoryAgentDir, expandHomePath } from "../utils/paths.js";
2
+ import { readPiMemoryEnv } from "./env.js";
3
+
4
+ export type ResolveMemoryAgentDirOptions = {
5
+ env?: NodeJS.ProcessEnv;
6
+ };
7
+
8
+ /**
9
+ * Memory data root: `PI_MEMORY_AGENT_DIR` when set, otherwise ~/.pi/pi-memory-data.
10
+ * All MEMORY.md, sidecar socket, and `memory.vec.sqlite` live under this path.
11
+ */
12
+ export function resolveMemoryAgentDir(options: ResolveMemoryAgentDirOptions = {}): string {
13
+ const env = options.env ?? process.env;
14
+ const fromEnv = readPiMemoryEnv(env).agentDir?.trim();
15
+ if (fromEnv) return expandHomePath(fromEnv);
16
+ return defaultMemoryAgentDir();
17
+ }
18
+
19
+ /** CLI: explicit flag, then `resolveMemoryAgentDir`. */
20
+ export function resolveAgentDirFromEnv(explicit?: string, env = process.env): string {
21
+ const fromArg = explicit?.trim();
22
+ if (fromArg) return expandHomePath(fromArg);
23
+ return resolveMemoryAgentDir({ env });
24
+ }
@@ -0,0 +1,36 @@
1
+ import {
2
+ CHUNKING_DISABLED_MAX_CHARS,
3
+ DEFAULT_CHUNK_MAX_CHARS,
4
+ MAX_CHUNK_MAX_CHARS,
5
+ MIN_CHUNK_MAX_CHARS,
6
+ } from "../constants/chunking.js";
7
+ import { ENV_KEYS } from "../constants/env.js";
8
+
9
+ export type ChunkingConfig = {
10
+ /** Max chars per chunk body; <=0 keeps one chunk per entry. */
11
+ maxChars: number;
12
+ };
13
+
14
+ function parseOptionalInt(raw: string | undefined): number | undefined {
15
+ if (!raw?.trim()) return undefined;
16
+ const value = Number.parseInt(raw, 10);
17
+ return Number.isFinite(value) ? value : undefined;
18
+ }
19
+
20
+ export function readChunkingConfig(env: NodeJS.ProcessEnv = process.env): ChunkingConfig {
21
+ const raw = parseOptionalInt(env[ENV_KEYS.CHUNK_MAX_CHARS]);
22
+ const maxChars = raw ?? DEFAULT_CHUNK_MAX_CHARS;
23
+
24
+ if (maxChars <= CHUNKING_DISABLED_MAX_CHARS) {
25
+ return { maxChars: CHUNKING_DISABLED_MAX_CHARS };
26
+ }
27
+
28
+ return {
29
+ maxChars: Math.min(MAX_CHUNK_MAX_CHARS, Math.max(MIN_CHUNK_MAX_CHARS, maxChars)),
30
+ };
31
+ }
32
+
33
+ export {
34
+ CHUNKING_DISABLED_MAX_CHARS,
35
+ DEFAULT_CHUNK_MAX_CHARS,
36
+ } from "../constants/chunking.js";
@@ -0,0 +1,97 @@
1
+ import type { EmbedderProvider } from "../constants/env.js";
2
+ import {
3
+ DEFAULT_EMBEDDER,
4
+ DEFAULT_EMBED_DIM_FALLBACK,
5
+ DEFAULT_HASH_EMBED_DIM,
6
+ DEFAULT_HELPER_MODEL_SPEC,
7
+ DEFAULT_OLLAMA_BASE_URL,
8
+ DEFAULT_OLLAMA_EMBED_MODEL,
9
+ DEFAULT_OPENAI_EMBED_MODEL,
10
+ ENV_KEYS,
11
+ FALLBACK_OPENAI_API_KEY_ENV,
12
+ KNOWN_EMBED_DIMS,
13
+ } from "../constants/env.js";
14
+ import {
15
+ DEFAULT_CONSOLIDATE_DEBOUNCE_MS,
16
+ DEFAULT_HTTP_TIMEOUT_MS,
17
+ DEFAULT_PREFLIGHT_BUDGET_MS,
18
+ DEFAULT_REINDEX_DEBOUNCE_MS,
19
+ } from "../constants/timing.js";
20
+ import { resolvePreflightBudget } from "./preflightBudget.js";
21
+
22
+ export type PiMemoryEnv = {
23
+ embedder: EmbedderProvider;
24
+ openaiApiKey?: string;
25
+ openaiEmbedModel: string;
26
+ ollamaBaseUrl: string;
27
+ ollamaEmbedModel: string;
28
+ ollamaLlmBaseUrl: string;
29
+ ollamaLlmModel?: string;
30
+ helperModel: string;
31
+ helperApiKey?: string;
32
+ openaiCompatBaseUrl?: string;
33
+ openaiCompatModel?: string;
34
+ openaiCompatApiKey?: string;
35
+ embedDimOverride?: number;
36
+ httpTimeoutMs: number;
37
+ preflightBudgetMs: number;
38
+ reindexDebounceMs: number;
39
+ consolidateDebounceMs: number;
40
+ agentDir?: string;
41
+ envFile?: string;
42
+ };
43
+
44
+ function parseEmbedder(value: string | undefined): EmbedderProvider {
45
+ if (value === "openai" || value === "ollama" || value === "hash") return value;
46
+ return DEFAULT_EMBEDDER;
47
+ }
48
+
49
+ /** Read pi-memory env from process.env (after optional loadEnv). */
50
+ export function readPiMemoryEnv(env: NodeJS.ProcessEnv = process.env): PiMemoryEnv {
51
+ const embedDimRaw = env[ENV_KEYS.EMBED_DIM]?.trim();
52
+ const embedDimOverride = embedDimRaw ? Number.parseInt(embedDimRaw, 10) : undefined;
53
+
54
+ return {
55
+ embedder: parseEmbedder(env[ENV_KEYS.EMBEDDER]),
56
+ openaiApiKey: env[ENV_KEYS.OPENAI_API_KEY] ?? env[FALLBACK_OPENAI_API_KEY_ENV],
57
+ openaiEmbedModel: env[ENV_KEYS.OPENAI_EMBED_MODEL] ?? DEFAULT_OPENAI_EMBED_MODEL,
58
+ ollamaBaseUrl: env[ENV_KEYS.OLLAMA_BASE_URL] ?? DEFAULT_OLLAMA_BASE_URL,
59
+ ollamaEmbedModel: env[ENV_KEYS.OLLAMA_EMBED_MODEL] ?? DEFAULT_OLLAMA_EMBED_MODEL,
60
+ ollamaLlmBaseUrl:
61
+ env[ENV_KEYS.OLLAMA_LLM_BASE_URL] ?? env[ENV_KEYS.OLLAMA_BASE_URL] ?? DEFAULT_OLLAMA_BASE_URL,
62
+ ollamaLlmModel: env[ENV_KEYS.OLLAMA_LLM_MODEL]?.trim() || undefined,
63
+ helperModel: env[ENV_KEYS.HELPER_MODEL] ?? DEFAULT_HELPER_MODEL_SPEC,
64
+ helperApiKey: env[ENV_KEYS.HELPER_API_KEY]?.trim() || undefined,
65
+ openaiCompatBaseUrl: env[ENV_KEYS.OPENAI_COMPAT_BASE_URL]?.trim() || undefined,
66
+ openaiCompatModel: env[ENV_KEYS.OPENAI_COMPAT_MODEL]?.trim() || undefined,
67
+ openaiCompatApiKey: env[ENV_KEYS.OPENAI_COMPAT_API_KEY]?.trim() || undefined,
68
+ embedDimOverride: Number.isFinite(embedDimOverride) ? embedDimOverride : undefined,
69
+ httpTimeoutMs: Number.parseInt(env[ENV_KEYS.HTTP_TIMEOUT_MS] ?? String(DEFAULT_HTTP_TIMEOUT_MS), 10),
70
+ preflightBudgetMs: resolvePreflightBudget(
71
+ Number.parseInt(
72
+ env[ENV_KEYS.PREFLIGHT_BUDGET_MS] ??
73
+ env[ENV_KEYS.PREFLIGHT_TIMEOUT_MS] ??
74
+ String(DEFAULT_PREFLIGHT_BUDGET_MS),
75
+ 10,
76
+ ),
77
+ ).totalMs,
78
+ reindexDebounceMs: Number.parseInt(
79
+ env[ENV_KEYS.REINDEX_DEBOUNCE_MS] ?? String(DEFAULT_REINDEX_DEBOUNCE_MS),
80
+ 10,
81
+ ),
82
+ consolidateDebounceMs: Number.parseInt(
83
+ env[ENV_KEYS.CONSOLIDATE_DEBOUNCE_MS] ?? String(DEFAULT_CONSOLIDATE_DEBOUNCE_MS),
84
+ 10,
85
+ ),
86
+ agentDir: env[ENV_KEYS.AGENT_DIR]?.trim() || undefined,
87
+ envFile: env[ENV_KEYS.ENV_FILE],
88
+ };
89
+ }
90
+
91
+ export function resolveEmbedDim(model: string, override?: number): number {
92
+ if (override !== undefined) return override;
93
+ return KNOWN_EMBED_DIMS[model] ?? DEFAULT_EMBED_DIM_FALLBACK;
94
+ }
95
+
96
+ export type { EmbedderProvider } from "../constants/env.js";
97
+ export { KNOWN_EMBED_DIMS, DEFAULT_HASH_EMBED_DIM } from "../constants/env.js";
@@ -0,0 +1,6 @@
1
+ export { KNOWN_EMBED_DIMS, readPiMemoryEnv, resolveEmbedDim, type EmbedderProvider, type PiMemoryEnv } from "./env.js";
2
+ export { readRetrievalConfig, type RetrievalConfig } from "./retrieval.js";
3
+ export { readChunkingConfig, type ChunkingConfig } from "./chunking.js";
4
+ export { resolvePreflightBudget, type PreflightBudget } from "./preflightBudget.js";
5
+ export { resolveAgentDirFromEnv, resolveMemoryAgentDir, type ResolveMemoryAgentDirOptions } from "./agentDir.js";
6
+ export { loadEnv } from "./loadEnv.js";
@@ -0,0 +1,26 @@
1
+ import { config } from "dotenv";
2
+
3
+ import { defaultPiMemoryEnvFile } from "../utils/paths.js";
4
+ import { joinPath, pathExists } from "../utils/fs.js";
5
+ import { readPiMemoryEnv } from "./env.js";
6
+
7
+ /**
8
+ * Load pi-memory env into process.env (does not override existing vars).
9
+ *
10
+ * Search order:
11
+ * 1. PI_MEMORY_ENV_FILE (explicit override)
12
+ * 2. cwd `.env` / `.env.local` (project-local dev)
13
+ * 3. ~/.pi/agent/pi-memory.env (recommended)
14
+ */
15
+ export function loadEnv(cwd = process.cwd()): void {
16
+ const paths: string[] = [];
17
+ const explicit = readPiMemoryEnv(process.env).envFile;
18
+ if (explicit) paths.push(explicit);
19
+
20
+ paths.push(joinPath(cwd, ".env"), joinPath(cwd, ".env.local"), defaultPiMemoryEnvFile());
21
+
22
+ for (const path of paths) {
23
+ if (!path || !pathExists(path)) continue;
24
+ config({ path, override: false, quiet: true });
25
+ }
26
+ }
@@ -0,0 +1,33 @@
1
+ import {
2
+ DEFAULT_PREFLIGHT_BUDGET_MS,
3
+ MAX_PREFLIGHT_BUDGET_MS,
4
+ MIN_PREFLIGHT_BUDGET_MS,
5
+ MIN_PREFLIGHT_SIDECAR_RESERVE_MS,
6
+ } from "../constants/timing.js";
7
+
8
+ export type PreflightBudget = {
9
+ totalMs: number;
10
+ intentMs: number;
11
+ sidecarMs: number;
12
+ };
13
+
14
+ function clamp(value: number, min: number, max: number): number {
15
+ return Math.min(max, Math.max(min, value));
16
+ }
17
+
18
+ /** Split shared preflight deadline between QueryIntent LLM and sidecar query. */
19
+ export function resolvePreflightBudget(totalMs = DEFAULT_PREFLIGHT_BUDGET_MS): PreflightBudget {
20
+ const total = clamp(totalMs, MIN_PREFLIGHT_BUDGET_MS, MAX_PREFLIGHT_BUDGET_MS);
21
+ const intentMs = clamp(
22
+ Math.floor(total * 0.3),
23
+ 100,
24
+ total - MIN_PREFLIGHT_SIDECAR_RESERVE_MS,
25
+ );
26
+ return {
27
+ totalMs: total,
28
+ intentMs,
29
+ sidecarMs: total - intentMs,
30
+ };
31
+ }
32
+
33
+ export { DEFAULT_PREFLIGHT_BUDGET_MS } from "../constants/timing.js";
@@ -0,0 +1,50 @@
1
+ import {
2
+ CANDIDATE_POOL_MULTIPLIER,
3
+ DEFAULT_MIN_RELEVANCE,
4
+ DEFAULT_TOP_K,
5
+ MAX_MMR_LAMBDA,
6
+ MAX_TOP_K,
7
+ MIN_MMR_LAMBDA,
8
+ MIN_TOP_K,
9
+ MMR_LAMBDA,
10
+ } from "../constants/retrieval.js";
11
+ import { ENV_KEYS } from "../constants/env.js";
12
+
13
+ export type RetrievalConfig = {
14
+ topK: number;
15
+ mmrLambda: number;
16
+ minRelevance: number;
17
+ candidatePoolMultiplier: number;
18
+ };
19
+
20
+ function clamp(value: number, min: number, max: number): number {
21
+ return Math.min(max, Math.max(min, value));
22
+ }
23
+
24
+ function parseOptionalFloat(raw: string | undefined): number | undefined {
25
+ if (!raw?.trim()) return undefined;
26
+ const value = Number.parseFloat(raw);
27
+ return Number.isFinite(value) ? value : undefined;
28
+ }
29
+
30
+ function parseOptionalInt(raw: string | undefined): number | undefined {
31
+ if (!raw?.trim()) return undefined;
32
+ const value = Number.parseInt(raw, 10);
33
+ return Number.isFinite(value) ? value : undefined;
34
+ }
35
+
36
+ /** Vector retrieval tuning (sidecar query path). */
37
+ export function readRetrievalConfig(env: NodeJS.ProcessEnv = process.env): RetrievalConfig {
38
+ const topKRaw = parseOptionalInt(env[ENV_KEYS.TOP_K]);
39
+ const mmrRaw = parseOptionalFloat(env[ENV_KEYS.MMR_LAMBDA]);
40
+ const minRelRaw = parseOptionalFloat(env[ENV_KEYS.MIN_RELEVANCE]);
41
+
42
+ return {
43
+ topK: clamp(topKRaw ?? DEFAULT_TOP_K, MIN_TOP_K, MAX_TOP_K),
44
+ mmrLambda: clamp(mmrRaw ?? MMR_LAMBDA, MIN_MMR_LAMBDA, MAX_MMR_LAMBDA),
45
+ minRelevance: clamp(minRelRaw ?? DEFAULT_MIN_RELEVANCE, 0, 1),
46
+ candidatePoolMultiplier: CANDIDATE_POOL_MULTIPLIER,
47
+ };
48
+ }
49
+
50
+ export { DEFAULT_MIN_RELEVANCE, DEFAULT_TOP_K, MMR_LAMBDA } from "../constants/retrieval.js";
@@ -0,0 +1,4 @@
1
+ /** Stable dedupe key for memory entries (section + trimmed content). */
2
+ export function entryDedupeKey(entry: { section: string; content: string }): string {
3
+ return `${entry.section}\0${entry.content.trim()}`;
4
+ }
@@ -0,0 +1,4 @@
1
+ export { dedupeEntries } from "./mergeEntries.js";
2
+ export { mergeEntriesWithLlm } from "./mergeWithLlm.js";
3
+ export { runConsolidateJob, type RunConsolidateJobOptions, type RunConsolidateJobResult } from "./runJob.js";
4
+ export { createConsolidateScheduler, startConsolidateInterval, type ConsolidateScheduler } from "./scheduler.js";
@@ -0,0 +1,22 @@
1
+ import orderBy from "lodash/orderBy.js";
2
+
3
+ import { entryDedupeKey } from "./entryKey.js";
4
+ import type { ParsedEntry } from "../store/types.js";
5
+ import { MEMORY_SECTIONS } from "../store/types.js";
6
+
7
+ const SECTION_RANK = new Map(MEMORY_SECTIONS.map((section, index) => [section, index]));
8
+
9
+ /** Rule-based dedupe before optional LLM merge. Prefer user-authored on conflict. */
10
+ export function dedupeEntries(entries: ParsedEntry[]): ParsedEntry[] {
11
+ const byKey = new Map<string, ParsedEntry>();
12
+
13
+ for (const entry of entries) {
14
+ const key = entryDedupeKey(entry);
15
+ const existing = byKey.get(key);
16
+ if (!existing || entry.userAuthored) {
17
+ byKey.set(key, entry);
18
+ }
19
+ }
20
+
21
+ return orderBy([...byKey.values()], [(entry) => SECTION_RANK.get(entry.section) ?? MEMORY_SECTIONS.length]);
22
+ }
@@ -0,0 +1,46 @@
1
+ import groupBy from "lodash/groupBy.js";
2
+
3
+ import type { ParsedEntry } from "../store/types.js";
4
+ import { formatEntryLine, formatSectionHeader } from "../store/markdown/format.js";
5
+ import { MEMORY_SECTIONS } from "../store/types.js";
6
+
7
+ export function formatEntriesForConsolidation(entries: ParsedEntry[]): string {
8
+ const grouped = groupBy(entries, "section");
9
+ const lines: string[] = [];
10
+
11
+ for (const section of MEMORY_SECTIONS) {
12
+ const sectionEntries = grouped[section] ?? [];
13
+ if (sectionEntries.length === 0) continue;
14
+ lines.push(formatSectionHeader(section), "");
15
+ for (const entry of sectionEntries) {
16
+ lines.push(
17
+ formatEntryLine({
18
+ id: entry.id,
19
+ section: entry.section,
20
+ content: entry.content,
21
+ userAuthored: entry.userAuthored,
22
+ timestamp: entry.timestamp,
23
+ }),
24
+ );
25
+ }
26
+ lines.push("");
27
+ }
28
+
29
+ return lines.join("\n").trim();
30
+ }
31
+
32
+ export function buildConsolidateMergePrompt(entriesMarkdown: string): string {
33
+ return `You are consolidating a durable MEMORY.md note file for a coding agent.
34
+
35
+ Merge the entries below:
36
+ - Remove exact duplicates and near-duplicates (keep the clearer wording).
37
+ - Remove completed or obsolete TODO items.
38
+ - NEVER remove or rewrite lines marked [user] (user-authored).
39
+ - Keep Preferences, Conventions, Findings, and Todos factual and concise.
40
+ - Output ONLY valid markdown with sections: ## Preferences, ## Conventions, ## Findings, ## Todos
41
+ - Each item is a bullet line using the same format as input (with <!-- id:... --> metadata when present).
42
+
43
+ <memory>
44
+ ${entriesMarkdown}
45
+ </memory>`;
46
+ }
@@ -0,0 +1,39 @@
1
+ import keyBy from "lodash/keyBy.js";
2
+
3
+ import type { LlmClient } from "../adapters/llm/types.js";
4
+ import { parseMemoryMarkdown } from "../store/markdown/parse.js";
5
+ import type { ParsedEntry } from "../store/types.js";
6
+ import { entryDedupeKey } from "./entryKey.js";
7
+ import { buildConsolidateMergePrompt, formatEntriesForConsolidation } from "./mergePrompt.js";
8
+ import { dedupeEntries } from "./mergeEntries.js";
9
+
10
+ function preserveUserAuthored(original: ParsedEntry[], merged: ParsedEntry[]): ParsedEntry[] {
11
+ const userByContent = keyBy(
12
+ original.filter((entry) => entry.userAuthored),
13
+ entryDedupeKey,
14
+ );
15
+
16
+ return merged.map((entry) => {
17
+ const user = userByContent[entryDedupeKey(entry)];
18
+ if (user) {
19
+ return { ...entry, id: user.id, userAuthored: true, timestamp: user.timestamp };
20
+ }
21
+ return entry;
22
+ });
23
+ }
24
+
25
+ export async function mergeEntriesWithLlm(
26
+ entries: ParsedEntry[],
27
+ llm: LlmClient,
28
+ signal?: AbortSignal,
29
+ ): Promise<ParsedEntry[]> {
30
+ const deduped = dedupeEntries(entries);
31
+ if (deduped.length === 0) return deduped;
32
+
33
+ const prompt = buildConsolidateMergePrompt(formatEntriesForConsolidation(deduped));
34
+ const raw = await llm.complete(prompt, signal);
35
+ const parsed = parseMemoryMarkdown(raw, "consolidate-llm");
36
+ if (parsed.length === 0) return deduped;
37
+
38
+ return preserveUserAuthored(deduped, parsed);
39
+ }
@@ -0,0 +1,81 @@
1
+ import type { LlmClient } from "../adapters/llm/types.js";
2
+ import { sidecarQueryCache } from "../preflight/queryCache.js";
3
+ import { ensureSidecarRunning } from "../sidecar/sidecarManager.js";
4
+ import { reindex } from "../sidecar/client.js";
5
+ import { resolveSidecarPaths } from "../sidecar/paths.js";
6
+ import type { MemoryStore } from "../store/memoryStore.js";
7
+
8
+ const NOOP_LLM: LlmClient = {
9
+ async complete() {
10
+ throw new Error("LLM unavailable");
11
+ },
12
+ };
13
+
14
+ export type ConsolidateJobStats = {
15
+ entriesBefore: number;
16
+ entriesAfter: number;
17
+ overflowBefore: number;
18
+ overflowAfter: number;
19
+ indexGeneration?: number;
20
+ };
21
+
22
+ export type RunConsolidateJobOptions = {
23
+ store: MemoryStore;
24
+ agentDir: string;
25
+ llm?: LlmClient | null;
26
+ cronFired?: boolean;
27
+ force?: boolean;
28
+ reindex?: boolean;
29
+ };
30
+
31
+ export type RunConsolidateJobResult =
32
+ | { status: "skipped"; reason: "conditions_not_met" | "already_consolidating" }
33
+ | { status: "consolidated"; stats: ConsolidateJobStats }
34
+ | { status: "failed"; error: Error };
35
+
36
+ export async function runConsolidateJob(
37
+ opts: RunConsolidateJobOptions,
38
+ ): Promise<RunConsolidateJobResult> {
39
+ const llm = opts.llm ?? NOOP_LLM;
40
+
41
+ if (!opts.force && !(await opts.store.shouldConsolidate(undefined, opts.cronFired))) {
42
+ return { status: "skipped", reason: "conditions_not_met" };
43
+ }
44
+
45
+ const before = await opts.store.getStats();
46
+
47
+ try {
48
+ await opts.store.consolidate(llm);
49
+
50
+ let indexGeneration: number | undefined;
51
+ if (opts.reindex !== false) {
52
+ indexGeneration = await syncSidecarIndex(opts.agentDir, opts.store);
53
+ }
54
+
55
+ const after = await opts.store.getStats();
56
+
57
+ return {
58
+ status: "consolidated",
59
+ stats: {
60
+ entriesBefore: before.entryCount,
61
+ entriesAfter: after.entryCount,
62
+ overflowBefore: before.overflowFileCount,
63
+ overflowAfter: after.overflowFileCount,
64
+ indexGeneration,
65
+ },
66
+ };
67
+ } catch (error) {
68
+ return {
69
+ status: "failed",
70
+ error: error instanceof Error ? error : new Error(String(error)),
71
+ };
72
+ }
73
+ }
74
+
75
+ async function syncSidecarIndex(agentDir: string, store: MemoryStore): Promise<number> {
76
+ const sidecar = resolveSidecarPaths(agentDir);
77
+ await ensureSidecarRunning(sidecar);
78
+ const result = await reindex(sidecar.socketPath, await store.exportForIndex());
79
+ sidecarQueryCache.onReindexComplete(agentDir, result.index_generation);
80
+ return result.index_generation;
81
+ }