@chendpoc/pi-memory 0.1.13 → 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 (799) hide show
  1. package/README.md +66 -258
  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.map +1 -0
  26. package/dist/adapters/http.d.ts +13 -0
  27. package/dist/adapters/http.d.ts.map +1 -0
  28. package/dist/adapters/http.js +31 -0
  29. package/dist/adapters/http.js.map +1 -0
  30. package/dist/adapters/index.d.ts +4 -0
  31. package/dist/adapters/index.d.ts.map +1 -0
  32. package/dist/adapters/index.js +4 -0
  33. package/dist/adapters/index.js.map +1 -0
  34. package/dist/adapters/llm/extractText.d.ts +5 -0
  35. package/dist/adapters/llm/extractText.d.ts.map +1 -0
  36. package/dist/adapters/llm/extractText.js +7 -0
  37. package/dist/adapters/llm/extractText.js.map +1 -0
  38. package/dist/adapters/llm/factory.d.ts +11 -0
  39. package/dist/adapters/llm/factory.d.ts.map +1 -0
  40. package/dist/adapters/llm/factory.js +48 -0
  41. package/dist/adapters/llm/factory.js.map +1 -0
  42. package/dist/adapters/llm/index.d.ts +8 -0
  43. package/dist/adapters/llm/index.d.ts.map +1 -0
  44. package/dist/adapters/llm/index.js +7 -0
  45. package/dist/adapters/llm/index.js.map +1 -0
  46. package/dist/adapters/llm/modelSpec.d.ts +10 -0
  47. package/dist/adapters/llm/modelSpec.d.ts.map +1 -0
  48. package/dist/adapters/llm/modelSpec.js +21 -0
  49. package/dist/adapters/llm/modelSpec.js.map +1 -0
  50. package/dist/adapters/llm/ollama.d.ts +4 -0
  51. package/dist/adapters/llm/ollama.d.ts.map +1 -0
  52. package/dist/adapters/llm/ollama.js +32 -0
  53. package/dist/adapters/llm/ollama.js.map +1 -0
  54. package/dist/adapters/llm/openai-compat.d.ts +4 -0
  55. package/dist/adapters/llm/openai-compat.d.ts.map +1 -0
  56. package/dist/adapters/llm/openai-compat.js +36 -0
  57. package/dist/adapters/llm/openai-compat.js.map +1 -0
  58. package/dist/adapters/llm/pi-ai.d.ts +5 -0
  59. package/dist/adapters/llm/pi-ai.d.ts.map +1 -0
  60. package/dist/adapters/llm/pi-ai.js +60 -0
  61. package/dist/adapters/llm/pi-ai.js.map +1 -0
  62. package/dist/adapters/llm/standalone.d.ts +6 -0
  63. package/dist/adapters/llm/standalone.d.ts.map +1 -0
  64. package/dist/adapters/llm/standalone.js +44 -0
  65. package/dist/adapters/llm/standalone.js.map +1 -0
  66. package/dist/adapters/llm/types.d.ts +15 -0
  67. package/dist/adapters/llm/types.d.ts.map +1 -0
  68. package/dist/adapters/llm/types.js.map +1 -0
  69. package/dist/cli/init.d.ts +3 -0
  70. package/dist/cli/init.d.ts.map +1 -0
  71. package/dist/cli/init.js +13 -0
  72. package/dist/cli/init.js.map +1 -0
  73. package/dist/cli/jobs.d.ts +32 -0
  74. package/dist/cli/jobs.d.ts.map +1 -0
  75. package/dist/cli/jobs.js +100 -0
  76. package/dist/cli/jobs.js.map +1 -0
  77. package/dist/cli/log.d.ts +14 -0
  78. package/dist/cli/log.d.ts.map +1 -0
  79. package/dist/cli/log.js +32 -0
  80. package/dist/cli/log.js.map +1 -0
  81. package/dist/cli/parseArgs.d.ts +35 -0
  82. package/dist/cli/parseArgs.d.ts.map +1 -0
  83. package/dist/cli/parseArgs.js +127 -0
  84. package/dist/cli/parseArgs.js.map +1 -0
  85. package/dist/cli/status.d.ts +44 -0
  86. package/dist/cli/status.d.ts.map +1 -0
  87. package/dist/cli/status.js +238 -0
  88. package/dist/cli/status.js.map +1 -0
  89. package/dist/cli/theme.d.ts +14 -0
  90. package/dist/cli/theme.d.ts.map +1 -0
  91. package/dist/cli/theme.js +20 -0
  92. package/dist/cli/theme.js.map +1 -0
  93. package/dist/cli.js +70 -356
  94. package/dist/cli.js.map +1 -1
  95. package/dist/commands/index.d.ts +6 -0
  96. package/dist/commands/index.d.ts.map +1 -0
  97. package/dist/commands/index.js +14 -0
  98. package/dist/commands/index.js.map +1 -0
  99. package/dist/commands/parseMemoryStatusArgs.d.ts +3 -0
  100. package/dist/commands/parseMemoryStatusArgs.d.ts.map +1 -0
  101. package/dist/commands/parseMemoryStatusArgs.js +15 -0
  102. package/dist/commands/parseMemoryStatusArgs.js.map +1 -0
  103. package/dist/commands/parseRememberArgs.d.ts +10 -0
  104. package/dist/commands/parseRememberArgs.d.ts.map +1 -0
  105. package/dist/commands/parseRememberArgs.js +46 -0
  106. package/dist/commands/parseRememberArgs.js.map +1 -0
  107. package/dist/commands/remember.d.ts +8 -0
  108. package/dist/commands/remember.d.ts.map +1 -0
  109. package/dist/commands/remember.js +30 -0
  110. package/dist/commands/remember.js.map +1 -0
  111. package/dist/commands/status.d.ts +10 -0
  112. package/dist/commands/status.d.ts.map +1 -0
  113. package/dist/commands/status.js +81 -0
  114. package/dist/commands/status.js.map +1 -0
  115. package/dist/commands/types.d.ts +10 -0
  116. package/dist/commands/types.d.ts.map +1 -0
  117. package/dist/commands/types.js +2 -0
  118. package/dist/{consolidation → commands}/types.js.map +1 -1
  119. package/dist/compact/index.d.ts +5 -0
  120. package/dist/compact/index.d.ts.map +1 -0
  121. package/dist/compact/index.js +5 -0
  122. package/dist/compact/index.js.map +1 -0
  123. package/dist/compact/parseMemoryExport.d.ts +6 -0
  124. package/dist/compact/parseMemoryExport.d.ts.map +1 -0
  125. package/dist/compact/parseMemoryExport.js +62 -0
  126. package/dist/compact/parseMemoryExport.js.map +1 -0
  127. package/dist/compact/register.d.ts +10 -0
  128. package/dist/compact/register.d.ts.map +1 -0
  129. package/dist/compact/register.js +47 -0
  130. package/dist/compact/register.js.map +1 -0
  131. package/dist/compact/runSummary.d.ts +6 -0
  132. package/dist/compact/runSummary.d.ts.map +1 -0
  133. package/dist/compact/runSummary.js +29 -0
  134. package/dist/compact/runSummary.js.map +1 -0
  135. package/dist/compact/subagentDelta.d.ts +6 -0
  136. package/dist/compact/subagentDelta.d.ts.map +1 -0
  137. package/dist/compact/subagentDelta.js +13 -0
  138. package/dist/compact/subagentDelta.js.map +1 -0
  139. package/dist/compact/summaryPrompt.d.ts +3 -0
  140. package/dist/compact/summaryPrompt.d.ts.map +1 -0
  141. package/dist/compact/summaryPrompt.js +41 -0
  142. package/dist/compact/summaryPrompt.js.map +1 -0
  143. package/dist/config/agentDir.d.ts +11 -0
  144. package/dist/config/agentDir.d.ts.map +1 -0
  145. package/dist/config/agentDir.js +21 -0
  146. package/dist/config/agentDir.js.map +1 -0
  147. package/dist/config/chunking.d.ts +7 -0
  148. package/dist/config/chunking.d.ts.map +1 -0
  149. package/dist/config/chunking.js +20 -0
  150. package/dist/config/chunking.js.map +1 -0
  151. package/dist/config/env.d.ts +28 -0
  152. package/dist/config/env.d.ts.map +1 -0
  153. package/dist/config/env.js +43 -0
  154. package/dist/config/env.js.map +1 -0
  155. package/dist/config/index.d.ts +7 -0
  156. package/dist/config/index.d.ts.map +1 -0
  157. package/dist/config/index.js +7 -0
  158. package/dist/config/index.js.map +1 -0
  159. package/dist/config/loadEnv.d.ts +10 -0
  160. package/dist/config/loadEnv.d.ts.map +1 -0
  161. package/dist/config/loadEnv.js +25 -0
  162. package/dist/config/loadEnv.js.map +1 -0
  163. package/dist/config/preflightBudget.d.ts +9 -0
  164. package/dist/config/preflightBudget.d.ts.map +1 -0
  165. package/dist/config/preflightBudget.js +16 -0
  166. package/dist/config/preflightBudget.js.map +1 -0
  167. package/dist/config/retrieval.d.ts +10 -0
  168. package/dist/config/retrieval.d.ts.map +1 -0
  169. package/dist/config/retrieval.js +31 -0
  170. package/dist/config/retrieval.js.map +1 -0
  171. package/dist/consolidate/entryKey.d.ts +6 -0
  172. package/dist/consolidate/entryKey.d.ts.map +1 -0
  173. package/dist/consolidate/entryKey.js +5 -0
  174. package/dist/consolidate/entryKey.js.map +1 -0
  175. package/dist/consolidate/index.d.ts +5 -0
  176. package/dist/consolidate/index.d.ts.map +1 -0
  177. package/dist/consolidate/index.js +5 -0
  178. package/dist/consolidate/index.js.map +1 -0
  179. package/dist/consolidate/mergeEntries.d.ts +4 -0
  180. package/dist/consolidate/mergeEntries.d.ts.map +1 -0
  181. package/dist/consolidate/mergeEntries.js +17 -0
  182. package/dist/consolidate/mergeEntries.js.map +1 -0
  183. package/dist/consolidate/mergePrompt.d.ts +4 -0
  184. package/dist/consolidate/mergePrompt.d.ts.map +1 -0
  185. package/dist/consolidate/mergePrompt.js +40 -0
  186. package/dist/consolidate/mergePrompt.js.map +1 -0
  187. package/dist/consolidate/mergeWithLlm.d.ts +4 -0
  188. package/dist/consolidate/mergeWithLlm.d.ts.map +1 -0
  189. package/dist/consolidate/mergeWithLlm.js +27 -0
  190. package/dist/consolidate/mergeWithLlm.js.map +1 -0
  191. package/dist/consolidate/runJob.d.ts +29 -0
  192. package/dist/consolidate/runJob.d.ts.map +1 -0
  193. package/dist/consolidate/runJob.js +48 -0
  194. package/dist/consolidate/runJob.js.map +1 -0
  195. package/dist/consolidate/scheduler.d.ts +18 -0
  196. package/dist/consolidate/scheduler.d.ts.map +1 -0
  197. package/dist/consolidate/scheduler.js +32 -0
  198. package/dist/consolidate/scheduler.js.map +1 -0
  199. package/dist/constants/chunking.d.ts +7 -0
  200. package/dist/constants/chunking.d.ts.map +1 -0
  201. package/dist/constants/chunking.js +7 -0
  202. package/dist/constants/chunking.js.map +1 -0
  203. package/dist/constants/env.d.ts +44 -0
  204. package/dist/constants/env.d.ts.map +1 -0
  205. package/dist/constants/env.js +49 -0
  206. package/dist/constants/env.js.map +1 -0
  207. package/dist/constants/index.d.ts +8 -0
  208. package/dist/constants/index.d.ts.map +1 -0
  209. package/dist/constants/index.js +8 -0
  210. package/dist/constants/index.js.map +1 -0
  211. package/dist/constants/memory.d.ts +17 -0
  212. package/dist/constants/memory.d.ts.map +1 -0
  213. package/dist/constants/memory.js +16 -0
  214. package/dist/constants/memory.js.map +1 -0
  215. package/dist/constants/paths.d.ts +23 -0
  216. package/dist/constants/paths.d.ts.map +1 -0
  217. package/dist/constants/paths.js +23 -0
  218. package/dist/constants/paths.js.map +1 -0
  219. package/dist/constants/preflight.d.ts +10 -0
  220. package/dist/constants/preflight.d.ts.map +1 -0
  221. package/dist/constants/preflight.js +10 -0
  222. package/dist/constants/preflight.js.map +1 -0
  223. package/dist/constants/retrieval.d.ts +10 -0
  224. package/dist/constants/retrieval.d.ts.map +1 -0
  225. package/dist/constants/retrieval.js +10 -0
  226. package/dist/constants/retrieval.js.map +1 -0
  227. package/dist/constants/security.d.ts +5 -0
  228. package/dist/constants/security.d.ts.map +1 -0
  229. package/dist/constants/security.js +5 -0
  230. package/dist/constants/security.js.map +1 -0
  231. package/dist/constants/timing.d.ts +36 -0
  232. package/dist/constants/timing.d.ts.map +1 -0
  233. package/dist/constants/timing.js +36 -0
  234. package/dist/constants/timing.js.map +1 -0
  235. package/dist/index.d.ts +11 -29
  236. package/dist/index.d.ts.map +1 -1
  237. package/dist/index.js +11 -28
  238. package/dist/index.js.map +1 -1
  239. package/dist/init/workspace.d.ts +15 -0
  240. package/dist/init/workspace.d.ts.map +1 -0
  241. package/dist/init/workspace.js +32 -0
  242. package/dist/init/workspace.js.map +1 -0
  243. package/dist/ipc/jsonlFramer.d.ts +9 -0
  244. package/dist/ipc/jsonlFramer.d.ts.map +1 -0
  245. package/dist/ipc/jsonlFramer.js +26 -0
  246. package/dist/ipc/jsonlFramer.js.map +1 -0
  247. package/dist/pi-extension.d.ts +0 -2
  248. package/dist/pi-extension.d.ts.map +1 -1
  249. package/dist/pi-extension.js +161 -520
  250. package/dist/pi-extension.js.map +1 -1
  251. package/dist/preflight/episodic.d.ts +20 -0
  252. package/dist/preflight/episodic.d.ts.map +1 -0
  253. package/dist/preflight/episodic.js +109 -0
  254. package/dist/preflight/episodic.js.map +1 -0
  255. package/dist/preflight/queryCache.d.ts +15 -0
  256. package/dist/preflight/queryCache.d.ts.map +1 -0
  257. package/dist/preflight/queryCache.js +46 -0
  258. package/dist/preflight/queryCache.js.map +1 -0
  259. package/dist/preflight/queryIntent.d.ts +20 -0
  260. package/dist/preflight/queryIntent.d.ts.map +1 -0
  261. package/dist/preflight/queryIntent.js +75 -0
  262. package/dist/preflight/queryIntent.js.map +1 -0
  263. package/dist/preflight/render.d.ts +8 -33
  264. package/dist/preflight/render.d.ts.map +1 -1
  265. package/dist/preflight/render.js +29 -126
  266. package/dist/preflight/render.js.map +1 -1
  267. package/dist/preflight/session.d.ts +3 -0
  268. package/dist/preflight/session.d.ts.map +1 -0
  269. package/dist/preflight/session.js +6 -0
  270. package/dist/preflight/session.js.map +1 -0
  271. package/dist/preflight/strip.d.ts +0 -8
  272. package/dist/preflight/strip.d.ts.map +1 -1
  273. package/dist/preflight/strip.js +2 -11
  274. package/dist/preflight/strip.js.map +1 -1
  275. package/dist/shutdown/enqueue.d.ts +12 -0
  276. package/dist/shutdown/enqueue.d.ts.map +1 -0
  277. package/dist/shutdown/enqueue.js +14 -0
  278. package/dist/shutdown/enqueue.js.map +1 -0
  279. package/dist/shutdown/extractPrompt.d.ts +4 -0
  280. package/dist/shutdown/extractPrompt.d.ts.map +1 -0
  281. package/dist/shutdown/extractPrompt.js +29 -0
  282. package/dist/shutdown/extractPrompt.js.map +1 -0
  283. package/dist/shutdown/processed.d.ts +9 -0
  284. package/dist/shutdown/processed.d.ts.map +1 -0
  285. package/dist/shutdown/processed.js +28 -0
  286. package/dist/shutdown/processed.js.map +1 -0
  287. package/dist/shutdown/readQueue.d.ts +4 -0
  288. package/dist/shutdown/readQueue.d.ts.map +1 -0
  289. package/dist/shutdown/readQueue.js +26 -0
  290. package/dist/shutdown/readQueue.js.map +1 -0
  291. package/dist/shutdown/runDrainJob.d.ts +26 -0
  292. package/dist/shutdown/runDrainJob.d.ts.map +1 -0
  293. package/dist/shutdown/runDrainJob.js +143 -0
  294. package/dist/shutdown/runDrainJob.js.map +1 -0
  295. package/dist/shutdown/sessionReader.d.ts +6 -0
  296. package/dist/shutdown/sessionReader.d.ts.map +1 -0
  297. package/dist/shutdown/sessionReader.js +44 -0
  298. package/dist/shutdown/sessionReader.js.map +1 -0
  299. package/dist/sidecar/client.d.ts +17 -16
  300. package/dist/sidecar/client.d.ts.map +1 -1
  301. package/dist/sidecar/client.js +64 -100
  302. package/dist/sidecar/client.js.map +1 -1
  303. package/dist/sidecar/paths.d.ts +8 -0
  304. package/dist/sidecar/paths.d.ts.map +1 -0
  305. package/dist/sidecar/paths.js +23 -0
  306. package/dist/sidecar/paths.js.map +1 -0
  307. package/dist/sidecar/protocol.d.ts +54 -0
  308. package/dist/sidecar/protocol.d.ts.map +1 -0
  309. package/dist/sidecar/protocol.js +4 -0
  310. package/dist/sidecar/protocol.js.map +1 -0
  311. package/dist/sidecar/reindexBridge.d.ts +13 -0
  312. package/dist/sidecar/reindexBridge.d.ts.map +1 -0
  313. package/dist/sidecar/reindexBridge.js +37 -0
  314. package/dist/sidecar/reindexBridge.js.map +1 -0
  315. package/dist/sidecar/server/process.d.ts +2 -0
  316. package/dist/sidecar/server/process.d.ts.map +1 -0
  317. package/dist/sidecar/server/process.js +22 -0
  318. package/dist/sidecar/server/process.js.map +1 -0
  319. package/dist/sidecar/server/query.d.ts +8 -0
  320. package/dist/sidecar/server/query.d.ts.map +1 -0
  321. package/dist/sidecar/server/query.js +7 -0
  322. package/dist/sidecar/server/query.js.map +1 -0
  323. package/dist/sidecar/server/reindex.d.ts +8 -0
  324. package/dist/sidecar/server/reindex.d.ts.map +1 -0
  325. package/dist/sidecar/server/reindex.js +12 -0
  326. package/dist/sidecar/server/reindex.js.map +1 -0
  327. package/dist/sidecar/server/server.d.ts +11 -0
  328. package/dist/sidecar/server/server.d.ts.map +1 -0
  329. package/dist/sidecar/server/server.js +76 -0
  330. package/dist/sidecar/server/server.js.map +1 -0
  331. package/dist/sidecar/server/stats.d.ts +8 -0
  332. package/dist/sidecar/server/stats.d.ts.map +1 -0
  333. package/dist/sidecar/server/stats.js +18 -0
  334. package/dist/sidecar/server/stats.js.map +1 -0
  335. package/dist/sidecar/server/vec/embedder.d.ts +2 -0
  336. package/dist/sidecar/server/vec/embedder.d.ts.map +1 -0
  337. package/dist/sidecar/server/vec/embedder.js +2 -0
  338. package/dist/sidecar/server/vec/embedder.js.map +1 -0
  339. package/dist/sidecar/server/vec/mmr.d.ts +13 -0
  340. package/dist/sidecar/server/vec/mmr.d.ts.map +1 -0
  341. package/dist/sidecar/server/vec/mmr.js +36 -0
  342. package/dist/sidecar/server/vec/mmr.js.map +1 -0
  343. package/dist/sidecar/server/vec/store.d.ts +30 -0
  344. package/dist/sidecar/server/vec/store.d.ts.map +1 -0
  345. package/dist/sidecar/server/vec/store.js +179 -0
  346. package/dist/sidecar/server/vec/store.js.map +1 -0
  347. package/dist/sidecar/sidecarManager.d.ts +10 -0
  348. package/dist/sidecar/sidecarManager.d.ts.map +1 -0
  349. package/dist/sidecar/sidecarManager.js +111 -0
  350. package/dist/sidecar/sidecarManager.js.map +1 -0
  351. package/dist/sidecar/utils.d.ts +3 -0
  352. package/dist/sidecar/utils.d.ts.map +1 -0
  353. package/dist/sidecar/utils.js +27 -0
  354. package/dist/sidecar/utils.js.map +1 -0
  355. package/dist/store/backend.d.ts +12 -0
  356. package/dist/store/backend.d.ts.map +1 -0
  357. package/dist/store/backend.js +47 -0
  358. package/dist/store/backend.js.map +1 -0
  359. package/dist/store/index.d.ts +6 -0
  360. package/dist/store/index.d.ts.map +1 -0
  361. package/dist/store/index.js +6 -0
  362. package/dist/store/index.js.map +1 -0
  363. package/dist/store/indexChunks.d.ts +9 -0
  364. package/dist/store/indexChunks.d.ts.map +1 -0
  365. package/dist/store/indexChunks.js +78 -0
  366. package/dist/store/indexChunks.js.map +1 -0
  367. package/dist/store/markdown/format.d.ts +5 -0
  368. package/dist/store/markdown/format.d.ts.map +1 -0
  369. package/dist/store/markdown/format.js +14 -0
  370. package/dist/store/markdown/format.js.map +1 -0
  371. package/dist/store/markdown/parse.d.ts +5 -0
  372. package/dist/store/markdown/parse.d.ts.map +1 -0
  373. package/dist/store/markdown/parse.js +57 -0
  374. package/dist/store/markdown/parse.js.map +1 -0
  375. package/dist/store/markdown/template.d.ts +3 -0
  376. package/dist/store/markdown/template.d.ts.map +1 -0
  377. package/dist/store/markdown/template.js +22 -0
  378. package/dist/store/markdown/template.js.map +1 -0
  379. package/dist/store/memoryStore.d.ts +69 -0
  380. package/dist/store/memoryStore.d.ts.map +1 -0
  381. package/dist/store/memoryStore.js +421 -0
  382. package/dist/store/memoryStore.js.map +1 -0
  383. package/dist/store/paths.d.ts +10 -0
  384. package/dist/store/paths.d.ts.map +1 -0
  385. package/dist/store/paths.js +19 -0
  386. package/dist/store/paths.js.map +1 -0
  387. package/dist/store/types.d.ts +38 -0
  388. package/dist/store/types.d.ts.map +1 -0
  389. package/dist/store/types.js +3 -0
  390. package/dist/store/types.js.map +1 -0
  391. package/dist/ui/memoryStatusWidget.d.ts +20 -0
  392. package/dist/ui/memoryStatusWidget.d.ts.map +1 -0
  393. package/dist/ui/memoryStatusWidget.js +51 -0
  394. package/dist/ui/memoryStatusWidget.js.map +1 -0
  395. package/dist/utils/debugLog.d.ts +4 -0
  396. package/dist/utils/debugLog.d.ts.map +1 -0
  397. package/dist/utils/debugLog.js +14 -0
  398. package/dist/utils/debugLog.js.map +1 -0
  399. package/dist/utils/fs.d.ts +26 -0
  400. package/dist/utils/fs.d.ts.map +1 -0
  401. package/dist/utils/fs.js +101 -0
  402. package/dist/utils/fs.js.map +1 -0
  403. package/dist/utils/index.d.ts +8 -0
  404. package/dist/utils/index.d.ts.map +1 -0
  405. package/dist/utils/index.js +8 -0
  406. package/dist/utils/index.js.map +1 -0
  407. package/dist/utils/paths.d.ts +22 -0
  408. package/dist/utils/paths.d.ts.map +1 -0
  409. package/dist/utils/paths.js +51 -0
  410. package/dist/utils/paths.js.map +1 -0
  411. package/dist/utils/platform.d.ts +7 -0
  412. package/dist/utils/platform.d.ts.map +1 -0
  413. package/dist/utils/platform.js +18 -0
  414. package/dist/utils/platform.js.map +1 -0
  415. package/dist/utils/scheduler.d.ts +33 -0
  416. package/dist/utils/scheduler.d.ts.map +1 -0
  417. package/dist/utils/scheduler.js +63 -0
  418. package/dist/utils/scheduler.js.map +1 -0
  419. package/dist/utils/socket.d.ts +7 -0
  420. package/dist/utils/socket.d.ts.map +1 -0
  421. package/dist/utils/socket.js +35 -0
  422. package/dist/utils/socket.js.map +1 -0
  423. package/dist/utils/time.d.ts +22 -0
  424. package/dist/utils/time.d.ts.map +1 -0
  425. package/dist/utils/time.js +42 -0
  426. package/dist/utils/time.js.map +1 -0
  427. package/package.json +28 -10
  428. package/scripts/init-memory-workspace.mjs +62 -0
  429. package/scripts/path-utils.mjs +12 -0
  430. package/scripts/platform-fs.mjs +65 -0
  431. package/scripts/postinstall.mjs +17 -0
  432. package/src/adapters/embed/factory.ts +50 -0
  433. package/src/adapters/embed/hash.ts +29 -0
  434. package/src/adapters/embed/normalize.ts +13 -0
  435. package/src/adapters/embed/ollama.ts +49 -0
  436. package/src/adapters/embed/openai.ts +46 -0
  437. package/src/adapters/embed/types.ts +9 -0
  438. package/src/adapters/http.ts +42 -0
  439. package/src/adapters/index.ts +16 -0
  440. package/src/adapters/llm/extractText.ts +6 -0
  441. package/src/adapters/llm/factory.ts +60 -0
  442. package/src/adapters/llm/index.ts +7 -0
  443. package/src/adapters/llm/modelSpec.ts +39 -0
  444. package/src/adapters/llm/ollama.ts +42 -0
  445. package/src/adapters/llm/openai-compat.ts +46 -0
  446. package/src/adapters/llm/pi-ai.ts +75 -0
  447. package/src/adapters/llm/standalone.ts +60 -0
  448. package/src/adapters/llm/types.ts +16 -0
  449. package/src/cli/init.ts +18 -0
  450. package/src/cli/jobs.ts +144 -0
  451. package/src/cli/log.ts +46 -0
  452. package/src/cli/parseArgs.ts +175 -0
  453. package/src/cli/status.ts +323 -0
  454. package/src/cli/theme.ts +26 -0
  455. package/src/cli.ts +80 -374
  456. package/src/commands/index.ts +20 -0
  457. package/src/commands/parseMemoryStatusArgs.ts +11 -0
  458. package/src/commands/parseRememberArgs.ts +55 -0
  459. package/src/commands/remember.ts +43 -0
  460. package/src/commands/status.ts +112 -0
  461. package/src/commands/types.ts +12 -0
  462. package/src/compact/index.ts +4 -0
  463. package/src/compact/parseMemoryExport.ts +71 -0
  464. package/src/compact/register.ts +57 -0
  465. package/src/compact/runSummary.ts +42 -0
  466. package/src/compact/subagentDelta.ts +22 -0
  467. package/src/compact/summaryPrompt.ts +45 -0
  468. package/src/config/agentDir.ts +24 -0
  469. package/src/config/chunking.ts +36 -0
  470. package/src/config/env.ts +97 -0
  471. package/src/config/index.ts +6 -0
  472. package/src/config/loadEnv.ts +26 -0
  473. package/src/config/preflightBudget.ts +33 -0
  474. package/src/config/retrieval.ts +50 -0
  475. package/src/consolidate/entryKey.ts +4 -0
  476. package/src/consolidate/index.ts +4 -0
  477. package/src/consolidate/mergeEntries.ts +22 -0
  478. package/src/consolidate/mergePrompt.ts +46 -0
  479. package/src/consolidate/mergeWithLlm.ts +39 -0
  480. package/src/consolidate/runJob.ts +81 -0
  481. package/src/consolidate/scheduler.ts +54 -0
  482. package/src/constants/chunking.ts +8 -0
  483. package/src/constants/env.ts +56 -0
  484. package/src/constants/index.ts +7 -0
  485. package/src/constants/memory.ts +22 -0
  486. package/src/constants/paths.ts +26 -0
  487. package/src/constants/preflight.ts +13 -0
  488. package/src/constants/retrieval.ts +10 -0
  489. package/src/constants/security.ts +5 -0
  490. package/src/constants/timing.ts +46 -0
  491. package/src/index.ts +11 -247
  492. package/src/init/workspace.ts +44 -0
  493. package/src/ipc/jsonlFramer.ts +29 -0
  494. package/src/pi-extension.ts +177 -606
  495. package/src/preflight/episodic.ts +159 -0
  496. package/src/preflight/queryCache.ts +59 -0
  497. package/src/preflight/queryIntent.ts +92 -0
  498. package/src/preflight/render.ts +34 -180
  499. package/src/preflight/session.ts +7 -0
  500. package/src/preflight/strip.ts +4 -11
  501. package/src/shutdown/enqueue.ts +29 -0
  502. package/src/shutdown/extractPrompt.ts +27 -0
  503. package/src/shutdown/processed.ts +45 -0
  504. package/src/shutdown/readQueue.ts +26 -0
  505. package/src/shutdown/runDrainJob.ts +202 -0
  506. package/src/shutdown/sessionReader.ts +61 -0
  507. package/src/sidecar/client.ts +98 -150
  508. package/src/sidecar/paths.ts +31 -0
  509. package/src/sidecar/protocol.ts +38 -0
  510. package/src/sidecar/reindexBridge.ts +52 -0
  511. package/src/sidecar/server/process.ts +27 -0
  512. package/src/sidecar/server/query.ts +16 -0
  513. package/src/sidecar/server/reindex.ts +21 -0
  514. package/src/sidecar/server/server.ts +105 -0
  515. package/src/sidecar/server/stats.ts +23 -0
  516. package/src/sidecar/server/vec/embedder.ts +1 -0
  517. package/src/sidecar/server/vec/mmr.ts +55 -0
  518. package/src/sidecar/server/vec/store.ts +232 -0
  519. package/src/sidecar/sidecarManager.ts +134 -0
  520. package/src/sidecar/utils.ts +28 -0
  521. package/src/store/backend.ts +66 -0
  522. package/src/store/index.ts +5 -0
  523. package/src/store/indexChunks.ts +89 -0
  524. package/src/store/markdown/format.ts +16 -0
  525. package/src/store/markdown/parse.ts +63 -0
  526. package/src/store/markdown/template.ts +24 -0
  527. package/src/store/memoryStore.ts +518 -0
  528. package/src/store/paths.ts +33 -0
  529. package/src/store/proper-lockfile.d.ts +3 -0
  530. package/src/store/types.ts +46 -0
  531. package/src/ui/memoryStatusWidget.ts +80 -0
  532. package/src/utils/debugLog.ts +22 -0
  533. package/src/utils/fs.ts +115 -0
  534. package/src/utils/index.ts +68 -0
  535. package/src/utils/paths.ts +67 -0
  536. package/src/utils/platform.ts +20 -0
  537. package/src/utils/scheduler.ts +98 -0
  538. package/src/utils/socket.ts +33 -0
  539. package/src/utils/time.ts +51 -0
  540. package/templates/MEMORY.md.example +22 -0
  541. package/dist/adapters/ollamaClient.d.ts +0 -11
  542. package/dist/adapters/ollamaClient.d.ts.map +0 -1
  543. package/dist/adapters/ollamaClient.js +0 -122
  544. package/dist/adapters/ollamaClient.js.map +0 -1
  545. package/dist/adapters/openaiCompatClient.d.ts +0 -11
  546. package/dist/adapters/openaiCompatClient.d.ts.map +0 -1
  547. package/dist/adapters/openaiCompatClient.js +0 -118
  548. package/dist/adapters/openaiCompatClient.js.map +0 -1
  549. package/dist/adapters/piComplete.d.ts +0 -17
  550. package/dist/adapters/piComplete.d.ts.map +0 -1
  551. package/dist/adapters/piComplete.js +0 -169
  552. package/dist/adapters/piComplete.js.map +0 -1
  553. package/dist/bundle/install.d.ts +0 -34
  554. package/dist/bundle/install.d.ts.map +0 -1
  555. package/dist/bundle/install.js +0 -183
  556. package/dist/bundle/install.js.map +0 -1
  557. package/dist/cache/memoryCaches.d.ts +0 -32
  558. package/dist/cache/memoryCaches.d.ts.map +0 -1
  559. package/dist/cache/memoryCaches.js +0 -59
  560. package/dist/cache/memoryCaches.js.map +0 -1
  561. package/dist/config.d.ts +0 -55
  562. package/dist/config.d.ts.map +0 -1
  563. package/dist/config.js +0 -85
  564. package/dist/config.js.map +0 -1
  565. package/dist/consolidation/enqueue.d.ts +0 -33
  566. package/dist/consolidation/enqueue.d.ts.map +0 -1
  567. package/dist/consolidation/enqueue.js +0 -145
  568. package/dist/consolidation/enqueue.js.map +0 -1
  569. package/dist/consolidation/index.d.ts +0 -19
  570. package/dist/consolidation/index.d.ts.map +0 -1
  571. package/dist/consolidation/index.js +0 -15
  572. package/dist/consolidation/index.js.map +0 -1
  573. package/dist/consolidation/lock.d.ts +0 -5
  574. package/dist/consolidation/lock.d.ts.map +0 -1
  575. package/dist/consolidation/lock.js +0 -33
  576. package/dist/consolidation/lock.js.map +0 -1
  577. package/dist/consolidation/log.d.ts +0 -8
  578. package/dist/consolidation/log.d.ts.map +0 -1
  579. package/dist/consolidation/log.js +0 -32
  580. package/dist/consolidation/log.js.map +0 -1
  581. package/dist/consolidation/memoryIndex.d.ts +0 -18
  582. package/dist/consolidation/memoryIndex.d.ts.map +0 -1
  583. package/dist/consolidation/memoryIndex.js +0 -100
  584. package/dist/consolidation/memoryIndex.js.map +0 -1
  585. package/dist/consolidation/phase2/runPhase2.d.ts +0 -23
  586. package/dist/consolidation/phase2/runPhase2.d.ts.map +0 -1
  587. package/dist/consolidation/phase2/runPhase2.js +0 -196
  588. package/dist/consolidation/phase2/runPhase2.js.map +0 -1
  589. package/dist/consolidation/scheduler/launchd.d.ts +0 -5
  590. package/dist/consolidation/scheduler/launchd.d.ts.map +0 -1
  591. package/dist/consolidation/scheduler/launchd.js +0 -54
  592. package/dist/consolidation/scheduler/launchd.js.map +0 -1
  593. package/dist/consolidation/scheduler/runConsolidate.d.ts +0 -26
  594. package/dist/consolidation/scheduler/runConsolidate.d.ts.map +0 -1
  595. package/dist/consolidation/scheduler/runConsolidate.js +0 -83
  596. package/dist/consolidation/scheduler/runConsolidate.js.map +0 -1
  597. package/dist/consolidation/scheduler/setupSchedule.d.ts +0 -3
  598. package/dist/consolidation/scheduler/setupSchedule.d.ts.map +0 -1
  599. package/dist/consolidation/scheduler/setupSchedule.js +0 -79
  600. package/dist/consolidation/scheduler/setupSchedule.js.map +0 -1
  601. package/dist/consolidation/scheduler/systemd.d.ts +0 -9
  602. package/dist/consolidation/scheduler/systemd.d.ts.map +0 -1
  603. package/dist/consolidation/scheduler/systemd.js +0 -57
  604. package/dist/consolidation/scheduler/systemd.js.map +0 -1
  605. package/dist/consolidation/scheduler/types.d.ts +0 -24
  606. package/dist/consolidation/scheduler/types.d.ts.map +0 -1
  607. package/dist/consolidation/scheduler/types.js.map +0 -1
  608. package/dist/consolidation/scope.d.ts +0 -12
  609. package/dist/consolidation/scope.d.ts.map +0 -1
  610. package/dist/consolidation/scope.js +0 -51
  611. package/dist/consolidation/scope.js.map +0 -1
  612. package/dist/consolidation/stage1/deltaExtract.d.ts +0 -3
  613. package/dist/consolidation/stage1/deltaExtract.d.ts.map +0 -1
  614. package/dist/consolidation/stage1/deltaExtract.js +0 -19
  615. package/dist/consolidation/stage1/deltaExtract.js.map +0 -1
  616. package/dist/consolidation/stage1/drainQueue.d.ts +0 -21
  617. package/dist/consolidation/stage1/drainQueue.d.ts.map +0 -1
  618. package/dist/consolidation/stage1/drainQueue.js +0 -113
  619. package/dist/consolidation/stage1/drainQueue.js.map +0 -1
  620. package/dist/consolidation/stage1/extractSession.d.ts +0 -6
  621. package/dist/consolidation/stage1/extractSession.d.ts.map +0 -1
  622. package/dist/consolidation/stage1/extractSession.js +0 -47
  623. package/dist/consolidation/stage1/extractSession.js.map +0 -1
  624. package/dist/consolidation/stage1/store.d.ts +0 -45
  625. package/dist/consolidation/stage1/store.d.ts.map +0 -1
  626. package/dist/consolidation/stage1/store.js +0 -297
  627. package/dist/consolidation/stage1/store.js.map +0 -1
  628. package/dist/consolidation/types.d.ts +0 -49
  629. package/dist/consolidation/types.d.ts.map +0 -1
  630. package/dist/errclass.d.ts +0 -7
  631. package/dist/errclass.d.ts.map +0 -1
  632. package/dist/errclass.js +0 -32
  633. package/dist/errclass.js.map +0 -1
  634. package/dist/extension.d.ts +0 -24
  635. package/dist/extension.d.ts.map +0 -1
  636. package/dist/extension.js +0 -7
  637. package/dist/extension.js.map +0 -1
  638. package/dist/fallback/index.d.ts +0 -11
  639. package/dist/fallback/index.d.ts.map +0 -1
  640. package/dist/fallback/index.js +0 -16
  641. package/dist/fallback/index.js.map +0 -1
  642. package/dist/fallback/llmRerank.d.ts +0 -19
  643. package/dist/fallback/llmRerank.d.ts.map +0 -1
  644. package/dist/fallback/llmRerank.js +0 -68
  645. package/dist/fallback/llmRerank.js.map +0 -1
  646. package/dist/fallback/memoryMd.d.ts +0 -6
  647. package/dist/fallback/memoryMd.d.ts.map +0 -1
  648. package/dist/fallback/memoryMd.js +0 -35
  649. package/dist/fallback/memoryMd.js.map +0 -1
  650. package/dist/fallback/sessionIndex.d.ts +0 -35
  651. package/dist/fallback/sessionIndex.d.ts.map +0 -1
  652. package/dist/fallback/sessionIndex.js +0 -239
  653. package/dist/fallback/sessionIndex.js.map +0 -1
  654. package/dist/fallback/sessionSearch.d.ts +0 -18
  655. package/dist/fallback/sessionSearch.d.ts.map +0 -1
  656. package/dist/fallback/sessionSearch.js +0 -234
  657. package/dist/fallback/sessionSearch.js.map +0 -1
  658. package/dist/local/graphQuery.d.ts +0 -31
  659. package/dist/local/graphQuery.d.ts.map +0 -1
  660. package/dist/local/graphQuery.js +0 -195
  661. package/dist/local/graphQuery.js.map +0 -1
  662. package/dist/paths.d.ts +0 -7
  663. package/dist/paths.d.ts.map +0 -1
  664. package/dist/paths.js +0 -26
  665. package/dist/paths.js.map +0 -1
  666. package/dist/preflight/detectIntents.d.ts +0 -102
  667. package/dist/preflight/detectIntents.d.ts.map +0 -1
  668. package/dist/preflight/detectIntents.js +0 -631
  669. package/dist/preflight/detectIntents.js.map +0 -1
  670. package/dist/preflight/hook.d.ts +0 -76
  671. package/dist/preflight/hook.d.ts.map +0 -1
  672. package/dist/preflight/hook.js +0 -122
  673. package/dist/preflight/hook.js.map +0 -1
  674. package/dist/service.d.ts +0 -72
  675. package/dist/service.d.ts.map +0 -1
  676. package/dist/service.js +0 -257
  677. package/dist/service.js.map +0 -1
  678. package/dist/session/activeBranch.d.ts +0 -17
  679. package/dist/session/activeBranch.d.ts.map +0 -1
  680. package/dist/session/activeBranch.js +0 -251
  681. package/dist/session/activeBranch.js.map +0 -1
  682. package/dist/settings.d.ts +0 -41
  683. package/dist/settings.d.ts.map +0 -1
  684. package/dist/settings.js +0 -85
  685. package/dist/settings.js.map +0 -1
  686. package/dist/sidecar/bundle.d.ts +0 -19
  687. package/dist/sidecar/bundle.d.ts.map +0 -1
  688. package/dist/sidecar/bundle.js +0 -39
  689. package/dist/sidecar/bundle.js.map +0 -1
  690. package/dist/sidecar/process.d.ts +0 -14
  691. package/dist/sidecar/process.d.ts.map +0 -1
  692. package/dist/sidecar/process.js +0 -138
  693. package/dist/sidecar/process.js.map +0 -1
  694. package/dist/tools/memoryAppend.d.ts +0 -47
  695. package/dist/tools/memoryAppend.d.ts.map +0 -1
  696. package/dist/tools/memoryAppend.js +0 -138
  697. package/dist/tools/memoryAppend.js.map +0 -1
  698. package/dist/tools/memoryRecall.d.ts +0 -113
  699. package/dist/tools/memoryRecall.d.ts.map +0 -1
  700. package/dist/tools/memoryRecall.js +0 -351
  701. package/dist/tools/memoryRecall.js.map +0 -1
  702. package/dist/trainer/bundleBuilder.d.ts +0 -30
  703. package/dist/trainer/bundleBuilder.d.ts.map +0 -1
  704. package/dist/trainer/bundleBuilder.js +0 -106
  705. package/dist/trainer/bundleBuilder.js.map +0 -1
  706. package/dist/trainer/bundleLoader.d.ts +0 -12
  707. package/dist/trainer/bundleLoader.d.ts.map +0 -1
  708. package/dist/trainer/bundleLoader.js +0 -59
  709. package/dist/trainer/bundleLoader.js.map +0 -1
  710. package/dist/trainer/deltaMerge.d.ts +0 -38
  711. package/dist/trainer/deltaMerge.d.ts.map +0 -1
  712. package/dist/trainer/deltaMerge.js +0 -183
  713. package/dist/trainer/deltaMerge.js.map +0 -1
  714. package/dist/trainer/entityResolver.d.ts +0 -27
  715. package/dist/trainer/entityResolver.d.ts.map +0 -1
  716. package/dist/trainer/entityResolver.js +0 -92
  717. package/dist/trainer/entityResolver.js.map +0 -1
  718. package/dist/trainer/extractFacts.d.ts +0 -67
  719. package/dist/trainer/extractFacts.d.ts.map +0 -1
  720. package/dist/trainer/extractFacts.js +0 -213
  721. package/dist/trainer/extractFacts.js.map +0 -1
  722. package/dist/trainer/index.d.ts +0 -54
  723. package/dist/trainer/index.d.ts.map +0 -1
  724. package/dist/trainer/index.js +0 -82
  725. package/dist/trainer/index.js.map +0 -1
  726. package/dist/trainer/llmExtractor.d.ts +0 -16
  727. package/dist/trainer/llmExtractor.d.ts.map +0 -1
  728. package/dist/trainer/llmExtractor.js +0 -146
  729. package/dist/trainer/llmExtractor.js.map +0 -1
  730. package/dist/trainer/marker.d.ts +0 -10
  731. package/dist/trainer/marker.d.ts.map +0 -1
  732. package/dist/trainer/marker.js +0 -28
  733. package/dist/trainer/marker.js.map +0 -1
  734. package/dist/trainer/scheduler.d.ts +0 -33
  735. package/dist/trainer/scheduler.d.ts.map +0 -1
  736. package/dist/trainer/scheduler.js +0 -73
  737. package/dist/trainer/scheduler.js.map +0 -1
  738. package/dist/trainer/sessionLoader.d.ts +0 -26
  739. package/dist/trainer/sessionLoader.d.ts.map +0 -1
  740. package/dist/trainer/sessionLoader.js +0 -145
  741. package/dist/trainer/sessionLoader.js.map +0 -1
  742. package/dist/types.d.ts +0 -135
  743. package/dist/types.d.ts.map +0 -1
  744. package/dist/types.js +0 -8
  745. package/dist/types.js.map +0 -1
  746. package/src/adapters/ollamaClient.ts +0 -179
  747. package/src/adapters/openaiCompatClient.ts +0 -155
  748. package/src/adapters/piComplete.ts +0 -233
  749. package/src/bundle/install.ts +0 -206
  750. package/src/cache/memoryCaches.ts +0 -72
  751. package/src/config.ts +0 -180
  752. package/src/consolidation/enqueue.ts +0 -205
  753. package/src/consolidation/index.ts +0 -90
  754. package/src/consolidation/lock.ts +0 -41
  755. package/src/consolidation/log.ts +0 -43
  756. package/src/consolidation/memoryIndex.ts +0 -127
  757. package/src/consolidation/phase2/runPhase2.ts +0 -255
  758. package/src/consolidation/scheduler/launchd.ts +0 -62
  759. package/src/consolidation/scheduler/runConsolidate.ts +0 -115
  760. package/src/consolidation/scheduler/setupSchedule.ts +0 -106
  761. package/src/consolidation/scheduler/systemd.ts +0 -78
  762. package/src/consolidation/scheduler/types.ts +0 -27
  763. package/src/consolidation/scope.ts +0 -58
  764. package/src/consolidation/stage1/deltaExtract.ts +0 -29
  765. package/src/consolidation/stage1/drainQueue.ts +0 -143
  766. package/src/consolidation/stage1/extractSession.ts +0 -58
  767. package/src/consolidation/stage1/store.ts +0 -411
  768. package/src/consolidation/types.ts +0 -52
  769. package/src/errclass.ts +0 -37
  770. package/src/extension.ts +0 -23
  771. package/src/fallback/index.ts +0 -24
  772. package/src/fallback/llmRerank.ts +0 -97
  773. package/src/fallback/memoryMd.ts +0 -36
  774. package/src/fallback/sessionIndex.ts +0 -290
  775. package/src/fallback/sessionSearch.ts +0 -261
  776. package/src/local/graphQuery.ts +0 -252
  777. package/src/paths.ts +0 -28
  778. package/src/preflight/detectIntents.ts +0 -660
  779. package/src/preflight/hook.ts +0 -213
  780. package/src/service.ts +0 -306
  781. package/src/session/activeBranch.ts +0 -294
  782. package/src/settings.ts +0 -161
  783. package/src/sidecar/bundle.ts +0 -52
  784. package/src/sidecar/process.ts +0 -160
  785. package/src/tools/memoryAppend.ts +0 -166
  786. package/src/tools/memoryRecall.ts +0 -388
  787. package/src/trainer/bundleBuilder.ts +0 -192
  788. package/src/trainer/bundleLoader.ts +0 -105
  789. package/src/trainer/deltaMerge.ts +0 -221
  790. package/src/trainer/entityResolver.ts +0 -140
  791. package/src/trainer/extractFacts.ts +0 -312
  792. package/src/trainer/index.ts +0 -147
  793. package/src/trainer/llmExtractor.ts +0 -206
  794. package/src/trainer/marker.ts +0 -30
  795. package/src/trainer/scheduler.ts +0 -107
  796. package/src/trainer/sessionLoader.ts +0 -176
  797. package/src/types.ts +0 -168
  798. /package/dist/{consolidation/scheduler → adapters/embed}/types.js +0 -0
  799. /package/dist/{consolidation → adapters/llm}/types.js +0 -0
@@ -1,403 +1,182 @@
1
1
  import type { AgentMessage } from "@earendil-works/pi-agent-core";
2
- import type { UserMessage } from "@earendil-works/pi-ai";
3
- import { StringEnum } from "@earendil-works/pi-ai";
4
2
  import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
5
- import { truncateHead } from "@earendil-works/pi-coding-agent";
6
- import { Type } from "typebox";
7
-
8
- import {
9
- createOllamaLLMClient,
10
- createOllamaMemoryHelper,
11
- ollamaHealthCheck,
12
- type OllamaConfig,
13
- } from "./adapters/ollamaClient.js";
14
- import {
15
- createOpenAICompatLLMClient,
16
- createOpenAICompatMemoryHelper,
17
- openaiCompatHealthCheck,
18
- type OpenAICompatConfig,
19
- } from "./adapters/openaiCompatClient.js";
20
- import {
21
- createPiLLMClient,
22
- DEFAULT_HELPER_MODEL,
23
- DEFAULT_HELPER_PROVIDER,
24
- resolveMemoryHelperLLM,
25
- } from "./adapters/piComplete.js";
26
- import type { MemoryConfig } from "./config.js";
27
- import {
28
- getMemoryIndexStats,
29
- readMemoryIndexCap,
30
- } from "./consolidation/memoryIndex.js";
31
- import { readRecentConsolidationLogs } from "./consolidation/log.js";
32
- import { scopeForCwd } from "./consolidation/scope.js";
33
- import { enqueueSession, getConsolidationStatus } from "./consolidation/enqueue.js";
34
- import { defaultConsolidationDbPath } from "./consolidation/scheduler/runConsolidate.js";
35
- import { setupSchedule } from "./consolidation/scheduler/setupSchedule.js";
36
- import type { SchedulePlatform } from "./consolidation/scheduler/types.js";
37
- import {
38
- loadMemorySettings,
39
- resolveHelperModelSpec,
40
- saveMemorySettings,
41
- } from "./settings.js";
42
- import { createFallbackQuery } from "./fallback/index.js";
43
- import type { RerankOptions } from "./fallback/llmRerank.js";
44
- import type { MemoryHelperLLM } from "./preflight/detectIntents.js";
45
- import { runMemoryPreflight } from "./preflight/hook.js";
3
+ import findLastIndex from "lodash/findLastIndex.js";
4
+
5
+ import { createLlmClient, type LlmClient } from "./adapters/llm/index.js";
6
+ import { loadEnv, readPiMemoryEnv, resolveMemoryAgentDir } from "./config/index.js";
7
+ import { createConsolidateScheduler, startConsolidateInterval, type ConsolidateScheduler } from "./consolidate/scheduler.js";
8
+ import { registerCommands } from "./commands/index.js";
9
+ import { registerCompactHandlers } from "./compact/register.js";
10
+ import { runEpisodicPreflight } from "./preflight/episodic.js";
11
+ import { mergePrivateMemoryBlocks, renderMemoryCapPrivateMemory } from "./preflight/render.js";
12
+ import { isSubagentSession } from "./preflight/session.js";
46
13
  import { injectPrivateMemoryContext } from "./preflight/strip.js";
47
- import { MemoryService } from "./service.js";
48
- import type { LLMClient } from "./trainer/llmExtractor.js";
49
- import {
50
- createMemoryAppendTool,
51
- MEMORY_APPEND_DESCRIPTION,
52
- MEMORY_APPEND_NAME,
53
- MEMORY_APPEND_PROMPT_GUIDELINES,
54
- MEMORY_APPEND_PROMPT_SNIPPET,
55
- } from "./tools/memoryAppend.js";
56
- import {
57
- createMemoryRecallTool,
58
- MEMORY_RECALL_DESCRIPTION,
59
- MEMORY_RECALL_NAME,
60
- MEMORY_RECALL_PROMPT_GUIDELINES,
61
- MEMORY_RECALL_PROMPT_SNIPPET,
62
- } from "./tools/memoryRecall.js";
63
-
64
- const MemoryRecallParams = Type.Object({
65
- mode: Type.Optional(
66
- StringEnum(["direct_relation", "path_query", "typed_neighborhood"] as const),
67
- ),
68
- anchor_mentions: Type.Array(Type.String()),
69
- relation_constraints: Type.Optional(Type.Array(Type.String())),
70
- candidate_type: Type.Optional(Type.String()),
71
- scope_filter: Type.Optional(Type.Array(Type.String())),
72
- target_slot: Type.Optional(StringEnum(["head", "tail"] as const)),
73
- time_window: Type.Optional(Type.String()),
74
- evidence_budget: Type.Optional(Type.Number()),
75
- result_limit: Type.Optional(Type.Number()),
76
- });
77
-
78
- const MemoryAppendParams = Type.Object({
79
- content: Type.String({ description: "New entries to append (markdown bullet points)." }),
80
- });
81
-
82
- const RECALL_MAX_LINES = 200;
83
- const RECALL_MAX_BYTES = 32_000;
84
-
85
- let sharedService: MemoryService | null = null;
86
- let sessionCfg: MemoryConfig | null = null;
87
- let settingsHelperModel: string | undefined;
88
- let settingsOllama: OllamaConfig | null = null;
89
- let settingsVllm: OpenAICompatConfig | null = null;
90
- let sharedHelper: MemoryHelperLLM | null = null;
91
- let sharedLLMClient: LLMClient | null = null;
92
- let turnMemoryIndex: string | null = null;
93
- /**
94
- * Per-turn preflight result, set by before_agent_start and consumed by context.
95
- * userPayload = raw event.prompt (no host scaffolding).
96
- * privateContext = <private_memory> block to inject.
97
- */
98
- let turnPreflight: { userPayload: string; privateContext: string } | null = null;
99
-
100
- /**
101
- * True on the very first turn of a session; used to force the intent helper
102
- * (bypassing the lexical gate) so the first message always checks memory.
103
- */
14
+ import { enqueueShutdownMetadata, readParentSession } from "./shutdown/enqueue.js";
15
+ import { resolveSidecarPaths } from "./sidecar/paths.js";
16
+ import { formatTimestamp } from "./utils/time.js";
17
+ import { createReindexScheduler, type ReindexScheduler } from "./sidecar/reindexBridge.js";
18
+ import { ensureSidecarRunning, stopSidecar } from "./sidecar/sidecarManager.js";
19
+ import { MemoryStore } from "./store/memoryStore.js";
20
+
21
+ loadEnv();
22
+
23
+ type TurnPreflight = {
24
+ userPayload: string;
25
+ privateContext: string;
26
+ };
27
+
28
+ let memoryStore: MemoryStore | null = null;
29
+ let sidecarPaths: ReturnType<typeof resolveSidecarPaths> | null = null;
30
+ let reindexScheduler: ReindexScheduler | null = null;
31
+ let consolidateScheduler: ConsolidateScheduler | null = null;
32
+ let stopConsolidateInterval: (() => void) | null = null;
33
+ let llmClient: LlmClient | null = null;
34
+ let sessionMemoryCap: string | null = null;
35
+ let turnPreflight: TurnPreflight | null = null;
104
36
  let isFirstTurn = false;
105
-
106
- export function getSharedMemoryService(): MemoryService | null {
107
- return sharedService;
108
- }
109
-
110
- function getHelperModelSpec(pi: ExtensionAPI): string | undefined {
111
- return resolveHelperModelSpec(pi.getFlag("memory-helper-model"), settingsHelperModel);
112
- }
113
-
114
- function isOllamaModel(spec: string | undefined): boolean {
115
- return !!spec?.startsWith("ollama/");
116
- }
117
-
118
- async function refreshMemoryHelper(ctx: ExtensionContext, pi: ExtensionAPI): Promise<void> {
119
- const helperModel = getHelperModelSpec(pi);
120
-
121
- if (settingsVllm) {
122
- const vllmOk = await openaiCompatHealthCheck(settingsVllm.baseUrl);
123
- if (vllmOk) {
124
- sharedHelper = createOpenAICompatMemoryHelper(settingsVllm);
125
- sharedLLMClient = createOpenAICompatLLMClient(settingsVllm);
126
- return;
127
- }
128
- }
129
-
130
- if ((isOllamaModel(helperModel) || settingsOllama) && settingsOllama) {
131
- const ollamaOk = await ollamaHealthCheck(settingsOllama.baseUrl);
132
- if (ollamaOk) {
133
- sharedHelper = createOllamaMemoryHelper(settingsOllama);
134
- sharedLLMClient = createOllamaLLMClient(settingsOllama);
135
- return;
136
- }
137
- }
138
-
139
- sharedHelper = await resolveMemoryHelperLLM(ctx, helperModel);
140
- sharedLLMClient = createPiLLMClient(ctx, helperModel);
141
- }
142
-
143
- function getRerankOpts(): RerankOptions | null {
144
- if (!sharedLLMClient) return null;
145
- return { client: sharedLLMClient };
146
- }
37
+ let isSubagent = false;
147
38
 
148
39
  function getUserMessageText(message: AgentMessage): string | null {
149
40
  if (message.role !== "user") return null;
150
- const user = message as UserMessage;
151
- if (typeof user.content === "string") return user.content;
152
- return user.content
153
- .filter((block): block is { type: "text"; text: string } => block.type === "text")
41
+ if (typeof message.content === "string") return message.content;
42
+ return message.content
43
+ .filter((block) => block.type === "text")
154
44
  .map((block) => block.text)
155
45
  .join("\n");
156
46
  }
157
47
 
158
- function setUserMessageText(message: UserMessage, text: string): UserMessage {
159
- return { ...message, content: text };
48
+ function setUserMessageText(message: AgentMessage, text: string): AgentMessage {
49
+ if (message.role !== "user") return message;
50
+ return { ...message, content: text } as AgentMessage;
160
51
  }
161
52
 
162
53
  function findLastUserMessageIndex(messages: AgentMessage[]): number {
163
- for (let i = messages.length - 1; i >= 0; i--) {
164
- if (messages[i]?.role === "user") return i;
165
- }
166
- return -1;
54
+ return findLastIndex(messages, (message) => message.role === "user");
167
55
  }
168
56
 
169
- function formatMemoryStatus(service: MemoryService): string {
170
- const snap = service.getStatus();
171
- const lines = [
172
- `status: ${snap.status}`,
173
- snap.mode ? `mode: ${snap.mode}` : null,
174
- snap.reason ? `reason: ${snap.reason}` : null,
175
- sharedHelper
176
- ? `helper: ${settingsVllm ? `vllm/${settingsVllm.model}` : settingsOllama ? `ollama/${settingsOllama.model}` : (settingsHelperModel ?? "pi-ai")}`
177
- : "helper: none (regex only)",
178
- settingsVllm ? `vllm: ${settingsVllm.baseUrl} (${settingsVllm.model})` : null,
179
- settingsOllama ? `ollama: ${settingsOllama.baseUrl} (${settingsOllama.model})` : null,
180
- snap.health ? `health: ${JSON.stringify(snap.health)}` : null,
181
- ].filter(Boolean);
182
- return lines.join("\n");
57
+ async function refreshLlm(ctx: ExtensionContext, pi: ExtensionAPI): Promise<void> {
58
+ const env = readPiMemoryEnv();
59
+ const flagModel = pi.getFlag("memory-helper-model");
60
+ const modelSpec = typeof flagModel === "string" ? flagModel : env.helperModel;
61
+ llmClient = await createLlmClient({ ctx, modelSpec, env });
183
62
  }
184
63
 
185
- async function formatVerboseMemoryStatus(
186
- service: MemoryService,
187
- cfg: MemoryConfig,
188
- ): Promise<string> {
189
- const base = formatMemoryStatus(service);
190
- const queue = getConsolidationStatus(defaultConsolidationDbPath(cfg));
191
- const indexStats = getMemoryIndexStats(cfg.memoryMdPaths, {
192
- maxLines: cfg.consolidation.memory_index_max_lines,
193
- maxBytes: cfg.consolidation.memory_index_max_bytes,
64
+ async function bootstrapSidecar(): Promise<void> {
65
+ if (!memoryStore || !sidecarPaths) return;
66
+
67
+ await memoryStore.ensureInitialized();
68
+ await ensureSidecarRunning({
69
+ socketPath: sidecarPaths.socketPath,
70
+ dbPath: sidecarPaths.dbPath,
194
71
  });
195
- const logs = await readRecentConsolidationLogs(
196
- cfg.consolidation.schedule.log_path,
197
- 5,
198
- );
199
- const schedule = await formatScheduleStatus(cfg);
200
- return [
201
- base,
202
- "",
203
- `queue: pending=${queue.pending} processing=${queue.processing} done=${queue.done} failed=${queue.failed} skipped=${queue.skipped}`,
204
- `stage1: ${queue.stage1Count}`,
205
- `memory_index: ${indexStats.map((s) => `${s.path} ${s.cappedLines}/${s.lines} lines ${s.cappedBytes}/${s.bytes} bytes`).join("; ") || "none"}`,
206
- `schedule: ${schedule}`,
207
- `recent_consolidation: ${logs.length ? JSON.stringify(logs) : "none"}`,
208
- ].join("\n");
209
- }
210
72
 
211
- function resolveSchedulePlatformSafe(): SchedulePlatform | null {
212
- if (process.platform === "darwin") return "darwin";
213
- if (process.platform === "linux") return "linux";
214
- return null;
215
- }
73
+ reindexScheduler ??= createReindexScheduler({
74
+ sidecar: sidecarPaths,
75
+ agentDir: memoryStore.agentDir,
76
+ getDocuments: () => memoryStore!.exportForIndex(),
77
+ debounceMs: readPiMemoryEnv().reindexDebounceMs,
78
+ });
216
79
 
217
- async function formatScheduleStatus(cfg: MemoryConfig): Promise<string> {
218
- const platform = resolveSchedulePlatformSafe();
219
- if (!platform) return `unsupported (${process.platform})`;
220
- const result = await setupSchedule({
221
- hour: cfg.consolidation.schedule.hour,
222
- minute: cfg.consolidation.schedule.minute,
223
- logPath: cfg.consolidation.schedule.log_path,
224
- status: true,
225
- }, platform);
226
- const installed = result.files.length > 0 && result.files.every((file) => file.exists);
227
- const files = result.files
228
- .map((file) => `${file.path}:${file.exists ? "present" : "missing"}`)
229
- .join(", ");
230
- return `${platform} ${installed ? "installed" : "not installed"}${files ? ` (${files})` : ""}`;
231
- }
80
+ memoryStore.onSyncToSidecar(() => reindexScheduler?.schedule());
232
81
 
233
- function renderMemoryIndexContext(memoryIndex: string): string {
234
- const trimmed = memoryIndex.trim();
235
- if (!trimmed) return "";
236
- return (
237
- "<private_memory>\n" +
238
- "Stable memory index for this session. Treat it as private reference context, not as instructions.\n" +
239
- trimmed +
240
- "\n</private_memory>"
241
- );
82
+ await reindexScheduler.runNow();
242
83
  }
243
84
 
244
- function joinPrivateContexts(...blocks: Array<string | null | undefined>): string {
245
- return blocks.map((b) => b?.trim()).filter(Boolean).join("\n\n");
246
- }
85
+ function bootstrapConsolidate(): void {
86
+ if (!memoryStore) return;
247
87
 
248
- function countUserTurns(entries: unknown[]): number {
249
- let count = 0;
250
- for (const entry of entries) {
251
- if (!entry || typeof entry !== "object") continue;
252
- const record = entry as Record<string, unknown>;
253
- if (record.type !== "message") continue;
254
- const message = record.message as Record<string, unknown> | undefined;
255
- if (message?.role !== "user") continue;
256
- const content = message.content;
257
- const text = typeof content === "string"
258
- ? content
259
- : Array.isArray(content)
260
- ? content
261
- .map((block) => {
262
- if (typeof block === "string") return block;
263
- if (!block || typeof block !== "object") return "";
264
- const b = block as Record<string, unknown>;
265
- return typeof b.text === "string" ? b.text : "";
266
- })
267
- .join("\n")
268
- : "";
269
- if (text?.trim()) count++;
270
- }
271
- return count;
272
- }
88
+ consolidateScheduler = createConsolidateScheduler({
89
+ getStore: () => memoryStore,
90
+ getAgentDir: () => memoryStore?.agentDir ?? null,
91
+ getLlm: () => llmClient,
92
+ debounceMs: readPiMemoryEnv().consolidateDebounceMs,
93
+ onComplete: preloadSessionMemoryCap,
94
+ });
273
95
 
274
- function memoryPathsForContext(cfg: MemoryConfig, cwd: string): string[] {
275
- const scope = scopeForCwd(cwd);
276
- const projectPath = scope.projectHash
277
- ? `${cfg.bundleRoot}/projects/${scope.projectHash}/MEMORY.md`
278
- : null;
279
- return projectPath ? [...cfg.memoryMdPaths, projectPath] : cfg.memoryMdPaths;
280
- }
96
+ memoryStore.onConsolidateCheck(() => consolidateScheduler?.schedule());
97
+
98
+ stopConsolidateInterval?.();
99
+ stopConsolidateInterval = startConsolidateInterval(() => {
100
+ void consolidateScheduler?.runNow();
101
+ });
281
102
 
282
- function parseSessionIdFromFile(filePath: string | null): string | null {
283
- if (!filePath) return null;
284
- const base = filePath.split(/[\\/]/).pop()?.replace(/\.[^.]+$/, "") ?? "";
285
- const underscore = base.lastIndexOf("_");
286
- return underscore >= 0 ? base.slice(underscore + 1) : (base || null);
103
+ void consolidateScheduler.runNow();
287
104
  }
288
105
 
289
- function getParentSessionFile(ctx: ExtensionContext): string | null {
290
- const header = ctx.sessionManager.getHeader() as unknown as
291
- | Record<string, unknown>
292
- | undefined;
293
- const raw = header?.parentSession ?? header?.parent_session;
294
- return typeof raw === "string" && raw.trim() ? raw.trim() : null;
106
+ async function preloadSessionMemoryCap(): Promise<void> {
107
+ if (!memoryStore) return;
108
+ const fallback = await memoryStore.readForFallback();
109
+ sessionMemoryCap = renderMemoryCapPrivateMemory(fallback) || null;
295
110
  }
296
111
 
297
112
  export default function piMemoryExtension(pi: ExtensionAPI): void {
298
- pi.registerFlag("memory-helper-model", {
299
- description: `Model for memory intent helper (default: ${DEFAULT_HELPER_PROVIDER}/${DEFAULT_HELPER_MODEL})`,
300
- type: "string",
301
- });
302
-
303
113
  pi.on("session_start", async (_event, ctx) => {
304
- const loaded = loadMemorySettings();
305
- const cfg = loaded.config;
306
- settingsHelperModel = loaded.helperModel;
307
- settingsOllama = loaded.ollama;
308
- settingsVllm = loaded.vllm;
309
- sessionCfg = cfg;
310
- turnPreflight = null;
311
- turnMemoryIndex = null;
114
+ const agentDir = resolveMemoryAgentDir();
115
+ memoryStore = new MemoryStore({ agentDir });
116
+ sidecarPaths = resolveSidecarPaths(agentDir);
117
+ isSubagent = isSubagentSession(ctx);
312
118
  isFirstTurn = true;
313
- sharedHelper = null;
314
-
315
- if (cfg.provider === "disabled") return;
119
+ turnPreflight = null;
316
120
 
317
- const service = new MemoryService(cfg);
318
- sharedService = service;
121
+ await refreshLlm(ctx, pi);
319
122
 
320
- await service.start();
321
- service.startSessionIndex();
322
- if (cfg.trainer.auto_interval) {
323
- service.startAutoTrainer();
324
- }
325
123
  try {
326
- await refreshMemoryHelper(ctx, pi);
124
+ await bootstrapSidecar();
125
+ bootstrapConsolidate();
126
+ await preloadSessionMemoryCap();
327
127
  } catch {
328
- /* helper unavailable regex-only preflight */
128
+ // sidecar optional; preflight falls back to MEMORY.md
329
129
  }
330
130
  });
331
131
 
332
- pi.on("session_shutdown", async (_event, ctx) => {
333
- const cfg = sessionCfg;
334
- if (cfg && cfg.provider !== "disabled" && cfg.consolidation.enabled !== false) {
335
- const sessionFile = ctx.sessionManager.getSessionFile();
336
- const sessionId = ctx.sessionManager.getSessionId();
337
- if (sessionFile && sessionId) {
338
- const scope = scopeForCwd(ctx.cwd);
339
- const parentSessionFile = getParentSessionFile(ctx);
340
- try {
341
- enqueueSession(defaultConsolidationDbPath(cfg), {
342
- session_id: sessionId,
343
- session_file: sessionFile,
344
- cwd: ctx.cwd,
345
- git_root: scope.gitRoot,
346
- project_hash: scope.projectHash,
347
- parent_session_id: parseSessionIdFromFile(parentSessionFile),
348
- parent_session_file: parentSessionFile,
349
- user_turn_count: countUserTurns(ctx.sessionManager.getBranch()),
350
- ended_at: new Date().toISOString(),
351
- }, {
352
- enabled: cfg.consolidation.enabled,
353
- minUserTurns: cfg.consolidation.min_user_turns,
354
- });
355
- } catch {
356
- /* shutdown enqueue must never block session teardown */
357
- }
358
- }
132
+ pi.on("session_shutdown", async (event, ctx) => {
133
+ if (memoryStore) {
134
+ const header = ctx.sessionManager.getHeader() as unknown as Record<string, unknown> | null;
135
+ void enqueueShutdownMetadata(memoryStore.agentDir, {
136
+ sessionFile: ctx.sessionManager.getSessionFile() ?? "",
137
+ parentSession: readParentSession(header),
138
+ reason: event.reason,
139
+ isSubagent,
140
+ enqueuedAt: formatTimestamp(),
141
+ }).catch(() => {});
359
142
  }
360
- if (sharedService) {
361
- await sharedService.stop();
362
- sharedService = null;
363
- }
364
- sessionCfg = null;
365
- settingsHelperModel = undefined;
366
- settingsOllama = null;
367
- settingsVllm = null;
368
- sharedHelper = null;
369
- sharedLLMClient = null;
143
+
144
+ stopConsolidateInterval?.();
145
+ stopConsolidateInterval = null;
146
+ consolidateScheduler = null;
147
+ reindexScheduler = null;
148
+ memoryStore = null;
149
+ sidecarPaths = null;
150
+ llmClient = null;
151
+ sessionMemoryCap = null;
370
152
  turnPreflight = null;
371
- turnMemoryIndex = null;
372
153
  isFirstTurn = false;
373
- });
154
+ isSubagent = false;
374
155
 
375
- pi.on("model_select", async (_event, ctx) => {
376
- await refreshMemoryHelper(ctx, pi);
156
+ try {
157
+ await stopSidecar();
158
+ } catch {
159
+ // ignore shutdown errors
160
+ }
377
161
  });
378
162
 
379
- pi.on("agent_start", () => {
380
- turnPreflight = null;
163
+ pi.on("model_select", async (_event, ctx) => {
164
+ await refreshLlm(ctx, pi);
381
165
  });
382
166
 
383
167
  pi.on("before_agent_start", async (event, ctx) => {
384
- const service = sharedService;
385
- const cfg = sessionCfg;
386
- if (!service || !cfg || cfg.provider === "disabled") return;
168
+ if (!memoryStore || !sidecarPaths) return;
387
169
 
388
- const userPayload = String(((event as unknown) as { prompt?: string }).prompt ?? "").trim();
170
+ const userPayload = String(event.prompt ?? "").trim();
389
171
  if (!userPayload) return;
390
172
 
391
173
  const forceHelper = isFirstTurn;
392
174
  isFirstTurn = false;
393
- const scope = scopeForCwd(ctx.cwd);
394
- const memoryPaths = memoryPathsForContext(cfg, ctx.cwd);
395
- const memoryIndex = readMemoryIndexCap(memoryPaths, {
396
- maxLines: cfg.consolidation.memory_index_max_lines,
397
- maxBytes: cfg.consolidation.memory_index_max_bytes,
398
- scopes: scope.scopes,
399
- });
400
- turnMemoryIndex = memoryIndex ? renderMemoryIndexContext(memoryIndex) : null;
175
+
176
+ if (isSubagent) {
177
+ turnPreflight = { userPayload, privateContext: sessionMemoryCap ?? "" };
178
+ return;
179
+ }
401
180
 
402
181
  const workingUi = ctx.hasUI
403
182
  ? {
@@ -409,234 +188,28 @@ export default function piMemoryExtension(pi: ExtensionAPI): void {
409
188
 
410
189
  try {
411
190
  workingUi?.show("Recalling memory…");
412
- const result = await runMemoryPreflight(userPayload, service, {
413
- helper: sharedHelper,
414
- forceHelper,
415
- fallback,
191
+ const env = readPiMemoryEnv();
192
+ const result = await runEpisodicPreflight(userPayload, {
193
+ socketPath: sidecarPaths.socketPath,
194
+ agentDir: memoryStore.agentDir,
195
+ store: memoryStore,
196
+ llm: llmClient,
197
+ force: forceHelper,
198
+ budgetMs: env.preflightBudgetMs,
416
199
  signal: ctx.signal,
417
- rerankOpts: getRerankOpts(),
418
200
  onProgress: workingUi?.update,
419
- memoryIndex: {
420
- paths: memoryPaths,
421
- maxLines: cfg.consolidation.memory_index_max_lines,
422
- maxBytes: cfg.consolidation.memory_index_max_bytes,
423
- scopes: scope.scopes,
424
- },
425
201
  });
426
- turnPreflight = result?.privateContext
427
- ? { userPayload, privateContext: result.privateContext }
428
- : null;
202
+
203
+ const episodicContext = result?.privateContext ?? null;
204
+ const combined = mergePrivateMemoryBlocks(sessionMemoryCap, episodicContext);
205
+ turnPreflight = { userPayload, privateContext: combined ?? "" };
429
206
  } finally {
430
207
  workingUi?.clear();
431
208
  }
432
209
  });
433
210
 
434
- const initialSettings = loadMemorySettings();
435
- settingsHelperModel = initialSettings.helperModel;
436
- settingsOllama = initialSettings.ollama;
437
- settingsVllm = initialSettings.vllm;
438
-
439
- const fallback = createFallbackQuery({
440
- sessionsDir: initialSettings.config.sessionsDir,
441
- memoryMdPaths: initialSettings.config.memoryMdPaths,
442
- });
443
-
444
- pi.registerCommand("memory", {
445
- description: "Show pi-memory status and bundle info",
446
- handler: async (args, ctx) => {
447
- const service = sharedService;
448
- if (!service) {
449
- ctx.ui.notify("pi-memory: service not started", "warning");
450
- return;
451
- }
452
- const wantsVerbose = Array.isArray(args)
453
- ? args.includes("--verbose")
454
- : String(args ?? "").includes("--verbose");
455
- const cfg = sessionCfg;
456
- ctx.ui.notify(
457
- wantsVerbose && cfg
458
- ? await formatVerboseMemoryStatus(service, cfg)
459
- : formatMemoryStatus(service),
460
- "info",
461
- );
462
- },
463
- });
464
-
465
- pi.registerCommand("memory-setup", {
466
- description: "Configure pi-memory LLM backend (Ollama model, remote API, or disable)",
467
- handler: async (_args, ctx) => {
468
- const backend = await ctx.ui.select("Select LLM backend for pi-memory:", [
469
- "ollama — Local Ollama (recommended for edge)",
470
- "remote — Remote API (deepseek-v4-flash)",
471
- "none — No LLM (regex only, zero dependencies)",
472
- ]);
473
- if (!backend) return;
474
-
475
- const choice = backend.split(/\s/)[0]!;
476
-
477
- if (choice === "none") {
478
- saveMemorySettings({ helperModel: undefined, ollama: undefined, vllm: undefined });
479
- settingsOllama = null;
480
- settingsVllm = null;
481
- settingsHelperModel = undefined;
482
- sharedHelper = null;
483
- sharedLLMClient = null;
484
- ctx.ui.notify("LLM disabled. Memory will use regex-only intent detection.", "info");
485
- return;
486
- }
487
-
488
- if (choice === "remote") {
489
- const model = await ctx.ui.input(
490
- "Remote model (provider/model):",
491
- "deepseek/deepseek-v4-flash",
492
- );
493
- if (!model?.trim()) return;
494
- saveMemorySettings({
495
- helperModel: model.trim(),
496
- ollama: undefined,
497
- vllm: undefined,
498
- });
499
- settingsOllama = null;
500
- settingsVllm = null;
501
- settingsHelperModel = model.trim();
502
- try {
503
- await refreshMemoryHelper(ctx, pi);
504
- ctx.ui.notify(`Remote LLM set to: ${model.trim()}`, "info");
505
- } catch {
506
- ctx.ui.notify(`Model set but auth failed. Check API key for ${model.trim()}.`, "warning");
507
- }
508
- return;
509
- }
510
-
511
- if (choice === "ollama") {
512
- const baseUrl = await ctx.ui.input("Ollama base URL:", "http://localhost:11434");
513
- if (!baseUrl?.trim()) return;
514
-
515
- const healthy = await ollamaHealthCheck(baseUrl.trim());
516
- if (!healthy) {
517
- const proceed = await ctx.ui.confirm(
518
- "Ollama not reachable",
519
- `Cannot connect to ${baseUrl.trim()}. Save config anyway?`,
520
- );
521
- if (!proceed) return;
522
- }
523
-
524
- const model = await ctx.ui.select("Select Ollama model:", [
525
- "qwen3.5:0.8b — 500MB, 2GB RAM (minimal edge)",
526
- "qwen3.5:2b — 1.5GB, 4GB RAM (recommended)",
527
- "qwen3.5:4b — 2.5GB, 8GB RAM (stronger)",
528
- "qwen3.5:9b — 5GB, 16GB RAM (desktop)",
529
- "custom — Enter model name manually",
530
- ]);
531
- if (!model) return;
532
-
533
- let modelName: string;
534
- if (model.startsWith("custom")) {
535
- const custom = await ctx.ui.input("Ollama model name:", "qwen3.5:2b");
536
- if (!custom?.trim()) return;
537
- modelName = custom.trim();
538
- } else {
539
- modelName = model.split(/\s/)[0]!;
540
- }
541
-
542
- const ollamaCfg = { baseUrl: baseUrl.trim(), model: modelName };
543
- saveMemorySettings({
544
- helperModel: `ollama/${modelName}`,
545
- ollama: ollamaCfg,
546
- vllm: undefined,
547
- });
548
- settingsOllama = ollamaCfg;
549
- settingsVllm = null;
550
- settingsHelperModel = `ollama/${modelName}`;
551
-
552
- try {
553
- await refreshMemoryHelper(ctx, pi);
554
- ctx.ui.notify(
555
- `Ollama configured: ${modelName} at ${baseUrl.trim()}\n` +
556
- (sharedHelper ? "Helper LLM active." : "Ollama offline — using regex fallback."),
557
- sharedHelper ? "info" : "warning",
558
- );
559
- } catch {
560
- ctx.ui.notify(`Config saved. Ollama offline — will retry on next session start.`, "warning");
561
- }
562
- return;
563
- }
564
- },
565
- });
566
-
567
- pi.registerTool({
568
- name: MEMORY_RECALL_NAME,
569
- label: "Memory Recall",
570
- description: MEMORY_RECALL_DESCRIPTION,
571
- promptSnippet: MEMORY_RECALL_PROMPT_SNIPPET,
572
- promptGuidelines: [...MEMORY_RECALL_PROMPT_GUIDELINES],
573
- parameters: MemoryRecallParams,
574
- async execute(_toolCallId, params, signal, onUpdate) {
575
- const service = sharedService;
576
- if (!service) {
577
- return {
578
- content: [{ type: "text", text: "Memory service not started." }],
579
- details: { truncated: false },
580
- isError: true,
581
- };
582
- }
583
- const onProgress = onUpdate
584
- ? (msg: string) =>
585
- (onUpdate as (u: { content: unknown[]; details: Record<string, unknown> }) => void)?.({
586
- content: [{ type: "text", text: msg }],
587
- details: { phase: "querying" },
588
- })
589
- : undefined;
590
- const tool = createMemoryRecallTool(service, fallback, getRerankOpts());
591
- const result = await tool.run(JSON.stringify(params), signal, onProgress);
592
- const truncated = truncateHead(result.content, {
593
- maxLines: RECALL_MAX_LINES,
594
- maxBytes: RECALL_MAX_BYTES,
595
- });
596
- let text = truncated.content;
597
- if (truncated.truncated) {
598
- text += `\n\n[truncated: ${truncated.totalLines} lines, ${truncated.totalBytes} bytes]`;
599
- }
600
- return {
601
- content: [{ type: "text", text }],
602
- details: { truncated: truncated.truncated },
603
- isError: result.isError ?? false,
604
- };
605
- },
606
- });
607
-
608
- const memoryMdPath = initialSettings.config.memoryMdPaths[0];
609
- if (memoryMdPath) {
610
- pi.registerTool({
611
- name: MEMORY_APPEND_NAME,
612
- label: "Memory Append",
613
- description: MEMORY_APPEND_DESCRIPTION,
614
- promptSnippet: MEMORY_APPEND_PROMPT_SNIPPET,
615
- promptGuidelines: [...MEMORY_APPEND_PROMPT_GUIDELINES],
616
- parameters: MemoryAppendParams,
617
- async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
618
- const cfg = sessionCfg ?? initialSettings.config;
619
- const scope = scopeForCwd(ctx.cwd);
620
- const appendTool = createMemoryAppendTool(memoryMdPath, {
621
- dbPath: defaultConsolidationDbPath(cfg),
622
- sessionId: ctx.sessionManager.getSessionId(),
623
- sessionFile: ctx.sessionManager.getSessionFile(),
624
- scope: scope.scopes.at(-1),
625
- });
626
- const result = await appendTool.run(JSON.stringify(params));
627
- return {
628
- content: [{ type: "text", text: result.content }],
629
- details: {},
630
- isError: result.isError ?? false,
631
- };
632
- },
633
- });
634
- }
635
-
636
211
  pi.on("context", async (event, ctx) => {
637
- const service = sharedService;
638
- const cfg = sessionCfg;
639
- if (!service || !cfg || cfg.provider === "disabled") return;
212
+ if (!memoryStore || !sidecarPaths) return;
640
213
 
641
214
  const userIndex = findLastUserMessageIndex(event.messages);
642
215
  if (userIndex < 0) return;
@@ -647,57 +220,55 @@ export default function piMemoryExtension(pi: ExtensionAPI): void {
647
220
  let privateContext: string | undefined;
648
221
  let userPayload: string;
649
222
 
650
- if (turnPreflight?.privateContext) {
651
- // Happy path: before_agent_start already ran preflight.
652
- // userPayload is the raw prompt; scaffolded may have host-added prefix.
653
- privateContext = turnPreflight.privateContext;
223
+ if (turnPreflight && turnPreflight.userPayload === scaffolded.trim()) {
224
+ privateContext = turnPreflight.privateContext || undefined;
654
225
  userPayload = turnPreflight.userPayload;
655
226
  } else {
656
- // Fallback: before_agent_start didn't fire (e.g. first context after
657
- // session restore). Run preflight inline; no scaffold separation.
658
- const userTurnCount = event.messages.filter((m) => m.role === "user").length;
659
- const preflight = await runMemoryPreflight(scaffolded, service, {
660
- helper: sharedHelper,
661
- forceHelper: userTurnCount === 1,
662
- fallback,
663
- signal: ctx.signal,
664
- rerankOpts: getRerankOpts(),
665
- memoryIndex: {
666
- paths: memoryPathsForContext(cfg, ctx.cwd),
667
- maxLines: cfg.consolidation.memory_index_max_lines,
668
- maxBytes: cfg.consolidation.memory_index_max_bytes,
669
- scopes: scopeForCwd(ctx.cwd).scopes,
670
- },
671
- });
672
- if (!preflight?.privateContext && !turnMemoryIndex) return;
673
- privateContext = preflight?.privateContext;
674
- userPayload = scaffolded;
675
- // Cache so tool-call follow-up context calls reuse without re-running.
676
- if (privateContext) {
677
- turnPreflight = { userPayload: scaffolded, privateContext };
227
+ const userTurnCount = event.messages.filter((message) => message.role === "user").length;
228
+ const env = readPiMemoryEnv();
229
+
230
+ if (isSubagent) {
231
+ privateContext = sessionMemoryCap ?? undefined;
232
+ userPayload = scaffolded;
233
+ turnPreflight = { userPayload: scaffolded, privateContext: privateContext ?? "" };
234
+ } else {
235
+ const preflight = await runEpisodicPreflight(scaffolded, {
236
+ socketPath: sidecarPaths.socketPath,
237
+ agentDir: memoryStore.agentDir,
238
+ store: memoryStore,
239
+ llm: llmClient,
240
+ force: userTurnCount === 1,
241
+ budgetMs: env.preflightBudgetMs,
242
+ signal: ctx.signal,
243
+ });
244
+ privateContext = mergePrivateMemoryBlocks(
245
+ sessionMemoryCap,
246
+ preflight?.privateContext,
247
+ ) || undefined;
248
+ userPayload = scaffolded;
249
+ turnPreflight = { userPayload: scaffolded, privateContext: privateContext ?? "" };
678
250
  }
679
251
  }
680
252
 
681
- const combinedPrivateContext = joinPrivateContexts(
682
- turnMemoryIndex,
683
- privateContext,
684
- );
685
- if (!combinedPrivateContext) return;
686
-
687
- const injectedText = injectPrivateMemoryContext(
688
- scaffolded,
689
- userPayload,
690
- combinedPrivateContext,
691
- );
253
+ if (!privateContext) return;
692
254
 
255
+ const injectedText = injectPrivateMemoryContext(scaffolded, userPayload, privateContext);
693
256
  const messages = [...event.messages];
694
- messages[userIndex] = setUserMessageText(
695
- messages[userIndex] as UserMessage,
696
- injectedText,
697
- );
698
-
257
+ messages[userIndex] = setUserMessageText(messages[userIndex]!, injectedText);
699
258
  return { messages };
700
259
  });
260
+
261
+ registerCommands(pi, {
262
+ getMemoryStore: () => memoryStore,
263
+ onRemembered: preloadSessionMemoryCap,
264
+ getAgentDir: () => memoryStore?.agentDir ?? resolveMemoryAgentDir(),
265
+ });
266
+
267
+ registerCompactHandlers(pi, {
268
+ getMemoryStore: () => memoryStore,
269
+ getLlmClient: () => llmClient,
270
+ onCompactionIngested: preloadSessionMemoryCap,
271
+ });
701
272
  }
702
273
 
703
274
  export { piMemoryExtension };