@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
@@ -1,160 +0,0 @@
1
- import { access, constants } from "node:fs/promises";
2
- import fs from "node:fs";
3
- import path from "node:path";
4
- import { spawn, type ChildProcess } from "node:child_process";
5
-
6
- import type { MemoryConfig } from "../config.js";
7
- import { SidecarClient } from "./client.js";
8
-
9
- export class SidecarProcess {
10
- private child: ChildProcess | null = null;
11
- private readonly client: SidecarClient;
12
-
13
- constructor(private readonly cfg: MemoryConfig) {
14
- this.client = new SidecarClient(
15
- cfg.socketPath,
16
- Math.min(cfg.clientRequestTimeoutMs, 5_000),
17
- );
18
- }
19
-
20
- getClient(): SidecarClient {
21
- return this.client;
22
- }
23
-
24
- async resolveBinary(): Promise<string> {
25
- const bin = this.cfg.tlmPath;
26
- if (path.isAbsolute(bin)) {
27
- await access(bin, constants.X_OK);
28
- return bin;
29
- }
30
- const resolved = await which(bin);
31
- if (!resolved) throw new Error(`${bin} not found in PATH`);
32
- return resolved;
33
- }
34
-
35
- async spawn(): Promise<void> {
36
- const bin = await this.resolveBinary().catch(() => {
37
- throw new Error("memory: tlm binary not found");
38
- });
39
-
40
- if (this.cfg.socketPath) {
41
- try {
42
- fs.unlinkSync(this.cfg.socketPath);
43
- } catch {
44
- /* absent */
45
- }
46
- }
47
-
48
- const args = [
49
- "serve",
50
- "--socket",
51
- this.cfg.socketPath,
52
- "--bundle-root",
53
- this.cfg.bundleRoot,
54
- ];
55
-
56
- this.child = spawn(bin, args, {
57
- stdio: "ignore",
58
- detached: process.platform !== "win32",
59
- });
60
-
61
- this.child.on("error", () => {
62
- /* handled by waitReady timeout */
63
- });
64
-
65
- this.child.unref?.();
66
- }
67
-
68
- async waitReady(signal?: AbortSignal): Promise<void> {
69
- const deadline = Date.now() + this.cfg.sidecarReadyTimeoutMs;
70
- let lastCompat = "";
71
- let lastSub = "";
72
-
73
- while (Date.now() < deadline) {
74
- if (signal?.aborted) throw signal.reason ?? new Error("aborted");
75
-
76
- try {
77
- const h = await this.client.health(signal);
78
- lastCompat = h.compatibility ?? "";
79
- lastSub = h.error ? String(h.error.details?.sub_code ?? "") : "";
80
-
81
- if (h.ready === true) return;
82
- if (h.compatibility === "unknown") return;
83
- if (h.compatibility === "incompatible") {
84
- // keep polling until ceiling — supervisor classifies schema mismatch
85
- }
86
- } catch {
87
- /* sidecar still starting */
88
- }
89
-
90
- await sleep(500, signal);
91
- }
92
-
93
- throw new Error(
94
- `memory: sidecar ready ceiling exceeded` +
95
- (lastCompat === "incompatible" && lastSub
96
- ? ` (incompatible: ${lastSub})`
97
- : ""),
98
- );
99
- }
100
-
101
- async stop(): Promise<void> {
102
- const child = this.child;
103
- this.child = null;
104
- if (!child?.pid) return;
105
-
106
- if (process.platform === "win32") {
107
- spawn("taskkill", ["/pid", String(child.pid), "/t", "/f"]);
108
- } else {
109
- try {
110
- process.kill(-child.pid, "SIGTERM");
111
- } catch {
112
- try {
113
- child.kill("SIGTERM");
114
- } catch {
115
- /* already dead */
116
- }
117
- }
118
- }
119
-
120
- await new Promise<void>((resolve) => {
121
- const t = setTimeout(resolve, 2_000);
122
- child.on("exit", () => {
123
- clearTimeout(t);
124
- resolve();
125
- });
126
- });
127
- }
128
- }
129
-
130
- async function which(cmd: string): Promise<string | null> {
131
- const { execFileSync } = await import("node:child_process");
132
- try {
133
- const result = execFileSync(
134
- process.platform === "win32" ? "where" : "which",
135
- [cmd],
136
- { encoding: "utf8", timeout: 3_000 },
137
- ).trim();
138
- return result.split("\n")[0]?.trim() || null;
139
- } catch {
140
- return null;
141
- }
142
- }
143
-
144
- function sleep(ms: number, signal?: AbortSignal): Promise<void> {
145
- return new Promise((resolve, reject) => {
146
- if (signal?.aborted) {
147
- reject(signal.reason ?? new Error("aborted"));
148
- return;
149
- }
150
- const t = setTimeout(resolve, ms);
151
- signal?.addEventListener(
152
- "abort",
153
- () => {
154
- clearTimeout(t);
155
- reject(signal.reason ?? new Error("aborted"));
156
- },
157
- { once: true },
158
- );
159
- });
160
- }
@@ -1,113 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import { open } from "node:fs/promises";
3
- import path from "node:path";
4
-
5
- import type { ToolResult } from "../types.js";
6
-
7
- export const MEMORY_APPEND_NAME = "memory_append";
8
-
9
- export const MEMORY_APPEND_DESCRIPTION =
10
- "Append new entries to MEMORY.md. Use this instead of file_write or file_edit for memory updates. " +
11
- "Writes are append-only with a simple lock to avoid concurrent clobber.";
12
-
13
- export const MEMORY_APPEND_PROMPT_SNIPPET = "Append durable notes to MEMORY.md";
14
-
15
- export const MEMORY_APPEND_PROMPT_GUIDELINES = [
16
- "Use memory_append to persist user preferences or facts the user explicitly asked to remember — not for transient task state.",
17
- ] as const;
18
-
19
- export const MEMORY_APPEND_PARAMETERS = {
20
- type: "object",
21
- properties: {
22
- content: {
23
- type: "string",
24
- description:
25
- "New entries to append (markdown bullet points). Write in English by default.",
26
- },
27
- },
28
- required: ["content"],
29
- } as const;
30
-
31
- const LOCK_RETRIES = 50;
32
- const LOCK_DELAY_MS = 20;
33
-
34
- async function withAppendLock<T>(
35
- lockPath: string,
36
- fn: () => Promise<T>,
37
- ): Promise<T> {
38
- let handle;
39
- for (let i = 0; i < LOCK_RETRIES; i++) {
40
- try {
41
- handle = await open(lockPath, "wx");
42
- break;
43
- } catch {
44
- await new Promise((r) => setTimeout(r, LOCK_DELAY_MS));
45
- }
46
- }
47
- if (!handle) {
48
- throw new Error("could not acquire MEMORY.md append lock");
49
- }
50
- try {
51
- return await fn();
52
- } finally {
53
- await handle.close();
54
- await fs.unlink(lockPath).catch(() => {});
55
- }
56
- }
57
-
58
- export async function appendToMemoryMd(
59
- memoryMdPath: string,
60
- content: string,
61
- ): Promise<void> {
62
- const trimmed = content.trim();
63
- if (!trimmed) {
64
- throw new Error("content must not be empty");
65
- }
66
- await fs.mkdir(path.dirname(memoryMdPath), { recursive: true, mode: 0o700 });
67
- const lockPath = `${memoryMdPath}.append.lock`;
68
- const block = content.endsWith("\n") ? content : `${content}\n`;
69
- await withAppendLock(lockPath, async () => {
70
- await fs.appendFile(memoryMdPath, block, { encoding: "utf8", mode: 0o600 });
71
- });
72
- }
73
-
74
- export class MemoryAppendTool {
75
- constructor(private readonly memoryMdPath: string) {}
76
-
77
- info() {
78
- return {
79
- name: MEMORY_APPEND_NAME,
80
- description: MEMORY_APPEND_DESCRIPTION,
81
- parameters: MEMORY_APPEND_PARAMETERS,
82
- };
83
- }
84
-
85
- async run(argsJson: string): Promise<ToolResult> {
86
- let raw: Record<string, unknown>;
87
- try {
88
- raw = JSON.parse(argsJson) as Record<string, unknown>;
89
- } catch (e) {
90
- return {
91
- content: `invalid arguments: ${e instanceof Error ? e.message : e}`,
92
- isError: true,
93
- };
94
- }
95
- const content = typeof raw.content === "string" ? raw.content : "";
96
- if (!content.trim()) {
97
- return { content: "content must not be empty", isError: true };
98
- }
99
- try {
100
- await appendToMemoryMd(this.memoryMdPath, content);
101
- return { content: `appended to ${this.memoryMdPath}` };
102
- } catch (e) {
103
- return {
104
- content: `error appending: ${e instanceof Error ? e.message : e}`,
105
- isError: true,
106
- };
107
- }
108
- }
109
- }
110
-
111
- export function createMemoryAppendTool(memoryMdPath: string): MemoryAppendTool {
112
- return new MemoryAppendTool(memoryMdPath);
113
- }
@@ -1,388 +0,0 @@
1
- import { createFallbackQuery } from "../fallback/index.js";
2
- import { rerankWithLLM, type RerankOptions, type RankedResult } from "../fallback/llmRerank.js";
3
- import type { SessionSearchHit } from "../fallback/sessionSearch.js";
4
- import type { FallbackQuery, MemoryQuerier, MemoryRecallArgs, QueryIntent, QueryMode, ResponseEnvelope, ToolResult } from "../types.js";
5
-
6
- export const MEMORY_RECALL_NAME = "memory_recall";
7
-
8
- export const MEMORY_RECALL_DESCRIPTION =
9
- "Read structured episodic memory from the local TLM sidecar — past sessions consolidated into long-term records.\n" +
10
- "Modes:\n" +
11
- "- direct_relation: one-hop predicate (e.g. \"what did X create?\"). Read groups[].via_relations.\n" +
12
- "- path_query: multi-hop / possessive. relation_constraints is the ordered path; inverse hops use ^-1.\n" +
13
- "- typed_neighborhood: typed target with exactly one relation. Requires candidate_type.\n\n" +
14
- "Ground answers in supporting evidence internally; tell the user \"past records\" / \"以前的记录\", not raw event IDs.";
15
-
16
- export const MEMORY_RECALL_PROMPT_SNIPPET =
17
- "Query local episodic memory by entity or relationship";
18
-
19
- export const MEMORY_RECALL_PROMPT_GUIDELINES = [
20
- "Use memory_recall when the user asks about past sessions, people, projects, or decisions stored in long-term memory.",
21
- "Use memory_recall for relationship questions (e.g. who is X to me) when implicit preflight did not already answer.",
22
- ] as const;
23
-
24
- export const MEMORY_RECALL_PARAMETERS = {
25
- type: "object",
26
- properties: {
27
- mode: {
28
- type: "string",
29
- enum: ["direct_relation", "path_query", "typed_neighborhood"],
30
- },
31
- anchor_mentions: { type: "array", items: { type: "string" } },
32
- relation_constraints: { type: "array", items: { type: "string" } },
33
- candidate_type: { type: "string" },
34
- scope_filter: { type: "array", items: { type: "string" } },
35
- target_slot: { type: "string", enum: ["head", "tail"] },
36
- time_window: { type: "string" },
37
- evidence_budget: { type: "integer" },
38
- result_limit: { type: "integer" },
39
- },
40
- required: ["anchor_mentions"],
41
- } as const;
42
-
43
- export class MemoryRecallTool {
44
- constructor(
45
- private readonly service: MemoryQuerier,
46
- private readonly fallback: FallbackQuery | null = null,
47
- private readonly rerankOpts: RerankOptions | null = null,
48
- ) {}
49
-
50
- info() {
51
- return {
52
- name: MEMORY_RECALL_NAME,
53
- description: MEMORY_RECALL_DESCRIPTION,
54
- parameters: MEMORY_RECALL_PARAMETERS,
55
- };
56
- }
57
-
58
- async run(argsJson: string, signal?: AbortSignal, onProgress?: (msg: string) => void): Promise<ToolResult> {
59
- const args = parseArgs(argsJson);
60
- if ("error" in args) {
61
- return { content: args.error, isError: true };
62
- }
63
-
64
- const intent = argsToIntent(args);
65
- const validation = validateArgs(args);
66
- if (validation) {
67
- return { content: validation, isError: true };
68
- }
69
-
70
- return this.runIntent(intent, signal, onProgress);
71
- }
72
-
73
- async runIntent(intent: QueryIntent, signal?: AbortSignal, onProgress?: (msg: string) => void): Promise<ToolResult> {
74
- if (this.service.status() !== "ready") {
75
- return this.fallbackResult(intent, "service_unavailable", "fallback");
76
- }
77
-
78
- // Emit a progress message if the sidecar takes longer than 500 ms.
79
- let progressTimer: ReturnType<typeof setTimeout> | null = null;
80
- if (onProgress) {
81
- progressTimer = setTimeout(() => {
82
- onProgress("Querying episodic memory…");
83
- }, 500);
84
- }
85
-
86
- let result;
87
- try {
88
- result = await this.service.query(intent, signal);
89
- } finally {
90
- if (progressTimer != null) clearTimeout(progressTimer);
91
- }
92
-
93
- if (result.transportError || result.errorClass === "unavailable") {
94
- return this.fallbackResult(intent, "service_unavailable", "fallback");
95
- }
96
-
97
- if (result.errorClass === "retryable") {
98
- let retryTimer: ReturnType<typeof setTimeout> | null = null;
99
- if (onProgress) {
100
- retryTimer = setTimeout(() => onProgress("Retrying memory query…"), 500);
101
- }
102
- let retryResult;
103
- try {
104
- await sleep(500, signal);
105
- retryResult = await this.service.query(intent, signal);
106
- } finally {
107
- if (retryTimer != null) clearTimeout(retryTimer);
108
- }
109
- if (
110
- retryResult.transportError ||
111
- retryResult.errorClass === "unavailable" ||
112
- retryResult.errorClass === "retryable"
113
- ) {
114
- return this.fallbackResult(intent, "retryable_failed", "fallback_after_retry");
115
- }
116
- result = retryResult;
117
- }
118
-
119
- if (result.errorClass === "permanent") {
120
- return permanentResult(result.env);
121
- }
122
-
123
- return shapeResult(result.env!);
124
- }
125
-
126
- private async fallbackResult(
127
- intent: QueryIntent,
128
- reason: string,
129
- source: string,
130
- ): Promise<ToolResult> {
131
- const candidates: Record<string, unknown>[] = [];
132
- const warnings: Record<string, unknown>[] = [];
133
-
134
- if (this.fallback) {
135
- const query = intent.anchor_mentions.map((s) => s.trim()).filter(Boolean).join(" ");
136
- const limit = intent.result_limit && intent.result_limit > 0 ? intent.result_limit : 10;
137
- try {
138
- const hits = await this.fallback.sessionKeyword(query, limit);
139
-
140
- let reranked: RankedResult[] | null = null;
141
- if (this.rerankOpts && hits.length > 0) {
142
- try {
143
- reranked = await rerankWithLLM(
144
- query,
145
- hits as SessionSearchHit[],
146
- this.rerankOpts,
147
- );
148
- } catch {
149
- /* silent fallback to original order */
150
- }
151
- }
152
-
153
- if (reranked) {
154
- for (const r of reranked) {
155
- const original = hits[r.index];
156
- candidates.push({
157
- value: r.summary,
158
- score: r.score,
159
- evidence: "llm_rerank",
160
- ...(typeof original === "object" && original !== null &&
161
- "session_id" in (original as Record<string, unknown>)
162
- ? { scope: "session_search", session_id: (original as Record<string, unknown>).session_id }
163
- : {}),
164
- });
165
- }
166
- } else {
167
- for (const h of hits) {
168
- candidates.push({
169
- value: typeof h === "string" ? h : JSON.stringify(h),
170
- evidence: "text_search",
171
- ...(typeof h === "object" &&
172
- h !== null &&
173
- "session_id" in (h as Record<string, unknown>)
174
- ? { scope: "session_search" }
175
- : {}),
176
- });
177
- }
178
- }
179
- } catch (err) {
180
- warnings.push({
181
- code: "fallback_session_search_failed",
182
- message: err instanceof Error ? err.message : String(err),
183
- });
184
- }
185
- try {
186
- const snippet = await this.fallback.memoryFileSnippet(query);
187
- if (snippet) {
188
- candidates.push({
189
- value: snippet,
190
- evidence: "text_search",
191
- scope: "memory_md",
192
- });
193
- }
194
- } catch {
195
- /* optional */
196
- }
197
- }
198
-
199
- const out = {
200
- source,
201
- evidence_quality: "text_search",
202
- bundle_version: null,
203
- candidates,
204
- warnings,
205
- fallback_reason: reason,
206
- };
207
- return { content: JSON.stringify(out) };
208
- }
209
- }
210
-
211
- function parseArgs(argsJson: string): MemoryRecallArgs | { error: string } {
212
- let raw: Record<string, unknown>;
213
- try {
214
- raw = JSON.parse(coerceArgs(argsJson)) as Record<string, unknown>;
215
- } catch (e) {
216
- return { error: `invalid input: ${e instanceof Error ? e.message : e}` };
217
- }
218
- const anchor = raw.anchor_mentions;
219
- if (!Array.isArray(anchor) || anchor.length === 0) {
220
- return { error: "anchor_mentions is required and must be non-empty" };
221
- }
222
- return raw as unknown as MemoryRecallArgs;
223
- }
224
-
225
- function argsToIntent(a: MemoryRecallArgs): QueryIntent {
226
- return {
227
- mode: (a.mode as QueryMode) || "direct_relation",
228
- anchor_mentions: a.anchor_mentions,
229
- relation_constraints: a.relation_constraints,
230
- candidate_type: a.candidate_type,
231
- scope_filter: a.scope_filter,
232
- target_slot: (a.target_slot as QueryIntent["target_slot"]) ?? "",
233
- time_window: a.time_window,
234
- evidence_budget: a.evidence_budget && a.evidence_budget > 0 ? a.evidence_budget : 5,
235
- result_limit: a.result_limit && a.result_limit > 0 ? a.result_limit : 10,
236
- };
237
- }
238
-
239
- function validateArgs(a: MemoryRecallArgs): string | null {
240
- for (const rel of a.relation_constraints ?? []) {
241
- if (isBroadRelation(rel)) {
242
- return "memory_recall requires concrete relation_constraints. Broad relations like related_to are not valid for structured lookup.";
243
- }
244
- }
245
- if (a.mode === "typed_neighborhood") {
246
- if (!a.candidate_type?.trim()) {
247
- return "typed_neighborhood requires candidate_type.";
248
- }
249
- if ((a.relation_constraints?.length ?? 0) !== 1) {
250
- return "typed_neighborhood requires exactly one relation_constraints value.";
251
- }
252
- }
253
- return null;
254
- }
255
-
256
- function isBroadRelation(rel: string): boolean {
257
- let r = rel.trim().toLowerCase();
258
- r = r.replace(/^\^/, "").replace(/\^-1$/, "");
259
- return ["related_to", "relates_to", "associated_with", "about", "mentions", "other"].includes(r);
260
- }
261
-
262
- function coerceArgs(argsJson: string): string {
263
- let raw: Record<string, unknown>;
264
- try {
265
- raw = JSON.parse(argsJson) as Record<string, unknown>;
266
- } catch {
267
- return argsJson;
268
- }
269
- let changed = false;
270
- for (const field of ["anchor_mentions", "relation_constraints", "scope_filter"]) {
271
- const v = raw[field];
272
- if (typeof v === "string") {
273
- try {
274
- raw[field] = JSON.parse(v);
275
- changed = true;
276
- } catch {
277
- /* keep */
278
- }
279
- }
280
- }
281
- for (const field of ["result_limit", "evidence_budget"]) {
282
- const v = raw[field];
283
- if (typeof v === "string") {
284
- const n = Number(v);
285
- if (!Number.isNaN(n)) {
286
- raw[field] = n;
287
- changed = true;
288
- }
289
- }
290
- }
291
- return changed ? JSON.stringify(raw) : argsJson;
292
- }
293
-
294
- function shapeResult(env: ResponseEnvelope): ToolResult {
295
- let quality = "structured";
296
- const warnings = envelopeWarnings(env);
297
- if (env.reason === "degraded") {
298
- quality = "structured_degraded";
299
- warnings.unshift({
300
- code: "bundle_degraded",
301
- message: "memory bundle degraded — results may be incomplete",
302
- });
303
- }
304
- const cands = env.candidates.map((c) => {
305
- const m: Record<string, unknown> = {
306
- value: c.value,
307
- score: c.score,
308
- evidence: c.evidence,
309
- supporting_event_ids: c.supporting_event_ids,
310
- };
311
- if (c.scope != null) m.scope = c.scope;
312
- if (c.support_count != null) m.support_count = c.support_count;
313
- if (c.distinct_session_count != null) {
314
- m.distinct_session_count = c.distinct_session_count;
315
- }
316
- return m;
317
- });
318
- const out = {
319
- source: "memory_sidecar",
320
- evidence_quality: quality,
321
- bundle_version: env.bundle_version ?? null,
322
- memory_block: env.memory_block ?? null,
323
- candidates: cands,
324
- warnings,
325
- fallback_reason: null,
326
- };
327
- return { content: JSON.stringify(out) };
328
- }
329
-
330
- function permanentResult(env: ResponseEnvelope | null): ToolResult {
331
- const out = {
332
- source: "memory_sidecar",
333
- evidence_quality: "structured",
334
- bundle_version: env?.bundle_version ?? null,
335
- candidates: [],
336
- warnings: envelopeWarnings(env),
337
- fallback_reason: null,
338
- };
339
- return { content: JSON.stringify(out), isError: true };
340
- }
341
-
342
- function envelopeWarnings(env: ResponseEnvelope | null): Record<string, unknown>[] {
343
- const out: Record<string, unknown>[] = [];
344
- if (!env) return out;
345
- for (const w of env.warnings ?? []) {
346
- out.push({ code: w.code, message: w.message });
347
- }
348
- if (env.error) {
349
- out.push({
350
- code: env.error.code,
351
- message: env.error.message,
352
- sub_code: env.error.details?.sub_code,
353
- });
354
- }
355
- return out;
356
- }
357
-
358
- function sleep(ms: number, signal?: AbortSignal): Promise<void> {
359
- return new Promise((resolve, reject) => {
360
- if (signal?.aborted) {
361
- reject(new Error("aborted"));
362
- return;
363
- }
364
- const t = setTimeout(resolve, ms);
365
- signal?.addEventListener("abort", () => {
366
- clearTimeout(t);
367
- reject(new Error("aborted"));
368
- }, { once: true });
369
- });
370
- }
371
-
372
- /** @deprecated Use createFallbackQuery — kept for backward-compatible imports. */
373
- export function createStubFallback(
374
- memoryMdPaths: string[],
375
- sessionsDir = "",
376
- ): FallbackQuery {
377
- return createFallbackQuery({ sessionsDir, memoryMdPaths });
378
- }
379
-
380
- export { createFallbackQuery };
381
-
382
- export function createMemoryRecallTool(
383
- service: MemoryQuerier,
384
- fallback: FallbackQuery | null,
385
- rerankOpts?: RerankOptions | null,
386
- ): MemoryRecallTool {
387
- return new MemoryRecallTool(service, fallback, rerankOpts ?? null);
388
- }