@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,518 @@
1
+ import { randomBytes } from "node:crypto";
2
+
3
+ import { parseMemoryExport } from "../compact/parseMemoryExport.js";
4
+ import {
5
+ filterCompactionDelta,
6
+ shouldSkipSubagentCompactionIngest,
7
+ } from "../compact/subagentDelta.js";
8
+ import { dedupeEntries } from "../consolidate/mergeEntries.js";
9
+ import { mergeEntriesWithLlm } from "../consolidate/mergeWithLlm.js";
10
+ import { MarkdownMemoryBackend } from "./backend.js";
11
+ import {
12
+ AUTO_FILE_PREFIX,
13
+ COMPACTION_STATE_FILE,
14
+ CONSOLIDATE_GC_INTERVAL_DAYS,
15
+ CONSOLIDATE_OVERFLOW_FILE_THRESHOLD,
16
+ DEFAULT_FALLBACK_MAX_CHARS,
17
+ DEFAULT_MAX_LINES,
18
+ DEFAULT_MEMORY_FILE,
19
+ MEMORY_GC_FILE,
20
+ } from "../constants/memory.js";
21
+ import { countLines, formatEntryLine, formatSectionHeader } from "./markdown/format.js";
22
+ import { listOverflowPointers, parseMemoryMarkdown } from "./markdown/parse.js";
23
+ import { initializeMemoryWorkspace } from "../init/workspace.js";
24
+ import { readChunkingConfig } from "../config/chunking.js";
25
+ import {
26
+ joinPath,
27
+ pathBasename,
28
+ readText,
29
+ readTextRequired,
30
+ writeText,
31
+ } from "../utils/fs.js";
32
+ import { buildIndexDocuments } from "./indexChunks.js";
33
+ import { daysSince, formatLocalDate, formatTimestamp, type TimeInput } from "../utils/time.js";
34
+ import { getAgentPaths, resolveAgentDir } from "./paths.js";
35
+ import type {
36
+ IndexDocument,
37
+ IntegrityReport,
38
+ LlmClient,
39
+ MemoryStats,
40
+ MemoryStoreOptions,
41
+ ParsedEntry,
42
+ ResolvedMemory,
43
+ StoreMemoryEntry,
44
+ } from "./types.js";
45
+ import { MEMORY_SECTIONS } from "./types.js";
46
+
47
+ type CompactionState = {
48
+ processed: string[];
49
+ };
50
+
51
+ export class MemoryStore {
52
+ private readonly paths: ReturnType<typeof getAgentPaths>;
53
+ private readonly backend: MarkdownMemoryBackend;
54
+ private readonly maxLines: number;
55
+ private readonly fallbackMaxChars: number;
56
+ private readonly syncToSidecarListeners = new Set<() => void>();
57
+ private readonly consolidateCheckListeners = new Set<() => void>();
58
+ private consolidating = false;
59
+
60
+ constructor(opts: MemoryStoreOptions) {
61
+ const agentDir = resolveAgentDir(opts.agentDir);
62
+ this.paths = getAgentPaths(agentDir, opts.memoryFileName ?? DEFAULT_MEMORY_FILE);
63
+ this.backend = new MarkdownMemoryBackend(this.paths.memoryFile);
64
+ this.maxLines = opts.maxLines ?? DEFAULT_MAX_LINES;
65
+ this.fallbackMaxChars = opts.defaultFallbackMaxChars ?? DEFAULT_FALLBACK_MAX_CHARS;
66
+ }
67
+
68
+ get agentDir(): string {
69
+ return this.paths.agentDir;
70
+ }
71
+
72
+ async ensureInitialized(): Promise<void> {
73
+ await initializeMemoryWorkspace(this.paths.agentDir);
74
+ }
75
+
76
+ async isEmpty(): Promise<boolean> {
77
+ const entries = await this.listEntries();
78
+ return entries.length === 0;
79
+ }
80
+
81
+ async getStats(): Promise<MemoryStats> {
82
+ const raw = await this.readRaw();
83
+ const entries = await this.listEntries();
84
+ const overflowFileCount = (await this.backend.listAutoFiles(this.paths.agentDir)).length;
85
+ const lastConsolidatedAt = await this.readGcTimestamp();
86
+ return {
87
+ lineCount: countLines(raw),
88
+ overflowFileCount,
89
+ entryCount: entries.length,
90
+ lastConsolidatedAt,
91
+ };
92
+ }
93
+
94
+ async readRaw(): Promise<string> {
95
+ return this.backend.readText(this.paths.memoryFile);
96
+ }
97
+
98
+ async listEntries(): Promise<ParsedEntry[]> {
99
+ const resolved = await this.readResolved();
100
+ return resolved.entries;
101
+ }
102
+
103
+ async readResolved(): Promise<ResolvedMemory> {
104
+ await this.ensureInitialized();
105
+ const main = await this.backend.readText(this.paths.memoryFile);
106
+ const entries = [...parseMemoryMarkdown(main, this.paths.memoryFile)];
107
+
108
+ for (const fileName of listOverflowPointers(main)) {
109
+ const path = this.backend.autoFilePath(this.paths.agentDir, fileName);
110
+ const overflow = await this.backend.readText(path);
111
+ entries.push(...parseMemoryMarkdown(overflow, path));
112
+ }
113
+
114
+ const autoFiles = await this.backend.listAutoFiles(this.paths.agentDir);
115
+ for (const fileName of autoFiles) {
116
+ if (listOverflowPointers(main).includes(fileName)) continue;
117
+ const path = this.backend.autoFilePath(this.paths.agentDir, fileName);
118
+ const orphan = await this.backend.readText(path);
119
+ entries.push(...parseMemoryMarkdown(orphan, path));
120
+ }
121
+
122
+ return { content: main, entries };
123
+ }
124
+
125
+ async readForFallback(maxChars = this.fallbackMaxChars): Promise<string> {
126
+ const resolved = await this.readResolved();
127
+ if (resolved.entries.length === 0) return "";
128
+
129
+ const blocks = resolved.entries.map((entry) => {
130
+ const tag = entry.userAuthored ? "[user] " : "";
131
+ return `- ${tag}${entry.content}`;
132
+ });
133
+
134
+ let text = blocks.join("\n");
135
+ if (text.length <= maxChars) return text;
136
+ return `${text.slice(0, maxChars)}\n…`;
137
+ }
138
+
139
+ async exportForIndex(): Promise<IndexDocument[]> {
140
+ const resolved = await this.readResolved();
141
+ return buildIndexDocuments(resolved.entries, readChunkingConfig());
142
+ }
143
+
144
+ async append(entry: StoreMemoryEntry): Promise<void> {
145
+ await this.backend.withMemoryLock(async () => {
146
+ await this.appendUnlocked(entry);
147
+ });
148
+ this.notifyAfterWrite();
149
+ }
150
+
151
+ async appendUser(entry: Omit<StoreMemoryEntry, "userAuthored">): Promise<void> {
152
+ await this.backend.withMemoryLock(async () => {
153
+ await this.appendUnlocked({ ...entry, userAuthored: true });
154
+ });
155
+ this.notifyAfterWrite();
156
+ }
157
+
158
+ async appendMany(entries: StoreMemoryEntry[], opts?: { mode?: "ifAbsent" }): Promise<void> {
159
+ await this.backend.withMemoryLock(async () => {
160
+ for (const entry of entries) {
161
+ if (opts?.mode === "ifAbsent") {
162
+ const added = await this.appendIfAbsentUnlocked(entry);
163
+ if (!added) continue;
164
+ } else {
165
+ await this.appendUnlocked(entry);
166
+ }
167
+ }
168
+ });
169
+ if (entries.length > 0) this.notifyAfterWrite();
170
+ }
171
+
172
+ async appendIfAbsent(entry: StoreMemoryEntry): Promise<boolean> {
173
+ let added = false;
174
+ await this.backend.withMemoryLock(async () => {
175
+ added = await this.appendIfAbsentUnlocked(entry);
176
+ });
177
+ if (added) this.notifyAfterWrite();
178
+ return added;
179
+ }
180
+
181
+ /** Fire-and-forget: parse Memory Export from compact summary → appendIfAbsent. */
182
+ appendFromCompaction(opts: {
183
+ compactionId: string;
184
+ summary: string;
185
+ subagent?: boolean;
186
+ onComplete?: () => void | Promise<void>;
187
+ }): void {
188
+ void this.ingestCompactionSummary(opts).catch(() => {});
189
+ }
190
+
191
+ private async ingestCompactionSummary(opts: {
192
+ compactionId: string;
193
+ summary: string;
194
+ subagent?: boolean;
195
+ onComplete?: () => void | Promise<void>;
196
+ }): Promise<void> {
197
+ if (await this.hasProcessedCompaction(opts.compactionId)) return;
198
+
199
+ await this.ensureInitialized();
200
+ const parsed = parseMemoryExport(opts.summary);
201
+
202
+ if (opts.subagent) {
203
+ const existing = await this.listEntries();
204
+ const delta = filterCompactionDelta(parsed, existing);
205
+ if (shouldSkipSubagentCompactionIngest(parsed, delta)) {
206
+ await this.markCompactionProcessed(opts.compactionId);
207
+ await opts.onComplete?.();
208
+ return;
209
+ }
210
+ if (delta.length > 0) {
211
+ await this.appendMany(delta, { mode: "ifAbsent" });
212
+ }
213
+ } else if (parsed.length > 0) {
214
+ await this.appendMany(parsed, { mode: "ifAbsent" });
215
+ }
216
+
217
+ await this.markCompactionProcessed(opts.compactionId);
218
+ await opts.onComplete?.();
219
+ }
220
+
221
+ async updateEntry(id: string, patch: Partial<StoreMemoryEntry>): Promise<void> {
222
+ await this.backend.withMemoryLock(async () => {
223
+ const resolved = await this.readResolvedUnlocked();
224
+ const target = resolved.entries.find((entry) => entry.id === id);
225
+ if (!target) throw new Error(`Memory entry not found: ${id}`);
226
+
227
+ const next: StoreMemoryEntry = {
228
+ ...target,
229
+ ...patch,
230
+ id: target.id,
231
+ section: patch.section ?? target.section,
232
+ content: patch.content ?? target.content,
233
+ timestamp: patch.timestamp ?? target.timestamp,
234
+ userAuthored: patch.userAuthored ?? target.userAuthored,
235
+ };
236
+
237
+ await this.rewriteEntriesUnlocked(resolved.entries.map((entry) => (entry.id === id ? { ...entry, ...next } : entry)));
238
+ });
239
+ this.notifyAfterWrite();
240
+ }
241
+
242
+ async removeEntry(id: string, opts?: { force?: boolean }): Promise<void> {
243
+ await this.backend.withMemoryLock(async () => {
244
+ const resolved = await this.readResolvedUnlocked();
245
+ const target = resolved.entries.find((entry) => entry.id === id);
246
+ if (!target) return;
247
+ if (target.userAuthored && !opts?.force) {
248
+ throw new Error(`Cannot remove user-authored entry without force: ${id}`);
249
+ }
250
+ await this.rewriteEntriesUnlocked(resolved.entries.filter((entry) => entry.id !== id));
251
+ });
252
+ this.notifyAfterWrite();
253
+ }
254
+
255
+ async rewrite(content: string): Promise<void> {
256
+ await this.backend.withMemoryLock(async () => {
257
+ await this.backend.writeText(this.paths.memoryFile, content);
258
+ });
259
+ this.notifyAfterWrite({ skipConsolidateCheck: true });
260
+ }
261
+
262
+ async shouldConsolidate(at?: TimeInput, cronFired = false): Promise<boolean> {
263
+ const stats = await this.getStats();
264
+ if (stats.overflowFileCount >= CONSOLIDATE_OVERFLOW_FILE_THRESHOLD) return true;
265
+ if (cronFired) return true;
266
+ if (!stats.lastConsolidatedAt) return false;
267
+ return daysSince(stats.lastConsolidatedAt, at) >= CONSOLIDATE_GC_INTERVAL_DAYS;
268
+ }
269
+
270
+ async consolidate(llm: LlmClient): Promise<void> {
271
+ if (this.consolidating) return;
272
+
273
+ this.consolidating = true;
274
+ try {
275
+ await this.backend.withMemoryLock(async () => {
276
+ const resolved = await this.readResolvedUnlocked();
277
+ let entries = dedupeEntries(resolved.entries);
278
+
279
+ try {
280
+ entries = await mergeEntriesWithLlm(entries, llm);
281
+ } catch {
282
+ // rule-based dedupe only
283
+ }
284
+
285
+ await this.rewriteEntriesUnlocked(entries);
286
+ await writeText(this.paths.memoryGcFile, `${formatTimestamp()}\n`);
287
+ });
288
+ this.notifySyncToSidecar();
289
+ } finally {
290
+ this.consolidating = false;
291
+ }
292
+ }
293
+
294
+ consolidateInBackground(
295
+ llm: LlmClient,
296
+ opts: { onComplete?: () => void | Promise<void> } = {},
297
+ ): void {
298
+ void this.consolidate(llm)
299
+ .then(() => opts.onComplete?.())
300
+ .catch(() => {});
301
+ }
302
+
303
+ async forceConsolidate(llm: LlmClient): Promise<void> {
304
+ await this.consolidate(llm);
305
+ }
306
+
307
+ async hasProcessedCompaction(compactionId: string): Promise<boolean> {
308
+ const state = await this.readCompactionState();
309
+ return state.processed.includes(compactionId);
310
+ }
311
+
312
+ async markCompactionProcessed(compactionId: string): Promise<void> {
313
+ const state = await this.readCompactionState();
314
+ if (!state.processed.includes(compactionId)) {
315
+ state.processed.push(compactionId);
316
+ }
317
+ await writeText(this.paths.compactionStateFile, JSON.stringify(state, null, 2));
318
+ }
319
+
320
+ async verifyIntegrity(): Promise<IntegrityReport> {
321
+ const issues: string[] = [];
322
+ const main = await this.backend.readText(this.paths.memoryFile);
323
+ const pointers = listOverflowPointers(main);
324
+
325
+ for (const fileName of pointers) {
326
+ const path = this.backend.autoFilePath(this.paths.agentDir, fileName);
327
+ try {
328
+ await readTextRequired(path);
329
+ } catch {
330
+ issues.push(`Missing overflow file referenced by MEMORY.md: ${fileName}`);
331
+ }
332
+ }
333
+
334
+ return { ok: issues.length === 0, issues };
335
+ }
336
+
337
+ /** Register a listener to sync MEMORY.md changes to the sidecar vector index. */
338
+ onSyncToSidecar(listener: () => void): () => void {
339
+ this.syncToSidecarListeners.add(listener);
340
+ return () => this.syncToSidecarListeners.delete(listener);
341
+ }
342
+
343
+ /** Register a listener invoked after writes to check shouldConsolidate. */
344
+ onConsolidateCheck(listener: () => void): () => void {
345
+ this.consolidateCheckListeners.add(listener);
346
+ return () => this.consolidateCheckListeners.delete(listener);
347
+ }
348
+
349
+ private notifyAfterWrite(opts?: { skipConsolidateCheck?: boolean }): void {
350
+ this.notifySyncToSidecar();
351
+ if (!opts?.skipConsolidateCheck && !this.consolidating) {
352
+ this.notifyConsolidateCheck();
353
+ }
354
+ }
355
+
356
+ private notifySyncToSidecar(): void {
357
+ for (const listener of this.syncToSidecarListeners) listener();
358
+ }
359
+
360
+ private notifyConsolidateCheck(): void {
361
+ for (const listener of this.consolidateCheckListeners) listener();
362
+ }
363
+
364
+ private async appendUnlocked(entry: StoreMemoryEntry): Promise<void> {
365
+ const normalized = this.normalizeEntry(entry);
366
+ const main = await this.backend.readText(this.paths.memoryFile);
367
+ if (countLines(main) >= this.maxLines) {
368
+ await this.appendToOverflowUnlocked(normalized, main);
369
+ return;
370
+ }
371
+
372
+ const next = this.insertEntryIntoMarkdown(main, normalized);
373
+ if (countLines(next) > this.maxLines) {
374
+ await this.appendToOverflowUnlocked(normalized, main);
375
+ return;
376
+ }
377
+
378
+ await this.backend.writeText(this.paths.memoryFile, next);
379
+ }
380
+
381
+ private async appendIfAbsentUnlocked(entry: StoreMemoryEntry): Promise<boolean> {
382
+ const resolved = await this.readResolvedUnlocked();
383
+ const exists = resolved.entries.some(
384
+ (item) => item.section === entry.section && item.content.trim() === entry.content.trim(),
385
+ );
386
+ if (exists) return false;
387
+ await this.appendUnlocked(entry);
388
+ return true;
389
+ }
390
+
391
+ private async appendToOverflowUnlocked(entry: StoreMemoryEntry, main: string): Promise<void> {
392
+ const autoFiles = await this.backend.listAutoFiles(this.paths.agentDir);
393
+ let targetName = autoFiles.at(-1);
394
+ let targetPath = targetName
395
+ ? this.backend.autoFilePath(this.paths.agentDir, targetName)
396
+ : this.newAutoFilePath();
397
+
398
+ if (!targetName) {
399
+ targetName = pathBasename(targetPath);
400
+ await this.backend.writeText(targetPath, `${formatSectionHeader(entry.section)}\n\n`);
401
+ }
402
+
403
+ let overflowContent = await this.backend.readText(targetPath);
404
+ const line = formatEntryLine(entry);
405
+ overflowContent = overflowContent.trimEnd() + `\n${line}\n`;
406
+ await this.backend.writeText(targetPath, overflowContent);
407
+
408
+ const pointer = `- (overflow) → ${targetName}`;
409
+ if (!main.includes(pointer)) {
410
+ const withPointer = `${main.trimEnd()}\n${pointer}\n`;
411
+ await this.backend.writeText(this.paths.memoryFile, withPointer);
412
+ }
413
+ }
414
+
415
+ private insertEntryIntoMarkdown(content: string, entry: StoreMemoryEntry): string {
416
+ const lines = content.split("\n");
417
+ const header = formatSectionHeader(entry.section);
418
+ const headerIdx = lines.findIndex((line) => line.trim() === header);
419
+ const line = formatEntryLine(entry);
420
+
421
+ if (headerIdx === -1) {
422
+ const trimmed = content.trimEnd();
423
+ return `${trimmed}\n\n${header}\n\n${line}\n`;
424
+ }
425
+
426
+ let insertAt = headerIdx + 1;
427
+ while (insertAt < lines.length && lines[insertAt]?.trim() === "") insertAt++;
428
+
429
+ while (insertAt < lines.length) {
430
+ const current = lines[insertAt]!;
431
+ if (current.startsWith("## ")) break;
432
+ insertAt++;
433
+ }
434
+
435
+ const next = [...lines.slice(0, insertAt), line, ...lines.slice(insertAt)];
436
+ return `${next.join("\n").trimEnd()}\n`;
437
+ }
438
+
439
+ private async rewriteEntriesUnlocked(entries: ParsedEntry[]): Promise<void> {
440
+ const grouped = new Map<string, ParsedEntry[]>();
441
+ for (const section of MEMORY_SECTIONS) grouped.set(section, []);
442
+ for (const entry of entries) {
443
+ grouped.get(entry.section)?.push(entry);
444
+ }
445
+
446
+ const lines: string[] = [];
447
+ for (const section of MEMORY_SECTIONS) {
448
+ lines.push(formatSectionHeader(section), "");
449
+ for (const entry of grouped.get(section) ?? []) {
450
+ lines.push(
451
+ formatEntryLine({
452
+ id: entry.id,
453
+ section: entry.section,
454
+ content: entry.content,
455
+ userAuthored: entry.userAuthored,
456
+ timestamp: entry.timestamp,
457
+ }),
458
+ );
459
+ }
460
+ lines.push("");
461
+ }
462
+
463
+ await this.backend.writeText(this.paths.memoryFile, `${lines.join("\n").trimEnd()}\n`);
464
+ const autoFiles = await this.backend.listAutoFiles(this.paths.agentDir);
465
+ await Promise.all(
466
+ autoFiles.map((fileName) =>
467
+ this.backend.deleteAutoFile(this.backend.autoFilePath(this.paths.agentDir, fileName)),
468
+ ),
469
+ );
470
+ }
471
+
472
+ private async readResolvedUnlocked(): Promise<ResolvedMemory> {
473
+ const main = await this.backend.readText(this.paths.memoryFile);
474
+ const entries = [...parseMemoryMarkdown(main, this.paths.memoryFile)];
475
+ for (const fileName of listOverflowPointers(main)) {
476
+ const path = this.backend.autoFilePath(this.paths.agentDir, fileName);
477
+ entries.push(...parseMemoryMarkdown(await this.backend.readText(path), path));
478
+ }
479
+ return { content: main, entries };
480
+ }
481
+
482
+ private normalizeEntry(entry: StoreMemoryEntry): StoreMemoryEntry {
483
+ return {
484
+ ...entry,
485
+ id: entry.id || this.newEntryId(),
486
+ timestamp: entry.timestamp || formatTimestamp(),
487
+ };
488
+ }
489
+
490
+ private newEntryId(): string {
491
+ return randomBytes(6).toString("hex");
492
+ }
493
+
494
+ private newAutoFilePath(): string {
495
+ const date = formatLocalDate();
496
+ const suffix = randomBytes(3).toString("hex");
497
+ return joinPath(this.paths.agentDir, `${AUTO_FILE_PREFIX}${date}-${suffix}.md`);
498
+ }
499
+
500
+ private async readGcTimestamp(): Promise<string | null> {
501
+ const raw = await readText(this.paths.memoryGcFile);
502
+ return raw.trim() || null;
503
+ }
504
+
505
+ private async readCompactionState(): Promise<CompactionState> {
506
+ const raw = await readText(this.paths.compactionStateFile);
507
+ if (!raw.trim()) return { processed: [] };
508
+ try {
509
+ return JSON.parse(raw) as CompactionState;
510
+ } catch {
511
+ return { processed: [] };
512
+ }
513
+ }
514
+ }
515
+
516
+ export function createMemoryStore(opts: MemoryStoreOptions): MemoryStore {
517
+ return new MemoryStore(opts);
518
+ }
@@ -0,0 +1,33 @@
1
+ import { expandHomePath } from "../utils/paths.js";
2
+ import { joinPath } from "../utils/fs.js";
3
+ import {
4
+ AUTO_FILE_PREFIX,
5
+ COMPACTION_STATE_FILE,
6
+ DEFAULT_MEMORY_FILE,
7
+ MEMORY_GC_FILE,
8
+ } from "../constants/memory.js";
9
+
10
+ export type AgentPaths = {
11
+ agentDir: string;
12
+ memoryFile: string;
13
+ memoryGcFile: string;
14
+ compactionStateFile: string;
15
+ };
16
+
17
+ export function resolveAgentDir(agentDir: string): string {
18
+ return expandHomePath(agentDir);
19
+ }
20
+
21
+ export function getAgentPaths(agentDir: string, memoryFileName = DEFAULT_MEMORY_FILE): AgentPaths {
22
+ const resolved = resolveAgentDir(agentDir);
23
+ return {
24
+ agentDir: resolved,
25
+ memoryFile: joinPath(resolved, memoryFileName),
26
+ memoryGcFile: joinPath(resolved, MEMORY_GC_FILE),
27
+ compactionStateFile: joinPath(resolved, COMPACTION_STATE_FILE),
28
+ };
29
+ }
30
+
31
+ export function isAutoOverflowFile(name: string): boolean {
32
+ return name.startsWith(AUTO_FILE_PREFIX) && name.endsWith(".md");
33
+ }
@@ -0,0 +1,3 @@
1
+ declare module "proper-lockfile" {
2
+ export function lock(file: string, options?: unknown): Promise<() => Promise<void>>;
3
+ }
@@ -0,0 +1,46 @@
1
+ import type { IndexDocument } from "../sidecar/protocol.js";
2
+ import { MEMORY_SECTIONS, type MemorySection } from "../constants/memory.js";
3
+
4
+ export { MEMORY_SECTIONS, type MemorySection };
5
+
6
+ /** Durable note stored in MEMORY.md (+ overflow files). */
7
+ export type StoreMemoryEntry = {
8
+ id: string;
9
+ section: MemorySection;
10
+ content: string;
11
+ userAuthored?: boolean;
12
+ timestamp: string;
13
+ };
14
+
15
+ export type ParsedEntry = StoreMemoryEntry & {
16
+ sourceFile: string;
17
+ line: number;
18
+ };
19
+
20
+ export type MemoryStats = {
21
+ lineCount: number;
22
+ overflowFileCount: number;
23
+ entryCount: number;
24
+ lastConsolidatedAt: string | null;
25
+ };
26
+
27
+ export type ResolvedMemory = {
28
+ content: string;
29
+ entries: ParsedEntry[];
30
+ };
31
+
32
+ export type IntegrityReport = {
33
+ ok: boolean;
34
+ issues: string[];
35
+ };
36
+
37
+ export type { LlmClient } from "../adapters/llm/types.js";
38
+
39
+ export type MemoryStoreOptions = {
40
+ agentDir: string;
41
+ memoryFileName?: string;
42
+ maxLines?: number;
43
+ defaultFallbackMaxChars?: number;
44
+ };
45
+
46
+ export type { IndexDocument };
@@ -0,0 +1,80 @@
1
+ import type { Theme } from "@earendil-works/pi-coding-agent";
2
+ import type { Component, TUI } from "@earendil-works/pi-tui";
3
+ import { truncateToWidth } from "@earendil-works/pi-tui";
4
+
5
+ import type { MemoryStatusReport } from "../cli/status.js";
6
+ import {
7
+ formatMemoryStatusSummary,
8
+ formatMemoryStatusTuiLines,
9
+ piStatusPalette,
10
+ } from "../cli/status.js";
11
+
12
+ export type MemoryStatusWidgetState = {
13
+ report: MemoryStatusReport;
14
+ expanded: boolean;
15
+ };
16
+
17
+ function formatHeader(theme: Theme, width: number): string {
18
+ const title = theme.fg("accent", theme.bold("pi-memory status"));
19
+ const fill = Math.max(0, width - title.length - 2);
20
+ const left = Math.floor(fill / 2);
21
+ const right = fill - left;
22
+ return `${theme.fg("borderMuted", "─".repeat(left))} ${title} ${theme.fg("borderMuted", "─".repeat(right))}`;
23
+ }
24
+
25
+ export class MemoryStatusWidget implements Component {
26
+ private cachedWidth?: number;
27
+ private cachedLines?: string[];
28
+ private version = 0;
29
+ private cachedVersion = -1;
30
+
31
+ constructor(
32
+ private readonly theme: Theme,
33
+ private state: MemoryStatusWidgetState,
34
+ ) {}
35
+
36
+ invalidate(): void {
37
+ this.cachedLines = undefined;
38
+ }
39
+
40
+ render(width: number): string[] {
41
+ if (this.cachedLines && this.cachedWidth === width && this.cachedVersion === this.version) {
42
+ return this.cachedLines;
43
+ }
44
+
45
+ const palette = piStatusPalette(this.theme);
46
+ const lines: string[] = [];
47
+
48
+ if (!this.state.expanded) {
49
+ const summary = formatMemoryStatusSummary(this.state.report, palette, (text) =>
50
+ this.theme.fg("accent", text),
51
+ );
52
+ const hint = this.theme.fg("dim", " (/memory-status to expand)");
53
+ lines.push(truncateToWidth(`${summary}${hint}`, width));
54
+ } else {
55
+ lines.push(truncateToWidth(formatHeader(this.theme, width), width));
56
+ for (const line of formatMemoryStatusTuiLines(this.state.report, palette, this.theme)) {
57
+ lines.push(truncateToWidth(` ${line}`, width));
58
+ }
59
+ lines.push(
60
+ truncateToWidth(
61
+ this.theme.fg("dim", " /memory-status to collapse · /memory-status hide to dismiss"),
62
+ width,
63
+ ),
64
+ );
65
+ }
66
+
67
+ this.cachedLines = lines;
68
+ this.cachedWidth = width;
69
+ this.cachedVersion = this.version;
70
+ return lines;
71
+ }
72
+ }
73
+
74
+ export function createMemoryStatusWidget(
75
+ _tui: TUI,
76
+ theme: Theme,
77
+ state: MemoryStatusWidgetState,
78
+ ): MemoryStatusWidget {
79
+ return new MemoryStatusWidget(theme, state);
80
+ }
@@ -0,0 +1,22 @@
1
+ import { theme } from "../cli/theme.js";
2
+
3
+ export function isMemoryDebugEnabled(env: NodeJS.ProcessEnv = process.env): boolean {
4
+ return env.PI_MEMORY_DEBUG === "1" || env.PI_MEMORY_DEBUG === "true";
5
+ }
6
+
7
+ /** Debug-only stderr log; never shown to Pi UI or session. */
8
+ export function debugMemory(
9
+ scope: string,
10
+ message: string,
11
+ fields?: Record<string, string | number | boolean | null | undefined>,
12
+ env: NodeJS.ProcessEnv = process.env,
13
+ ): void {
14
+ if (!isMemoryDebugEnabled(env)) return;
15
+
16
+ const suffix =
17
+ fields && Object.keys(fields).length > 0
18
+ ? ` ${JSON.stringify(fields, (_key, value) => (value === undefined ? null : value))}`
19
+ : "";
20
+
21
+ console.error(theme.dim(`[${scope}] ${message}${suffix}`));
22
+ }